From f1a1df01a7e75c68cc8928978b2c175d0039199e Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Tue, 20 Feb 2024 13:14:01 -0500 Subject: [PATCH 01/81] base cybernetics --- code/__DEFINES/DNA.dm | 6 + code/__DEFINES/atom_hud.dm | 3 + code/__DEFINES/dcs/signals/signals_object.dm | 4 +- code/__DEFINES/hud.dm | 10 +- code/__DEFINES/~monkestation/cybernetics.dm | 39 ++ .../~monkestation/dcs/signals/signals_atom.dm | 3 + .../dcs/signals/signals_carbon.dm | 5 + code/__DEFINES/~monkestation/skills.dm | 1 + code/__DEFINES/~monkestation/traits.dm | 5 + code/_globalvars/traits.dm | 3 +- code/_onclick/hud/hud.dm | 4 + code/datums/elements/climbable.dm | 7 +- code/datums/hud.dm | 1 + code/datums/station_traits/positive_traits.dm | 6 +- code/game/data_huds.dm | 24 +- code/game/objects/items.dm | 4 + code/game/objects/items/choice_beacon.dm | 4 +- code/modules/assembly/flash.dm | 4 +- .../mob/living/carbon/carbon_defense.dm | 14 +- .../mob/living/carbon/carbon_defines.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 2 +- code/modules/power/cell.dm | 2 + code/modules/religion/rites.dm | 2 +- .../research/designs/medical_designs.dm | 4 +- code/modules/surgery/organ_manipulation.dm | 6 +- code/modules/surgery/organs/augments_arms.dm | 55 +-- .../surgery/organs/augments_internal.dm | 1 - code/modules/surgery/organs/autosurgeon.dm | 4 +- .../cybernetics/actions/base_action.dm | 3 + .../code/modules/cybernetics/assets.dm | 18 + .../cybernetics/augments/_base_changes.dm | 160 ++++++++ .../cybernetics/augments/arm_augments.dm | 345 ++++++++++++++++++ .../cybernetics/augments/leg_augments.dm | 215 +++++++++++ .../modules/cybernetics/designs/medical.dm | 25 ++ .../modules/cybernetics/hud/cybernetics.dm | 7 + .../code/modules/cybernetics/icons/96x96.dmi | Bin 0 -> 68749 bytes .../icons/UI_Icons/tgui/lines/0.png | Bin 0 -> 729 bytes .../icons/UI_Icons/tgui/lines/10.png | Bin 0 -> 764 bytes .../icons/UI_Icons/tgui/lines/10_f.png | Bin 0 -> 7802 bytes .../icons/UI_Icons/tgui/lines/12.png | Bin 0 -> 735 bytes .../icons/UI_Icons/tgui/lines/12_f.png | Bin 0 -> 7612 bytes .../icons/UI_Icons/tgui/lines/3.png | Bin 0 -> 579 bytes .../icons/UI_Icons/tgui/lines/3_f.png | Bin 0 -> 7235 bytes .../icons/UI_Icons/tgui/lines/5.png | Bin 0 -> 772 bytes .../icons/UI_Icons/tgui/lines/5_f.png | Bin 0 -> 7823 bytes .../icons/UI_Icons/tgui/lines/6.png | Bin 0 -> 766 bytes .../icons/UI_Icons/tgui/lines/6_f.png | Bin 0 -> 7842 bytes .../icons/UI_Icons/tgui/lines/9.png | Bin 0 -> 762 bytes .../icons/UI_Icons/tgui/lines/9_f.png | Bin 0 -> 7835 bytes .../icons/UI_Icons/tgui/lines/e.png | Bin 0 -> 11257 bytes .../icons/UI_Icons/tgui/lines/s.png | Bin 0 -> 5244 bytes .../code/modules/cybernetics/icons/cloaks.dmi | Bin 0 -> 30724 bytes .../cybernetics/icons/screen_cybernetics.dmi | Bin 0 -> 294 bytes .../modules/cybernetics/icons/surgery.dmi | Bin 0 -> 42552 bytes .../cybernetics/icons/swords_lefthand.dmi | Bin 0 -> 24854 bytes .../cybernetics/icons/swords_righthand.dmi | Bin 0 -> 28260 bytes .../cybernetics/implant_items/autosurgeons.dm | 124 +++++++ .../implant_items/cyberlink_connector.dm | 161 ++++++++ .../implant_items/weapons/mantis_blade.dm | 56 +++ .../cybernetics/minigame/hacking_minigame.dm | 276 ++++++++++++++ .../cybernetics/premade_storages/antags.dm | 8 + .../code/modules/cybernetics/readme.md | 35 ++ .../cybernetics/skills/implant_hacking.dm | 19 + .../code/modules/cybernetics/tech_nodes.dm | 17 + .../modules/surgery/organs/internal/butts.dm | 2 +- tgstation.dme | 15 + tgui/packages/tgui/interfaces/Hacking.js | 54 +++ 67 files changed, 1691 insertions(+), 74 deletions(-) create mode 100644 code/__DEFINES/~monkestation/cybernetics.dm create mode 100644 code/__DEFINES/~monkestation/skills.dm create mode 100644 monkestation/code/modules/cybernetics/actions/base_action.dm create mode 100644 monkestation/code/modules/cybernetics/assets.dm create mode 100644 monkestation/code/modules/cybernetics/augments/_base_changes.dm create mode 100644 monkestation/code/modules/cybernetics/augments/arm_augments.dm create mode 100644 monkestation/code/modules/cybernetics/augments/leg_augments.dm create mode 100644 monkestation/code/modules/cybernetics/designs/medical.dm create mode 100644 monkestation/code/modules/cybernetics/hud/cybernetics.dm create mode 100644 monkestation/code/modules/cybernetics/icons/96x96.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/0.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10_f.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/12.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/12_f.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/3.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/3_f.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5_f.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6_f.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9_f.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/e.png create mode 100644 monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/s.png create mode 100644 monkestation/code/modules/cybernetics/icons/cloaks.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/screen_cybernetics.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/surgery.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/swords_lefthand.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/swords_righthand.dmi create mode 100644 monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm create mode 100644 monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm create mode 100644 monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm create mode 100644 monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm create mode 100644 monkestation/code/modules/cybernetics/premade_storages/antags.dm create mode 100644 monkestation/code/modules/cybernetics/readme.md create mode 100644 monkestation/code/modules/cybernetics/skills/implant_hacking.dm create mode 100644 monkestation/code/modules/cybernetics/tech_nodes.dm create mode 100644 tgui/packages/tgui/interfaces/Hacking.js diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 759ff992d075..a593396cf802 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -126,6 +126,9 @@ #define ORGAN_SLOT_ZOMBIE "zombie_infection" #define ORGAN_SLOT_BUTT "butt" #define ORGAN_SLOT_BLADDER "bladder" +#define ORGAN_SLOT_LINK "cyber_link" +#define ORGAN_SLOT_RIGHT_LEG_AUG "r_leg_device" +#define ORGAN_SLOT_LEFT_LEG_AUG "l_leg_device" /// Organ slot external #define ORGAN_SLOT_EXTERNAL_TAIL "tail" @@ -170,9 +173,12 @@ /// Exists so Life()'s organ process order is consistent GLOBAL_LIST_INIT(organ_process_order, list( ORGAN_SLOT_BRAIN, + ORGAN_SLOT_LINK, ORGAN_SLOT_APPENDIX, ORGAN_SLOT_RIGHT_ARM_AUG, ORGAN_SLOT_LEFT_ARM_AUG, + ORGAN_SLOT_RIGHT_LEG_AUG, + ORGAN_SLOT_LEFT_LEG_AUG, ORGAN_SLOT_STOMACH, ORGAN_SLOT_STOMACH_AID, ORGAN_SLOT_BREATHING_TUBE, diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index d76512095766..9d591178c574 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -51,6 +51,8 @@ #define DIAG_NANITE_FULL_HUD "24" // for gun permit #define PERMIT_HUD "25" +// for implants to let you see sensor field +#define SENSOR_HUD "26" //monkestation edit end //by default everything in the hud_list of an atom is an image @@ -70,6 +72,7 @@ #define DATA_HUD_AI_DETECT 9 #define DATA_HUD_FAN 10 #define DATA_HUD_PERMIT 11 //monkestation edit +#define DATA_HUD_SENSORS 12 //monkestation edit // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 08d80b05ad6e..eabb62c9b1c4 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -321,10 +321,10 @@ //called in /obj/item/tank/jetpack/proc/turn_off() : () #define COMSIG_JETPACK_DEACTIVATED "jetpack_deactivated" -//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : () +//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : () #define COMSIG_THRUSTER_ACTIVATED "jetmodule_activated" #define THRUSTER_ACTIVATION_FAILED (1<<0) -//called in /obj/item/organ/cyberimp/chest/thrusters/proc/toggle() : () +//called in /obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle() : () #define COMSIG_THRUSTER_DEACTIVATED "jetmodule_deactivated" // /obj/item/camera signals diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 74ab51f6b384..73f2b7ee3c00 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -34,10 +34,12 @@ Therefore, the top right corner (except during admin shenanigans) is at "15,15" */ -/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) - var/x_off = i % 2 ? 0 : -1 - var/y_off = round((i-1) / 2) - return"CENTER+[x_off]:16,SOUTH+[y_off]:5" +//Monkestation EDIT: START - CYBERNETICS +/proc/ui_hand_position(i,y_offset = 0,y_pixel_offset = 0) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) + var/x_off = -(!(i % 2)) + var/y_off = round((i-1) / 2) + y_offset + return"CENTER+[x_off]:16,SOUTH+[y_off]:[5 + y_pixel_offset]" +//Monkestation EDIT: END - CYBERNETICS /proc/ui_equip_position(mob/M) var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5) diff --git a/code/__DEFINES/~monkestation/cybernetics.dm b/code/__DEFINES/~monkestation/cybernetics.dm new file mode 100644 index 000000000000..c681fdcd85d1 --- /dev/null +++ b/code/__DEFINES/~monkestation/cybernetics.dm @@ -0,0 +1,39 @@ +/// Cybernetics defines + +#define SECURITY_PROTOCOL "sec_protocol" +#define ENCODE_PROTOCOL "enc_protocol" +#define OPERATING_PROTOCOL "op_protocol" + +#define NO_PROTOCOL 0 + +/// Security protocols + +///Those names mean nothing don't try to decipher these. They are defines because some cybernetics will be incompatible with eachother. treat those defines like software names. + +#define SECURITY_NT1 "nt1" +#define SECURITY_NT2 "nt2" +#define SECURITY_NTX "ntx" +#define SECURITY_TMSP "tmsp" +#define SECURITY_TOSP "tosp" + + +/// Encode protocol + +#define ENCODE_ENC1 "enc1" +#define ENCODE_ENC2 "enc2" +#define ENCODE_TENN "tenn" +#define ENCODE_CSEP "csep" + + +/// Operating protocol + +#define OPERATING_NTOS "ntos" +#define OPERATING_TGMF "tgmf" +#define OPERATING_CSOF "csof" + +#define AUGMENT_NO_REQ list(SECURITY_PROTOCOL = NO_PROTOCOL, ENCODE_PROTOCOL = NO_PROTOCOL, OPERATING_PROTOCOL = NO_PROTOCOL) +#define AUGMENT_NT_LOWLEVEL list(SECURITY_PROTOCOL = list(SECURITY_NT1), ENCODE_PROTOCOL = list(ENCODE_ENC1), OPERATING_PROTOCOL = list(OPERATING_NTOS)) +#define AUGMENT_NT_HIGHLEVEL list(SECURITY_PROTOCOL = list(SECURITY_NT2 , SECURITY_NT1), ENCODE_PROTOCOL = list(ENCODE_ENC2), OPERATING_PROTOCOL = list(OPERATING_NTOS)) +#define AUGMENT_TG_LEVEL list(SECURITY_PROTOCOL = list(SECURITY_NTX , SECURITY_NT2 , SECURITY_TMSP), ENCODE_PROTOCOL = list(ENCODE_TENN), OPERATING_PROTOCOL = list(OPERATING_TGMF)) +#define AUGMENT_SYNDICATE_LEVEL list(SECURITY_PROTOCOL = list(SECURITY_TOSP), ENCODE_PROTOCOL = list(ENCODE_CSEP , ENCODE_TENN), OPERATING_PROTOCOL = list(OPERATING_CSOF)) +#define AUGMENT_ADMIN_LEVEL list(SECURITY_PROTOCOL = list(SECURITY_NTX , SECURITY_NT2 , SECURITY_NT1, SECURITY_TMSP, SECURITY_TOSP), ENCODE_PROTOCOL = list(ENCODE_ENC1, ENCODE_ENC2, ENCODE_CSEP, ENCODE_TENN), OPERATING_PROTOCOL = list(OPERATING_CSOF, OPERATING_TGMF, OPERATING_NTOS)) diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm index 8dece5e3c63c..89b72655d4e6 100644 --- a/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm @@ -9,3 +9,6 @@ /// from base of atom/eminence_act() : (mob/living/eminence/user) #define COMSIG_ATOM_EMINENCE_ACT "atom_eminence_act" + +///Called by either cell/proc/give or cell/proc/use +#define COMSIG_CELL_CHANGE_POWER "cell_change_power" diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_carbon.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_carbon.dm index 191577527fa8..6b2854a6c830 100644 --- a/code/__DEFINES/~monkestation/dcs/signals/signals_carbon.dm +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_carbon.dm @@ -1,2 +1,7 @@ #define COMSIG_CARBON_EQUIP_EARS "carbon_ears_equip" #define COMSIG_CARBON_UNEQUIP_EARS "carbon_ears_unequip" + +///Sent to carbon when they pickup something (/obj/item) +#define COMSIG_CARBON_ITEM_PICKED_UP "carbon_item_picked_up" +///Sent to carbon when they drop something (/obj/item) +#define COMSIG_CARBON_ITEM_DROPPED "carbon_item_dropped" diff --git a/code/__DEFINES/~monkestation/skills.dm b/code/__DEFINES/~monkestation/skills.dm new file mode 100644 index 000000000000..b9d91b51b5e7 --- /dev/null +++ b/code/__DEFINES/~monkestation/skills.dm @@ -0,0 +1 @@ +#define SKILL_TIME_MODIFIER "skill_time_modifier" //ideally added to timers and other do_afters() diff --git a/code/__DEFINES/~monkestation/traits.dm b/code/__DEFINES/~monkestation/traits.dm index 3818e1ae152c..ce8be0cd97e5 100644 --- a/code/__DEFINES/~monkestation/traits.dm +++ b/code/__DEFINES/~monkestation/traits.dm @@ -16,3 +16,8 @@ #define TRAIT_PERFECT_SURGEON "perfect_surgeon" /// Station trait for when the clown has bridge access *shudders* #define STATION_TRAIT_CLOWN_BRIDGE "clown_bridge" + +#define TRAIT_SENSOR_HUD "sensor_hud" +#define TRAIT_SHOVE_RESIST "shove_resist" //Used by implants +#define TRAIT_FAST_CLIMBER "fast_climber" //Used by implants +#define ANTI_DROP_IMPLANT_TRAIT "antidrop_implant" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index ff32b66828d0..82cf68a44923 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -199,7 +199,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_UNDENSE" = TRAIT_UNDENSE, "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, - "TRAIT_ANALGESIA" = TRAIT_ANALGESIA + "TRAIT_ANALGESIA" = TRAIT_ANALGESIA, + "TRAIT_FAST_CLIMBER" = TRAIT_FAST_CLIMBER ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 708678b35826..44cf0f0496f7 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -94,6 +94,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/stamina var/atom/movable/screen/healthdoll var/atom/movable/screen/spacesuit + + var/list/atom/movable/screen/cybernetics/ammo_counter/cybernetics_ammo = list() //monkestation edit - CYBERNETICS + // subtypes can override this to force a specific UI style var/ui_style @@ -227,6 +230,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( stamina = null healthdoll = null spacesuit = null + cybernetics_ammo = null //monkestation edit - CYBERNETICS blobpwrdisplay = null alien_plasma_display = null alien_queen_finder = null diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 52a62fdb8fcb..b8e221619811 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -67,7 +67,10 @@ adjusted_climb_time *= 0.25 //aliens are terrifyingly fast if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am??? adjusted_climb_time *= 0.8 - adjusted_climb_stun *= 0.8 + //monkestation edit - CYBERNETICS + if(HAS_TRAIT(user,TRAIT_FAST_CLIMBER)) //How it feels to chew 5 gum + adjusted_climb_time *= 0.3 + //monkestation edit - CYBERNETICS LAZYADDASSOCLIST(current_climbers, climbed_thing, user) if(do_after(user, adjusted_climb_time, climbed_thing)) if(QDELETED(climbed_thing)) //Checking if structure has been destroyed @@ -147,7 +150,7 @@ if(bumpee.force_moving?.allow_climbing) do_climb(source, bumpee) if(bumpee.m_intent == MOVE_INTENT_SPRINT) - INVOKE_ASYNC(src, PROC_REF(attempt_sprint_climb), source, bumpee) + INVOKE_ASYNC(src, PROC_REF(climb_structure), source, bumpee) ///Tries to climb onto the target if the forced movement of the mob allows it /datum/element/climbable/proc/attempt_sprint_climb(datum/source, mob/bumpee) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 656bd57193f5..26ca77d8208b 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -19,6 +19,7 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_AI_DETECT = new/datum/atom_hud/ai_detector(), DATA_HUD_FAN = new/datum/atom_hud/data/human/fan_hud(), DATA_HUD_PERMIT = new/datum/atom_hud/data/human/permit(), //monkestation edit + DATA_HUD_SENSORS = new/datum/atom_hud/data/human/medical/basic/sensors(), //monkestation edit - CYBERNETICS )) /datum/atom_hud diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 966c20e12f37..7b5b7834ae9f 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -295,7 +295,7 @@ /datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus, /datum/job/curator = /obj/item/organ/internal/eyes/robotic/glow, /datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3, - /datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/surgery, + /datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/item_set/surgery, /datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer. /datum/job/head_of_personnel = /obj/item/organ/internal/eyes/robotic, /datum/job/head_of_security = /obj/item/organ/internal/eyes/robotic/thermals, @@ -309,9 +309,9 @@ /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci, /datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, /datum/job/scientist = /obj/item/organ/internal/ears/cybernetic, - /datum/job/security_officer = /obj/item/organ/internal/cyberimp/arm/flash, + /datum/job/security_officer = /obj/item/organ/internal/cyberimp/arm/item_set/flash, /datum/job/shaft_miner = /obj/item/organ/internal/monster_core/rush_gland, - /datum/job/station_engineer = /obj/item/organ/internal/cyberimp/arm/toolset, + /datum/job/station_engineer = /obj/item/organ/internal/cyberimp/arm/item_set/toolset, /datum/job/virologist = /obj/item/organ/internal/lungs/cybernetic/tier2, /datum/job/warden = /obj/item/organ/internal/cyberimp/eyes/hud/security, ) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index bec2556aa55a..28c37150c33d 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -20,7 +20,12 @@ /datum/atom_hud/data/human/medical hud_icons = list(STATUS_HUD, HEALTH_HUD, NANITE_HUD) -/datum/atom_hud/data/human/medical/basic +/datum/atom_hud/data/human/medical/basic/add_atom_to_single_mob_hud(mob/M, mob/living/carbon/H) + if(check_sensors(H)) + ..() + +/datum/atom_hud/data/human/medical/basic/proc/update_suit_sensors(mob/living/carbon/H) + check_sensors(H) ? add_atom_to_hud(H) : remove_atom_from_hud(H) /datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/H) if(!istype(H)) @@ -32,11 +37,12 @@ return FALSE return TRUE -/datum/atom_hud/data/human/medical/basic/add_atom_to_single_mob_hud(mob/M, mob/living/carbon/H) - if(check_sensors(H)) - ..() +/datum/atom_hud/data/human/medical/advanced -/datum/atom_hud/data/human/medical/basic/proc/update_suit_sensors(mob/living/carbon/H) +/datum/atom_hud/data/human/medical/basic/sensors + hud_icons = list(SENSOR_HUD) + +/datum/atom_hud/data/human/medical/basic/sensors/update_suit_sensors(mob/living/carbon/H) check_sensors(H) ? add_atom_to_hud(H) : remove_atom_from_hud(H) /datum/atom_hud/data/human/medical/advanced @@ -167,7 +173,9 @@ Medical HUD! Basic mode needs suit sensors on. //called when a human changes suit sensors /mob/living/carbon/proc/update_suit_sensors() var/datum/atom_hud/data/human/medical/basic/B = GLOB.huds[DATA_HUD_MEDICAL_BASIC] + var/datum/atom_hud/data/human/medical/basic/sensors/S = GLOB.huds[DATA_HUD_SENSORS] B.update_suit_sensors(src) + S.update_suit_sensors(src) //called when a living mob changes health /mob/living/proc/med_hud_set_health() @@ -186,14 +194,20 @@ Medical HUD! Basic mode needs suit sensors on. //called when a carbon changes stat, virus or XENO_HOST /mob/living/proc/med_hud_set_status() var/image/holder = hud_list?[STATUS_HUD] + var/image/sensors = hud_list?[SENSOR_HUD] if (isnull(holder)) return var/icon/I = icon(icon, icon_state, dir) holder.pixel_y = I.Height() - world.icon_size if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + if(sensors) + SET_PLANE_EXPLICIT(sensors, ABOVE_LIGHTING_PLANE, src) + sensors.icon_state = "sensors" + holder.icon_state = "huddead" else + sensors?.icon_state = null holder.icon_state = "hudhealthy" /mob/living/carbon/med_hud_set_status() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 02588d175c03..1840dacbd00d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -687,6 +687,8 @@ qdel(src) item_flags &= ~IN_INVENTORY SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user) + if(user && iscarbon(user)) + SEND_SIGNAL(user, COMSIG_CARBON_ITEM_DROPPED, src) if(!silent) playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE) user?.update_equipment_speed_mods() @@ -696,6 +698,8 @@ SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) SEND_SIGNAL(user, COMSIG_LIVING_PICKED_UP_ITEM, src) + if(iscarbon(user)) + SEND_SIGNAL(user, COMSIG_CARBON_ITEM_PICKED_UP, src) item_flags |= IN_INVENTORY /// called when "found" in pockets and storage items. Returns 1 if the search should end. diff --git a/code/game/objects/items/choice_beacon.dm b/code/game/objects/items/choice_beacon.dm index b4bc8154e5c7..cf57ada536bc 100644 --- a/code/game/objects/items/choice_beacon.dm +++ b/code/game/objects/items/choice_beacon.dm @@ -111,8 +111,8 @@ // cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof var/list/selectable_types = list( /obj/item/organ/internal/cyberimp/brain/anti_drop, - /obj/item/organ/internal/cyberimp/arm/toolset, - /obj/item/organ/internal/cyberimp/arm/surgery, + /obj/item/organ/internal/cyberimp/arm/item_set/toolset, + /obj/item/organ/internal/cyberimp/arm/item_set/surgery, /obj/item/organ/internal/cyberimp/chest/thrusters, /obj/item/organ/internal/lungs/cybernetic/tier3, /obj/item/organ/internal/liver/cybernetic/tier3, diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 758f95804e20..5707db9e05f0 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -311,7 +311,7 @@ var/datum/weakref/arm /obj/item/assembly/flash/armimplant/burn_out() - var/obj/item/organ/internal/cyberimp/arm/flash/real_arm = arm.resolve() + var/obj/item/organ/internal/cyberimp/arm/item_set/flash/real_arm = arm.resolve() if(real_arm?.owner) to_chat(real_arm.owner, span_warning("Your photon projector implant overheats and deactivates!")) real_arm.Retract() @@ -320,7 +320,7 @@ /obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) if(overheat) - var/obj/item/organ/internal/cyberimp/arm/flash/real_arm = arm.resolve() + var/obj/item/organ/internal/cyberimp/arm/item_set/flash/real_arm = arm.resolve() if(real_arm?.owner) to_chat(real_arm.owner, span_warning("Your photon projector is running too hot to be used again so quickly!")) return FALSE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 523c269e4346..2c9768fc6263 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -179,7 +179,7 @@ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) . = TRUE - + if(length(diseases) && isliving(user)) var/mob/living/living = user var/block = living.check_contact_sterility(BODY_ZONE_EVERYTHING) @@ -196,7 +196,7 @@ if(length(contact) && !block) for(var/datum/disease/advanced/V as anything in contact) infect_disease(V, notes="(Skin Contact - (Bump), coming from [living])") - + for(var/datum/surgery/operations as anything in surgeries) if((user.istate & ISTATE_HARM)) @@ -226,7 +226,7 @@ var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) - */ + */ if(!(user.istate & ISTATE_HARM)) help_shake_act(user) return FALSE @@ -299,7 +299,15 @@ var/shove_dir = get_dir(loc, target.loc) var/turf/target_shove_turf = get_step(target.loc, shove_dir) var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied + var/turf/target_old_turf = target.loc + if(HAS_TRAIT(target,TRAIT_SHOVE_RESIST)) + log_combat(src, target, "shoved") + target.stamina.adjust(-7) + target.visible_message("[name] tries to shove [target.name]", + "You're nearly knocked down by [name]!", "You hear aggressive shuffling!", COMBAT_MESSAGE_RANGE, src) + return + //Are we hitting anything? or if(SEND_SIGNAL(target_shove_turf, COMSIG_CARBON_DISARM_PRESHOVE) & COMSIG_CARBON_ACT_SOLID) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 84dc1029808b..006df1f042f6 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,7 +2,7 @@ blood_volume = BLOOD_VOLUME_NORMAL gender = MALE pressure_resistance = 15 - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD,SENSOR_HUD) has_limbs = TRUE held_items = list(null, null) num_legs = 0 //Populated on init through list/bodyparts diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 80fd5ade9649..fcaa78e87b74 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/species/human/human.dmi' icon_state = "human_basic" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD,PERMIT_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD,PERMIT_HUD,SENSOR_HUD) hud_type = /datum/hud/human pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 66d6366cd4c0..4d08b6cb8cf2 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -145,6 +145,7 @@ if(!force && charge < amount) return FALSE charge = max(charge - amount, 0) + SEND_SIGNAL(src,COMSIG_CELL_CHANGE_POWER) if(!istype(loc, /obj/machinery/power/apc)) SSblackbox.record_feedback("tally", "cell_used", 1, type) return TRUE @@ -158,6 +159,7 @@ amount = maxcharge var/power_used = min(maxcharge-charge,amount) charge += power_used + SEND_SIGNAL(src,COMSIG_CELL_CHANGE_POWER) return power_used /obj/item/stock_parts/cell/examine(mob/user) diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index 05f3314df6fc..009182a23249 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -129,7 +129,7 @@ ..() var/altar_turf = get_turf(religious_tool) var/blessing = pick( - /obj/item/organ/internal/cyberimp/arm/surgery, + /obj/item/organ/internal/cyberimp/arm/item_set/surgery, /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, /obj/item/organ/internal/cyberimp/eyes/hud/medical, /obj/item/organ/internal/cyberimp/mouth/breathing_tube, diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 5290c8603602..de0ff047415f 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -398,7 +398,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list (/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) construction_time =SMALL_MATERIAL_AMOUNT * 2 - build_path = /obj/item/organ/internal/cyberimp/arm/surgery + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/surgery category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) @@ -411,7 +411,7 @@ build_type = PROTOLATHE | AWAY_LATHE | MECHFAB materials = list (/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) construction_time =SMALL_MATERIAL_AMOUNT * 2 - build_path = /obj/item/organ/internal/cyberimp/arm/toolset + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/toolset category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY ) diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 28635805030c..e1058e99865b 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -13,7 +13,7 @@ ) /datum/surgery/organ_manipulation/soft - possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -25,7 +25,7 @@ /datum/surgery/organ_manipulation/alien name = "Alien organ manipulation" - possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) target_mobtypes = list(/mob/living/carbon/alien/adult) steps = list( /datum/surgery_step/saw, @@ -82,6 +82,8 @@ BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, + BODY_ZONE_L_LEG, + BODY_ZONE_R_LEG, ) steps = list( /datum/surgery_step/mechanic_open, diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 05dd6818e3e5..d797bc0e4e2d 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -20,14 +20,6 @@ /obj/item/organ/internal/cyberimp/arm/Initialize(mapload) . = ..() - if(ispath(active_item)) - active_item = new active_item(src) - items_list += WEAKREF(active_item) - - for(var/typepath in items_to_create) - var/atom/new_item = new typepath(src) - items_list += WEAKREF(new_item) - update_appearance() SetSlotFromZone() @@ -217,40 +209,25 @@ Retract() -/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(prob(30/severity) && owner && !(organ_flags & ORGAN_FAILING)) - Retract() - owner.visible_message(span_danger("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!")) - playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, TRUE) - to_chat(owner, span_userdanger("You feel an explosion erupt inside your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm as your implant breaks!")) - owner.adjust_fire_stacks(20) - owner.ignite_mob() - owner.adjustFireLoss(25) - organ_flags |= ORGAN_FAILING - - -/obj/item/organ/internal/cyberimp/arm/gun/laser +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser name = "arm-mounted laser implant" desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_laser" items_to_create = list(/obj/item/gun/energy/laser/mounted/augment) -/obj/item/organ/internal/cyberimp/arm/gun/laser/l +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/gun/taser +/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser name = "arm-mounted taser implant" desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_taser" items_to_create = list(/obj/item/gun/energy/e_gun/advtaser/mounted) -/obj/item/organ/internal/cyberimp/arm/gun/taser/l +/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/toolset +/obj/item/organ/internal/cyberimp/arm/item_set/toolset name = "integrated toolset implant" desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contain advanced versions of every tool." actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) @@ -263,10 +240,10 @@ /obj/item/multitool/cyborg, ) -/obj/item/organ/internal/cyberimp/arm/toolset/l +/obj/item/organ/internal/cyberimp/arm/item_set/toolset/l zone = BODY_ZONE_L_ARM -/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) +/obj/item/organ/internal/cyberimp/arm/item_set/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) for(var/datum/weakref/created_item in items_list) var/obj/potential_knife = created_item.resolve() if(istype(/obj/item/knife/combat/cyborg, potential_knife)) @@ -287,12 +264,12 @@ items_to_create = list(/obj/item/gun/medbeam) -/obj/item/organ/internal/cyberimp/arm/flash +/obj/item/organ/internal/cyberimp/arm/item_set/flash name = "integrated high-intensity photon projector" //Why not desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." items_to_create = list(/obj/item/assembly/flash/armimplant) -/obj/item/organ/internal/cyberimp/arm/flash/Initialize(mapload) +/obj/item/organ/internal/cyberimp/arm/item_set/flash/Initialize(mapload) . = ..() for(var/datum/weakref/created_item in items_list) var/obj/potential_flash = created_item.resolve() @@ -301,22 +278,22 @@ var/obj/item/assembly/flash/armimplant/flash = potential_flash flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code -/obj/item/organ/internal/cyberimp/arm/flash/Extend() +/obj/item/organ/internal/cyberimp/arm/item_set/flash/Extend() . = ..() active_item.set_light_range(7) active_item.set_light_on(TRUE) -/obj/item/organ/internal/cyberimp/arm/flash/Retract() +/obj/item/organ/internal/cyberimp/arm/item_set/flash/Retract() if(active_item) active_item.set_light_on(FALSE) return ..() -/obj/item/organ/internal/cyberimp/arm/baton +/obj/item/organ/internal/cyberimp/arm/item_set/baton name = "arm electrification implant" desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." items_to_create = list(/obj/item/borg/stun) -/obj/item/organ/internal/cyberimp/arm/combat +/obj/item/organ/internal/cyberimp/arm/item_set/combat name = "combat cybernetics implant" desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." items_to_create = list( @@ -326,7 +303,7 @@ /obj/item/assembly/flash/armimplant, ) -/obj/item/organ/internal/cyberimp/arm/combat/Initialize(mapload) +/obj/item/organ/internal/cyberimp/arm/item_set/combat/Initialize(mapload) . = ..() for(var/datum/weakref/created_item in items_list) var/obj/potential_flash = created_item.resolve() @@ -335,7 +312,7 @@ var/obj/item/assembly/flash/armimplant/flash = potential_flash flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code -/obj/item/organ/internal/cyberimp/arm/surgery +/obj/item/organ/internal/cyberimp/arm/item_set/surgery name = "surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) @@ -349,7 +326,7 @@ /obj/item/surgical_drapes, ) -/obj/item/organ/internal/cyberimp/arm/surgery/emagged +/obj/item/organ/internal/cyberimp/arm/item_set/surgery/emagged name = "hacked surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm. This one seems to have been tampered with." items_to_create = list( diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 0ae0cbc962a0..b5dd5e3c77e3 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -1,4 +1,3 @@ - /obj/item/organ/internal/cyberimp name = "cybernetic implant" desc = "A state-of-the-art implant that improves a baseline's functionality." diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 0987df92bd94..293135db3cf8 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -146,7 +146,7 @@ /obj/item/autosurgeon/syndicate/laser_arm desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in." uses = 1 - starting_organ = /obj/item/organ/internal/cyberimp/arm/gun/laser + starting_organ = /obj/item/organ/internal/cyberimp/arm/item_set/gun/laser /obj/item/autosurgeon/syndicate/thermal_eyes starting_organ = /obj/item/organ/internal/eyes/robotic/thermals @@ -170,4 +170,4 @@ organ_whitelist += /obj/item/organ/internal/tongue /obj/item/autosurgeon/syndicate/emaggedsurgerytoolset - starting_organ = /obj/item/organ/internal/cyberimp/arm/surgery/emagged + starting_organ = /obj/item/organ/internal/cyberimp/arm/item_set/surgery/emagged diff --git a/monkestation/code/modules/cybernetics/actions/base_action.dm b/monkestation/code/modules/cybernetics/actions/base_action.dm new file mode 100644 index 000000000000..98254b99e777 --- /dev/null +++ b/monkestation/code/modules/cybernetics/actions/base_action.dm @@ -0,0 +1,3 @@ +/datum/action/item_action/organ_action/cyberlink + name = "Extend personal connection cable" + desc = "Extends the connection cable, allowing you to connect to some machinery." diff --git a/monkestation/code/modules/cybernetics/assets.dm b/monkestation/code/modules/cybernetics/assets.dm new file mode 100644 index 000000000000..de510a2a9ca3 --- /dev/null +++ b/monkestation/code/modules/cybernetics/assets.dm @@ -0,0 +1,18 @@ +/datum/asset/simple/hacking + assets = list( + "0.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/0.png', + "3.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/3.png', + "5.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5.png', + "6.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6.png', + "9.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9.png', + "10.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10.png', + "12.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/12.png', + "3_f.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/3_f.png', + "5_f.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5_f.png', + "6_f.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6_f.png', + "9_f.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9_f.png', + "10_f.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10_f.png', + "12_f.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/12_f.png', + "e.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/e.png', + "s.png" = 'monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/s.png', + ) diff --git a/monkestation/code/modules/cybernetics/augments/_base_changes.dm b/monkestation/code/modules/cybernetics/augments/_base_changes.dm new file mode 100644 index 000000000000..14e66cfa74c6 --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/_base_changes.dm @@ -0,0 +1,160 @@ +/obj/item/organ/internal/cyberimp + var/hacked = FALSE + var/syndicate_implant = FALSE //Makes the implant invisible to health analyzers and medical HUDs. + + var/list/encode_info = AUGMENT_NO_REQ + +/obj/item/organ/internal/cyberimp/examine(mob/user) + . = ..() + if(hacked) + . += "It seems to have been tinkered with." + if(HAS_TRAIT(user,TRAIT_DIAGNOSTIC_HUD)) + var/display = "" + var/list/check_list = encode_info[SECURITY_PROTOCOL] + if(check_list.len) + for(var/security in check_list) + display += "[uppertext(security)], " + . += "It's security protocols are [display] for the implant to function it requires at least one of them to be shared with the cyberlink." + check_list = encode_info[ENCODE_PROTOCOL] + if(check_list.len) + display = "" + for(var/encode in check_list) + display += "[uppertext(encode)], " + . += "It's encoding protocols are [display] for the implant to function it requires at least one of them to be shared with the cyberlink." + check_list = encode_info[OPERATING_PROTOCOL] + if(check_list.len) + display = "" + for(var/operating in check_list) + display += "[uppertext(operating)], " + . += "It's operating protocols are [display]for the implant to function it requires at least one of them to be shared with the cyberlink." + +/obj/item/organ/internal/cyberimp/emp_act(severity) + . = ..() + if(severity == EMP_HEAVY && prob(5)) + to_chat(owner," cyberlink beeps: ERR03 HEAVY ELECTROMAGNETIC MALFUNCTION DETECTED IN [uppertext(name)].DAMAGE DETECTED, INTERNAL MEMORY DAMAGED. ") + random_encode() + else + to_chat(owner," cyberlink beeps: ERR02 ELECTROMAGNETIC MALFUNCTION DETECTED IN [uppertext(name)] ") + + +/obj/item/organ/internal/cyberimp/New(mob/M = null) + if(iscarbon(M)) + src.Insert(M) + if(implant_overlay) + var/mutable_appearance/overlay = mutable_appearance(icon, implant_overlay) + overlay.color = implant_color + add_overlay(overlay) + return ..() + +/** + * Updates implants + * + * Used when an implant is already installed and a new cyberlink is inserted, in this situation this proc fires, to update the compatibility of an implant. + */ +/obj/item/organ/internal/cyberimp/proc/update_implants() + return + +/** + * Randomly scrambles encode_info of an implant + * + * Every implant contains it's own encode_info, this info stores the data on what security, encoding and operating protocols it uses. + * Implant is compatible if for every protocol catergory it shares at least 1 protocol in common with the link. + * If it fails to meet that criteria, than it is incompatible and this proc returns FALSE. If it is compatibile returns TRUE + */ +/obj/item/organ/internal/cyberimp/proc/random_encode() + hacked = TRUE + encode_info = list( SECURITY_PROTOCOL = list(pick(SECURITY_NT1,SECURITY_NT2,SECURITY_NTX,SECURITY_TMSP,SECURITY_TOSP)), \ + ENCODE_PROTOCOL = list(pick(ENCODE_ENC1,ENCODE_ENC2,ENCODE_TENN,ENCODE_CSEP)), \ + OPERATING_PROTOCOL = list(pick(OPERATING_NTOS,OPERATING_TGMF,OPERATING_CSOF))) +/** + * Checks compatibility of implant against the cyberlink + * + * Every implant contains it's own encode_info, this info stores the data on what security, encoding and operating protocols it uses. + * Implant is compatible if for every protocol catergory it shares at least 1 protocol in common with the link. + * If it fails to meet that criteria, than it is incompatible and this proc returns FALSE. If it is compatibile returns TRUE + */ +/obj/item/organ/internal/cyberimp/proc/check_compatibility() + var/obj/item/organ/internal/cyberimp/cyberlink/link = owner.get_organ_slot(ORGAN_SLOT_LINK) + + for(var/info in encode_info) + // We check if encode_info for this protocol categoru is NO_PROTOCOL meaning it is compatible with anything. + if(encode_info[info] == NO_PROTOCOL) + . = TRUE + continue + + var/list/encrypted_information = encode_info[info] + + . = FALSE + + //We check for link here because implants that contain NO_PROTOCOL for every category should work even without an implant. + if(!link) + return + + //We check if our protocol category shares at least 1 protocol with the cyberlink + for(var/protocol in encrypted_information) + if(protocol in link.encode_info[info]) + . = TRUE + + //If it doesn't return FALSE + if(!.) + return + +/obj/item/organ/internal/cyberimp/cyberlink + name = "cybernetic brain link" + desc = "Allows for smart communication between implants." + icon_state = "brain_implant" + implant_overlay = "brain_implant_overlay" + slot = ORGAN_SLOT_LINK + zone = BODY_ZONE_HEAD + w_class = WEIGHT_CLASS_TINY + var/obj/item/cyberlink_connector/connector + var/extended = FALSE + +/obj/item/organ/internal/cyberimp/cyberlink/Insert(mob/living/carbon/M, special, drop_if_replaced) + for(var/X in M.organs) + var/obj/item/organ/O = X + if(!istype(O,/obj/item/organ/internal/cyberimp)) + continue + var/obj/item/organ/internal/cyberimp/cyber = O + cyber.update_implants() + return ..() + +/obj/item/organ/internal/cyberimp/cyberlink/nt_low + name = "NT Cyberlink 1.0" + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/cyberlink/nt_high + name = "NT Cyberlink 2.0" + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/cyberlink/terragov + name = "Terran Cyberware System" + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/cyberlink/syndicate + name = "Cybersun Cybernetics Access System" + encode_info = AUGMENT_SYNDICATE_LEVEL + +/obj/item/organ/internal/cyberimp/cyberlink/admin + name = "G.O.D. Cybernetics System" + encode_info = AUGMENT_ADMIN_LEVEL + +/obj/item/autosurgeon/organ/cyberlink_nt_low + starting_organ = /obj/item/organ/internal/cyberimp/cyberlink/nt_low + uses = 1 + +/obj/item/autosurgeon/organ/cyberlink_nt_high + starting_organ = /obj/item/organ/internal/cyberimp/cyberlink/nt_high + uses = 1 + +/obj/item/autosurgeon/organ/cyberlink_terragov + starting_organ = /obj/item/organ/internal/cyberimp/cyberlink/terragov + uses = 1 + +/obj/item/autosurgeon/organ/cyberlink_syndicate + starting_organ = /obj/item/organ/internal/cyberimp/cyberlink/syndicate + uses = 1 + +/obj/item/autosurgeon/organ/cyberlink_admin + starting_organ = /obj/item/organ/internal/cyberimp/cyberlink/admin + uses = 1 diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments.dm b/monkestation/code/modules/cybernetics/augments/arm_augments.dm new file mode 100644 index 000000000000..33e49d98af19 --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/arm_augments.dm @@ -0,0 +1,345 @@ +/obj/item/organ/internal/cyberimp/arm + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/Initialize() + . = ..() + if(ispath(active_item)) + active_item = new active_item(src) + + for(var/typepath in items_to_create) + var/atom/new_item = new typepath(src) + items_list += WEAKREF(new_item) + +/obj/item/organ/internal/cyberimp/arm/item_set/update_implants() + if(!check_compatibility()) + Retract() + + owner.visible_message("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + + owner.transferItemToLoc(active_item, src, TRUE) + active_item = null + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE) + +/obj/item/organ/internal/cyberimp/arm/item_set/ui_action_click() + if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) + to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) + return + + if(!active_item || (active_item in src)) + active_item = null + if(contents.len == 1) + Extend(contents[1]) + else + var/list/choice_list = list() + for(var/datum/weakref/augment_ref in items_list) + var/obj/item/augment_item = augment_ref.resolve() + if(!augment_item) + items_list -= augment_ref + continue + choice_list[augment_item] = image(augment_item) + var/obj/item/choice = show_radial_menu(owner, owner, choice_list) + if(owner && owner == usr && owner.stat != DEAD && (src in owner.organs) && !active_item && (choice in contents)) + // This monster sanity check is a nice example of how bad input is. + Extend(choice) + else + Retract() + + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(prob(30/severity) && owner && !(organ_flags & ORGAN_FAILING)) + Retract() + owner.visible_message(span_danger("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!")) + playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, TRUE) + to_chat(owner, span_userdanger("You feel an explosion erupt inside your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm as your implant breaks!")) + owner.adjust_fire_stacks(20) + owner.ignite_mob() + owner.adjustFireLoss(25) + organ_flags |= ORGAN_FAILING + + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/Initialize() + . = ..() + var/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/laserphasergun = locate(/obj/item/gun/energy/laser/mounted) in contents + laserphasergun.icon = icon //No invisible laser guns kthx + laserphasergun.icon_state = icon_state + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/toolset + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/toolset/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/esword + encode_info = AUGMENT_SYNDICATE_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/medibeam + encode_info = AUGMENT_TG_LEVEL + + +/obj/item/organ/internal/cyberimp/arm/item_set/flash + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/baton + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/combat + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/surgery + name = "surgical toolset implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." + items_to_create = list(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/cook + name = "kitchenware toolset implant" + desc = "A set of kitchen tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/kitchen/rollingpin, + /obj/item/knife/kitchen, + /obj/item/reagent_containers/cup/beaker + ) + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/janitor + name = "janitorial toolset implant" + desc = "A set of janitorial tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/mop/advanced, + /obj/item/reagent_containers/cup/bucket, + /obj/item/soap, + /obj/item/reagent_containers/spray/cleaner + ) + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/detective + name = "detective's toolset implant" + desc = "A set of detective tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/evidencebag, + /obj/item/evidencebag, + /obj/item/evidencebag, + /obj/item/detective_scanner, + /obj/item/lighter + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/detective/Destroy() + on_destruction() + return ..() + +/obj/item/organ/internal/cyberimp/arm/item_set/detective/proc/on_destruction() + //We need to drop whatever is in the evidence bags + for(var/obj/item/evidencebag/baggie in contents) + var/obj/item/located = locate() in baggie + if(located) + located.forceMove(drop_location()) + +/obj/item/organ/internal/cyberimp/arm/item_set/chemical + name = "chemical toolset implant" + desc = "A set of chemical tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/dropper + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/atmospherics + name = "atmospherics toolset implant" + desc = "A set of atmospheric tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/extinguisher, + /obj/item/analyzer, + /obj/item/crowbar, + /obj/item/holosign_creator/atmos + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/connector + name = "universal connection implant" + desc = "Special inhand implant that allows you to connect your brain directly into the protocl sphere of implants, which allows for you to hack them and make the compatible." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#39992d" + encode_info = AUGMENT_NO_REQ + items_to_create = list(/obj/item/cyberlink_connector) + +/obj/item/organ/internal/cyberimp/arm/item_set/mantis + name = "C.H.R.O.M.A.T.A. mantis blade implants" + desc = "High tech mantis blade implants, easily portable weapon, that has a high wound potential." + items_to_create = list(/obj/item/mantis_blade) + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/syndie_mantis + name = "A.R.A.S.A.K.A. mantis blade implants" + desc = "Modernized mantis blade designed coined by Tiger operatives, much sharper blade with energy actuators makes it a much deadlier weapon." + items_to_create = list(/obj/item/mantis_blade/syndicate) + encode_info = AUGMENT_SYNDICATE_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/syndie_mantis/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/ammo_counter + name = "S.M.A.R.T. ammo logistics system" + desc = "Special inhand implant that allows transmits the current ammo and energy data straight to the user's visual cortex." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#750137" + encode_info = AUGMENT_NT_HIGHLEVEL + + var/atom/movable/screen/cybernetics/ammo_counter/counter_ref + var/obj/item/gun/our_gun + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/Insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + RegisterSignal(M,COMSIG_CARBON_ITEM_PICKED_UP, PROC_REF(add_to_hand)) + RegisterSignal(M,COMSIG_CARBON_ITEM_DROPPED, PROC_REF(remove_from_hand)) + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/Remove(mob/living/carbon/M, special) + . = ..() + UnregisterSignal(M,COMSIG_CARBON_ITEM_PICKED_UP) + UnregisterSignal(M,COMSIG_CARBON_ITEM_DROPPED) + our_gun = null + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/update_implants() + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/update_hud_elements() + SIGNAL_HANDLER + if(!owner || !owner?.stat || !owner?.hud_used) + return + + if(!check_compatibility()) + return + + var/datum/hud/H = owner.hud_used + + if(!our_gun) + if(!H.cybernetics_ammo[zone]) + return + H.cybernetics_ammo[zone] = null + + counter_ref.hud = null + H.infodisplay -= counter_ref + H.mymob.client.screen -= counter_ref + QDEL_NULL(counter_ref) + return + + if(!H.cybernetics_ammo[zone]) + counter_ref = new() + counter_ref.screen_loc = zone == BODY_ZONE_L_ARM ? ui_hand_position(1,1,9) : ui_hand_position(2,1,9) + H.cybernetics_ammo[zone] = counter_ref + counter_ref.hud = H + H.infodisplay += counter_ref + H.mymob.client.screen += counter_ref + + var/display + if(istype(our_gun,/obj/item/gun/ballistic)) + var/obj/item/gun/ballistic/balgun = our_gun + display = balgun.magazine.ammo_count() + else + var/obj/item/gun/energy/egun = our_gun + var/obj/item/ammo_casing/energy/shot = egun.ammo_type[egun.select] + display = FLOOR(egun.cell.charge / shot.e_cost,1) + counter_ref.maptext = MAPTEXT("
[display]
") + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/add_to_hand(datum/source,obj/item/maybegun) + SIGNAL_HANDLER + + var/obj/item/bodypart/bp = owner.get_active_hand() + + if(bp.body_zone != zone) + return + + if(istype(maybegun,/obj/item/gun/ballistic)) + our_gun = maybegun + RegisterSignal(owner,COMSIG_MOB_FIRED_GUN, PROC_REF(update_hud_elements)) + + if(istype(maybegun,/obj/item/gun/energy)) + var/obj/item/gun/energy/egun = maybegun + our_gun = egun + RegisterSignal(egun.cell,COMSIG_CELL_CHANGE_POWER, PROC_REF(update_hud_elements)) + + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/remove_from_hand(datum/source,obj/item/maybegun) + SIGNAL_HANDLER + + if(our_gun != maybegun) + return + + if(istype(maybegun,/obj/item/gun/ballistic)) + UnregisterSignal(owner,COMSIG_MOB_FIRED_GUN) + + if(istype(maybegun,/obj/item/gun/energy)) + var/obj/item/gun/energy/egun = maybegun + UnregisterSignal(egun.cell,COMSIG_CELL_CHANGE_POWER) + + + our_gun = null + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/syndicate + encode_info = AUGMENT_SYNDICATE_LEVEL + +/obj/item/organ/internal/cyberimp/arm/cooler + name = "sub-dermal cooling implant" + desc = "Special inhand implant that cools you down if overheated." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#00e1ff" + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/cooler/on_life() + . = ..() + if(!check_compatibility()) + return + var/amt = BODYTEMP_NORMAL - owner.get_body_temp_normal() + if(amt == 0) + return + owner.add_body_temperature_change("dermal_cooler_[zone]",clamp(amt,-1,0)) + +/obj/item/organ/internal/cyberimp/arm/cooler/Remove(mob/living/carbon/M, special) + . = ..() + owner.remove_body_temperature_change("dermal_cooler_[zone]") + +/obj/item/organ/internal/cyberimp/arm/heater + name = "sub-dermal heater implant" + desc = "Special inhand implant that heats you up if overcooled." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#ff9100" + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/heater/on_life() + . = ..() + if(!check_compatibility()) + return + var/amt = BODYTEMP_NORMAL - owner.get_body_temp_normal() + if(amt == 0) + return + owner.add_body_temperature_change("dermal_heater_[zone]",clamp(amt,0,1)) + +/obj/item/organ/internal/cyberimp/arm/heater/Remove(mob/living/carbon/M, special) + . = ..() + owner.remove_body_temperature_change("dermal_heater_[zone]") diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments.dm b/monkestation/code/modules/cybernetics/augments/leg_augments.dm new file mode 100644 index 000000000000..39d287548906 --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/leg_augments.dm @@ -0,0 +1,215 @@ +/obj/item/organ/internal/cyberimp/leg + name = "leg-mounted implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + zone = BODY_ZONE_R_LEG + icon_state = "implant-toolkit" + w_class = WEIGHT_CLASS_SMALL + encode_info = AUGMENT_NT_LOWLEVEL + + var/double_legged = FALSE + +/obj/item/organ/internal/cyberimp/leg/Initialize() + . = ..() + update_icon() + SetSlotFromZone() + +/obj/item/organ/internal/cyberimp/leg/proc/SetSlotFromZone() + switch(zone) + if(BODY_ZONE_R_LEG) + slot = ORGAN_SLOT_LEFT_LEG_AUG + if(BODY_ZONE_L_LEG) + slot = ORGAN_SLOT_RIGHT_LEG_AUG + else + CRASH("Invalid zone for [type]") + +/obj/item/organ/internal/cyberimp/leg/update_icon() + . = ..() + if(zone == BODY_ZONE_R_LEG) + transform = null + else // Mirroring the icon + transform = matrix(-1, 0, 0, 0, 1, 0) + +/obj/item/organ/internal/cyberimp/leg/examine(mob/user) + . = ..() + . += "[src] is assembled in the [zone == BODY_ZONE_R_LEG ? "right" : "left"] LEG configuration. You can use a screwdriver to reassemble it." + +/obj/item/organ/internal/cyberimp/leg/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(.) + return TRUE + I.play_tool_sound(src) + if(zone == BODY_ZONE_R_LEG) + zone = BODY_ZONE_L_LEG + else + zone = BODY_ZONE_R_LEG + SetSlotFromZone() + to_chat(user, "You modify [src] to be installed on the [zone == BODY_ZONE_R_LEG ? "right" : "left"] leg.") + update_icon() + +/obj/item/organ/internal/cyberimp/leg/on_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!double_legged) + on_full_insert(M, special, drop_if_replaced) + return + on_full_insert(M, special, drop_if_replaced) + +/obj/item/organ/internal/cyberimp/leg/proc/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + return + +/obj/item/organ/internal/cyberimp/leg/emp_act(severity) + . = ..() + owner.apply_damage(10,BURN,zone) + +/obj/item/organ/internal/cyberimp/leg/table_glider + name = "table-glider implant" + desc = "Implant that allows you quickly glide tables. You need to implant this in both of your legs to make it work." + encode_info = AUGMENT_NT_LOWLEVEL + double_legged = TRUE + +/obj/item/organ/internal/cyberimp/leg/table_glider/update_implants() + if(!check_compatibility()) + REMOVE_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + return + ADD_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + +/obj/item/organ/internal/cyberimp/leg/table_glider/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!check_compatibility()) + return + ADD_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + +/obj/item/organ/internal/cyberimp/leg/table_glider/Remove(mob/living/carbon/M, special) + REMOVE_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + return ..() + +/obj/item/organ/internal/cyberimp/leg/shove_resist + name = "BU-TAM resistor implant" + desc = "Implant that allows you to resist shoves, instead shoves deal pure stamina damage. You need to implant this in both of your legs to make it work." + encode_info = AUGMENT_NT_HIGHLEVEL + double_legged = TRUE + +/obj/item/organ/internal/cyberimp/leg/shove_resist/update_implants() + if(!check_compatibility()) + REMOVE_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + return + ADD_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + +/obj/item/organ/internal/cyberimp/leg/shove_resist/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!check_compatibility()) + return + ADD_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + +/obj/item/organ/internal/cyberimp/leg/shove_resist/Remove(mob/living/carbon/M, special) + REMOVE_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + return ..() + +/obj/item/organ/internal/cyberimp/leg/accelerator + name = "P.R.Y.Z.H.O.K. accelerator system" + desc = "Russian implant that allows you to tackle people. You need to implant this in both of your legs to make it work." + encode_info = AUGMENT_TG_LEVEL + double_legged = TRUE + var/datum/component/tackler + +/obj/item/organ/internal/cyberimp/leg/accelerator/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + tackler = M.AddComponent(/datum/component/tackler, stamina_cost=30, base_knockdown = 1.5, range = 5, speed = 2, skill_mod = 1.5, min_distance = 3) + +/obj/item/organ/internal/cyberimp/leg/accelerator/Remove(mob/living/carbon/M, special) + if(tackler) + qdel(tackler) + return ..() + +/obj/item/organ/internal/cyberimp/leg/chemplant + name = "Debug Chemplant" + desc = "You shouldn't see this!" + icon_state = "chemplant" + implant_overlay = "chemplant_overlay" + var/list/reagent_list = list() + var/health_threshold = 40 + var/max_ticks_cooldown = 60 SECONDS + var/current_ticks_cooldown = 0 + var/mutable_appearance/overlay + +/obj/item/organ/internal/cyberimp/leg/chemplant/Initialize() + . = ..() + +/obj/item/organ/internal/cyberimp/leg/chemplant/on_life() + if(!check_compatibility()) + return + //Cost of refilling is a little bit of nutrition, some blood and getting jittery + if(owner.nutrition > NUTRITION_LEVEL_STARVING && owner.blood_volume > BLOOD_VOLUME_SURVIVE && current_ticks_cooldown > 0) + + owner.nutrition -= 5 + owner.blood_volume-- + owner.adjust_jitter(1) + owner.adjust_dizzy(1) + + current_ticks_cooldown -= SSmobs.wait + + return + + if(owner.health < health_threshold) + current_ticks_cooldown = max_ticks_cooldown + on_effect() + +/obj/item/organ/internal/cyberimp/leg/chemplant/emp_act(severity) + . = ..() + health_threshold += rand(-10,10) + current_ticks_cooldown = max_ticks_cooldown + on_effect() + +/obj/item/organ/internal/cyberimp/leg/chemplant/proc/on_effect() + var/obj/effect/temp_visual/chempunk/punk = new /obj/effect/temp_visual/chempunk(get_turf(owner)) + punk.color = implant_color + owner.reagents.add_reagent_list(reagent_list) + + overlay = mutable_appearance('icons/effects/effects.dmi', "biogas",ABOVE_MOB_LAYER) + overlay.color = implant_color + + RegisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/update_owner_overlay) + + addtimer(CALLBACK(src,.proc/remove_overlay),max_ticks_cooldown/2) + + to_chat(owner," You feel a sharp pain as the cocktail of chemicals is injected into your bloodstream!") + return + +/obj/item/organ/internal/cyberimp/leg/chemplant/proc/update_owner_overlay(atom/source, list/overlays) + SIGNAL_HANDLER + + if(overlay) + overlays += overlay + +/obj/item/organ/internal/cyberimp/leg/chemplant/proc/remove_overlay() + QDEL_NULL(overlay) + + UnregisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS) + +/obj/effect/temp_visual/chempunk + icon = 'monkestation/code/modules/cybernetics/icons/96x96.dmi' + icon_state = "chempunk" + pixel_x = -32 //So the big ol' 96x96 sprite shows up right + pixel_y = -32 + layer = BELOW_MOB_LAYER + duration = 5 + +/obj/item/organ/internal/cyberimp/leg/chemplant/drugs + name = "deep-vein emergency morale rejuvenator" + desc = "Dangerous implant used by the syndicate to reinforce their assault forces that go on suicide missions." + implant_color = "#74942a" + encode_info = AUGMENT_SYNDICATE_LEVEL + reagent_list = list(/datum/reagent/determination = 5, /datum/reagent/drug/methamphetamine = 5 , /datum/reagent/medicine/atropine = 5) + +/obj/item/organ/internal/cyberimp/leg/chemplant/emergency + name = "deep emergency chemical infuser" + desc = "Dangerous implant used by the syndicate to reinforce their assault forces that go on suicide missions." + implant_color = "#2a6194" + encode_info = AUGMENT_NT_HIGHLEVEL + reagent_list = list(/datum/reagent/medicine/atropine = 5, /datum/reagent/medicine/omnizine = 3 , /datum/reagent/medicine/leporazine = 3, /datum/reagent/medicine/c2/aiuri = 2, /datum/reagent/medicine/c2/libital = 2) + +/obj/item/organ/internal/cyberimp/leg/chemplant/rage + name = "R.A.G.E. chemical system" + desc = "Extremely dangerous system that fills the user with a mix of potent drugs in dire situation." + implant_color = "#ce3914" + encode_info = AUGMENT_TG_LEVEL + reagent_list = list(/datum/reagent/determination = 2, /datum/reagent/medicine/c2/penthrite = 3 , /datum/reagent/drug/bath_salts = 5 , /datum/reagent/medicine/ephedrine = 5) diff --git a/monkestation/code/modules/cybernetics/designs/medical.dm b/monkestation/code/modules/cybernetics/designs/medical.dm new file mode 100644 index 000000000000..fbd508bd2530 --- /dev/null +++ b/monkestation/code/modules/cybernetics/designs/medical.dm @@ -0,0 +1,25 @@ +/datum/design/cyberlink_nt_low + name = "NT Cyberlink 1.0" + desc = "Allows for synchronization of basic cybernetic mechanisms." + id = "ci-nt_low" + build_type = PROTOLATHE | MECHFAB + construction_time = 8 SECONDS + materials = list(/datum/material/iron = 4000, /datum/material/glass = 2000, /datum/material/silver = 1000) + build_path = /obj/item/organ/internal/cyberimp/cyberlink/nt_low + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/cyberlink_nt_high + name = "NT Cyberlink 2.0" + desc = "Allows for synchronization of advanced cybernetic mechanisms." + id = "ci-nt_high" + build_type = PROTOLATHE | MECHFAB + construction_time = 8 SECONDS + materials = list(/datum/material/iron = 6000, /datum/material/glass = 4000, /datum/material/silver = 2000 , /datum/material/gold = 2000) + build_path = /obj/item/organ/internal/cyberimp/cyberlink/nt_high + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL diff --git a/monkestation/code/modules/cybernetics/hud/cybernetics.dm b/monkestation/code/modules/cybernetics/hud/cybernetics.dm new file mode 100644 index 000000000000..a143d808c54c --- /dev/null +++ b/monkestation/code/modules/cybernetics/hud/cybernetics.dm @@ -0,0 +1,7 @@ + +/atom/movable/screen/cybernetics + icon = 'monkestation/code/modules/cybernetics/icons/screen_cybernetics.dmi' + +/atom/movable/screen/cybernetics/ammo_counter + name = "digital ammo counter" + icon_state = "basic_interface" diff --git a/monkestation/code/modules/cybernetics/icons/96x96.dmi b/monkestation/code/modules/cybernetics/icons/96x96.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3752fdaa32afc67a0fefeea50aec84a735697ed3 GIT binary patch literal 68749 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

X`wY6CR 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/0.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/0.png new file mode 100644 index 0000000000000000000000000000000000000000..647084c8ac88eb97e1239de41772b28847a0eeb9 GIT binary patch literal 729 zcmV;~0w(>5P)z9s&*l-Z%H}0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbPQ%OWYRCwC$oxyU0FbqWTPX7Ow>7~uIDNSNyNo)G{o?z** zD;eyOr>tl&5!&pS4hppA(>5c22>8@dvmIq;;@ENAdhFL%h~C$ zu2djSXQJy`Q-G`lqI&J&K)woE4MbHPVL(=PMP*GPK(6A7iu$GkxuPqwYn=w<>aNJD zTfjJZMt{~k>rsz@;RQv&@PZ;>ctH^`yr2jeUQh%KFDL?r7Zi;g0LAr8J?=o~ZxK!d zA*yntOA)q1<2@8nUUJ`NT6% zykbkZ!^4my0c0g040Nx-ZnKjEBC-I200IyM z5P%?n00aR90R$lEg>L-qz(e<63<2Sz)*6w;3_$={5(vK>)(`YM5C*%)Kqs=8A*c%o zbEI~D`~bonsh=N*k%dd@-0=$tE~#|~Lw%L2EMluBt`30^TXk{uG_r6>zB~Q|f=g=L z@p7o+l3aH@1v2|J4CuXG`q)v z!M$01VcRoZ(JdJ@h3}Vj6}M#7k+Ol=%5KSCd+LsID}kw6YsnUWkC(?Ta2(cEzUQKY zYn+^GvkB(WO=VPbGLN+^kawCk(zsdQlck&MP(5nc=%bmHuIxSl0U~>^XRTx~00000 LNkvXXu0mjf^zSqt literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10.png new file mode 100644 index 0000000000000000000000000000000000000000..820e9769c68189b2b492975ed9d7a6ffba85e6cd GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^DImFdh=gh!5v$MDpRr3ZmRk|nMYCC>S|xv6<249-QVi6yBi3gww484B*6z5(HleBulY zOl6)fjv*Dd-p)N(bXbAMrMK<>|J3hS`eyG~dC(*3!{w#Z`wmv!jP+oT+Ln8JyJyz@ z?`x-g`dobFy;f*w-oEFXLli?(8I)(0ee0>cfB#r8W5`qo7t^PubCeh47=$|V-t_$; z_dnE9^7E?Is~3h_My^`fuw&hHxW~@9C&_2zJqx5OO za+ih)@>Z5fPuj!!5+YMLSSQSE5O@)FFpjf$ZNmE1^^ek4@A{?Q7qFaxNq|d%VIhMP zV@vIc$>z1wzxm&GxqigXNm0i7LeL&YrxWYE6t6_41~SYP;;6U05^+dcTW7Ar@l7WL zR&jDzPMR&hzhQ#%&!2@^kt<>Ia9)r~i7kyl$7j`b32Hg_^!~4(Qw;8q3yHdNd+*veO2=`qf!X zO{G7hLyZO2oW8zlmk5(cyu?|DhDY3sxj6#aueU(#OUXUK<{pF5x zzw3Dxwd{48&#%N!Kdx0E@@#5dVM9~alquT9lMmlqc4@Wc#AILYCtjDUq|9Gg2C7#7 lJQI1iYX7X6nW^7d)gR5c_b+_=Vqh|5@O1TaS?83{1OT+@QLq32 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10_f.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/10_f.png new file mode 100644 index 0000000000000000000000000000000000000000..c0bc69d47cf40079093c3e6d3ec5858eb49a9449 GIT binary patch literal 7802 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∾928xgL1C~fWtH6@&uOzBB@xHIu^Y{YhtHx zCRFBSt3&)Eh$W&l2n8~tn@Rkou_34htp@e&HA#@93e(FFFWsN7>Z-9jG!iaKbp!r@0 z{&N{Q~FKk+Bx?N+FCO%rG}tH>3u)VnMdz zU^LJJMELRQU&N*dP!h(kPS6UWEUWF)?OM=5R!Ya@y%Q|2W;G*`c_^xb7hcvOP+r!t{be1%R+I=pR#y+9v#&D@ zq=-BOgs~(t<`6MiVz?Z1>x@Y|1Mx*)C9>2%MI#@y-BhxzE3v^Ju_$W3F$8cWUjPmv5fl_VrEuMKI59(P%`+Y@lU=%Syu^V7~qcTDTSw}6co{1O(Y>?c5r%EhqM8!)OZ+k z7^Dc2BgLT3TUEzwDk|H7LbmcJ@M8X~-SlgiF+al@#Dla(0@=}1nmQwl(rq2WY`hW{ zk0U4&5(B~03LFwlwi6c|$aUZC3BG#`s7(=c-0NGAW8VGoaR2Ihe-Br9xe!vrl}rD` z0K#jyqC)*%Q_b=Bn(r00o<{9Q2S2o;c`vDs-^Yqt?}yd?ZinW_E&kITnjg3LPj_hk z&WK;#q4_%_eszcDD{fx#c9n-114Ln5uCV=r%qQsL+^_{haamE)Raqv!(29A)uL}PrU}>Cy@UqK8)(@v9zTJ$kDEfl ztk7ergzF`ZYjwp3n75;}z5PWcy#9hR9&vXd`C}!yC=~Pdk$d^*`_(kSc&(?1`ffdG zgIwRcGoQEjZ+2%sZ|~pi&V1h9zuBGnmGS;`cji~d`_tW-uekOryEDIWE&T3Ig9B<; z1#OXB3Fa~;T4h=FdvgO2A`B)Ol{Bia?_0y#2zwegO}%K1=A&vvqbVU;7m*-nFu8PF zbUr!T$7!)SFxw{dH|$pifU_c7cRXq9WDT{*w=987Zsnw^UCt<8=cRTn2|^ab6e=Y+ zB(egna>7oKKut(>-7HU`Azxi(b7hm|bg-{+xvyp2NTMrg#cV}p5EP@2l zWGe+bf-K^5veH^n+y;YSu4Fzeg2sO=qLT<%WSkF+9H13^O>c|%2D#0)ybN+j#s=ac zdu(>*$N8WTK-!x^Q1qb?>h2tWpxp3oNwn5y)cJ{E_JUrFQD*ey`H>QlFI@UOun$ zQlFZa`?VkSiJ0Q1uKH|S#~x~VQEA)~&5KJD3%BHioM6Ou@9MhFU*@iqk|ff>pFK;2 z(~_w@Rw`)Mn4W@5RW*6dPSVXeL$w{zPGq3So8BvT6#G=vPUf=7-cgT|DmhbNVZXPY z@@O)Or5+7MG;_O6s3swQ$7i<*RdIaRWSrozT}>!hWxAg?nl6v!r~~{E_?&M%^DBYV0Ajl}=i> z`Ez@_l16xXL7)&tz3MpC@of;0lTxA)=L~y1tts{3L;F*_TwP)LY~Y-&SL` zWk00XoL_=w(#`tND0KAqm78SswpPH!8F$ap%vsi174Ri~E>0*NUpqnf9?oPpDT z`g?VkNn{=AxgcoXi zN}4o>N_BEsC+|oAik}>*Mq5|t`D_67+Va{PNcXPk7;y8k@Ee+5hbQlVP5q95y#IBG zntv3EA0g@0=fBfW1G8Ne)YtgadE6Y*Yy7FRo#l={vwE2+=qTB3Wr8X7X^RfqG#K2b z!{EWIMj+qGOq=-1YBHlJS^ZED@)H*E+_1=KlRXIwPvInD;mo|n*xrCRJ*g#VX0y20jm6i= z{x#_%g1BOOCVfCcc~AP@gXszRp~}O>L|g^tEu^#5q3IC0EuXn`2b1}{0oo|-U#Qs zX;43o5>P(g!&Q=6wZ*=Mt9M9IqM>-U^li8rJ*j2$GhA&tdk}Qi%YGZKDn1=Dl871k z=y-S2;S!^hxIQ$8H3U`ljnui5H6$wFj_KQ33<4`fm!G2;)EZxlYx*35 zj$#<1{|T>q79%LUbh`36i*eK+%&irq>^+Ndk78^zef8@(ib3ckF+HOr)w{f>_rRm1 zfz3Mgt4}uQXp9DJ8r^fFFgZ6`qWmNC$=!_EczehF;#=w5Qzuh_S3<88kOXfCEJut} zJl4QImv^QnMA4YlNhs*xuBLVOBvgd=Ljb(dx!>m`6beIKjOQd21+Yc0lTfIS zlyz_%mLvx@w|1(DV#TFED2?KgS0+noR-LD*h1(-$HS+_88`4v0MTp^rL;)w~9YLDs z(phWI!xASHyYbFY_kvVVL)_&|C^WR`(N?eoon5{RmGPwai2x_>tpdG(05I!|zbd!`-5NeFHD68KUF=#j~?hKU;G zJKr|GECP(^fceivn)W`o-SmM7?fRbEhHOAu zBt!49?V8nwG+<2trn2@UC&e!HU< z5xavuM_j0)UW<rLst?WKK* zfD(pKrHi}y9vVI{#4*r?R>w_1xPv92t(p3yup%*h&Y7G`|}1p>XU&@T{p3c{4~?%Nk*SHcr5g9nj5(qjSYY; zSnKmi7kwHa>%%TLzVvATxTgAuu>8?LV13#YDwlNjuY&H}2ysO@s#{rnyQxnrbKKFO z`kxv)>mw>qfwnTs-_L^}*eF*dCwq(plRg2~mZ|J9z?>$`yWa!6S*9KLGX_ZA`x%4u z{)_=RTBz+}H)#Pb;gzXT)L{GMXhz)`2>0dkKz zA<;86hC-X!5vm!y8&leOQk&JL?zf%sg(>g>M5$^24^%le`otrgY5)KL24YJ`L;(K) z0000pCw%h&000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jmPM5)~hjD57Qn000?u zMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0007YNklGFO##Gt)y$Z? z&4Q70Uh4I83uX&vSs+S5>6tT209joXk!mqip`{i>6AXwF0>oO17QT;tMtV+we46D+z zF2ky{tjn+}E$cGWp`{W-9a<_e)S;ykqcvJ(*p-%T8Fr;*TZTHcRAQ(@OC^N5a;Q@x zK*$fB95M1kD@U*_GK2!iNXdKJTKIS?ic`3U_6-%%1zyW6>*tiJEK3IraVPu?if8d4*pb zpr9Hh<;vXTaI~rPYR=5DmIZRAX+4b_^_*EHdn@Tt!+O7(S?SI02S)vp+Ed~={{R30 M07*qoM6N<$f)iToG5`Po literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/12.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/12.png new file mode 100644 index 0000000000000000000000000000000000000000..7793975da16e000b0a6a8c3b96e9e81a05b4692c GIT binary patch literal 735 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 RRr>${002ovPDHLkV1g{S?s)(J literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/3_f.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/3_f.png new file mode 100644 index 0000000000000000000000000000000000000000..6d38e73f0d3ded7809894b35d1f4fa5ec352ac8a GIT binary patch literal 7235 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 RxQze+002ovPDHLkV1k-N2krm> literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5.png new file mode 100644 index 0000000000000000000000000000000000000000..04b3d1dea25024e139527432584ef807e7bfd706 GIT binary patch literal 772 zcmeAS@N?(olHy`uVBq!ia0vp^DImFdh=gh!5vS783CmU}=U$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj3F!Z|7btYf<2FQEmVKKlS&8Z!+1X<$;rUDn8$vRxnd?!Mf;asgctivtq9= zo$~0P@yyVv>i0jFuXNJV;_94ZlIrl%VcX=%rkY&I9;}<<7iz5zPK;UTFePl!s|e?Y z9u}qQH}4$kq@{RW!sPQD+`?Sb{Pi5t0$tteV;j$`=z0;in{j5WXke|hLEgF-^XFB^ zew8rTvH%ypG1cDT=h>NCS2XXcciF+qvbt-l-scIjrL}y#t1oTRJG^Skn$sJ!bYB~- z@jAVWr!-^bk%0DTUSP%yskKILyiRZ9*?nn~uCr{Emf@9!ONE?bEw5+_Dm-cT>y!Ao zaH?{In4}Y9ii!fuuCNWK_nd6}wa#j@liMB3Yd7s@c&-R$VB}yGXb50f$Z+W3hm-C5 zGWpw#@9Txwl`YtMf=3|A%xA^s(~B64lmz}2uh^JvQWg>QTuY~$XQ3UNQ{R(k$K@5C zc+}O&M2Tsg3_fnJutFtVw&j<`Zk-(MPMcDr)lqvw9`dEQZLL_P#BxF>t25x}wk(%m_kb(wzijVT zFIr=|>7?=26$fr=TO`MrF8-Lim}^yFl#FS0=)O}D>rYyqG7_D7&2`B);i7Gv8FP1R s?rq6xyXv~7PwmYsz1$_~O#2w3{>(dHyE-Zlm|Ph=UHx3vIVCg!0OPbl`2YX_ literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5_f.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/5_f.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c6eac5e225ba185638015a408499601f0e7a59 GIT binary patch literal 7823 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6.png new file mode 100644 index 0000000000000000000000000000000000000000..91af0bc03243343d58def6decb8f044381173812 GIT binary patch literal 766 zcmeAS@N?(olHy`uVBq!ia0vp^DImFdh=gh!5vm!-8JU@=fgvcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%`Pn>~) zslwC6F{I+w+qoCZS`>I(RFD7vpZfd4H<|3KqN*nw%-`>BjY(r$yD4?nveZ{grlrpG z(tJ1n7rZXFhgV^sn*r zuWxT@SAh;3;tB4nZ8;uFJ8%ptts?q)bz>|eY@^EA6~U(&FKwVy04Aac%9zG zv-;8|J!jb{EyF7dmkNOyQHw*{Vl!_}OAL?Nmb${(TeZzmoH@P(zt;W}5@%*iq<-p{Iz^<)sdrzP}C#DT$yv4x4lL8GBS_Rvvfhqj#+ zb1L6Dcwc1W&~+7l^=1=LCr8VFnXH_Py|UA;iOB*DTXEXq#Kb#)elWMloIKwjd)i60 z^3@M^mZ?uxH3z&;o!*-J^u|>^fgJ7g>-==Nryg1TSb#(8WZ?1R0q&|BUsSX6&-iK+eeYz(uL;hY zPerpLn=@*oPd;5aIq>SErCj9-%BzkBiz+&}1$wt=T@(Ej^+itPYxJ+zM};k~UHE>b z|H>k!^wke~3YW^rY?!yADQk+D`!7$vbjin8=j_!94qSQWqSWm+nOvqU>GCZT1I`-U l-0b&Fs;qqawadng@tol^&YN34I{-|m44$rjF6*2UngA-!LI?l= literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6_f.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/6_f.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc6914bb41fd0b10af2569f7f29d5095550b4ac GIT binary patch literal 7842 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 AT>t<8 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9.png new file mode 100644 index 0000000000000000000000000000000000000000..c34f6a1d00f26c83952ccade48c54853c858af47 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^DImFdh=gh!5vSDs&Vraw?fvcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%`Pn>~) zsl?O8F{I+w+qnnxUK{YR=sNxXfBMzR#@RbORl1*?l8d{yv_qCR?Ru8t{!O{jx5Z{& zyA|eD`N#To`qX7w`um=zuXI{;O{@BIr}^gLNU@Hfz^ZR&gdD=QD_s^l z%%vO6qrD|(<4uEiW}6pE7;IU93*R`wDzV>mvz+ye&(STH9XeLscwxle5qQwPn%i4z0B>jNV+>bYz3`X`#b>y52oYFG?w|+mdv;LwoHFxQtiq&MT6F z3SZj&`X&A@ysGRXCVPk>MO8s$SJ=kzQ!%S=Xt!nXwgtT6abP&az@h-6THZU~km!1Q zV|#0yaJ9Dcjg8OGJ=Sk)5a?PRq)|F=lSG3KXUp;Xf1K(W7Tz%BntNiA^9((OFCKaI ze;A$mpL{=_n3Cu@PgdVygUWS2uiB~0b&|Bz*YPz9L{}DmHQTg7NpV~h6%LJU6Nvp6c$Kx~#i#yNc?vGm z^Fw$gnMC3x?m9F);!ft^2>6r0!_3&l-xKW6U?hJmQ^8>-cQV(6-Oe*>_ocn!TxC09 z_4{{w_pLrXaog(or#}6u%S-23pW%I^yvY7brD*h`eeNeT?@Z0@-1q%L@bP0l+XkKoF`Mc literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9_f.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/9_f.png new file mode 100644 index 0000000000000000000000000000000000000000..357a96be80441746fa1b5300226265cf0984d37f GIT binary patch literal 7835 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/e.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/e.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e45b80fcc8e883c86e2cb3673b8feded87684e GIT binary patch literal 11257 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/s.png b/monkestation/code/modules/cybernetics/icons/UI_Icons/tgui/lines/s.png new file mode 100644 index 0000000000000000000000000000000000000000..26af2f5195aa7925a38c169b77a58fa56ed43b11 GIT binary patch literal 5244 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%0DY5^9L`C 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/screen_cybernetics.dmi b/monkestation/code/modules/cybernetics/icons/screen_cybernetics.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c9da1c7740e1064442aed5fa34409ae19237fadd GIT binary patch literal 294 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%0DfvbQ;0zczQ$XbVaJR@wxt51o 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/swords_lefthand.dmi b/monkestation/code/modules/cybernetics/icons/swords_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..19a4dc93552c6994a9438e7507c073bfca3e805d GIT binary patch literal 24854 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[src] has already been used. The tools are dull and won't reactivate.") + return + + if(!stored_skillchip) + to_chat(user, "[src] currently has no skillchip stored.") + return + + if(!istype(user)) + to_chat(user, "[user]'s brain cannot accept skillchip implants.") + return + + // Try implanting. + var/implant_msg = user.implant_skillchip(stored_skillchip) + if(implant_msg) + user.visible_message("[user] presses a button on [src], but nothing happens.", "The [src] quietly beeps at you, indicating some sort of error.") + to_chat(user, "[stored_skillchip] cannot be implanted. [implant_msg]") + return + + // Clear the stored skillchip, it's technically not in this machine anymore. + var/obj/item/skillchip/implanted_chip = stored_skillchip + stored_skillchip = null + + user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your brain.") + playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, TRUE) + + to_chat(user,"Operation complete! [implanted_chip] successfully implanted. Attempting auto-activation...") + + // If implanting succeeded, try activating - Although activating isn't required, so don't early return if it fails. + // The user can always go activate it at a skill station. + var/activate_msg = implanted_chip.try_activate_skillchip(FALSE, FALSE) + if(activate_msg) + to_chat(user, "[implanted_chip] cannot be activated. [activate_msg]") + + name = initial(name) + + if(uses != INFINITE) + uses-- + + if(!uses) + desc = "[initial(desc)] The surgical tools look too blunt and worn to pierce a skull. Looks like it's all used up." + +/obj/item/autosurgeon/skillchip/attackby(obj/item/I, mob/user, params) + if(!istype(I, skillchip_type)) + return ..() + + if(stored_skillchip) + to_chat(user, "[src] already has a skillchip stored.") + return + + if(!uses) + to_chat(user, "[src] has already been used up.") + return + + if(!user.transferItemToLoc(I, src)) + to_chat(user, "You fail to insert the skillchip into [src]. It seems stuck to your hand.") + return + + stored_skillchip = I + to_chat(user, "You insert the [I] into [src].") + +/obj/item/autosurgeon/skillchip/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(.) + return + + if(!stored_skillchip) + to_chat(user, "There's no skillchip in [src] for you to remove!") + return TRUE + + var/atom/drop_loc = user.drop_location() + for(var/thing in contents) + var/atom/movable/movable_content = thing + movable_content.forceMove(drop_loc) + + to_chat(user, "You remove the [stored_skillchip] from [src].") + I.play_tool_sound(src) + stored_skillchip = null + + if(uses != INFINITE) + uses-- + + if(!uses) + desc = "[initial(desc)] Looks like it's been used up." + + return TRUE diff --git a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm new file mode 100644 index 000000000000..c04689f5df77 --- /dev/null +++ b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm @@ -0,0 +1,161 @@ +/obj/item/cyberlink_connector + name = "Wireless personal connector" + desc = "Allows you to connect to incompatible implants and hack them." + icon = 'monkestation/code/modules/cybernetics/icons/surgery.dmi' + icon_state = "connector" + var/obj/item/organ/internal/cyberimp/cyberlink/parent_cyberlink + var/list/datum/hacking_minigame/game_list = list() + var/current_timer_id = FALSE + var/obj/item/organ/internal/cyberimp/cybernetic + var/mob/living/current_user + +/obj/item/cyberlink_connector/Destroy() + . = ..() + parent_cyberlink = null + cleanup() + +///We dont open the tgui when we click on this. +/obj/item/cyberlink_connector/interact(mob/user) + add_fingerprint(user) + +/obj/item/cyberlink_connector/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!proximity_flag) + return + + if(!istype(target,/obj/item/organ/internal/cyberimp) || istype(target,/obj/item/organ/internal/cyberimp/cyberlink)) + return + + if(!parent_cyberlink) + var/obj/item/organ/internal/cyberimp/cyberlink/link = user.get_organ_slot(ORGAN_SLOT_LINK) + if(!link) + to_chat(user," NO CYBERLINK DETECTED ") + return + parent_cyberlink = link + + game_list = list() + + var/diffrences = 3 + current_user = user + cybernetic = target + + for(var/info in cybernetic.encode_info) + if(cybernetic.encode_info[info] == NO_PROTOCOL) + continue + var/list/encrypted_information = cybernetic.encode_info[info] + + for(var/protocol in encrypted_information) + if(protocol in parent_cyberlink.encode_info[info]) + diffrences-- + break + + if(diffrences == 0) + to_chat(current_user," Cyberlink beeps: [uppertext(cybernetic.name)] ALREADY COMPATIBLE.") + cleanup() + return + + if(!game_list.len) + for(var/i in 1 to diffrences) + var/datum/hacking_minigame/game = new/datum/hacking_minigame() + game.generate() + game_list += game + + ui_interact(user) + +/obj/item/cyberlink_connector/proc/cleanup() + current_user = null + cybernetic = null + QDEL_LIST(game_list) + deltimer(current_timer_id) + current_timer_id = FALSE + +/obj/item/cyberlink_connector/proc/hack_success(success as num) + for(var/info in cybernetic.encode_info) + if(cybernetic.encode_info[info] == NO_PROTOCOL) + continue + //Not a += because we want to avoid having duplicate entries in either encode_info + cybernetic.encode_info[info] |= parent_cyberlink.encode_info[info] + current_user.mind.adjust_experience(/datum/skill/implant_hacking,success * 25) + to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] SUCCESS. COMPATIBILITY ACHIEVED.") + cleanup() + + +/obj/item/cyberlink_connector/proc/hack_failure(failed as num) + var/chance = rand(0,40*failed) + switch(chance) + if(0 to 25) + to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MINOR FAILURE. COMPATIBILITY NOT ACHIEVED. NO DAMAGE DETECTED.") + if(26 to 40) + to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MEDIUM FAILURE. COMPATIBILITY NOT ACHIEVED. SMALL AMOUNT OF DAMAGE DETECTED.") + current_user.adjustFireLoss(10) + current_user.emote("scream") + if(41 to 50) + to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MEDIUM FAILURE. COMPATIBILITY NOT ACHIEVED. PROTOCOL SCRAMBILING DETECTED.") + cybernetic.random_encode() + if(51 to 75) + to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MAJOR FAILURE. COMPATIBILITY NOT ACHIEVED. MINOR ELECTROMAGNETIC PULSE DETECTED.") + empulse(current_user, 0, 1) + if(76 to 99) + to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MAJOR FAILURE. COMPATIBILITY NOT ACHIEVED. MAJOR ELECTROMAGNETIC PULSE DETECTED.") + empulse(current_user, 1, 2) + if(100 to INFINITY) + to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] CRITICAL FAILURE. COMPATIBILITY NOT ACHIEVED. IMPLANT OVERHEATING IN 5 SECONDS.") + cybernetic.visible_message("[cybernetic.name] begins to flare and twitch as the electronics fry and sizzle!") + addtimer(CALLBACK(src, PROC_REF(explode)), 5 SECONDS) + current_user.mind.adjust_experience(/datum/skill/implant_hacking,(4 - failed)*2) + cleanup() + +/obj/item/cyberlink_connector/proc/explode() + SIGNAL_HANDLER + + dyn_explosion(get_turf(cybernetic),2,1) + qdel(src) + +/obj/item/cyberlink_connector/proc/game_update(end_game = FALSE) + var/finished = TRUE + var/failed = 0 + + for(var/datum/hacking_minigame/game in game_list) + if(!game.finished) + finished = FALSE + failed++ + + if(finished) + hack_success(game_list.len) + + if(end_game) + hack_failure(failed) + +/obj/item/cyberlink_connector/ui_data(mob/user) + var/list/data = list() + data["timeleft"] = current_timer_id ? timeleft(current_timer_id) : 0 + + for(var/datum/hacking_minigame/game in game_list) + data["games"] += list(game.get_simplified_image()) + return data + +/obj/item/cyberlink_connector/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + if(!current_timer_id) + var/time_left = (game_list.len * 10 - 2 * (game_list.len-1) + user.mind.get_skill_modifier(/datum/skill/implant_hacking, SKILL_TIME_MODIFIER)) SECONDS + current_timer_id = addtimer(CALLBACK(src, PROC_REF(game_update), TRUE),time_left,TIMER_STOPPABLE) + START_PROCESSING(SSprocessing,src) + ui = new(user, src, "Hacking", name) + ui.open() + +/obj/item/cyberlink_connector/ui_assets(mob/user) + . = ..() || list() + . += get_asset_datum(/datum/asset/simple/hacking) + +/obj/item/cyberlink_connector/ui_act(action,list/params,datum/tgui/ui) + . = ..() + if(action == "click") + var/xcord = text2num(params["xcord"])+1 + var/ycord = text2num(params["ycord"])+1 //we need to slightly offset these so they work properly + var/minigame_id = text2num(params["id"])+1 + if(game_list[minigame_id] && !game_list[minigame_id].finished) + game_list[minigame_id].board[xcord][ycord].rotate() + game_list[minigame_id].game_check() + game_update() + return TRUE diff --git a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm new file mode 100644 index 000000000000..bc74fd285b38 --- /dev/null +++ b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm @@ -0,0 +1,56 @@ +/obj/item/mantis_blade + name = "C.H.R.O.M.A.T.A. mantis blade" + desc = "Powerful inbuilt blade, hidden just beneath the skin. Singular brain signals directly link to this bad boy, allowing it to spring into action in just seconds." + icon_state = "mantis" + inhand_icon_state = "mantis" + lefthand_file = 'monkestation/code/modules/cybernetics/icons/swords_lefthand.dmi' + righthand_file = 'monkestation/code/modules/cybernetics/icons/swords_righthand.dmi' + hitsound = 'sound/weapons/bladeslice.ogg' + flags_1 = CONDUCT_1 + force = 12 + wound_bonus = 20 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") + attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") + sharpness = SHARP_EDGED + max_integrity = 200 + +/obj/item/mantis_blade/equipped(mob/user, slot, initial) + . = ..() + if(slot != ITEM_SLOT_HANDS) + return + var/side = user.get_held_index_of_item(src) + + if(side == LEFT_HANDS) + transform = null + else + transform = matrix(-1, 0, 0, 0, 1, 0) + +/obj/item/mantis_blade/attack(mob/living/M, mob/living/user) + . = ..() + if(user.get_active_held_item() != src) + return + + var/obj/item/some_item = user.get_inactive_held_item() + + if(!istype(some_item,type)) + return + + user.do_attack_animation(M,null,some_item) + some_item.attack(M,user) + +/obj/item/mantis_blade/syndicate + name = "A.R.A.S.A.K.A. mantis blade" + icon_state = "syndie_mantis" + inhand_icon_state = "syndie_mantis" + force = 15 + block_chance = 20 + +/obj/item/mantis_blade/syndicate/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(proximity_flag || get_dist(user,target) > 3 || !isliving(target)) + return + + for(var/i in 1 to get_dist(user,target)) + step_towards(user,target) + attack(target,user) diff --git a/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm new file mode 100644 index 000000000000..35bd9e2654f8 --- /dev/null +++ b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm @@ -0,0 +1,276 @@ +/** + * + * Piping minigame, controls the board and procs surrounding it + * + * Holds all relevant information regarding the piping minigame + * Contains the procs needed to generate the game, check if the game is finisehd and rotate any pieces. + * + */ +/datum/hacking_minigame + + var/finished = FALSE + + var/board_size = 8 + + var/list/datum/hacking_minigame_piece/board + +/** + * checks if the game is finished + * + * Checks if the game was finished, and sets the finished to TRUE if it is + * returns finished. + */ +/datum/hacking_minigame/proc/game_check() + if(check_connections()) + finished = TRUE + return finished + +/** + * Simple algorithm for generating a labyrinth + * + * This algorithm 'carves out' a single path and the destination is placed when there aren't anymore possible moves. + * Rest of the board is filled randomly. This procedure makes sure that there is at least 1 possible path to take, and possibly more due to randomness. + */ +/datum/hacking_minigame/proc/generate() + board = list() + for(var/i in 1 to board_size) + board += list(list()) + for(var/k in 1 to board_size) + board[i] += 0 + + for(var/i in 1 to board_size) + for(var/k in 1 to board_size) + board[i][k] = new /datum/hacking_minigame_piece(src) + + var/list/possible_moves = consider_possible_moves(1,1) + var/current_x = 1 + var/current_y = 1 + board[current_x][current_y].start = TRUE + board[current_x][current_y].visited = TRUE + while(possible_moves.len) + board[current_x][current_y].visited = TRUE + + var/move = pick(possible_moves) + + board[current_x][current_y].pass_out = move + + + switch(move) + if(NORTH) + current_y-- + if(SOUTH) + current_y++ + if(EAST) + current_x++ + if(WEST) + current_x-- + + board[current_x][current_y].pass_in = REVERSE_DIR(move) + + possible_moves = consider_possible_moves(current_x,current_y) + if(!possible_moves.len) + board[current_x][current_y].finish = TRUE + + for(var/i in 1 to board_size) + for(var/k in 1 to board_size) + if(board[i][k].visited) + board[i][k].rotate(rand(-3,3)) + continue + var/list/dir_list = GLOB.cardinals.Copy() + var/pick = pick(dir_list) + board[i][k].pass_in = pick + dir_list -= pick + board[i][k].pass_out = pick(dir_list) + board[i][k].visited = TRUE + + if(check_connections()) + generate() + + +/** + * Simplification algorithm for the purpose of display + * + * Simplifies a 2d array of datums into a 2d array composed out of letters. + */ +/datum/hacking_minigame/proc/get_simplified_image() + var/list/secondary_board = list() + for(var/i in 1 to board_size) + secondary_board += list(list()) + for(var/k in 1 to board_size) + secondary_board[i] += 0 + + for(var/i in 1 to board_size) + for(var/k in 1 to board_size) + if(board[i][k].finish) + secondary_board[i][k] = "e" + else if(board[i][k].start) + secondary_board[i][k] = "s" + else + var/add = board[i][k].connected == TRUE ? "_f" : "" + secondary_board[i][k] = "[board[i][k].get_dir_val()][add]" + return secondary_board + +///Algorithm that returns possible directions from a given coordinate +/datum/hacking_minigame/proc/consider_possible_moves(xcord as num,ycord as num) + if(xcord < 1 || xcord > board_size) + return list() + if(ycord < 1 || ycord > board_size) + return list() + var/list/possible_dirs = list() + if(xcord > 1) + if(!board[xcord - 1][ycord].visited) + possible_dirs += WEST + + if(ycord > 1) + if(!board[xcord ][ycord - 1].visited) + possible_dirs += NORTH + + if(xcord < board_size) + if(!board[xcord + 1][ycord ].visited) + possible_dirs += EAST + + if(ycord != board_size) + if(!board[xcord ][ycord + 1].visited) + possible_dirs += SOUTH + + return possible_dirs + +///Checks connections coming from the source, returns TRUE if the source has a path to the destination +/datum/hacking_minigame/proc/check_connections() + + for(var/i in 1 to board_size) + for(var/k in 1 to board_size) + board[i][k].visited = FALSE + board[i][k].connected = FALSE + + var/xcord + var/ycord + + var/list/dirlist + + var/list/queued_coord_list = list(list(1,1)) + + var/counter = 0 + + var/list/possible_directions = list() + + while(queued_coord_list.len > counter) + + if(counter > board_size*board_size) + stack_trace("Counter runoff stopped occured!") + break + + possible_directions = list() + + counter++ + + xcord = queued_coord_list[counter][1] + ycord = queued_coord_list[counter][2] + + var/list/maybe_dir = board[xcord][ycord].get_dir_val_list() + + if(xcord > 1 && ((WEST in maybe_dir) || board[xcord][ycord].start || board[xcord][ycord].finish)) + possible_directions += WEST + + if(xcord < board_size && ((EAST in maybe_dir) || board[xcord][ycord].start || board[xcord][ycord].finish)) + possible_directions += EAST + + if(ycord > 1 && ((NORTH in maybe_dir) || board[xcord][ycord].start || board[xcord][ycord].finish)) + possible_directions += NORTH + + if(ycord < board_size && ((SOUTH in maybe_dir) || board[xcord][ycord].start || board[xcord][ycord].finish)) + possible_directions += SOUTH + + board[xcord][ycord].connected = FALSE + + if(NORTH in possible_directions) + + dirlist = board[xcord][ycord-1].get_dir_val_list() + + if(board[xcord][ycord-1].finish) + board[xcord][ycord].connected = TRUE + return TRUE + + if(SOUTH in dirlist) + if(!board[xcord][ycord-1].visited) + queued_coord_list += list(list(xcord,ycord-1)) + board[xcord][ycord].connected = TRUE + + if(SOUTH in possible_directions) + + dirlist = board[xcord][ycord+1].get_dir_val_list() + + if(board[xcord][ycord+1].finish) + board[xcord][ycord].connected = TRUE + return TRUE + + if(NORTH in dirlist) + if(!board[xcord][ycord+1].visited) + queued_coord_list += list(list(xcord,ycord+1)) + board[xcord][ycord].connected = TRUE + + if(WEST in possible_directions) + + dirlist = board[xcord-1][ycord].get_dir_val_list() + + if(board[xcord-1][ycord].finish) + board[xcord][ycord].connected = TRUE + return TRUE + + if(EAST in dirlist) + if(!board[xcord-1][ycord].visited) + queued_coord_list += list(list(xcord-1,ycord)) + board[xcord][ycord].connected = TRUE + + if(EAST in possible_directions) + + dirlist = board[xcord+1][ycord].get_dir_val_list() + + if(board[xcord+1][ycord].finish) + board[xcord][ycord].connected = TRUE + return TRUE + + if(WEST in dirlist) + if(!board[xcord+1][ycord].visited) + queued_coord_list += list(list(xcord+1,ycord)) + board[xcord][ycord].connected = TRUE + + board[xcord][ycord].visited = TRUE + + return FALSE +/** + * Simple holder of information and some procs relating to this information + * + * Holds relevant information about a single cell of the board. + */ +/datum/hacking_minigame_piece + var/pass_in = NONE + var/pass_out = NONE + var/visited = FALSE + var/start = FALSE + var/finish = FALSE + var/connected = FALSE + + var/datum/hacking_minigame/game + +/datum/hacking_minigame_piece/New(datum/hacking_minigame/_game) + . = ..() + game = _game + +///Returns value of pass_in + pass_out +/datum/hacking_minigame_piece/proc/get_dir_val() + if(pass_in != NONE && pass_out != NONE) + return pass_in + pass_out + return 0 + +///Returns a list of possible directions this cell can connect to +/datum/hacking_minigame_piece/proc/get_dir_val_list() + //If this is a finish or start node than it is available from all directions, otherwise return the list containing both directions. + return finish == TRUE || start == TRUE ? GLOB.cardinals.Copy() : list(pass_in , pass_out) + +///Rotates the cell num amount of times +/datum/hacking_minigame_piece/proc/rotate(num = 1) + //if you want to do this bitshifting way, then be my guest. BYOND direction system makes my head ache and is illogical even by lowest of standards. + num = clamp(num,-3,3) + pass_in = turn(pass_in,90*num) + pass_out = turn(pass_out,90*num) diff --git a/monkestation/code/modules/cybernetics/premade_storages/antags.dm b/monkestation/code/modules/cybernetics/premade_storages/antags.dm new file mode 100644 index 000000000000..d8ee0cacd2cd --- /dev/null +++ b/monkestation/code/modules/cybernetics/premade_storages/antags.dm @@ -0,0 +1,8 @@ +/obj/item/storage/briefcase/syndie_mantis + desc = "Fully metallic briefcase. Has A.R.A.S.A.K.A. engraved on the side in Futura font." + +/obj/item/storage/briefcase/syndie_mantis/PopulateContents() + ..() + new /obj/item/autosurgeon/organ/syndicate/syndie_mantis(src) + new /obj/item/autosurgeon/organ/syndicate/syndie_mantis/l(src) + new /obj/item/autosurgeon/organ/cyberlink_syndicate(src) diff --git a/monkestation/code/modules/cybernetics/readme.md b/monkestation/code/modules/cybernetics/readme.md new file mode 100644 index 000000000000..f0c3d333a18e --- /dev/null +++ b/monkestation/code/modules/cybernetics/readme.md @@ -0,0 +1,35 @@ +## Title: + + +MODULE ID: CYBERNETICS + +### Description: + + + +### TG Proc/File Changes: + - + + +### Defines: + - code\__DEFINES\DNA.dm + + + +### Master file additions + +- N/A + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + + + +Code by Dwasint + + diff --git a/monkestation/code/modules/cybernetics/skills/implant_hacking.dm b/monkestation/code/modules/cybernetics/skills/implant_hacking.dm new file mode 100644 index 000000000000..94b2a8d74595 --- /dev/null +++ b/monkestation/code/modules/cybernetics/skills/implant_hacking.dm @@ -0,0 +1,19 @@ +/datum/skill/implant_hacking + name = "Protocol Hijacking" + title = "Hacker" + desc = "My knowledge of cybernetic protocols, and how to make them compatible with eachother" + modifiers = list(SKILL_TIME_MODIFIER = list(-2, -1, 0, 1, 2, 4, 8)) + skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/hacker + +/datum/skill/implant_hacking/New() + . = ..() + levelUpMessages[1] = span_nicegreen("The circuitry is complex, but I'm starting to make sense of it.") + levelUpMessages[4] = span_nicegreen("I understand how these machines work on a fundamental level.") + levelUpMessages[6] = span_nicegreen("I know all of the protocols, all of encoding, security and operating software! No digital barrier can now stop me.") + + +/obj/item/clothing/neck/cloak/skill_reward/hacker + name = "legendary hacker's cloak" + desc = "Worn by the most skilled of cybernetic hackers, wearing this proves you were able to conquer protocol, and hack any cybernetic. You are not sure if openly wearing an item of clothing that says 'I'm a master in breaking security protocols' is a good idea." + icon_state = "hackercloak" + associated_skill_path = /datum/skill/implant_hacking diff --git a/monkestation/code/modules/cybernetics/tech_nodes.dm b/monkestation/code/modules/cybernetics/tech_nodes.dm new file mode 100644 index 000000000000..3744a4a81632 --- /dev/null +++ b/monkestation/code/modules/cybernetics/tech_nodes.dm @@ -0,0 +1,17 @@ + +/datum/techweb_node/ntlink_low + id = "ntlink_low" + display_name = "Cybernetic Application" + description = "Creation of NT-secure basic cyberlinks for low-grade cybernetic augmentation" + prereq_ids = list("adv_biotech","adv_biotech", "datatheory") + design_ids = list("ci-nt_low") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + +/datum/techweb_node/ntlink_high + id = "ntlink_high" + display_name = "Advanced Cybernetic Application" + description = "Creation of NT-secure advanced cyberlinks for high-grade cybernetic augmentation" + prereq_ids = list("ntlink_low", "adv_cyber_implants","high_efficiency") + design_ids = list("ci-nt_high") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + diff --git a/monkestation/code/modules/surgery/organs/internal/butts.dm b/monkestation/code/modules/surgery/organs/internal/butts.dm index 70c6c5e292f7..b3d4b4932616 100644 --- a/monkestation/code/modules/surgery/organs/internal/butts.dm +++ b/monkestation/code/modules/surgery/organs/internal/butts.dm @@ -198,7 +198,7 @@ hit_target = TRUE break if(!hit_target) - user.audible_message("[pick(world.file2list("strings/farts.txt"))]", audible_message_flags = list(CHATMESSAGE_EMOTE = TRUE)) + user.audible_message("[pick(world.file2list("strings/farts.txt"))]", audible_message_flags = list(CHATMESSAGE_EMOTE = TRUE), ignored_mobs = ignored_mobs) //SOUND HANDLING diff --git a/tgstation.dme b/tgstation.dme index f249049ca123..93885e66ee6d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -391,6 +391,7 @@ #include "code\__DEFINES\~monkestation\combat.dm" #include "code\__DEFINES\~monkestation\construction.dm" #include "code\__DEFINES\~monkestation\cooldowns.dm" +#include "code\__DEFINES\~monkestation\cybernetics.dm" #include "code\__DEFINES\~monkestation\DNA.dm" #include "code\__DEFINES\~monkestation\factions.dm" #include "code\__DEFINES\~monkestation\guns.dm" @@ -408,6 +409,7 @@ #include "code\__DEFINES\~monkestation\physics.dm" #include "code\__DEFINES\~monkestation\projectiles.dm" #include "code\__DEFINES\~monkestation\robots.dm" +#include "code\__DEFINES\~monkestation\skills.dm" #include "code\__DEFINES\~monkestation\smoothing.dm" #include "code\__DEFINES\~monkestation\span.dm" #include "code\__DEFINES\~monkestation\status_effects.dm" @@ -6131,6 +6133,19 @@ #include "monkestation\code\modules\cryopods\cyro_mood.dm" #include "monkestation\code\modules\cryopods\persistance\base_persistance.dm" #include "monkestation\code\modules\cryopods\trackers\cryo_chaplain.dm" +#include "monkestation\code\modules\cybernetics\assets.dm" +#include "monkestation\code\modules\cybernetics\actions\base_action.dm" +#include "monkestation\code\modules\cybernetics\augments\_base_changes.dm" +#include "monkestation\code\modules\cybernetics\augments\arm_augments.dm" +#include "monkestation\code\modules\cybernetics\augments\leg_augments.dm" +#include "monkestation\code\modules\cybernetics\designs\medical.dm" +#include "monkestation\code\modules\cybernetics\hud\cybernetics.dm" +#include "monkestation\code\modules\cybernetics\implant_items\autosurgeons.dm" +#include "monkestation\code\modules\cybernetics\implant_items\cyberlink_connector.dm" +#include "monkestation\code\modules\cybernetics\implant_items\weapons\mantis_blade.dm" +#include "monkestation\code\modules\cybernetics\minigame\hacking_minigame.dm" +#include "monkestation\code\modules\cybernetics\premade_storages\antags.dm" +#include "monkestation\code\modules\cybernetics\skills\implant_hacking.dm" #include "monkestation\code\modules\datums\brain_damage\mild.dm" #include "monkestation\code\modules\datums\components\nanites.dm" #include "monkestation\code\modules\datums\diseases\advanced\symptoms\nanites.dm" diff --git a/tgui/packages/tgui/interfaces/Hacking.js b/tgui/packages/tgui/interfaces/Hacking.js new file mode 100644 index 000000000000..1e49ced1ad4e --- /dev/null +++ b/tgui/packages/tgui/interfaces/Hacking.js @@ -0,0 +1,54 @@ +import { useBackend } from '../backend'; +import { Section, Box, TimeDisplay } from '../components'; +import { Window } from '../layouts'; +import { resolveAsset } from '../assets'; + +export const Hacking = (props, context) => { + const { act, data } = useBackend(context); + const { timeleft, games = [[[]]] } = data; + return ( + + +

+ {games.map((game, i) => ( +
+ {'[TIME LEFT: '} + + {']'} + +
+ ))} +
+ + + ); +}; + +const Minigame = (props, context) => { + const { act, data } = useBackend(context); + const { array = [[]], minigame_id = 0 } = props; + return array.map((arr, i) => ( + + {arr.map((element, j) => ( + + act('click', { + xcord: i, + ycord: j, + id: minigame_id, + }) + } + /> + ))} + + )); +}; From 4d2fbb62399ae0a3c5da25f12746dd6f65a4809d Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:13:50 -0500 Subject: [PATCH 02/81] more cyber stuff --- .../structures/icemoon/cave_entrance.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mining/lavaland/tendril_loot.dm | 9 ++++--- code/modules/surgery/organs/augments_arms.dm | 24 ------------------ .../code/game/objects/items/storage/crate.dm | 2 +- .../cybernetics/augments/arm_augments.dm | 4 +-- .../cybernetics/augments/leg_augments.dm | 4 +-- .../cybernetics/icons/items_and_weapons.dmi | Bin 0 -> 607 bytes .../implant_items/weapons/mantis_blade.dm | 1 + .../cybernetics/minigame/hacking_minigame.dm | 2 +- 10 files changed, 14 insertions(+), 36 deletions(-) create mode 100644 monkestation/code/modules/cybernetics/icons/items_and_weapons.dmi diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 40c5256915bd..8ae8fc30ba4a 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -190,4 +190,4 @@ GLOBAL_LIST_INIT(ore_probability, list( if(26) new /obj/item/book/granter/action/spell/sacredflame(loc) if(27) - new /obj/item/organ/internal/cyberimp/arm/katana(loc) + new /obj/item/organ/internal/cyberimp/arm/item_set/katana(loc) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 4bedc5946e4a..0ad24d44ca66 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -24,7 +24,7 @@ if(2) new /obj/item/soulstone/anybody/mining(src) if(3) - new /obj/item/organ/internal/cyberimp/arm/katana(src) + new /obj/item/organ/internal/cyberimp/arm/item_set/katana(src) if(4) new /obj/item/clothing/glasses/godeye(src) if(5) diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 585fe6f38eb0..bc5d0058c0e9 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -892,18 +892,19 @@ name = "Scan Target" desc = "Contact may or may not be close." -/obj/item/organ/internal/cyberimp/arm/katana +/obj/item/organ/internal/cyberimp/arm/item_set/katana name = "dark shard" desc = "An eerie metal shard surrounded by dark energies." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "cursed_katana_organ" status = ORGAN_ORGANIC + encode_info = AUGMENT_TG_LEVEL organ_flags = ORGAN_FROZEN|ORGAN_UNREMOVABLE items_to_create = list(/obj/item/cursed_katana) extend_sound = 'sound/items/unsheath.ogg' retract_sound = 'sound/items/sheath.ogg' -/obj/item/organ/internal/cyberimp/arm/katana/attack_self(mob/user, modifiers) +/obj/item/organ/internal/cyberimp/arm/item_set/katana/attack_self(mob/user, modifiers) . = ..() to_chat(user, span_userdanger("The mass goes up your arm and goes inside it!")) playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) @@ -913,10 +914,10 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/internal/cyberimp/arm/katana/screwdriver_act(mob/living/user, obj/item/screwtool) +/obj/item/organ/internal/cyberimp/arm/item_set/katana/screwdriver_act(mob/living/user, obj/item/screwtool) return -/obj/item/organ/internal/cyberimp/arm/katana/Retract() +/obj/item/organ/internal/cyberimp/arm/item_set/katana/Retract() var/obj/item/cursed_katana/katana = active_item if(!katana || katana.shattered) return FALSE diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index d797bc0e4e2d..5de4b121c09a 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -184,30 +184,6 @@ Retract(active_item) INVOKE_ASYNC(src, PROC_REF(ui_action_click)) -/obj/item/organ/internal/cyberimp/arm/ui_action_click() - if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) - to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) - return - - if(!active_item || (active_item in src)) - active_item = null - if(contents.len == 1) - Extend(contents[1]) - else - var/list/choice_list = list() - for(var/datum/weakref/augment_ref in items_list) - var/obj/item/augment_item = augment_ref.resolve() - if(!augment_item) - items_list -= augment_ref - continue - choice_list[augment_item] = image(augment_item) - var/obj/item/choice = show_radial_menu(owner, owner, choice_list) - if(owner && owner == usr && owner.stat != DEAD && (src in owner.organs) && !active_item && (choice in contents)) - // This monster sanity check is a nice example of how bad input is. - Extend(choice) - else - Retract() - /obj/item/organ/internal/cyberimp/arm/item_set/gun/laser name = "arm-mounted laser implant" diff --git a/monkestation/code/game/objects/items/storage/crate.dm b/monkestation/code/game/objects/items/storage/crate.dm index f3415ce707f3..4583932223b1 100644 --- a/monkestation/code/game/objects/items/storage/crate.dm +++ b/monkestation/code/game/objects/items/storage/crate.dm @@ -13,7 +13,7 @@ if(3,4) new /obj/item/soulstone/anybody/mining(src) if(5,6) - new /obj/item/organ/internal/cyberimp/arm/katana(src) + new /obj/item/organ/internal/cyberimp/arm/item_set/katana(src) if(7,8) new /obj/item/clothing/glasses/godeye(src) if(9,10) diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments.dm b/monkestation/code/modules/cybernetics/augments/arm_augments.dm index 33e49d98af19..f1387811ebe2 100644 --- a/monkestation/code/modules/cybernetics/augments/arm_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/arm_augments.dm @@ -226,7 +226,7 @@ /obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/update_hud_elements() SIGNAL_HANDLER - if(!owner || !owner?.stat || !owner?.hud_used) + if(!owner || !owner?.hud_used) return if(!check_compatibility()) @@ -256,7 +256,7 @@ var/display if(istype(our_gun,/obj/item/gun/ballistic)) var/obj/item/gun/ballistic/balgun = our_gun - display = balgun.magazine.ammo_count() + display = balgun.magazine.ammo_count(FALSE) else var/obj/item/gun/energy/egun = our_gun var/obj/item/ammo_casing/energy/shot = egun.ammo_type[egun.select] diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments.dm b/monkestation/code/modules/cybernetics/augments/leg_augments.dm index 39d287548906..2046db33539f 100644 --- a/monkestation/code/modules/cybernetics/augments/leg_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/leg_augments.dm @@ -167,9 +167,9 @@ overlay = mutable_appearance('icons/effects/effects.dmi', "biogas",ABOVE_MOB_LAYER) overlay.color = implant_color - RegisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/update_owner_overlay) + RegisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) - addtimer(CALLBACK(src,.proc/remove_overlay),max_ticks_cooldown/2) + addtimer(CALLBACK(src, PROC_REF(remove_overlay)),max_ticks_cooldown/2) to_chat(owner," You feel a sharp pain as the cocktail of chemicals is injected into your bloodstream!") return diff --git a/monkestation/code/modules/cybernetics/icons/items_and_weapons.dmi b/monkestation/code/modules/cybernetics/icons/items_and_weapons.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c85db4df0e96ddbf73c2b3d6d17ea2318ffdf5c9 GIT binary patch literal 607 zcmV-l0-*hgP)fO~ov92piB6$uClrk*xRf|05zI7Zny+S63)p z#2ODC%f`VC3=AhGCLSFgTndf900001bW%=J06^y0W&i*Hb$V1-bVOxyV{&P5bZKvH z004NLQ&wgNJ>1pu}U zD6Fd#nOOh;0YpheK~zYI<&@!)gCGoq5fMR9Q;O~Tzv(5YR|kULjQ@I>p?12-=36?g z5dX9qtXuQ4ZF2*q&S#E#BRiQJDBbTJ#&Gj?*mdWc79DbfUT+OXdoxaj!C*Jt*_j-Q z2+(UyPpyr4glWtjV6c{+)((Tyt$Y?4K!L^*@SyoAXCU2T32;v16%+=kBdt;)j?-AA z_~=O5aRw+sz=i-3$BPh2$63(mBg+U>3oIc71uVg;V@Lw&S_T0d)RIn&48cJs0^R_Y zbjYAWkPZ>B89oHl1p#}D>x#6YLh!4f+@kliA>uqkfciY|1U!N_#*0M20SGa_Ub9#U zc!TJD6e|I1;NEX1&Is`S((A|tNDgj$Q@O>>r3P>)%1}4Bo=+KW8OW|~5c%&gcaUcW t*YlX6KL3aPNN{gI{xw%VXMaUsUOyWe5t|i=X&3+i002ovPDHLkV1ne=_%{Fm literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm index bc74fd285b38..7dc93242b647 100644 --- a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm +++ b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm @@ -3,6 +3,7 @@ desc = "Powerful inbuilt blade, hidden just beneath the skin. Singular brain signals directly link to this bad boy, allowing it to spring into action in just seconds." icon_state = "mantis" inhand_icon_state = "mantis" + icon = 'monkestation/code/modules/cybernetics/icons/items_and_weapons.dmi' lefthand_file = 'monkestation/code/modules/cybernetics/icons/swords_lefthand.dmi' righthand_file = 'monkestation/code/modules/cybernetics/icons/swords_righthand.dmi' hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm index 35bd9e2654f8..f741d0ea6d7e 100644 --- a/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm +++ b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm @@ -10,7 +10,7 @@ var/finished = FALSE - var/board_size = 8 + var/board_size = 16 var/list/datum/hacking_minigame_piece/board From a77fe750d30857f60c9f61417f0eb126fe997ddf Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Thu, 22 Feb 2024 13:14:01 -0500 Subject: [PATCH 03/81] start of sandy --- code/__DEFINES/DNA.dm | 2 + .../cybernetics/augments/chest_augments.dm | 93 ++++++++++++++++++ .../cybernetics/components/slowing_field.dm | 57 +++++++++++ .../modules/cybernetics/icons/implants.dmi | Bin 0 -> 1078 bytes .../cybernetics/icons/implants_onmob.dmi | Bin 0 -> 495 bytes .../cybernetics/implant_items/autosurgeons.dm | 2 + .../modules/surgery/organs/internal/butts.dm | 2 +- tgstation.dme | 2 + 8 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 monkestation/code/modules/cybernetics/augments/chest_augments.dm create mode 100644 monkestation/code/modules/cybernetics/components/slowing_field.dm create mode 100644 monkestation/code/modules/cybernetics/icons/implants.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/implants_onmob.dmi diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index a593396cf802..d3c3247beaf9 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -129,6 +129,7 @@ #define ORGAN_SLOT_LINK "cyber_link" #define ORGAN_SLOT_RIGHT_LEG_AUG "r_leg_device" #define ORGAN_SLOT_LEFT_LEG_AUG "l_leg_device" +#define ORGAN_SLOT_SPINAL "spinal_implant" /// Organ slot external #define ORGAN_SLOT_EXTERNAL_TAIL "tail" @@ -174,6 +175,7 @@ GLOBAL_LIST_INIT(organ_process_order, list( ORGAN_SLOT_BRAIN, ORGAN_SLOT_LINK, + ORGAN_SLOT_SPINAL, ORGAN_SLOT_APPENDIX, ORGAN_SLOT_RIGHT_ARM_AUG, ORGAN_SLOT_LEFT_ARM_AUG, diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm new file mode 100644 index 000000000000..38f0b34a8c3f --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -0,0 +1,93 @@ +/obj/item/organ/internal/cyberimp/chest + name = "chest-mounted implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + zone = BODY_ZONE_CHEST + icon_state = "implant-toolkit" + w_class = WEIGHT_CLASS_SMALL + encode_info = AUGMENT_NT_LOWLEVEL + + var/double_legged = FALSE + slot = ORGAN_SLOT_SPINAL + +/obj/item/organ/internal/cyberimp/chest/Initialize() + . = ..() + update_icon() + + + +/datum/action/item_action/organ_action/sandy + name = "Sandevistan Activation" + +/obj/item/organ/internal/cyberimp/chest/sandevistan + name = "Militech Apogee Sandevistan" + desc = "This model of Sandevistan doesn't exist, at least officially. Off the record, there's gossip of secret Militech Lunar labs producing covert cyberware. It was never meant to be mass produced, but an army would only really need a few pieces like this one to dominate their enemy." + encode_info = AUGMENT_NT_HIGHLEVEL + icon_state = "sandy" + actions_types = list(/datum/action/item_action/organ_action/sandy) + icon = 'monkestation/code/modules/cybernetics/icons/implants.dmi' + + COOLDOWN_DECLARE(in_the_zone) + /// The bodypart overlay datum we should apply to whatever mob we are put into + var/datum/bodypart_overlay/simple/sandy/bodypart_overlay + /// What limb we are inside of, used for tracking when and how to remove our overlays and all that + var/obj/item/bodypart/ownerlimb + +/obj/item/organ/internal/cyberimp/chest/sandevistan/Insert(mob/living/carbon/receiver, special, drop_if_replaced) + var/obj/item/bodypart/limb = receiver.get_bodypart(deprecise_zone(zone)) + + . = ..() + + if(!.) + return + if(!limb) + return FALSE + + ownerlimb = limb + add_to_limb(ownerlimb) + + +/obj/item/organ/internal/cyberimp/chest/sandevistan/add_to_limb(obj/item/bodypart/bodypart) + bodypart_overlay = new() + ownerlimb = bodypart + ownerlimb.add_bodypart_overlay(bodypart_overlay) + owner.update_body_parts() + return ..() + +/obj/item/organ/internal/cyberimp/chest/sandevistan/remove_from_limb() + ownerlimb.remove_bodypart_overlay(bodypart_overlay) + QDEL_NULL(bodypart_overlay) + ownerlimb = null + owner.update_body_parts() + return ..() + +/obj/item/organ/internal/cyberimp/chest/sandevistan/Destroy() + if(ownerlimb) + remove_from_limb() + return ..() + +/obj/item/organ/internal/cyberimp/chest/sandevistan/ui_action_click() + if((organ_flags & ORGAN_FAILING)) + to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) + return + + if(!COOLDOWN_FINISHED(src, in_the_zone)) + to_chat(owner, span_warning("The implant doesn't respond. It seems to be recharging...")) + return + COOLDOWN_START(src, in_the_zone, 45 SECONDS) + + owner.AddComponent(/datum/component/after_image, 8, 0.5) + owner.AddComponent(/datum/component/slowing_field, 0.1, 5, 2) + addtimer(CALLBACK(src, PROC_REF(exit_the_zone), owner), 15 SECONDS) + + +/obj/item/organ/internal/cyberimp/chest/proc/exit_the_zone(mob/living/exiter) + var/datum/component/after_image = exiter.GetComponent(/datum/component/after_image) + qdel(after_image) + var/datum/component/slowing_field = exiter.GetComponent(/datum/component/slowing_field) + qdel(slowing_field) + + +/datum/bodypart_overlay/simple/sandy + icon = 'monkestation/code/modules/cybernetics/icons/implants.dmi' + icon_state = "sandy_overlay" + layers = EXTERNAL_ADJACENT diff --git a/monkestation/code/modules/cybernetics/components/slowing_field.dm b/monkestation/code/modules/cybernetics/components/slowing_field.dm new file mode 100644 index 000000000000..4a3847af9e4d --- /dev/null +++ b/monkestation/code/modules/cybernetics/components/slowing_field.dm @@ -0,0 +1,57 @@ +/datum/component/slowing_field + ///how slow bullets move as a multiplier (rounded to the nearest 1) + var/bullet_speed_multiplier = 1 + ///our movespeed_multipliers + var/atom_speed_multiplier = 1 + ///list of slowed things + var/list/affected = list() + +/datum/component/slowing_field/Initialize(bullet_speed_multiplier = 1, atom_speed_multiplier = 1, area_range = 1) + . = ..() + src.bullet_speed_multiplier = bullet_speed_multiplier + src.atom_speed_multiplier = atom_speed_multiplier + + var/static/list/connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered_turf), + COMSIG_ATOM_EXITED = PROC_REF(on_exited_turf), + COMSIG_ATOM_INITIALIZED_ON = PROC_REF(on_entered_turf), + ) + + AddComponent(/datum/component/connect_range, parent, connections, area_range, TRUE) + +/datum/component/slowing_field/Destroy(force, silent) + . = ..() + for(var/atom/a as anything in affected) + on_exited_turf(src, a) + +/datum/component/slowing_field/proc/on_entered_turf(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + arrived.add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY) + affected |= arrived + if(arrived == parent) + return + + if(isprojectile(arrived)) + var/obj/projectile/arrived_proj = arrived + arrived_proj.pixel_speed_multiplier = bullet_speed_multiplier + else if(isliving(arrived)) + var/mob/living/arrived_movable = arrived + arrived_movable.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/slowing_field, TRUE, atom_speed_multiplier) + +/datum/component/slowing_field/proc/on_exited_turf(datum/source, atom/movable/gone, direction) + SIGNAL_HANDLER + gone.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + affected -= gone + if(gone == parent) + return + + if(isprojectile(gone)) + var/obj/projectile/arrived_proj = gone + arrived_proj.pixel_speed_multiplier = 1 + else if(isliving(gone)) + var/mob/living/arrived_movable = gone + arrived_movable.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/slowing_field) + + +/datum/movespeed_modifier/status_effect/slowing_field + multiplicative_slowdown = 1 diff --git a/monkestation/code/modules/cybernetics/icons/implants.dmi b/monkestation/code/modules/cybernetics/icons/implants.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a889a6e286441f6aa4256d250cc750bde5b1e9b2 GIT binary patch literal 1078 zcmV-61j+k}P)h9CGTfjW_}E}s8Y+k+EhmXxD_31KG(!6F)}=2gcfDOyRAEU+T#AaG!okVw>+3%g zDc#hAtN;K20d!JMQvg8b*k%9#0Hk_USad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1 z~_DE?L$Z@Vt-ev zZCkGSz3U2h|9Hd*R1Z=BaLR#A4hlpF`&TVkpp8E2z#azyVNIa=7C&eQ80Re6|1Jkb zXaPKb?pus&og&!lpnSycKz(Bv2k0LNpb!PfIw;>CI(!F6Kv+DCcJu&Hh!JER{0#mG zK+{qdk9GmDW28aOLFiGw5rjdIu{aCR;0TzDOX$pw$NvuE*gtw83I}F(S2!N-4u>&~efhpHMh4M3u4l3_v(F zCJ4&(UsY9ARrSB&yirlU?z4D6L zf#U$VWjzaU)`2kL2BrHw7Jl7^8PgbP&2BBIV(27xdn$mI#9Z8z^iN z-&Hf9I|X30>XlBuh0z+`_I=-S6HhES9zOs8U>pL_cz?KiD#q-Dggr9GQ!B`N5P%co zBtzg|L8=;3J7~~j6FbEkxB!vz#3-PH5R&Ra1EL=Xbw6Jk>9=7Cgp>yIDk^(rIMf!7&JGQIW_HR><`>A+y^;2sYP@oyWiqoV-tK~;|a zpbzu=X#J~ylUY$t=ynGOl4sR;i0iK+M*ygM=dMI8yLIzbECq*$>xk3(nJ-EBB?Pk4 zUj+fGs;a80s{Xh(?zD<+$mkv8?q>V7`N;}dkp2IMLrr%`6=}LdmpgDdz>eT9GY)pd wcA;T#^)PJA*BkEC*(#>D*ylh07*qoM6N<$f|`BNp#T5? literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/implants_onmob.dmi b/monkestation/code/modules/cybernetics/icons/implants_onmob.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7f5459a303debbab5e67aeafd797ed9cb91c8750 GIT binary patch literal 495 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sW>q&rBaEDGbOXA7^I1dGp#5wHxYCm3jjIA8ZBM3 zu|@y@0YFJaK~#90?b8s68h{oFHsy30001Ek|Zs%Y*}b~%l{0T3KZI8GM4%LrEGgi z&-`k&?dJ*@Jx Date: Thu, 22 Feb 2024 18:24:13 -0500 Subject: [PATCH 04/81] sandy --- .../cybernetics/augments/chest_augments.dm | 5 ++--- .../code/modules/cybernetics/clothing/suits.dm | 7 +++++++ .../cybernetics/components/slowing_field.dm | 13 +++++++++---- .../code/modules/cybernetics/icons/suit.dmi | Bin 0 -> 845 bytes .../code/modules/cybernetics/icons/suits.dmi | Bin 0 -> 418 bytes .../modules/ranching/components/afterimage.dm | 15 ++++++++++++++- tgstation.dme | 1 + 7 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 monkestation/code/modules/cybernetics/clothing/suits.dm create mode 100644 monkestation/code/modules/cybernetics/icons/suit.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/suits.dmi diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm index 38f0b34a8c3f..45fc9555f80d 100644 --- a/monkestation/code/modules/cybernetics/augments/chest_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -75,18 +75,17 @@ return COOLDOWN_START(src, in_the_zone, 45 SECONDS) - owner.AddComponent(/datum/component/after_image, 8, 0.5) + owner.AddComponent(/datum/component/after_image, 16, 0.5, TRUE) owner.AddComponent(/datum/component/slowing_field, 0.1, 5, 2) addtimer(CALLBACK(src, PROC_REF(exit_the_zone), owner), 15 SECONDS) -/obj/item/organ/internal/cyberimp/chest/proc/exit_the_zone(mob/living/exiter) +/obj/item/organ/internal/cyberimp/chest/sandevistan/proc/exit_the_zone(mob/living/exiter) var/datum/component/after_image = exiter.GetComponent(/datum/component/after_image) qdel(after_image) var/datum/component/slowing_field = exiter.GetComponent(/datum/component/slowing_field) qdel(slowing_field) - /datum/bodypart_overlay/simple/sandy icon = 'monkestation/code/modules/cybernetics/icons/implants.dmi' icon_state = "sandy_overlay" diff --git a/monkestation/code/modules/cybernetics/clothing/suits.dm b/monkestation/code/modules/cybernetics/clothing/suits.dm new file mode 100644 index 000000000000..8edf8aeb63dd --- /dev/null +++ b/monkestation/code/modules/cybernetics/clothing/suits.dm @@ -0,0 +1,7 @@ +/obj/item/clothing/suit/toggle/david + name = "david's jacket" + desc = "My Moon My Man." + toggle_noun = "symbol" + worn_icon = 'monkestation/code/modules/cybernetics/icons/suit.dmi' + icon = 'monkestation/code/modules/cybernetics/icons/suits.dmi' + icon_state = "punk" diff --git a/monkestation/code/modules/cybernetics/components/slowing_field.dm b/monkestation/code/modules/cybernetics/components/slowing_field.dm index 4a3847af9e4d..0df9ec4c5bd0 100644 --- a/monkestation/code/modules/cybernetics/components/slowing_field.dm +++ b/monkestation/code/modules/cybernetics/components/slowing_field.dm @@ -26,11 +26,14 @@ /datum/component/slowing_field/proc/on_entered_turf(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER - arrived.add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY) - affected |= arrived + if(istype(arrived, /obj/effect/temp_visual/decoy/fading)) + return if(arrived == parent) return + arrived.add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY) + affected |= arrived + if(isprojectile(arrived)) var/obj/projectile/arrived_proj = arrived arrived_proj.pixel_speed_multiplier = bullet_speed_multiplier @@ -40,10 +43,12 @@ /datum/component/slowing_field/proc/on_exited_turf(datum/source, atom/movable/gone, direction) SIGNAL_HANDLER - gone.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) - affected -= gone + if(istype(gone, /obj/effect/temp_visual/decoy/fading)) + return if(gone == parent) return + gone.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + affected -= gone if(isprojectile(gone)) var/obj/projectile/arrived_proj = gone diff --git a/monkestation/code/modules/cybernetics/icons/suit.dmi b/monkestation/code/modules/cybernetics/icons/suit.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b0b1f8a8b21770e728ba9a39721a4ca0c47d33f7 GIT binary patch literal 845 zcmV-T1G4;yP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sh~73JHAATi!&v&s2HS+i!-e#F*g;&Hbhm1 zOOdjItDg(lasVS3B>tqAvl9RS0$NE#K~z|U?UylY+fWpRuiWAg$dIR+q}}XSQC#vT zDsu;8FNOSpcyqVVp?iW!A8iIXn9v{4$zy+EpAwMHy;t}xEm?FR!%=knuKXl_Iz+wx zl`?(cef)bhZoQv4=fUUhR0iJE0XR0|DDXL#D)5=;5>F_Yz3?h9ye9gFGkcy*(Ca|) zosKpz^V)kqy@C^*JFCDBcvI~*Gw{K^1s_+K@D~WI=UnaP^X4PhMX}%lmKcUR5t!b@ zKpC2urYqiaxo)pI<1&1N1v!s_*{E#&a>1>C9ti_(7^+`)nQQz>*oXVZ$C2{0fFsdU z0Q||%AK@PVAI}hhtiA@}_rK8(=rxX1&sgo`MlF`Y6Y;x)0l)mC0y7!#)q@ONTnIlN zco~QneItAb=!dsneM|oO>j(7lc|e~{!vyao%FgM?p^uv^ymMlrUcFver|DBrnS)0x z#fw@ahCqrJPsi~0J;jUX031m1g6MeV@R3aNf*v`C6_UKD1MAR!LI*Ec@Pgp!)cY!U7o6qus zS#I36I2 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/suits.dmi b/monkestation/code/modules/cybernetics/icons/suits.dmi new file mode 100644 index 0000000000000000000000000000000000000000..da410f9d3acea20ec357c162f4fb83ecb71d650f GIT binary patch literal 418 zcmV;T0bTxyP)bYaQI~?yRh=BqJk0Jw5rtE7Je&xVX6B>Y)1o0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sh~73TZxM^C9|j)$Tj5ROe;#vO@**g6vda| zQl_ln>gNKs8~_+nB>3IEog@GN0Ix|zK~y-6<OH^cf=UNU)?f>4DXjEV~7Lh1>@h3515f&Z79UktN;K2 M07*qoM6N<$f-k 1) for(var/number = 1 to count) var/obj/after_image/added_image = new /obj/after_image(null) @@ -62,8 +67,16 @@ targeted_image.active = TRUE targeted_image.sync_with_parent(parent) targeted_image.loc = null + + if(color_cycle) + if(!hsv) + hsv = RGBtoHSV(rgb(255, 0, 0)) + hsv = RotateHue(hsv, world.time - rest_time * 15) + targeted_image.color = HSVtoRGB(hsv) + if(!isnull(dir_override)) targeted_image.setDir(dir_override) + var/atom/movable/parent_am = parent var/atom/target_loc = parent_am.loc for(var/obj/after_image/listed_image in src.after_images) diff --git a/tgstation.dme b/tgstation.dme index 5b760e5445f7..a6e0fa4cb9fc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6139,6 +6139,7 @@ #include "monkestation\code\modules\cybernetics\augments\arm_augments.dm" #include "monkestation\code\modules\cybernetics\augments\chest_augments.dm" #include "monkestation\code\modules\cybernetics\augments\leg_augments.dm" +#include "monkestation\code\modules\cybernetics\clothing\suits.dm" #include "monkestation\code\modules\cybernetics\components\slowing_field.dm" #include "monkestation\code\modules\cybernetics\designs\medical.dm" #include "monkestation\code\modules\cybernetics\hud\cybernetics.dm" From b580c3ffecaad0b677a5a1e5e87ad5e75fe3f4f6 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 23 Feb 2024 02:02:22 -0500 Subject: [PATCH 05/81] changes --- .../cybernetics/augments/chest_augments.dm | 2 +- .../cybernetics/components/slowing_field.dm | 25 ++++++++++++++++++- .../implant_items/weapons/mantis_blade.dm | 8 +++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm index 45fc9555f80d..6b49ce8c88c9 100644 --- a/monkestation/code/modules/cybernetics/augments/chest_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -76,7 +76,7 @@ COOLDOWN_START(src, in_the_zone, 45 SECONDS) owner.AddComponent(/datum/component/after_image, 16, 0.5, TRUE) - owner.AddComponent(/datum/component/slowing_field, 0.1, 5, 2) + owner.AddComponent(/datum/component/slowing_field, 0.1, 5, 3) addtimer(CALLBACK(src, PROC_REF(exit_the_zone), owner), 15 SECONDS) diff --git a/monkestation/code/modules/cybernetics/components/slowing_field.dm b/monkestation/code/modules/cybernetics/components/slowing_field.dm index 0df9ec4c5bd0..dd024ff2014c 100644 --- a/monkestation/code/modules/cybernetics/components/slowing_field.dm +++ b/monkestation/code/modules/cybernetics/components/slowing_field.dm @@ -5,11 +5,14 @@ var/atom_speed_multiplier = 1 ///list of slowed things var/list/affected = list() + ///our area range + var/area_range = 1 /datum/component/slowing_field/Initialize(bullet_speed_multiplier = 1, atom_speed_multiplier = 1, area_range = 1) . = ..() src.bullet_speed_multiplier = bullet_speed_multiplier src.atom_speed_multiplier = atom_speed_multiplier + src.area_range = area_range var/static/list/connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered_turf), @@ -17,13 +20,33 @@ COMSIG_ATOM_INITIALIZED_ON = PROC_REF(on_entered_turf), ) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_moved)) AddComponent(/datum/component/connect_range, parent, connections, area_range, TRUE) + on_parent_moved() /datum/component/slowing_field/Destroy(force, silent) . = ..() for(var/atom/a as anything in affected) on_exited_turf(src, a) +/datum/component/slowing_field/proc/on_parent_moved(datum/source) + SIGNAL_HANDLER + + var/list/remaining = list() + remaining += affected + for(var/atom/movable/thing in range(area_range, parent)) + if(!isliving(thing) && !isprojectile(thing)) + continue + if(thing in remaining) + remaining -= thing + continue + on_entered_turf(get_turf(thing), thing) + + for(var/atom/movable/thing as anything in remaining) + if(!istype(thing)) + continue + on_exited_turf(get_turf(thing), thing) + /datum/component/slowing_field/proc/on_entered_turf(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER if(istype(arrived, /obj/effect/temp_visual/decoy/fading)) @@ -59,4 +82,4 @@ /datum/movespeed_modifier/status_effect/slowing_field - multiplicative_slowdown = 1 + variable = TRUE diff --git a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm index 7dc93242b647..c70f5607880f 100644 --- a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm +++ b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm @@ -46,12 +46,18 @@ inhand_icon_state = "syndie_mantis" force = 15 block_chance = 20 + COOLDOWN_DECLARE(lunge) /obj/item/mantis_blade/syndicate/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + if(!COOLDOWN_FINISHED(src, lunge) || world.time < user.next_move) + return + if(proximity_flag || get_dist(user,target) > 3 || !isliving(target)) return for(var/i in 1 to get_dist(user,target)) - step_towards(user,target) + if(!step_towards(user,target)) + return + COOLDOWN_START(src, lunge, 10 SECONDS) attack(target,user) From 0c6bb18ae7609cb7cb22316a95b5bedce7e45e0a Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sat, 24 Feb 2024 13:54:14 -0500 Subject: [PATCH 06/81] ipc --- .../code/modules/mob/living/carbon/human/species_type/ipc.dm | 1 + monkestation/code/modules/surgery/organs/augments.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm index 2c81c861e89c..813d606bfa7d 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm @@ -43,6 +43,7 @@ mutant_organs = list( /obj/item/organ/internal/cyberimp/arm/power_cord, + /obj/item/organ/internal/cyberimp/cyberlink/nt_low, ) external_organs = list( /obj/item/organ/external/antennae/ipc = "None" diff --git a/monkestation/code/modules/surgery/organs/augments.dm b/monkestation/code/modules/surgery/organs/augments.dm index 8f2ea371e9ce..e05489f5c6f8 100644 --- a/monkestation/code/modules/surgery/organs/augments.dm +++ b/monkestation/code/modules/surgery/organs/augments.dm @@ -3,6 +3,7 @@ desc = "An internal power cord hooked up to a battery. Useful if you run on volts." contents = newlist(/obj/item/apc_powercord) zone = "l_arm" + encode_info = AUGMENT_NT_LOWLEVEL /obj/item/organ/internal/cyberimp/brain/linked_surgery name = "surgical serverlink brain implant" From b67e069802b7864932fa168f53257699c68c769e Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:30:35 -0500 Subject: [PATCH 07/81] more fixes --- .../code/modules/mob/living/carbon/human/species_type/ipc.dm | 2 +- monkestation/code/modules/surgery/organs/augments.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm index 813d606bfa7d..783f50e83b48 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/ipc.dm @@ -42,7 +42,7 @@ mutantheart = /obj/item/organ/internal/heart/cybernetic/ipc mutant_organs = list( - /obj/item/organ/internal/cyberimp/arm/power_cord, + /obj/item/organ/internal/cyberimp/arm/item_set/power_cord, /obj/item/organ/internal/cyberimp/cyberlink/nt_low, ) external_organs = list( diff --git a/monkestation/code/modules/surgery/organs/augments.dm b/monkestation/code/modules/surgery/organs/augments.dm index e05489f5c6f8..9238715c26a0 100644 --- a/monkestation/code/modules/surgery/organs/augments.dm +++ b/monkestation/code/modules/surgery/organs/augments.dm @@ -1,4 +1,4 @@ -/obj/item/organ/internal/cyberimp/arm/power_cord +/obj/item/organ/internal/cyberimp/arm/item_set/power_cord name = "power cord implant" desc = "An internal power cord hooked up to a battery. Useful if you run on volts." contents = newlist(/obj/item/apc_powercord) From 96256a69379209827803c43653679271f673fe39 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sun, 25 Feb 2024 22:57:50 -0500 Subject: [PATCH 08/81] changes how augments are stored code wise, makes chromatas unique, nerf/buff arasaka --- code/game/machinery/doors/door.dm | 4 + code/modules/surgery/organs/augments_arms.dm | 420 ------------------ .../cybernetics/augments/arm_augments.dm | 345 -------------- .../augments/arm_augments/_base.dm | 47 ++ .../augments/arm_augments/item_sets/_base.dm | 185 ++++++++ .../augments/arm_augments/item_sets/jobs.dm | 150 +++++++ .../arm_augments/item_sets/weapons.dm | 98 ++++ .../augments/arm_augments/unsorted.dm | 248 +++++++++++ .../cybernetics/augments/leg_augments.dm | 215 --------- .../augments/leg_augments/_base.dm | 61 +++ .../augments/leg_augments/chemplants.dm | 108 +++++ .../augments/leg_augments/traits.dm | 59 +++ .../implant_items/weapons/mantis_blade.dm | 24 +- tgstation.dme | 11 +- 14 files changed, 991 insertions(+), 984 deletions(-) delete mode 100644 code/modules/surgery/organs/augments_arms.dm delete mode 100644 monkestation/code/modules/cybernetics/augments/arm_augments.dm create mode 100644 monkestation/code/modules/cybernetics/augments/arm_augments/_base.dm create mode 100644 monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm create mode 100644 monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm create mode 100644 monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm create mode 100644 monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm delete mode 100644 monkestation/code/modules/cybernetics/augments/leg_augments.dm create mode 100644 monkestation/code/modules/cybernetics/augments/leg_augments/_base.dm create mode 100644 monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm create mode 100644 monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b9afb41f68a1..53265651929b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -301,6 +301,10 @@ forced_open = crowbar.force_opens if(istype(tool, /obj/item/slasher_machette)) forced_open = TRUE + if(istype(tool, /obj/item/mantis_blade/chromata)) + var/obj/item/mantis_blade/chromata/attacker = tool + forced_open = attacker.check_can_crowbar() + try_to_crowbar(tool, user, forced_open) return TOOL_ACT_TOOLTYPE_SUCCESS diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm deleted file mode 100644 index 5de4b121c09a..000000000000 --- a/code/modules/surgery/organs/augments_arms.dm +++ /dev/null @@ -1,420 +0,0 @@ -/obj/item/organ/internal/cyberimp/arm - name = "arm-mounted implant" - desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" - zone = BODY_ZONE_R_ARM - icon_state = "implant-toolkit" - w_class = WEIGHT_CLASS_SMALL - actions_types = list(/datum/action/item_action/organ_action/toggle) - ///A ref for the arm we're taking up. Mostly for the unregister signal upon removal - var/obj/hand - //A list of typepaths to create and insert into ourself on init - var/list/items_to_create = list() - /// Used to store a list of all items inside, for multi-item implants. - var/list/items_list = list()// I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. - /// You can use this var for item path, it would be converted into an item on New(). - var/obj/item/active_item - /// Sound played when extending - var/extend_sound = 'sound/mecha/mechmove03.ogg' - /// Sound played when retracting - var/retract_sound = 'sound/mecha/mechmove03.ogg' - -/obj/item/organ/internal/cyberimp/arm/Initialize(mapload) - . = ..() - update_appearance() - SetSlotFromZone() - -/obj/item/organ/internal/cyberimp/arm/Destroy() - hand = null - active_item = null - for(var/datum/weakref/ref in items_list) - var/obj/item/to_del = ref.resolve() - if(!to_del) - continue - qdel(to_del) - items_list.Cut() - return ..() - -/datum/action/item_action/organ_action/toggle/toolkit - desc = "You can also activate your empty hand or the tool in your hand to open the tools radial menu." - -/obj/item/organ/internal/cyberimp/arm/proc/SetSlotFromZone() - switch(zone) - if(BODY_ZONE_L_ARM) - slot = ORGAN_SLOT_LEFT_ARM_AUG - if(BODY_ZONE_R_ARM) - slot = ORGAN_SLOT_RIGHT_ARM_AUG - else - CRASH("Invalid zone for [type]") - -/obj/item/organ/internal/cyberimp/arm/update_icon() - . = ..() - transform = (zone == BODY_ZONE_R_ARM) ? null : matrix(-1, 0, 0, 0, 1, 0) - -/obj/item/organ/internal/cyberimp/arm/examine(mob/user) - . = ..() - if(status == ORGAN_ROBOTIC) - . += span_info("[src] is assembled in the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.") - -/obj/item/organ/internal/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) - . = ..() - if(.) - return TRUE - screwtool.play_tool_sound(src) - if(zone == BODY_ZONE_R_ARM) - zone = BODY_ZONE_L_ARM - else - zone = BODY_ZONE_R_ARM - SetSlotFromZone() - to_chat(user, span_notice("You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.")) - update_appearance() - -/obj/item/organ/internal/cyberimp/arm/on_insert(mob/living/carbon/arm_owner) - . = ..() - RegisterSignal(arm_owner, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(on_limb_attached)) - RegisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible. - on_limb_attached(arm_owner, arm_owner.hand_bodyparts[zone == BODY_ZONE_R_ARM ? RIGHT_HANDS : LEFT_HANDS]) - -/obj/item/organ/internal/cyberimp/arm/on_remove(mob/living/carbon/arm_owner) - . = ..() - Retract() - UnregisterSignal(arm_owner, list(COMSIG_CARBON_POST_ATTACH_LIMB, COMSIG_KB_MOB_DROPITEM_DOWN)) - on_limb_detached(hand) - -/obj/item/organ/internal/cyberimp/arm/proc/on_limb_attached(mob/living/carbon/source, obj/item/bodypart/limb) - SIGNAL_HANDLER - if(!limb || QDELETED(limb) || limb.body_zone != zone) - return - if(hand) - on_limb_detached(hand) - RegisterSignal(limb, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_item_attack_self)) - RegisterSignal(limb, COMSIG_BODYPART_REMOVED, PROC_REF(on_limb_detached)) - hand = limb - -/obj/item/organ/internal/cyberimp/arm/proc/on_limb_detached(obj/item/bodypart/source) - SIGNAL_HANDLER - if(source != hand || QDELETED(hand)) - return - UnregisterSignal(hand, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_BODYPART_REMOVED)) - hand = null - -/obj/item/organ/internal/cyberimp/arm/proc/on_item_attack_self() - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(ui_action_click)) - -/obj/item/organ/internal/cyberimp/arm/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF || status == ORGAN_ROBOTIC) - return - if(prob(15/severity) && owner) - to_chat(owner, span_warning("The electromagnetic pulse causes [src] to malfunction!")) - // give the owner an idea about why his implant is glitching - Retract() - -/** - * Called when the mob uses the "drop item" hotkey - * - * Items inside toolset implants have TRAIT_NODROP, but we can still use the drop item hotkey as a - * quick way to store implant items. In this case, we check to make sure the user has the correct arm - * selected, and that the item is actually owned by us, and then we'll hand off the rest to Retract() -**/ -/obj/item/organ/internal/cyberimp/arm/proc/dropkey(mob/living/carbon/host) - SIGNAL_HANDLER - if(!host) - return //How did we even get here - if(hand != host.hand_bodyparts[host.active_hand_index]) - return //wrong hand - if(Retract()) - return COMSIG_KB_ACTIVATED - -/obj/item/organ/internal/cyberimp/arm/proc/Retract() - if(!active_item || (active_item in src)) - return FALSE - - owner?.visible_message(span_notice("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_notice("[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_hear("You hear a short mechanical noise.")) - - owner.transferItemToLoc(active_item, src, TRUE) - UnregisterSignal(active_item, COMSIG_ITEM_ATTACK_SELF) - active_item = null - playsound(get_turf(owner), retract_sound, 50, TRUE) - return TRUE - -/obj/item/organ/internal/cyberimp/arm/proc/Extend(obj/item/augment) - if(!(augment in src)) - return - - active_item = augment - - active_item.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - ADD_TRAIT(active_item, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) - active_item.slot_flags = null - active_item.set_custom_materials(null) - - var/side = zone == BODY_ZONE_R_ARM? RIGHT_HANDS : LEFT_HANDS - var/hand = owner.get_empty_held_index_for_side(side) - if(hand) - owner.put_in_hand(active_item, hand) - else - var/list/hand_items = owner.get_held_items_for_side(side, all = TRUE) - var/success = FALSE - var/list/failure_message = list() - for(var/i in 1 to hand_items.len) //Can't just use *in* here. - var/hand_item = hand_items[i] - if(!owner.dropItemToGround(hand_item)) - failure_message += span_warning("Your [hand_item] interferes with [src]!") - continue - to_chat(owner, span_notice("You drop [hand_item] to activate [src]!")) - success = owner.put_in_hand(active_item, owner.get_empty_held_index_for_side(side)) - break - if(!success) - for(var/i in failure_message) - to_chat(owner, i) - return - owner.visible_message(span_notice("[owner] extends [active_item] from [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_notice("You extend [active_item] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_hear("You hear a short mechanical noise.")) - playsound(get_turf(owner), extend_sound, 50, TRUE) - - if(length(items_list) > 1) - RegisterSignals(active_item, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_ATTACK_SELF_SECONDARY), PROC_REF(swap_tools)) // secondary for welders - -/obj/item/organ/internal/cyberimp/arm/proc/swap_tools(active_item) - SIGNAL_HANDLER - Retract(active_item) - INVOKE_ASYNC(src, PROC_REF(ui_action_click)) - - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser - name = "arm-mounted laser implant" - desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." - icon_state = "arm_laser" - items_to_create = list(/obj/item/gun/energy/laser/mounted/augment) - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/l - zone = BODY_ZONE_L_ARM - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser - name = "arm-mounted taser implant" - desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." - icon_state = "arm_taser" - items_to_create = list(/obj/item/gun/energy/e_gun/advtaser/mounted) - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser/l - zone = BODY_ZONE_L_ARM - -/obj/item/organ/internal/cyberimp/arm/item_set/toolset - name = "integrated toolset implant" - desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contain advanced versions of every tool." - actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) - items_to_create = list( - /obj/item/screwdriver/cyborg, - /obj/item/wrench/cyborg, - /obj/item/weldingtool/largetank/cyborg, - /obj/item/crowbar/cyborg, - /obj/item/wirecutters/cyborg, - /obj/item/multitool/cyborg, - ) - -/obj/item/organ/internal/cyberimp/arm/item_set/toolset/l - zone = BODY_ZONE_L_ARM - -/obj/item/organ/internal/cyberimp/arm/item_set/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) - for(var/datum/weakref/created_item in items_list) - var/obj/potential_knife = created_item.resolve() - if(istype(/obj/item/knife/combat/cyborg, potential_knife)) - return FALSE - - balloon_alert(user, "integrated knife unlocked") - items_list += WEAKREF(new /obj/item/knife/combat/cyborg(src)) - return TRUE - -/obj/item/organ/internal/cyberimp/arm/esword - name = "arm-mounted energy blade" - desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy." - items_to_create = list(/obj/item/melee/energy/blade/hardlight) - -/obj/item/organ/internal/cyberimp/arm/medibeam - name = "integrated medical beamgun" - desc = "A cybernetic implant that allows the user to project a healing beam from their hand." - items_to_create = list(/obj/item/gun/medbeam) - - -/obj/item/organ/internal/cyberimp/arm/item_set/flash - name = "integrated high-intensity photon projector" //Why not - desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." - items_to_create = list(/obj/item/assembly/flash/armimplant) - -/obj/item/organ/internal/cyberimp/arm/item_set/flash/Initialize(mapload) - . = ..() - for(var/datum/weakref/created_item in items_list) - var/obj/potential_flash = created_item.resolve() - if(!istype(potential_flash, /obj/item/assembly/flash/armimplant)) - continue - var/obj/item/assembly/flash/armimplant/flash = potential_flash - flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code - -/obj/item/organ/internal/cyberimp/arm/item_set/flash/Extend() - . = ..() - active_item.set_light_range(7) - active_item.set_light_on(TRUE) - -/obj/item/organ/internal/cyberimp/arm/item_set/flash/Retract() - if(active_item) - active_item.set_light_on(FALSE) - return ..() - -/obj/item/organ/internal/cyberimp/arm/item_set/baton - name = "arm electrification implant" - desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." - items_to_create = list(/obj/item/borg/stun) - -/obj/item/organ/internal/cyberimp/arm/item_set/combat - name = "combat cybernetics implant" - desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." - items_to_create = list( - /obj/item/melee/energy/blade/hardlight, - /obj/item/gun/medbeam, - /obj/item/borg/stun, - /obj/item/assembly/flash/armimplant, - ) - -/obj/item/organ/internal/cyberimp/arm/item_set/combat/Initialize(mapload) - . = ..() - for(var/datum/weakref/created_item in items_list) - var/obj/potential_flash = created_item.resolve() - if(!istype(potential_flash, /obj/item/assembly/flash/armimplant)) - continue - var/obj/item/assembly/flash/armimplant/flash = potential_flash - flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code - -/obj/item/organ/internal/cyberimp/arm/item_set/surgery - name = "surgical toolset implant" - desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." - actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) - items_to_create = list( - /obj/item/retractor/augment, - /obj/item/hemostat/augment, - /obj/item/cautery/augment, - /obj/item/surgicaldrill/augment, - /obj/item/scalpel/augment, - /obj/item/circular_saw/augment, - /obj/item/surgical_drapes, - ) - -/obj/item/organ/internal/cyberimp/arm/item_set/surgery/emagged - name = "hacked surgical toolset implant" - desc = "A set of surgical tools hidden behind a concealed panel on the user's arm. This one seems to have been tampered with." - items_to_create = list( - /obj/item/retractor/augment, - /obj/item/hemostat/augment, - /obj/item/cautery/augment, - /obj/item/surgicaldrill/augment, - /obj/item/scalpel/augment, - /obj/item/circular_saw/augment, - /obj/item/surgical_drapes, - /obj/item/knife/combat/cyborg, - ) - -/obj/item/organ/internal/cyberimp/arm/muscle - name = "\proper Strong-Arm empowered musculature implant" - desc = "When implanted, this cybernetic implant will enhance the muscles of the arm to deliver more power-per-action." - icon_state = "muscle_implant" - - zone = BODY_ZONE_R_ARM - slot = ORGAN_SLOT_RIGHT_ARM_AUG - - actions_types = list() - - ///The amount of damage dealt by the empowered attack. - var/punch_damage = 13 - ///IF true, the throw attack will not smash people into walls - var/non_harmful_throw = TRUE - ///How far away your attack will throw your oponent - var/attack_throw_range = 1 - ///Minimum throw power of the attack - var/throw_power_min = 1 - ///Maximum throw power of the attack - var/throw_power_max = 4 - ///How long will the implant malfunction if it is EMP'd - var/emp_base_duration = 9 SECONDS - -/obj/item/organ/internal/cyberimp/arm/muscle/Insert(mob/living/carbon/reciever, special = FALSE, drop_if_replaced = TRUE) - . = ..() - if(ishuman(reciever)) //Sorry, only humans - RegisterSignal(reciever, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) - -/obj/item/organ/internal/cyberimp/arm/muscle/Remove(mob/living/carbon/implant_owner, special = 0) - . = ..() - UnregisterSignal(implant_owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) - -/obj/item/organ/internal/cyberimp/arm/muscle/emp_act(severity) - . = ..() - if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) - return - owner.balloon_alert(owner, "your arm spasms wildly!") - organ_flags |= ORGAN_FAILING - addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) - -/obj/item/organ/internal/cyberimp/arm/muscle/proc/reboot() - organ_flags &= ~ORGAN_FAILING - owner.balloon_alert(owner, "your arm stops spasming!") - -/obj/item/organ/internal/cyberimp/arm/muscle/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) - SIGNAL_HANDLER - - if(source.get_active_hand() != source.get_bodypart(check_zone(zone)) || !proximity) - return - if(!(source.istate & ISTATE_HARM) || (source.istate & ISTATE_SECONDARY)) - return - if(!isliving(target)) - return - var/datum/dna/dna = source.has_dna() - if(dna?.check_mutation(/datum/mutation/human/hulk)) //NO HULK - return - - var/mob/living/living_target = target - - source.changeNext_move(CLICK_CD_MELEE) - var/picked_hit_type = pick("punch", "smash", "kick") - - if(organ_flags & ORGAN_FAILING) - if(source.body_position != LYING_DOWN && living_target != source && prob(50)) - to_chat(source, span_danger("You try to [picked_hit_type] [living_target], but lose your balance and fall!")) - source.Knockdown(3 SECONDS) - source.forceMove(get_turf(living_target)) - else - to_chat(source, span_danger("Your muscles spasm!")) - source.Paralyze(1 SECONDS) - return COMPONENT_CANCEL_ATTACK_CHAIN - - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - if(human_target.check_shields(source, punch_damage, "[source]'s' [picked_hit_type]")) - source.do_attack_animation(target) - playsound(living_target.loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - log_combat(source, target, "attempted to [picked_hit_type]", "muscle implant") - return COMPONENT_CANCEL_ATTACK_CHAIN - - source.do_attack_animation(target, ATTACK_EFFECT_SMASH) - playsound(living_target.loc, 'sound/weapons/punch1.ogg', 25, TRUE, -1) - - living_target.apply_damage(punch_damage, BRUTE) - - if(source.body_position != LYING_DOWN) //Throw them if we are standing - var/atom/throw_target = get_edge_target_turf(living_target, source.dir) - living_target.throw_at(throw_target, attack_throw_range, rand(throw_power_min,throw_power_max), source, gentle = non_harmful_throw) - - living_target.visible_message( - span_danger("[source] [picked_hit_type]ed [living_target]!"), - span_userdanger("You're [picked_hit_type]ed by [source]!"), - span_hear("You hear a sickening sound of flesh hitting flesh!"), - COMBAT_MESSAGE_RANGE, - source, - ) - - to_chat(source, span_danger("You [picked_hit_type] [target]!")) - - log_combat(source, target, "[picked_hit_type]ed", "muscle implant") - - return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments.dm b/monkestation/code/modules/cybernetics/augments/arm_augments.dm deleted file mode 100644 index f1387811ebe2..000000000000 --- a/monkestation/code/modules/cybernetics/augments/arm_augments.dm +++ /dev/null @@ -1,345 +0,0 @@ -/obj/item/organ/internal/cyberimp/arm - encode_info = AUGMENT_NT_LOWLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/Initialize() - . = ..() - if(ispath(active_item)) - active_item = new active_item(src) - - for(var/typepath in items_to_create) - var/atom/new_item = new typepath(src) - items_list += WEAKREF(new_item) - -/obj/item/organ/internal/cyberimp/arm/item_set/update_implants() - if(!check_compatibility()) - Retract() - - owner.visible_message("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", - "[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", - "You hear a short mechanical noise.") - - owner.transferItemToLoc(active_item, src, TRUE) - active_item = null - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE) - -/obj/item/organ/internal/cyberimp/arm/item_set/ui_action_click() - if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) - to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) - return - - if(!active_item || (active_item in src)) - active_item = null - if(contents.len == 1) - Extend(contents[1]) - else - var/list/choice_list = list() - for(var/datum/weakref/augment_ref in items_list) - var/obj/item/augment_item = augment_ref.resolve() - if(!augment_item) - items_list -= augment_ref - continue - choice_list[augment_item] = image(augment_item) - var/obj/item/choice = show_radial_menu(owner, owner, choice_list) - if(owner && owner == usr && owner.stat != DEAD && (src in owner.organs) && !active_item && (choice in contents)) - // This monster sanity check is a nice example of how bad input is. - Extend(choice) - else - Retract() - - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(prob(30/severity) && owner && !(organ_flags & ORGAN_FAILING)) - Retract() - owner.visible_message(span_danger("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!")) - playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, TRUE) - to_chat(owner, span_userdanger("You feel an explosion erupt inside your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm as your implant breaks!")) - owner.adjust_fire_stacks(20) - owner.ignite_mob() - owner.adjustFireLoss(25) - organ_flags |= ORGAN_FAILING - - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser - encode_info = AUGMENT_TG_LEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/l - zone = BODY_ZONE_L_ARM - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/Initialize() - . = ..() - var/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/laserphasergun = locate(/obj/item/gun/energy/laser/mounted) in contents - laserphasergun.icon = icon //No invisible laser guns kthx - laserphasergun.icon_state = icon_state - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser - encode_info = AUGMENT_TG_LEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser/l - zone = BODY_ZONE_L_ARM - -/obj/item/organ/internal/cyberimp/arm/item_set/toolset - encode_info = AUGMENT_NT_HIGHLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/toolset/l - zone = BODY_ZONE_L_ARM - -/obj/item/organ/internal/cyberimp/arm/item_set/esword - encode_info = AUGMENT_SYNDICATE_LEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/medibeam - encode_info = AUGMENT_TG_LEVEL - - -/obj/item/organ/internal/cyberimp/arm/item_set/flash - encode_info = AUGMENT_NT_HIGHLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/baton - encode_info = AUGMENT_TG_LEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/combat - encode_info = AUGMENT_TG_LEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/surgery - name = "surgical toolset implant" - desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." - items_to_create = list(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes) - encode_info = AUGMENT_NT_HIGHLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/cook - name = "kitchenware toolset implant" - desc = "A set of kitchen tools hidden behind a concealed panel on the user's arm." - items_to_create = list( - /obj/item/kitchen/rollingpin, - /obj/item/knife/kitchen, - /obj/item/reagent_containers/cup/beaker - ) - encode_info = AUGMENT_NT_LOWLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/janitor - name = "janitorial toolset implant" - desc = "A set of janitorial tools hidden behind a concealed panel on the user's arm." - items_to_create = list( - /obj/item/mop/advanced, - /obj/item/reagent_containers/cup/bucket, - /obj/item/soap, - /obj/item/reagent_containers/spray/cleaner - ) - encode_info = AUGMENT_NT_LOWLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/detective - name = "detective's toolset implant" - desc = "A set of detective tools hidden behind a concealed panel on the user's arm." - items_to_create = list( - /obj/item/evidencebag, - /obj/item/evidencebag, - /obj/item/evidencebag, - /obj/item/detective_scanner, - /obj/item/lighter - ) - encode_info = AUGMENT_NT_HIGHLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/detective/Destroy() - on_destruction() - return ..() - -/obj/item/organ/internal/cyberimp/arm/item_set/detective/proc/on_destruction() - //We need to drop whatever is in the evidence bags - for(var/obj/item/evidencebag/baggie in contents) - var/obj/item/located = locate() in baggie - if(located) - located.forceMove(drop_location()) - -/obj/item/organ/internal/cyberimp/arm/item_set/chemical - name = "chemical toolset implant" - desc = "A set of chemical tools hidden behind a concealed panel on the user's arm." - items_to_create = list( - /obj/item/reagent_containers/cup/beaker, - /obj/item/reagent_containers/cup/beaker, - /obj/item/reagent_containers/cup/beaker, - /obj/item/reagent_containers/dropper - ) - encode_info = AUGMENT_NT_HIGHLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/atmospherics - name = "atmospherics toolset implant" - desc = "A set of atmospheric tools hidden behind a concealed panel on the user's arm." - items_to_create = list( - /obj/item/extinguisher, - /obj/item/analyzer, - /obj/item/crowbar, - /obj/item/holosign_creator/atmos - ) - encode_info = AUGMENT_NT_HIGHLEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/connector - name = "universal connection implant" - desc = "Special inhand implant that allows you to connect your brain directly into the protocl sphere of implants, which allows for you to hack them and make the compatible." - icon_state = "hand_implant" - implant_overlay = "hand_implant_overlay" - implant_color = "#39992d" - encode_info = AUGMENT_NO_REQ - items_to_create = list(/obj/item/cyberlink_connector) - -/obj/item/organ/internal/cyberimp/arm/item_set/mantis - name = "C.H.R.O.M.A.T.A. mantis blade implants" - desc = "High tech mantis blade implants, easily portable weapon, that has a high wound potential." - items_to_create = list(/obj/item/mantis_blade) - encode_info = AUGMENT_TG_LEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/syndie_mantis - name = "A.R.A.S.A.K.A. mantis blade implants" - desc = "Modernized mantis blade designed coined by Tiger operatives, much sharper blade with energy actuators makes it a much deadlier weapon." - items_to_create = list(/obj/item/mantis_blade/syndicate) - encode_info = AUGMENT_SYNDICATE_LEVEL - -/obj/item/organ/internal/cyberimp/arm/item_set/syndie_mantis/l - zone = BODY_ZONE_L_ARM - -/obj/item/organ/internal/cyberimp/arm/ammo_counter - name = "S.M.A.R.T. ammo logistics system" - desc = "Special inhand implant that allows transmits the current ammo and energy data straight to the user's visual cortex." - icon_state = "hand_implant" - implant_overlay = "hand_implant_overlay" - implant_color = "#750137" - encode_info = AUGMENT_NT_HIGHLEVEL - - var/atom/movable/screen/cybernetics/ammo_counter/counter_ref - var/obj/item/gun/our_gun - -/obj/item/organ/internal/cyberimp/arm/ammo_counter/Insert(mob/living/carbon/M, special, drop_if_replaced) - . = ..() - RegisterSignal(M,COMSIG_CARBON_ITEM_PICKED_UP, PROC_REF(add_to_hand)) - RegisterSignal(M,COMSIG_CARBON_ITEM_DROPPED, PROC_REF(remove_from_hand)) - -/obj/item/organ/internal/cyberimp/arm/ammo_counter/Remove(mob/living/carbon/M, special) - . = ..() - UnregisterSignal(M,COMSIG_CARBON_ITEM_PICKED_UP) - UnregisterSignal(M,COMSIG_CARBON_ITEM_DROPPED) - our_gun = null - update_hud_elements() - -/obj/item/organ/internal/cyberimp/arm/ammo_counter/update_implants() - update_hud_elements() - -/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/update_hud_elements() - SIGNAL_HANDLER - if(!owner || !owner?.hud_used) - return - - if(!check_compatibility()) - return - - var/datum/hud/H = owner.hud_used - - if(!our_gun) - if(!H.cybernetics_ammo[zone]) - return - H.cybernetics_ammo[zone] = null - - counter_ref.hud = null - H.infodisplay -= counter_ref - H.mymob.client.screen -= counter_ref - QDEL_NULL(counter_ref) - return - - if(!H.cybernetics_ammo[zone]) - counter_ref = new() - counter_ref.screen_loc = zone == BODY_ZONE_L_ARM ? ui_hand_position(1,1,9) : ui_hand_position(2,1,9) - H.cybernetics_ammo[zone] = counter_ref - counter_ref.hud = H - H.infodisplay += counter_ref - H.mymob.client.screen += counter_ref - - var/display - if(istype(our_gun,/obj/item/gun/ballistic)) - var/obj/item/gun/ballistic/balgun = our_gun - display = balgun.magazine.ammo_count(FALSE) - else - var/obj/item/gun/energy/egun = our_gun - var/obj/item/ammo_casing/energy/shot = egun.ammo_type[egun.select] - display = FLOOR(egun.cell.charge / shot.e_cost,1) - counter_ref.maptext = MAPTEXT("
[display]
") - -/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/add_to_hand(datum/source,obj/item/maybegun) - SIGNAL_HANDLER - - var/obj/item/bodypart/bp = owner.get_active_hand() - - if(bp.body_zone != zone) - return - - if(istype(maybegun,/obj/item/gun/ballistic)) - our_gun = maybegun - RegisterSignal(owner,COMSIG_MOB_FIRED_GUN, PROC_REF(update_hud_elements)) - - if(istype(maybegun,/obj/item/gun/energy)) - var/obj/item/gun/energy/egun = maybegun - our_gun = egun - RegisterSignal(egun.cell,COMSIG_CELL_CHANGE_POWER, PROC_REF(update_hud_elements)) - - update_hud_elements() - -/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/remove_from_hand(datum/source,obj/item/maybegun) - SIGNAL_HANDLER - - if(our_gun != maybegun) - return - - if(istype(maybegun,/obj/item/gun/ballistic)) - UnregisterSignal(owner,COMSIG_MOB_FIRED_GUN) - - if(istype(maybegun,/obj/item/gun/energy)) - var/obj/item/gun/energy/egun = maybegun - UnregisterSignal(egun.cell,COMSIG_CELL_CHANGE_POWER) - - - our_gun = null - update_hud_elements() - -/obj/item/organ/internal/cyberimp/arm/ammo_counter/syndicate - encode_info = AUGMENT_SYNDICATE_LEVEL - -/obj/item/organ/internal/cyberimp/arm/cooler - name = "sub-dermal cooling implant" - desc = "Special inhand implant that cools you down if overheated." - icon_state = "hand_implant" - implant_overlay = "hand_implant_overlay" - implant_color = "#00e1ff" - encode_info = AUGMENT_NT_LOWLEVEL - -/obj/item/organ/internal/cyberimp/arm/cooler/on_life() - . = ..() - if(!check_compatibility()) - return - var/amt = BODYTEMP_NORMAL - owner.get_body_temp_normal() - if(amt == 0) - return - owner.add_body_temperature_change("dermal_cooler_[zone]",clamp(amt,-1,0)) - -/obj/item/organ/internal/cyberimp/arm/cooler/Remove(mob/living/carbon/M, special) - . = ..() - owner.remove_body_temperature_change("dermal_cooler_[zone]") - -/obj/item/organ/internal/cyberimp/arm/heater - name = "sub-dermal heater implant" - desc = "Special inhand implant that heats you up if overcooled." - icon_state = "hand_implant" - implant_overlay = "hand_implant_overlay" - implant_color = "#ff9100" - encode_info = AUGMENT_NT_LOWLEVEL - -/obj/item/organ/internal/cyberimp/arm/heater/on_life() - . = ..() - if(!check_compatibility()) - return - var/amt = BODYTEMP_NORMAL - owner.get_body_temp_normal() - if(amt == 0) - return - owner.add_body_temperature_change("dermal_heater_[zone]",clamp(amt,0,1)) - -/obj/item/organ/internal/cyberimp/arm/heater/Remove(mob/living/carbon/M, special) - . = ..() - owner.remove_body_temperature_change("dermal_heater_[zone]") diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/_base.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/_base.dm new file mode 100644 index 000000000000..a63c274882aa --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/_base.dm @@ -0,0 +1,47 @@ +/obj/item/organ/internal/cyberimp/arm + name = "arm-mounted implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + zone = BODY_ZONE_R_ARM + icon_state = "implant-toolkit" + w_class = WEIGHT_CLASS_SMALL + actions_types = list(/datum/action/item_action/organ_action/toggle) + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/Initialize(mapload) + . = ..() + update_appearance() + SetSlotFromZone() + +/datum/action/item_action/organ_action/toggle/toolkit + desc = "You can also activate your empty hand or the tool in your hand to open the tools radial menu." + +/obj/item/organ/internal/cyberimp/arm/proc/SetSlotFromZone() + switch(zone) + if(BODY_ZONE_L_ARM) + slot = ORGAN_SLOT_LEFT_ARM_AUG + if(BODY_ZONE_R_ARM) + slot = ORGAN_SLOT_RIGHT_ARM_AUG + else + CRASH("Invalid zone for [type]") + +/obj/item/organ/internal/cyberimp/arm/update_icon() + . = ..() + transform = (zone == BODY_ZONE_R_ARM) ? null : matrix(-1, 0, 0, 0, 1, 0) + +/obj/item/organ/internal/cyberimp/arm/examine(mob/user) + . = ..() + if(status == ORGAN_ROBOTIC) + . += span_info("[src] is assembled in the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.") + +/obj/item/organ/internal/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) + . = ..() + if(.) + return TRUE + screwtool.play_tool_sound(src) + if(zone == BODY_ZONE_R_ARM) + zone = BODY_ZONE_L_ARM + else + zone = BODY_ZONE_R_ARM + SetSlotFromZone() + to_chat(user, span_notice("You modify [src] to be installed on the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.")) + update_appearance() diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm new file mode 100644 index 000000000000..b7cc51fed36b --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm @@ -0,0 +1,185 @@ +/obj/item/organ/internal/cyberimp/arm/item_set + ///A ref for the arm we're taking up. Mostly for the unregister signal upon removal + var/obj/hand + //A list of typepaths to create and insert into ourself on init + var/list/items_to_create = list() + /// Used to store a list of all items inside, for multi-item implants. + var/list/items_list = list()// I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. + /// You can use this var for item path, it would be converted into an item on New(). + var/obj/item/active_item + /// Sound played when extending + var/extend_sound = 'sound/mecha/mechmove03.ogg' + /// Sound played when retracting + var/retract_sound = 'sound/mecha/mechmove03.ogg' + +/obj/item/organ/internal/cyberimp/arm/item_set/Initialize() + . = ..() + if(ispath(active_item)) + active_item = new active_item(src) + + for(var/typepath in items_to_create) + var/atom/new_item = new typepath(src) + items_list += WEAKREF(new_item) + +/obj/item/organ/internal/cyberimp/arm/item_set/Destroy() + hand = null + active_item = null + for(var/datum/weakref/ref in items_list) + var/obj/item/to_del = ref.resolve() + if(!to_del) + continue + qdel(to_del) + items_list.Cut() + return ..() + +/obj/item/organ/internal/cyberimp/arm/item_set/update_implants() + if(!check_compatibility()) + Retract() + + owner.visible_message("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + + owner.transferItemToLoc(active_item, src, TRUE) + active_item = null + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE) + +/obj/item/organ/internal/cyberimp/arm/item_set/ui_action_click() + if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) + to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) + return + + if(!active_item || (active_item in src)) + active_item = null + if(contents.len == 1) + Extend(contents[1]) + else + var/list/choice_list = list() + for(var/datum/weakref/augment_ref in items_list) + var/obj/item/augment_item = augment_ref.resolve() + if(!augment_item) + items_list -= augment_ref + continue + choice_list[augment_item] = image(augment_item) + var/obj/item/choice = show_radial_menu(owner, owner, choice_list) + if(owner && owner == usr && owner.stat != DEAD && (src in owner.organs) && !active_item && (choice in contents)) + // This monster sanity check is a nice example of how bad input is. + Extend(choice) + else + Retract() + +/obj/item/organ/internal/cyberimp/arm/item_set/on_insert(mob/living/carbon/arm_owner) + . = ..() + RegisterSignal(arm_owner, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(on_limb_attached)) + RegisterSignal(arm_owner, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey)) //We're nodrop, but we'll watch for the drop hotkey anyway and then stow if possible. + on_limb_attached(arm_owner, arm_owner.hand_bodyparts[zone == BODY_ZONE_R_ARM ? RIGHT_HANDS : LEFT_HANDS]) + +/obj/item/organ/internal/cyberimp/arm/item_set/on_remove(mob/living/carbon/arm_owner) + . = ..() + Retract() + UnregisterSignal(arm_owner, list(COMSIG_CARBON_POST_ATTACH_LIMB, COMSIG_KB_MOB_DROPITEM_DOWN)) + on_limb_detached(hand) + +/obj/item/organ/internal/cyberimp/arm/item_set/proc/on_limb_attached(mob/living/carbon/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + if(!limb || QDELETED(limb) || limb.body_zone != zone) + return + if(hand) + on_limb_detached(hand) + RegisterSignal(limb, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_item_attack_self)) + RegisterSignal(limb, COMSIG_BODYPART_REMOVED, PROC_REF(on_limb_detached)) + hand = limb + +/obj/item/organ/internal/cyberimp/arm/item_set/proc/on_limb_detached(obj/item/bodypart/source) + SIGNAL_HANDLER + if(source != hand || QDELETED(hand)) + return + UnregisterSignal(hand, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_BODYPART_REMOVED)) + hand = null + +/obj/item/organ/internal/cyberimp/arm/item_set/proc/on_item_attack_self() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(ui_action_click)) + +/obj/item/organ/internal/cyberimp/arm/item_set/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF || status == ORGAN_ROBOTIC) + return + if(prob(15/severity) && owner) + to_chat(owner, span_warning("The electromagnetic pulse causes [src] to malfunction!")) + // give the owner an idea about why his implant is glitching + Retract() + +/** + * Called when the mob uses the "drop item" hotkey + * + * Items inside toolset implants have TRAIT_NODROP, but we can still use the drop item hotkey as a + * quick way to store implant items. In this case, we check to make sure the user has the correct arm + * selected, and that the item is actually owned by us, and then we'll hand off the rest to Retract() +**/ +/obj/item/organ/internal/cyberimp/arm/item_set/proc/dropkey(mob/living/carbon/host) + SIGNAL_HANDLER + if(!host) + return //How did we even get here + if(hand != host.hand_bodyparts[host.active_hand_index]) + return //wrong hand + if(Retract()) + return COMSIG_KB_ACTIVATED + +/obj/item/organ/internal/cyberimp/arm/item_set/proc/Retract() + if(!active_item || (active_item in src)) + return FALSE + + owner?.visible_message(span_notice("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_notice("[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_hear("You hear a short mechanical noise.")) + + owner.transferItemToLoc(active_item, src, TRUE) + UnregisterSignal(active_item, COMSIG_ITEM_ATTACK_SELF) + active_item = null + playsound(get_turf(owner), retract_sound, 50, TRUE) + return TRUE + +/obj/item/organ/internal/cyberimp/arm/item_set/proc/Extend(obj/item/augment) + if(!(augment in src)) + return + + active_item = augment + + active_item.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + ADD_TRAIT(active_item, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) + active_item.slot_flags = null + active_item.set_custom_materials(null) + + var/side = zone == BODY_ZONE_R_ARM? RIGHT_HANDS : LEFT_HANDS + var/hand = owner.get_empty_held_index_for_side(side) + if(hand) + owner.put_in_hand(active_item, hand) + else + var/list/hand_items = owner.get_held_items_for_side(side, all = TRUE) + var/success = FALSE + var/list/failure_message = list() + for(var/i in 1 to hand_items.len) //Can't just use *in* here. + var/hand_item = hand_items[i] + if(!owner.dropItemToGround(hand_item)) + failure_message += span_warning("Your [hand_item] interferes with [src]!") + continue + to_chat(owner, span_notice("You drop [hand_item] to activate [src]!")) + success = owner.put_in_hand(active_item, owner.get_empty_held_index_for_side(side)) + break + if(!success) + for(var/i in failure_message) + to_chat(owner, i) + return + owner.visible_message(span_notice("[owner] extends [active_item] from [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_notice("You extend [active_item] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_hear("You hear a short mechanical noise.")) + playsound(get_turf(owner), extend_sound, 50, TRUE) + + if(length(items_list) > 1) + RegisterSignals(active_item, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_ATTACK_SELF_SECONDARY), PROC_REF(swap_tools)) // secondary for welders + +/obj/item/organ/internal/cyberimp/arm/item_set/proc/swap_tools(active_item) + SIGNAL_HANDLER + Retract(active_item) + INVOKE_ASYNC(src, PROC_REF(ui_action_click)) diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm new file mode 100644 index 000000000000..316d1369c4cf --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm @@ -0,0 +1,150 @@ +/obj/item/organ/internal/cyberimp/arm/item_set/toolset + name = "integrated toolset implant" + desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contain advanced versions of every tool." + actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) + items_to_create = list( + /obj/item/screwdriver/cyborg, + /obj/item/wrench/cyborg, + /obj/item/weldingtool/largetank/cyborg, + /obj/item/crowbar/cyborg, + /obj/item/wirecutters/cyborg, + /obj/item/multitool/cyborg, + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/toolset/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) + for(var/datum/weakref/created_item in items_list) + var/obj/potential_knife = created_item.resolve() + if(istype(/obj/item/knife/combat/cyborg, potential_knife)) + return FALSE + + balloon_alert(user, "integrated knife unlocked") + items_list += WEAKREF(new /obj/item/knife/combat/cyborg(src)) + return TRUE + +/obj/item/organ/internal/cyberimp/arm/item_set/surgery + name = "surgical toolset implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." + actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) + items_to_create = list( + /obj/item/retractor/augment, + /obj/item/hemostat/augment, + /obj/item/cautery/augment, + /obj/item/surgicaldrill/augment, + /obj/item/scalpel/augment, + /obj/item/circular_saw/augment, + /obj/item/surgical_drapes, + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/surgery/emagged + name = "hacked surgical toolset implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm. This one seems to have been tampered with." + items_to_create = list( + /obj/item/retractor/augment, + /obj/item/hemostat/augment, + /obj/item/cautery/augment, + /obj/item/surgicaldrill/augment, + /obj/item/scalpel/augment, + /obj/item/circular_saw/augment, + /obj/item/surgical_drapes, + /obj/item/knife/combat/cyborg, + ) + +/obj/item/organ/internal/cyberimp/arm/item_set/cook + name = "kitchenware toolset implant" + desc = "A set of kitchen tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/kitchen/rollingpin, + /obj/item/knife/kitchen, + /obj/item/reagent_containers/cup/beaker + ) + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/janitor + name = "janitorial toolset implant" + desc = "A set of janitorial tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/mop/advanced, + /obj/item/reagent_containers/cup/bucket, + /obj/item/soap, + /obj/item/reagent_containers/spray/cleaner + ) + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/detective + name = "detective's toolset implant" + desc = "A set of detective tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/evidencebag, + /obj/item/evidencebag, + /obj/item/evidencebag, + /obj/item/detective_scanner, + /obj/item/lighter + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/detective/Destroy() + on_destruction() + return ..() + +/obj/item/organ/internal/cyberimp/arm/item_set/detective/proc/on_destruction() + //We need to drop whatever is in the evidence bags + for(var/obj/item/evidencebag/baggie in contents) + var/obj/item/located = locate() in baggie + if(located) + located.forceMove(drop_location()) + +/obj/item/organ/internal/cyberimp/arm/item_set/chemical + name = "chemical toolset implant" + desc = "A set of chemical tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/dropper + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/atmospherics + name = "atmospherics toolset implant" + desc = "A set of atmospheric tools hidden behind a concealed panel on the user's arm." + items_to_create = list( + /obj/item/extinguisher, + /obj/item/analyzer, + /obj/item/crowbar, + /obj/item/holosign_creator/atmos + ) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/combat + name = "combat cybernetics implant" + desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." + items_to_create = list( + /obj/item/melee/energy/blade/hardlight, + /obj/item/gun/medbeam, + /obj/item/borg/stun, + /obj/item/assembly/flash/armimplant, + ) + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/combat/Initialize(mapload) + . = ..() + for(var/datum/weakref/created_item in items_list) + var/obj/potential_flash = created_item.resolve() + if(!istype(potential_flash, /obj/item/assembly/flash/armimplant)) + continue + var/obj/item/assembly/flash/armimplant/flash = potential_flash + flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code + +/obj/item/organ/internal/cyberimp/arm/item_set/connector + name = "universal connection implant" + desc = "Special inhand implant that allows you to connect your brain directly into the protocl sphere of implants, which allows for you to hack them and make the compatible." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#39992d" + encode_info = AUGMENT_NO_REQ + items_to_create = list(/obj/item/cyberlink_connector) diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm new file mode 100644 index 000000000000..b4e68502e8bb --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm @@ -0,0 +1,98 @@ +/obj/item/organ/internal/cyberimp/arm/item_set/gun/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(prob(30/severity) && owner && !(organ_flags & ORGAN_FAILING)) + Retract() + owner.visible_message(span_danger("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!")) + playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, TRUE) + to_chat(owner, span_userdanger("You feel an explosion erupt inside your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm as your implant breaks!")) + owner.adjust_fire_stacks(20) + owner.ignite_mob() + owner.adjustFireLoss(25) + organ_flags |= ORGAN_FAILING + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser + name = "arm-mounted laser implant" + desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_laser" + items_to_create = list(/obj/item/gun/energy/laser/mounted/augment) + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/Initialize() + . = ..() + var/obj/item/organ/internal/cyberimp/arm/item_set/gun/laser/laserphasergun = locate(/obj/item/gun/energy/laser/mounted) in contents + laserphasergun.icon = icon //No invisible laser guns kthx + laserphasergun.icon_state = icon_state + + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser + name = "arm-mounted taser implant" + desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_taser" + items_to_create = list(/obj/item/gun/energy/e_gun/advtaser/mounted) + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/gun/taser/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/esword + name = "arm-mounted energy blade" + desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy." + items_to_create = list(/obj/item/melee/energy/blade/hardlight) + encode_info = AUGMENT_SYNDICATE_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/medibeam + name = "integrated medical beamgun" + desc = "A cybernetic implant that allows the user to project a healing beam from their hand." + items_to_create = list(/obj/item/gun/medbeam) + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/flash + name = "integrated high-intensity photon projector" //Why not + desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." + items_to_create = list(/obj/item/assembly/flash/armimplant) + encode_info = AUGMENT_NT_HIGHLEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/flash/Initialize(mapload) + . = ..() + for(var/datum/weakref/created_item in items_list) + var/obj/potential_flash = created_item.resolve() + if(!istype(potential_flash, /obj/item/assembly/flash/armimplant)) + continue + var/obj/item/assembly/flash/armimplant/flash = potential_flash + flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code + +/obj/item/organ/internal/cyberimp/arm/item_set/flash/Extend() + . = ..() + active_item.set_light_range(7) + active_item.set_light_on(TRUE) + +/obj/item/organ/internal/cyberimp/arm/item_set/flash/Retract() + if(active_item) + active_item.set_light_on(FALSE) + return ..() + +/obj/item/organ/internal/cyberimp/arm/item_set/baton + name = "arm electrification implant" + desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." + items_to_create = list(/obj/item/borg/stun) + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/mantis + name = "C.H.R.O.M.A.T.A. mantis blade implants" + desc = "High tech mantis blade implants, easily portable weapon, that has a high wound potential." + items_to_create = list(/obj/item/mantis_blade/chromata) + encode_info = AUGMENT_TG_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/syndie_mantis + name = "A.R.A.S.A.K.A. mantis blade implants" + desc = "Modernized mantis blade designed coined by Tiger operatives, much sharper blade with energy actuators makes it a much deadlier weapon." + items_to_create = list(/obj/item/mantis_blade/syndicate) + encode_info = AUGMENT_SYNDICATE_LEVEL + +/obj/item/organ/internal/cyberimp/arm/item_set/syndie_mantis/l + zone = BODY_ZONE_L_ARM diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm new file mode 100644 index 000000000000..98808c47a466 --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm @@ -0,0 +1,248 @@ +/obj/item/organ/internal/cyberimp/arm/muscle + name = "\proper Strong-Arm empowered musculature implant" + desc = "When implanted, this cybernetic implant will enhance the muscles of the arm to deliver more power-per-action." + icon_state = "muscle_implant" + + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + + actions_types = list() + + ///The amount of damage dealt by the empowered attack. + var/punch_damage = 13 + ///IF true, the throw attack will not smash people into walls + var/non_harmful_throw = TRUE + ///How far away your attack will throw your oponent + var/attack_throw_range = 1 + ///Minimum throw power of the attack + var/throw_power_min = 1 + ///Maximum throw power of the attack + var/throw_power_max = 4 + ///How long will the implant malfunction if it is EMP'd + var/emp_base_duration = 9 SECONDS + +/obj/item/organ/internal/cyberimp/arm/muscle/Insert(mob/living/carbon/reciever, special = FALSE, drop_if_replaced = TRUE) + . = ..() + if(ishuman(reciever)) //Sorry, only humans + RegisterSignal(reciever, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) + +/obj/item/organ/internal/cyberimp/arm/muscle/Remove(mob/living/carbon/implant_owner, special = 0) + . = ..() + UnregisterSignal(implant_owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) + +/obj/item/organ/internal/cyberimp/arm/muscle/emp_act(severity) + . = ..() + if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) + return + owner.balloon_alert(owner, "your arm spasms wildly!") + organ_flags |= ORGAN_FAILING + addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) + +/obj/item/organ/internal/cyberimp/arm/muscle/proc/reboot() + organ_flags &= ~ORGAN_FAILING + owner.balloon_alert(owner, "your arm stops spasming!") + +/obj/item/organ/internal/cyberimp/arm/muscle/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) + SIGNAL_HANDLER + + if(source.get_active_hand() != source.get_bodypart(check_zone(zone)) || !proximity) + return + if(!(source.istate & ISTATE_HARM) || (source.istate & ISTATE_SECONDARY)) + return + if(!isliving(target)) + return + var/datum/dna/dna = source.has_dna() + if(dna?.check_mutation(/datum/mutation/human/hulk)) //NO HULK + return + + var/mob/living/living_target = target + + source.changeNext_move(CLICK_CD_MELEE) + var/picked_hit_type = pick("punch", "smash", "kick") + + if(organ_flags & ORGAN_FAILING) + if(source.body_position != LYING_DOWN && living_target != source && prob(50)) + to_chat(source, span_danger("You try to [picked_hit_type] [living_target], but lose your balance and fall!")) + source.Knockdown(3 SECONDS) + source.forceMove(get_turf(living_target)) + else + to_chat(source, span_danger("Your muscles spasm!")) + source.Paralyze(1 SECONDS) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(ishuman(target)) + var/mob/living/carbon/human/human_target = target + if(human_target.check_shields(source, punch_damage, "[source]'s' [picked_hit_type]")) + source.do_attack_animation(target) + playsound(living_target.loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + log_combat(source, target, "attempted to [picked_hit_type]", "muscle implant") + return COMPONENT_CANCEL_ATTACK_CHAIN + + source.do_attack_animation(target, ATTACK_EFFECT_SMASH) + playsound(living_target.loc, 'sound/weapons/punch1.ogg', 25, TRUE, -1) + + living_target.apply_damage(punch_damage, BRUTE) + + if(source.body_position != LYING_DOWN) //Throw them if we are standing + var/atom/throw_target = get_edge_target_turf(living_target, source.dir) + living_target.throw_at(throw_target, attack_throw_range, rand(throw_power_min,throw_power_max), source, gentle = non_harmful_throw) + + living_target.visible_message( + span_danger("[source] [picked_hit_type]ed [living_target]!"), + span_userdanger("You're [picked_hit_type]ed by [source]!"), + span_hear("You hear a sickening sound of flesh hitting flesh!"), + COMBAT_MESSAGE_RANGE, + source, + ) + + to_chat(source, span_danger("You [picked_hit_type] [target]!")) + + log_combat(source, target, "[picked_hit_type]ed", "muscle implant") + + return COMPONENT_CANCEL_ATTACK_CHAIN + +/obj/item/organ/internal/cyberimp/arm/ammo_counter + name = "S.M.A.R.T. ammo logistics system" + desc = "Special inhand implant that allows transmits the current ammo and energy data straight to the user's visual cortex." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#750137" + encode_info = AUGMENT_NT_HIGHLEVEL + + var/atom/movable/screen/cybernetics/ammo_counter/counter_ref + var/obj/item/gun/our_gun + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/Insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + RegisterSignal(M,COMSIG_CARBON_ITEM_PICKED_UP, PROC_REF(add_to_hand)) + RegisterSignal(M,COMSIG_CARBON_ITEM_DROPPED, PROC_REF(remove_from_hand)) + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/Remove(mob/living/carbon/M, special) + . = ..() + UnregisterSignal(M,COMSIG_CARBON_ITEM_PICKED_UP) + UnregisterSignal(M,COMSIG_CARBON_ITEM_DROPPED) + our_gun = null + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/update_implants() + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/update_hud_elements() + SIGNAL_HANDLER + if(!owner || !owner?.hud_used) + return + + if(!check_compatibility()) + return + + var/datum/hud/H = owner.hud_used + + if(!our_gun) + if(!H.cybernetics_ammo[zone]) + return + H.cybernetics_ammo[zone] = null + + counter_ref.hud = null + H.infodisplay -= counter_ref + H.mymob.client.screen -= counter_ref + QDEL_NULL(counter_ref) + return + + if(!H.cybernetics_ammo[zone]) + counter_ref = new() + counter_ref.screen_loc = zone == BODY_ZONE_L_ARM ? ui_hand_position(1,1,9) : ui_hand_position(2,1,9) + H.cybernetics_ammo[zone] = counter_ref + counter_ref.hud = H + H.infodisplay += counter_ref + H.mymob.client.screen += counter_ref + + var/display + if(istype(our_gun,/obj/item/gun/ballistic)) + var/obj/item/gun/ballistic/balgun = our_gun + display = balgun.magazine.ammo_count(FALSE) + else + var/obj/item/gun/energy/egun = our_gun + var/obj/item/ammo_casing/energy/shot = egun.ammo_type[egun.select] + display = FLOOR(egun.cell.charge / shot.e_cost,1) + counter_ref.maptext = MAPTEXT("
[display]
") + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/add_to_hand(datum/source,obj/item/maybegun) + SIGNAL_HANDLER + + var/obj/item/bodypart/bp = owner.get_active_hand() + + if(bp.body_zone != zone) + return + + if(istype(maybegun,/obj/item/gun/ballistic)) + our_gun = maybegun + RegisterSignal(owner,COMSIG_MOB_FIRED_GUN, PROC_REF(update_hud_elements)) + + if(istype(maybegun,/obj/item/gun/energy)) + var/obj/item/gun/energy/egun = maybegun + our_gun = egun + RegisterSignal(egun.cell,COMSIG_CELL_CHANGE_POWER, PROC_REF(update_hud_elements)) + + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/proc/remove_from_hand(datum/source,obj/item/maybegun) + SIGNAL_HANDLER + + if(our_gun != maybegun) + return + + if(istype(maybegun,/obj/item/gun/ballistic)) + UnregisterSignal(owner,COMSIG_MOB_FIRED_GUN) + + if(istype(maybegun,/obj/item/gun/energy)) + var/obj/item/gun/energy/egun = maybegun + UnregisterSignal(egun.cell,COMSIG_CELL_CHANGE_POWER) + + + our_gun = null + update_hud_elements() + +/obj/item/organ/internal/cyberimp/arm/ammo_counter/syndicate + encode_info = AUGMENT_SYNDICATE_LEVEL + +/obj/item/organ/internal/cyberimp/arm/cooler + name = "sub-dermal cooling implant" + desc = "Special inhand implant that cools you down if overheated." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#00e1ff" + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/cooler/on_life() + . = ..() + if(!check_compatibility()) + return + var/amt = BODYTEMP_NORMAL - owner.get_body_temp_normal() + if(amt == 0) + return + owner.add_body_temperature_change("dermal_cooler_[zone]",clamp(amt,-1,0)) + +/obj/item/organ/internal/cyberimp/arm/cooler/Remove(mob/living/carbon/M, special) + . = ..() + owner.remove_body_temperature_change("dermal_cooler_[zone]") + +/obj/item/organ/internal/cyberimp/arm/heater + name = "sub-dermal heater implant" + desc = "Special inhand implant that heats you up if overcooled." + icon_state = "hand_implant" + implant_overlay = "hand_implant_overlay" + implant_color = "#ff9100" + encode_info = AUGMENT_NT_LOWLEVEL + +/obj/item/organ/internal/cyberimp/arm/heater/on_life() + . = ..() + if(!check_compatibility()) + return + var/amt = BODYTEMP_NORMAL - owner.get_body_temp_normal() + if(amt == 0) + return + owner.add_body_temperature_change("dermal_heater_[zone]",clamp(amt,0,1)) + +/obj/item/organ/internal/cyberimp/arm/heater/Remove(mob/living/carbon/M, special) + . = ..() + owner.remove_body_temperature_change("dermal_heater_[zone]") diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments.dm b/monkestation/code/modules/cybernetics/augments/leg_augments.dm deleted file mode 100644 index 2046db33539f..000000000000 --- a/monkestation/code/modules/cybernetics/augments/leg_augments.dm +++ /dev/null @@ -1,215 +0,0 @@ -/obj/item/organ/internal/cyberimp/leg - name = "leg-mounted implant" - desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" - zone = BODY_ZONE_R_LEG - icon_state = "implant-toolkit" - w_class = WEIGHT_CLASS_SMALL - encode_info = AUGMENT_NT_LOWLEVEL - - var/double_legged = FALSE - -/obj/item/organ/internal/cyberimp/leg/Initialize() - . = ..() - update_icon() - SetSlotFromZone() - -/obj/item/organ/internal/cyberimp/leg/proc/SetSlotFromZone() - switch(zone) - if(BODY_ZONE_R_LEG) - slot = ORGAN_SLOT_LEFT_LEG_AUG - if(BODY_ZONE_L_LEG) - slot = ORGAN_SLOT_RIGHT_LEG_AUG - else - CRASH("Invalid zone for [type]") - -/obj/item/organ/internal/cyberimp/leg/update_icon() - . = ..() - if(zone == BODY_ZONE_R_LEG) - transform = null - else // Mirroring the icon - transform = matrix(-1, 0, 0, 0, 1, 0) - -/obj/item/organ/internal/cyberimp/leg/examine(mob/user) - . = ..() - . += "[src] is assembled in the [zone == BODY_ZONE_R_LEG ? "right" : "left"] LEG configuration. You can use a screwdriver to reassemble it." - -/obj/item/organ/internal/cyberimp/leg/screwdriver_act(mob/living/user, obj/item/I) - . = ..() - if(.) - return TRUE - I.play_tool_sound(src) - if(zone == BODY_ZONE_R_LEG) - zone = BODY_ZONE_L_LEG - else - zone = BODY_ZONE_R_LEG - SetSlotFromZone() - to_chat(user, "You modify [src] to be installed on the [zone == BODY_ZONE_R_LEG ? "right" : "left"] leg.") - update_icon() - -/obj/item/organ/internal/cyberimp/leg/on_insert(mob/living/carbon/M, special, drop_if_replaced) - . = ..() - if(!double_legged) - on_full_insert(M, special, drop_if_replaced) - return - on_full_insert(M, special, drop_if_replaced) - -/obj/item/organ/internal/cyberimp/leg/proc/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) - return - -/obj/item/organ/internal/cyberimp/leg/emp_act(severity) - . = ..() - owner.apply_damage(10,BURN,zone) - -/obj/item/organ/internal/cyberimp/leg/table_glider - name = "table-glider implant" - desc = "Implant that allows you quickly glide tables. You need to implant this in both of your legs to make it work." - encode_info = AUGMENT_NT_LOWLEVEL - double_legged = TRUE - -/obj/item/organ/internal/cyberimp/leg/table_glider/update_implants() - if(!check_compatibility()) - REMOVE_TRAIT(owner,TRAIT_FAST_CLIMBER,type) - return - ADD_TRAIT(owner,TRAIT_FAST_CLIMBER,type) - -/obj/item/organ/internal/cyberimp/leg/table_glider/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) - . = ..() - if(!check_compatibility()) - return - ADD_TRAIT(owner,TRAIT_FAST_CLIMBER,type) - -/obj/item/organ/internal/cyberimp/leg/table_glider/Remove(mob/living/carbon/M, special) - REMOVE_TRAIT(owner,TRAIT_FAST_CLIMBER,type) - return ..() - -/obj/item/organ/internal/cyberimp/leg/shove_resist - name = "BU-TAM resistor implant" - desc = "Implant that allows you to resist shoves, instead shoves deal pure stamina damage. You need to implant this in both of your legs to make it work." - encode_info = AUGMENT_NT_HIGHLEVEL - double_legged = TRUE - -/obj/item/organ/internal/cyberimp/leg/shove_resist/update_implants() - if(!check_compatibility()) - REMOVE_TRAIT(owner,TRAIT_SHOVE_RESIST,type) - return - ADD_TRAIT(owner,TRAIT_SHOVE_RESIST,type) - -/obj/item/organ/internal/cyberimp/leg/shove_resist/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) - . = ..() - if(!check_compatibility()) - return - ADD_TRAIT(owner,TRAIT_SHOVE_RESIST,type) - -/obj/item/organ/internal/cyberimp/leg/shove_resist/Remove(mob/living/carbon/M, special) - REMOVE_TRAIT(owner,TRAIT_SHOVE_RESIST,type) - return ..() - -/obj/item/organ/internal/cyberimp/leg/accelerator - name = "P.R.Y.Z.H.O.K. accelerator system" - desc = "Russian implant that allows you to tackle people. You need to implant this in both of your legs to make it work." - encode_info = AUGMENT_TG_LEVEL - double_legged = TRUE - var/datum/component/tackler - -/obj/item/organ/internal/cyberimp/leg/accelerator/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) - . = ..() - tackler = M.AddComponent(/datum/component/tackler, stamina_cost=30, base_knockdown = 1.5, range = 5, speed = 2, skill_mod = 1.5, min_distance = 3) - -/obj/item/organ/internal/cyberimp/leg/accelerator/Remove(mob/living/carbon/M, special) - if(tackler) - qdel(tackler) - return ..() - -/obj/item/organ/internal/cyberimp/leg/chemplant - name = "Debug Chemplant" - desc = "You shouldn't see this!" - icon_state = "chemplant" - implant_overlay = "chemplant_overlay" - var/list/reagent_list = list() - var/health_threshold = 40 - var/max_ticks_cooldown = 60 SECONDS - var/current_ticks_cooldown = 0 - var/mutable_appearance/overlay - -/obj/item/organ/internal/cyberimp/leg/chemplant/Initialize() - . = ..() - -/obj/item/organ/internal/cyberimp/leg/chemplant/on_life() - if(!check_compatibility()) - return - //Cost of refilling is a little bit of nutrition, some blood and getting jittery - if(owner.nutrition > NUTRITION_LEVEL_STARVING && owner.blood_volume > BLOOD_VOLUME_SURVIVE && current_ticks_cooldown > 0) - - owner.nutrition -= 5 - owner.blood_volume-- - owner.adjust_jitter(1) - owner.adjust_dizzy(1) - - current_ticks_cooldown -= SSmobs.wait - - return - - if(owner.health < health_threshold) - current_ticks_cooldown = max_ticks_cooldown - on_effect() - -/obj/item/organ/internal/cyberimp/leg/chemplant/emp_act(severity) - . = ..() - health_threshold += rand(-10,10) - current_ticks_cooldown = max_ticks_cooldown - on_effect() - -/obj/item/organ/internal/cyberimp/leg/chemplant/proc/on_effect() - var/obj/effect/temp_visual/chempunk/punk = new /obj/effect/temp_visual/chempunk(get_turf(owner)) - punk.color = implant_color - owner.reagents.add_reagent_list(reagent_list) - - overlay = mutable_appearance('icons/effects/effects.dmi', "biogas",ABOVE_MOB_LAYER) - overlay.color = implant_color - - RegisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) - - addtimer(CALLBACK(src, PROC_REF(remove_overlay)),max_ticks_cooldown/2) - - to_chat(owner," You feel a sharp pain as the cocktail of chemicals is injected into your bloodstream!") - return - -/obj/item/organ/internal/cyberimp/leg/chemplant/proc/update_owner_overlay(atom/source, list/overlays) - SIGNAL_HANDLER - - if(overlay) - overlays += overlay - -/obj/item/organ/internal/cyberimp/leg/chemplant/proc/remove_overlay() - QDEL_NULL(overlay) - - UnregisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS) - -/obj/effect/temp_visual/chempunk - icon = 'monkestation/code/modules/cybernetics/icons/96x96.dmi' - icon_state = "chempunk" - pixel_x = -32 //So the big ol' 96x96 sprite shows up right - pixel_y = -32 - layer = BELOW_MOB_LAYER - duration = 5 - -/obj/item/organ/internal/cyberimp/leg/chemplant/drugs - name = "deep-vein emergency morale rejuvenator" - desc = "Dangerous implant used by the syndicate to reinforce their assault forces that go on suicide missions." - implant_color = "#74942a" - encode_info = AUGMENT_SYNDICATE_LEVEL - reagent_list = list(/datum/reagent/determination = 5, /datum/reagent/drug/methamphetamine = 5 , /datum/reagent/medicine/atropine = 5) - -/obj/item/organ/internal/cyberimp/leg/chemplant/emergency - name = "deep emergency chemical infuser" - desc = "Dangerous implant used by the syndicate to reinforce their assault forces that go on suicide missions." - implant_color = "#2a6194" - encode_info = AUGMENT_NT_HIGHLEVEL - reagent_list = list(/datum/reagent/medicine/atropine = 5, /datum/reagent/medicine/omnizine = 3 , /datum/reagent/medicine/leporazine = 3, /datum/reagent/medicine/c2/aiuri = 2, /datum/reagent/medicine/c2/libital = 2) - -/obj/item/organ/internal/cyberimp/leg/chemplant/rage - name = "R.A.G.E. chemical system" - desc = "Extremely dangerous system that fills the user with a mix of potent drugs in dire situation." - implant_color = "#ce3914" - encode_info = AUGMENT_TG_LEVEL - reagent_list = list(/datum/reagent/determination = 2, /datum/reagent/medicine/c2/penthrite = 3 , /datum/reagent/drug/bath_salts = 5 , /datum/reagent/medicine/ephedrine = 5) diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments/_base.dm b/monkestation/code/modules/cybernetics/augments/leg_augments/_base.dm new file mode 100644 index 000000000000..b85fec602902 --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/leg_augments/_base.dm @@ -0,0 +1,61 @@ +/obj/item/organ/internal/cyberimp/leg + name = "leg-mounted implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + zone = BODY_ZONE_R_LEG + icon_state = "implant-toolkit" + w_class = WEIGHT_CLASS_SMALL + encode_info = AUGMENT_NT_LOWLEVEL + + var/double_legged = FALSE + +/obj/item/organ/internal/cyberimp/leg/Initialize() + . = ..() + update_icon() + SetSlotFromZone() + +/obj/item/organ/internal/cyberimp/leg/proc/SetSlotFromZone() + switch(zone) + if(BODY_ZONE_R_LEG) + slot = ORGAN_SLOT_LEFT_LEG_AUG + if(BODY_ZONE_L_LEG) + slot = ORGAN_SLOT_RIGHT_LEG_AUG + else + CRASH("Invalid zone for [type]") + +/obj/item/organ/internal/cyberimp/leg/update_icon() + . = ..() + if(zone == BODY_ZONE_R_LEG) + transform = null + else // Mirroring the icon + transform = matrix(-1, 0, 0, 0, 1, 0) + +/obj/item/organ/internal/cyberimp/leg/examine(mob/user) + . = ..() + . += "[src] is assembled in the [zone == BODY_ZONE_R_LEG ? "right" : "left"] LEG configuration. You can use a screwdriver to reassemble it." + +/obj/item/organ/internal/cyberimp/leg/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(.) + return TRUE + I.play_tool_sound(src) + if(zone == BODY_ZONE_R_LEG) + zone = BODY_ZONE_L_LEG + else + zone = BODY_ZONE_R_LEG + SetSlotFromZone() + to_chat(user, "You modify [src] to be installed on the [zone == BODY_ZONE_R_LEG ? "right" : "left"] leg.") + update_icon() + +/obj/item/organ/internal/cyberimp/leg/on_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!double_legged) + on_full_insert(M, special, drop_if_replaced) + return + on_full_insert(M, special, drop_if_replaced) + +/obj/item/organ/internal/cyberimp/leg/proc/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + return + +/obj/item/organ/internal/cyberimp/leg/emp_act(severity) + . = ..() + owner.apply_damage(10,BURN,zone) diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm b/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm new file mode 100644 index 000000000000..ec4f7badb57b --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm @@ -0,0 +1,108 @@ +/obj/item/organ/internal/cyberimp/leg/chemplant + name = "Debug Chemplant" + desc = "You shouldn't see this!" + icon_state = "chemplant" + implant_overlay = "chemplant_overlay" + var/list/reagent_list = list() + var/health_threshold = 40 + var/max_ticks_cooldown = 60 SECONDS + var/current_ticks_cooldown = 0 + var/mutable_appearance/overlay + +/obj/item/organ/internal/cyberimp/leg/chemplant/Initialize() + . = ..() + +/obj/item/organ/internal/cyberimp/leg/chemplant/on_life() + if(!check_compatibility()) + return + //Cost of refilling is a little bit of nutrition, some blood and getting jittery + if(owner.nutrition > NUTRITION_LEVEL_STARVING && owner.blood_volume > BLOOD_VOLUME_SURVIVE && current_ticks_cooldown > 0) + + owner.nutrition -= 5 + owner.blood_volume-- + owner.adjust_jitter(1) + owner.adjust_dizzy(1) + + current_ticks_cooldown -= SSmobs.wait + + return + + if(owner.health < health_threshold) + current_ticks_cooldown = max_ticks_cooldown + on_effect() + +/obj/item/organ/internal/cyberimp/leg/chemplant/emp_act(severity) + . = ..() + health_threshold += rand(-10,10) + current_ticks_cooldown = max_ticks_cooldown + on_effect() + +/obj/item/organ/internal/cyberimp/leg/chemplant/proc/on_effect() + var/obj/effect/temp_visual/chempunk/punk = new /obj/effect/temp_visual/chempunk(get_turf(owner)) + punk.color = implant_color + owner.reagents.add_reagent_list(reagent_list) + + overlay = mutable_appearance('icons/effects/effects.dmi', "biogas",ABOVE_MOB_LAYER) + overlay.color = implant_color + + RegisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) + + addtimer(CALLBACK(src, PROC_REF(remove_overlay)),max_ticks_cooldown/2) + + to_chat(owner," You feel a sharp pain as the cocktail of chemicals is injected into your bloodstream!") + return + +/obj/item/organ/internal/cyberimp/leg/chemplant/proc/update_owner_overlay(atom/source, list/overlays) + SIGNAL_HANDLER + + if(overlay) + overlays += overlay + +/obj/item/organ/internal/cyberimp/leg/chemplant/proc/remove_overlay() + QDEL_NULL(overlay) + + UnregisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS) + +/obj/effect/temp_visual/chempunk + icon = 'monkestation/code/modules/cybernetics/icons/96x96.dmi' + icon_state = "chempunk" + pixel_x = -32 //So the big ol' 96x96 sprite shows up right + pixel_y = -32 + layer = BELOW_MOB_LAYER + duration = 5 + +/obj/item/organ/internal/cyberimp/leg/chemplant/drugs + name = "deep-vein emergency morale rejuvenator" + desc = "Dangerous implant used by the syndicate to reinforce their assault forces that go on suicide missions." + implant_color = "#74942a" + encode_info = AUGMENT_SYNDICATE_LEVEL + reagent_list = list( + /datum/reagent/determination = 5, + /datum/reagent/drug/methamphetamine = 5 , + /datum/reagent/medicine/atropine = 5 + ) + +/obj/item/organ/internal/cyberimp/leg/chemplant/emergency + name = "deep emergency chemical infuser" + desc = "Dangerous implant used by the syndicate to reinforce their assault forces that go on suicide missions." + implant_color = "#2a6194" + encode_info = AUGMENT_NT_HIGHLEVEL + reagent_list = list( + /datum/reagent/medicine/atropine = 5, + /datum/reagent/medicine/omnizine = 3 , + /datum/reagent/medicine/leporazine = 3, + /datum/reagent/medicine/c2/aiuri = 2, + /datum/reagent/medicine/c2/libital = 2 + ) + +/obj/item/organ/internal/cyberimp/leg/chemplant/rage + name = "R.A.G.E. chemical system" + desc = "Extremely dangerous system that fills the user with a mix of potent drugs in dire situation." + implant_color = "#ce3914" + encode_info = AUGMENT_TG_LEVEL + reagent_list = list( + /datum/reagent/determination = 2, + /datum/reagent/medicine/c2/penthrite = 3 , + /datum/reagent/drug/bath_salts = 5 , + /datum/reagent/medicine/ephedrine = 5 + ) diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm b/monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm new file mode 100644 index 000000000000..83db40471a93 --- /dev/null +++ b/monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm @@ -0,0 +1,59 @@ +/obj/item/organ/internal/cyberimp/leg/table_glider + name = "table-glider implant" + desc = "Implant that allows you quickly glide tables. You need to implant this in both of your legs to make it work." + encode_info = AUGMENT_NT_LOWLEVEL + double_legged = TRUE + +/obj/item/organ/internal/cyberimp/leg/table_glider/update_implants() + if(!check_compatibility()) + REMOVE_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + return + ADD_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + +/obj/item/organ/internal/cyberimp/leg/table_glider/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!check_compatibility()) + return + ADD_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + +/obj/item/organ/internal/cyberimp/leg/table_glider/Remove(mob/living/carbon/M, special) + REMOVE_TRAIT(owner,TRAIT_FAST_CLIMBER,type) + return ..() + +/obj/item/organ/internal/cyberimp/leg/shove_resist + name = "BU-TAM resistor implant" + desc = "Implant that allows you to resist shoves, instead shoves deal pure stamina damage. You need to implant this in both of your legs to make it work." + encode_info = AUGMENT_NT_HIGHLEVEL + double_legged = TRUE + +/obj/item/organ/internal/cyberimp/leg/shove_resist/update_implants() + if(!check_compatibility()) + REMOVE_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + return + ADD_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + +/obj/item/organ/internal/cyberimp/leg/shove_resist/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!check_compatibility()) + return + ADD_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + +/obj/item/organ/internal/cyberimp/leg/shove_resist/Remove(mob/living/carbon/M, special) + REMOVE_TRAIT(owner,TRAIT_SHOVE_RESIST,type) + return ..() + +/obj/item/organ/internal/cyberimp/leg/accelerator + name = "P.R.Y.Z.H.O.K. accelerator system" + desc = "Russian implant that allows you to tackle people. You need to implant this in both of your legs to make it work." + encode_info = AUGMENT_TG_LEVEL + double_legged = TRUE + var/datum/component/tackler + +/obj/item/organ/internal/cyberimp/leg/accelerator/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + tackler = M.AddComponent(/datum/component/tackler, stamina_cost=30, base_knockdown = 1.5, range = 5, speed = 2, skill_mod = 1.5, min_distance = 3) + +/obj/item/organ/internal/cyberimp/leg/accelerator/Remove(mob/living/carbon/M, special) + if(tackler) + qdel(tackler) + return ..() diff --git a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm index c70f5607880f..187f8de14930 100644 --- a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm +++ b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm @@ -40,12 +40,25 @@ user.do_attack_animation(M,null,some_item) some_item.attack(M,user) + +/obj/item/mantis_blade/chromata + tool_behaviour = TOOL_CROWBAR + +/obj/item/mantis_blade/chromata/proc/check_can_crowbar() + var/obj/item/some_item = user.get_inactive_held_item() + + if(!istype(some_item,type)) + return FALSE + return TRUE + /obj/item/mantis_blade/syndicate name = "A.R.A.S.A.K.A. mantis blade" icon_state = "syndie_mantis" inhand_icon_state = "syndie_mantis" force = 15 block_chance = 20 + bare_wound_bonus = 30 + armour_penetration = 35 COOLDOWN_DECLARE(lunge) /obj/item/mantis_blade/syndicate/afterattack(atom/target, mob/user, proximity_flag, click_parameters) @@ -56,8 +69,17 @@ if(proximity_flag || get_dist(user,target) > 3 || !isliving(target)) return + var/obj/item/some_item = user.get_inactive_held_item() + if(!istype(some_item,type)) + return + var/obj/item/mantis_blade/syndicate/other = some_item + for(var/i in 1 to get_dist(user,target)) - if(!step_towards(user,target)) + if(!step_towards(user,target) && get_dist(user,target) >= 1) return + COOLDOWN_START(src, lunge, 10 SECONDS) + COOLDOWN_START(other, lunge, 10 SECONDS) + user.stamina?.adjust(-30) // cost of a lunge + attack(target,user) diff --git a/tgstation.dme b/tgstation.dme index a6e0fa4cb9fc..8270c8121a56 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5320,7 +5320,6 @@ #include "code\modules\surgery\bodyparts\species_parts\plasmaman_bodyparts.dm" #include "code\modules\surgery\organs\_organ.dm" #include "code\modules\surgery\organs\appendix.dm" -#include "code\modules\surgery\organs\augments_arms.dm" #include "code\modules\surgery\organs\augments_chest.dm" #include "code\modules\surgery\organs\augments_eyes.dm" #include "code\modules\surgery\organs\augments_internal.dm" @@ -6136,9 +6135,15 @@ #include "monkestation\code\modules\cybernetics\assets.dm" #include "monkestation\code\modules\cybernetics\actions\base_action.dm" #include "monkestation\code\modules\cybernetics\augments\_base_changes.dm" -#include "monkestation\code\modules\cybernetics\augments\arm_augments.dm" #include "monkestation\code\modules\cybernetics\augments\chest_augments.dm" -#include "monkestation\code\modules\cybernetics\augments\leg_augments.dm" +#include "monkestation\code\modules\cybernetics\augments\arm_augments\_base.dm" +#include "monkestation\code\modules\cybernetics\augments\arm_augments\unsorted.dm" +#include "monkestation\code\modules\cybernetics\augments\arm_augments\item_sets\_base.dm" +#include "monkestation\code\modules\cybernetics\augments\arm_augments\item_sets\jobs.dm" +#include "monkestation\code\modules\cybernetics\augments\arm_augments\item_sets\weapons.dm" +#include "monkestation\code\modules\cybernetics\augments\leg_augments\_base.dm" +#include "monkestation\code\modules\cybernetics\augments\leg_augments\chemplants.dm" +#include "monkestation\code\modules\cybernetics\augments\leg_augments\traits.dm" #include "monkestation\code\modules\cybernetics\clothing\suits.dm" #include "monkestation\code\modules\cybernetics\components\slowing_field.dm" #include "monkestation\code\modules\cybernetics\designs\medical.dm" From 73e2ab40c7d316aa83c4d6b66af93cfd64859b7b Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sun, 25 Feb 2024 22:58:35 -0500 Subject: [PATCH 09/81] whoops --- code/game/machinery/doors/door.dm | 2 +- .../cybernetics/implant_items/weapons/mantis_blade.dm | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 53265651929b..5ceedc6f0a83 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -303,7 +303,7 @@ forced_open = TRUE if(istype(tool, /obj/item/mantis_blade/chromata)) var/obj/item/mantis_blade/chromata/attacker = tool - forced_open = attacker.check_can_crowbar() + forced_open = attacker.check_can_crowbar(user) try_to_crowbar(tool, user, forced_open) return TOOL_ACT_TOOLTYPE_SUCCESS diff --git a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm index 187f8de14930..699c0f0210f6 100644 --- a/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm +++ b/monkestation/code/modules/cybernetics/implant_items/weapons/mantis_blade.dm @@ -44,7 +44,7 @@ /obj/item/mantis_blade/chromata tool_behaviour = TOOL_CROWBAR -/obj/item/mantis_blade/chromata/proc/check_can_crowbar() +/obj/item/mantis_blade/chromata/proc/check_can_crowbar(mob/user) var/obj/item/some_item = user.get_inactive_held_item() if(!istype(some_item,type)) @@ -80,6 +80,8 @@ COOLDOWN_START(src, lunge, 10 SECONDS) COOLDOWN_START(other, lunge, 10 SECONDS) - user.stamina?.adjust(-30) // cost of a lunge + if(isliving(user)) + var/mob/living/living = user + living.stamina?.adjust(-30) // cost of a lunge attack(target,user) From b0183793d5d98ad714c4938d63d3249a97fe7cd8 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Mon, 26 Feb 2024 03:07:39 -0500 Subject: [PATCH 10/81] adds razorwire. --- code/datums/components/leash.dm | 45 +++++++++++ icons/effects/beam.dmi | Bin 130491 -> 130607 bytes .../cybernetics/augments/_base_changes.dm | 59 +++++++++++++-- .../arm_augments/item_sets/weapons.dm | 29 ++++++++ .../cybernetics/augments/chest_augments.dm | 44 +---------- .../modules/cybernetics/icons/implants.dmi | Bin 1078 -> 1176 bytes .../cybernetics/icons/swords_lefthand.dmi | Bin 24854 -> 808 bytes .../cybernetics/icons/swords_righthand.dmi | Bin 28260 -> 813 bytes .../cybernetics/implant_items/autosurgeons.dm | 6 ++ .../implant_items/weapons/razorwire_spool.dm | 70 ++++++++++++++++++ tgstation.dme | 1 + 11 files changed, 205 insertions(+), 49 deletions(-) create mode 100644 monkestation/code/modules/cybernetics/implant_items/weapons/razorwire_spool.dm diff --git a/code/datums/components/leash.dm b/code/datums/components/leash.dm index ac8bc271cfe1..de2ddcb608e8 100644 --- a/code/datums/components/leash.dm +++ b/code/datums/components/leash.dm @@ -13,6 +13,11 @@ /// The object type to create on the new turf when forcibly teleporting out var/force_teleport_in_effect + var/beam_icon_state + var/beam_icon + var/list/beams = list() + var/force_teleports + VAR_PRIVATE // Pathfinding can yield, so only move us closer if this is the best one current_path_tick = 0 @@ -25,6 +30,9 @@ distance = 3, force_teleport_out_effect, force_teleport_in_effect, + beam_icon_state, + beam_icon, + force_teleports = TRUE ) . = ..() @@ -52,6 +60,9 @@ src.distance = distance src.force_teleport_out_effect = force_teleport_out_effect src.force_teleport_in_effect = force_teleport_in_effect + src.beam_icon_state = beam_icon_state + src.beam_icon = beam_icon + src.force_teleports = force_teleports RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(on_owner_qdel)) @@ -67,6 +78,7 @@ /datum/component/leash/Destroy() owner = null + QDEL_LIST(beams) return ..() /datum/component/leash/proc/set_distance(distance) @@ -106,6 +118,10 @@ set waitfor = FALSE PRIVATE_PROC(TRUE) + if(beam_icon && beam_icon_state) + var/list/true_path = get_path_to(parent, owner) + redraw_beams(true_path) + if (get_dist(parent, owner) <= distance) return @@ -149,6 +165,9 @@ /datum/component/leash/proc/force_teleport_back(reason) PRIVATE_PROC(TRUE) + if(!force_teleports) + qdel(src) + var/atom/movable/movable_parent = parent SSblackbox.record_feedback("tally", "leash_force_teleport_back", 1, reason) @@ -166,6 +185,32 @@ SEND_SIGNAL(parent, COMSIG_LEASH_FORCE_TELEPORT) + +/datum/component/leash/proc/redraw_beams(list/path) + for(var/datum/beam/beam as anything in beams) + beams -= beam + qdel(beam) + + var/atom/movable/movable_parent = parent + var/turf/first_turf = path[1] + var/atom/new_host = movable_parent + + var/normal_direction = get_dir(movable_parent, first_turf) // we want to follow 1 dir until it turns and follow that way + var/dist = length(path) + for(var/turf/to_move as anything in path) + dist-- + if(dist == 0) + beams += new_host.Beam(to_move, beam_icon_state, beam_icon) + normal_direction = get_dir(new_host, to_move) + new_host = to_move + + else if((get_dir(new_host, to_move) == normal_direction)) + continue + + beams += new_host.Beam(to_move, beam_icon_state, beam_icon) + normal_direction = get_dir(new_host, to_move) + new_host = to_move + /// A debug spawner that will create a corgi leashed to a bike horn, plus a beam /obj/effect/spawner/debug_leash diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index aebbebecf5a7e2f68ccea29a0ff51544a04136e0..2854d166a4376f66c4ede75acb0912fc6dbcd794 100644 GIT binary patch delta 10584 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
?5Kq@y-Iug#~IKWy4br;->XIKSa5CO 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 cyberlink beeps: ERR02 ELECTROMAGNETIC MALFUNCTION DETECTED IN [uppertext(name)] ") +/obj/item/organ/internal/cyberimp/Insert(mob/living/carbon/receiver, special, drop_if_replaced) + var/obj/item/bodypart/limb = receiver.get_bodypart(deprecise_zone(zone)) + . = ..() + if(visual_implant) + if(!.) + return + if(!limb) + return FALSE + + ownerlimb = limb + add_to_limb(ownerlimb) + +/obj/item/organ/internal/cyberimp/add_to_limb(obj/item/bodypart/bodypart) + bodypart_overlay = new bodypart_overlay() + bodypart_overlay.unique_properties(src) + ownerlimb = bodypart + ownerlimb.add_bodypart_overlay(bodypart_overlay) + owner.update_body_parts() + return ..() -/obj/item/organ/internal/cyberimp/New(mob/M = null) - if(iscarbon(M)) - src.Insert(M) - if(implant_overlay) - var/mutable_appearance/overlay = mutable_appearance(icon, implant_overlay) - overlay.color = implant_color - add_overlay(overlay) +/obj/item/organ/internal/cyberimp/remove_from_limb() + ownerlimb.remove_bodypart_overlay(bodypart_overlay) + QDEL_NULL(bodypart_overlay) + ownerlimb = null + owner.update_body_parts() return ..() /** diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm index b4e68502e8bb..dc16420621fd 100644 --- a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/weapons.dm @@ -96,3 +96,32 @@ /obj/item/organ/internal/cyberimp/arm/item_set/syndie_mantis/l zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/razorwire + name = "razorwire spool implant" + desc = "An integrated spool of razorwire, capable of being used as a weapon when whipped at your foes. \ + Built into the back of your hand, try your best to not get it tangled." + items_to_create = list(/obj/item/melee/razorwire) + encode_info = AUGMENT_SYNDICATE_LEVEL + icon = 'monkestation/code/modules/cybernetics/icons/implants.dmi' + icon_state = "razorwire" + visual_implant = TRUE + bodypart_overlay = /datum/bodypart_overlay/simple/razorwire + +/obj/item/organ/internal/cyberimp/arm/item_set/razorwire/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/item_set/razorwire/Retract() + if(active_item) + var/obj/item/melee/razorwire/wire = active_item + wire.disconnect() + return ..() + +/datum/bodypart_overlay/simple/razorwire + icon = 'monkestation/code/modules/cybernetics/icons/implants.dmi' + icon_state = "razorwire_right" + layers = EXTERNAL_FRONT + +/datum/bodypart_overlay/simple/razorwire/unique_properties(obj/item/organ/internal/cyberimp/called_from) + if(called_from.zone == BODY_ZONE_L_ARM) + icon_state = "razorwire_left" diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm index 6b49ce8c88c9..dc328392909f 100644 --- a/monkestation/code/modules/cybernetics/augments/chest_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -9,12 +9,6 @@ var/double_legged = FALSE slot = ORGAN_SLOT_SPINAL -/obj/item/organ/internal/cyberimp/chest/Initialize() - . = ..() - update_icon() - - - /datum/action/item_action/organ_action/sandy name = "Sandevistan Activation" @@ -28,42 +22,8 @@ COOLDOWN_DECLARE(in_the_zone) /// The bodypart overlay datum we should apply to whatever mob we are put into - var/datum/bodypart_overlay/simple/sandy/bodypart_overlay - /// What limb we are inside of, used for tracking when and how to remove our overlays and all that - var/obj/item/bodypart/ownerlimb - -/obj/item/organ/internal/cyberimp/chest/sandevistan/Insert(mob/living/carbon/receiver, special, drop_if_replaced) - var/obj/item/bodypart/limb = receiver.get_bodypart(deprecise_zone(zone)) - - . = ..() - - if(!.) - return - if(!limb) - return FALSE - - ownerlimb = limb - add_to_limb(ownerlimb) - - -/obj/item/organ/internal/cyberimp/chest/sandevistan/add_to_limb(obj/item/bodypart/bodypart) - bodypart_overlay = new() - ownerlimb = bodypart - ownerlimb.add_bodypart_overlay(bodypart_overlay) - owner.update_body_parts() - return ..() - -/obj/item/organ/internal/cyberimp/chest/sandevistan/remove_from_limb() - ownerlimb.remove_bodypart_overlay(bodypart_overlay) - QDEL_NULL(bodypart_overlay) - ownerlimb = null - owner.update_body_parts() - return ..() - -/obj/item/organ/internal/cyberimp/chest/sandevistan/Destroy() - if(ownerlimb) - remove_from_limb() - return ..() + visual_implant = TRUE + bodypart_overlay = /datum/bodypart_overlay/simple/sandy /obj/item/organ/internal/cyberimp/chest/sandevistan/ui_action_click() if((organ_flags & ORGAN_FAILING)) diff --git a/monkestation/code/modules/cybernetics/icons/implants.dmi b/monkestation/code/modules/cybernetics/icons/implants.dmi index a889a6e286441f6aa4256d250cc750bde5b1e9b2..5957db3cab2ccc758b7d9aaf0407e84c7b96a741 100644 GIT binary patch delta 1108 zcmV-a1grbD2$%^WiBL{Q4GJ0x0000DNk~Le0001>0001h2m=5B0K2`CDUl&nf3A8| zSad{Xb7OL8aCB*JZU6vyoRyKy3c@fDgwM%Sg!V4}^y)=gN)PrG!qRR{Fim6=4Epp& zdl5w1-e#6>XJIxMr>bsRQJx!qNAlWPaTLX7%URTYP{|zjoGH{76(-{Y1WYm`csh!j zFypM(ft=T?sEf0JeY3QVO~&(g+Llq)QbV_{uHj z`k;5OD|my$UpyC8TYf(I0>{0KBH`GEYybcQQ%OWYRCt{2nt_(8AP|Oy0;M9U_kY+s z1Geo30|>Qx_sr+%97@FB`5i!P7#N26U4#^e<6&D3N^6z+eH^E0l13g+f2Y=_g_KgX zEAxQ7^Est(yZ|EzY>%Lj#+baqDu)zGjP;EZgwR;i9zoOx3W>dI90G~23dhS7&XJ3t z$UB%7xXvLJhY;ddItne!DTMGF_z?QmIi%027IH^i=c|v9gaT1T8fz^P!3u};_n^fd zqr!}Z*V)ZMAQT9N*(51CfAlkX69R`RXW{Ig0^OXv1S6*rGC`W8{*ptWNPklp--HDV zivnk7|59(fh7xPcXMGs6jB1*%^J+q(b$_y2^^%AO8X5; zDSbZ_z6vZw$lXvN<^Yxwr@uM0_<|O@TT&ooFbKdcPW4C9>PMzTe-W$^h~0=aq`>)V zAQKFDv0C6$&Z871Ny)-+0YZ@XAnNx0AaMb~;Y2VFmE&HfXd#}#3rz3(x<|-v2nF7i-*N)6KZLK*KvJ}D@KX^% z_vFr9{d5Zp)ZtO-f2sZX1?O9FH(j(aG@KcV=g^Vj@nju}m#on`9!8L?g%uo*5W%L| zWZW?($y!*!@#MFLBNIbQlEQqi1k6)Tn?KRy*||K1VHoB==dKjYQ9EdJ}*0xf7seqsEXl56w)m4(-E|RjuAh5WbaV-&}XwF{)XU7u&{k}&eV=LoR+Qk zrT3>;)(@Lj5PyX)i?s@WtlcjRn>13;Hpb4Ul_6J0XBE2r$_w0E__W z052#70Q2W75(5Xe0Kk3W=Lo>k-K!J?Va{R?$XGfC+$(svD|iL)w^cEi2XYn$pw$Nv zuE*gtw83I}F(S2!N-4u>&~efhpHMh4M3u4l3_v(FCJ4&(UsY9ARrSB&yirlU?z4D6Lf#U$VWjzaU)`2kL2BrHw7Jl7^8Pge{>MKAtL4BZ5Q<3s+I_Y0UIc665mxbpgRR%wCa^kzJ<{m-u8Xp zauZK1I37O$0AL&f(0G5idn(54goHgZ##1ZEdJupU<0M1iUqPxGQafnSV-q{Y8n^(F z^28{hgAkJHK?9;5#smNmFd@#Y1>`({Nv)d)QrWG01?&_6e>oFkQtRe{RCeo+AL#We zBhrD_8A~#~_7gSgFaYVmVC~=@4-4^c8?U3I0PjInj{cwz^ZRK1tACSOQBLS~2M3a8 z)p&^OuOdePsC(zGL@m2@^HnSbhllHk)B2e&N%$oMveI7#0jjF1s;a8~xHj&zifzc~ z9pmn1`?dMWM+#Yx{r`tUO?OBYX}Uv~J8(I`j^Hjc4tB(LpC0000&P)t-s0002& z>*sS9EjKeX7Zny8BuC4}!GL>uSyxvJ1q~P+85aZ|5(pL^9x^mELR3^?h$JngFDVTS z8H$RY!okVw>+8FIT;Koz00DGTPE!Ct=GbNc00549R9JLGWpiV4X>fFDZ*Bkpc$`yK zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+ zH!-gyvsj6XGbOXA7^I7fGp#5wHxY`SqD#NfHlV)>In+62#oZ>IYG5`PoAV|Jxa8cZ3GC}Fryj+VKs3kd!QA*`z5-_>z z8Yuy@BvZ58x0nP@LrPG~MIhhi0pG9EkilH?_;9MGCz?5e> zfzmJpoPsYPSiX;D31q&2Fh>hS=ko-XS*ZrG`H36whb_qI3QU1~w<&>e8~^|S0020U zYSUn1xxtZXx|$l6k;*l&nbmOvW38>sBw#AnO}QYT1dRPLae@9m!dxbSp(j+ozaLPH zcc2`zz(r}5az3X8mSBqhMqm*Ty&%w08L`bOo+Jwc8XxHVps(00000@L#E$)q|!!F8eD5n(OMpm9uK1 zB_D6HN4odkW(QW|WC>cJ-TyDGpV@6AV&lG7K#v~vLwEB%gEo{g4upos*pR#%nbrjY zx}Da>fGY9Q3odpO`lW3b&X3Z~Kk1_{g)Y2B(dFZx48EXYYv}mTan-{m$U!*+@+BW$ z9{>OV004Xkx6e`V;~TS z<^Da5#~{#OnZVzxqep-e^|&rP2y_VVYhdD`Ve4-F((#3dqpJ%DunpKwMPEfP;1U(q=`68_N8CU z7aTr@zB%(D^n#<(A!COUu>VaKW3em~t?SHsrB~P(>%fFZ2wqZB*BR-@MxKi?R&+okxzJU*?352;z zS3kw(JaW|q^J2_OpFMZ8?^t3EzJ`_ng%}kxIc<*WXvNW{q`FTp$ zjPmYtn%hy@UvHNRUGCQ|w17YtLH9LO4ZPFVrUTL}Yy)r<^c|PTJCg!=^)0*?`77AN z1mDjZFV@mN)?9^@nnG{{k77a{ic}x47&Ge}o6GU0#}s>4X3dEk(uvzkRnER|hJFZuIq{tk{yoVG0r>TMPnxoOYVf_{OA|&|- z670XKOE0FDt$H+TKG~KC`I2sLu_QiccioZ@zWJuhhDEDc2D{f~`)FGz#EwO4rq62X zh$f$!1M2JP`V8!O3%7Hp1CC{xw#MV|TyET_8;)ifhV^A-WvQ_lZLilDXckY9B&DQ2 zh+ozYyLNX`Ho^Ql_;MbK=o0JXE7~Vbr;4>ygwTLXdU18k{g=bR5}`r>V03ZH`LKD!xG0EaOoAUuIqr@l+!)(G#t z*6)w87X(lZNA*I>P$dD>gr>C&nPiC8j^hWtx*e)RY2THl(k7*(k4;pP`7;8sl zYyd9|c5S&5xIuskbuDU5u z*H{~6;+I`G@>!Xy%ccC;H;ML-`6|$?wOj3Hfm}Y6zRm}+Bl*BOZ|+_r6%^!O(}U<{ z-=Y8pCRr9(#&qk^^zRU$)jPtMTl}JrhbK;1mWol%oszJd>+lhI5u;6=HaMde+*~Ba zFM6%-Ja!oVOD^8rQqTuw5==eJU~=Q(4~v6bF7@!}yM-;e&hmEfwjlfW+7^SUMQFVJ zTj>?u8~#UH?WPuOjg8@PoJMUEs|QwbgkRJMu!`#cSF6}Qt|!fG`YzHW6+>C!y2+eX za=PX!eE+?ag3pDrXPh-x+34vJew$Dr{imF#>={r;{GbkRnE+6(3#83gPh=^%bDRx0 zk>!XnO(I5Bn?~KG+~-bdL0cK6i&YQ+-`Ez_hr+g+T0?o z^jfnbJ7L$XYEDEdh4vRc?c4=AVTt4o0n)J| zuT-f2;!PpnlWOG~4o6Bcwe6OMd4Vt1Z5uLg zjKAA3Ky1;%@8m3f)tkC}62p5zF97zy8Glth@zYjXSHsR_HGYG6GQK{|MLn;O6mOJO zknebcm9-X~o^~P&FffsQsgd9#BF^hw7`Wgo$C+`gAYhDN`3?5Tg(aVk*%n*ulie9_ zH|S(KzVQEPzd%)r>*} zP)h-HHUU`THoztr>c84e_Uh@fmPivb9@3Ebs}b1{UmhikDWh?KN^t5xGA-YLbE8vO#1?QiUzn)#6AqYAr)F$T$pB}P>Od}giu5bP9lP|u49_TqhlQmvwY@mXbN>8e z>7o~GWm93K7o49W5Q13&)Ef2pr57XW{19D%7bggKUGD#8HX)a}%gjeGk7p2q9IRRA zF>skz#99V$+k`v!g$o{y@{a1uzkX$QsgCm+Sls380@v*j_smOtfct^1y2+ z{wH9BSJm^Dh#2N4DPB9I&bpn;&yS8Mz^v45EJaY3?d2z(`}|uf{us@Fv!usYAf;uq z;IQ=q*6UboC{dDjl~+E3D1#eQ?P>DqV0{J{RdxJ%bH1ik0wFuAvf#jOUK3^N{uq+- zzr{KKekCZKYa&*>OnGcA?2Ac~SMRi|LEhBG>A!iw?i28o(h|2OM(AZmVPbNWr(xrc{8s4veOlWStG8 zMdde7kp9?Kp0enf)Stvs6Z2UAAuYO8t5?2+6+E`97?Scm*fG8vdl_Jze)tp6@v!{r zgB)b&pL74rNbjj*pfjw0E3<;-SR8+aRYZaM&qzRt`ETepu^Xnwab`sze9&}N2F$f6 z0x^-P`G0#@Rv{x2f! z?SG>e3b{P5n{1({M62iT9Oda3KxJrbo=rf)Y#Jo!48tUS`}VSP#LvPa1UCl(-*^7| z@W$GexIb#mhg$R3$EEZJrI)3OZ#vlv0;wzp6B7x2=u!4$V^fILx9T}^?s~HB#~qTn zi1qr!eqqDE>Njj@UrsyHN=u?-wZE*7||wEbC*ch;q{t!FQNSp_@@bH9^N zK<#J{QeZr-MpFlVM-Y_H4|&c4&$iP#N+6u9+PSC?(UMD=X8z6N^wNkjD?j}6S*&a8Ht}2S#{4Joj7G-MaIPz@6+qESy9C; zto-)2V96xn4m6-)8w^ZfIhLiDvSbzhiU$Q*zdzid?7(^nA3e1lQ^F4JeZAhR+s686 zb4zY*CzJqGSK1Y<-yd?N>W$(J;}L?hey||6@AsE*LldMGV6Oh_x^4Nl6fu0%>7{PD zPnQ8%0$pQE>G-K&?NZzM5dnFdY^(;-#)H=OgP)t|&3+nncEGXW;r+uzCW0R*#xJfo zSYftxt3laxg9e>lrLyg1i~7%aycc$6lB(b5+C46{vP=97*wF-Bs;)_?q%^5s9{m(B z7qM4@4Ya${G2(+IinGqXbd#%z$Sl!*r+Z;_jBnV=c2@uLc(3+AohJA+;nl1=Y!HQ= zB>Dc~At|Yvqt6XRZ{8q{!K?Mz=1}mReQEb^iE;!cWR{qJZGFa7vC+&1WuHDjJTd7x z2Zl_T*Me2kWbjm1+v#t3iU$KnRb2vfnQc|qVsC9%Wd*Ne6<3(l1vpomTrc8dIU>n< z0=lryFBX0+liLN#dW4)B+CKTEbs}&N^yh9`EAn+IgtW6&kj?9? zxD1HDyxL7+fyZs>tuvjGBKcBRD9;{E!=n!=h}hH#^$9cSDrLK9L18b~`op~5S$x2J zn4fkOC$& z>lHXsf*yQ_cl&YRdP&AR;lM94IdtI`{?9anl=qA%?9aLqVQ3nj2voIrTY@_rxnVQp zkXO9=AA$`ap2j1iv!7N$MugvpVfMT3&i|{${Fe$jzSCAclO34JzQPskzo@?l6;Fpe z%Ync5+b^q|Wwk*dp(XtrgO=DZ?MY;LQ=nz#^GWG-h*{-&ygiIk?@-dDb2O7)N$bWc z=Z4f*g5o!>CSRp8?2vdq>CqPAupch^3r75A*Aq>^0k-s7kL| zMszDvt8xu2bkD7&44L26g83i4Lus)XiAQ17OQYg0Uv#Q>EDqQkjl`yOqXWGQUVOP*z0ms(-UskjrPhor#2e|z;d{F=5RZq&di zO--)i^1G$9-Cc3-UE{{Oxp`cgnXPk)MzJi5GbP{s#!G&!y^7T_NYboiaemUTw>^?C zhvc2O)z(QiGxgiX88W)7!>QFOhP#=-7@aohFbiLNpTIk8L|wg$Z*lpCqRF>8c<MiZKjq|2aY#Q(-820%@$m-$!}eI15@jPIaFF$B~@zi%ACN0 z;`L0IhRSCAD+bm_ZjlYMB?rPb*wG|>w%thDuR zYDZNJF;xU|4Lp@H)ISEVWxT|7>-mHWupAQh(+noD*C#!FrXkJ%5L{4!oUSNxoW%$A zJAr^xAP}wp8>L%JjMkX(&i;s)l3&21uUZ{5O&Wt@FwAyytAXB6*6iv$Q zw6WpciO>M6>1}Y+J&NB8VmNJa5dBlNqsb8srR`0LUbiw? zJjqDUdVmBxn75RCts5_!!*n@>7g+RmZuzex+Bap9!^9ZKC~B_0Ltu2?&ov0a^*f+Z z=%r%g&JtX+M>*n}=O zO^D6}#Zix5d#gsK>)k)({MWT7el0-ykGX$iMf+N}4wu<>pB$-sK3)c9{91wK%D>B| z1f%!`(#m!%XqByfd*fkTaB_uDcj&JFY)b5PY~8*avLg{O^Kw?v%KLYxu5K{}KiY)Z zoi;LyE`sP>8iOA+>YnkUOiFEcbUay5%aFNnh11_Uen-iVQ|Y=@aN=TFAlmo6^bO*f ziWYMePRn(0jm$V=%XI@w(j;#*`=QIXf9P`Nl>KY7`1*UEWC$^s~xY$k==J3mSeF`7Ft=cETT>8QvP7C zX?$GG)5R)7rvB_!`+U_~7b?QS!iI0jIRL)6kIHtI%&d}44a+(t`f*$B`~IoaQ#!Ys zZN`bmk8S*w@uG#f05z)1f#v#L$Hdo2vJfXN%|-PH7b+8`a+L@_-Va$Sd#AHmQA!Np z>81(w5S@8_IBBjkw}?9IjyCsyH!#e{7xYfcb6srIs$F91EDw*gX1MMpadDX7$dTga zX4QnZF_M6w^7k4HpBYnH_%9RTAL_O02khtwE-1;c?cgSj!zlpT;bS=MjV}$w_kg+Pv7cE z4I4sPN*LmIKt^{0Cj3AlwgLC4&Ec@FKHmq1yU#s5hR?F0Z!-f#6U(7;2n2d`zD4jK ztfO+NVMBarT_4I~=tLp`7ys>#3T%FU{>v&|JU(g+D7ftqzj53U}@=GP`>54&mSg-X0D(MDXl zU|$v(MEIZ=RnAa-ENVhc=(P|ycSxepxYVU)Iko{Qw;gEHutH+=z!jP$ln9#Wjv!8J z;#0mLVcp_N*9Arn=g4PNyDfY*HkT?+ELiQl#4eXxe18D^Q0P^K2an4s&tV8# zY5wX&P(=^y+85&;UGLmVA+g8B=lJ-%8rAdN1U)vUYRY^GPMidT{GpYPG*T%o9!^=a z7Z4~5*xzaKQqk1VQKoo|f3pq;05ANlpHA8yt|j!isHyQ+UbCoT`=y@bm)PQ}f(=6a z6|J5a9(kLQ0z>_zbW(7GRjCb=l-TCAz{MX0OMDZDiWkWVxK~{ZvFe7qv=ZOHlv9-Y ztp4&Mig>Ebw@h*fT-V04;a(+5zyuEs&pLYnbCfy%mqYqrdK`(@OrN2OO!d7tPv94? z>{as==iRVr+7)!=jVl;EQ?yS{)VO0JBl7$&ma!=a2yn}|e312WNhg6v#OpeGmG@3o zQD!zbn7It z>9Y*)VscXjI3fH~#i}i>NLHuMMc$jr0Fi982 zeA(MRRo4B>RKV`EzLosmuV7nDZ~9OMqH@yt)YMz%t?T}GnBkZ@VDTFPYq-yw{QjWmi2OYr zTaAJAiN;e3>x8v(*|*|Q2Rr!NFDt~KzScpQT2lswY4O*$?0k8kj*^zK&Qx_-QxvW1CQgZ^-Bu| z9?YG#du``VLThMT9EaaWrovL(Z_M|q5`3r)y@!xS(3=fGnNjnC$*|iVTr;l<)Rq_A zio0OK6~O3y%q%XZxiyXVB>FZ}1t5K&JXHeF=@rV#ZmKG6>*wc#Y)Xe%Tb_RXAj9@! z?bWSk)Dq7peuq2tVeIZxo!GWs^sI~9Fl!#J?!6v9sXw-&Te_XG(=wOm;ql-r^*%x_ zOcl&{F9gFR7Wr_{3Cc5yy~@NGRGMPZU&LRg19vyQ735b{eNpJ~jBK8xQh0fM-&&6w zYo2EUQn?%R0=43PFCl^@NFXOYIAzKGcHv%6uL9 z)S05(Rd8gskM=CFv~J#!Bmb%p{XD4thvb)$1CUg=_ts89-7IVLqwcy8f8=U@PTBMV z<`Q#ZCo<~qI%=2-=^D%Kj}a2h%Blia&*~J~skKo{9^Iio&7@&Q^8LWGYRK%G^=OR%i9n6(7TshRwdo{}pr z)D+ao3>qEpbGTm8$1jR4u?4n(hCJyIA4NH3ssG}7sPZY(GMhJaNG<{+oN%G91sf*3 zRMxGy#LR^NsuFAJRZ(mnJOkt;?R!6%xi%Q;;si91O^~7TNS^-c@9rTL21w-!25>h~ z6n#h$hdo6rUZwICb)cSMe?zGf`aDr_e!ot-RWT!9ooJpuwEF!okFx)O>bi^9egU8t#-#8OYZ0xV!D2U3c$ z`kjB+O&+ZG^k*P$gpJi8kj91zAOtg5B54I##s5HRCaby1=b$1ds++jQz5=a4_e#X% zz?$!y$v~V9h}@YfT1)Gw_n^F&*_WotdTpe`O7)q2#RN8x>ghTiJ!!J~o@-+gglky< z|zy*76WwPd>7Dn6TZg1H!H+C&4 znv{H;g#6duCGi1y1FHaElGYPb4By`r^Cp!B?;G3COogU5*Npj`R-|oq_s-5Uii`SE zZR;c+7{!xUv#$x; zWi9YU^!Q<3t|Lc|XxKdKhm4k7--xkk(`ZnWyV2jkIO9_Fmcn0ttTg9IC}VTTQXky) zIjquU+AmiN%4*jmn`hbAG%B0PN;nb38UuHrHmG^Ux<9f&!hSrX^ABUJari!rL-j^} zH8J;qWengLH1)rhn(BU7VF=4j>cbi)a3KplKY1Dsy4fTU|8MXuo)%?|10lA1H7~T>ekZ(-eK%a z?Tb_@Y0#M>r>~#sSbL@8=Qt&)hi5yY$`LOARWWEGUpYc{V*%QN#@3=TTW6g(1Fg zOExVbfYmX^T?KKx@sLRU5VsGjlU|uWt34xJeFA^sk(zyTMZmJ+R1}?80xs*N;2#l< zqtXTd3VI<q+7)cg_Xu}_vyl-?f#x8Pk3&CR}M6hMR{SEZ95fgBCZt^Q<}q(d=H zyN5E#avg0C_iY`8kGljgs$;g9{y|2tX&&9Ed(x`Fpw3IzGbH}F2xsM5A%hi(UB@Nb zLwH|ZeIT;``lX2fk#5KJ>#Aliuvad8re8mE9nY0~!bt*e%r!+?KDLu3?MNpUePUi@ zrcGO$owRdvG5ovQ7rM7G+ylGm-`;Cw`T{F_`tyMU(t>Xy7QLZm!0r|flb-J>;IKmw zjsdPIUuLG2%@lvI7C#X3GtBqy4O3T%@_V`Tm=&)&vDN5;AEMUq6a#uGqI>OB)oV|)O6N(V&hE`w z@N-3XOfM(LyJSiGuHvehg4J_ve>)f&8a9BuE`v^1=9d}aJioZt5RnF7$v@S1&`6cxHq0BNOzzFLEvZzwRMe@x$ zPX9NPW%6Fe%C{eNlIJaJ8%fQFN|#_G{iuU6ntzg(iRk@RRNF1D;S!U<%x7Fm?n@63 zDA=;07V8V}2*AZ6q%IC|rU|fAy~YIq*8hVs0F=Gzv`!cM8@IA!#$BqAQ#J0nR7(_h zY-C20=Y0&WHY^Y?u9ZOqe8Agpz`e>&#@C)c685K7o?#K^xLfZd_?sN%J+Is2d^rUc zIe&LO@(PQH&k_u8I%MSp(1Z7z+p9?V`xvV>ZrGg5rA~6U@4Q|H5l&)whpNCc3SM9H z5OD3`b)Y+IyVG8}0qehl*%H&`y>$FggDzFtFJ!LfMZ0rYFn#l^n}%YhE1k^>0dLT- z&{)?Z5%38B?C!m^>YaRyEn*_;nl+W~5df%8hy3a^*f6W1{Zjx9Cjh78n*SYu5mpTW zJoia|O(z5;+9tQFS_ihaXqlMgCYC+#^-3@WmcsM%BaewOo((SU5I|T74Mi$fb8{KA z*F=;An@o{u{_QjU34f2=`U6MjOp2Je3)OuiI)m0w>Vg0d&3H>VKFRbuUO(-^?HBh; zb+p7{vg(iPg{|b{%t6dQkjf*e$pSGEGoLTp?i|21KJf75B?W^YG^cm5|CC1p`Qr$yCvlaqol~Gk zC!J|)f)8^3e|J4pq``(HSrs9Iv=1iiV?)Pa`2Wvp|CddxviRgAH2nXayo#BxvwsL^6+_mLXw*<3#$b zbUrwWnX$h?8MHWh`>Gwd{2DsQ?1qO9?NEPt;wIUQ6WEnF@HxD-MbCI)n(#OwS@_4e zcZ5^02iKns0&qg#^@)A5J}Yf#VfM%y@L@yL?>izwx|54?3VgSYqIfO!M-YsT$uyIP zrEBm_onkxd=JC5l00n({i>8)7w?5VJw&+Jha;1LZxQX%N(CBA}>rPAJ0*V-1swLj| zvI31WN|5@&NacnQW9#GGq5NwhcNnVxNCNg!vYov3=vyjs={m;iDZv$Qe7@4fGuxC> zU(@PE#arimTj&tpWc;GAn=Hx3 z^X>HzRoIU@RB7gXkJOpUWb;Sk)9A?qk$)2a%Nhd8%+T3Z+_bE1ZS0%6#(|UIzA+_7 zKonSc#vWJF6K9&l@iWd&U{hM7z%;k? zndf--e952+CXoYmKh3)dp-xr;;(jsrWE)a>b@5jxuJ}2X0}h`qt(m6# z5sB|<1}qY9{>JB#G$3Kunq#1O?PH<|SHQ4Hby(CR{d;>Od zbS3_w-w$?trfFILLeJujOJbU6_@9!r)V_jWX?^UafqU5%lj|i`Gr%o`K;?MwfHY3c zfHK{zW~f6i9=9c|juhw3+t#dS=J6DSrqg9UMfHE!23mEjn!H-geQLpMFZ!em?GKXw zr$py=ZRt2}d7$ytqp<)YC({wRnvTfuo%YoG>7hRWf051#GHth6p8>l+4Nf?+{<=#0 z+V=^c>OBhJrI>b+6_3O9P9l}Dat!WnvUH3tRciS9m1rehVVG^eqojF3dG9pm;rA)Z zu*PwK@ggFCeVwY6T-a$_q{+C%Z&(Vicee@0!n4WRFLD+C#?^uV5xVsJEo1LRoY ziouz|^Bu@0QP}pe=`2Bp<{EEBTIA_7hfh6_q6JDH4%2HV8(+J%R9~vwR4<07;m`Tu ztqguajp_rwuyY*-;yVVbFZ!&q&Be->&3xS41&cx6P8=cxc-?fOo^;Ckr@bEGAc&Eh ze5Urtrb3=EOV!8V;-B+67J_!vUe74&gDs^xK=l9$mC;;ACkriTj%EjH>Tup7tBEIC`oS z2I3#_v>j1>H`uGnf{L?aswiUrh`I1+y&wga2q^hA_j?C;{*ayB&7budy=Vv%=cG46 zwsyK#4!9ccK`cSDa`i)gc+)G&KOOh`{XU4+4`KJk_(*>gy^tTE=nZLwno5xe3jZJv zDEuk9!WS|e4xhm@fHF@{P{(yYJe*YCrymRafBC$4zWcsAI^w62As4X6|7vb5E*E(T z&1YcB1p=w8*PMum^@sI4oX7-Yfy;S{NvaPaKZn2v7o{a4q}`CfpdwQLbLxtzyQqJ2 zmV;J;6$_|uo#0@y^R;jw%2t;Yf&xtSQFf}$wj9(f`0hWP<(Y2ZVj;F;sfA5&b z`~Fa6^3fNa3s}*zdLZ3Vfi5*2fc(yvfkFFKmntc{GIuT;BJZ?KRnn+Sr3#HSdmvf^ zh@|KvTZ|Z-8O4i}JT0DJBy*~Np;kP40O>j`^YV{|_U8L+eWr35z@9~>Bbx)m|;YkbAyVcm3zlm{WzL!PkEFqc5}SF%A&uF z0od|Q`D_1RJeTR(hlC=ts@|wfPQkv3{oh$KKr}fPgh|1^T2_Z`p>hKP8i1(pC2Dj` zOiFeuW_dXeIO8&`LLI$xVa-?f+ad8iFK%iYk5qQpri8PKSYg=h4nD8!_vzhF@ArO`#7<0?H7l+B~@CQ1VloG%u&yB2;aPMCcw{WK}q=5**lsVfS-T@Hrki^?2A%r zuVJ}iL3K&M)O7MZ zYP`EhoY!7M!?Otz9&zuf;?Z)|@?}c~P+S5_WEDElk0bVebA79|xi}uvC$sK32>^2s z=1F@x5bEwlB@ z$0=2*vkEKHAeB_P#)lh^h0SV#P2!>OzBL7E^(myjF6HrptEGs5fHK9EmQ|*s4YWCX zNnk5~l1@{QO6f3VDL;Co%*Yg7rt97dO^B3ST>`py{y-9Maj8yN)nAY!7I6 ze5B#lC|{@>>YEkMi(l@{#5$A8OBG8icVb=S+C!`oxqg2d1-8Msc^9lN2jrWG!dG|m zjsDLNAvCffn3P-q%p9abSsTJe0eBF{4!nc)YHKaH}^@%Bq^)ne3Wlm+Hp>+zGN2p0-;F9B2r9ClAe3=iP!}uT*b*Hs8&~Xl)7zh%0VVid$p$v@B!7cMry)<#2V5 z@m@-mp%?&K#+8&Gy)ID(6y8q{>1;vGFkuW=eWZ5Cx<)_vAOWs zHB#1HM?D3lT&C~mudwl-R(h}nG7o1O7xHNhUj*KB+0GPWD|`Bn%y$eNXIV|tt)2_! zTRqqE{AVqY*m7}h*f#TeTtXV!y|Q-^ZWTitVbaw$a393s@9ROfie+}lIo}jd+2R6+ z_`1LBHx5OTX0&$$auNI5uxkRq89?-BMdJslQV`vi4(jKX=7LmZG%5B{EC&Y+HLB&k zPIFt3C|d>WIio3-a({?{57y{6OKlqE7!0)U3WFjgaFBUhe zEN8lUQtf?_ys#nVx3l23F`vT7XXeaC#$wAz^H|*mQ{b-k@ZaszrmQLNJw!v_me>H` z(oDVZa@!oire^BLKDFX*@kw+R!6p0Y3CuqQHYis^+g<9WSlP_wU@F9w3w>&2!>?g= zM8@C(z8{>JhPNCAhmU+o;+08T-e2D(o~-b_Uk3p7Dl%-J@53m03nLJ}F%H{IZY(V; zQGD|RW{K~HcLUe1t$sP4fM9A)SF&Op&G5oVUK``HT7rLJnxgsP7pXA%0=#?cc^t41 zv=9sqUZk?dr@2n1qv-};m1CceJz7tFUqOT1_w4AMqRtvXQzn(4`%kP##Y5LAd;O^b z85FJ>$fK*q@_bKc)7gzXI@XS{e)=*qW)-A~mSC0jEg{+amY`;$ z6cYiMge{4;kh|r+R1%q5pUwCNjS7Ysd8J833mwgJsLX~_lD?%r`XJ&og5q1UqFL{> zkg>2H5r-4zDGn>Kkpll`!1<>J=NZsm+W$Ul8Xxt-XF~wGX;yUg7X=3Pz(0Iw8O%G4B(niR3QhMge*N1iJQ& zxaBnrwc)YcK%Q=e8#g6e%u$cc5*FFsOaI1c)iV^T8f=z?t-gz}<_>bwU z{HH-D@9l57-?m9Gv>(`NT${mq222UF9{G0pY0r`3n@;XI%bSklyrh%#`siCgeSxWM zM+pHU+WQh@)R%a?ayh*(Z!&g*84)nLL_TGfA3R1Btn2~)3`%nO>MXftC71hRPJU|8 z1tNxY)so6L9XZqvT?{f6T-qMemGNYHvC&m(2bnU}aEt3J zyX!S$1ZBx%#g~2uj%<)Cx$q3p5aQO>OOqL>pso5cP~ZZ1sQDYOg{mcUeUf@Zo6h>{ zeL`_J_oPU71M2L|Ncdwlo=6EfIVT05vR^@XxZ!$M7*S^5Dwe{5~!l!&mQGB;8(QT7Jg@=8HrNkG{TV{cA9U3VQoRq-gSD zqOIVKJ}6=g=oT=zQ01eOn>BXG^CJ!44&Ce~;mwVMZDTj;kpwaVEfXYpLb;|t@H{i< zqM{+&1Jj_-xLL`)U#kKkA+5PfOn6}I9A8;q;P<CKgx!$6yX5NEN0xaT@)hZLn``X?&b3HbN z=FR-|v|9`BFPor*{h!HssvQF59IJPntE^@}zbmbFFCfILrPZo*zE@_a4AZuC7!YB# zd70y)AG0mzJZq9+k|AC-g~01p{TFB1)%F}Rs)@!HTvL|-^&?{28cxxND!vfkJABE7 zs=%BdTWvbQ{s6=Xy3M(J?p5<P3hfIXOEbjF6 z*C-`OaiL4ajw!@Kb3AtykXOIYTr+uuW#YenPze2m=mTR#{yKCT^g-V9MSmd^KcA;d zw$t#0eKGXMQ|gaFuyNXFyx^<9UOir##<@`TP3=1miNk7S*wmEP#zG(m6$vfms85Iz z%fTKv5HTD{+`IVM)SL}LAGPrr6$JX+4{n^gX7csBLm)f&>yy_5dfDDE8_n;Q5EGhZTo=G{y^e4tksyxAX!YwvwMm~e^&3Ah`{~5$QwfHKBaW6H~H{^@xO@EVvNr*_mls9EFRggI>I^bZVGn%EE)~+q^Qx1F)jW5QjOIrg0BO}-e zVA@NslA6q^l%n#s`u*wRY!_n)9Dy?ATq^w}24dO$gu5=OOq#h_zR!i$+KzJA6>qd( zgPM;nfhQ2VpBiL}7rT+xTZ;3muQ4C=b@XaBE^^6RJuTT!GlURd;>YrC&~7f_zV?|S z62)bT6ZUeLMm5LzCesDP z26FM!eu}txWm9c!*H&ovj`*V0vw;dcXB#;gR=lJPbYX`~SsV&_2t+FZ=P75cYga9I zmU|~7Z@+3tmxiE#mvRB?o*-ER)og)~NbL-1aX$}?GZb)z6BTQRibiB%Qjdyxy>E(K zI_t1rj;ifyBSUO}V*vm^0k3<9Ve@uWgP&8AgCg}QTV`s zo+QBOz$uBf=lVo~aEKVaf2BTj*dt?nm9A0+5Or(FKb|>vq_hzFmQww(iBeNGTb?(`Xx>S>xc#wOHnbU0@R!;Qlb`X;KG<-d ze)30HRS^_nv|)_&^=E?{-3U2TllWq9_a3y;`0vr^^9vcmB=8( z_OxmI=>EA8VgHEb>Et4{_;Hjo^~`Gy5GZs_YoyeS@Z!3qr=}G54P=|vPkqUQrxh)M zI1U#JjHz)2B0AZ*FrBJ`+)}}OdZ(f10Iy9lq>psGZzS+xf}+e8w2;?xCpjNLpr`v0 z5ovDAq8b{Fd(=;CRNSoV#fZJW-jUv|l#W2^kIv+%pKat)pEZoti9p@qJ^+?fIKXsb znSpILleyt6lINsolM7ZrFdop|hsg9k(){%7e}g&D<^#ZJ68M5j5GAz(bjTWE2{`h~ zj*fIe0M2D@sosNF{K2>aZqf-5QqK|ec7kx*^TngZ;5bz6+}_tuZRF{v07fB2j%UtJ zv*I_rs_3@8KsWLcdL7^2PX*r)>srZ_m%Ax2n)V3b!H>3v{XQ6Jscfd!E1$m@Tt7{E^KU^G!CwG@x8ckDT9{Xm||m}G97vG?Qs z+r64&JBT%nv<)dKIV~ zX1r@@P5nJ zMK1gmp0h)PTNh7%L6nF{01suK?7FvrK`v=q>%)SqChHy7D5)}U8tXP9OXDLw%{-PsJ=00%1zk*U`snY&e`IM`1L|!$E zFx_rIieHTz;SWK{`GWyc(uOPs-kD_Zr?XHz>VZ8p{biT16Y6|!5wUK~-H1+GT`19H z7!UzDj**(d&p?ojTvpPYaT+^eUlm-4WDC0|sBackr>J#Cx4bQ1{5D)t#5GjLrOcE3 z$>gUaik&Ba`m<(<%m0pktmGnmR?W(D?wrW}2V0pN7u34*%I|qn6GAblE=n4V-IG2E zfKuoLn14R5xI64q0XDxy3oNRYN&~(P31cYRR=p8|!BbmoLJkrJd^`C*ZyhMQ6f5b4 zrY=oE1L$`~*Bpkgn3R2q8W2bNO^PAqwyN_pm*;j`1C$nrl@0Nd?Av9h`fm7mGB_V~ z(@TZeGPYd7S(M!J55vH(#xbhrb)UD$_qb|R{haogdL^;IOKFb&P^??Sj{V8H|?*7ju6uKVYi`X;TLXsb?}EHrC|YNHzyR2EoIsjehgkIuF1UXgL+r% z_s&Zuj?D$94cV*MT01hqzM5SE7M*{sie;!jAi31yH+UMA#FyGc3778?&ZRoq2&F(5 z+?LXTS7}O8XmiLY7(S`vg1yWBa_UHUzrGGdA74d#5l#deae?it`(`b<1~A!+%=af4 z&XBCBoG&P#EXUnTLIouU3|CBNxY3E@cyttzOLv}J<>C*Z;9Dyhu6n%FDFvqOkWVo( zUNd``rJz%~Jr;Q2$54>KmtmDBc2$@BzUEiDacWcDZ>$}*{chUuxs7s`EX^I+()n1z zy!mwPz@XQ4sFaZ*8@mtRnnfo#snY$z`)AbYGE~mWg$}6{Ia)C{pM)Kr4cQdvu5Enu z`c}@Ia;o1HRdd>CfJ#V(M30lz?PrHXKJ}T_oZvgmP5B6GHKbfT-7$J&g}WG#@dvDT z2*i@PKK)yW>wwn&J30J&B@TlHwV)5U-yM81;k>?i#^o{s_D5(lCy93q5!)w=hC0q8 zP^E~H8+@zVZdA~#)4VXU8}MSp(^zF{wJfe4e{v)zKk(AarHtQ`Z#g9HEcCp%IP#=S zOwu&BmZU)%J-gw~DSbymz`k*F9&KoB9Jju1lWvL1tLd|9%(9J+NI~D%i;f^}v0N_& zv@~Y&YT(t85l$PYN1xardC^}U4Qr)j8Yfmrr+dx#+|g=!`!hLdjYUU9J&(mRNyvZm z%nB>qP5KU@CKBBG+ydPC4&YU*z27+CKY}SeFTG2Q@BHU76B49%uZiK&e!E$$TF;+t%<1&Atsi3QtT7ocw;S-reCu7I=K~DU7(iYGwfM z{(nlj@^C2E_dnXCD2}8kLeXilWXm>WO(L?DWu{1DUlKCRj1HlYuS)hNAv=X3>r_t2 zGRiV@5JO>@v6QjRV&?aZI@h_*b^ZSMUccY`^}Nq|zwbMr`@Wz1y`N8+I&je=t>YL8 z$0GulFJ?yN^L+26yJ>Vd(6$z1jbC^cC03YP*mU=b1wI;(VptVvn1@31Dq5{P^^OiP z5*r=@pMEsA|5VpP84+44U?%mkN~iQiuSV3f*ORR=)_cWplBEUYm`}HV#VF8Sz@Z@x z0=qtOK2NuB2XF!(1Ww)urJ@;CnSo0t*j>+g{ckLRn1-LQ;l>jM5Nj|3?s%-6d~jNBBjWP%mQMF)jQl{`iB8y%;_SRq=?9tCqAeRP zUu#>G4jhXM#IGfiVdjhBS}o2ZN{wp`ez1q6^7ypTh|yZ`5KtL!c9}HINtta5c+6!} zz*d=M4~1vBZZj1|HV5A+D#^KZcOEPl@M`rRMBU$&8_^b^)TAMeuCL#Py*m;%M$ru! z3LKbZG_p_iondC%D<4u1=Tzt?41{3m13)=GrYth6&%3T^iAWmaVlH)g9ABE?w>Hi% zgLpd-tm%oW2MjA8o7u4q%if19#nbm1l6d}8YVk*qn06;{;ELnbIku}bkPz%`o|^W+ zo!9pTi9Z;|m&$n_vp3y&`s9qf$BiXyik*XF1`zaRV!zDh2F>F-N1JwHH=T6V@oFZN z+gb0qYoa>S{YEaX;ta5x?wp=Bc2-XzW6}1{q$};x5xzLe-SX_~P63z(`$@lAjAM6g zVg9F)+aJoZue&TCxj>u0RQFy#Mj{$HmbNpKdD+SpxI~+?*p$c`iRede41FqPWFUxI zXSla(Ruez~(+8i9(b_CVqb-+Y_VI=Msg(O`gRBuc4(HA z6^Khy=j`){%;=E&GbN|b`*8n=%+`;ZcG7lVw`OrGG0c|slfQrM(yU1oQAs_dDxkOf?DthX zFEem*x9U*iQNFA0*!k$Z@&x|&N#FHX^udUEF{jV`lt@p1{~_8T-!O=BwAwm2!!TnuS9nlh#D5fEoDnQf88t5n&NQvJ>q-A zF!SP0O9hK{L0FpbW(TteXO-;TvFfpMew%3aq^ZiNW#~?*-jM{s#LS{yxx)ne0ofic z?1tx@Dy8IuMKA&WXrzybAPCHtFVOiv`Nmj(cp!*<+6JYMpLI={kh_z`TP2D3gt67L z7ACX&)F&-9%~q}DqD!hQEHpU}hy$0exbPF7eyHiGb$*_vDQdCWQ7Hq}9KUNe`A$^of+PHToNB43k|Afz6H7albfCs>A!OCkcSUJYK zq}10k2lEN=rwDMw{k>>)wMeR!1wM`Up8A3bDp=uS`N#+Ha|iLG>8Yv`tZ0M-K^Z89 zuog5g?g0P?4vanKCgxW)bOP1je6u_qoQ`xyud1Z33??y#+U1$e4(%tm4O5GCEZ6ER zdbQe5Y0u_Ush^k@uP=Hm8*HLo9=OVu&+r|_5S2Dzg9~oNPGh{-HenIe%0NymYovgZ z?S5h}R<<9bGL5=_{+q?c4K)T|JYZoNCuiXC?HwgWkgv{B#V59T?mTkNWH8S|&)i(U87uce4qB^T7{= zAWgyj zau=vWa%oE1;~752#tRadk78nJqQ#C%Kv$$$*8#E2#*hQmjt}A^8L!1LHB{t_WoiKt z%KD885Z>~m+)OVbCB7p~I^suRX@$atN|^V2wNkD>kT0Nlr3fK@e{&$&K19z3xzd*g zC7I;%4aD}wVcF%rV_Yqf@Sqe;c>GbmA+)QMB=n-~PM*XtIa%3cq0(Ju#KFg4%ZP!8 zn-3ndtOn9d)h5Hyb01RpuKHm8US*Y8Se~u&T?c197A5}!MBdT(v0)%at}FJ^6#Z9? zPPp&7Gtdn}*iH&r^N7!4aL%0VfY7~GimLNoJFzk21|K%|lD;Sl#ih?8CMOgyCj<1T zL#N*z{#>%1+93bN7VLESB|W*^#s>=~Yf;%8X}Rj)>Iw#t5BxKz4h-6D_PE*JkpzSw@9NR7HI-(% zh%237?!Z^m?w3mcRXvqvLiU&P3PWs`je4av>PPuGRJ{l^E;&1NCV)(@Dx8k2poZwZ zLUeH@kgGG4Q0ev3eg&HLhR3Cz@P)g2&K$?oknJc0Nz{?7!@+t}MP|ns+1XsNW|$Lc zn8Ls6TaTC-%7fRi-ok}05!KmX#-dDSzC=fEH3S(i&fpN0|dZL~q*dGAzF2&5+h zc0y(#;A(3jFI?Q3q7mL}@zbZwYN8Z)&#O)x&j5u!#G1FHK?2ftAMh;0|L(lsr1|#? zn`@kYfV6!=go-{yo}^mZEDx2xAKPAO{&}&32XHCOP1@Z!zcFroM_4=g*8CaUi&Mq4 zhSiL6ewav6Db01ne$XEG;yq6Ul0J$Y_iP9`ZniZfq}iwO9bIYpFvE!z2^51XyPLRG z|M2Drp=X%f#SZYqY1o#AQRPi=+tY4Cs(<%IpmqIpu1lmZ1hV&~PF|?}Xb!2Pij!>o&k% zj&LVHc_tE3Mr%tG)D0J*FJ@vUuqIBXSXJUmIjE}lT&={I?MT+PmXbR7dy}G^n^Px+ zJ1(hnv(^2QHjC%%y5xg97-qHoycP1JEZLaGs2W+vU@`%hWh0-HPx zY_ejG3Ohv!L=h``c}VPF7fyo#w|HtjmB4i-XKMBy5TTcc(+39Z%Yx=Y>X{W-TU|DHR}Gu#PQ+UBEyHAMUU)0l_#{-MDbFBi>-P%k>^FP_tVkAZcE zlKe|cOHW~a>MXMG(@=4dBXB&~mq%-GI|=s%=6bu&e0p!PmZ@?6_wpcC>qefLR7ztD z7p1<@@8l?!j(^rr@|L|aV84C3vasTWS`g{^a%m!XYE~kZ|yU76{ zoCmlBRWSRm11=plb}M?l@AGhFS%{ZwvV#-r1G_612k*uo`dQ3{r*1Qu$(@K39=yKk zx+gI-CI24;geU6$;j0jYdQ4C)t^(IU+ zZ4PY#%m8}pza=8?=?M9vF3lk?><3geC)q0|g;Hds8_5>7EWxm3@rVjWd1M~+&S{>J5^QDQ29XV0%$<(Tgu+cBKN&E(@49Z!v2usMOXNl-T+F*pTE~FlECh zN7DTbr^AL0R~B&!Hp!feF-7YPlGcq6fcJ~J#*gN)qIk8woWBX4NPVw4u6eA=FHO98 zPuwdo6Y&)C8+KVRy%GJRx`q5Lnug&7p0wOKO7c)iSJsOv&q8X|4?2;~n9B2O1T3*W z3`|W;!vHgu;)cMER}QplS6rPF)^Dg%lDn$W!Z@aX3$^s-}WVe1Amituz=VMRfVE{y! zV1*3X1FF4$rAaApB%7ntmRXUPCo=(++^YrImR<#uijNdd(<0Lu?J@~itcujV=6hV% zbZ_up;2^g7>Pw-lTFH^eF9LMF(B|RrqAE%y^215X?_B9Kh}_w_t<3STMO7P8u&Yms zUDGx$bK_=~xE0iHm9g+m(H~}NYT8X(%PL1Jdxdi472ygiAoYh#K%`f0m{+qjf2=T@ zzGQ>Eoo*5!EdA$$-`pPf_hWA5?>cZ`^{lN@P)FkjLkz*{y70HHloGTS=eyC~RHNxr zYTUIZ#!WI=$EM{+^5Ui2%_z*GvDOWOVQ@$Gz0LYs?hX6$F#X+opTGOg2r)(fqen*!HbV#{8Ee9tLoOw~4JxRJvZpud;O^)-~6LpiVSw~*1;w&$r1ypM+U znjYKadhT{mF8NQFRzpuGV$-84(e! z$x}HxF^Hzuasj9==S00q)g*2tJ1CsyJmyBYJdpC{ic z^ETAx1+llnIo{W6&pj-zDp*~zqm!D^5ChAyI)}@gJ7FtUC2pcf(4nCbser0D*O|!JbbmPh>i)xpV?n089}S^ z;OyD^kj7E}rtp`+PI{6fVtHJ3V<67L>#nHKgI#CO`D~`nOruDgV)? z!{Yl}PP%uc=soi>p{{(p7Jv_WRY!hvYyNVRj+F0cs!y5~u>huDmDk#~E}G_E+?>5< zbyXo#Q%Bo3AEy7c3-k4di_fFN9T4xLCjy?v*=o=5oF*IMQ@QX*&7Qpbt8r3z+&$m1 zi{ytVd~LtyaN7ZIMP6Ka(eG~>diyM~jB;-5jz3wi)VM|*W*RZ!adjjW z^l5uMXCj9=blVj@r|eVW*4N+bQaGAu)u@$ZyA`5t>$H{GlN7+uOq@EZ7a6D|RbF0D zJvlrd`t9?u6LNig?7*WOefuUZC0000&P)t-s|NsB& z>*sS9EjKeX7Zn!E#=#pTM_E@_fO~oi1q~P+85aZ|5(pMFG(sL8GE`Jyh$JngFDVTS z8H$RY!okVw>+6gM_BsFn00DGTPE!Ct=GbNc00549R9JLGWpiV4X>fFDZ*Bkpc$`yK zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+ zH!-gyvsj6XGbOXA7^I7fGp#5wHxxr_vrIzCM6dgpC0J004}sRw^syST4wk4W=j?msQTPJ#zg`tyqRP!P)EoUd#OFL0RN_H(lh z!eFY11#DqHz}|v`4T$<1XPrI70*68hFQA(bqyozMKoC&P2T}p$d>{y@<^!pKay}3Q zRHOpBoDBuI4LXCke>o?u*jAwBzi?F#1ENUzPyqk{00000fSLX%+J5X;2>C356Pd`; zpK>7sUBn!|Cyp=wj>(2-oxTFYI|AJ5bB8hAR9at-zxq_1NOjc$jwaie<*f5BaK@o0r<>%FS|;+#Ogh&2LWc9YS}$MRsvL zgG`I;A^-pY008*^9M9Rsizw`JCSQb^!wcDW=l*yV30&#-bLQ}e2#{~|kH!8b61dR= r0_N~Sb^;-uZ7`>ry8-|J06vs&yk!sG^vuou00000NkvXXu0mjfL+E3= literal 28260 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 4 && get_dist(user,target) < reach)) + return + + + var/total_dist = get_dist(user, target) + additional_distance + + var/list/path = get_path_to(user, target, total_dist) + if(!length(path) || length(path) > total_dist) + COOLDOWN_START(src, ensnare, 5 SECONDS) // womp womp + return + + tracked_component = movable.AddComponent(/datum/component/leash, src, total_dist, beam_icon_state = "razorwire", beam_icon = 'icons/effects/beam.dmi', force_teleports = FALSE) + leashed_atom = movable + user.visible_message(span_danger("[user] ensnares [movable] in razorwire tethering them!")) + var/tether_time = 10 SECONDS + if(isitem(movable)) + tether_time *= 2 + + addtimer(CALLBACK(src, PROC_REF(disconnect)), tether_time) + COOLDOWN_START(src, ensnare, 40 SECONDS) + +/obj/item/melee/razorwire/proc/disconnect() + if(!tracked_component) + return + QDEL_NULL(tracked_component) diff --git a/tgstation.dme b/tgstation.dme index 8270c8121a56..6644f6de52d0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6151,6 +6151,7 @@ #include "monkestation\code\modules\cybernetics\implant_items\autosurgeons.dm" #include "monkestation\code\modules\cybernetics\implant_items\cyberlink_connector.dm" #include "monkestation\code\modules\cybernetics\implant_items\weapons\mantis_blade.dm" +#include "monkestation\code\modules\cybernetics\implant_items\weapons\razorwire_spool.dm" #include "monkestation\code\modules\cybernetics\minigame\hacking_minigame.dm" #include "monkestation\code\modules\cybernetics\premade_storages\antags.dm" #include "monkestation\code\modules\cybernetics\skills\implant_hacking.dm" From 2d54ead6b08a862a0fe8068ed17df363cd647be7 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Mon, 26 Feb 2024 03:09:39 -0500 Subject: [PATCH 11/81] simpler times --- .../cybernetics/implant_items/weapons/razorwire_spool.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/monkestation/code/modules/cybernetics/implant_items/weapons/razorwire_spool.dm b/monkestation/code/modules/cybernetics/implant_items/weapons/razorwire_spool.dm index 1b44f56a7986..c651cb01fb89 100644 --- a/monkestation/code/modules/cybernetics/implant_items/weapons/razorwire_spool.dm +++ b/monkestation/code/modules/cybernetics/implant_items/weapons/razorwire_spool.dm @@ -49,9 +49,7 @@ var/total_dist = get_dist(user, target) + additional_distance - var/list/path = get_path_to(user, target, total_dist) - if(!length(path) || length(path) > total_dist) - COOLDOWN_START(src, ensnare, 5 SECONDS) // womp womp + if(!CheckToolReach(user, target, 4)) return tracked_component = movable.AddComponent(/datum/component/leash, src, total_dist, beam_icon_state = "razorwire", beam_icon = 'icons/effects/beam.dmi', force_teleports = FALSE) From a38d0b4b217f3cc4a035029e597e85980f77fa06 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sat, 16 Mar 2024 17:28:38 -0400 Subject: [PATCH 12/81] Update monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm Co-authored-by: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> --- .../cybernetics/augments/arm_augments/item_sets/_base.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm index b7cc51fed36b..7fb07ba56c82 100644 --- a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm @@ -33,6 +33,9 @@ return ..() /obj/item/organ/internal/cyberimp/arm/item_set/update_implants() + if(QDELETED(active_item)) + return + if(!check_compatibility()) Retract() From 59da1484774c9cb6222c2ccc6cb6fc71721bc5b4 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sun, 31 Mar 2024 00:30:35 -0400 Subject: [PATCH 13/81] Update autosurgeons.dm --- .../code/modules/cybernetics/implant_items/autosurgeons.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm b/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm index b9b6c985a604..86f912b416ad 100644 --- a/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm +++ b/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm @@ -29,7 +29,6 @@ /obj/item/autosurgeon/skillchip/syndicate name = "suspicious skillchip autosurgeon" - icon_state = "syndicate_autoimplanter" /obj/item/autosurgeon/skillchip/Initialize(mapload) . = ..() From ba3ce72f41dced60f2ecd4211eab69fff8445450 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sun, 31 Mar 2024 00:31:53 -0400 Subject: [PATCH 14/81] icon fixes --- .../modules/cybernetics/augments/arm_augments/item_sets/jobs.dm | 1 + .../code/modules/cybernetics/augments/leg_augments/chemplants.dm | 1 + monkestation/code/modules/cybernetics/skills/implant_hacking.dm | 1 + 3 files changed, 3 insertions(+) diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm index 316d1369c4cf..7e0f2984a81a 100644 --- a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/jobs.dm @@ -143,6 +143,7 @@ /obj/item/organ/internal/cyberimp/arm/item_set/connector name = "universal connection implant" desc = "Special inhand implant that allows you to connect your brain directly into the protocl sphere of implants, which allows for you to hack them and make the compatible." + icon = 'monkestation/code/modules/cybernetics/icons/surgery.dmi' icon_state = "hand_implant" implant_overlay = "hand_implant_overlay" implant_color = "#39992d" diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm b/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm index ec4f7badb57b..b0fd15104af2 100644 --- a/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm +++ b/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm @@ -1,6 +1,7 @@ /obj/item/organ/internal/cyberimp/leg/chemplant name = "Debug Chemplant" desc = "You shouldn't see this!" + icon = 'monkestation/code/modules/cybernetics/icons/surgery.dmi' icon_state = "chemplant" implant_overlay = "chemplant_overlay" var/list/reagent_list = list() diff --git a/monkestation/code/modules/cybernetics/skills/implant_hacking.dm b/monkestation/code/modules/cybernetics/skills/implant_hacking.dm index 94b2a8d74595..bd1a2bf5e140 100644 --- a/monkestation/code/modules/cybernetics/skills/implant_hacking.dm +++ b/monkestation/code/modules/cybernetics/skills/implant_hacking.dm @@ -15,5 +15,6 @@ /obj/item/clothing/neck/cloak/skill_reward/hacker name = "legendary hacker's cloak" desc = "Worn by the most skilled of cybernetic hackers, wearing this proves you were able to conquer protocol, and hack any cybernetic. You are not sure if openly wearing an item of clothing that says 'I'm a master in breaking security protocols' is a good idea." + icon = 'monkestation/code/modules/cybernetics/icons/cloaks.dmi' icon_state = "hackercloak" associated_skill_path = /datum/skill/implant_hacking From dbdf9099fa9dddfd260e3520ed1980930af684c7 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sun, 31 Mar 2024 01:15:11 -0400 Subject: [PATCH 15/81] adds aftermarket sandevistian --- .../cybernetics/augments/chest_augments.dm | 24 ++++++++++++++++++- .../black_markets/aftermarket_implants.dm | 20 ++++++++++++++++ .../cybernetics/minigame/hacking_minigame.dm | 2 +- tgstation.dme | 1 + 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 monkestation/code/modules/cybernetics/black_markets/aftermarket_implants.dm diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm index dc328392909f..965b3cf1d2f1 100644 --- a/monkestation/code/modules/cybernetics/augments/chest_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -24,6 +24,7 @@ /// The bodypart overlay datum we should apply to whatever mob we are put into visual_implant = TRUE bodypart_overlay = /datum/bodypart_overlay/simple/sandy + var/cooldown_time = 45 SECONDS /obj/item/organ/internal/cyberimp/chest/sandevistan/ui_action_click() if((organ_flags & ORGAN_FAILING)) @@ -33,7 +34,7 @@ if(!COOLDOWN_FINISHED(src, in_the_zone)) to_chat(owner, span_warning("The implant doesn't respond. It seems to be recharging...")) return - COOLDOWN_START(src, in_the_zone, 45 SECONDS) + COOLDOWN_START(src, in_the_zone, cooldown_time) owner.AddComponent(/datum/component/after_image, 16, 0.5, TRUE) owner.AddComponent(/datum/component/slowing_field, 0.1, 5, 3) @@ -50,3 +51,24 @@ icon = 'monkestation/code/modules/cybernetics/icons/implants.dmi' icon_state = "sandy_overlay" layers = EXTERNAL_ADJACENT + + +/obj/item/organ/internal/cyberimp/chest/sandevistan/refurbished + name = "refurbished sandevistan" + desc = "The branding has been scratched off of these and it looks hastily put together." + + cooldown_time = 65 SECONDS + +/obj/item/organ/internal/cyberimp/chest/sandevistan/refurbished/ui_action_click(mob/user, actiontype) + if(prob(45)) + if(iscarbon(user)) + var/mob/living/carbon/carbon = user + carbon.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) + to_chat(user, span_warning("You are overloaded with information and suffer some backlash.")) + . = ..() + +/obj/item/organ/internal/cyberimp/chest/sandevistan/refurbished/exit_the_zone(mob/living/exiter) + . = ..() + exiter.adjustBruteLoss(10) + to_chat(exiter, span_warning("Your body was not able to handle the strain of [src] causing you to experience some minor bruising.")) + diff --git a/monkestation/code/modules/cybernetics/black_markets/aftermarket_implants.dm b/monkestation/code/modules/cybernetics/black_markets/aftermarket_implants.dm new file mode 100644 index 000000000000..496572c20ba5 --- /dev/null +++ b/monkestation/code/modules/cybernetics/black_markets/aftermarket_implants.dm @@ -0,0 +1,20 @@ +/datum/market/auction/aftermarket_parts + name = "Aftermarket Implants" + +/datum/market_item/auction/shoddy_implant + markets = list(/datum/market/auction/aftermarket_parts) + stock_max = 1 + availability_prob = 100 + category = "Arm Augment" + auction_weight = 5 + +/datum/market_item/auction/shoddy_implant/chest + category = "Chest Augments" + +/datum/market_item/auction/shoddy_implant/chest/sandevistan + name = "Refurbished Sandevistan" + desc = "A refurbished Sandevistan, has some issues but with how hard these are to get is worth it." + item = /obj/item/organ/internal/cyberimp/chest/sandevistan/refurbished + + price_min = CARGO_CRATE_VALUE * 2 + price_max = CARGO_CRATE_VALUE * 3 diff --git a/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm index f741d0ea6d7e..87a87bf9b736 100644 --- a/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm +++ b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm @@ -3,7 +3,7 @@ * Piping minigame, controls the board and procs surrounding it * * Holds all relevant information regarding the piping minigame - * Contains the procs needed to generate the game, check if the game is finisehd and rotate any pieces. + * Contains the procs needed to generate the game, check if the game is finished and rotate any pieces. * */ /datum/hacking_minigame diff --git a/tgstation.dme b/tgstation.dme index 00288d26feea..82d959a2c3c2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6209,6 +6209,7 @@ #include "monkestation\code\modules\cybernetics\augments\leg_augments\_base.dm" #include "monkestation\code\modules\cybernetics\augments\leg_augments\chemplants.dm" #include "monkestation\code\modules\cybernetics\augments\leg_augments\traits.dm" +#include "monkestation\code\modules\cybernetics\black_markets\aftermarket_implants.dm" #include "monkestation\code\modules\cybernetics\clothing\suits.dm" #include "monkestation\code\modules\cybernetics\components\slowing_field.dm" #include "monkestation\code\modules\cybernetics\designs\medical.dm" From 680198aa4600ee8bdc7512e529da8ed3b7b21b76 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Thu, 2 May 2024 23:51:43 -0400 Subject: [PATCH 16/81] Basic changes --- .../implant_items/cyberlink_connector.dm | 2 + .../cybernetics/minigame/hacking_minigame.dm | 2 +- .../code/modules/smithing/ipcs/species.dm | 2 +- tgui/packages/tgui/interfaces/Hacking.js | 43 +++++++++++++------ 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm index c04689f5df77..9d40ee3d118a 100644 --- a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm +++ b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm @@ -132,6 +132,8 @@ for(var/datum/hacking_minigame/game in game_list) data["games"] += list(game.get_simplified_image()) + data["finished_states"] += list(game.finished) + return data /obj/item/cyberlink_connector/ui_interact(mob/user, datum/tgui/ui) diff --git a/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm index 87a87bf9b736..2a0ed11f66f5 100644 --- a/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm +++ b/monkestation/code/modules/cybernetics/minigame/hacking_minigame.dm @@ -10,7 +10,7 @@ var/finished = FALSE - var/board_size = 16 + var/board_size = 8 var/list/datum/hacking_minigame_piece/board diff --git a/monkestation/code/modules/smithing/ipcs/species.dm b/monkestation/code/modules/smithing/ipcs/species.dm index 3c19a1a42b82..7c58adde3a4f 100644 --- a/monkestation/code/modules/smithing/ipcs/species.dm +++ b/monkestation/code/modules/smithing/ipcs/species.dm @@ -37,7 +37,7 @@ ) mutant_organs = list( - /obj/item/organ/internal/cyberimp/arm/power_cord, + /obj/item/organ/internal/cyberimp/arm/item_set/power_cord, ) external_organs = list( /obj/item/organ/external/antennae/ipc = "None" diff --git a/tgui/packages/tgui/interfaces/Hacking.js b/tgui/packages/tgui/interfaces/Hacking.js index 1e49ced1ad4e..712d08ad267d 100644 --- a/tgui/packages/tgui/interfaces/Hacking.js +++ b/tgui/packages/tgui/interfaces/Hacking.js @@ -1,26 +1,41 @@ import { useBackend } from '../backend'; -import { Section, Box, TimeDisplay } from '../components'; +import { Section, Box, Flex, TimeDisplay } from '../components'; import { Window } from '../layouts'; import { resolveAsset } from '../assets'; export const Hacking = (props, context) => { const { act, data } = useBackend(context); - const { timeleft, games = [[[]]] } = data; + const { timeleft, games = [[[]]], finished_states = [] } = data; + let found_valid = 0; return ( - +
- {games.map((game, i) => ( -
- {'[TIME LEFT: '} - - {']'} - -
- ))} + {'[TIME LEFT: ['} + + {']'} + + {games.map((game, i) => { + if (finished_states[i] === 0 && !found_valid) { + found_valid = 1; + return ( +
+ +
+ ); + } else { + return null; + } + })} +
From 3762f4691061c141dac6a5281a6186e586b0f289 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 00:17:36 -0400 Subject: [PATCH 17/81] more fixes --- code/datums/components/leash.dm | 10 ++- .../augments/arm_augments/unsorted.dm | 1 + .../cybernetics/implant_items/autosurgeons.dm | 28 +++---- .../implant_items/cyberlink_connector.dm | 76 +++++++++++++++---- 4 files changed, 86 insertions(+), 29 deletions(-) diff --git a/code/datums/components/leash.dm b/code/datums/components/leash.dm index de2ddcb608e8..fa1fce6a1106 100644 --- a/code/datums/components/leash.dm +++ b/code/datums/components/leash.dm @@ -17,6 +17,7 @@ var/beam_icon var/list/beams = list() var/force_teleports + var/datum/callback/break_callback VAR_PRIVATE // Pathfinding can yield, so only move us closer if this is the best one @@ -32,7 +33,8 @@ force_teleport_in_effect, beam_icon_state, beam_icon, - force_teleports = TRUE + force_teleports = TRUE, + break_callback, ) . = ..() @@ -63,6 +65,7 @@ src.beam_icon_state = beam_icon_state src.beam_icon = beam_icon src.force_teleports = force_teleports + src.break_callback = break_callback RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(on_owner_qdel)) @@ -90,6 +93,9 @@ SIGNAL_HANDLER PRIVATE_PROC(TRUE) + if(break_callback) + break_callback.Invoke() + qdel(src) /datum/component/leash/proc/on_owner_moved(atom/movable/source) @@ -166,6 +172,8 @@ PRIVATE_PROC(TRUE) if(!force_teleports) + if(break_callback) + break_callback.Invoke() qdel(src) var/atom/movable/movable_parent = parent diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm index 98808c47a466..c6824eca7846 100644 --- a/monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/unsorted.dm @@ -104,6 +104,7 @@ /obj/item/organ/internal/cyberimp/arm/ammo_counter name = "S.M.A.R.T. ammo logistics system" desc = "Special inhand implant that allows transmits the current ammo and energy data straight to the user's visual cortex." + icon = 'monkestation/code/modules/cybernetics/icons/surgery.dmi' icon_state = "hand_implant" implant_overlay = "hand_implant_overlay" implant_color = "#750137" diff --git a/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm b/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm index 86f912b416ad..87c680e6044f 100644 --- a/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm +++ b/monkestation/code/modules/cybernetics/implant_items/autosurgeons.dm @@ -44,38 +44,38 @@ /obj/item/autosurgeon/skillchip/attack_self(mob/living/carbon/user)//when the object it used... if(!uses) - to_chat(user, "[src] has already been used. The tools are dull and won't reactivate.") + to_chat(user, span_alert("[src] has already been used. The tools are dull and won't reactivate.") ) return if(!stored_skillchip) - to_chat(user, "[src] currently has no skillchip stored.") + to_chat(user, span_alert("[src] currently has no skillchip stored.") ) return if(!istype(user)) - to_chat(user, "[user]'s brain cannot accept skillchip implants.") + to_chat(user, span_alert("[user]'s brain cannot accept skillchip implants.") ) return // Try implanting. var/implant_msg = user.implant_skillchip(stored_skillchip) if(implant_msg) - user.visible_message("[user] presses a button on [src], but nothing happens.", "The [src] quietly beeps at you, indicating some sort of error.") - to_chat(user, "[stored_skillchip] cannot be implanted. [implant_msg]") + user.visible_message(span_notice("[user] presses a button on [src], but nothing happens.") , span_notice("The [src] quietly beeps at you, indicating some sort of error.") ) + to_chat(user, span_alert("[stored_skillchip] cannot be implanted. [implant_msg]") ) return // Clear the stored skillchip, it's technically not in this machine anymore. var/obj/item/skillchip/implanted_chip = stored_skillchip stored_skillchip = null - user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your brain.") + user.visible_message(span_notice("[user] presses a button on [src], and you hear a short mechanical noise.") , span_notice("You feel a sharp sting as [src] plunges into your brain.") ) playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, TRUE) - to_chat(user,"Operation complete! [implanted_chip] successfully implanted. Attempting auto-activation...") + to_chat(user,span_notice("Operation complete! [implanted_chip] successfully implanted. Attempting auto-activation...") ) // If implanting succeeded, try activating - Although activating isn't required, so don't early return if it fails. // The user can always go activate it at a skill station. var/activate_msg = implanted_chip.try_activate_skillchip(FALSE, FALSE) if(activate_msg) - to_chat(user, "[implanted_chip] cannot be activated. [activate_msg]") + to_chat(user, span_alert("[implanted_chip] cannot be activated. [activate_msg]") ) name = initial(name) @@ -90,19 +90,19 @@ return ..() if(stored_skillchip) - to_chat(user, "[src] already has a skillchip stored.") + to_chat(user, span_alert("[src] already has a skillchip stored.") ) return if(!uses) - to_chat(user, "[src] has already been used up.") + to_chat(user, span_alert("[src] has already been used up.") ) return if(!user.transferItemToLoc(I, src)) - to_chat(user, "You fail to insert the skillchip into [src]. It seems stuck to your hand.") + to_chat(user, span_alert("You fail to insert the skillchip into [src]. It seems stuck to your hand.") ) return stored_skillchip = I - to_chat(user, "You insert the [I] into [src].") + to_chat(user, span_notice("You insert the [I] into [src].") ) /obj/item/autosurgeon/skillchip/screwdriver_act(mob/living/user, obj/item/I) . = ..() @@ -110,7 +110,7 @@ return if(!stored_skillchip) - to_chat(user, "There's no skillchip in [src] for you to remove!") + to_chat(user, span_warning("There's no skillchip in [src] for you to remove!") ) return TRUE var/atom/drop_loc = user.drop_location() @@ -118,7 +118,7 @@ var/atom/movable/movable_content = thing movable_content.forceMove(drop_loc) - to_chat(user, "You remove the [stored_skillchip] from [src].") + to_chat(user, span_notice("You remove the [stored_skillchip] from [src].") ) I.play_tool_sound(src) stored_skillchip = null diff --git a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm index 9d40ee3d118a..863ec758f490 100644 --- a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm +++ b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm @@ -8,10 +8,25 @@ var/current_timer_id = FALSE var/obj/item/organ/internal/cyberimp/cybernetic var/mob/living/current_user + var/mob/living/linked_target + +/obj/item/cyberlink_connector/Initialize(mapload) + . = ..() + register_context() + +/obj/item/cyberlink_connector/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(linked_target) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Rip out cyberlink connection" + + return CONTEXTUAL_SCREENTIP_SET /obj/item/cyberlink_connector/Destroy() . = ..() parent_cyberlink = null + if(linked_target) + qdel(linked_target.GetComponent(/datum/component/leash)) + linked_target = null cleanup() ///We dont open the tgui when we click on this. @@ -29,7 +44,7 @@ if(!parent_cyberlink) var/obj/item/organ/internal/cyberimp/cyberlink/link = user.get_organ_slot(ORGAN_SLOT_LINK) if(!link) - to_chat(user," NO CYBERLINK DETECTED ") + to_chat(user,span_notice(" NO CYBERLINK DETECTED ") ) return parent_cyberlink = link @@ -50,7 +65,7 @@ break if(diffrences == 0) - to_chat(current_user," Cyberlink beeps: [uppertext(cybernetic.name)] ALREADY COMPATIBLE.") + to_chat(current_user,span_notice(" Cyberlink beeps: [uppertext(cybernetic.name)] ALREADY COMPATIBLE.") ) cleanup() return @@ -62,6 +77,33 @@ ui_interact(user) +/obj/item/cyberlink_connector/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!isliving(user)) + return + var/mob/living/target_living = target + var/obj/item/organ/internal/cyberimp/cyberlink/link = target_living.get_organ_slot(ORGAN_SLOT_LINK) + if(!link) + to_chat(user, span_notice("[target] doesn't have a cyberlink.")) + return + user.visible_message(span_notice("[user] begins to start plugging ")) + if(!do_after(user, 2 SECONDS, target)) + return + linked_target = target_living + target_living.AddComponent(/datum/component/leash, src, 3, beam_icon_state = "razorwire", beam_icon = 'icons/effects/beam.dmi', force_teleports = FALSE, break_callback = CALLBACK(src, PROC_REF(clear_target_link))) + parent_cyberlink = link + +/obj/item/cyberlink_connector/AltClick(mob/user) + . = ..() + if(!linked_target) + return + clear_target_link() + +/obj/item/cyberlink_connector/proc/clear_target_link() + if(linked_target) + qdel(linked_target.GetComponent(/datum/component/leash)) + linked_target = null + /obj/item/cyberlink_connector/proc/cleanup() current_user = null cybernetic = null @@ -70,37 +112,43 @@ current_timer_id = FALSE /obj/item/cyberlink_connector/proc/hack_success(success as num) + var/mob/living/to_display = current_user + if(linked_target) + to_display = linked_target for(var/info in cybernetic.encode_info) if(cybernetic.encode_info[info] == NO_PROTOCOL) continue //Not a += because we want to avoid having duplicate entries in either encode_info cybernetic.encode_info[info] |= parent_cyberlink.encode_info[info] current_user.mind.adjust_experience(/datum/skill/implant_hacking,success * 25) - to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] SUCCESS. COMPATIBILITY ACHIEVED.") + to_chat(to_display, span_notice("Cyberlink beeps: HACKING [uppertext(cybernetic.name)] SUCCESS. COMPATIBILITY ACHIEVED.")) cleanup() /obj/item/cyberlink_connector/proc/hack_failure(failed as num) var/chance = rand(0,40*failed) + var/mob/living/to_damage = current_user + if(linked_target) + to_damage = linked_target switch(chance) if(0 to 25) - to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MINOR FAILURE. COMPATIBILITY NOT ACHIEVED. NO DAMAGE DETECTED.") + to_chat(to_damage,span_warning(" Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MINOR FAILURE. COMPATIBILITY NOT ACHIEVED. NO DAMAGE DETECTED.") ) if(26 to 40) - to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MEDIUM FAILURE. COMPATIBILITY NOT ACHIEVED. SMALL AMOUNT OF DAMAGE DETECTED.") - current_user.adjustFireLoss(10) - current_user.emote("scream") + to_chat(to_damage,span_warning(" Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MEDIUM FAILURE. COMPATIBILITY NOT ACHIEVED. SMALL AMOUNT OF DAMAGE DETECTED.") ) + to_damage.adjustFireLoss(10) + to_damage.emote("scream") if(41 to 50) - to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MEDIUM FAILURE. COMPATIBILITY NOT ACHIEVED. PROTOCOL SCRAMBILING DETECTED.") + to_chat(to_damage,span_warning(" Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MEDIUM FAILURE. COMPATIBILITY NOT ACHIEVED. PROTOCOL SCRAMBILING DETECTED.") ) cybernetic.random_encode() if(51 to 75) - to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MAJOR FAILURE. COMPATIBILITY NOT ACHIEVED. MINOR ELECTROMAGNETIC PULSE DETECTED.") - empulse(current_user, 0, 1) + to_chat(to_damage,span_danger(" Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MAJOR FAILURE. COMPATIBILITY NOT ACHIEVED. MINOR ELECTROMAGNETIC PULSE DETECTED.") ) + empulse(to_damage, 0, 1) if(76 to 99) - to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MAJOR FAILURE. COMPATIBILITY NOT ACHIEVED. MAJOR ELECTROMAGNETIC PULSE DETECTED.") - empulse(current_user, 1, 2) + to_chat(to_damage,span_danger(" Cyberlink beeps: HACKING [uppertext(cybernetic.name)] MAJOR FAILURE. COMPATIBILITY NOT ACHIEVED. MAJOR ELECTROMAGNETIC PULSE DETECTED.") ) + empulse(to_damage, 1, 2) if(100 to INFINITY) - to_chat(current_user," Cyberlink beeps: HACKING [uppertext(cybernetic.name)] CRITICAL FAILURE. COMPATIBILITY NOT ACHIEVED. IMPLANT OVERHEATING IN 5 SECONDS.") - cybernetic.visible_message("[cybernetic.name] begins to flare and twitch as the electronics fry and sizzle!") + to_chat(to_damage,span_danger(" Cyberlink beeps: HACKING [uppertext(cybernetic.name)] CRITICAL FAILURE. COMPATIBILITY NOT ACHIEVED. IMPLANT OVERHEATING IN 5 SECONDS.") ) + cybernetic.visible_message(span_danger("[cybernetic.name] begins to flare and twitch as the electronics fry and sizzle!") ) addtimer(CALLBACK(src, PROC_REF(explode)), 5 SECONDS) current_user.mind.adjust_experience(/datum/skill/implant_hacking,(4 - failed)*2) cleanup() From 53f4cb94f945b8b4a54cc3c45df1be9caab98902 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 00:27:09 -0400 Subject: [PATCH 18/81] adds sounds and closes the ui for users --- .../cybernetics/implant_items/cyberlink_connector.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm index 863ec758f490..b3e4a0532de0 100644 --- a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm +++ b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm @@ -122,7 +122,10 @@ cybernetic.encode_info[info] |= parent_cyberlink.encode_info[info] current_user.mind.adjust_experience(/datum/skill/implant_hacking,success * 25) to_chat(to_display, span_notice("Cyberlink beeps: HACKING [uppertext(cybernetic.name)] SUCCESS. COMPATIBILITY ACHIEVED.")) + say("Successfully hacked augment.") + playsound(src, 'sound/machines/terminal_success.ogg', 50) cleanup() + ui_close(current_user) /obj/item/cyberlink_connector/proc/hack_failure(failed as num) @@ -152,6 +155,9 @@ addtimer(CALLBACK(src, PROC_REF(explode)), 5 SECONDS) current_user.mind.adjust_experience(/datum/skill/implant_hacking,(4 - failed)*2) cleanup() + say("Failed to hack augment.") + playsound(src, 'sound/machines/terminal_error.ogg', 50) + ui_close(current_user) /obj/item/cyberlink_connector/proc/explode() SIGNAL_HANDLER From 2d212a8324f6df882da15c8007fbd6351592a7c1 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 00:27:38 -0400 Subject: [PATCH 19/81] Update cyberlink_connector.dm --- .../modules/cybernetics/implant_items/cyberlink_connector.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm index b3e4a0532de0..3524f4b8dd23 100644 --- a/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm +++ b/monkestation/code/modules/cybernetics/implant_items/cyberlink_connector.dm @@ -124,8 +124,8 @@ to_chat(to_display, span_notice("Cyberlink beeps: HACKING [uppertext(cybernetic.name)] SUCCESS. COMPATIBILITY ACHIEVED.")) say("Successfully hacked augment.") playsound(src, 'sound/machines/terminal_success.ogg', 50) - cleanup() ui_close(current_user) + cleanup() /obj/item/cyberlink_connector/proc/hack_failure(failed as num) @@ -154,10 +154,10 @@ cybernetic.visible_message(span_danger("[cybernetic.name] begins to flare and twitch as the electronics fry and sizzle!") ) addtimer(CALLBACK(src, PROC_REF(explode)), 5 SECONDS) current_user.mind.adjust_experience(/datum/skill/implant_hacking,(4 - failed)*2) - cleanup() say("Failed to hack augment.") playsound(src, 'sound/machines/terminal_error.ogg', 50) ui_close(current_user) + cleanup() /obj/item/cyberlink_connector/proc/explode() SIGNAL_HANDLER From 3b5abbcd52a723a3f4a12bfe850dce3ed1f83d74 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 00:34:32 -0400 Subject: [PATCH 20/81] bam --- _maps/RandomRuins/SpaceRuins/caravanambush.dmm | 2 +- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index 9641778ac2cf..354f3c2398bf 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -562,7 +562,7 @@ "tL" = ( /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/secure/engineering, -/obj/item/organ/internal/cyberimp/arm/toolset, +/obj/item/organ/internal/cyberimp/arm/item_set, /obj/item/organ/internal/cyberimp/eyes/hud/medical, /obj/item/organ/internal/cyberimp/brain/anti_stun, /turf/open/floor/iron/dark/airless, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 09751e3f4faa..f47c4f8f0009 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -4686,7 +4686,7 @@ pixel_x = 17; pixel_y = 12 }, -/obj/item/organ/internal/cyberimp/arm/toolset{ +/obj/item/organ/internal/cyberimp/arm/item_set{ pixel_y = 2; pixel_x = 6 }, From fdad8645c712bdd5dd487fe42c37e3fe7f5f4bef Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 13:45:46 -0400 Subject: [PATCH 21/81] chem vat and drills --- ...reenshot_humanoids__datum_species_apid.png | Bin 0 -> 1123 bytes .../augments/arm_augments/item_sets/jobs.dm | 32 +++- .../arm_augments/item_sets/weapons.dm | 85 +++++++++++ .../cybernetics/augments/chest_augments.dm | 139 ++++++++++++++++++ .../augments/leg_augments/chemplants.dm | 12 -- .../cybernetics/icons/drillimplant.dmi | Bin 0 -> 489 bytes .../icons/drillimplant_lefthand.dmi | Bin 0 -> 604 bytes .../icons/drillimplant_righthand.dmi | Bin 0 -> 603 bytes .../cybernetics/icons/implants_onmob.dmi | Bin 495 -> 2092 bytes .../cybernetics/implant_items/autosurgeons.dm | 10 ++ 10 files changed, 264 insertions(+), 14 deletions(-) create mode 100644 code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_apid.png create mode 100644 monkestation/code/modules/cybernetics/icons/drillimplant.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/drillimplant_lefthand.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/drillimplant_righthand.dmi diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_apid.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_apid.png new file mode 100644 index 0000000000000000000000000000000000000000..681285ed0579f1505618f8f700e4dc67c7f4071f GIT binary patch literal 1123 zcmV-p1f2VcP){4Lu&}UYZflF4 znl(5sQ%T`)rv$L~wcYt?$gHcag7Z(>RD=SAwM-dbhA|@sn92}>rw$#_( ziHo8nBq}W}Gt14YE62mqS@7!En1VMG7` z0~|?2K~z|U?N;q_+At7QupErj7>rJpRha@w9b$O@_v@ZaG70*i!>>*zHv<^M3vk?>sotm% z7e!z6?o8ltU4%HV-tVE(A&w5eH_j3{BI|H{*`e5g0XwL8AB%ny5OB?Qw|{#6v)^r* z?Xm$>Z})pt@Ats_URsd+_>Ty#BwQtMi0SP%d>CF{2ElK`P59yU^)QTL9QY!NkAugDF^Y@h;cz^j z#OcTvH{f3;F#S^FUwDU*8_vFdF|W$h_`jc()qIg-;Q3wE^D>2(^SUZ!h5@5rvPVea z-aO<88u=l{42YN<22L|_Op+qtVxJTk5FxZ~TVT$j zMTUU1g@bTytMw&;nZ`a{Q$UkbFqZ_%6A%l?5xde=T z$0h+uML1f0^aTjmJ2>_TmniP9kHRFpQH&$R)5j pIHlmz*+Zmb8vbd5vq$(Ce*td world.time) + return + recent_spin = world.time + spin_delay + + user.visible_message(span_warning("[user] spins [src]'s bit, accelerating for a moment to thousands of RPM."), span_notice("You spin [src]'s bit, accelerating for a moment to thousands of RPM.")) + +/obj/item/organ/internal/cyberimp/arm/item_set/mining_drill/diamond + name = "\improper Dalba Masterworks 'Tunneler' Diamond Integrated Drill" + desc = "Extending from a stabilization bracer built into the upper forearm, this implant allows for a masterwork diamond mining drill to extend over the user's hand. This drill will open a hole in the universe, and that hole will be a path for those behind us!" + icon_state = "diamond" + items_to_create = list(/obj/item/pickaxe/drill/implant/diamond) + +/obj/item/pickaxe/drill/implant/diamond + name = "integrated diamond mining drill" + desc = "Extending from a stabilization bracer built into the upper forearm, this implant allows for a masterwork diamond mining drill to extend over the user's hand. This drill will open a hole in the universe, and that hole will be a path for those behind us!" + icon_state = "diamond" + inhand_icon_state = "diamond" + toolspeed = 0.2 + force = 20 + demolition_mod = 1.25 + usesound = 'sound/weapons/drill.ogg' + hitsound = 'sound/weapons/drill.ogg' diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm index 965b3cf1d2f1..483d54962377 100644 --- a/monkestation/code/modules/cybernetics/augments/chest_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -72,3 +72,142 @@ exiter.adjustBruteLoss(10) to_chat(exiter, span_warning("Your body was not able to handle the strain of [src] causing you to experience some minor bruising.")) + +/datum/reagent/medicine/brain_healer + name = "Brain Healer" + description = "Efficiently restores brain damage." + taste_description = "pleasant sweetness" + color = "#A0A0A0" //mannitol is light grey, neurine is lighter grey + ph = 10.4 + purity = REAGENT_STANDARD_PURITY + + +/datum/reagent/medicine/brain_healer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5 * REM * seconds_per_tick * normalise_creation_purity(), required_organtype = affected_organtype) + ..() + + +/obj/item/organ/internal/cyberimp/chest/chemvat + name = "R.A.G.E. chemical system" + desc = "Extremely dangerous system that fills the user with a mix of potent drugs." + encode_info = AUGMENT_TG_LEVEL + icon_state = "chemplant" + icon = 'monkestation/code/modules/cybernetics/icons/implants.dmi' + + var/obj/item/clothing/mask/chemvat/forced + var/obj/item/chemvat_tank/forced_tank + + var/max_ticks_cooldown = 20 SECONDS + var/current_ticks_cooldown = 0 + + var/list/reagent_list = list( + /datum/reagent/determination = 2, + /datum/reagent/medicine/c2/penthrite = 3 , + /datum/reagent/drug/bath_salts = 3 , + /datum/reagent/medicine/ephedrine = 3, + /datum/reagent/medicine/brain_healer = 5, + ) + + var/mutable_appearance/overlay + +/obj/item/organ/internal/cyberimp/chest/chemvat/on_life() + if(!check_compatibility()) + return + //Cost of refilling is a little bit of nutrition, some blood and getting jittery + if(owner.nutrition > NUTRITION_LEVEL_STARVING && owner.blood_volume > BLOOD_VOLUME_SURVIVE && current_ticks_cooldown > 0) + + owner.nutrition -= 5 + owner.blood_volume-- + owner.adjust_jitter(1) + owner.adjust_dizzy(1) + + current_ticks_cooldown -= SSmobs.wait + + return + + if(current_ticks_cooldown <= 0) + current_ticks_cooldown = max_ticks_cooldown + on_effect() + +/obj/item/organ/internal/cyberimp/chest/chemvat/proc/on_effect() + var/obj/effect/temp_visual/chempunk/punk = new /obj/effect/temp_visual/chempunk(get_turf(owner)) + punk.color = "#77BD5D" + owner.reagents.add_reagent_list(reagent_list) + + overlay = mutable_appearance('icons/effects/effects.dmi', "biogas", ABOVE_MOB_LAYER) + overlay.color = "#77BD5D" + + RegisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) + + addtimer(CALLBACK(src, PROC_REF(remove_overlay)),max_ticks_cooldown/2) + + to_chat(owner," You feel a sharp pain as the cocktail of chemicals is injected into your bloodstream!") + return + + +/obj/item/organ/internal/cyberimp/chest/chemvat/proc/update_owner_overlay(atom/source, list/overlays) + SIGNAL_HANDLER + + if(overlay) + overlays += overlay + +/obj/item/organ/internal/cyberimp/chest/chemvat/proc/remove_overlay() + QDEL_NULL(overlay) + + UnregisterSignal(owner,COMSIG_ATOM_UPDATE_OVERLAYS) + +/obj/item/organ/internal/cyberimp/chest/chemvat/Insert(mob/living/carbon/receiver, special, drop_if_replaced) + . = ..() + forced = new + forced_tank = new + + if(receiver.wear_mask && !istype(receiver.wear_mask,/obj/item/clothing/mask/chemvat)) + receiver.dropItemToGround(receiver.wear_mask, TRUE) + receiver.equip_to_slot(forced, ITEM_SLOT_MASK) + if(!receiver.wear_mask) + receiver.equip_to_slot(forced, ITEM_SLOT_MASK) + + if(receiver.back && !istype(receiver.back,/obj/item/chemvat_tank)) + receiver.dropItemToGround(receiver.back, TRUE) + receiver.equip_to_slot(forced_tank, ITEM_SLOT_BACK) + if(!receiver.back) + receiver.equip_to_slot(forced_tank, ITEM_SLOT_BACK) + +/obj/item/organ/internal/cyberimp/chest/chemvat/Remove(mob/living/carbon/organ_owner, special) + . = ..() + organ_owner.dropItemToGround(organ_owner.wear_mask, TRUE) + organ_owner.dropItemToGround(organ_owner.back, TRUE) + QDEL_NULL(forced) + QDEL_NULL(forced_tank) + +/obj/item/chemvat_tank + name = "chemvat tank" + + icon_state = "chemvat_back_held" + icon = 'monkestation/code/modules/cybernetics/icons/implants_onmob.dmi' + worn_icon = 'monkestation/code/modules/cybernetics/icons/implants_onmob.dmi' + worn_icon_state = "chemvat_back" + + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/chemvat_tank/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + + +/obj/item/clothing/mask/chemvat + icon_state = "chemvat_mask_held" + icon = 'monkestation/code/modules/cybernetics/icons/implants_onmob.dmi' + worn_icon = 'monkestation/code/modules/cybernetics/icons/implants_onmob.dmi' + worn_icon_state = "chemvat_mask" + lefthand_file = null + righthand_file = null + + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/clothing/mask/chemvat/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm b/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm index b0fd15104af2..fbe3d4139d4b 100644 --- a/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm +++ b/monkestation/code/modules/cybernetics/augments/leg_augments/chemplants.dm @@ -95,15 +95,3 @@ /datum/reagent/medicine/c2/aiuri = 2, /datum/reagent/medicine/c2/libital = 2 ) - -/obj/item/organ/internal/cyberimp/leg/chemplant/rage - name = "R.A.G.E. chemical system" - desc = "Extremely dangerous system that fills the user with a mix of potent drugs in dire situation." - implant_color = "#ce3914" - encode_info = AUGMENT_TG_LEVEL - reagent_list = list( - /datum/reagent/determination = 2, - /datum/reagent/medicine/c2/penthrite = 3 , - /datum/reagent/drug/bath_salts = 5 , - /datum/reagent/medicine/ephedrine = 5 - ) diff --git a/monkestation/code/modules/cybernetics/icons/drillimplant.dmi b/monkestation/code/modules/cybernetics/icons/drillimplant.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0eae7955fb26e4abb915553ca26815068a535629 GIT binary patch literal 489 zcmV85}1=(c~yx#CN@2A|qONdxNd+ z_Z^SyCy8C9FDXGmLB{z1h$Jm5S6zAJ@>v=xlaCk!00001bW%=J06^y0W&i*Hbb3@+ zbVOxyV{&P5bZKvH004NLQ&wnNlH8n?xi!&v&s2IpMGa{*fq0BnjSqODetMgRZ+!%0LzR7i>Kk>L))APj^Vw2ld_GB&64{om8Fm~1S= z82_1Y6hiX#E)6JERaLc9qjh5p;7|P2Dr;@0&uGDU_{52cIH#9%T%EI>bT|ko5!;ZQ z_p$Gzq+|)hINktU(2aFqQ5M)uM8+qYq-e?_?(G2hfN+)p96FFnmm|(J_o-yXmCJ;H zBN(HTFL=NJ9uGNloSEWGy!zEsHcCH&JTfM`N3RN;#6NS~z2jSG7H{z<6OSAV?xn$( f&{w>w>VNeD@K*~J#nYng00000NkvXXu0mjf4CB#p literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/drillimplant_lefthand.dmi b/monkestation/code/modules/cybernetics/icons/drillimplant_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b0110726219bff46fbed21dbfffa80c11de0ea4e GIT binary patch literal 604 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 E4ZEWey8r+H literal 495 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sW>q&rBaEDGbOXA7^I1dGp#5wHxYCm3jjIA8ZBM3 zu|@y@0YFJaK~#90?b8s68h{oFHsy30001Ek|Zs%Y*}b~%l{0T3KZI8GM4%LrEGgi z&-`k&?dJ*@Jx Date: Fri, 3 May 2024 13:58:10 -0400 Subject: [PATCH 22/81] whoops --- .../code/modules/cybernetics/icons/neck.dmi | Bin 0 -> 1369 bytes .../cybernetics/skills/implant_hacking.dm | 1 + 2 files changed, 1 insertion(+) create mode 100644 monkestation/code/modules/cybernetics/icons/neck.dmi diff --git a/monkestation/code/modules/cybernetics/icons/neck.dmi b/monkestation/code/modules/cybernetics/icons/neck.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2cfb7a99ce268e745019031ee82126f0f2194dd3 GIT binary patch literal 1369 zcmV-f1*ZCmP)R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+BQZHUwJ13!KQUX0i!&v&s2HS`i!-e#F*g;&HUyfIlA4oP31aJDKrUqkS3ei9 z)d0d{BFm)sL|6a-1a3)0K~#90?VM|F<1h?_4amsd3;N$A-G(wbBa|{_5R@ob1}wS{`hnQ2c1&=3H;+s=VE%MIUA2@hKzBU z${v5v0C9SzNA91fe@IhY=JN3~P5BcpW0G+oj}Ix40L%E9NT5XhSfDt5o$n@tY5&*}n;JE$3anU%|mQ)M8<;#D^UVEbXFwlfb!DRuqfbR({ z@KSJ&F}({e?m(atE@c^ZVbAfyt|4zgu@PAuE_KDf7#LYYecWWU3}G@s|qXO*a;l1Ao7b zj@dm}6O#8TUhr5XJ@5d5@AF~X#(TosN5d96dzsBg>^;mDIP)h~aG(XZdypIW$5S@N z{VXu`7Yy{BW+3m}-^shW z(K+wQfT=C1%A3f0uN^2eUX%e70_(iV0dwU&nT8}lE$}9}fK^{KA@UvvOoTm83TK(AH zW4vhW4{Cme6*}-D^{e=WKv^79{7Vuqs({&n7b$&J^ao|Yl)G;QKJ45dEbu0L5mo`y z)*n=OGpM{*=np1f4TOzR;LV`om$g5Le&EHR1E$u@(gIU_3o7q*#y7oS1rb{Uhy4Cz z3H$LPUs5ygv38#nnEBO@7ju75@dwu5+aekO)7W2Bc~2)|8!xKr&5JIV%jLR6m-FJ) z`$=)CmG_pf)h2%{?^*rKpz~teepK^*(pFx)d_O57ycIB8d9h4G#{QsXKk5bjLD^ph zOcCEG?^*Hf1YmM}vji?Cyb|BK^am}03kh5Mg9^TN*iVX^CuRTj`$=)i+8;FUCk4O0 z9~9>FE0q1-A9T4~uD_|?ym02E z^L|qE`NPZilkyXmEAQ2x9}KV`)yj*#`-AF!)ZYEUQwJXL9(2XG-u*!}u>JgCpuDIC z*3Tcd^#|4csQT$VYkyJU&HnpIF);Wq-%sl24_z*o>#wMZ_pJWV%6r8rQGNH5>gs#` zutH;^cy;FdA^(4JsUYH3lEw@$A#jD-c<;oLB7Qafy_%|m0GLg@Sf!r(NvlNqgN?jc zS Date: Fri, 3 May 2024 14:20:17 -0400 Subject: [PATCH 23/81] adds designs for job item sets --- .../modules/cybernetics/designs/item_sets.dm | 90 +++++++++++++++++++ .../modules/cybernetics/designs/medical.dm | 4 +- .../code/modules/cybernetics/tech_nodes.dm | 15 ++++ tgstation.dme | 1 + 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 monkestation/code/modules/cybernetics/designs/item_sets.dm diff --git a/monkestation/code/modules/cybernetics/designs/item_sets.dm b/monkestation/code/modules/cybernetics/designs/item_sets.dm new file mode 100644 index 000000000000..fe37e7877b6d --- /dev/null +++ b/monkestation/code/modules/cybernetics/designs/item_sets.dm @@ -0,0 +1,90 @@ +/datum/design/itemset_botany + name = "Botany Arm Implant" + desc = "A rather simple arm implant containing tools used in gardening and botanical research." + id = "ci-set-botany" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/botany + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/itemset_connector + name = "Universal Connection Implant" + desc = "Special inhand implant that allows you to connect your brain directly into the protocl sphere of implants, which allows for you to hack them and make the compatible." + id = "ci-set-connector" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/connector + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/itemset_atmospherics + name = "Atmospheric Arm Implant" + desc = "A set of atmospheric tools hidden behind a concealed panel on the user's arm." + id = "ci-set-atmospherics" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/atmospherics + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/itemset_chemical + name = "Chemical Arm Implant" + desc = "A set of chemical tools hidden behind a concealed panel on the user's arm." + id = "ci-set-chemical" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/chemical + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/itemset_detective + name = "Detective's Arm Implant" + desc = "A set of detective's tools hidden behind a concealed panel on the user's arm." + id = "ci-set-detective" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/detective + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/itemset_janitor + name = "Janitorial Arm Implant" + desc = "A set of janitor's tools hidden behind a concealed panel on the user's arm." + id = "ci-set-janitor" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/janitor + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/itemset_cook + name = "Cook's Arm Implant" + desc = "A set of cook's tools hidden behind a concealed panel on the user's arm." + id = "ci-set-cook" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/cook + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL diff --git a/monkestation/code/modules/cybernetics/designs/medical.dm b/monkestation/code/modules/cybernetics/designs/medical.dm index fbd508bd2530..7bd4f947a708 100644 --- a/monkestation/code/modules/cybernetics/designs/medical.dm +++ b/monkestation/code/modules/cybernetics/designs/medical.dm @@ -9,7 +9,7 @@ category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE /datum/design/cyberlink_nt_high name = "NT Cyberlink 2.0" @@ -22,4 +22,4 @@ category = list( RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE diff --git a/monkestation/code/modules/cybernetics/tech_nodes.dm b/monkestation/code/modules/cybernetics/tech_nodes.dm index 3744a4a81632..febd84614327 100644 --- a/monkestation/code/modules/cybernetics/tech_nodes.dm +++ b/monkestation/code/modules/cybernetics/tech_nodes.dm @@ -15,3 +15,18 @@ design_ids = list("ci-nt_high") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) +/datum/techweb_node/job_approved_item_set + id = "job_itemsets" + name = "NT Approved Job Item Sets" + description = "A list of approved item sets that can be implanted into the crew to allow easier access to their tools." + prereq_ids = list("adv_biotech","adv_biotech", "datatheory") + design_ids = list( + "ci-set-cook", + "ci-set-janitor", + "ci-set-detective", + "ci-set-chemical", + "ci-set-atmospherics", + "ci-set-connector", + "ci-set-botany", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/tgstation.dme b/tgstation.dme index 8d0c2f30fefc..173ac08a78a1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6317,6 +6317,7 @@ #include "monkestation\code\modules\cybernetics\black_markets\aftermarket_implants.dm" #include "monkestation\code\modules\cybernetics\clothing\suits.dm" #include "monkestation\code\modules\cybernetics\components\slowing_field.dm" +#include "monkestation\code\modules\cybernetics\designs\item_sets.dm" #include "monkestation\code\modules\cybernetics\designs\medical.dm" #include "monkestation\code\modules\cybernetics\hud\cybernetics.dm" #include "monkestation\code\modules\cybernetics\implant_items\autosurgeons.dm" From 7f14ada12f05ab5d61c07160fc5606f831ae6654 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 14:26:47 -0400 Subject: [PATCH 24/81] adds tech nodes --- .../modules/cybernetics/designs/item_sets.dm | 13 ++++++++++ .../modules/cybernetics/designs/security.dm | 26 +++++++++++++++++++ .../code/modules/cybernetics/tech_nodes.dm | 15 ++++++++++- tgstation.dme | 2 ++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 monkestation/code/modules/cybernetics/designs/security.dm diff --git a/monkestation/code/modules/cybernetics/designs/item_sets.dm b/monkestation/code/modules/cybernetics/designs/item_sets.dm index fe37e7877b6d..6bd36b779c22 100644 --- a/monkestation/code/modules/cybernetics/designs/item_sets.dm +++ b/monkestation/code/modules/cybernetics/designs/item_sets.dm @@ -88,3 +88,16 @@ RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/itemset_mining + name = "Drill Arm Implant" + desc = "Just a big drill, implanted into your hand." + id = "ci-set-mining" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/mining_drill + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL diff --git a/monkestation/code/modules/cybernetics/designs/security.dm b/monkestation/code/modules/cybernetics/designs/security.dm new file mode 100644 index 000000000000..ba3ae9251aa9 --- /dev/null +++ b/monkestation/code/modules/cybernetics/designs/security.dm @@ -0,0 +1,26 @@ +/datum/design/security_blades + name = "C.H.R.O.M.A.T.A. mantis blade implants" + desc = "High tech mantis blade implants, easily portable weapon, that has a high wound potential." + id = "ci-set-mantis" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/mantis + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/security_itemset + name = "combat cybernetics implant" + desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." + id = "ci-set-combat" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/organ/internal/cyberimp/arm/item_set/combat + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + diff --git a/monkestation/code/modules/cybernetics/tech_nodes.dm b/monkestation/code/modules/cybernetics/tech_nodes.dm index febd84614327..20ce22f62d91 100644 --- a/monkestation/code/modules/cybernetics/tech_nodes.dm +++ b/monkestation/code/modules/cybernetics/tech_nodes.dm @@ -17,7 +17,7 @@ /datum/techweb_node/job_approved_item_set id = "job_itemsets" - name = "NT Approved Job Item Sets" + display_name = "NT Approved Job Item Sets" description = "A list of approved item sets that can be implanted into the crew to allow easier access to their tools." prereq_ids = list("adv_biotech","adv_biotech", "datatheory") design_ids = list( @@ -28,5 +28,18 @@ "ci-set-atmospherics", "ci-set-connector", "ci-set-botany", + "ci-set-mining", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/security_authorized_implants + id = "job_itemsets" + display_name = "NT Approved Security Implants" + description = "A list of approved item sets that can be implanted into the crew to allow easier access to their tools." + prereq_ids = "A list of approved implants for security officers." + prereq_ids = list("ci-nt_high") + design_ids = list( + "ci-set-mantis", + "ci-set-combat", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) diff --git a/tgstation.dme b/tgstation.dme index 173ac08a78a1..a6ae574e12db 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6303,6 +6303,7 @@ #include "monkestation\code\modules\cryopods\persistance\base_persistance.dm" #include "monkestation\code\modules\cryopods\trackers\cryo_chaplain.dm" #include "monkestation\code\modules\cybernetics\assets.dm" +#include "monkestation\code\modules\cybernetics\tech_nodes.dm" #include "monkestation\code\modules\cybernetics\actions\base_action.dm" #include "monkestation\code\modules\cybernetics\augments\_base_changes.dm" #include "monkestation\code\modules\cybernetics\augments\chest_augments.dm" @@ -6319,6 +6320,7 @@ #include "monkestation\code\modules\cybernetics\components\slowing_field.dm" #include "monkestation\code\modules\cybernetics\designs\item_sets.dm" #include "monkestation\code\modules\cybernetics\designs\medical.dm" +#include "monkestation\code\modules\cybernetics\designs\security.dm" #include "monkestation\code\modules\cybernetics\hud\cybernetics.dm" #include "monkestation\code\modules\cybernetics\implant_items\autosurgeons.dm" #include "monkestation\code\modules\cybernetics\implant_items\cyberlink_connector.dm" From 566cb9d08198559a1c2abcd33433aecbd5693a40 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 14:27:35 -0400 Subject: [PATCH 25/81] Delete screenshot_humanoids__datum_species_apid.png --- .../screenshot_humanoids__datum_species_apid.png | Bin 1123 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_apid.png diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_apid.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_apid.png deleted file mode 100644 index 681285ed0579f1505618f8f700e4dc67c7f4071f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1123 zcmV-p1f2VcP){4Lu&}UYZflF4 znl(5sQ%T`)rv$L~wcYt?$gHcag7Z(>RD=SAwM-dbhA|@sn92}>rw$#_( ziHo8nBq}W}Gt14YE62mqS@7!En1VMG7` z0~|?2K~z|U?N;q_+At7QupErj7>rJpRha@w9b$O@_v@ZaG70*i!>>*zHv<^M3vk?>sotm% z7e!z6?o8ltU4%HV-tVE(A&w5eH_j3{BI|H{*`e5g0XwL8AB%ny5OB?Qw|{#6v)^r* z?Xm$>Z})pt@Ats_URsd+_>Ty#BwQtMi0SP%d>CF{2ElK`P59yU^)QTL9QY!NkAugDF^Y@h;cz^j z#OcTvH{f3;F#S^FUwDU*8_vFdF|W$h_`jc()qIg-;Q3wE^D>2(^SUZ!h5@5rvPVea z-aO<88u=l{42YN<22L|_Op+qtVxJTk5FxZ~TVT$j zMTUU1g@bTytMw&;nZ`a{Q$UkbFqZ_%6A%l?5xde=T z$0h+uML1f0^aTjmJ2>_TmniP9kHRFpQH&$R)5j pIHlmz*+Zmb8vbd5vq$(Ce*td Date: Fri, 3 May 2024 14:32:09 -0400 Subject: [PATCH 26/81] whoops --- monkestation/code/modules/cybernetics/tech_nodes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/cybernetics/tech_nodes.dm b/monkestation/code/modules/cybernetics/tech_nodes.dm index 20ce22f62d91..2aba51eae402 100644 --- a/monkestation/code/modules/cybernetics/tech_nodes.dm +++ b/monkestation/code/modules/cybernetics/tech_nodes.dm @@ -33,7 +33,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/security_authorized_implants - id = "job_itemsets" + id = "job_itemsets-sec" display_name = "NT Approved Security Implants" description = "A list of approved item sets that can be implanted into the crew to allow easier access to their tools." prereq_ids = "A list of approved implants for security officers." From 8f59bb51b1922d76ed66630b9f86a314fbcecfb2 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 15:14:16 -0400 Subject: [PATCH 27/81] Update item_sets.dm --- .../code/modules/cybernetics/designs/item_sets.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/monkestation/code/modules/cybernetics/designs/item_sets.dm b/monkestation/code/modules/cybernetics/designs/item_sets.dm index 6bd36b779c22..ea5a31572ab3 100644 --- a/monkestation/code/modules/cybernetics/designs/item_sets.dm +++ b/monkestation/code/modules/cybernetics/designs/item_sets.dm @@ -101,3 +101,16 @@ RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/cyberlink_connector + name = "Cyberlink Connector" + desc = "A cyberlink connector used to hack implants." + id = "ci-cyberconnector" + build_type = PROTOLATHE | MECHFAB + construction_time = 3 SECONDS + materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + build_path = /obj/item/cyberlink_connector + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL From f140963ed03e6cd6214d1b657696f0f517788b7f Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 15:16:43 -0400 Subject: [PATCH 28/81] Update tech_nodes.dm --- monkestation/code/modules/cybernetics/tech_nodes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/cybernetics/tech_nodes.dm b/monkestation/code/modules/cybernetics/tech_nodes.dm index 2aba51eae402..a750c98e87a3 100644 --- a/monkestation/code/modules/cybernetics/tech_nodes.dm +++ b/monkestation/code/modules/cybernetics/tech_nodes.dm @@ -4,7 +4,7 @@ display_name = "Cybernetic Application" description = "Creation of NT-secure basic cyberlinks for low-grade cybernetic augmentation" prereq_ids = list("adv_biotech","adv_biotech", "datatheory") - design_ids = list("ci-nt_low") + design_ids = list("ci-nt_low", "ci-cyberconnector") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) /datum/techweb_node/ntlink_high From 3153d9412b97af88dd8fc35821ff09be5173d1c4 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 15:38:33 -0400 Subject: [PATCH 29/81] fixes --- .../cybernetics/augments/arm_augments/item_sets/_base.dm | 2 +- monkestation/code/modules/cybernetics/tech_nodes.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm index 7fb07ba56c82..d10d1a895e60 100644 --- a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm @@ -65,7 +65,7 @@ continue choice_list[augment_item] = image(augment_item) var/obj/item/choice = show_radial_menu(owner, owner, choice_list) - if(owner && owner == usr && owner.stat != DEAD && (src in owner.organs) && !active_item && (choice in contents)) + if(owner && owner == usr && owner.stat != DEAD && (src in owner.organs) && !active_item && (choice in contents) && check_compatibility()) // This monster sanity check is a nice example of how bad input is. Extend(choice) else diff --git a/monkestation/code/modules/cybernetics/tech_nodes.dm b/monkestation/code/modules/cybernetics/tech_nodes.dm index a750c98e87a3..808cd9519cd5 100644 --- a/monkestation/code/modules/cybernetics/tech_nodes.dm +++ b/monkestation/code/modules/cybernetics/tech_nodes.dm @@ -37,7 +37,7 @@ display_name = "NT Approved Security Implants" description = "A list of approved item sets that can be implanted into the crew to allow easier access to their tools." prereq_ids = "A list of approved implants for security officers." - prereq_ids = list("ci-nt_high") + prereq_ids = list("ntlink_high") design_ids = list( "ci-set-mantis", "ci-set-combat", From 0efac3ba0033917d633a2a9a882f3099c75f777e Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 15:56:04 -0400 Subject: [PATCH 30/81] more cooldown stuff --- .../cybernetics/augments/chest_augments.dm | 5 +++++ .../cybernetics/icons/swords_righthand.dmi | Bin 813 -> 814 bytes 2 files changed, 5 insertions(+) diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm index 483d54962377..695245b29994 100644 --- a/monkestation/code/modules/cybernetics/augments/chest_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -11,6 +11,10 @@ /datum/action/item_action/organ_action/sandy name = "Sandevistan Activation" + cooldown = 45 SECONDS + +/datum/action/item_action/organ_action/sandy/bad + cooldown = 65 SECONDS /obj/item/organ/internal/cyberimp/chest/sandevistan name = "Militech Apogee Sandevistan" @@ -56,6 +60,7 @@ /obj/item/organ/internal/cyberimp/chest/sandevistan/refurbished name = "refurbished sandevistan" desc = "The branding has been scratched off of these and it looks hastily put together." + actions_types = list(/datum/action/item_action/organ_action/sandy/bad) cooldown_time = 65 SECONDS diff --git a/monkestation/code/modules/cybernetics/icons/swords_righthand.dmi b/monkestation/code/modules/cybernetics/icons/swords_righthand.dmi index acda6b6dd67a1a98c5d8140a85da2de4b9f84e0b..e83d32f7be37ccdc2a78bc0ac5e94c735ab2ec40 100644 GIT binary patch delta 546 zcmV+-0^R+s2CfFM7y*9*07*naRCt{2m~}sB z!0)sHgze`DnE(o#djJ(_0G-c<0jLeS1abeePpa59Kt+F5t6l~fk@BSi000000REnK zC0WU*ql}z5!Og0RWv%PT9$bIZ`nKyj*?b@ff-Ls=VqNF}{q3|bnvl%%0UHOfh4}#a z2znb3^*7Es+sA(a`hp7`KsO&q11RSMA%JQ=kOolB2SNbVd>{>=oDYNmD$)QtpA7?0 z8*~Zc{$-z3v2B2s{=!wg3^F3+O9cP`000000A_}RX!~JU!Q`_79J7uj!;v!?^CDvT z?l`^tJ0%;Udj1ZK?*yQ#&mE?8Q>nhJzxu{@&bEy9u5~#fJ^>-PAq>&fb5C>Q5>$K0N4D0fLLB&ClKP< k263s}9RL~t0PvxF129Mr;8;iH`v3p{07*qoM6N<$f>iGDfdBvi delta 545 zcmV++0^a?u2CW9L7y*9)|4BqaRCt{2n2Tx zr_vrIzCM6dgpC0J004}sRw^syST4wk4W=j?msQTPJ#zg`~AgayAs;Hs}oE{^gvsVq1ZV|H4&042UA-Lj?c;0002|J?%imhy`q6KEU3B zgAIuK8)uz8!~%bZLJBXSn-8P{%K1PLP|XKY0p)xk2&m=*sep1m5Cl}D0=k?H1-K15 zgSdY=C#~34pyj`CRSyHANcm6!00000004lQ{wUgh>{kf+EP)f5$kLy3Ap>2+9KI)x zFaM6ohG?C>0>e83-0E|OG2K*JUyi^0lC3^>7^po@O}T&m_d>G#QN|Yktc-NPNc@!; z Date: Fri, 3 May 2024 15:59:41 -0400 Subject: [PATCH 31/81] Update chest_augments.dm --- .../code/modules/cybernetics/augments/chest_augments.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/monkestation/code/modules/cybernetics/augments/chest_augments.dm b/monkestation/code/modules/cybernetics/augments/chest_augments.dm index 695245b29994..810368d1f657 100644 --- a/monkestation/code/modules/cybernetics/augments/chest_augments.dm +++ b/monkestation/code/modules/cybernetics/augments/chest_augments.dm @@ -11,11 +11,6 @@ /datum/action/item_action/organ_action/sandy name = "Sandevistan Activation" - cooldown = 45 SECONDS - -/datum/action/item_action/organ_action/sandy/bad - cooldown = 65 SECONDS - /obj/item/organ/internal/cyberimp/chest/sandevistan name = "Militech Apogee Sandevistan" desc = "This model of Sandevistan doesn't exist, at least officially. Off the record, there's gossip of secret Militech Lunar labs producing covert cyberware. It was never meant to be mass produced, but an army would only really need a few pieces like this one to dominate their enemy." @@ -60,7 +55,6 @@ /obj/item/organ/internal/cyberimp/chest/sandevistan/refurbished name = "refurbished sandevistan" desc = "The branding has been scratched off of these and it looks hastily put together." - actions_types = list(/datum/action/item_action/organ_action/sandy/bad) cooldown_time = 65 SECONDS From 3f52490f1606d733d3d6135ba5ee9ae39955081d Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 17:08:38 -0400 Subject: [PATCH 32/81] fixes --- .../augments/arm_augments/item_sets/_base.dm | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm index d10d1a895e60..f3c03066f053 100644 --- a/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm +++ b/monkestation/code/modules/cybernetics/augments/arm_augments/item_sets/_base.dm @@ -55,6 +55,8 @@ if(!active_item || (active_item in src)) active_item = null if(contents.len == 1) + if(!check_compatibility()) + return Extend(contents[1]) else var/list/choice_list = list() @@ -79,7 +81,7 @@ /obj/item/organ/internal/cyberimp/arm/item_set/on_remove(mob/living/carbon/arm_owner) . = ..() - Retract() + Retract(arm_owner) UnregisterSignal(arm_owner, list(COMSIG_CARBON_POST_ATTACH_LIMB, COMSIG_KB_MOB_DROPITEM_DOWN)) on_limb_detached(hand) @@ -129,18 +131,21 @@ if(Retract()) return COMSIG_KB_ACTIVATED -/obj/item/organ/internal/cyberimp/arm/item_set/proc/Retract() +/obj/item/organ/internal/cyberimp/arm/item_set/proc/Retract(mob/living/carbon/passover) + var/mob/living/carbon/user = owner + if(passover) + user = passover if(!active_item || (active_item in src)) return FALSE - owner?.visible_message(span_notice("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + user?.visible_message(span_notice("[user] retracts [active_item] back into [user.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), span_notice("[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), span_hear("You hear a short mechanical noise.")) - owner.transferItemToLoc(active_item, src, TRUE) + user.transferItemToLoc(active_item, src, TRUE) UnregisterSignal(active_item, COMSIG_ITEM_ATTACK_SELF) active_item = null - playsound(get_turf(owner), retract_sound, 50, TRUE) + playsound(get_turf(user), retract_sound, 50, TRUE) return TRUE /obj/item/organ/internal/cyberimp/arm/item_set/proc/Extend(obj/item/augment) From 4daf2a7b4982c6559bb5ef099640deef42ff7016 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 18:55:46 -0400 Subject: [PATCH 33/81] Update security.dm --- monkestation/code/modules/cybernetics/designs/security.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/cybernetics/designs/security.dm b/monkestation/code/modules/cybernetics/designs/security.dm index ba3ae9251aa9..66ffa2bb3f51 100644 --- a/monkestation/code/modules/cybernetics/designs/security.dm +++ b/monkestation/code/modules/cybernetics/designs/security.dm @@ -2,7 +2,7 @@ name = "C.H.R.O.M.A.T.A. mantis blade implants" desc = "High tech mantis blade implants, easily portable weapon, that has a high wound potential." id = "ci-set-mantis" - build_type = PROTOLATHE | MECHFAB + build_type = PROTOLATHE construction_time = 3 SECONDS materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) build_path = /obj/item/organ/internal/cyberimp/arm/item_set/mantis @@ -15,7 +15,7 @@ name = "combat cybernetics implant" desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." id = "ci-set-combat" - build_type = PROTOLATHE | MECHFAB + build_type = PROTOLATHE construction_time = 3 SECONDS materials = list(/datum/material/iron = 2500, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) build_path = /obj/item/organ/internal/cyberimp/arm/item_set/combat From 455412dc584b39e5de4baefefbb3524787548d19 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 19:15:32 -0400 Subject: [PATCH 34/81] Update generic.dm --- code/game/objects/items/robot/items/generic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index 49d1fa38ba24..c69a38dc93aa 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -30,7 +30,7 @@ return user.do_attack_animation(attacked_mob) - attacked_mob.Paralyze(100) + attacked_mob.stamina.adjust(-125) attacked_mob.adjust_stutter(10 SECONDS) attacked_mob.visible_message(span_danger("[user] prods [attacked_mob] with [src]!"), \ From 8aed305d42787b00b189f3afd818ee906858838f Mon Sep 17 00:00:00 2001 From: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Date: Wed, 21 Jun 2023 23:05:44 -0700 Subject: [PATCH 35/81] Adds border smoothing! (Look ma I'm upstreaming) (#76134) Ok so we currently have 1 (count em) border object that wants to smooth with other border objects. That's the tram window. It currently does this manually, via map edits, but that's kinda crappy so lets be better. This pr adds a new smoothing mode to handle border objects. Unlike other smoothing modes, it returns a bitfield of directions the border object connects in. I do this by memorizing a calculation of which dirs "connect" at init, and reading out of a global list with border object direction, direction between objects, and if it's a border object, the other object's dir. I'm doing this primarily because it's become useful for wallening (a spriter saw the tram thing and is doing the same thing to pod windows, and I want to support that) I do think it's potentially useful in other applications too tho, and I like dehardcoding tram windows. Also fun bonus (or maybe downside), it's nearly 0 cost because I pulled the bitmask smoothing define into 2 subdefines, and am swapping the handler one out to do what I want. Oh also I got rid of a for loop in smoothing code, redundant and costs time in list iteration [Moves tram windows over to the new border object smoothing](https://github.com/tgstation/tgstation/commit/114873679c94d680788edee9665fa18dba8108c0) Also replaces some typepath chicanery with a setDir override, for redundancy in future Oh and there's a update paths script too, to be nice More visual possibility in future, fixes a hack we have currently, and makes some spriters happy. :cl: fix: Dehardcodes some stuff with tram windows, they'll be easier to map with now refactor: Border objects can now smooth with each other. I'm sure something cool will come of this /:cl: --- code/__DEFINES/icon_smoothing.dm | 8 + code/__HELPERS/icon_smoothing.dm | 207 ++++++++++++++---- code/game/atoms.dm | 3 + .../industrial_lift/tram/tram_windows.dm | 66 +++--- .../Scripts/76134_tram_window_cleanup.txt | 5 + 5 files changed, 219 insertions(+), 70 deletions(-) create mode 100644 tools/UpdatePaths/Scripts/76134_tram_window_cleanup.txt diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 1bb7712f6f2b..57035a2fe17b 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -11,6 +11,11 @@ #define SMOOTH_QUEUED (1<<4) /// Smooths with objects, and will thus need to scan turfs for contents. #define SMOOTH_OBJ (1<<5) +/// Uses directional object smoothing, so we care not only about something being on the right turf, but also its direction +/// Changes the meaning of smoothing_junction, instead of representing the directions we are smoothing in +/// it represents the sides of our directional border object that have a neighbor +/// Is incompatible with SMOOTH_CORNERS because border objects don't have corners +#define SMOOTH_BORDER_OBJECT (1<<6) DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_CORNERS" = SMOOTH_CORNERS, @@ -19,6 +24,7 @@ DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_BORDER" = SMOOTH_BORDER, "SMOOTH_QUEUED" = SMOOTH_QUEUED, "SMOOTH_OBJ" = SMOOTH_OBJ, + "SMOOTH_BORDER_OBJECT" = SMOOTH_BORDER_OBJECT, )) @@ -138,6 +144,8 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(24) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium #define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(25) ///obj/structure/window/reinforced/shuttle +#define SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM S_OBJ(26) ///obj/structure/window/reinforced/tram + #define SMOOTH_GROUP_LATTICE S_OBJ(31) ///obj/structure/lattice #define SMOOTH_GROUP_CATWALK S_OBJ(32) ///obj/structure/lattice/catwalk diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 201555efd513..460357a9af0d 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -45,11 +45,87 @@ DEFINE_BITFIELD(smoothing_junction, list( "NORTHWEST_JUNCTION" = NORTHWEST_JUNCTION, )) - #define NO_ADJ_FOUND 0 #define ADJ_FOUND 1 #define NULLTURF_BORDER 2 +GLOBAL_LIST_INIT(adjacent_direction_lookup, generate_adjacent_directions()) + +/* Attempting to mirror the below + * Each 3x3 grid is a tile, with each X representing a direction a border object could be in IN said grid + * Directions marked with A are acceptable smoothing targets, M is the example direction + * The example given here is of a northfacing border object +xxx xxx xxx +xxx AxA xxx +xxx xAx xxx + +xAx xMx xAx +xxx AxA xxx +xxx xxx xxx + +xxx xxx xxx +xxx xxx xxx +xxx xxx xxx +*/ +/// Encodes connectivity between border objects +/// Returns a list accessable by a border object's dir, the direction between it and a target, and a target +/// Said list will return the direction the two objects connect, if any exists (if the target isn't a border object and the direction is fine, return the inverse of the direction in use) +/proc/generate_adjacent_directions() + // Have to hold all conventional dir pairs, so we size to the largest + // We don't HAVE diagonal border objects, so I'm gonna pretend they'll never exist + + // You might be like, lemon, can't we use GLOB.cardinals/GLOB.alldirs here + // No, they aren't loaded yet. life is pain + var/list/cardinals = list(NORTH, SOUTH, EAST, WEST) + var/list/alldirs = cardinals + list(NORTH|EAST, SOUTH|EAST, NORTH|WEST, SOUTH|WEST) + var/largest_cardinal = max(cardinals) + var/largest_dir = max(alldirs) + + var/list/direction_map = new /list(largest_cardinal) + for(var/dir in cardinals) + var/left = turn(dir, 90) + var/right = turn(dir, -90) + var/opposite = turn(dir, 180) + // Need to encode diagonals here because it's possible, even if it is always false + var/list/acceptable_adjacents = new /list(largest_dir) + // Alright, what directions are acceptable to us + for(var/connectable_dir in (cardinals + NONE)) + // And what border objects INSIDE those directions are alright + var/list/smoothable_dirs = new /list(largest_cardinal + 1) // + 1 because we need to provide space for NONE to be a valid index + // None is fine, we want to smooth with things on our own turf + // We'll do the two dirs to our left and right + // They connect.. "below" us and on their side + if(connectable_dir == NONE) + smoothable_dirs[left] = opposite | left + smoothable_dirs[right] = opposite | right + // If it's to our right or left we'll include just the dir matching ours + // Left edge touches only our left side, and so on + else if (connectable_dir == left) + smoothable_dirs[dir] = left + else if (connectable_dir == right) + smoothable_dirs[dir] = right + // If it's straight on we'll include all cardinals but us, since all 3 bits would touch us + // Turf opposite gets just our dir as the connection, the other two get our dir + theirs + // Since they touch the edges + else if(connectable_dir == dir) + smoothable_dirs[opposite] = dir + smoothable_dirs[left] = dir | left + smoothable_dirs[right] = dir | right + // otherwise, go HOME, I don't want to encode anything for you + else + continue + acceptable_adjacents[connectable_dir + 1] = smoothable_dirs + direction_map[dir] = acceptable_adjacents + return direction_map + +/// Are two atoms border adjacent, takes a border object, something to compare against, and the direction between A and B +/// Returns the way in which the first thing is adjacent to the second +#define CAN_DIAGONAL_SMOOTH(border_obj, target, direction) (\ + (target.smoothing_flags & SMOOTH_BORDER_OBJECT) ? \ + GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]?[target.dir] : \ + (GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]) ? turn(direction, 180) : NONE \ + ) + #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" @@ -300,44 +376,82 @@ DEFINE_BITFIELD(smoothing_junction, list( var/smooth_border = (smoothing_flags & SMOOTH_BORDER) var/smooth_obj = (smoothing_flags & SMOOTH_OBJ) - - #define SET_ADJ_IN_DIR(direction, direction_flag) \ - set_adj_in_dir: { \ - do { \ - var/turf/neighbor = get_step(src, direction); \ - if(neighbor) { \ - var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ - if(neighbor_smoothing_groups) { \ - for(var/target in canSmoothWith) { \ - if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \ - new_junction |= direction_flag; \ - break set_adj_in_dir; \ - }; \ - }; \ - }; \ - if(smooth_obj) { \ - for(var/atom/movable/thing as anything in neighbor) { \ - var/thing_smoothing_groups = thing.smoothing_groups; \ - if(!thing.anchored || isnull(thing_smoothing_groups)) { \ - continue; \ - }; \ - for(var/target in canSmoothWith) { \ - if(canSmoothWith[target] & thing_smoothing_groups[target]) { \ - new_junction |= direction_flag; \ - break set_adj_in_dir; \ - }; \ - }; \ + var/border_object_smoothing = (smoothing_flags & SMOOTH_BORDER_OBJECT) + + // Did you know you can pass defines into other defines? very handy, lets take advantage of it here to allow 0 cost variation + #define SEARCH_ADJ_IN_DIR(direction, direction_flag, ADJ_FOUND, WORLD_BORDER, BORDER_CHECK) \ + do { \ + var/turf/neighbor = get_step(src, direction); \ + if(neighbor && ##BORDER_CHECK(neighbor, direction)) { \ + var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ + if(neighbor_smoothing_groups) { \ + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \ + ##ADJ_FOUND(neighbor, direction, direction_flag); \ + } \ + } \ + } \ + if(smooth_obj) { \ + for(var/atom/movable/thing as anything in neighbor) { \ + var/thing_smoothing_groups = thing.smoothing_groups; \ + if(!thing.anchored || isnull(thing_smoothing_groups) || !##BORDER_CHECK(thing, direction)) { \ + continue; \ }; \ - }; \ - } else if (smooth_border) { \ - new_junction |= direction_flag; \ - }; \ - } while(FALSE) \ - } + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & thing_smoothing_groups[target]) { \ + ##ADJ_FOUND(thing, direction, direction_flag); \ + } \ + } \ + } \ + } \ + } else if (smooth_border) { \ + ##WORLD_BORDER(null, direction, direction_flag); \ + } \ + } while(FALSE) \ + + #define BITMASK_FOUND(target, direction, direction_flag) \ + new_junction |= direction_flag; \ + break set_adj_in_dir; \ + /// Check that non border objects use to smooth against border objects + /// Returns true if the smooth is acceptable, FALSE otherwise + #define BITMASK_ON_BORDER_CHECK(target, direction) (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, turn(direction, 180))) + + #define BORDER_FOUND(target, direction, direction_flag) new_junction |= CAN_DIAGONAL_SMOOTH(src, target, direction) + // Border objects require an object as context, so we need a dummy. I'm sorry + #define WORLD_BORDER_FOUND(target, direction, direction_flag) \ + var/static/atom/dummy; \ + if(!dummy) { \ + dummy = new(); \ + dummy.smoothing_flags &= ~SMOOTH_BORDER_OBJECT; \ + } \ + BORDER_FOUND(dummy, direction, direction_flag); + // Handle handle border on border checks. no-op, we handle this check inside CAN_DIAGONAL_SMOOTH + #define BORDER_ON_BORDER_CHECK(target, direction) (TRUE) + + // We're building 2 different types of smoothing searches here + // One for standard bitmask smoothing (We provide a label so our macro can eary exit, as it wants to do) + #define SET_ADJ_IN_DIR(direction, direction_flag) do { set_adj_in_dir: { SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) }} while(FALSE) + // and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf) + #define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK) + + // Let's go over all our cardinals + if(border_object_smoothing) + SET_BORDER_ADJ_IN_DIR(NORTH) + SET_BORDER_ADJ_IN_DIR(SOUTH) + SET_BORDER_ADJ_IN_DIR(EAST) + SET_BORDER_ADJ_IN_DIR(WEST) + // We want to check against stuff in our own turf + SET_BORDER_ADJ_IN_DIR(NONE) + // Border objects don't do diagonals, so GO HOME + set_smoothed_icon_state(new_junction) + return - for(var/direction in GLOB.cardinals) //Cardinal case first. - SET_ADJ_IN_DIR(direction, direction) + SET_ADJ_IN_DIR(NORTH, NORTH) + SET_ADJ_IN_DIR(SOUTH, SOUTH) + SET_ADJ_IN_DIR(EAST, EAST) + SET_ADJ_IN_DIR(WEST, WEST) + // If there's nothing going on already if(!(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST))) set_smoothed_icon_state(new_junction) return @@ -358,10 +472,16 @@ DEFINE_BITFIELD(smoothing_junction, list( set_smoothed_icon_state(new_junction) + #undef SET_BORDER_ADJ_IN_DIR #undef SET_ADJ_IN_DIR - - -///Changes the icon state based on the new junction bitmask. Returns the old junction value. + #undef BORDER_ON_BORDER_CHECK + #undef WORLD_BORDER_FOUND + #undef BORDER_FOUND + #undef BITMASK_ON_BORDER_CHECK + #undef BITMASK_FOUND + #undef SEARCH_ADJ_IN_DIR + +///Changes the icon state based on the new junction bitmask /atom/proc/set_smoothed_icon_state(new_junction) . = smoothing_junction smoothing_junction = new_junction @@ -370,12 +490,12 @@ DEFINE_BITFIELD(smoothing_junction, list( /turf/closed/set_smoothed_icon_state(new_junction) // Avoid calling ..() here to avoid setting icon_state twice, which is expensive given how hot this proc is - . = smoothing_junction + var/old_junction = smoothing_junction smoothing_junction = new_junction if (!(smoothing_flags & SMOOTH_DIAGONAL_CORNERS)) icon_state = "[base_icon_state]-[smoothing_junction]" - return . + return switch(new_junction) if( @@ -389,8 +509,8 @@ DEFINE_BITFIELD(smoothing_junction, list( SOUTH_JUNCTION|EAST_JUNCTION|SOUTHEAST_JUNCTION, ) icon_state = "[base_icon_state]-[smoothing_junction]-d" - if(new_junction == . || fixed_underlay) // Mutable underlays? - return . + if(new_junction == old_junction || fixed_underlay) // Mutable underlays? + return var/junction_dir = reverse_ndir(smoothing_junction) var/turned_adjacency = REVERSE_DIR(junction_dir) @@ -546,3 +666,4 @@ DEFINE_BITFIELD(smoothing_junction, list( #undef DEFAULT_UNDERLAY_ICON #undef DEFAULT_UNDERLAY_ICON_STATE +#undef CAN_DIAGONAL_SMOOTH diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 1475c8cdc908..a350bbe650f3 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1174,6 +1174,9 @@ return SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir + //SEND_SIGNAL(src, COMSIG_ATOM_POST_DIR_CHANGE, dir, newdir) + if(smoothing_flags & SMOOTH_BORDER_OBJECT) + QUEUE_SMOOTH_NEIGHBORS(src) /** * Called when the atom log's in or out diff --git a/code/modules/industrial_lift/tram/tram_windows.dm b/code/modules/industrial_lift/tram/tram_windows.dm index a837a94e4f5b..1a98a56a0ba6 100644 --- a/code/modules/industrial_lift/tram/tram_windows.dm +++ b/code/modules/industrial_lift/tram/tram_windows.dm @@ -3,6 +3,9 @@ desc = "A window made out of a titanium-silicate alloy. It looks tough to break. Is that a challenge?" icon = 'icons/obj/smooth_structures/tram_window.dmi' icon_state = "tram_mid" + smoothing_flags = SMOOTH_BITMASK|SMOOTH_BORDER_OBJECT + canSmoothWith = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM + smoothing_groups = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM reinf = TRUE heat_resistance = 1600 armor_type = /datum/armor/window_tram @@ -12,6 +15,38 @@ rad_insulation = RAD_MEDIUM_INSULATION glass_material_datum = /datum/material/alloy/titaniumglass +/obj/structure/window/reinforced/tram/Initialize(mapload, direct) + . = ..() + setDir(dir) + +/obj/structure/window/reinforced/tram/setDir(new_dir) + . = ..() + if(fulltile) + return + if(dir & NORTH) + layer = LOW_ITEM_LAYER + else + layer = BELOW_OBJ_LAYER + if(dir & SOUTH) + SET_PLANE_IMPLICIT(src, WALL_PLANE_UPPER) + else + SET_PLANE_IMPLICIT(src, GAME_PLANE) + +/obj/structure/window/reinforced/tram/set_smoothed_icon_state(new_junction) + if(fulltile) + return ..() + smoothing_junction = new_junction + var/smooth_left = (smoothing_junction & turn(dir, 90)) + var/smooth_right = (smoothing_junction & turn(dir, -90)) + if(smooth_left && smooth_right) + icon_state = "tram_mid" + else if (smooth_left) + icon_state = "tram_left" + else if (smooth_right) + icon_state = "tram_right" + else + icon_state = "tram_mid" + /obj/structure/window/reinforced/tram/front name = "tram wall" desc = "A lightweight titanium composite structure with a windscreen installed." @@ -19,35 +54,14 @@ base_icon_state = "tram_window" wtype = "shuttle" fulltile = TRUE + smoothing_flags = NONE + canSmoothWith = null + smoothing_groups = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM flags_1 = PREVENT_CLICK_UNDER_1 explosion_block = 3 glass_amount = 2 receive_ricochet_chance_mod = 1.2 -/obj/structure/window/reinforced/tram/left/directional/north - icon_state = "tram_left" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/left/directional/south - icon_state = "tram_left" - plane = WALL_PLANE_UPPER - -/obj/structure/window/reinforced/tram/mid/directional/north - icon_state = "tram_mid" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/mid/directional/south - icon_state = "tram_mid" - plane = WALL_PLANE_UPPER - -/obj/structure/window/reinforced/tram/right/directional/north - icon_state = "tram_right" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/right/directional/south - icon_state = "tram_right" - plane = WALL_PLANE_UPPER - /datum/armor/window_tram melee = 80 bullet = 5 @@ -55,6 +69,4 @@ fire = 99 acid = 100 -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/left, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/mid, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/right, 0) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram, 0) diff --git a/tools/UpdatePaths/Scripts/76134_tram_window_cleanup.txt b/tools/UpdatePaths/Scripts/76134_tram_window_cleanup.txt new file mode 100644 index 000000000000..a2fcd3168c03 --- /dev/null +++ b/tools/UpdatePaths/Scripts/76134_tram_window_cleanup.txt @@ -0,0 +1,5 @@ +#comment Cleans up manual tram window alignment, made redundant by {} which added automatic alignment on init/dir change + +/obj/structure/window/reinforced/tram/left/@SUBTYPES : /obj/structure/window/reinforced/tram/@SUBTYPES +/obj/structure/window/reinforced/tram/mid/@SUBTYPES : /obj/structure/window/reinforced/tram/@SUBTYPES +/obj/structure/window/reinforced/tram/right/@SUBTYPES : /obj/structure/window/reinforced/tram/@SUBTYPES From f1d28e726679371d35fd4b640ef35aaa69cb9bb5 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 20:35:00 -0400 Subject: [PATCH 36/81] map changes --- _maps/map_files/tramstation/tramstation.dmm | 36 ++++++--------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index eac92289e047..53a798354d2c 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -5742,7 +5742,7 @@ /area/station/commons/fitness/recreation) "aMY" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /turf/open/openspace, /area/station/hallway/primary/tram/center) "aNa" = ( @@ -23405,14 +23405,6 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/plating, /area/station/asteroid) -"gxA" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/north, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 8 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "gxY" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 @@ -37415,7 +37407,7 @@ /area/station/hallway/primary/tram/right) "kYp" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /obj/machinery/destination_sign/south{ pixel_y = -11 }, @@ -45848,7 +45840,7 @@ /area/station/hallway/secondary/command) "nKp" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/left/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /obj/structure/chair/sofa/bench/tram/right{ dir = 8 }, @@ -46204,7 +46196,7 @@ /area/station/ai_monitored/turret_protected/aisat/hallway) "nQc" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /obj/machinery/destination_sign/north{ pixel_y = 10 }, @@ -47601,7 +47593,7 @@ /obj/machinery/destination_sign/north{ pixel_y = 10 }, -/obj/structure/window/reinforced/tram/left/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /obj/structure/chair/sofa/bench/tram/right{ dir = 8 }, @@ -59134,7 +59126,7 @@ /area/station/maintenance/starboard/central) "rZD" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/left/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /obj/structure/chair/sofa/bench/tram/right{ dir = 4 }, @@ -59552,14 +59544,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) -"sgt" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/south, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 4 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "sgu" = ( /obj/structure/table/reinforced, /obj/item/folder/yellow, @@ -67604,7 +67588,7 @@ /obj/machinery/destination_sign/south{ pixel_y = -11 }, -/obj/structure/window/reinforced/tram/left/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/bench/tram/left{ dir = 8 @@ -77798,7 +77782,7 @@ /area/station/science/xenobiology) "xVH" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /turf/open/openspace, /area/station/hallway/primary/tram/center) "xVJ" = ( @@ -176752,11 +176736,11 @@ aEk veL cMD jJV -gxA +nKp hio kpb aEq -sgt +rZD jJV syH pxC From ca1ebd7e868b6b4765dce715e44a951e86bb34db Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 21:21:43 -0400 Subject: [PATCH 37/81] Update leash.dm --- code/datums/components/leash.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/components/leash.dm b/code/datums/components/leash.dm index fa1fce6a1106..dfef7355f980 100644 --- a/code/datums/components/leash.dm +++ b/code/datums/components/leash.dm @@ -200,6 +200,8 @@ qdel(beam) var/atom/movable/movable_parent = parent + if(!length(path)) + return var/turf/first_turf = path[1] var/atom/new_host = movable_parent From c2d59d7c30ce0e3c174d63156a0c50f5bf626565 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Fri, 3 May 2024 21:50:10 -0400 Subject: [PATCH 38/81] Update species.dm --- monkestation/code/modules/smithing/ipcs/species.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/monkestation/code/modules/smithing/ipcs/species.dm b/monkestation/code/modules/smithing/ipcs/species.dm index 7c58adde3a4f..44bc9ade80be 100644 --- a/monkestation/code/modules/smithing/ipcs/species.dm +++ b/monkestation/code/modules/smithing/ipcs/species.dm @@ -38,6 +38,8 @@ mutant_organs = list( /obj/item/organ/internal/cyberimp/arm/item_set/power_cord, + /obj/item/organ/internal/cyberimp/cyberlink/nt_low, + ) external_organs = list( /obj/item/organ/external/antennae/ipc = "None" From 98b0cdc8af019b2bc94a9705491c3d19a220ba48 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sat, 4 May 2024 01:52:34 -0400 Subject: [PATCH 39/81] animate holder. --- code/__DEFINES/vv.dm | 1 + code/game/atoms.dm | 11 + .../animate_holder/animate_child.dm | 295 ++++++++++++++++++ tgstation.dme | 1 + .../packages/tgui/interfaces/AnimateHolder.js | 197 ++++++++++++ 5 files changed, 505 insertions(+) create mode 100644 monkestation/code/modules/cybernetics/animate_holder/animate_child.dm create mode 100644 tgui/packages/tgui/interfaces/AnimateHolder.js diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 58df9d8b31d6..560ca0bb45d3 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -102,6 +102,7 @@ #define VV_HK_EDIT_COLOR_MATRIX "edit_color_matrix" #define VV_HK_ADD_AI "add_ai" #define VV_HK_ARMOR_MOD "mod_obj_armor" +#define VV_HK_ADJUST_ANIMATIONS "adjust_animations" //Monkestation EDIT CYBERNETIC // /atom/movable #define VV_HK_DEADCHAT_PLAYS "deadchat_plays" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a350bbe650f3..2c991cff0cd9 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -340,6 +340,9 @@ if(material_stats) QDEL_NULL(material_stats) + if(animate_holder) + QDEL_NULL(animate_holder) + return ..() /// A quick and easy way to create a storage datum for an atom @@ -1348,6 +1351,7 @@ VV_DROPDOWN_OPTION(VV_HK_EDIT_COLOR_MATRIX, "Edit Color as Matrix") VV_DROPDOWN_OPTION(VV_HK_ADD_AI, "Add AI controller") VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify Armor") + VV_DROPDOWN_OPTION(VV_HK_ADJUST_ANIMATIONS, "Adjust Animations") if(greyscale_colors) VV_DROPDOWN_OPTION(VV_HK_MODIFY_GREYSCALE, "Modify greyscale colors") @@ -1495,6 +1499,13 @@ var/client/C = usr.client C?.open_color_matrix_editor(src) + //monke edit start: CYBERNETIC + if(href_list[VV_HK_ADJUST_ANIMATIONS] && check_rights(R_VAREDIT)) + if(!animate_holder) + animate_holder = new(src) + animate_holder.ui_interact(usr) + //monke edit end: CYBERNETIC + /atom/vv_get_header() . = ..() var/refid = REF(src) diff --git a/monkestation/code/modules/cybernetics/animate_holder/animate_child.dm b/monkestation/code/modules/cybernetics/animate_holder/animate_child.dm new file mode 100644 index 000000000000..29678771fd82 --- /dev/null +++ b/monkestation/code/modules/cybernetics/animate_holder/animate_child.dm @@ -0,0 +1,295 @@ + +/atom + var/datum/animate_holder/animate_holder + +///this currently only supports a single animation set +/datum/animate_holder + var/atom/parent + ///this is a pretty compicated situation where its a list of lists that follow the vars needed for animates + var/list/steps = list() + ///this only exists for ui reasons its basically steps but its a list of all the easing levels and if they are true + var/list/easings = list() + ///list of transformations per step and their type stored as list(type, list(x,x)) + var/list/transforms = list() + ///list of transformation types + var/list/transformation_types = list() + +/datum/animate_holder/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AnimateHolder") + ui.open() + ui.set_autoupdate(TRUE) + +/datum/animate_holder/ui_state(mob/user) + return GLOB.always_state + +/datum/animate_holder/ui_data(mob/user) + var/list/data = list() + data["steps"] = steps + data["easings"] = easings + data["transform_types"] = transformation_types + data["transforms"] = transforms + + return data + +/datum/animate_holder/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("modify_step") + var/list/changes = list() + changes += params["variable"] + changes[params["variable"]] = params["value"] + modify_index_value(params["index"], changes) + . = TRUE + + if("modify_transform_value") + if(params["matrix_type"]) + switch(params["matrix_type"]) + if("rotate") + transformation_types[params["index"]] = MATRIX_ROTATE + if("scale") + transformation_types[params["index"]] = MATRIX_SCALE + if("translate") + transformation_types[params["index"]] = MATRIX_TRANSLATE + + if(params["value1"]) + transforms[params["index"]][1] = params["value1"] + if(params["value2"]) + transforms[params["index"]][2] = params["value2"] + + if("modify_transform") + var/matrix/transform + switch(transformation_types[params["index"]]) + if(MATRIX_ROTATE) + transform = matrix(transforms[params["index"]][1], MATRIX_ROTATE) + if(MATRIX_SCALE) + transform = matrix(transforms[params["index"]][1], transforms[params["index"]][2], MATRIX_SCALE) + if(MATRIX_TRANSLATE) + transform = matrix(transforms[params["index"]][1], transforms[params["index"]][2], MATRIX_TRANSLATE) + + steps[params["index"]] |= "transform" + steps[params["index"]]["transform"] = transform + + if("add_blank_step") + add_blank_step() + . = TRUE + + if("remove_step") + remove_step(params["index"]) + . = TRUE + + if("modify_easing") + update_easing_step(params["index"], params["flag"], params["value"]) + . = TRUE + +/datum/animate_holder/New(atom/creator) + parent = creator + + if(parent) + RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(handle_parent_del)) + +/datum/animate_holder/proc/handle_parent_del() + SIGNAL_HANDLER + remove_data() + +/datum/animate_holder/proc/remove_data(from_destroy = FALSE) + if(!parent) + return + UnregisterSignal(parent, COMSIG_QDELETING) + steps.Cut(1) + easings.Cut(1) + transforms.Cut(1) + transformation_types.Cut(1) + reanimate() + parent.animate_holder = null + parent = null + if(!from_destroy) + qdel(src) + +/datum/animate_holder/Destroy(force, ...) + remove_data(TRUE) + . = ..() + + +/datum/animate_holder/proc/reanimate() + var/first_item = TRUE + for(var/list/held_list as anything in steps) + if(!length(held_list)) + animate(parent) + continue + + if(first_item) + animate(arglist(list(parent) + held_list)) + first_item = FALSE + else + if(held_list["flags"] == ANIMATION_PARALLEL) + animate(arglist(list(parent) + held_list)) + else + animate(arglist(held_list)) + +/datum/animate_holder/proc/add_animation_step(list/addition) + steps += list(addition) + adjust_easing_list(addition, length(steps)) + reanimate() + +/datum/animate_holder/proc/update_easing_step(index = 1, easing_flag, value) + if(!steps[index] || !easings[index]) + return + easings[index][easing_flag] = value + convert_easing_list(index) + +/datum/animate_holder/proc/convert_easing_list(index = 1) + var/list/easing = easings[index] + + var/ending_easing_value = NONE + + if(easing["LINEAR_EASING"]) + ending_easing_value |= LINEAR_EASING + if(easing["SINE_EASING"]) + ending_easing_value |= SINE_EASING + if(easing["CIRCULAR_EASING"]) + ending_easing_value |= CIRCULAR_EASING + if(easing["QUAD_EASING"]) + ending_easing_value |= QUAD_EASING + if(easing["CUBIC_EASING"]) + ending_easing_value |= CUBIC_EASING + if(easing["BOUNCE_EASING"]) + ending_easing_value |= BOUNCE_EASING + if(easing["ELASTIC_EASING"]) + ending_easing_value |= ELASTIC_EASING + if(easing["BACK_EASING"]) + ending_easing_value |= BACK_EASING + if(easing["JUMP_EASING"]) + ending_easing_value |= JUMP_EASING + + if(!steps[index]["easing"]) + steps[index] |= "easing" + + steps[index]["easing"] = ending_easing_value + reanimate() + +/datum/animate_holder/proc/adjust_easing_list(list/addition, index = 1) + var/list/easing = list( + "LINEAR_EASING" = FALSE, + "SINE_EASING" = FALSE, + "CIRCULAR_EASING" = FALSE, + "QUAD_EASING" = FALSE, + "CUBIC_EASING" = FALSE, + "BOUNCE_EASING" = FALSE, + "ELASTIC_EASING" = FALSE, + "BACK_EASING" = FALSE, + "JUMP_EASING" = FALSE, + ) + + if(addition["easing"]) + var/easing_value = addition["easing"] + + if(easing_value & LINEAR_EASING) + easing["LINEAR_EASING"] = TRUE + if(easing_value & SINE_EASING) + easing["SINE_EASING"] = TRUE + if(easing_value & CIRCULAR_EASING) + easing["CIRCULAR_EASING"] = TRUE + if(easing_value & QUAD_EASING) + easing["QUAD_EASING"] = TRUE + if(easing_value & CUBIC_EASING) + easing["CUBIC_EASING"] = TRUE + if(easing_value & BOUNCE_EASING) + easing["BOUNCE_EASING"] = TRUE + if(easing_value & ELASTIC_EASING) + easing["ELASTIC_EASING"] = TRUE + if(easing_value & BACK_EASING) + easing["BACK_EASING"] = TRUE + if(easing_value & JUMP_EASING) + easing["JUMP_EASING"] = TRUE + easings += list(easing) + +/datum/animate_holder/proc/remove_step(index = 1) + if(!steps[index]) + return // this is modify not add + steps.Cut(index, index+1) + easings.Cut(index, index+1) + transforms.Cut(index, index+1) + transformation_types.Cut(index, index+1) + reanimate() + +/datum/animate_holder/proc/modify_specific_list(index = 1, list/new_list) + if(!steps[index]) + return // this is modify not add + steps[index] = new_list + reanimate() + +/datum/animate_holder/proc/modify_index_value(index = 1, list/change) + if(!steps[index]) + return // this is modify not add + + for(var/item in change) + if(!(item in steps[item])) + steps[index] |= item + steps[index][item] = change[item] + + reanimate() + +/datum/animate_holder/proc/add_blank_step() + easings += list(list( + "LINEAR_EASING" = FALSE, + "SINE_EASING" = FALSE, + "CIRCULAR_EASING" = FALSE, + "QUAD_EASING" = FALSE, + "CUBIC_EASING" = FALSE, + "BOUNCE_EASING" = FALSE, + "ELASTIC_EASING" = FALSE, + "BACK_EASING" = FALSE, + "JUMP_EASING" = FALSE, + )) + + steps += list(list()) + transforms += list(list(1, 1)) + transformation_types += null + +/datum/animate_holder/proc/return_list_strippped_nulls(list/new_list) + //not a complete list but all that I can see being used atm + var/list/base_list = list( + "time" = null, + "loop" = null, + "easing" = null, + "flags" = null, + "alpha" = null, + "color" = null, + "infra_luminosity" = null, + "layer" = null, + "maptext_width" = null, + "maptext_height" = null, + "maptext_x" = null, + "maptext_y" = null, + "luminosity" = null, + "pixel_x" = null, + "pixel_y" = null, + "pixel_w" = null, + "pixel_z" = null, + "transform" = null, + "dir" = null, + "maptext" = null, + ) + for(var/index in new_list) + if(index in base_list) + base_list[index] = new_list[index] + + for(var/item in base_list) + if(base_list[item] == null) + base_list.Cut(item) + + return base_list + + +///list format of the animation step for if the generic add_animate_step proc is missing vars in updates this passes it in as a arglist list. +/atom/proc/add_animation_step_list(list/instructions) + if(!length(instructions)) + return + if(!animate_holder) + animate_holder = new(src) + animate_holder.add_animation_step(instructions) diff --git a/tgstation.dme b/tgstation.dme index a6ae574e12db..24b305bba37e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6305,6 +6305,7 @@ #include "monkestation\code\modules\cybernetics\assets.dm" #include "monkestation\code\modules\cybernetics\tech_nodes.dm" #include "monkestation\code\modules\cybernetics\actions\base_action.dm" +#include "monkestation\code\modules\cybernetics\animate_holder\animate_child.dm" #include "monkestation\code\modules\cybernetics\augments\_base_changes.dm" #include "monkestation\code\modules\cybernetics\augments\chest_augments.dm" #include "monkestation\code\modules\cybernetics\augments\arm_augments\_base.dm" diff --git a/tgui/packages/tgui/interfaces/AnimateHolder.js b/tgui/packages/tgui/interfaces/AnimateHolder.js new file mode 100644 index 000000000000..13ce67039971 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AnimateHolder.js @@ -0,0 +1,197 @@ +import { useBackend } from '../backend'; +import { Window } from '../layouts'; +import { Button, Input, Section, Collapsible, LabeledList, NumberInput, Dropdown } from '../components'; +import { ButtonCheckbox } from '../components/Button'; + +export const AnimateHolder = (props, context) => { + const { act, data } = useBackend(context); + return ( + + + + + + ); +}; + +const AnimateSteps = (props, context) => { + const { act, data } = useBackend(context); + const { steps, easings } = data; + + const variables = [ + { name: 'time', type: 'number' }, + { name: 'loop', type: 'number' }, + { name: 'pixel_y', type: 'number' }, + { name: 'pixel_x', type: 'number' }, + { name: 'color', type: 'text' }, + { name: 'alpha', type: 'number' }, + { name: 'maptext', type: 'text' }, + { name: 'maptext_y', type: 'number' }, + { name: 'maptext_x', type: 'number' }, + { name: 'maptext_width', type: 'number' }, + { name: 'maptext_height', type: 'number' }, + { name: 'layer', type: 'number' }, + { name: 'luminosity', type: 'number' }, + { name: 'dir', type: 'number' }, + ]; + + return ( +
+ {steps.map((step) => ( + + + {variables.map(({ name, type }) => ( + + {type === 'number' ? ( + + act('modify_step', { + variable: name, + value: value, + index: steps.indexOf(step) + 1, + }) + } + /> + ) : ( + + act('modify_step', { + variable: name, + value: value, + index: steps.indexOf(step) + 1, + }) + } + /> + )} + + ))} + + {Object.entries(easings[steps.indexOf(step)]).map( + ([key, value]) => ( + + act('modify_easing', { + flag: key, + value: !value, + index: steps.indexOf(step) + 1, + }) + }> + {key} + + ) + )} + + + + + ))} + +
+ ); +}; + +export const Transform = (props, context) => { + const { step } = props; + const { act, data } = useBackend(context); + const { steps, easings, transforms, transform_types } = data; + const types = ['rotate', 'scale', 'translate']; + + // Get the transform type and transform values for the current step + const transformType = transform_types[step - 1]; // Adjust index since steps are 1-indexed + const transformValues = transforms[step - 1]; // Adjust index since steps are 1-indexed + + // Function to return string representation of transform type + const returnString = (value) => { + switch (value) { + case 5: + return 'Rotate'; + case 6: + return 'Scale'; + case 7: + return 'Translate'; + default: + return 'None'; + } + }; + + // Function to handle change in transform value + const handleTransformChange = (index, value) => { + act('modify_transform_value', { + value1: value, + index: index, + }); + }; + + return ( +
+ + act('modify_transform_value', { + matrix_type: value, + index: step, + }) + } + /> + handleTransformChange(step, value)} + /> + {transformType === 6 && ( // Render second input only if transform type is Scale (value 6) + + act('modify_transform_value', { + value2: value, + index: step, + }) + } + /> + )} + +
+ ); +}; From 17b6daa6d409c0f10585e69b6f6c2dd770c30cb5 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sat, 4 May 2024 14:24:31 -0400 Subject: [PATCH 40/81] auction fix --- code/modules/cargo/markets/market_item.dm | 5 ++++- code/modules/cargo/markets/market_uplink.dm | 14 ++++++++++++-- .../modules/modular_guns/blackmarket/auction.dm | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/code/modules/cargo/markets/market_item.dm b/code/modules/cargo/markets/market_item.dm index cd4279ef40c3..c01804cf6cd0 100644 --- a/code/modules/cargo/markets/market_item.dm +++ b/code/modules/cargo/markets/market_item.dm @@ -26,6 +26,8 @@ var/stock_max = 0 /// Probability for this item to be available. Used by SSblackmarket on init. var/availability_prob = 0 + ///do we use stock + var/uses_stock = TRUE /datum/market_item/New() if(isnull(price)) @@ -52,7 +54,8 @@ // SSblackmarket takes care of the shipping. if(SSblackmarket.queue_item(purchase)) - stock-- + if(uses_stock) + stock-- buyer.log_message("has succesfully purchased [name] using [shipping_method] for shipping.", LOG_ECON) return TRUE return FALSE diff --git a/code/modules/cargo/markets/market_uplink.dm b/code/modules/cargo/markets/market_uplink.dm index 4095078da5e7..15f2fe65b3c6 100644 --- a/code/modules/cargo/markets/market_uplink.dm +++ b/code/modules/cargo/markets/market_uplink.dm @@ -16,7 +16,12 @@ ///Reference to the currently logged in user's bank account. var/datum/bank_account/current_user /// List of typepaths for "/datum/market"s that this uplink can access. - var/list/accessible_markets = list(/datum/market/blackmarket, /datum/market/auction/guns, /datum/market/restock/guns_galore) + var/list/accessible_markets = list( + /datum/market/blackmarket, + /datum/market/auction/guns, + /datum/market/restock/guns_galore, + /datum/market/auction/aftermarket_parts, + ) ///our current_bid var/current_bid = 0 @@ -195,7 +200,12 @@ icon = 'icons/obj/blackmarket.dmi' icon_state = "uplink" //The original black market uplink - accessible_markets = list(/datum/market/blackmarket, /datum/market/auction/guns, /datum/market/restock/guns_galore) + accessible_markets = list( + /datum/market/blackmarket, + /datum/market/auction/guns, + /datum/market/restock/guns_galore, + /datum/market/auction/aftermarket_parts, + ) /datum/crafting_recipe/blackmarket_uplink diff --git a/monkestation/code/modules/modular_guns/blackmarket/auction.dm b/monkestation/code/modules/modular_guns/blackmarket/auction.dm index d3dfcef1cb30..556e9a9eab42 100644 --- a/monkestation/code/modules/modular_guns/blackmarket/auction.dm +++ b/monkestation/code/modules/modular_guns/blackmarket/auction.dm @@ -151,6 +151,7 @@ name = "Back Alley Guns" /datum/market_item/auction + uses_stock = FALSE markets = list(/datum/market/auction) ///the user whos currently bid on it var/mob/user From c7bd4294ccb8cc4a2566ce40174b9d475ac67b63 Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Sun, 5 May 2024 12:07:34 -0400 Subject: [PATCH 41/81] dancing and shitty hacking minigame which has no use as of yet --- .../~monkestation/dcs/signals/signals_atom.dm | 5 + code/__DEFINES/~monkestation/hacking.dm | 9 + code/datums/wires/_wires.dm | 5 +- code/game/machinery/doors/airlock.dm | 11 +- .../modules/cybernetics/elements/dancing.dm | 189 ++++++++++ .../modules/cybernetics/icons/hacking.dmi | Bin 0 -> 881 bytes .../cybernetics/icons/hacking_left.dmi | Bin 0 -> 383 bytes .../cybernetics/icons/hacking_right.dmi | Bin 0 -> 390 bytes .../minigame/airlock_hacking_datum.dm | 47 +++ .../cybernetics/minigame/general_hacking.dm | 356 ++++++++++++++++++ .../cybernetics/sounds/hacking/ddos1.wav | Bin 0 -> 285396 bytes .../cybernetics/sounds/hacking/ddos2.wav | Bin 0 -> 318204 bytes .../cybernetics/sounds/hacking/ddos3.wav | Bin 0 -> 295516 bytes .../cybernetics/sounds/hacking/ddos4.wav | Bin 0 -> 294776 bytes .../sounds/hacking/ddos_failure.wav | Bin 0 -> 121580 bytes .../cybernetics/sounds/hacking/ddos_start.wav | Bin 0 -> 700664 bytes .../sounds/hacking/ddos_success.wav | Bin 0 -> 275496 bytes tgstation.dme | 4 + .../tgui/interfaces/HackingMinigame.js | 206 ++++++++++ 19 files changed, 827 insertions(+), 5 deletions(-) create mode 100644 code/__DEFINES/~monkestation/hacking.dm create mode 100644 monkestation/code/modules/cybernetics/elements/dancing.dm create mode 100644 monkestation/code/modules/cybernetics/icons/hacking.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/hacking_left.dmi create mode 100644 monkestation/code/modules/cybernetics/icons/hacking_right.dmi create mode 100644 monkestation/code/modules/cybernetics/minigame/airlock_hacking_datum.dm create mode 100644 monkestation/code/modules/cybernetics/minigame/general_hacking.dm create mode 100644 monkestation/code/modules/cybernetics/sounds/hacking/ddos1.wav create mode 100644 monkestation/code/modules/cybernetics/sounds/hacking/ddos2.wav create mode 100644 monkestation/code/modules/cybernetics/sounds/hacking/ddos3.wav create mode 100644 monkestation/code/modules/cybernetics/sounds/hacking/ddos4.wav create mode 100644 monkestation/code/modules/cybernetics/sounds/hacking/ddos_failure.wav create mode 100644 monkestation/code/modules/cybernetics/sounds/hacking/ddos_start.wav create mode 100644 monkestation/code/modules/cybernetics/sounds/hacking/ddos_success.wav create mode 100644 tgui/packages/tgui/interfaces/HackingMinigame.js diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm index 89b72655d4e6..4e3566280e4f 100644 --- a/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_atom.dm @@ -12,3 +12,8 @@ ///Called by either cell/proc/give or cell/proc/use #define COMSIG_CELL_CHANGE_POWER "cell_change_power" + + +/// Mob is trying to open the hacking menu of a target [/atom], from /datum/hacking/interactable(): (mob/user) +#define COMSIG_TRY_HACKING_INTERACT "try_hacking_interact" + #define COMPONENT_CANT_INTERACT_HACKING (1<<0) diff --git a/code/__DEFINES/~monkestation/hacking.dm b/code/__DEFINES/~monkestation/hacking.dm new file mode 100644 index 000000000000..fd19e07b9d6b --- /dev/null +++ b/code/__DEFINES/~monkestation/hacking.dm @@ -0,0 +1,9 @@ +// Tool types, if you add new ones please add them to /obj/item/debug/omnitool in code/game/objects/items/debug_items.dm +#define TOOL_HACKING "hacking" +GLOBAL_LIST_EMPTY(hacking_actions_by_key) +/// Cooldown for hacking attacks +#define HACKING_ATTACK_COOLDOWN_DURATION 2 SECONDS +#define ishackingtool(O) (istype(O, /obj/item/ddos)) + +#define TRAIT_DANCING "dancing_trait" +#define EMOTE_TRAIT "trait_source_emote" diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 575371b1fa69..4502b168d396 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -4,7 +4,7 @@ if(!I) return - if(I.tool_behaviour == TOOL_WIRECUTTER || I.tool_behaviour == TOOL_MULTITOOL) + if(I.tool_behaviour == TOOL_WIRECUTTER || I.tool_behaviour == TOOL_MULTITOOL || I.tool_behaviour == TOOL_HACKING) return TRUE if(isassembly(I)) var/obj/item/assembly/A = I @@ -256,7 +256,8 @@ // Station blueprints do that too, but only if the wires are not randomized. if(user.is_holding_item_of_type(/obj/item/areaeditor/blueprints) && !randomize) return TRUE - + if(revealed_wires) + return TRUE return FALSE /** diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b57fa82b09de..45aed88e0630 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1000,9 +1000,14 @@ return add_fingerprint(user) - if(is_wire_tool(C) && panel_open) - attempt_wire_interaction(user) - return + if(is_wire_tool(C)) + if(panel_open) + attempt_wire_interaction(user) + return + else + attempt_hacking_interaction(user) + return + else if(panel_open && security_level == AIRLOCK_SECURITY_NONE && istype(C, /obj/item/stack/sheet)) if(istype(C, /obj/item/stack/sheet/iron)) return try_reinforce(user, C, 2, AIRLOCK_SECURITY_IRON) diff --git a/monkestation/code/modules/cybernetics/elements/dancing.dm b/monkestation/code/modules/cybernetics/elements/dancing.dm new file mode 100644 index 000000000000..108e3de7cc63 --- /dev/null +++ b/monkestation/code/modules/cybernetics/elements/dancing.dm @@ -0,0 +1,189 @@ +//now what does dancing have to do with cybernetics? +//idk stop asking :) - borbop + +// Dancing +/datum/emote/living/dance + key = "dance" + key_third_person = "dances" + message = "dances around happily." + muzzle_ignore = TRUE + hands_use_check = FALSE + cooldown = 2 SECONDS + +/datum/emote/living/dance/run_emote(mob/user, params, type_override, intentional) + . = TRUE + if(!can_run_emote(user, TRUE, intentional)) + return FALSE + if((user.movement_type & FLOATING) || HAS_TRAIT(user, TRAIT_FLOORED) || HAS_TRAIT(user, TRAIT_INCAPACITATED) \ + || HAS_TRAIT_NOT_FROM(user, TRAIT_DANCING, EMOTE_TRAIT)) + return FALSE + + var/static/list/possible_affirmative_messages = list( + "starts dancing!", + "busts a move!", + "busts a groove!", + "boogies!", + "rocks it out!", + "goes with the flow!", + "slams it on the dance floor!", + "jujus on that beat!", + "ghost rides the whip!", + "does the macarena!", + "does the gangnam style!", + "does the harlem shake!", + "does the mario!", + "does the whip AND nae nae!", + "starts flossing!", + "default dances!",, + "starts mario partying!", + ) + var/static/list/possible_negative_messages = list( + "stops dancing!", + "sobers up!", + "stops boogying!", + "loses the flow!", + "breaks the breakdance!", + "is no longer goated with the sauce!", + "no longer has a loose foot!", + ) + var/is_intentionally_dancing = HAS_TRAIT_FROM(user, TRAIT_DANCING, EMOTE_TRAIT) + var/msg = is_intentionally_dancing ? pick(possible_negative_messages) : pick(possible_affirmative_messages) + if(!msg) + return + + user.log_message(msg, LOG_EMOTE) + var/dchatmsg = "[user] [msg]" + + var/tmp_sound = get_sound(user) + if(tmp_sound && (!only_forced_audio || !intentional) && !TIMER_COOLDOWN_CHECK(user, type)) + TIMER_COOLDOWN_START(user, type, audio_cooldown) + playsound(user, tmp_sound, 50, vary) + + var/user_turf = get_turf(user) + if(user.client) + for(var/mob/ghost as anything in GLOB.dead_mob_list) + if(!ghost.client || isnewplayer(ghost)) + continue + if(ghost.client.prefs?.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) + ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") + + if(emote_type == EMOTE_AUDIBLE) + user.audible_message(msg, audible_message_flags = EMOTE_MESSAGE) + else + user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE) + + if(!is_intentionally_dancing) + user.AddElement(/datum/element/dancing, EMOTE_TRAIT) + else + user.RemoveElement(/datum/element/dancing, EMOTE_TRAIT) + SEND_SIGNAL(user, COMSIG_MOB_EMOTED(key)) + + +/datum/element/dancing + argument_hash_start_idx = 2 + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_BESPOKE + /// The source of the dancing trait we give + var/trait_source = EMOTE_TRAIT + /// Signals that cause us to detach + var/static/list/dancing_stop_signals + ///this is our dance + var/datum/dance/chosen_dance + +/datum/element/dancing/New() + . = ..() + if(!dancing_stop_signals) + dancing_stop_signals = list( + SIGNAL_ADDTRAIT(TRAIT_MOVE_FLOATING), + SIGNAL_ADDTRAIT(TRAIT_FLOORED), + SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), + ) + +/datum/element/dancing/Attach(datum/target, trait_source) + . = ..() + if(!isatom(target) || isarea(target)) + return ELEMENT_INCOMPATIBLE + src.trait_source = trait_source + if(!HAS_TRAIT(target, TRAIT_DANCING)) + var/list/dances = typesof(/datum/dance) + chosen_dance = pick(dances) + chosen_dance = new chosen_dance + INVOKE_ASYNC(chosen_dance, TYPE_PROC_REF(/datum/dance, trigger_dance), target) + ADD_TRAIT(target, TRAIT_IMMOBILIZED, trait_source) + ADD_TRAIT(target, TRAIT_DANCING, trait_source) + RegisterSignal(target, dancing_stop_signals, PROC_REF(stop_dancing)) + +/datum/element/dancing/Detach(datum/source, datum/target, trait_source) + . = ..() + REMOVE_TRAIT(source, TRAIT_DANCING, trait_source) + REMOVE_TRAIT(source, TRAIT_IMMOBILIZED, trait_source) + if(!HAS_TRAIT(source, TRAIT_DANCING)) + chosen_dance?.end_dance(source) + QDEL_NULL(chosen_dance) + UnregisterSignal(target, dancing_stop_signals) + +/datum/element/dancing/proc/stop_dancing(atom/movable/source) + SIGNAL_HANDLER + + Detach(source) + + +/datum/dance + var/continues = TRUE + +/datum/dance/proc/trigger_dance(mob/target) + animate(target, pixel_y = 2, time = 2, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -2, time = 2, flags = ANIMATION_RELATIVE) + +/datum/dance/proc/end_dance(mob/target) + var/final_pixel_y = target.base_pixel_y + // Living mobs also have a 'body_position_pixel_y_offset' variable that has to be taken into account here. + if(isliving(target)) + var/mob/living/living_target = target + final_pixel_y += living_target.body_position_pixel_y_offset + animate(target, pixel_y = final_pixel_y, time = 0.5 SECONDS) + +/datum/dance/head_spin/trigger_dance(mob/living/target) + animate(target, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) + var/matrix/initial_matrix = matrix(target.transform) + for (var/i in 1 to 60) + if (!target) + return + if(!continues) + break + if (i<31) + initial_matrix = matrix(target.transform) + initial_matrix.Translate(0,1) + animate(target, transform = initial_matrix, time = 1, loop = 0) + if (i>30) + initial_matrix = matrix(target.transform) + initial_matrix.Translate(0,-1) + animate(target, transform = initial_matrix, time = 1, loop = 0) + target.setDir(turn(target.dir, 90)) + switch (target.dir) + if (NORTH) + initial_matrix = matrix(target.transform) + initial_matrix.Translate(0,3) + animate(target, transform = initial_matrix, time = 1, loop = 0) + if (SOUTH) + initial_matrix = matrix(target.transform) + initial_matrix.Translate(0,-3) + animate(target, transform = initial_matrix, time = 1, loop = 0) + if (EAST) + initial_matrix = matrix(target.transform) + initial_matrix.Translate(3,0) + animate(target, transform = initial_matrix, time = 1, loop = 0) + if (WEST) + initial_matrix = matrix(target.transform) + initial_matrix.Translate(-3,0) + animate(target, transform = initial_matrix, time = 1, loop = 0) + sleep(1) + if(continues) + restart_dance(target) + return + target.lying_fix() + +/datum/dance/head_spin/proc/restart_dance(mob/target) + INVOKE_ASYNC(src, PROC_REF(trigger_dance), target) + +/datum/dance/head_spin/end_dance(mob/target) + continues = FALSE diff --git a/monkestation/code/modules/cybernetics/icons/hacking.dmi b/monkestation/code/modules/cybernetics/icons/hacking.dmi new file mode 100644 index 0000000000000000000000000000000000000000..652050a43abc87726e769f0ffe9ee2b4c73d5600 GIT binary patch literal 881 zcmV-%1CIQOP)004jp0{{R3ySg65TzLM#0002Mz`$PQBnbcj00DGTPE!Ct=GbNc006OiR9JLGWpiV4 zX>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3K9+B_+RDiHkEOv#1!zHRR$Z5|6V7mpE3N4WDm3)Zn< zlOEt{9$N*<)`tY^NN|@JK2FDeDoChk{VBn^zMSGzP&C2zwg#Ksw*~Gw-`-v%O{GsT zqG?>>CrevdccE!^J7s=s*mnI)$Afxlp_G0<)AQJC6eOZ&s)-B_l?k#SpIr*YXtfG* z?HR{g1!p>Gos?OS!u`f+OfX!>8(Ldkl2l@kcURWkRZDe9fm`=%@9c& z-Eh80h-;C^(SA=0+iF3=Mbhz|&>UV4rnf;**AJ6Zf;1;+LzKD%rv%R%hThq}U;5=F zNXN9@g|P3ER!V5i@akT}j#Z!AL|cvXp7l*yWtrBDgBuhJR@E?$;~S&&6axTO$+afp z*2tFm_lPa?+3r)^Kio1OzW6wQY!l4%@8bU9mU$LCzMnqsm*Ba7_}Tn=g2zjU+XU6u zpmsq30000000000fbEpFChp$4DDB_n)|U$w_V04*%LNPjce(XHAovGrP_-Zc{~D+F zJ%bb08^89Ji+9fXU$a@jdcP{@y!E09=LNm2V6Fzm1*f+X3+4d;0000000000002NQ z`X3XR^(MFcV*=w>|Id-L(oJrk6_hQ3FFYoY6~to#0RAi=f>}CGi)HqX00000NkvXX Hu0mjfMf!=T literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/hacking_left.dmi b/monkestation/code/modules/cybernetics/icons/hacking_left.dmi new file mode 100644 index 0000000000000000000000000000000000000000..10ed4c4f39bcf821a07ad14ca29d993ea3bf9b10 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LK*8>L*$jKR*m^c;xe`B2c zpVM7&&TZ#k?|Y=G>>>}EZoAyQ6R480B*-tA!Qt7BG$1FlDkP%BCAB!YD6^m>Ge3`k zp<+&OSV2+g_b>|iJ3p<9$1psqLQ4vgHtR7DpC+}he(~DWA^_=dEkt-=n(t6;a#lK;S7!S`0R+ed(l9n(t%#spe Uu!%060CXjTr>mdKI;Vst0QLroB>(^b literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/icons/hacking_right.dmi b/monkestation/code/modules/cybernetics/icons/hacking_right.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6946abf8c738d0a75886cf34f5a2a1366cd3bd11 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LK*8>L*$jKR*m^c;xe`B2c zf6i@ZPItv$?|Y=G>>>}E-tjbD1XRgb666=m;PC858jzD&6%tY6l3JWxlvz-cnV-kN zP%$Sste~j$`^4^2yh370d$;jg4MTI$BW6#6!V10?GtTB>5PvPXLv#^~Gtkn7 zo-U3d9-YYv60C=LIW##RgfGZh)DYj;#l4D&-6n65UMV zDXe-=A`VKmC2Vd@3OvxW#Cs)B)Xb43dIN8FlccdgPM_opR+bA_wwa~)F}E=t++vdA g$0TO$X2!sfe^MlO^DQ1Npko<4UHx3vIVCg!0ITwes{jB1 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/minigame/airlock_hacking_datum.dm b/monkestation/code/modules/cybernetics/minigame/airlock_hacking_datum.dm new file mode 100644 index 000000000000..b178c5a89ccc --- /dev/null +++ b/monkestation/code/modules/cybernetics/minigame/airlock_hacking_datum.dm @@ -0,0 +1,47 @@ +/datum/wires + var/revealed_wires = FALSE + +/datum/hacking/airlock + holder_type = /obj/machinery/door/airlock + proper_name = "Generic Airlock" + hacking_actions = "airlock" + +/datum/hacking/airlock/generate_hacking_actions() + GLOB.hacking_actions_by_key[hacking_actions] = list( + "Scan" = .proc/scan_wires, + "Bolts" = .proc/bolt_airlock, + "Open" = .proc/open_airlock, + "Destroy" = .proc/destroy_holder, + ) + return GLOB.hacking_actions_by_key[hacking_actions] + +/datum/hacking/airlock/destroy_holder(mob/living/hackerman) + var/obj/machinery/door/airlock/airlock = holder + airlock.deconstruct(FALSE) + +/datum/hacking/airlock/proc/scan_wires(atom/hackerman) + holder.wires?.revealed_wires = TRUE + +/datum/hacking/airlock/proc/bolt_airlock(atom/hackerman) + var/obj/machinery/door/airlock/airlock = holder + if(airlock.locked) + airlock.unbolt() + else + airlock.bolt() + +/datum/hacking/airlock/proc/open_airlock(atom/hackerman) + var/obj/machinery/door/airlock/airlock = holder + if(airlock.locked) + airlock.unbolt() + airlock.open() + + +/obj/machinery/door/airlock/Initialize(mapload) + . = ..() + hacking = set_hacking() + +/** + * Generates the airlock's hacking datum. + */ +/obj/machinery/door/airlock/proc/set_hacking() + return new /datum/hacking/airlock(src) diff --git a/monkestation/code/modules/cybernetics/minigame/general_hacking.dm b/monkestation/code/modules/cybernetics/minigame/general_hacking.dm new file mode 100644 index 000000000000..9480cb0c8db2 --- /dev/null +++ b/monkestation/code/modules/cybernetics/minigame/general_hacking.dm @@ -0,0 +1,356 @@ +PROCESSING_SUBSYSTEM_DEF(hacking) + name = "Hacking" + wait = 1 SECONDS + priority = FIRE_PRIORITY_NPC + stat_tag = "Hacking" + + +/atom + /// Some atoms can be hacked so awesome + var/datum/hacking/hacking = null + +/// Attempts to open the hacking interface +/atom/proc/attempt_hacking_interaction(mob/user) + if(!hacking) + return WIRE_INTERACTION_FAIL + if(!user.CanReach(src)) + return WIRE_INTERACTION_FAIL + hacking.interact(user) + return WIRE_INTERACTION_BLOCK + +/datum/hacking + /// The holder (atom that contains this hacking datum) + var/atom/holder + /// The hacker (mob currently hacking us) + var/mob/living/hacker + /// The hacking tool being used + var/obj/item/hackingtool + /// The holder's typepath (used for sanity checks to make sure the holder is the appropriate type for this hacking datum) + var/holder_type = null + /// The display name for the hacking type, might get shown somewhere at some point + var/proper_name = "Unknown" + + /// Initial attack value for holder + var/initial_holder_attack = 100 + /// Initial health value for holder + var/initial_holder_health = 100 + /// Initial defense value for holder + var/initial_holder_defense = 100 + + /// Holder's current attack stat + var/holder_attack + /// Holder's current health stat + var/holder_health + /// Holder's current defense stat + var/holder_defense + /// Last attack the holder performed + var/holder_last_attack + + /// Cooldown for the holder's actions + COOLDOWN_DECLARE(holder_action_cooldown) + + /// Hacker's current attack stat + var/hacker_attack + /// Hacker's current health stat + var/hacker_health + /// Hacker's current defense stat + var/hacker_defense + /// Last attack the hacker performed + var/hacker_last_attack + + /// Cooldown for the hacker's actions + COOLDOWN_DECLARE(hacker_action_cooldown) + + /** + * What hacking actions can be done to this holder, and what proc it calls when successful + * Starts out as a key for the hacking actions list. + */ + var/list/hacking_actions = "generic" + /// Current hacking action being done + var/current_hacking_action + /// Whether we have already been hacked or not + var/hacked = FALSE + +/datum/hacking/New(atom/new_holder) + . = ..() + if(!islist(hacking_actions)) + hacking_actions = get_hacking_actions() + if(new_holder) + set_holder(new_holder) + +/datum/hacking/Destroy() + . = ..() + stop_hacking() + if(hacker) + unset_hacker(hacker) + if(holder) + unset_holder(holder) + hacking_actions = null + +/datum/hacking/ui_host() + return holder + +/datum/hacking/ui_status(mob/user) + if(!interactable(user)) + return UI_CLOSE + return ..() + +/datum/hacking/ui_state(mob/user) + return GLOB.physical_state + +/datum/hacking/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "HackingMinigame", "[holder.name] Hacking") + ui.open() + +/datum/hacking/ui_data(mob/user) + var/list/data = list() + + data["hacked"] = hacked + data["hacking_name"] = proper_name + data["holder_name"] = holder.name + var/list/hacking_actions_flat = list() + for(var/action in hacking_actions) + hacking_actions_flat |= action + data["hacking_actions"] = hacking_actions_flat + data["current_hacking_action"] = current_hacking_action + if(current_hacking_action) + data["holder_attack"] = holder_attack + data["holder_health"] = holder_health + data["holder_defense"] = holder_defense + data["holder_last_attack"] = holder_last_attack + var/holder_percent = clamp(FLOOR((1 - (holder_action_cooldown - world.time)/(HACKING_ATTACK_COOLDOWN_DURATION)) * 100, 1), 0, 100) + data["holder_cooldown"] = holder_percent + + data["hacker_attack"] = hacker_attack + data["hacker_health"] = hacker_health + data["hacker_defense"] = hacker_defense + data["hacker_last_attack"] = hacker_last_attack + var/hacker_percent = clamp(FLOOR((1 - (hacker_action_cooldown - world.time)/(HACKING_ATTACK_COOLDOWN_DURATION)) * 100, 1), 0, 100) + data["hacker_cooldown"] = hacker_percent + else + data["holder_attack"] = initial_holder_attack + data["holder_health"] = initial_holder_health + data["holder_defense"] = initial_holder_defense + + return data + +/datum/hacking/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/living/user = usr + switch(action) + if("start_hacking") + if(current_hacking_action) + return + var/hacking_action = params["hacking_action"] + set_hacker(user) + start_hacking(hacking_action, user) + playsound(holder, 'monkestation/code/modules/cybernetics/sounds/hacking/ddos_start.wav', 80, FALSE) + if("do_attack") + if((user != hacker) || !COOLDOWN_FINISHED(src, hacker_action_cooldown)) + return + var/attack_type = params["hacking_attack"] + hacker_attack(attack_type) + return TRUE + +/datum/hacking/process(delta_time) + if(holder_health <= 0) + hacker_win() + stop_hacking() + return + if(hacker_health <= 0) + hacker_loss() + stop_hacking() + return + if(!COOLDOWN_FINISHED(src, holder_action_cooldown)) + return + var/holder_attack_type = get_holder_attack() + holder_attack(holder_attack_type) + +/datum/hacking/proc/interact(mob/user) + if(!interactable(user)) + return + ui_interact(user) + +/datum/hacking/proc/interactable(mob/user) + SHOULD_CALL_PARENT(TRUE) + if(SEND_SIGNAL(user, COMSIG_TRY_HACKING_INTERACT, holder) & COMPONENT_CANT_INTERACT_HACKING) + return FALSE + if(!user.is_holding_tool_quality(TOOL_HACKING)) + return FALSE + return TRUE + +/datum/hacking/proc/set_hacking_stats() + SHOULD_CALL_PARENT(TRUE) + holder_attack = initial_holder_attack + holder_health = initial_holder_health + holder_defense = initial_holder_defense + +/datum/hacking/proc/start_hacking(hacking_action = "Destroy", mob/living/hackerman) + if(hacked) + playsound(holder, 'monkestation/code/modules/cybernetics/sounds/hacking/ddos_success.wav', 80, FALSE) + return do_hacking_action(hacking_action, hackerman) + set_hacking_stats() + + current_hacking_action = hacking_action + hacker_attack = 5 * 7 + hacker_health = 5 * 10 + hacker_defense = 5 * 8 + + var/obj/item/ddos = hackerman.get_active_held_item() + if(ddos.tool_behaviour == TOOL_HACKING) + hackingtool = ddos + if(ishackingtool(hackingtool)) + hackingtool.cut_overlays() + hackingtool.add_overlay("bluescreen") + + COOLDOWN_START(src, hacker_action_cooldown, 0) + COOLDOWN_START(src, holder_action_cooldown, HACKING_ATTACK_COOLDOWN_DURATION) + START_PROCESSING(SShacking, src) + +/datum/hacking/proc/stop_hacking() + current_hacking_action = null + if(hacker) + unset_hacker(hacker) + if(hackingtool) + UnregisterSignal(hackingtool, COMSIG_QDELETING) + addtimer(CALLBACK(hackingtool, /atom/proc/cut_overlays), 2 SECONDS) + hackingtool = null + STOP_PROCESSING(SShacking, src) + +/datum/hacking/proc/hacker_attack(attack_type = "Attack") + COOLDOWN_START(src, hacker_action_cooldown, HACKING_ATTACK_COOLDOWN_DURATION) + playsound(holder, "monkestation/code/modules/cybernetics/sounds/hacking/ddos[rand(1, 4)].wav", 80, FALSE) + switch(attack_type) + if("Attack") + var/damage = max(0, hacker_attack - holder_defense) + holder_health = max(0, holder_health - damage) + if("Mask") + holder_attack = max(0, holder_attack - 37) + if("Scan") + holder_defense = max(0, holder_defense - 35) + if("Shield") + hacker_defense = max(0, hacker_defense + 36) + if("Overflow") + hacker_attack = max(0, hacker_attack + 37) + hacker_defense = max(0, hacker_defense - 22) + hacker_last_attack = attack_type + +/datum/hacking/proc/holder_attack(attack_type = "Attack") + COOLDOWN_START(src, holder_action_cooldown, HACKING_ATTACK_COOLDOWN_DURATION) + playsound(holder, "monkestation/code/modules/cybernetics/sounds/hacking/ddos[rand(1, 4)].wav", 80, FALSE) + switch(attack_type) + if("Attack") + var/damage = max(0, holder_attack - hacker_defense) + hacker_health = max(0, hacker_health - damage) + if("Mask") + hacker_attack = max(0, hacker_attack - 37) + if("Scan") + hacker_defense = max(0, hacker_defense - 35) + if("Shield") + holder_defense = max(0, holder_defense + 36) + if("Overflow") + holder_attack = max(0, holder_attack + 37) + holder_defense = max(0, holder_defense - 22) + holder_last_attack = attack_type + +/datum/hacking/proc/get_holder_attack() + var/final_attack = "Attack" + if((hacker_defense >= holder_attack) && prob(75)) + final_attack = "Scan" + if((holder_defense < 20) && prob(75)) + final_attack = "Shield" + if((holder_attack < 20) && prob(75)) + final_attack = "Overflow" + return final_attack + +/datum/hacking/proc/hacker_win() + hacked = TRUE + playsound(holder, "monkestation/code/modules/cybernetics/sounds/hacking/ddos_success.wav", 80, FALSE) + if(hackingtool) + if(ishackingtool(hackingtool)) + hackingtool.cut_overlays() + hackingtool.add_overlay("greenscreen") + addtimer(CALLBACK(hackingtool, /atom/proc/cut_overlays), 1 SECONDS) + return do_hacking_action(current_hacking_action, hacker) + +/datum/hacking/proc/hacker_loss() + playsound(holder, "monkestation/code/modules/cybernetics/sounds/hacking/ddos_failure.wav", 80, FALSE) + if(hackingtool) + if(ishackingtool(hackingtool)) + hackingtool.cut_overlays() + hackingtool.add_overlay("redscreen") + addtimer(CALLBACK(hackingtool, /atom/proc/cut_overlays), 1 SECONDS) + +/datum/hacking/proc/do_hacking_action(action = "Destroy", mob/living/hackerman) + return call(src, hacking_actions[action])(hackerman) + +/datum/hacking/proc/destroy_holder(mob/living/hackerman) + holder.atom_break(BOMB) + +/datum/hacking/proc/get_hacking_actions() + if(GLOB.hacking_actions_by_key[hacking_actions]) + return GLOB.hacking_actions_by_key[hacking_actions] + return generate_hacking_actions() + +/datum/hacking/proc/generate_hacking_actions() + GLOB.hacking_actions_by_key[hacking_actions] = list( + "Destroy" = .proc/destroy_holder, + ) + return GLOB.hacking_actions_by_key[hacking_actions] + +/datum/hacking/proc/set_holder(atom/new_holder) + if(!istype(new_holder, holder_type)) + CRASH("Hacking holder is not of the expected type! ([new_holder.type], should be [holder_type])") + holder = new_holder + RegisterSignal(new_holder, COMSIG_QDELETING, .proc/on_holder_qdel) + +/datum/hacking/proc/unset_holder(atom/previous_holder) + holder = null + UnregisterSignal(previous_holder, COMSIG_QDELETING) + stop_hacking() + +/datum/hacking/proc/set_hacker(atom/new_hacker) + hacker = new_hacker + RegisterSignal(new_hacker, COMSIG_QDELETING, .proc/on_hacker_qdel) + +/datum/hacking/proc/unset_hacker(atom/previous_holder) + hacker = null + UnregisterSignal(previous_holder, COMSIG_QDELETING) + stop_hacking() + +/datum/hacking/proc/on_holder_qdel(atom/source, force) + SIGNAL_HANDLER + + unset_holder(source) + qdel(src) + +/datum/hacking/proc/on_hacker_qdel(atom/source, force) + SIGNAL_HANDLER + + unset_hacker(source) + +/datum/hacking/proc/on_hackingtool_qdel(atom/source, force) + SIGNAL_HANDLER + + UnregisterSignal(hackingtool, COMSIG_QDELETING) + hackingtool = null + + +/obj/item/ddos + name = "denial of service device" + desc = "A compact, hastily thrown together circuitboard used to hack into a myriad of electronics." + icon = 'monkestation/code/modules/cybernetics/icons/hacking.dmi' + icon_state = "ddos" + lefthand_file = 'monkestation/code/modules/cybernetics/icons/hacking_left.dmi' + righthand_file = 'monkestation/code/modules/cybernetics/icons/hacking_right.dmi' + tool_behaviour = TOOL_HACKING + toolspeed = 1 + w_class = WEIGHT_CLASS_SMALL + +/obj/item/ddos/examine_more(mob/user) + . = ..() + var/botnets = rand(1, 100) + . += span_info("[src] reports...") + . += span_big(span_alert("[botnets] BOTNET[botnets == 1 ? "" : "S"] ONLINE")) diff --git a/monkestation/code/modules/cybernetics/sounds/hacking/ddos1.wav b/monkestation/code/modules/cybernetics/sounds/hacking/ddos1.wav new file mode 100644 index 0000000000000000000000000000000000000000..e538592202dda5227783a4022af35f2fa6bed666 GIT binary patch literal 285396 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 z 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⪻}LY`xRFA?S^h#tiJ5jY@T9`SxwnsS!{VA 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
-QV@^y7%=dd+6u2t@U@OU(Nr{ z8x++UBwc^k_IGvF`6G^de1CfT-_0sX@~5c14lIDNQxDTw1=&xZ^uh=>C_*>@n zRoS)t)w9oeH!KF5JMVLi*BrL-Yu@hf7VlE`^~(M&rGxRItFQU)-T`_f%(?p0wbX&y z-#Sb;e(85-v%R05`TyRl8<#)2zE?kgRPLsU-#eyvy*C8@HX(5Hrt4pS{I=469a{X? z&+c9F_e0>fQpWG^>EF+q(`G-P{VbPCu3qW$v(Ig<^yep^bClh2*SoLx{EtlEl=nwM z_ucmIfxyih>fiVA;O}YmZ@bQ4f=~YvefTZ7QXBK zaQpL0@OS0k`9FrhAA_YI_xXPMhQJ#FZwS00@P@z}0&fVsA@GL48v<_#ydm(0z#9T@ z2)rTihQJ#FZwS00@P@z}0&fVsA@GL4X9&Dku0F%$o%6Q~fwQvx=byuySN{AkeYg0A zz#9T@2)rTihQJ#FZwS00@HGV9w&&MydFQ?%@b4>cynWp_?Y|-LhQJ#FZwS00@P@z} z0&fVsA@GL48v<_#ydm(0z#9T@2)rTihQJ#FZwS00@P@z}0&fVsA@GL48v<_#ydm(0 zz#9T@2)rTihQJ#FZwS00@P@z}0&fVsA@GL48v<_#ydm(0z#9T@2)rTihQJ#FZwS00 z@P@z}0&fVsA@GL48v<_#ydm(0z#9T@2)rTihQJ#FZwS00@P@z}0&fVsA@GL48v<_# Pydm(0z#9VJL*V}dDqwAD literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/cybernetics/sounds/hacking/ddos2.wav b/monkestation/code/modules/cybernetics/sounds/hacking/ddos2.wav new file mode 100644 index 0000000000000000000000000000000000000000..1a9257b690b4f7c5ebf703977823ed9d57752331 GIT binary patch literal 318204 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