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"