[Mostly-Modular] Major refactor of most modular borg code with some QOL adjustments (#24542)

* The great BORG

* godamn my head

* how did that even compile

* Why do you keep reverting

* ah ticked

* Delete tallrobot_effects.dmi

* removes 'dogborg' language and cargo tweaks

* lol silly dog you dont have a custom panel yet

* that typo tho

* Forgot about that borg building

* Apply suggestions from code review

Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>

* local edit

* Godamnit Hemlock

* re-deletes altborgs

* Update mechfabricator_designs.dm

* Revert "Update mechfabricator_designs.dm"

This reverts commit 569912fa2fadda9fbcdc83646e995405f33dfb24.

---------

Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
This commit is contained in:
Zergspower
2023-10-25 08:24:37 -07:00
committed by GitHub
co-authored by lessthanthree
parent 6c847faf94
commit bb8d8f968a
65 changed files with 972 additions and 840 deletions
+37 -35
View File
@@ -1,4 +1,4 @@
//Module - altborgs
//Module - borgs
//Defines for dogborgs and stuff
#define ROBOT_REST_NORMAL 1
#define ROBOT_REST_SITTING 2
@@ -11,58 +11,60 @@
#define R_TRAIT_UNIQUEWRECK "unique_wreck"
/// Or when tipped over.
#define R_TRAIT_UNIQUETIP "unique_tip"
/// Represents wide/quadruped/dogborg type models.
/// 64x32 skins
#define R_TRAIT_WIDE "wide_borg"
/// 32x64 skins
#define R_TRAIT_TALL "tall_borg"
/// Any model small enough to reject the shrinker upgrade.
#define R_TRAIT_SMALL "small_chassis"
/// Any model that has a custom front panel
#define R_TRAIT_UNIQUEPANEL "unique_openpanel"
// Icon file locations for modular borg icons
#define CYBORG_ICON_STANDARD 'modular_skyrat/modules/altborgs/icons/robots.dmi'
#define CYBORG_ICON_STANDARD 'modular_skyrat/modules/borgs/icons/robots.dmi'
#define CYBORG_ICON_MED 'modular_skyrat/modules/altborgs/icons/robots_med.dmi'
#define CYBORG_ICON_MED_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_med.dmi'
#define CYBORG_ICON_MED_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_med.dmi'
#define CYBORG_ICON_MED 'modular_skyrat/modules/borgs/icons/robots_med.dmi'
#define CYBORG_ICON_MED_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_med.dmi'
#define CYBORG_ICON_MED_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_med.dmi'
#define CYBORG_ICON_CARGO 'modular_skyrat/modules/cargoborg/icons/robots_cargo.dmi'
#define CYBORG_ICON_CARGO_WIDE 'modular_skyrat/modules/cargoborg/icons/widerobots_cargo.dmi'
#define CYBORG_ICON_CARGO_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_cargo.dmi'
#define CYBORG_ICON_CARGO 'modular_skyrat/modules/borgs/icons/robots_cargo.dmi'
#define CYBORG_ICON_CARGO_WIDE 'modular_skyrat/modules/borgs/icons/widerobots_cargo.dmi'
#define CYBORG_ICON_CARGO_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_cargo.dmi'
#define CYBORG_ICON_SEC 'modular_skyrat/modules/altborgs/icons/robots_sec.dmi'
#define CYBORG_ICON_SEC_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_sec.dmi'
#define CYBORG_ICON_SEC_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_sec.dmi'
#define CYBORG_ICON_SEC 'modular_skyrat/modules/borgs/icons/robots_sec.dmi'
#define CYBORG_ICON_SEC_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_sec.dmi'
#define CYBORG_ICON_SEC_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_sec.dmi'
#define CYBORG_ICON_ENG 'modular_skyrat/modules/altborgs/icons/robots_eng.dmi'
#define CYBORG_ICON_ENG_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_eng.dmi'
#define CYBORG_ICON_ENG_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_eng.dmi'
#define CYBORG_ICON_ENG 'modular_skyrat/modules/borgs/icons/robots_eng.dmi'
#define CYBORG_ICON_ENG_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_eng.dmi'
#define CYBORG_ICON_ENG_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_eng.dmi'
#define CYBORG_ICON_PEACEKEEPER 'modular_skyrat/modules/altborgs/icons/robots_pk.dmi'
#define CYBORG_ICON_PEACEKEEPER_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_pk.dmi'
#define CYBORG_ICON_PEACEKEEPER_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_pk.dmi'
#define CYBORG_ICON_PEACEKEEPER 'modular_skyrat/modules/borgs/icons/robots_pk.dmi'
#define CYBORG_ICON_PEACEKEEPER_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_pk.dmi'
#define CYBORG_ICON_PEACEKEEPER_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_pk.dmi'
#define CYBORG_ICON_SERVICE 'modular_skyrat/modules/altborgs/icons/robots_serv.dmi'
#define CYBORG_ICON_SERVICE_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_serv.dmi'
#define CYBORG_ICON_SERVICE_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_serv.dmi'
#define CYBORG_ICON_SERVICE 'modular_skyrat/modules/borgs/icons/robots_serv.dmi'
#define CYBORG_ICON_SERVICE_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_serv.dmi'
#define CYBORG_ICON_SERVICE_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_serv.dmi'
#define CYBORG_ICON_MINING 'modular_skyrat/modules/altborgs/icons/robots_mine.dmi'
#define CYBORG_ICON_MINING_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_mine.dmi'
#define CYBORG_ICON_MINING_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_mine.dmi'
#define CYBORG_ICON_MINING 'modular_skyrat/modules/borgs/icons/robots_mine.dmi'
#define CYBORG_ICON_MINING_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_mine.dmi'
#define CYBORG_ICON_MINING_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_mine.dmi'
#define CYBORG_ICON_JANI 'modular_skyrat/modules/altborgs/icons/robots_jani.dmi'
#define CYBORG_ICON_JANI_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_jani.dmi'
#define CYBORG_ICON_JANI_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_jani.dmi'
#define CYBORG_ICON_JANI 'modular_skyrat/modules/borgs/icons/robots_jani.dmi'
#define CYBORG_ICON_JANI_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_jani.dmi'
#define CYBORG_ICON_JANI_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_jani.dmi'
#define CYBORG_ICON_SYNDIE 'modular_skyrat/modules/altborgs/icons/robots_syndi.dmi'
#define CYBORG_ICON_SYNDIE_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_syndi.dmi'
#define CYBORG_ICON_SYNDIE_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_syndi.dmi'
#define CYBORG_ICON_SYNDIE 'modular_skyrat/modules/borgs/icons/robots_syndi.dmi'
#define CYBORG_ICON_SYNDIE_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_syndi.dmi'
#define CYBORG_ICON_SYNDIE_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_syndi.dmi'
#define CYBORG_ICON_CLOWN 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi'
#define CYBORG_ICON_CLOWN_WIDE 'modular_skyrat/modules/altborgs/icons/widerobot_clown.dmi'
#define CYBORG_ICON_CLOWN_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_clown.dmi'
#define CYBORG_ICON_CLOWN 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'
#define CYBORG_ICON_CLOWN_WIDE 'modular_skyrat/modules/borgs/icons/widerobot_clown.dmi'
#define CYBORG_ICON_CLOWN_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_clown.dmi'
#define CYBORG_ICON_NINJA 'modular_skyrat/modules/altborgs/icons/robots_ninja.dmi'
#define CYBORG_ICON_NINJA_TALL 'modular_skyrat/modules/altborgs/icons/tallborg/tallrobot_ninja.dmi'
#define CYBORG_ICON_NINJA 'modular_skyrat/modules/borgs/icons/robots_ninja.dmi'
#define CYBORG_ICON_NINJA_TALL 'modular_skyrat/modules/borgs/icons/tallrobot_ninja.dmi'
/// Module is compatible with Cargo Cyborg model
#define BORG_MODEL_CARGO (BORG_MODEL_ENGINEERING<<1)
@@ -349,7 +349,7 @@
eye_lights.icon = icon
add_overlay(eye_lights)
if(opened)
if(opened && !(R_TRAIT_UNIQUEPANEL in model.model_features))
if(wiresexposed)
add_overlay("ov-opencover +w")
else if(cell)
@@ -808,11 +808,12 @@
/obj/item/borg/apparatus/beaker/service,
/obj/item/reagent_containers/cup/beaker/large, //I know a shaker is more appropiate but this is for ease of identification
//Skyrat Edit Start: Borg Buff
//obj/item/reagent_containers/condiment/enzyme, //edit
/obj/item/reagent_containers/condiment/enzyme,
//obj/item/reagent_containers/condiment/enzyme, //edit - Borg shaker has it
/obj/item/borg/apparatus/beaker, // SKYRAT EDIT: allows the pickup of different beakers for easier drink mixing
/obj/item/reagent_containers/dropper,
/obj/item/rsf,
/obj/item/storage/bag/tray,
/obj/item/storage/bag/tray, // SKYRAT EDIT: Moves the second tray up to be near the default one
/obj/item/pen,
/obj/item/toy/crayon/spraycan/borg,
/obj/item/extinguisher/mini,
@@ -820,15 +821,10 @@
/obj/item/razor,
/obj/item/instrument/guitar,
/obj/item/instrument/piano_synth,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/borghypo/borgshaker/specific/juice, //edit
/obj/item/reagent_containers/borghypo/borgshaker/specific/soda, //edit
/obj/item/reagent_containers/borghypo/borgshaker/specific/alcohol, //edit
/obj/item/reagent_containers/borghypo/borgshaker/specific/misc, //edit
/obj/item/reagent_containers/dropper,
/obj/item/lighter,
/obj/item/storage/bag/tray,
//obj/item/reagent_containers/borghypo/borgshaker, //edit
/obj/item/reagent_containers/syringe, //edit
/obj/item/cooking/cyborg/power, //edit
/obj/item/lighter,
@@ -153,7 +153,7 @@
icon_state = "kineticgun" // SKYRAT EDIT CHANGE
holds_charge = TRUE
unique_frequency = TRUE
max_mod_capacity = 80
max_mod_capacity = 100 // SKYRAT EDIT CHANGE FROM 80 - Balance due to fauna changes and no level perks applying
/obj/item/gun/energy/recharge/kinetic_accelerator/minebot
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
@@ -1,4 +1,6 @@
//Cyborg
/* //SKYRAT EDIT REMOVAL BEGIN - Costs lowered and time reduced -
/datum/design/borg_suit
name = "Cyborg Endoskeleton"
id = "borg_suit"
@@ -75,6 +77,7 @@
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
*///SKYRAT EDIT REMOVAL END
//Ripley
/datum/design/ripley_chassis
@@ -1183,7 +1186,7 @@
category = list(
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_SERVICE
)
/datum/design/borg_upgrade_service_apparatus
name = "Service Apparatus"
id = "borg_upgrade_service_apparatus"
@@ -1262,7 +1265,6 @@
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL
)
/* //SKYRAT REMOVAL START
/datum/design/borg_upgrade_pinpointer
name = "Crew Pinpointer"
id = "borg_upgrade_pinpointer"
@@ -1273,7 +1275,6 @@
category = list(
RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MEDICAL
)
*/ //SKYRAT REMOVAL END
/datum/design/borg_upgrade_broomer
name = "Experimental Push Broom"
@@ -85,7 +85,7 @@
// Another smoke effect
/obj/effect/temp_visual/mook_dust/robot
icon = 'modular_skyrat/modules/altborgs/icons/tallborg/misc/tallrobot_effects.dmi'
icon = 'modular_skyrat/modules/borgs/icons/misc/tallrobot_effects.dmi'
icon_state = "impact_cloud"
color = "#a9a9a93c"
@@ -14,6 +14,15 @@
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
/datum/techweb_node/borg_shapeshifter
id = "borg_shapeshifter"
display_name = "Illegal Cyborg Addition"
description = "Some sort of experimental tool that was once used by an rival company."
prereq_ids = list("syndicate_basic")
design_ids = list("borg_shapeshifter_module")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
// MODULAR ADDITIONS AND REMOVALS
//Base Nodes
@@ -239,3 +248,9 @@
design_ids -= list(
"borg_upgrade_pinpointer",
)
/datum/techweb_node/basic_mining/New()
. = ..()
design_ids += list(
"borg_upgrade_welding",
)
@@ -1,33 +0,0 @@
#define BASE_NINJA_REAGENTS list(\
/datum/reagent/medicine/inacusiate,\
/datum/reagent/medicine/morphine,\
/datum/reagent/medicine/potass_iodide,\
/datum/reagent/medicine/syndicate_nanites,\
/datum/reagent/consumable/nutriment\
)
/obj/item/katana/ninja_blade
name = "energy katana"
desc = "A katana infused with strong energy."
force = 30
icon_state = "energy_katana"
inhand_icon_state = "energy_katana"
worn_icon_state = "energy_katana"
/obj/item/shockpaddles/syndicate/cyborg/ninja
name = "modified defibrillator paddles"
icon = 'modular_skyrat/modules/altborgs/icons/robot_items.dmi'
icon_state = "ninjapaddles0"
base_icon_state = "ninjapaddles"
/obj/item/reagent_containers/borghypo/syndicate/ninja
name = "modified cyborg hypospray"
desc = "An experimental piece of technology used to produce powerful restorative nanites used to very quickly restore injuries of all types. metabolizes potassium iodide for radiation poisoning, inacusiate for ear damage and morphine for offense and nutriment for the operative in the field."
icon = 'modular_skyrat/modules/altborgs/icons/robot_items.dmi'
icon_state = "borghypo_n"
charge_cost = 20
recharge_time = 2
default_reagent_types = BASE_NINJA_REAGENTS //That is for Ninja
bypass_protection = TRUE //They still wearing suits, don't they?
@@ -1,38 +0,0 @@
/obj/item/dogborg_tongue
name = "synthetic tongue"
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
icon = 'modular_skyrat/modules/altborgs/icons/robot_items.dmi'
icon_state = "synthtongue"
hitsound = 'sound/effects/attackblob.ogg'
desc = "For giving affectionate kisses."
item_flags = NOBLUDGEON
/obj/item/dogborg_tongue/afterattack(atom/target, mob/user, proximity)
. = ..()
if(!proximity || !isliving(target))
return
var/mob/living/silicon/robot/borg = user
var/mob/living/mob = target
if(check_zone(borg.zone_selected) == "head")
borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]'s face!"), span_notice("You affectionally lick \the [mob]'s face!"))
playsound(borg, 'sound/effects/attackblob.ogg', 50, 1)
else
borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]!"), span_notice("You affectionally lick \the [mob]!"))
playsound(borg, 'sound/effects/attackblob.ogg', 50, 1)
/obj/item/dogborg_nose
name = "boop module"
desc = "The BOOP module"
icon = 'modular_skyrat/modules/altborgs/icons/robot_items.dmi'
icon_state = "nose"
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
force = 0
/obj/item/dogborg_nose/afterattack(atom/target, mob/user, proximity)
. = ..()
if(!proximity)
return
do_attack_animation(target, null, src)
user.visible_message(span_notice("[user] [pick("nuzzles", "pushes", "boops")] \the [target.name] with their nose!"))
@@ -1,9 +0,0 @@
/obj/item/borg/upgrade/transform/syndicatejack
name = "borg module picker (Syndicate)"
desc = "Allows you to to turn a cyborg into a experimental syndicate cyborg."
icon_state = "cyborg_upgrade3"
new_model = /obj/item/robot_model/syndicatejack
/obj/item/borg/upgrade/transform/syndicatejack/action(mob/living/silicon/robot/cyborg, user = usr) // Only usable on emagged cyborgs. In exchange. makes you unable to get locked down or detonated.
if(cyborg.emagged)
return ..()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

-30
View File
@@ -1,30 +0,0 @@
https://github.com/Skyrat-SS13/Skyrat-tg/pull/127
## Title: Alternate Borgs
MODULE ID: ALTBORGS
### Description:
Adds all alternate borg presets to the game, ported from Skyrat.
### TG Proc Changes:
- APPEND: modular_skyrat/modules/altborgs/code/modules/mob/living/silicon/robot/robot.dm > /mob/living/silicon/robot/doMove()
- ADDITION: code\modules\mob\living\silicon\robot\robot_modules.dm > /obj/item/robot_module/proc/transform_to(new_module_type)
### Defines:
- #define JOB_DISPLAY_ORDER_BLUESHIELD 34
- #define ACCESS_BLUESHIELD 71
### Master file additions
- N/A
### Included files that are not contained in this module:
- N/A
### Credits:
Gandalf2k15 - Porting & refactoring
@@ -61,3 +61,92 @@
construction_time = 120
category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_ALL)
/datum/design/borg_upgrade_welding
name = "Welding Module"
id = "borg_upgrade_welding"
construction_time = 6 SECONDS
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/welder
materials = list(
/datum/material/iron=SHEET_MATERIAL_AMOUNT * 5,
/datum/material/plasma=SHEET_MATERIAL_AMOUNT * 1,
)
category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_MINING)
//Cyborg Skyrat overrides
/datum/design/borg_suit
name = "Cyborg Endoskeleton"
id = "borg_suit"
build_type = MECHFAB
build_path = /obj/item/robot_suit
materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 3)
construction_time = 8 SECONDS
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
/datum/design/borg_chest
name = "Cyborg Torso"
id = "borg_chest"
build_type = MECHFAB
build_path = /obj/item/bodypart/chest/robot
materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 8)
construction_time = 12 SECONDS
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
/datum/design/borg_head
name = "Cyborg Head"
id = "borg_head"
build_type = MECHFAB
build_path = /obj/item/bodypart/head/robot
materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT)
construction_time = 4 SECONDS
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
/datum/design/borg_l_arm
name = "Cyborg Left Arm"
id = "borg_l_arm"
build_type = MECHFAB
build_path = /obj/item/bodypart/arm/left/robot
materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2)
construction_time = 8 SECONDS
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
/datum/design/borg_r_arm
name = "Cyborg Right Arm"
id = "borg_r_arm"
build_type = MECHFAB
build_path = /obj/item/bodypart/arm/right/robot
materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2)
construction_time = 8 SECONDS
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
/datum/design/borg_l_leg
name = "Cyborg Left Leg"
id = "borg_l_leg"
build_type = MECHFAB
build_path = /obj/item/bodypart/leg/left/robot
materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2)
construction_time = 8 SECONDS
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
/datum/design/borg_r_leg
name = "Cyborg Right Leg"
id = "borg_r_leg"
build_type = MECHFAB
build_path = /obj/item/bodypart/leg/right/robot
materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2)
construction_time = 8 SECONDS
category = list(
RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_CHASSIS
)
@@ -1,4 +1,9 @@
/// CARGO BORGS ///
/// Use this file to add STANDARD ITEMS to borgs, the upgrade items will go in the modular robot_upgrade.dm
/*
* CARGO BORGS
*/
#define CYBORG_FONT "Consolas"
#define MAX_PAPER_INTEGRATED_CLIPBOARD 10
@@ -67,7 +72,7 @@
labels_left = 9000 // I don't want to bother forcing them to recharge, honestly, that's a lot of code for a very niche functionality
/// The clamps
/// THE CLAMPS!!
/obj/item/borg/hydraulic_clamp
name = "integrated hydraulic clamp"
desc = "A neat way to lift and move around few small packages for quick and painless deliveries!"
@@ -279,81 +284,6 @@
visible_message(span_notice("[src.loc] loads [lifting_up] into [src]'s cargo hold."))
in_use = FALSE
/obj/item/borg/hydraulic_clamp/better
name = "improved integrated hydraulic clamp"
desc = "A neat way to lift and move around wrapped crates for quick and painless deliveries!"
storage_capacity = 2
whitelisted_item_types = list(/obj/item/delivery, /obj/item/bounty_cube) // If they want to carry a small package or a bounty cube instead, so be it, honestly.
whitelisted_item_description = "wrapped packages"
item_weight_limit = NONE
clamp_sound_volume = 50
/obj/item/borg/hydraulic_clamp/better/examine(mob/user)
. = ..()
var/crate_count = contents.len
. += "There is currently <b>[crate_count > 0 ? crate_count : "no"]</b> crate[crate_count > 1 ? "s" : ""] stored in the clamp's internal storage."
/obj/item/borg/hydraulic_clamp/mail
name = "integrated rapid mail delivery device"
desc = "Allows you to carry around a lot of mail, to distribute it around the station like the good little mailbot you are!"
icon = 'icons/obj/service/library.dmi'
icon_state = "bookbag"
storage_capacity = 100
loading_time = 0.25 SECONDS
unloading_time = 0.25 SECONDS
cooldown_duration = 0.25 SECONDS
whitelisted_item_types = list(/obj/item/mail)
whitelisted_item_description = "enveloppes"
item_weight_limit = WEIGHT_CLASS_NORMAL
clamp_sound_volume = 25
clamp_sound = 'sound/items/pshoom.ogg'
/datum/design/borg_upgrade_clamp
name = "Improved Integrated Hydraulic Clamp Module"
id = "borg_upgrade_clamp"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/better_clamp
materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 5)
construction_time = 12 SECONDS
category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_CARGO)
/obj/item/borg/upgrade/better_clamp
name = "improved integrated hydraulic clamp"
desc = "An improved hydraulic clamp that trades its storage quantity to allow for bigger packages to be picked up instead!"
icon_state = "cyborg_upgrade3"
require_model = TRUE
model_type = list(/obj/item/robot_model/cargo)
model_flags = BORG_MODEL_CARGO
/obj/item/borg/upgrade/better_clamp/action(mob/living/silicon/robot/cyborg, user = usr)
. = ..()
if(!.)
return
var/obj/item/borg/hydraulic_clamp/better/big_clamp = locate() in cyborg.model.modules
if(big_clamp)
to_chat(user, span_warning("This cyborg is already equipped with an improved integrated hydraulic clamp!"))
return FALSE
big_clamp = new(cyborg.model)
cyborg.model.basic_modules += big_clamp
cyborg.model.add_module(big_clamp, FALSE, TRUE)
/obj/item/borg/upgrade/better_clamp/deactivate(mob/living/silicon/robot/cyborg, user = usr)
. = ..()
if(!.)
return
var/obj/item/borg/hydraulic_clamp/better/big_clamp = locate() in cyborg.model.modules
if(big_clamp)
cyborg.model.remove_module(big_clamp, TRUE)
/// The fabled paper plane crossbow and its hardlight paper planes.
/obj/item/paperplane/syndicate/hardlight
name = "hardlight paper plane"
@@ -490,3 +420,336 @@
// I did this out of sanity, I didn't want to make the clamp code more complex than necessary, and honestly I'm considering taking this upstream, it just feels awkward to PR just that.
/obj/item/bounty_cube
w_class = WEIGHT_CLASS_SMALL
#define BASE_NINJA_REAGENTS list(\
/datum/reagent/medicine/inacusiate,\
/datum/reagent/medicine/morphine,\
/datum/reagent/medicine/potass_iodide,\
/datum/reagent/medicine/syndicate_nanites,\
/datum/reagent/consumable/nutriment\
)
/obj/item/katana/ninja_blade
name = "energy katana"
desc = "A katana infused with strong energy."
force = 30
icon_state = "energy_katana"
inhand_icon_state = "energy_katana"
worn_icon_state = "energy_katana"
/obj/item/shockpaddles/syndicate/cyborg/ninja
name = "modified defibrillator paddles"
icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi'
icon_state = "ninjapaddles0"
base_icon_state = "ninjapaddles"
/obj/item/reagent_containers/borghypo/syndicate/ninja
name = "modified cyborg hypospray"
desc = "An experimental piece of technology used to produce powerful restorative nanites used to very quickly restore injuries of all types. metabolizes potassium iodide for radiation poisoning, inacusiate for ear damage and morphine for offense and nutriment for the operative in the field."
icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi'
icon_state = "borghypo_n"
charge_cost = 20
recharge_time = 2
default_reagent_types = BASE_NINJA_REAGENTS //That is for Ninja
bypass_protection = TRUE //They still wearing suits, don't they?
/// Engineering Modules ///
/obj/item/crowbar/cyborg/power
name = "modular crowbar"
desc = "A cyborg fitted module resembling the jaws of life."
icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi'
icon_state = "jaws_pry_cyborg"
usesound = 'sound/items/jaws_pry.ogg'
force = 10
toolspeed = 0.5
/obj/item/crowbar/cyborg/power/examine()
. = ..()
. += " It's fitted with a [tool_behaviour == TOOL_CROWBAR ? "prying" : "cutting"] head."
/obj/item/crowbar/cyborg/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, TRUE)
if(tool_behaviour == TOOL_CROWBAR)
tool_behaviour = TOOL_WIRECUTTER
to_chat(user, span_notice("You attach the cutting jaws to [src]."))
icon_state = "jaws_cutter_cyborg"
usesound = 'sound/items/jaws_cut.ogg'
else
tool_behaviour = TOOL_CROWBAR
to_chat(user, span_notice("You attach the prying jaws to [src]."))
icon_state = "jaws_pry_cyborg"
usesound = 'sound/items/jaws_pry.ogg'
/obj/item/screwdriver/cyborg/power
name = "automated drill"
desc = "A cyborg fitted module resembling the hand drill"
icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi'
icon_state = "drill_screw_cyborg"
hitsound = 'sound/items/drill_hit.ogg'
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
random_color = FALSE
/obj/item/screwdriver/cyborg/power/examine()
. = ..()
. += " It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] head."
/obj/item/screwdriver/cyborg/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, TRUE)
if(tool_behaviour == TOOL_SCREWDRIVER)
tool_behaviour = TOOL_WRENCH
to_chat(user, span_notice("You attach the bolt bit to [src]."))
icon_state = "drill_bolt_cyborg"
else
tool_behaviour = TOOL_SCREWDRIVER
to_chat(user, span_notice("You attach the screw bit to [src]."))
icon_state = "drill_screw_cyborg"
/// Shapeshifter
/obj/item/borg_shapeshifter
name = "cyborg chameleon projector"
icon = 'icons/obj/device.dmi'
icon_state = "shield0"
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
inhand_icon_state = "electronic"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
var/saved_icon
var/saved_bubble_icon
var/saved_icon_override
var/saved_name
var/saved_model_features
var/saved_special_light_key
var/saved_hat_offset
var/active = FALSE
var/activationCost = 100
var/activationUpkeep = 5
var/disguise_model_name
var/disguise
var/disguise_icon_override
var/disguise_pixel_offset = 0
var/disguise_hat_offset = 0
/// Traits unique to this model (deadsprite, wide/dogborginess, etc.). Mirrors the definition in modular_skyrat\modules\borgs\code\modules\mob\living\silicon\robot\robot_model.dm
var/list/disguise_model_features = list()
var/disguise_special_light_key
var/mob/listeningTo
var/list/signalCache = list( // list here all signals that should break the camouflage
COMSIG_ATOM_ATTACKBY,
COMSIG_ATOM_ATTACK_HAND,
COMSIG_MOVABLE_IMPACT_ZONE,
COMSIG_ATOM_BULLET_ACT,
COMSIG_ATOM_EX_ACT,
COMSIG_ATOM_FIRE_ACT,
COMSIG_ATOM_EMP_ACT,
)
var/mob/living/silicon/robot/user // needed for process()
var/animation_playing = FALSE
/obj/item/borg_shapeshifter/Initialize(mapload)
. = ..()
/obj/item/borg_shapeshifter/Destroy()
listeningTo = null
return ..()
/obj/item/borg_shapeshifter/dropped(mob/user)
. = ..()
disrupt(user)
/obj/item/borg_shapeshifter/equipped(mob/user)
. = ..()
disrupt(user)
/**
* check_menu: Checks if we are allowed to interact with a radial menu
*
* Arguments:
* * user The mob interacting with a menu
*/
/obj/item/borg_shapeshifter/proc/check_menu(mob/user)
if(!istype(user))
return FALSE
if(user.incapacitated() || !user.Adjacent(src))
return FALSE
return TRUE
/obj/item/borg_shapeshifter/attack_self(mob/living/silicon/robot/user)
if (user && user.cell && user.cell.charge > activationCost)
if (isturf(user.loc))
toggle(user)
else
to_chat(user, span_warning("You can't use [src] while inside something!"))
else
to_chat(user, span_warning("You need at least [activationCost] charge in your cell to use [src]!"))
/obj/item/borg_shapeshifter/proc/toggle(mob/living/silicon/robot/user)
if(active)
playsound(src, 'sound/effects/pop.ogg', 100, TRUE, -6)
to_chat(user, span_notice("You deactivate \the [src]."))
deactivate(user)
else
if(animation_playing)
to_chat(user, span_notice("\the [src] is recharging."))
return
var/static/list/model_icons = sort_list(list(
"Standard" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "robot"),
"Medical" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "medical"),
"Cargo" = image(icon = CYBORG_ICON_CARGO, icon_state = "cargoborg"),
"Engineer" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "engineer"),
"Security" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "sec"),
"Service" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "service_f"),
"Janitor" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "janitor"),
"Miner" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "miner"),
"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")
))
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)
return FALSE
var/obj/item/robot_model/model
switch(model_selection)
if("Standard")
model = new /obj/item/robot_model/standard
if("Medical")
model = new /obj/item/robot_model/medical
if("Cargo")
model = new /obj/item/robot_model/cargo
if("Engineer")
model = new /obj/item/robot_model/engineering
if("Security")
model = new /obj/item/robot_model/security
if("Service")
model = new /obj/item/robot_model/service
if("Janitor")
model = new /obj/item/robot_model/janitor
if("Miner")
model = new /obj/item/robot_model/miner
if("Peacekeeper")
model = new /obj/item/robot_model/peacekeeper
if("Clown")
model = new /obj/item/robot_model/clown
if("Syndicate")
model = new /obj/item/robot_model/syndicatejack
if("Spider Clan")
model = new /obj/item/robot_model/ninja
else
return FALSE
if (!set_disguise_vars(model, user))
qdel(model)
return FALSE
qdel(model)
animation_playing = TRUE
to_chat(user, span_notice("You activate \the [src]."))
playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6)
var/start = user.filters.len
var/X,Y,rsq,i,f
for(i=1, i<=7, ++i)
do
X = 60*rand() - 30
Y = 60*rand() - 30
rsq = X*X + Y*Y
while(rsq<100 || rsq>900)
user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand())
for(i=1, i<=7, ++i)
f = user.filters[start+i]
animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL)
animate(offset=f:offset-1, time=rand()*20+10)
if (do_after(user, 50, target=user) && user.cell.use(activationCost))
playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6)
to_chat(user, span_notice("You are now disguised."))
activate(user)
else
to_chat(user, span_warning("The chameleon field fizzles."))
do_sparks(3, FALSE, user)
for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first
f = user.filters[start+i]
animate(f)
user.filters = null
animation_playing = FALSE
/obj/item/borg_shapeshifter/proc/set_disguise_vars(obj/item/robot_model/disguise_model, mob/living/silicon/robot/cyborg)
if (!disguise_model || !cyborg)
return FALSE
var/list/reskin_icons = list()
for(var/skin in disguise_model.borg_skins)
var/list/details = disguise_model.borg_skins[skin]
var/image/reskin = image(icon = details[SKIN_ICON] || 'icons/mob/silicon/robots.dmi', icon_state = details[SKIN_ICON_STATE])
if (!isnull(details[SKIN_FEATURES]))
if (R_TRAIT_WIDE in details[SKIN_FEATURES])
reskin.pixel_x -= 16
reskin_icons[skin] = reskin
var/borg_skin = show_radial_menu(cyborg, cyborg, reskin_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), cyborg), radius = 38, require_near = TRUE)
if(!borg_skin)
return FALSE
disguise_model_name = disguise_model.name
var/list/details = disguise_model.borg_skins[borg_skin]
disguise = details[SKIN_ICON_STATE]
disguise_icon_override = details[SKIN_ICON]
disguise_special_light_key = details[SKIN_LIGHT_KEY]
disguise_hat_offset = 0 || details[SKIN_HAT_OFFSET]
disguise_model_features = details[SKIN_FEATURES]
return TRUE
/obj/item/borg_shapeshifter/process()
if (user && !user.cell?.use(activationUpkeep))
disrupt(user)
else
return PROCESS_KILL
/obj/item/borg_shapeshifter/proc/activate(mob/living/silicon/robot/user)
src.user = user
START_PROCESSING(SSobj, src)
saved_icon = user.model.cyborg_base_icon
saved_bubble_icon = user.bubble_icon
saved_icon_override = user.model.cyborg_icon_override
saved_name = user.model.name
saved_model_features = user.model.model_features
saved_special_light_key = user.model.special_light_key
saved_hat_offset = user.model.hat_offset
user.model.name = disguise_model_name
user.model.cyborg_base_icon = disguise
user.model.cyborg_icon_override = disguise_icon_override
user.model.model_features = disguise_model_features
user.model.special_light_key = disguise_special_light_key
user.bubble_icon = "robot"
active = TRUE
user.update_icons()
user.model.update_dogborg()
user.model.update_tallborg()
if(listeningTo == user)
return
if(listeningTo)
UnregisterSignal(listeningTo, signalCache)
RegisterSignal(user, signalCache, PROC_REF(disrupt))
listeningTo = user
/obj/item/borg_shapeshifter/proc/deactivate(mob/living/silicon/robot/user)
STOP_PROCESSING(SSobj, src)
if(listeningTo)
UnregisterSignal(listeningTo, signalCache)
listeningTo = null
do_sparks(5, FALSE, user)
user.model.name = saved_name
user.model.cyborg_base_icon = saved_icon
user.model.cyborg_icon_override = saved_icon_override
user.icon = saved_icon_override
user.model.model_features = saved_model_features
user.model.special_light_key = saved_special_light_key
user.bubble_icon = saved_bubble_icon
active = FALSE
user.update_icons()
user.model.update_dogborg()
user.model.update_tallborg()
/obj/item/borg_shapeshifter/proc/disrupt(mob/living/silicon/robot/user)
SIGNAL_HANDLER
if(active)
to_chat(user, span_danger("Your chameleon field deactivates."))
deactivate(user)
@@ -4,6 +4,7 @@
var/cyborg_pixel_offset
var/model_select_alternate_icon
/// Traits unique to this model, i.e. having a unique dead sprite, being wide or being small enough to reject shrinker modules. Leverages defines in code\__DEFINES\~skyrat_defines\robot_defines.dm
/// If a sprite overlaps above the standard height, ensure it is not overlapping icons in the selector wheel.
var/list/model_features = list()
/obj/item/robot_model/proc/update_tallborg()
@@ -46,7 +47,7 @@
/obj/item/robot_model/standard
name = "Standard"
borg_skins = list(
"Default" = list(SKIN_ICON_STATE = "robot", SKIN_FEATURES = list(R_TRAIT_SMALL)),
"Default" = list(SKIN_ICON_STATE = "robot", SKIN_FEATURES = list(R_TRAIT_SMALL)),
"Marina" = list(SKIN_ICON_STATE = "marinasd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
"Heavy" = list(SKIN_ICON_STATE = "heavysd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
"Eyebot" = list(SKIN_ICON_STATE = "eyebotsd", SKIN_ICON = CYBORG_ICON_STANDARD, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
@@ -62,50 +63,51 @@
/obj/item/robot_model/service
special_light_key = null
borg_skins = list(
/// 32x32 Skins
"Waitress" = list(SKIN_ICON_STATE = "service_f", SKIN_LIGHT_KEY = "service"),
"Butler" = list(SKIN_ICON_STATE = "service_m", SKIN_LIGHT_KEY = "service"),
"Meka" = list(SKIN_ICON_STATE = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Meka (Alt)" = list(SKIN_ICON_STATE = "mekaserve_alt", SKIN_LIGHT_KEY = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Barista)" = list(SKIN_ICON_STATE = "k4tserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (80s)" = list(SKIN_ICON_STATE = "k4tserve_alt1", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Dispenser)" = list(SKIN_ICON_STATE = "k4tserve_alt2", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Slipper" = list(SKIN_ICON_STATE = "slipper_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Bro" = list(SKIN_ICON_STATE = "brobot", SKIN_LIGHT_KEY = "service"),
"Kent" = list(SKIN_ICON_STATE = "kent", SKIN_LIGHT_KEY = "medical", SKIN_HAT_OFFSET = 3),
"Can" = list(SKIN_ICON_STATE = "kent", SKIN_LIGHT_KEY = "medical", SKIN_HAT_OFFSET = 3),
"Tophat" = list(SKIN_ICON_STATE = "tophat", SKIN_HAT_OFFSET = INFINITY),
"Sleek" = list(SKIN_ICON_STATE = "sleekserv", SKIN_ICON = CYBORG_ICON_SERVICE),
"Heavy" = list(SKIN_ICON_STATE = "heavyserv", SKIN_ICON = CYBORG_ICON_SERVICE),
"Kent" = list(SKIN_ICON_STATE = "kent", SKIN_LIGHT_KEY = "medical", SKIN_HAT_OFFSET = 3),
"Can" = list(SKIN_ICON_STATE = "kent", SKIN_LIGHT_KEY = "medical", SKIN_HAT_OFFSET = 3),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_green", SKIN_ICON = CYBORG_ICON_SERVICE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Slipper" = list(SKIN_ICON_STATE = "slipper_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Bootyborg" = list(SKIN_ICON_STATE = "bootyservice", SKIN_ICON = CYBORG_ICON_SERVICE),
"Birdborg" = list(SKIN_ICON_STATE = "bird_serv", SKIN_ICON = CYBORG_ICON_SERVICE),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyservice", SKIN_ICON = CYBORG_ICON_SERVICE),
"Birdborg" = list(SKIN_ICON_STATE = "bird_serv", SKIN_ICON = CYBORG_ICON_SERVICE),
"Protectron" = list(SKIN_ICON_STATE = "protectron_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Miss M" = list(SKIN_ICON_STATE = "missm_service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_green", SKIN_ICON = CYBORG_ICON_SERVICE, SKIN_FEATURES = list(model_features = R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"Mech" = list(SKIN_ICON_STATE = "lloyd", SKIN_ICON = CYBORG_ICON_SERVICE),
"Handy" = list(SKIN_ICON_STATE = "handy-service", SKIN_ICON = CYBORG_ICON_SERVICE),
"Darkhound" = list(SKIN_ICON_STATE = "k50", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON_STATE = "valeserv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"ValeDark" = list(SKIN_ICON_STATE = "valeservdark", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Partyhound" = list(SKIN_ICON_STATE = "k69", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
/// 64x32 skins
"Borgi" = list(SKIN_ICON_STATE = "borgi-serv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
"Drake" = list(SKIN_ICON_STATE = "drakeserv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON_STATE = "valeserv", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"ValeDark" = list(SKIN_ICON_STATE = "valeservdark", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Darkhound" = list(SKIN_ICON_STATE = "k50", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Partyhound" = list(SKIN_ICON_STATE = "k69", SKIN_ICON = CYBORG_ICON_SERVICE_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
/// 32x64 skins
"Meka" = list(SKIN_ICON_STATE = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Meka (Alt)" = list(SKIN_ICON_STATE = "mekaserve_alt", SKIN_LIGHT_KEY = "mekaserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaserv", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Barista)" = list(SKIN_ICON_STATE = "k4tserve", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (80s)" = list(SKIN_ICON_STATE = "k4tserve_alt1", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Dispenser)" = list(SKIN_ICON_STATE = "k4tserve_alt2", SKIN_ICON = CYBORG_ICON_SERVICE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
//MINING
/obj/item/robot_model/miner
special_light_key = null
borg_skins = list(
/// 32x32 Skins
"Lavaland" = list(SKIN_ICON_STATE = "miner", SKIN_LIGHT_KEY = "miner"),
"Asteroid" = list(SKIN_ICON_STATE = "minerOLD", SKIN_LIGHT_KEY = "miner"),
"Meka" = list(SKIN_ICON_STATE = "mekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Rookie)" = list(SKIN_ICON_STATE = "k4tmine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Veteran)" = list(SKIN_ICON_STATE = "k4tmine_alt1", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Drone" = list(SKIN_ICON_STATE = "miningdrone", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(R_TRAIT_SMALL)),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_miner", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"Slipper" = list(SKIN_ICON_STATE = "slipper_mine", SKIN_ICON = CYBORG_ICON_MINING),
"Spider Miner" = list(SKIN_ICON_STATE = "spidermin", SKIN_LIGHT_KEY = "miner"),
"Droid" = list(SKIN_ICON_STATE = "miner", SKIN_ICON = CYBORG_ICON_MINING, SKIN_HAT_OFFSET = 4),
@@ -115,47 +117,47 @@
"Spider" = list(SKIN_ICON_STATE = "spidermin", SKIN_ICON = CYBORG_ICON_MINING),
"Heavy" = list(SKIN_ICON_STATE = "heavymin", SKIN_ICON = CYBORG_ICON_MINING),
"Bootyborg" = list(SKIN_ICON_STATE = "bootyminer", SKIN_ICON = CYBORG_ICON_MINING),
"Birdborg" = list(SKIN_ICON_STATE = "bird_mine", SKIN_ICON = CYBORG_ICON_MINING),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyminer", SKIN_ICON = CYBORG_ICON_MINING),
"Birdborg" = list(SKIN_ICON_STATE = "bird_mine", SKIN_ICON = CYBORG_ICON_MINING),
"Protectron" = list(SKIN_ICON_STATE = "protectron_miner", SKIN_ICON = CYBORG_ICON_MINING),
"Miss M" = list(SKIN_ICON_STATE = "missm_miner", SKIN_ICON = CYBORG_ICON_MINING),
"Mech" = list(SKIN_ICON_STATE = "ishimura", SKIN_ICON = CYBORG_ICON_MINING),
"Drone" = list(SKIN_ICON_STATE = "miningdrone", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(R_TRAIT_SMALL)),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_miner", SKIN_ICON = CYBORG_ICON_MINING, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
/// 64x32 skins
"Blade" = list(SKIN_ICON_STATE = "blade", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON_STATE = "valemine", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Drake" = list(SKIN_ICON_STATE = "drakemine", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Hound" = list(SKIN_ICON_STATE = "cargohound", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Darkhound" = list(SKIN_ICON_STATE = "cargohounddark", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Otie" = list(SKIN_ICON_STATE = "otiec", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE))
"Otie" = list(SKIN_ICON_STATE = "otiec", SKIN_ICON = CYBORG_ICON_MINING_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
/// 32x64 skins
"Meka" = list(SKIN_ICON_STATE = "mekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Rookie)" = list(SKIN_ICON_STATE = "k4tmine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Veteran)" = list(SKIN_ICON_STATE = "k4tmine_alt1", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekamine", SKIN_ICON = CYBORG_ICON_MINING_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
//CLOWN
/obj/item/robot_model/clown
borg_skins = list(
"Default" = list(SKIN_ICON_STATE = "clown"),
"Bootyborg" = list(SKIN_ICON_STATE = "bootyclown", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi'),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyclown", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi'),
"K4T" = list(SKIN_ICON_STATE = "k4tclown", SKIN_ICON = CYBORG_ICON_CLOWN_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_clown", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi'),
"Slipper" = list(SKIN_ICON_STATE = "slipper_clown", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi'),
"Marina" = list(SKIN_ICON_STATE = "marina_mommy", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi', SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
"Garish" = list(SKIN_ICON_STATE = "garish", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi'),
"Robot" = list(SKIN_ICON_STATE = "clownbot", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi'),
"Sleek" = list(SKIN_ICON_STATE = "clownman", SKIN_ICON = 'modular_skyrat/modules/altborgs/icons/robots_clown.dmi', SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK))
"Bootyborg" = list(SKIN_ICON_STATE = "bootyclown", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyclown", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_clown", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"Slipper" = list(SKIN_ICON_STATE = "slipper_clown", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"Marina" = list(SKIN_ICON_STATE = "marina_mommy", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi', SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
"Garish" = list(SKIN_ICON_STATE = "garish", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"Robot" = list(SKIN_ICON_STATE = "clownbot", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi'),
"Sleek" = list(SKIN_ICON_STATE = "clownman", SKIN_ICON = 'modular_skyrat/modules/borgs/icons/robots_clown.dmi', SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
/// 32x64 skins
"K4T" = list(SKIN_ICON_STATE = "k4tclown", SKIN_ICON = CYBORG_ICON_CLOWN_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
//ENGINEERING
/obj/item/robot_model/engineering
borg_skins = list(
/// 32x32 Skins
"Default" = list(SKIN_ICON_STATE = "engineer", SKIN_FEATURES = list(R_TRAIT_SMALL)),
"Meka" = list(SKIN_ICON_STATE = "mekaengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Technician)" = list(SKIN_ICON_STATE = "k4tengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Hazard)" = list(SKIN_ICON_STATE = "k4tengi_alt1", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_engi", SKIN_ICON = CYBORG_ICON_ENG),
"Slipper" = list(SKIN_ICON_STATE = "slipper_engi", SKIN_ICON = CYBORG_ICON_ENG),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_engi", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"Default - Treads" = list(SKIN_ICON_STATE = "engi-tread", SKIN_LIGHT_KEY = "engineer", SKIN_ICON = CYBORG_ICON_ENG),
"Loader" = list(SKIN_ICON_STATE = "loaderborg", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
@@ -166,31 +168,36 @@
"Spider" = list(SKIN_ICON_STATE = "spidereng", SKIN_ICON = CYBORG_ICON_ENG),
"Heavy" = list(SKIN_ICON_STATE = "heavyeng", SKIN_ICON = CYBORG_ICON_ENG),
"Bootyborg" = list(SKIN_ICON_STATE = "bootyeng", SKIN_ICON = CYBORG_ICON_ENG),
"Birdborg" = list(SKIN_ICON_STATE = "bird_eng", SKIN_ICON = CYBORG_ICON_ENG),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyeng", SKIN_ICON = CYBORG_ICON_ENG),
"Birdborg" = list(SKIN_ICON_STATE = "bird_eng", SKIN_ICON = CYBORG_ICON_ENG),
"Protectron" = list(SKIN_ICON_STATE = "protectron_eng", SKIN_ICON = CYBORG_ICON_ENG),
"Miss M" = list(SKIN_ICON_STATE = "missm_eng", SKIN_ICON = CYBORG_ICON_ENG),
"Mech" = list(SKIN_ICON_STATE = "conagher", SKIN_ICON = CYBORG_ICON_ENG),
"Wide" = list(SKIN_ICON_STATE = "wide-engi", SKIN_ICON = CYBORG_ICON_ENG),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_engi", SKIN_ICON = CYBORG_ICON_ENG),
"Slipper" = list(SKIN_ICON_STATE = "slipper_engi", SKIN_ICON = CYBORG_ICON_ENG),
"Alina" = list(SKIN_ICON_STATE = "alina-eng", SKIN_LIGHT_KEY = "alina", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Eyebot" = list(SKIN_ICON_STATE = "eyeboteng", SKIN_ICON = CYBORG_ICON_ENG, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
/// 64x32 Skins
"Borgi" = list(SKIN_ICON_STATE = "borgi-eng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
"Otie" = list(SKIN_ICON_STATE = "otiee", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Pup Dozer" = list(SKIN_ICON_STATE = "pupdozer", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON_STATE = "valeeng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Hound" = list(SKIN_ICON_STATE = "engihound", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Darkhound" = list(SKIN_ICON_STATE = "engihounddark", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Alina" = list(SKIN_ICON_STATE = "alina-eng", SKIN_LIGHT_KEY = "alina", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Drake" = list(SKIN_ICON_STATE = "drakeeng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Borgi" = list(SKIN_ICON_STATE = "borgi-eng", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
"Otie" = list(SKIN_ICON_STATE = "otiee", SKIN_ICON = CYBORG_ICON_ENG_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE))
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekaengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Technician)" = list(SKIN_ICON_STATE = "k4tengi", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Hazard)" = list(SKIN_ICON_STATE = "k4tengi_alt1", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaeng", SKIN_ICON = CYBORG_ICON_ENG_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/janitor
borg_skins = list(
/// 32x32 Skins
"Default" = list(SKIN_ICON_STATE = "janitor"),
"Meka" = list(SKIN_ICON_STATE = "mekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Viscera)" = list(SKIN_ICON_STATE = "k4tjani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Domestic)" = list(SKIN_ICON_STATE = "k4tjani_alt1", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_jani", SKIN_ICON = CYBORG_ICON_JANI),
"Slipper" = list(SKIN_ICON_STATE = "slipper_janitor", SKIN_ICON = CYBORG_ICON_JANI),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_jani", SKIN_ICON = CYBORG_ICON_JANI, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
@@ -199,8 +206,8 @@
"Can" = list(SKIN_ICON_STATE = "canjan", SKIN_ICON = CYBORG_ICON_JANI),
"Heavy" = list(SKIN_ICON_STATE = "heavyres", SKIN_ICON = CYBORG_ICON_JANI),
"Bootyborg" = list(SKIN_ICON_STATE = "bootyjanitor", SKIN_ICON = CYBORG_ICON_JANI),
"Birdborg" = list(SKIN_ICON_STATE = "bird_jani", SKIN_ICON = CYBORG_ICON_JANI),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyjanitor", SKIN_ICON = CYBORG_ICON_JANI),
"Birdborg" = list(SKIN_ICON_STATE = "bird_jani", SKIN_ICON = CYBORG_ICON_JANI),
"Protectron" = list(SKIN_ICON_STATE = "protectron_janitor", SKIN_ICON = CYBORG_ICON_JANI),
"Miss M" = list(SKIN_ICON_STATE = "missm_janitor", SKIN_ICON = CYBORG_ICON_JANI),
"Mech" = list(SKIN_ICON_STATE = "flynn", SKIN_ICON = CYBORG_ICON_JANI),
@@ -208,23 +215,26 @@
"Insekt" = list(SKIN_ICON_STATE = "insekt-Sci", SKIN_ICON = CYBORG_ICON_JANI),
"Wide" = list(SKIN_ICON_STATE = "wide-jani", SKIN_ICON = CYBORG_ICON_JANI),
"Spider" = list(SKIN_ICON_STATE = "spidersci", SKIN_ICON = CYBORG_ICON_JANI),
/// 64x32 Skins
"Borgi" = list(SKIN_ICON_STATE = "borgi-jani", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
"Scrubpuppy" = list(SKIN_ICON_STATE = "scrubpup", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Otie" = list(SKIN_ICON_STATE = "otiej", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Drake" = list(SKIN_ICON_STATE = "drakejanit", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON_STATE = "J9", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Borgi" = list(SKIN_ICON_STATE = "borgi-jani", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL))
"Otie" = list(SKIN_ICON_STATE = "otiej", SKIN_ICON = CYBORG_ICON_JANI_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Viscera)" = list(SKIN_ICON_STATE = "k4tjani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Domestic)" = list(SKIN_ICON_STATE = "k4tjani_alt1", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekajani", SKIN_ICON = CYBORG_ICON_JANI_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
//MEDICAL
/obj/item/robot_model/medical
borg_skins = list(
/// 32x32 Skins
"Machinified Doctor" = list(SKIN_ICON_STATE = "medical", SKIN_TRAITS = list(R_TRAIT_SMALL)),
"Qualified Doctor" = list(SKIN_ICON_STATE = "qualified_doctor"),
"Meka" = list(SKIN_ICON_STATE = "mekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Doc)" = list(SKIN_ICON_STATE = "k4tmed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Field Medic)" = list(SKIN_ICON_STATE = "k4tmed_alt1", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"ARACHNE" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "arachne_med"),
"Slipper" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "slipper_med"),
"Zoomba" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "zoomba_med", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
@@ -236,51 +246,57 @@
"Bootyborg" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "bootymedical"),
"Birdborg" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "bird_med"),
"Male Bootyborg" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "male_bootymedical"),
// PLEASE ASSUME THE POSITION
"Protectron" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "protectron_medical"),
"Miss M" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "missm_med"),
"Insekt" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "insekt-Med"),
"Mech" = list(SKIN_ICON = CYBORG_ICON_MED, SKIN_ICON_STATE = "gibbs"),
/// 64x32 Skins
"Borgi" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "borgi-medi", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Drake" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "drakemed", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Hound" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "medihound", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"DarkHound" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "medihounddark", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "valemed", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Alina" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "alina-med", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Drake" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "drakemed", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Borgi" = list(SKIN_ICON = CYBORG_ICON_MED_WIDE, SKIN_ICON_STATE = "borgi-medi", SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE))
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Doc)" = list(SKIN_ICON_STATE = "k4tmed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Field Medic)" = list(SKIN_ICON_STATE = "k4tmed_alt1", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekamed", SKIN_ICON = CYBORG_ICON_MED_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
//PEACEKEEPER
/obj/item/robot_model/peacekeeper
borg_skins = list(
/// 32x32 Skins
"Default" = list(SKIN_ICON_STATE = "peace"),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_peace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(model_features = R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"Meka" = list(SKIN_ICON_STATE = "mekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tpeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_peace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_peacekeeper", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Sleek" = list(SKIN_ICON_STATE = "sleekpeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
"Spider" = list(SKIN_ICON_STATE = "whitespider", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_SMALL)),
"Marina" = list(SKIN_ICON_STATE = "marinapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK)),
"Bootyborg" = list(SKIN_ICON_STATE = "bootypeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Birdborg" = list(SKIN_ICON_STATE = "bird_pk", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootypeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Birdborg" = list(SKIN_ICON_STATE = "bird_pk", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Protectron" = list(SKIN_ICON_STATE = "protectron_peacekeeper", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Insekt" = list(SKIN_ICON_STATE = "insekt-Default", SKIN_ICON = CYBORG_ICON_PEACEKEEPER),
"Omni" = list(SKIN_ICON_STATE = "omoikane", SKIN_ICON = CYBORG_ICON_PEACEKEEPER, SKIN_FEATURES = list(R_TRAIT_SMALL)),
/// 64x32 Skins
"Drake" = list(SKIN_ICON_STATE = "drakepeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Borgi" = list(SKIN_ICON_STATE = "borgi", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
"Vale" = list(SKIN_ICON_STATE = "valepeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE))
"Vale" = list(SKIN_ICON_STATE = "valepeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tpeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekapeace", SKIN_ICON = CYBORG_ICON_PEACEKEEPER_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/security
borg_skins = list(
/// 32x32 Skins
"Default" = list(SKIN_ICON_STATE = "sec"),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_sec", SKIN_ICON = CYBORG_ICON_SEC, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"Meka" = list(SKIN_ICON_STATE = "mekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tsec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Default - Treads" = list(SKIN_ICON_STATE = "sec-tread", SKIN_LIGHT_KEY = "sec", SKIN_ICON = CYBORG_ICON_SEC),
"Sleek" = list(SKIN_ICON_STATE = "sleeksec", SKIN_ICON = CYBORG_ICON_SEC),
"Marina" = list(SKIN_ICON_STATE = "marinasec", SKIN_ICON = CYBORG_ICON_SEC),
@@ -294,15 +310,71 @@
"Eyebot" = list(SKIN_ICON_STATE = "eyebotsec", SKIN_ICON = CYBORG_ICON_SEC, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL)),
"Insekt" = list(SKIN_ICON_STATE = "insekt-Sec", SKIN_ICON = CYBORG_ICON_SEC),
"Mech" = list(SKIN_ICON_STATE = "woody", SKIN_ICON = CYBORG_ICON_SEC),
/// 64x32 Skins
"Borgi" = list(SKIN_ICON_STATE = "borgi-sec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
"Hound" = list(SKIN_ICON_STATE = "k9", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Darkhound" = list(SKIN_ICON_STATE = "k9dark", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Drake" = list(SKIN_ICON_STATE = "drakesec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Otie" = list(SKIN_ICON_STATE = "oties", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Alina" = list(SKIN_ICON_STATE = "alina-sec", SKIN_LIGHT_KEY = "alina", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Darkhound" = list(SKIN_ICON_STATE = "k9dark", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON_STATE = "valesec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Drake" = list(SKIN_ICON_STATE = "drakesec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Borgi" = list(SKIN_ICON_STATE = "borgi-sec", SKIN_ICON = CYBORG_ICON_SEC_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL))
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tsec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekasec", SKIN_ICON = CYBORG_ICON_SEC_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
// CARGO
/obj/item/robot_model/cargo
name = "Cargo"
basic_modules = list(
/obj/item/stamp,
/obj/item/stamp/denied,
/obj/item/pen/cyborg,
/obj/item/clipboard/cyborg,
/obj/item/boxcutter,
/obj/item/stack/package_wrap/cyborg,
/obj/item/stack/wrapping_paper/xmas/cyborg,
/obj/item/assembly/flash/cyborg,
/obj/item/borg/hydraulic_clamp,
/obj/item/borg/hydraulic_clamp/mail,
/obj/item/hand_labeler/cyborg,
/obj/item/dest_tagger,
/obj/item/crowbar/cyborg,
/obj/item/extinguisher,
/obj/item/universal_scanner,
)
radio_channels = list(RADIO_CHANNEL_SUPPLY)
emag_modules = list(
/obj/item/stamp/chameleon,
/obj/item/borg/paperplane_crossbow,
)
hat_offset = 0
cyborg_base_icon = "cargo"
model_select_icon = "cargo"
canDispose = TRUE
borg_skins = list(
/// 32x32 Skins
"Technician" = list(SKIN_ICON_STATE = "cargoborg", SKIN_ICON = CYBORG_ICON_CARGO),
"Miss M" = list(SKIN_ICON_STATE = "missm_cargo", SKIN_ICON = CYBORG_ICON_CARGO),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_cargo", SKIN_ICON = CYBORG_ICON_CARGO, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"Birdborg" = list(SKIN_ICON_STATE = "bird_cargo", SKIN_ICON = CYBORG_ICON_CARGO),
/// 64x32 Skins
"Borgi" = list(SKIN_ICON_STATE = "borgi-cargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL)),
"Drake" = list(SKIN_ICON_STATE = "drakecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Hound" = list(SKIN_ICON_STATE = "cargohound", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Darkhound" = list(SKIN_ICON_STATE = "cargohounddark", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Vale" = list(SKIN_ICON_STATE = "valecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Loader)" = list(SKIN_ICON_STATE = "k4tcargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Turtleneck)" = list(SKIN_ICON_STATE = "k4tcargo_alt1", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
//SYNDICATE
/obj/item/robot_model/syndicatejack
name = "Syndicate"
@@ -343,13 +415,10 @@
hat_offset = INFINITY
canDispose = TRUE
borg_skins = list(
/// 32x32 Skins
"Saboteur" = list(SKIN_ICON_STATE = "synd_engi", SKIN_ICON = 'icons/mob/silicon/robots.dmi'),
"Medical" = list(SKIN_ICON_STATE = "synd_medical", SKIN_ICON = 'icons/mob/silicon/robots.dmi'),
"Assault" = list(SKIN_ICON_STATE = "synd_sec", SKIN_ICON = 'icons/mob/silicon/robots.dmi'),
"Meka" = list(SKIN_ICON_STATE = "mekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tsyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"ARACHNE" = list(SKIN_ICON_STATE = "arachne_syndie", SKIN_ICON = CYBORG_ICON_SYNDIE),
"Heavy" = list(SKIN_ICON_STATE = "syndieheavy", SKIN_ICON = CYBORG_ICON_SYNDIE),
"Miss M" = list(SKIN_ICON_STATE = "missm_syndie", SKIN_ICON = CYBORG_ICON_SYNDIE),
@@ -359,7 +428,12 @@
"Bird Syndicate" = list(SKIN_ICON_STATE = "bird_synd", SKIN_ICON = CYBORG_ICON_SYNDIE),
"Male Booty Striker" = list(SKIN_ICON_STATE = "male_bootynukie", SKIN_ICON = CYBORG_ICON_SYNDIE),
"Male Booty Syndicate" = list(SKIN_ICON_STATE = "male_bootysyndie", SKIN_ICON = CYBORG_ICON_SYNDIE),
"Mech" = list(SKIN_ICON_STATE = "chesty", SKIN_ICON = CYBORG_ICON_SYNDIE)
"Mech" = list(SKIN_ICON_STATE = "chesty", SKIN_ICON = CYBORG_ICON_SYNDIE),
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tsyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekasyndi", SKIN_ICON = CYBORG_ICON_SYNDIE_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/syndicatejack/rebuild_modules()
@@ -387,22 +461,24 @@
cyborg_base_icon = "ninja_sec"
cyborg_icon_override = CYBORG_ICON_NINJA
model_select_icon = "ninjaborg"
model_select_alternate_icon = 'modular_skyrat/modules/altborgs/icons/screen_cyborg.dmi'
model_select_alternate_icon = 'modular_skyrat/modules/borgs/icons/screen_cyborg.dmi'
model_traits = list(TRAIT_PUSHIMMUNE, TRAIT_NOFLASH) //No more charging them with a flash and thinking it is a good idea
hat_offset = 3
borg_skins = list(
/// 32x32 Skins
"Saboteur" = list(SKIN_ICON_STATE = "ninja_engi", SKIN_ICON = CYBORG_ICON_NINJA),
"Medical" = list(SKIN_ICON_STATE = "ninja_medical", SKIN_ICON = CYBORG_ICON_NINJA),
"Assault" = list(SKIN_ICON_STATE = "ninja_sec", SKIN_ICON = CYBORG_ICON_NINJA),
"Heavy" = list(SKIN_ICON_STATE = "ninjaheavy", SKIN_ICON = CYBORG_ICON_NINJA),
"Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Miss M" = list(SKIN_ICON_STATE = "missm_ninja", SKIN_ICON = CYBORG_ICON_NINJA),
"Spider" = list(SKIN_ICON_STATE = "ninjaspider", SKIN_ICON = CYBORG_ICON_NINJA),
"BootyBorg" = list(SKIN_ICON_STATE = "bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyninja", SKIN_ICON = CYBORG_ICON_NINJA)
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/ninja/rebuild_modules()
@@ -439,7 +515,7 @@
cyborg_base_icon = "ninja_medical"
cyborg_icon_override = CYBORG_ICON_NINJA
model_select_icon = "ninjaborg"
model_select_alternate_icon = 'modular_skyrat/modules/altborgs/icons/screen_cyborg.dmi'
model_select_alternate_icon = 'modular_skyrat/modules/borgs/icons/screen_cyborg.dmi'
/obj/item/robot_model/ninja_saboteur
name = "Spider Clan Saboteur"
@@ -468,7 +544,7 @@
cyborg_base_icon = "ninja_engi"
cyborg_icon_override = CYBORG_ICON_NINJA
model_select_icon = "ninjaborg"
model_select_alternate_icon = 'modular_skyrat/modules/altborgs/icons/screen_cyborg.dmi'
model_select_alternate_icon = 'modular_skyrat/modules/borgs/icons/screen_cyborg.dmi'
model_traits = list(TRAIT_PUSHIMMUNE, TRAIT_NOFLASH)
model_traits = list(TRAIT_NEGATES_GRAVITY)
hat_offset = -4
@@ -478,14 +554,15 @@
"Medical" = list(SKIN_ICON_STATE = "ninja_medical", SKIN_ICON = CYBORG_ICON_NINJA),
"Assault" = list(SKIN_ICON_STATE = "ninja_sec", SKIN_ICON = CYBORG_ICON_NINJA),
"Heavy" = list(SKIN_ICON_STATE = "ninjaheavy", SKIN_ICON = CYBORG_ICON_NINJA),
"Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Miss M" = list(SKIN_ICON_STATE = "missm_ninja", SKIN_ICON = CYBORG_ICON_NINJA),
"Spider" = list(SKIN_ICON_STATE = "ninjaspider", SKIN_ICON = CYBORG_ICON_NINJA),
"BootyBorg" = list(SKIN_ICON_STATE = "bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyninja", SKIN_ICON = CYBORG_ICON_NINJA)
"Male Bootyborg" = list(SKIN_ICON_STATE = "male_bootyninja", SKIN_ICON = CYBORG_ICON_NINJA),
/// 32x64 Skins
"Meka" = list(SKIN_ICON_STATE = "mekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T" = list(SKIN_ICON_STATE = "k4tninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekaninja", SKIN_ICON = CYBORG_ICON_NINJA_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15)
)
/obj/item/robot_model/ninja_saboteur/do_transform_animation()
@@ -1,49 +1,10 @@
/mob/living/silicon/robot
var/hasShrunk = FALSE
var/hasAffection = FALSE
var/hasAdvanced = FALSE
/// Use this file to add UPGRADES to borgs, the standard items will go in the modular robot_items.dm
/obj/item/borg/upgrade/shrink
name = "borg shrinker"
desc = "A cyborg resizer, it makes a cyborg small."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/shrink/action(mob/living/silicon/robot/borg, user = usr)
. = ..()
if(.)
if(borg.hasShrunk)
to_chat(usr, span_warning("This unit already has a shrink module installed!"))
return FALSE
if(R_TRAIT_SMALL in borg.model.model_features)
to_chat(usr, span_warning("This unit's chassis cannot be shrunk any further."))
return FALSE
borg.hasShrunk = TRUE
ADD_TRAIT(borg, TRAIT_NO_TRANSFORM, REF(src))
var/prev_lockcharge = borg.lockcharge
borg.SetLockdown(1)
borg.set_anchored(TRUE)
var/datum/effect_system/fluid_spread/smoke/smoke = new
smoke.set_up(1, location = get_turf(borg))
smoke.start()
sleep(0.2 SECONDS)
for(var/i in 1 to 4)
playsound(borg, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1)
sleep(1.2 SECONDS)
if(!prev_lockcharge)
borg.SetLockdown(0)
borg.set_anchored(FALSE)
REMOVE_TRAIT(borg, TRAIT_NO_TRANSFORM, REF(src))
borg.update_transform(0.75)
/obj/item/borg/upgrade/shrink/deactivate(mob/living/silicon/robot/borg, user = usr)
. = ..()
if (.)
if (borg.hasShrunk)
borg.hasShrunk = FALSE
borg.update_transform(4/3)
/*
* ADVANCED MEDICAL CYBORG UPGRADES
*/
/// Advanced Surgery Tools
/obj/item/borg/upgrade/surgerytools
name = "medical cyborg advanced surgery tools"
desc = "An upgrade to the Medical model cyborg's surgery loadout, replacing non-advanced tools with their advanced counterpart."
@@ -117,44 +78,11 @@
borg.model.basic_modules += HA
borg.model.add_module(HA, FALSE, TRUE)
/obj/item/borg/upgrade/affectionmodule
name = "borg affection module"
desc = "A module that upgrades the ability of borgs to display affection."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/affectionmodule/action(mob/living/silicon/robot/borg)
. = ..()
if(!.)
return
if(borg.hasAffection)
to_chat(usr, span_warning("This unit already has a affection module installed!"))
return FALSE
if(!(R_TRAIT_WIDE in borg.model.model_features))
to_chat(usr, span_warning("This unit's chassis does not support this module."))
return FALSE
var/obj/item/dogborg_tongue/dogtongue = new /obj/item/dogborg_tongue(borg.model)
borg.model.basic_modules += dogtongue
borg.model.add_module(dogtongue, FALSE, TRUE)
var/obj/item/dogborg_nose/dognose = new /obj/item/dogborg_nose(borg.model)
borg.model.basic_modules += dognose
borg.model.add_module(dognose, FALSE, TRUE)
borg.hasAffection = TRUE
/obj/item/borg/upgrade/affectionmodule/deactivate(mob/living/silicon/robot/borg, user = usr)
. = ..()
if(.)
return
borg.hasAffection = FALSE
for(var/obj/item/dogborg_tongue/dogtongue in borg.model.modules)
borg.model.remove_module(dogtongue, TRUE)
for(var/obj/item/dogborg_nose/dognose in borg.model.modules)
borg.model.remove_module(dognose, TRUE)
/*
* ADVANCED ENGINEERING CYBORG MATERIALS
* ADVANCED ENGINEERING CYBORG UPGRADES
*/
/// Advanced Materials
#define ENGINEERING_CYBORG_CHARGE_PER_STACK 1000
/datum/robot_energy_storage/plasteel
@@ -214,7 +142,7 @@
for(var/datum/robot_energy_storage/titanium/titanium_energy in borgo.model.storages)
qdel(titanium_energy)
// funny borg inducer upgrade
/// funny borg inducer upgrade
/obj/item/borg/upgrade/inducer
name = "engineering cyborg inducer upgrade"
desc = "An inducer device for the engineering cyborg."
@@ -242,3 +170,268 @@
var/obj/item/inducer/cyborg/inducer = locate() in target_robot.model
if (inducer)
target_robot.model.remove_module(inducer, TRUE)
/*
* ADVANCED MINING CYBORG UPGRADES
*/
/// Welder
/obj/item/borg/upgrade/welder
name = "mining cyborg welder upgrade"
desc = "A normal welder with a larger tank for cyborgs."
icon_state = "cyborg_upgrade3"
require_model = TRUE
model_type = list(/obj/item/robot_model/miner)
model_flags = BORG_MODEL_MINER
/obj/item/borg/upgrade/welder/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
for(var/obj/item/weldingtool/mini/W in R.model)
R.model.remove_module(W, TRUE)
var/obj/item/weldingtool/largetank/cyborg/WW = new /obj/item/weldingtool/largetank/cyborg(R.model)
R.model.basic_modules += WW
R.model.add_module(WW, FALSE, TRUE)
/obj/item/borg/upgrade/welder/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
for(var/obj/item/weldingtool/largetank/cyborg/WW in R.model)
R.model.remove_module(WW, TRUE)
var/obj/item/weldingtool/mini/W = new (R.model)
R.model.basic_modules += W
R.model.add_module(W, FALSE, TRUE)
/*
* ADVANCED CARGO CYBORG UPGRADES
*/
/// Better Clamp
/obj/item/borg/hydraulic_clamp/better
name = "improved integrated hydraulic clamp"
desc = "A neat way to lift and move around crates for quick and painless deliveries!"
storage_capacity = 4
whitelisted_item_types = list(/obj/structure/closet/crate, /obj/item/delivery/big, /obj/item/delivery, /obj/item/bounty_cube) // If they want to carry a small package or a bounty cube instead, so be it, honestly.
whitelisted_item_description = "wrapped packages"
item_weight_limit = NONE
clamp_sound_volume = 50
/obj/item/borg/hydraulic_clamp/better/examine(mob/user)
. = ..()
var/crate_count = contents.len
. += "There is currently <b>[crate_count > 0 ? crate_count : "no"]</b> crate[crate_count > 1 ? "s" : ""] stored in the clamp's internal storage."
/obj/item/borg/hydraulic_clamp/mail
name = "integrated rapid mail delivery device"
desc = "Allows you to carry around a lot of mail, to distribute it around the station like the good little mailbot you are!"
icon = 'icons/obj/service/library.dmi'
icon_state = "bookbag"
storage_capacity = 100
loading_time = 0.25 SECONDS
unloading_time = 0.25 SECONDS
cooldown_duration = 0.25 SECONDS
whitelisted_item_types = list(/obj/item/mail)
whitelisted_item_description = "envelopes"
item_weight_limit = WEIGHT_CLASS_NORMAL
clamp_sound_volume = 25
clamp_sound = 'sound/items/pshoom.ogg'
/datum/design/borg_upgrade_clamp
name = "improved Integrated Hydraulic Clamp Module"
id = "borg_upgrade_clamp"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/better_clamp
materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 2, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 5)
construction_time = 12 SECONDS
category = list(RND_CATEGORY_MECHFAB_CYBORG_MODULES + RND_SUBCATEGORY_MECHFAB_CYBORG_MODULES_CARGO)
/obj/item/borg/upgrade/better_clamp
name = "improved integrated hydraulic clamp"
desc = "An improved hydraulic clamp to allow for bigger packages to be picked up as well!"
icon_state = "cyborg_upgrade3"
require_model = TRUE
model_type = list(/obj/item/robot_model/cargo)
model_flags = BORG_MODEL_CARGO
/obj/item/borg/upgrade/better_clamp/action(mob/living/silicon/robot/cyborg, user = usr)
. = ..()
if(!.)
return
var/obj/item/borg/hydraulic_clamp/better/big_clamp = locate() in cyborg.model.modules
if(big_clamp)
to_chat(user, span_warning("This cyborg is already equipped with an improved integrated hydraulic clamp!"))
return FALSE
big_clamp = new(cyborg.model)
cyborg.model.basic_modules += big_clamp
cyborg.model.add_module(big_clamp, FALSE, TRUE)
/obj/item/borg/upgrade/better_clamp/deactivate(mob/living/silicon/robot/cyborg, user = usr)
. = ..()
if(!.)
return
var/obj/item/borg/hydraulic_clamp/better/big_clamp = locate() in cyborg.model.modules
if(big_clamp)
cyborg.model.remove_module(big_clamp, TRUE)
/*
* UNIVERSAL CYBORG UPGRADES
*/
/// ShapeShifter
/obj/item/borg/upgrade/borg_shapeshifter
name = "Cyborg Shapeshifter Module"
desc = "An experimental device which allows a cyborg to disguise themself into another type of cyborg."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/borg_shapeshifter/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/borg_shapeshifter/BS = new /obj/item/borg_shapeshifter(R.model)
R.model.basic_modules += BS
R.model.add_module(BS, FALSE, TRUE)
/obj/item/borg/upgrade/borg_shapeshifter/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
for(var/obj/item/borg_shapeshifter/BS in R.model)
R.model.remove_module(BS, TRUE)
/// Quadborg time
/obj/item/borg/upgrade/affectionmodule
name = "borg affection module"
desc = "A module that upgrades the ability of borgs to display affection."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/affectionmodule/action(mob/living/silicon/robot/borg)
. = ..()
if(!.)
return
if(borg.hasAffection)
to_chat(usr, span_warning("This unit already has a affection module installed!"))
return FALSE
if(!(R_TRAIT_WIDE in borg.model.model_features))
to_chat(usr, span_warning("This unit's chassis does not support this module."))
return FALSE
var/obj/item/quadborg_tongue/quadtongue = new /obj/item/quadborg_tongue(borg.model)
borg.model.basic_modules += quadtongue
borg.model.add_module(quadtongue, FALSE, TRUE)
var/obj/item/quadborg_nose/quadnose = new /obj/item/quadborg_nose(borg.model)
borg.model.basic_modules += quadnose
borg.model.add_module(quadnose, FALSE, TRUE)
borg.hasAffection = TRUE
/obj/item/borg/upgrade/affectionmodule/deactivate(mob/living/silicon/robot/borg, user = usr)
. = ..()
if(.)
return
borg.hasAffection = FALSE
for(var/obj/item/quadborg_tongue/quadtongue in borg.model.modules)
borg.model.remove_module(quadtongue, TRUE)
for(var/obj/item/quadborg_nose/quadnose in borg.model.modules)
borg.model.remove_module(quadnose, TRUE)
// Quadruped tongue - lick lick
/obj/item/quadborg_tongue
name = "synthetic tongue"
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi'
icon_state = "synthtongue"
hitsound = 'sound/effects/attackblob.ogg'
desc = "For giving affectionate kisses."
item_flags = NOBLUDGEON
/obj/item/quadborg_tongue/afterattack(atom/target, mob/user, proximity)
. = ..()
if(!proximity || !isliving(target))
return
var/mob/living/silicon/robot/borg = user
var/mob/living/mob = target
if(check_zone(borg.zone_selected) == "head")
borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]'s face!"), span_notice("You affectionally lick \the [mob]'s face!"))
playsound(borg, 'sound/effects/attackblob.ogg', 50, 1)
else
borg.visible_message(span_warning("\the [borg] affectionally licks \the [mob]!"), span_notice("You affectionally lick \the [mob]!"))
playsound(borg, 'sound/effects/attackblob.ogg', 50, 1)
// Quadruped nose - Boop
/obj/item/quadborg_nose
name = "boop module"
desc = "The BOOP module"
icon = 'modular_skyrat/modules/borgs/icons/robot_items.dmi'
icon_state = "nose"
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
force = 0
/obj/item/quadborg_nose/afterattack(atom/target, mob/user, proximity)
. = ..()
if(!proximity)
return
do_attack_animation(target, null, src)
user.visible_message(span_notice("[user] [pick("nuzzles", "pushes", "boops")] \the [target.name] with their nose!"))
/// The Shrinkening
/mob/living/silicon/robot
var/hasShrunk = FALSE
var/hasAffection = FALSE
var/hasAdvanced = FALSE
/obj/item/borg/upgrade/shrink
name = "borg shrinker"
desc = "A cyborg resizer, it makes a cyborg small."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/shrink/action(mob/living/silicon/robot/borg, user = usr)
. = ..()
if(.)
if(borg.hasShrunk)
to_chat(usr, span_warning("This unit already has a shrink module installed!"))
return FALSE
if(R_TRAIT_SMALL in borg.model.model_features)
to_chat(usr, span_warning("This unit's chassis cannot be shrunk any further."))
return FALSE
borg.hasShrunk = TRUE
ADD_TRAIT(borg, TRAIT_NO_TRANSFORM, REF(src))
var/prev_lockcharge = borg.lockcharge
borg.SetLockdown(TRUE)
borg.set_anchored(TRUE)
var/datum/effect_system/fluid_spread/smoke/smoke = new
smoke.set_up(1, location = get_turf(borg))
smoke.start()
sleep(0.2 SECONDS)
for(var/i in 1 to 4)
playsound(borg, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1)
sleep(1.2 SECONDS)
if(!prev_lockcharge)
borg.SetLockdown(FALSE)
borg.set_anchored(FALSE)
REMOVE_TRAIT(borg, TRAIT_NO_TRANSFORM, REF(src))
borg.update_transform(0.75)
/obj/item/borg/upgrade/shrink/deactivate(mob/living/silicon/robot/borg, user = usr)
. = ..()
if (.)
if (borg.hasShrunk)
borg.hasShrunk = FALSE
borg.update_transform(4/3)
/// Syndijack
/obj/item/borg/upgrade/transform/syndicatejack
name = "borg module picker (Syndicate)"
desc = "Allows you to to turn a cyborg into a experimental syndicate cyborg."
icon_state = "cyborg_upgrade3"
new_model = /obj/item/robot_model/syndicatejack
/obj/item/borg/upgrade/transform/syndicatejack/action(mob/living/silicon/robot/cyborg, user = usr) // Only usable on emagged cyborgs. In exchange. makes you unable to get locked down or detonated.
if(cyborg.emagged)
return ..()
@@ -1,6 +1,14 @@
/mob/living/silicon/robot/update_icons()
icon = (model.cyborg_icon_override ? model.cyborg_icon_override : initial(icon))
. = ..()
/// Let's give custom borgs the ability to have flavor panels for their model
if(opened && (R_TRAIT_UNIQUEPANEL in model.model_features))
if(wiresexposed)
add_overlay("[model.cyborg_base_icon]_w")
else if(cell)
add_overlay("[model.cyborg_base_icon]_c")
else
add_overlay("[model.cyborg_base_icon]_cl")
update_altborg_icons()
/mob/living/silicon/robot/proc/update_altborg_icons()
@@ -53,4 +61,5 @@
if(stat == DEAD && (R_TRAIT_UNIQUEWRECK in model.model_features))
icon_state = "[model.cyborg_base_icon]-wreck"
update_fire()

Before

Width:  |  Height:  |  Size: 477 B

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Before

Width:  |  Height:  |  Size: 412 KiB

After

Width:  |  Height:  |  Size: 412 KiB

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Before

Width:  |  Height:  |  Size: 327 KiB

After

Width:  |  Height:  |  Size: 327 KiB

Before

Width:  |  Height:  |  Size: 325 KiB

After

Width:  |  Height:  |  Size: 325 KiB

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Before

Width:  |  Height:  |  Size: 344 KiB

After

Width:  |  Height:  |  Size: 344 KiB

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 275 KiB

@@ -1,13 +1,16 @@
## Title: Cyborg
https://github.com/Skyrat-SS13/Skyrat-tg/pull/127
## Title: borgs
MODULE ID: BORGS
MODULE ID: CYBORG
### Description:
Most new content relating to cyborgs goes here. Borg skins are in Altborgs currently
Condenses modular borg skins, items, upgrades and buffs to one folder for sanity's sake
### TG Proc Changes:
- APPEND: modular_skyrat/modules/altborgs > modular_skyrat/modules/borgs
- /code/modules/mob/living/silicon/robot/robot_modules.dm
- /code/modules/research/techweb/all_nodes.dm
@@ -25,5 +28,7 @@ Most new content relating to cyborgs goes here. Borg skins are in Altborgs curre
### Credits:
Gandalf2k15 - Porting & refactoring
Azarak - porting
DuffCreeper - Code, Spriting
DuffCreeper - Code, Spriting
Zergspower - Refactoring
@@ -1,45 +0,0 @@
// CARGO
/obj/item/robot_model/cargo
name = "Cargo"
basic_modules = list(
/obj/item/stamp,
/obj/item/stamp/denied,
/obj/item/pen/cyborg,
/obj/item/clipboard/cyborg,
/obj/item/stack/package_wrap/cyborg,
/obj/item/stack/wrapping_paper/xmas/cyborg,
/obj/item/assembly/flash/cyborg,
/obj/item/borg/hydraulic_clamp,
/obj/item/borg/hydraulic_clamp/mail,
/obj/item/hand_labeler/cyborg,
/obj/item/dest_tagger,
/obj/item/crowbar/cyborg,
/obj/item/extinguisher,
/obj/item/universal_scanner,
)
radio_channels = list(RADIO_CHANNEL_SUPPLY)
emag_modules = list(
/obj/item/stamp/chameleon,
/obj/item/borg/paperplane_crossbow,
)
hat_offset = 0
cyborg_base_icon = "cargo"
model_select_icon = "cargo"
canDispose = TRUE
borg_skins = list(
"Technician" = list(SKIN_ICON_STATE = "cargoborg", SKIN_ICON = CYBORG_ICON_CARGO),
"Miss M" = list(SKIN_ICON_STATE = "missm_cargo", SKIN_ICON = CYBORG_ICON_CARGO),
"Zoomba" = list(SKIN_ICON_STATE = "zoomba_cargo", SKIN_ICON = CYBORG_ICON_CARGO, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_SMALL), SKIN_HAT_OFFSET = -13),
"Meka" = list(SKIN_ICON_STATE = "mekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Loader)" = list(SKIN_ICON_STATE = "k4tcargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"K4T (Turtleneck)" = list(SKIN_ICON_STATE = "k4tcargo_alt1", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKA" = list(SKIN_ICON_STATE = "fmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"NiKO" = list(SKIN_ICON_STATE = "mmekacargo", SKIN_ICON = CYBORG_ICON_CARGO_TALL, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_UNIQUETIP, R_TRAIT_TALL), SKIN_HAT_OFFSET = 15),
"Drake" = list(SKIN_ICON_STATE = "drakecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Birdborg" = list(SKIN_ICON_STATE = "bird_cargo", SKIN_ICON = CYBORG_ICON_CARGO),
"Vale" = list(SKIN_ICON_STATE = "valecargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Hound" = list(SKIN_ICON_STATE = "cargohound", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Darkhound" = list(SKIN_ICON_STATE = "cargohounddark", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE)),
"Borgi" = list(SKIN_ICON_STATE = "borgi-cargo", SKIN_ICON = CYBORG_ICON_CARGO_WIDE, SKIN_FEATURES = list(R_TRAIT_UNIQUEWRECK, R_TRAIT_WIDE, R_TRAIT_SMALL))
)
@@ -1,50 +0,0 @@
/obj/item/crowbar/cyborg/power
name = "modular crowbar"
desc = "A cyborg fitted module resembling the jaws of life."
icon = 'modular_skyrat/modules/cyborg/icons/items_cyborg.dmi'
icon_state = "jaws_pry_cyborg"
usesound = 'sound/items/jaws_pry.ogg'
force = 10
toolspeed = 0.5
/obj/item/crowbar/cyborg/power/examine()
. = ..()
. += " It's fitted with a [tool_behaviour == TOOL_CROWBAR ? "prying" : "cutting"] head."
/obj/item/crowbar/cyborg/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, TRUE)
if(tool_behaviour == TOOL_CROWBAR)
tool_behaviour = TOOL_WIRECUTTER
to_chat(user, span_notice("You attach the cutting jaws to [src]."))
icon_state = "jaws_cutter_cyborg"
usesound = 'sound/items/jaws_cut.ogg'
else
tool_behaviour = TOOL_CROWBAR
to_chat(user, span_notice("You attach the prying jaws to [src]."))
icon_state = "jaws_pry_cyborg"
usesound = 'sound/items/jaws_pry.ogg'
/obj/item/screwdriver/cyborg/power
name = "automated drill"
desc = "A cyborg fitted module resembling the hand drill"
icon = 'modular_skyrat/modules/cyborg/icons/items_cyborg.dmi'
icon_state = "drill_screw_cyborg"
hitsound = 'sound/items/drill_hit.ogg'
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
random_color = FALSE
/obj/item/screwdriver/cyborg/power/examine()
. = ..()
. += " It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] head."
/obj/item/screwdriver/cyborg/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, TRUE)
if(tool_behaviour == TOOL_SCREWDRIVER)
tool_behaviour = TOOL_WRENCH
to_chat(user, span_notice("You attach the bolt bit to [src]."))
icon_state = "drill_bolt_cyborg"
else
tool_behaviour = TOOL_SCREWDRIVER
to_chat(user, span_notice("You attach the screw bit to [src]."))
icon_state = "drill_screw_cyborg"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 731 B

@@ -15,7 +15,7 @@
/mob/living/silicon/robot/model/roleplay/binarycheck()
return FALSE //Roleplay borgs aren't truly borgs
/obj/item/modular_computer/pda/silicon/cyborg/roleplay
/obj/item/modular_computer/pda/silicon/cyborg/roleplay
starting_programs = list( //Imaginary cyborgs do not get a PDA
/datum/computer_file/program/filemanager,
/datum/computer_file/program/robotact,
@@ -39,10 +39,8 @@
/obj/item/assembly/flash/cyborg,
/obj/item/extinguisher/mini,
/obj/item/weldingtool/largetank/cyborg,
/obj/item/screwdriver/cyborg,
/obj/item/wrench/cyborg,
/obj/item/crowbar/cyborg,
/obj/item/wirecutters/cyborg,
/obj/item/screwdriver/cyborg/power, // Combines Screwdriver and Wrench into one
/obj/item/crowbar/cyborg/power, // Combines Crowbar and Wirecutters into one
/obj/item/multitool/cyborg,
/obj/item/stack/sheet/iron,
/obj/item/stack/sheet/glass,
@@ -56,14 +54,15 @@
/obj/item/reagent_containers/borghypo/borgshaker/specific/soda,
/obj/item/reagent_containers/borghypo/borgshaker/specific/alcohol,
/obj/item/reagent_containers/borghypo/borgshaker/specific/misc,
/obj/item/reagent_containers/cup/glass/drinkingglass,
/obj/item/borg/apparatus/beaker,
/obj/item/borg/apparatus/beaker,
/obj/item/soap/nanotrasen,
/obj/item/mop/cyborg, // Soap's good and all, but a mop is good, too
/obj/item/lightreplacer, // Lights go out sometimes, or get broken, let the Borg help fix them
/obj/item/lightreplacer,
/obj/item/borg/cyborghug,
/obj/item/dogborg_nose,
/obj/item/dogborg_tongue,
/obj/item/reagent_containers/borghypo, // Let Roleplay Borgs heal visitors
/obj/item/quadborg_nose,
/obj/item/quadborg_tongue,
/obj/item/reagent_containers/borghypo,
/obj/item/borg_shapeshifter/stable)
hat_offset = -3
@@ -1,7 +0,0 @@
/datum/techweb_node/borg_shapeshifter
id = "borg_shapeshifter"
display_name = "Illegal Cyborg Addition"
description = "Some sort of experimental tool that was once used by an rival company."
prereq_ids = list("syndicate_basic")
design_ids = list("borg_shapeshifter_module")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
@@ -1,246 +0,0 @@
/obj/item/borg_shapeshifter
name = "cyborg chameleon projector"
icon = 'icons/obj/device.dmi'
icon_state = "shield0"
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
inhand_icon_state = "electronic"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
var/saved_icon
var/saved_bubble_icon
var/saved_icon_override
var/saved_name
var/saved_model_features
var/saved_special_light_key
var/saved_hat_offset
var/active = FALSE
var/activationCost = 100
var/activationUpkeep = 5
var/disguise_model_name
var/disguise
var/disguise_icon_override
var/disguise_pixel_offset = 0
var/disguise_hat_offset = 0
/// Traits unique to this model (deadsprite, wide/dogborginess, etc.). Mirrors the definition in modular_skyrat\modules\altborgs\code\modules\mob\living\silicon\robot\robot_model.dm
var/list/disguise_model_features = list()
var/disguise_special_light_key
var/mob/listeningTo
var/list/signalCache = list( // list here all signals that should break the camouflage
COMSIG_ATOM_ATTACKBY,
COMSIG_ATOM_ATTACK_HAND,
COMSIG_MOVABLE_IMPACT_ZONE,
COMSIG_ATOM_BULLET_ACT,
COMSIG_ATOM_EX_ACT,
COMSIG_ATOM_FIRE_ACT,
COMSIG_ATOM_EMP_ACT,
)
var/mob/living/silicon/robot/user // needed for process()
var/animation_playing = FALSE
/obj/item/borg_shapeshifter/Initialize(mapload)
. = ..()
/obj/item/borg_shapeshifter/Destroy()
listeningTo = null
return ..()
/obj/item/borg_shapeshifter/dropped(mob/user)
. = ..()
disrupt(user)
/obj/item/borg_shapeshifter/equipped(mob/user)
. = ..()
disrupt(user)
/**
* check_menu: Checks if we are allowed to interact with a radial menu
*
* Arguments:
* * user The mob interacting with a menu
*/
/obj/item/borg_shapeshifter/proc/check_menu(mob/user)
if(!istype(user))
return FALSE
if(user.incapacitated() || !user.Adjacent(src))
return FALSE
return TRUE
/obj/item/borg_shapeshifter/attack_self(mob/living/silicon/robot/user)
if (user && user.cell && user.cell.charge > activationCost)
if (isturf(user.loc))
toggle(user)
else
to_chat(user, span_warning("You can't use [src] while inside something!"))
else
to_chat(user, span_warning("You need at least [activationCost] charge in your cell to use [src]!"))
/obj/item/borg_shapeshifter/proc/toggle(mob/living/silicon/robot/user)
if(active)
playsound(src, 'sound/effects/pop.ogg', 100, TRUE, -6)
to_chat(user, span_notice("You deactivate \the [src]."))
deactivate(user)
else
if(animation_playing)
to_chat(user, span_notice("\the [src] is recharging."))
return
var/static/list/model_icons = sort_list(list(
"Standard" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "robot"),
"Medical" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "medical"),
"Cargo" = image(icon = CYBORG_ICON_CARGO, icon_state = "cargoborg"),
"Engineer" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "engineer"),
"Security" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "sec"),
"Service" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "service_f"),
"Janitor" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "janitor"),
"Miner" = image(icon = 'icons/mob/silicon/robots.dmi', icon_state = "miner"),
"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")
))
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)
return FALSE
var/obj/item/robot_model/model
switch(model_selection)
if("Standard")
model = new /obj/item/robot_model/standard
if("Medical")
model = new /obj/item/robot_model/medical
if("Cargo")
model = new /obj/item/robot_model/cargo
if("Engineer")
model = new /obj/item/robot_model/engineering
if("Security")
model = new /obj/item/robot_model/security
if("Service")
model = new /obj/item/robot_model/service
if("Janitor")
model = new /obj/item/robot_model/janitor
if("Miner")
model = new /obj/item/robot_model/miner
if("Peacekeeper")
model = new /obj/item/robot_model/peacekeeper
if("Clown")
model = new /obj/item/robot_model/clown
if("Syndicate")
model = new /obj/item/robot_model/syndicatejack
if("Spider Clan")
model = new /obj/item/robot_model/ninja
else
return FALSE
if (!set_disguise_vars(model, user))
qdel(model)
return FALSE
qdel(model)
animation_playing = TRUE
to_chat(user, span_notice("You activate \the [src]."))
playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6)
var/start = user.filters.len
var/X,Y,rsq,i,f
for(i=1, i<=7, ++i)
do
X = 60*rand() - 30
Y = 60*rand() - 30
rsq = X*X + Y*Y
while(rsq<100 || rsq>900)
user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand())
for(i=1, i<=7, ++i)
f = user.filters[start+i]
animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL)
animate(offset=f:offset-1, time=rand()*20+10)
if (do_after(user, 50, target=user) && user.cell.use(activationCost))
playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6)
to_chat(user, span_notice("You are now disguised."))
activate(user)
else
to_chat(user, span_warning("The chameleon field fizzles."))
do_sparks(3, FALSE, user)
for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first
f = user.filters[start+i]
animate(f)
user.filters = null
animation_playing = FALSE
/obj/item/borg_shapeshifter/proc/set_disguise_vars(obj/item/robot_model/disguise_model, mob/living/silicon/robot/cyborg)
if (!disguise_model || !cyborg)
return FALSE
var/list/reskin_icons = list()
for(var/skin in disguise_model.borg_skins)
var/list/details = disguise_model.borg_skins[skin]
var/image/reskin = image(icon = details[SKIN_ICON] || 'icons/mob/silicon/robots.dmi', icon_state = details[SKIN_ICON_STATE])
if (!isnull(details[SKIN_FEATURES]))
if (R_TRAIT_WIDE in details[SKIN_FEATURES])
reskin.pixel_x -= 16
reskin_icons[skin] = reskin
var/borg_skin = show_radial_menu(cyborg, cyborg, reskin_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), cyborg), radius = 38, require_near = TRUE)
if(!borg_skin)
return FALSE
disguise_model_name = disguise_model.name
var/list/details = disguise_model.borg_skins[borg_skin]
disguise = details[SKIN_ICON_STATE]
disguise_icon_override = details[SKIN_ICON]
disguise_special_light_key = details[SKIN_LIGHT_KEY]
disguise_hat_offset = 0 || details[SKIN_HAT_OFFSET]
disguise_model_features = details[SKIN_FEATURES]
return TRUE
/obj/item/borg_shapeshifter/process()
if (user && !user.cell?.use(activationUpkeep))
disrupt(user)
else
return PROCESS_KILL
/obj/item/borg_shapeshifter/proc/activate(mob/living/silicon/robot/user)
src.user = user
START_PROCESSING(SSobj, src)
saved_icon = user.model.cyborg_base_icon
saved_bubble_icon = user.bubble_icon
saved_icon_override = user.model.cyborg_icon_override
saved_name = user.model.name
saved_model_features = user.model.model_features
saved_special_light_key = user.model.special_light_key
saved_hat_offset = user.model.hat_offset
user.model.name = disguise_model_name
user.model.cyborg_base_icon = disguise
user.model.cyborg_icon_override = disguise_icon_override
user.model.model_features = disguise_model_features
user.model.special_light_key = disguise_special_light_key
user.bubble_icon = "robot"
active = TRUE
user.update_icons()
user.model.update_dogborg()
user.model.update_tallborg()
if(listeningTo == user)
return
if(listeningTo)
UnregisterSignal(listeningTo, signalCache)
RegisterSignal(user, signalCache, PROC_REF(disrupt))
listeningTo = user
/obj/item/borg_shapeshifter/proc/deactivate(mob/living/silicon/robot/user)
STOP_PROCESSING(SSobj, src)
if(listeningTo)
UnregisterSignal(listeningTo, signalCache)
listeningTo = null
do_sparks(5, FALSE, user)
user.model.name = saved_name
user.model.cyborg_base_icon = saved_icon
user.model.cyborg_icon_override = saved_icon_override
user.icon = saved_icon_override
user.model.model_features = saved_model_features
user.model.special_light_key = saved_special_light_key
user.bubble_icon = saved_bubble_icon
active = FALSE
user.update_icons()
user.model.update_dogborg()
user.model.update_tallborg()
/obj/item/borg_shapeshifter/proc/disrupt(mob/living/silicon/robot/user)
SIGNAL_HANDLER
if(active)
to_chat(user, span_danger("Your chameleon field deactivates."))
deactivate(user)
@@ -1,17 +0,0 @@
/obj/item/borg/upgrade/borg_shapeshifter
name = "Cyborg Shapeshifter Module"
desc = "An experimental device which allows a cyborg to disguise themself into another type of cyborg."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/borg_shapeshifter/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/borg_shapeshifter/BS = new /obj/item/borg_shapeshifter(R.model)
R.model.basic_modules += BS
R.model.add_module(BS, FALSE, TRUE)
/obj/item/borg/upgrade/borg_shapeshifter/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
for(var/obj/item/borg_shapeshifter/BS in R.model)
R.model.remove_module(BS, TRUE)
@@ -1,34 +0,0 @@
https://github.com/Skyrat-SS13/Skyrat-tg/pull/
## Title: Borg Shapeshifter
MODULE ID: SHAPESHIFTING_MODULE
### Description:
Add a new cyborg module, The Cyborg Shapeshifter. Basically allows a cyborg to disguise into a different borg
### TG Proc/File Changes:
- CHANGE: altborgs/code/modules/mob/living/silicon/robot/update_icons.dm > if(module.cyborg_pixel_offset != null)
<!-- If you had to edit, or append to any core procs in the process of making this PR, list them here. APPEND: Also, please include any files that you've changed. .DM files that is. -->
### Defines:
- N/A
<!-- If you needed to add any defines, mention the files you added those defines in -->
### Master file additions
- N/A
<!-- Any master file changes you've made to existing master files or if you've added a new master file. Please mark either as #NEW or #CHANGE -->
### Included files that are not contained in this module:
- N/A
<!-- Likewise, be it a non-modular file or a modular one that's not contained within the folder belonging to this specific module, it should be mentioned here -->
### Credits:
Funce#7321 - Funce
Tyger#8082 - SarmentiCampbell
<!-- Here go the credits to you, dear coder, and in case of collaborative work or ports, credits to the original source of the code -->
+8 -16
View File
@@ -6359,14 +6359,6 @@
#include "modular_skyrat\modules\alt_vox\code\vox_procs.dm"
#include "modular_skyrat\modules\alt_vox\code\vox_sounds_bms.dm"
#include "modular_skyrat\modules\alt_vox\code\vox_sounds_hl1.dm"
#include "modular_skyrat\modules\altborgs\code\cyborg_items.dm"
#include "modular_skyrat\modules\altborgs\code\inventory.dm"
#include "modular_skyrat\modules\altborgs\code\robot.dm"
#include "modular_skyrat\modules\altborgs\code\robot_defines.dm"
#include "modular_skyrat\modules\altborgs\code\robot_items.dm"
#include "modular_skyrat\modules\altborgs\code\robot_model.dm"
#include "modular_skyrat\modules\altborgs\code\robot_upgrade.dm"
#include "modular_skyrat\modules\altborgs\code\update_icons.dm"
#include "modular_skyrat\modules\alternative_job_titles\code\alt_job_titles.dm"
#include "modular_skyrat\modules\alternative_job_titles\code\job.dm"
#include "modular_skyrat\modules\ammo_workbench\code\ammo_workbench.dm"
@@ -6532,6 +6524,14 @@
#include "modular_skyrat\modules\bongs\code\bong.dm"
#include "modular_skyrat\modules\borg_buffs\code\robot.dm"
#include "modular_skyrat\modules\borg_buffs\code\snack_dispensor.dm"
#include "modular_skyrat\modules\borgs\code\inventory.dm"
#include "modular_skyrat\modules\borgs\code\mechafabricator_designs.dm"
#include "modular_skyrat\modules\borgs\code\robot.dm"
#include "modular_skyrat\modules\borgs\code\robot_defines.dm"
#include "modular_skyrat\modules\borgs\code\robot_items.dm"
#include "modular_skyrat\modules\borgs\code\robot_model.dm"
#include "modular_skyrat\modules\borgs\code\robot_upgrade.dm"
#include "modular_skyrat\modules\borgs\code\update_icons.dm"
#include "modular_skyrat\modules\bsa_overhaul\code\admin_verb.dm"
#include "modular_skyrat\modules\bsa_overhaul\code\bsa_cannon.dm"
#include "modular_skyrat\modules\bsa_overhaul\code\bsa_computer.dm"
@@ -6542,8 +6542,6 @@
#include "modular_skyrat\modules\cargo\code\items\AFAD.dm"
#include "modular_skyrat\modules\cargo\code\items\improvedRCD.dm"
#include "modular_skyrat\modules\cargo_teleporter\code\cargo_teleporter.dm"
#include "modular_skyrat\modules\cargoborg\code\robot_items.dm"
#include "modular_skyrat\modules\cargoborg\code\robot_modules.dm"
#include "modular_skyrat\modules\cell_component\code\cell_component.dm"
#include "modular_skyrat\modules\cellguns\code\cellgun_cells.dm"
#include "modular_skyrat\modules\cellguns\code\cellguns.dm"
@@ -6940,9 +6938,6 @@
#include "modular_skyrat\modules\customization\modules\surgery\organs\wings.dm"
#include "modular_skyrat\modules\customization\modules\surgery\organs\xenodorsal.dm"
#include "modular_skyrat\modules\customization\modules\surgery\organs\xenohead.dm"
#include "modular_skyrat\modules\cyborg\code\borgpowertools.dm"
#include "modular_skyrat\modules\cyborg\code\mechafabricator_designs.dm"
#include "modular_skyrat\modules\cyborg\code\robot_upgrades.dm"
#include "modular_skyrat\modules\decay_subsystem\code\decay_turf_handling.dm"
#include "modular_skyrat\modules\decay_subsystem\code\decaySS.dm"
#include "modular_skyrat\modules\decay_subsystem\code\nests.dm"
@@ -7697,9 +7692,6 @@
#include "modular_skyrat\modules\server_overflow\code\server_connect_panel.dm"
#include "modular_skyrat\modules\SEVA_suit\code\seva_obj.dm"
#include "modular_skyrat\modules\SEVA_suit\code\suit_voucher.dm"
#include "modular_skyrat\modules\shapeshifting_module\code\all_nodes.dm"
#include "modular_skyrat\modules\shapeshifting_module\code\borg_shapeshifter.dm"
#include "modular_skyrat\modules\shapeshifting_module\code\robot_upgrades.dm"
#include "modular_skyrat\modules\shotgunrebalance\code\ammobox.dm"
#include "modular_skyrat\modules\shotgunrebalance\code\autolathe_design.dm"
#include "modular_skyrat\modules\shotgunrebalance\code\shotgun.dm"