diff --git a/code/__DEFINES/exosuit_fab.dm b/code/__DEFINES/exosuit_fab.dm index 4cc21f210d61d..49801d25673c2 100644 --- a/code/__DEFINES/exosuit_fab.dm +++ b/code/__DEFINES/exosuit_fab.dm @@ -10,6 +10,10 @@ #define BORG_MODEL_ENGINEERING (1<<4) /// Module is compatible with Service Cyborg model #define BORG_MODEL_SERVICE (1<<5) +//Bubber addition start +/// Module is compatible with Research Cyborg model +#define BORG_MODEL_RESEARCH (1<<6) +//Bubber addition end /// Module is compatible with Ripley Exosuit models #define EXOSUIT_MODULE_RIPLEY (1<<0) diff --git a/code/__DEFINES/~~bubber_defines/research_categories.dm b/code/__DEFINES/~~bubber_defines/research_categories.dm new file mode 100644 index 0000000000000..7cf54663e0b01 --- /dev/null +++ b/code/__DEFINES/~~bubber_defines/research_categories.dm @@ -0,0 +1,2 @@ +//I'm tired. This is defines for mech fabs. +#define RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_RESEARCH "/Research Cyborgs" diff --git a/code/__DEFINES/~~bubber_defines/traits.dm b/code/__DEFINES/~~bubber_defines/traits.dm index 201be5fd1d0b5..44cbc32a6a0ae 100644 --- a/code/__DEFINES/~~bubber_defines/traits.dm +++ b/code/__DEFINES/~~bubber_defines/traits.dm @@ -1,2 +1,8 @@ +// This file contains all the bubber modular traits + #define TRAIT_HYDROPHILIC "hydrophilic" #define TRAIT_CAN_BE_PICKED_UP "can_be_picked_up" + +//Cyborg traits + +#define TRAIT_RESEARCH_CYBORG "research_cyborg" diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 57662ffb1674f..1e638fd4d66ce 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -517,14 +517,14 @@ defib_instance?.forceMove(borg.drop_location()) // [on_defib_instance_qdel_or_moved()] handles the rest. /obj/item/borg/upgrade/processor - name = "medical cyborg surgical processor" - desc = "An upgrade to the Medical model, installing a processor \ + name = "medical and research cyborg surgical processor" // BUBBER EDIT Research borgs + desc = "An upgrade to the Medical and Research model, installing a processor \ capable of scanning surgery disks and carrying \ out procedures" icon_state = "cyborg_upgrade3" require_model = TRUE model_type = list(/obj/item/robot_model/medical, /obj/item/robot_model/syndicate_medical) - model_flags = BORG_MODEL_MEDICAL + model_flags = list(BORG_MODEL_MEDICAL, BORG_MODEL_RESEARCH) items_to_add = list(/obj/item/surgical_processor) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b4fa84b586b44..434bd64cdffc9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -170,6 +170,7 @@ "Miner" = /obj/item/robot_model/miner, "Janitor" = /obj/item/robot_model/janitor, "Service" = /obj/item/robot_model/service, + "Research" = /obj/item/robot_model/sci,//BUBBEREDIT - Addition of Research borgs ) if(!CONFIG_GET(flag/disable_peaceborg)) GLOB.cyborg_model_list["Peacekeeper"] = /obj/item/robot_model/peacekeeper diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 7a3128b2d2dc5..2f0465757ca4d 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -142,7 +142,7 @@ // SKYRAT EDIT START - No using modules when not all parts are deployed. if(!(allow_flags & MODULE_ALLOW_INACTIVE)) - for(var/obj/item/part as anything in mod.mod_parts) + for(var/obj/item/part as anything in mod.get_parts()) if(part.loc == mod) balloon_alert(mod.wearer, "deploy all parts first!") return FALSE diff --git a/html/changelogs/AutoChangeLog-pr-1407.yml b/html/changelogs/AutoChangeLog-pr-1407.yml new file mode 100644 index 0000000000000..74e756f55e8aa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1407.yml @@ -0,0 +1,10 @@ +author: "pixelkitty286" +delete-after: True +changes: + - rscadd: "Research cyborgs" + - rscadd: "ability to pry cyborg cells out" + - rscdel: "~~disabled malf cyborg factory~~" + - qol: "made an alt method removing cells" + - balance: "rebalanced cyborg making" + - image: "Sprites for research cyborgs" + - code_imp: "what ever needed to get the cyborgs working" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1586.yml b/html/changelogs/AutoChangeLog-pr-1586.yml new file mode 100644 index 0000000000000..0ea83668feb00 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1586.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - balance: "Increases the chances of the Wizard Die of Fate event running." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1620.yml b/html/changelogs/AutoChangeLog-pr-1620.yml new file mode 100644 index 0000000000000..4a59d9496506a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1620.yml @@ -0,0 +1,4 @@ +author: "theselfish" +delete-after: True +changes: + - bugfix: "Drill Hats ACTUALLY work." \ No newline at end of file diff --git a/modular_skyrat/master_files/icons/mob/robots.dmi b/modular_skyrat/master_files/icons/mob/robots.dmi index b5441e4155523..11f60e706a1bb 100644 Binary files a/modular_skyrat/master_files/icons/mob/robots.dmi and b/modular_skyrat/master_files/icons/mob/robots.dmi differ diff --git a/modular_skyrat/modules/borgs/code/robot_items.dm b/modular_skyrat/modules/borgs/code/robot_items.dm index b5ead250f3181..f457d3f643784 100644 --- a/modular_skyrat/modules/borgs/code/robot_items.dm +++ b/modular_skyrat/modules/borgs/code/robot_items.dm @@ -608,7 +608,10 @@ "Peacekeeper" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "peace"), "Clown" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "clown"), "Syndicate" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "synd_sec"), - "Spider Clan" = image(icon = CYBORG_ICON_NINJA, icon_state = "ninja_engi") + "Spider Clan" = image(icon = CYBORG_ICON_NINJA, icon_state = "ninja_engi"), + //Bubber addition start + "Research" = image(icon = 'modular_zubbers/modules/borgs/sprites/robot_sci.dmi', icon_state = "research"), + //Bubber addition end )) var/model_selection = show_radial_menu(user, user, model_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 42, require_near = TRUE) if(!model_selection) @@ -640,6 +643,10 @@ model = new /obj/item/robot_model/syndicatejack if("Spider Clan") model = new /obj/item/robot_model/ninja + //Bubber addition start + if("Research") + model = new /obj/item/robot_model/sci + //Bubber addition end else return FALSE if (!set_disguise_vars(model, user)) diff --git a/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm b/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm index e15dd40ba1dc2..70a68a488ecfa 100644 --- a/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm +++ b/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm @@ -293,7 +293,7 @@ chance *= 5.5 delay_mult *= 0.85 knows_wires = TRUE - if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD) || HAS_TRAIT(user, TRAIT_RESEARCH_CYBORG)) // BUBBER EDIT - Research cyborgs if (knows_wires) chance *= 1.25 // ((10 * 8) * 1.25) = 100% else diff --git a/modular_zubbers/code/game/objects/items/robot/items/storage.dm b/modular_zubbers/code/game/objects/items/robot/items/storage.dm index 5efabcc233608..817c4e08b5da7 100644 --- a/modular_zubbers/code/game/objects/items/robot/items/storage.dm +++ b/modular_zubbers/code/game/objects/items/robot/items/storage.dm @@ -4,6 +4,82 @@ icon_state = "borg_stack_apparatus" storable = list(/obj/item/paper) +//Research cyborg apparatus +/obj/item/borg/apparatus/research + name = "Research manipulation gripper" + desc = "A simple grasping tool suited to assist in a wide array of research applications." + icon = 'modular_zubbers/modules/borgs/sprites/robot_items.dmi' + icon_state = "gripper_sci" + storable = list( + /obj/item/slime_extract, + /obj/item/slimepotion, + /obj/item/disk, + /obj/item/stock_parts, + /obj/item/reagent_containers/cup/beaker, + /obj/item/assembly/prox_sensor, + /obj/item/healthanalyzer, //To build medibots + /obj/item/borg_restart_board, //To allow repairs + /obj/item/borg/upgrade/rename, //Basics not an upgrade + /obj/item/relic, + /obj/item/mod, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/dropper, + ) + +/obj/item/borg/apparatus/research/examine() + . = ..() + if(stored) + . += "The gripper currently has [stored] secured." + . += span_notice(" Alt-click will drop the currently held item. ") + +/obj/item/borg/apparatus/circuit_sci + name = "Research circuit assembly gripper" + desc = "A complex grasping tool used for working with circuitry." + icon = 'modular_zubbers/modules/borgs/sprites/robot_items.dmi' + icon_state = "gripper_circ" + storable = list( + /obj/item/circuitboard, + /obj/item/compact_remote, + /obj/item/controller, + /obj/item/multitool/circuit, + /obj/item/integrated_circuit, + /obj/item/circuit_component, + /obj/item/usb_cable, + ) + +/obj/item/borg/apparatus/circuit_sci/examine() + . = ..() + if(stored) + . += "The gripper currently has [stored] secured." + . += span_notice(" Alt-click will drop the currently held item. ") + +/obj/item/borg/apparatus/circuit_sci/pre_attack(atom/atom, mob/living/user, params) // copy and paste + if(istype(atom, /obj/item/ai_module) && !stored) //If an admin wants a borg to upload laws, who am I to stop them? Otherwise, we can hint that it fails + to_chat(user, span_warning("This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up.")) + return ..() + +//Illegal gripper to allow research cyborgs when hacked to do further robotics work +/obj/item/borg/apparatus/illegal + name = "Sketchy looking gripper" + desc = "A tool used to expanded robotics work" + icon_state = "connector" + storable = list( + /obj/item/mmi, + /obj/item/assembly/flash, //to build borgs, + /obj/item/bodypart/arm/left/robot, + /obj/item/bodypart/arm/right/robot, + /obj/item/bodypart/leg/left/robot, + /obj/item/bodypart/leg/right/robot, + /obj/item/bodypart/chest/robot, + /obj/item/bodypart/head/robot, + /obj/item/borg/upgrade/ai, //Shell makeing + ) +/obj/item/borg/apparatus/illegal/examine() + . = ..() + if(stored) + . += "The apparatus currently has [stored] secured." + . += span_notice(" Alt-click will drop the currently held item. ") + /obj/item/borg/apparatus/tank_manipulator name = "tank manipulation apparatus" desc = "An apparatus for carrying and manipulating handheld tanks." @@ -25,3 +101,7 @@ /obj/item/robot_model/saboteur/New(...) . = ..() basic_modules += /obj/item/borg/apparatus/tank_manipulator + +/obj/item/borg/apparatus/sheet_manipulator/Initialize() + . = ..() + storable += /obj/item/stack/rods diff --git a/modular_zubbers/code/modules/clothing/head/jobs.dm b/modular_zubbers/code/modules/clothing/head/jobs.dm index 9d27e0b7e2b50..b79ca871cef6a 100644 --- a/modular_zubbers/code/modules/clothing/head/jobs.dm +++ b/modular_zubbers/code/modules/clothing/head/jobs.dm @@ -2,7 +2,7 @@ name = "blueshield's campaign hat" desc = "A variant of the warden's campaign hat recolored to match the Blueshield. Made with durathread to protect their squishy braincase. It's padded with nano-kevlar, making it more protective than standard berets." icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' - worn_icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' + worn_icon = 'modular_zubbers/icons/mob/clothing/head/hats.dmi' icon_state = "bluedrill" armor_type = /datum/armor/suit_armor/blueshield //same as the Blueshield's default beret. @@ -10,7 +10,7 @@ name = "captain's campaign hat" desc = "A variant of the warden's campaign hat for your more militaristic captains." icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' - worn_icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' + worn_icon = 'modular_zubbers/icons/mob/clothing/head/hats.dmi' icon_state = "capdrill" armor_type = /datum/armor/hats_caphat @@ -18,7 +18,7 @@ name = "head of security's campaign hat" desc = "A variant of the warden's campaign hat for the Head of Security. End the blood-feud and team up." icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' - worn_icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' + worn_icon = 'modular_zubbers/icons/mob/clothing/head/hats.dmi' icon_state = "hosdrill" armor_type = /datum/armor/hats_hos @@ -26,7 +26,7 @@ name = "representative's campaign hat" desc = "A variant of the warden's campaign hat for your more militaristic representatives." icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' - worn_icon = 'modular_zubbers/icons/obj/clothing/head/hats.dmi' + worn_icon = 'modular_zubbers/icons/mob/clothing/head/hats.dmi' icon_state = "repdrill" armor_type = /datum/armor/head_nanotrasen_consultant diff --git a/modular_zubbers/code/modules/research/designs/mechfab_designs.dm b/modular_zubbers/code/modules/research/designs/mechfab_designs.dm index 33ffa6d5d553d..8e3f535117ae3 100644 --- a/modular_zubbers/code/modules/research/designs/mechfab_designs.dm +++ b/modular_zubbers/code/modules/research/designs/mechfab_designs.dm @@ -13,3 +13,57 @@ category = list( RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING ) + +//research cyborg upgrades +/datum/design/borg_upgrade_advancedhealth + name = "Research Advanced Health Analyzer" + id = "borg_upgrade_advancedanalyzer" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/healthanalyzer + materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/silver =SHEET_MATERIAL_AMOUNT, /datum/material/gold =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + construction_time = 4 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_RESEARCH, + ) + +//Blue space Rped upgrade +/datum/design/borg_upgrade_brped + name = "Bluespace Rapid Part Exchange Device" + id = "borg_upgrade_brped" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/brped + materials = list( + /datum/material/iron =SHEET_MATERIAL_AMOUNT*5, + /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, + ) + construction_time = 12 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_RESEARCH + ) + +/datum/design/borg_upgrade_inducer_sci + name = "Research Cyborg inducer" + id = "borg_upgrade_inducer_sci" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/inducer_sci + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2) + construction_time = 12 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_RESEARCH + ) + +//so we have our own category +/datum/design/borg_upgrade_surgical_processor_sci + name = "Research Surgical Processor" + id = "borg_upgrade_surgicalprocessor_sci" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/processor + materials = list( + /datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/glass =SHEET_MATERIAL_AMOUNT*2, + /datum/material/silver =SHEET_MATERIAL_AMOUNT*2, + ) + construction_time = 4 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_RESEARCH + ) diff --git a/modular_zubbers/code/modules/research/techweb/all_nodes.dm b/modular_zubbers/code/modules/research/techweb/all_nodes.dm index 9f4af235312c3..60eba4870f891 100644 --- a/modular_zubbers/code/modules/research/techweb/all_nodes.dm +++ b/modular_zubbers/code/modules/research/techweb/all_nodes.dm @@ -17,6 +17,7 @@ . = ..() design_ids += list( "crewmonitor", + "borg_upgrade_advancedanalyzer", ) /datum/techweb_node/xenoorgan_biotech/New() . = ..() @@ -39,7 +40,16 @@ . = ..() design_ids += list( "borg_upgrade_advcutter", + "borg_upgrade_inducer_sci", + "borg_upgrade_brped" ) + +/datum/techweb_node/cyborg_upg_med/New() + design_ids += list( + "borg_upgrade_surgicalprocessor_sci", + ) + return ..() + // Computer Tech /datum/techweb_node/computer_board_gaming/New() . = ..() diff --git a/modular_zubbers/code/modules/wizard_dize/wizard_dice_event.dm b/modular_zubbers/code/modules/wizard_dize/wizard_dice_event.dm index 1befc7539938c..43575e136c506 100644 --- a/modular_zubbers/code/modules/wizard_dize/wizard_dice_event.dm +++ b/modular_zubbers/code/modules/wizard_dize/wizard_dice_event.dm @@ -11,9 +11,12 @@ min_players = 30 max_occurrences = 1 - weight = 1 + weight = 3 earliest_start = 60 MINUTES + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL,TAG_COMBAT) + /datum/round_event/wizard_dice announce_when = 5 diff --git a/modular_zubbers/icons/mob/clothing/head/hats.dmi b/modular_zubbers/icons/mob/clothing/head/hats.dmi index ec18da30c7512..140c381820557 100644 Binary files a/modular_zubbers/icons/mob/clothing/head/hats.dmi and b/modular_zubbers/icons/mob/clothing/head/hats.dmi differ diff --git a/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed.dm b/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed.dm index d404b468bf855..106a8916f6878 100644 --- a/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed.dm +++ b/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed.dm @@ -99,7 +99,7 @@ modsuit.theme.name = lowertext(modsuit_skin_prefix) // ensure we're applying our config theme changes, just in case - for(var/obj/item/part as anything in modsuit.mod_parts) + for(var/obj/item/part as anything in modsuit.get_parts()) part.name = "[modsuit.theme.name] [initial(part.name)]" part.desc = "[initial(part.desc)] [modsuit.theme.desc]" diff --git a/modular_zubbers/modules/borgs/code/robot_defense.dm b/modular_zubbers/modules/borgs/code/robot_defense.dm new file mode 100644 index 0000000000000..ae0e7f90d6158 --- /dev/null +++ b/modular_zubbers/modules/borgs/code/robot_defense.dm @@ -0,0 +1,18 @@ +//Alt method of removing the cell +/mob/living/silicon/robot/screwdriver_act_secondary(mob/living/user, obj/item/tool) + if(!opened) + return ..() + if(!wiresexposed) + if(!cell) + balloon_alert(user, "no cell!") + return TRUE + balloon_alert(user, "removing cell...") + tool.play_tool_sound(src, 100) + if(!tool.use_tool(src, user, 3 SECONDS) || !opened) + balloon_alert(user, "interrupted!") + return TRUE + tool.play_tool_sound(src, 100) + balloon_alert(user, "cell removed") + cell.forceMove(drop_location()) + diag_hud_set_borgcell() + return TRUE diff --git a/modular_zubbers/modules/borgs/code/robot_defines.dm b/modular_zubbers/modules/borgs/code/robot_defines.dm index 896c82c62e407..1b38d0b72601e 100644 --- a/modular_zubbers/modules/borgs/code/robot_defines.dm +++ b/modular_zubbers/modules/borgs/code/robot_defines.dm @@ -38,7 +38,11 @@ #define CYBORG_ICON_TYPE_RAPTOR "raptor" -//Small raptors I moved it into here to be found easier +#define CYBORG_ICON_SCI_WIDE 'modular_zubbers/modules/borgs/sprites/widerobot_sci.dmi' +#define CYBORG_ICON_SCI_TALL 'modular_zubbers/modules/borgs/sprites/tallrobot_sci.dmi' +#define CYBORG_ICON_SCI_LARGE_BUBBER 'modular_zubbers/modules/borgs/sprites/largerobot_sci.dmi' +#define CYBORG_ICON_SCI 'modular_zubbers/modules/borgs/sprites/robot_sci.dmi' + #define CYBORG_ICON_TYPE_SMOLRAPTOR "smolraptor" #define CYBORG_ICON_GEN_SMOLRAPTOR 'modular_zubbers/modules/borgs/sprites/smallraptors/smolraptor_gen.dmi' @@ -67,7 +71,6 @@ #define CYBORG_ICON_TYPE_SYNDI_CATBORG "FELI-Combat" #define CYBORG_ICON_TYPE_NINJA_CATBORG "FELI-Ninja" - /mob/living/silicon/robot/model/centcom icon = CYBORG_ICON_CENTCOM_WIDE_BUBBER icon_state = "valecc" @@ -92,3 +95,7 @@ /mob/living/silicon/robot/model/centcom/ResetModel() return + +//Research cyborgs +/mob/living/silicon/robot/model/sci + icon_state = "research" diff --git a/modular_zubbers/modules/borgs/code/robot_items.dm b/modular_zubbers/modules/borgs/code/robot_items.dm index 922687d72cae0..278df44d16760 100644 --- a/modular_zubbers/modules/borgs/code/robot_items.dm +++ b/modular_zubbers/modules/borgs/code/robot_items.dm @@ -100,3 +100,74 @@ /obj/item/gun/energy/recharge/kinetic_accelerator/cyborg max_mod_capacity = 100 + +//Research borg stuff +/obj/item/inducer/cyborg/sci + icon = 'icons/obj/tools.dmi' + icon_state = "inducer-sci" + +//illegal teleporter module +/obj/item/experimental_dash + name = "Exerimental Dash" + desc = "An experimental module that allows for dashing." + desc_controls = "Left-click to dash." + icon = 'icons/mob/actions/actions_items.dmi' + icon_state = "jetboot" + w_class = WEIGHT_CLASS_NORMAL + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + var/charge_cost = (STANDARD_CELL_CHARGE * 3.2) + var/datum/effect_system/spark_spread/spark_system + var/datum/action/innate/dash/research/jaunt + var/mob/living/silicon/robot/cyborg + +/obj/item/experimental_dash/Initialize(mapload) + . = ..() + jaunt = new(src) + spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + +/obj/item/experimental_dash/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(cyborg.cell.charge <= charge_cost)//Prevents usage when charge is low + user.balloon_alert(user, "Low charge!") + return + if(!target.density && jaunt?.teleport(user, target)) + cyborg?.cell?.use(charge_cost) + +/obj/item/experimental_dash/equipped(mob/user, slot, initial) + . = ..() + if(!QDELETED(jaunt)) + jaunt.Grant(user, src) + cyborg = user + +/obj/item/experimental_dash/dropped(mob/user) + . = ..() + if(!QDELETED(jaunt)) + jaunt.Remove(user) + cyborg = null + +/obj/item/experimental_dash/Destroy() + QDEL_NULL(spark_system) + QDEL_NULL(jaunt) + return ..() + +/datum/action/innate/dash/research + current_charges = 1 + max_charges = 1 + charge_rate = 15 SECONDS + beam_length = 1 SECONDS + recharge_sound = null + beam_effect = "plasmabeam" + +/datum/action/innate/dash/research/GiveAction(mob/viewer) //this action should be invisible + return + +/datum/action/innate/dash/research/HideFrom(mob/viewer) + return + +//No more ghetto +/obj/item/screwdriver/cyborg/power + sharpness = NONE diff --git a/modular_zubbers/modules/borgs/code/robot_model.dm b/modular_zubbers/modules/borgs/code/robot_model.dm index 67e063b0b10a4..d6bd1b2aa20cf 100644 --- a/modular_zubbers/modules/borgs/code/robot_model.dm +++ b/modular_zubbers/modules/borgs/code/robot_model.dm @@ -60,6 +60,121 @@ cyborg.req_access = list(ACCESS_ROBOTICS) cyborg.faction -= ROLE_DEATHSQUAD //You're no longer part of CENTCOM + +//Research cyborgs +/obj/item/robot_model/sci + name = "Research" + basic_modules = list( + /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/weldingtool/largetank/cyborg, + /obj/item/screwdriver/cyborg/power, + /obj/item/crowbar/cyborg/power, + /obj/item/multitool/cyborg, + /obj/item/analyzer, + /obj/item/assembly/signaler/cyborg, + /obj/item/borg/apparatus/sheet_manipulator, + /obj/item/stack/cable_coil, + /obj/item/borg/apparatus/beaker, + /obj/item/borg/apparatus/organ_storage, + /obj/item/borg/apparatus/research, + /obj/item/borg/apparatus/circuit_sci, + /obj/item/storage/part_replacer/cyborg, + /obj/item/surgical_drapes, + /obj/item/healthanalyzer, + /obj/item/experi_scanner, + /obj/item/bonesetter, + /obj/item/stack/medical/gauze, + /obj/item/borg/apparatus/tank_manipulator, + ) + radio_channels = list(RADIO_CHANNEL_SCIENCE) + +//TODO: Illegal science stuff + emag_modules = list( + /obj/item/borg/stun, + /obj/item/experimental_dash, + /obj/item/borg/apparatus/illegal //To replace malf printers + ) + cyborg_base_icon = "research" + cyborg_icon_override = CYBORG_ICON_SCI + model_select_icon = "research" + model_select_alternate_icon = 'modular_zubbers/modules/borgs/sprites/screen_robot.dmi' + model_traits = list(TRAIT_KNOW_ROBO_WIRES, TRAIT_RESEARCH_CYBORG) + hat_offset = 0 + borg_skins = list( + "F3-LINE" = list( + SKIN_ICON_STATE = CYBORG_ICON_TYPE_SCI_CATBORG, + SKIN_ICON = CYBORG_ICON_ALL_CATBORG, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL) + ), + "Vale" = list( + SKIN_ICON_STATE = "vale", + SKIN_ICON = CYBORG_ICON_SCI_WIDE, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE), + ), + "Borgi" = list( + SKIN_ICON_STATE = "borgi", + SKIN_ICON = CYBORG_ICON_SCI_WIDE, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE), + ), + "Hound" = list( + SKIN_ICON_STATE = "hound", + SKIN_ICON = CYBORG_ICON_SCI_WIDE, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE), + ), + "DarkHound" = list( + SKIN_ICON_STATE = "hounddark", + SKIN_ICON = CYBORG_ICON_SCI_WIDE, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE), + ), + "Drake" = list( + SKIN_ICON_STATE = "drake", + SKIN_ICON = CYBORG_ICON_SCI_WIDE, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE), + ), + "Zoomba" = list( + SKIN_ICON_STATE = "zoomba", + SKIN_ICON = CYBORG_ICON_SCI, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), + SKIN_HAT_OFFSET = -13, + ), + "Eyebot" = list( + SKIN_ICON_STATE = "eyebot", + SKIN_ICON = CYBORG_ICON_SCI, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL), + ), + "Raptor" = list( + SKIN_ICON_STATE = CYBORG_ICON_TYPE_RAPTOR, + SKIN_ICON = CYBORG_ICON_SCI_LARGE_BUBBER, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE), + ), + "Meka" = list( + SKIN_ICON_STATE = "mekasci", + SKIN_ICON = CYBORG_ICON_SCI_TALL, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15 + ), + "NiKA" = list( + SKIN_ICON_STATE = "fmekasci", + SKIN_ICON = CYBORG_ICON_SCI_TALL, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15 + ), + "NiKO" = list( + SKIN_ICON_STATE = "mmekasci", + SKIN_ICON = CYBORG_ICON_SCI_TALL, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15 + ), + "K4T (Research)" = list( + SKIN_ICON_STATE = "k4tsci", + SKIN_ICON = CYBORG_ICON_SCI_TALL, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_UNIQUETIP, TRAIT_R_TALL), SKIN_HAT_OFFSET = 15 + ), + "SmolRaptor" = list(SKIN_ICON_STATE = CYBORG_ICON_TYPE_SMOLRAPTOR, + SKIN_ICON = CYBORG_ICON_SCI_SMOLRAPTOR, + SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_SMALL, TRAIT_R_WIDE) + ), + ) + + /* BUBBER SPRITE ADDITIONS BELOW */ /obj/item/robot_model/clown/Initialize(mapload) . = ..() @@ -366,15 +481,6 @@ ) -/* -/obj/item/robot_model/research/Initialize(mapload) - . = ..() - borg_skins |= list( - "F3-LINE" = list(SKIN_ICON_STATE = "FELI-Research", SKIN_ICON = 'modular_zubbers/modules/borgs/sprites/felibot_all.dmi', SKIN_FEATURES = list(TRAIT_R_UNIQUEWRECK, TRAIT_R_WIDE, TRAIT_R_SMALL)), - ) -*/ - - /obj/item/robot_model/ninja/Initialize(mapload) . = ..() borg_skins |= list( diff --git a/modular_zubbers/modules/borgs/code/robot_upgrade.dm b/modular_zubbers/modules/borgs/code/robot_upgrade.dm index 6428dbc7e3ea8..72b3314f21f6f 100644 --- a/modular_zubbers/modules/borgs/code/robot_upgrade.dm +++ b/modular_zubbers/modules/borgs/code/robot_upgrade.dm @@ -12,3 +12,45 @@ desc = "Allows you to to turn a cyborg into a Security model, shitsec abound." icon_state = "cyborg_upgrade3" new_model = /obj/item/robot_model/security + +//Research borg upgrades + +//ADVANCED ROBOTICS REPAIR +/obj/item/borg/upgrade/healthanalyzer + name = "Research cyborg advanced Health Analyzer" + desc = "An upgrade to the Research model cyborg's standard health analyzer." + icon_state = "cyborg_upgrade3" + require_model = TRUE + model_type = list(/obj/item/robot_model/sci) + model_flags = BORG_MODEL_RESEARCH + items_to_add = list(/obj/item/healthanalyzer/advanced) + items_to_remove = list(/obj/item/healthanalyzer) + + +//Science inducer +/obj/item/borg/upgrade/inducer_sci + name = "Research integrated power inducer" + desc = "An integrated inducer that can charge a device's internal cell from power provided by the cyborg." + require_model = TRUE + model_type = list(/obj/item/robot_model/sci) + model_flags = BORG_MODEL_RESEARCH + items_to_add = list(/obj/item/inducer/cyborg/sci) + +//Bluespace RPED +/obj/item/borg/upgrade/brped + name = "Research cyborg Rapid Part Exchange Device Upgrade" + desc = "An upgrade to the Research model cyborg's standard RPED." + icon_state = "cyborg_upgrade3" + require_model = TRUE + model_type = list(/obj/item/robot_model/sci) + model_flags = BORG_MODEL_RESEARCH + items_to_add = list(/obj/item/storage/part_replacer/bluespace) + items_to_remove = list(/obj/item/storage/part_replacer) + +// Drapes upgrades +/obj/item/borg/upgrade/processor/Initialize() + . = ..() + model_type += /obj/item/robot_model/sci + model_flags += BORG_MODEL_RESEARCH + items_to_remove = list(/obj/item/surgical_drapes) + diff --git a/modular_zubbers/modules/borgs/sprites/felibot_all.dmi b/modular_zubbers/modules/borgs/sprites/felibot_all.dmi index df980b7ecf517..417353899fe51 100644 Binary files a/modular_zubbers/modules/borgs/sprites/felibot_all.dmi and b/modular_zubbers/modules/borgs/sprites/felibot_all.dmi differ diff --git a/modular_zubbers/modules/borgs/sprites/largerobot_sci.dmi b/modular_zubbers/modules/borgs/sprites/largerobot_sci.dmi new file mode 100644 index 0000000000000..963681f97d581 Binary files /dev/null and b/modular_zubbers/modules/borgs/sprites/largerobot_sci.dmi differ diff --git a/modular_zubbers/modules/borgs/sprites/robot_items.dmi b/modular_zubbers/modules/borgs/sprites/robot_items.dmi new file mode 100644 index 0000000000000..115b9bbca6f32 Binary files /dev/null and b/modular_zubbers/modules/borgs/sprites/robot_items.dmi differ diff --git a/modular_zubbers/modules/borgs/sprites/robot_sci.dmi b/modular_zubbers/modules/borgs/sprites/robot_sci.dmi new file mode 100644 index 0000000000000..68283fa2bc5dd Binary files /dev/null and b/modular_zubbers/modules/borgs/sprites/robot_sci.dmi differ diff --git a/modular_zubbers/modules/borgs/sprites/screen_robot.dmi b/modular_zubbers/modules/borgs/sprites/screen_robot.dmi new file mode 100644 index 0000000000000..d8ba23aee32e1 Binary files /dev/null and b/modular_zubbers/modules/borgs/sprites/screen_robot.dmi differ diff --git a/modular_zubbers/modules/borgs/sprites/tallrobot_sci.dmi b/modular_zubbers/modules/borgs/sprites/tallrobot_sci.dmi new file mode 100644 index 0000000000000..fd8995f8a42e2 Binary files /dev/null and b/modular_zubbers/modules/borgs/sprites/tallrobot_sci.dmi differ diff --git a/modular_zubbers/modules/borgs/sprites/widerobot_sci.dmi b/modular_zubbers/modules/borgs/sprites/widerobot_sci.dmi new file mode 100644 index 0000000000000..742e73df461a2 Binary files /dev/null and b/modular_zubbers/modules/borgs/sprites/widerobot_sci.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 85574fc18d5ab..cc252e9df3524 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -491,6 +491,7 @@ #include "code\__DEFINES\~~bubber_defines\footsteps.dm" #include "code\__DEFINES\~~bubber_defines\jobs.dm" #include "code\__DEFINES\~~bubber_defines\misc.dm" +#include "code\__DEFINES\~~bubber_defines\research_categories.dm" #include "code\__DEFINES\~~bubber_defines\say.dm" #include "code\__DEFINES\~~bubber_defines\signals.dm" #include "code\__DEFINES\~~bubber_defines\species.dm" @@ -8874,6 +8875,7 @@ #include "modular_zubbers\modules\blooper\atoms_movable.dm" #include "modular_zubbers\modules\blooper\bark.dm" #include "modular_zubbers\modules\blooper\bark_list.dm" +#include "modular_zubbers\modules\borgs\code\robot_defense.dm" #include "modular_zubbers\modules\borgs\code\robot_defines.dm" #include "modular_zubbers\modules\borgs\code\robot_items.dm" #include "modular_zubbers\modules\borgs\code\robot_model.dm"