From f7e20d021e065779f78e5b2384c1b6aef0440f8d Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:04:56 -0700 Subject: [PATCH] [MIRROR] Better borg modules (#11095) Co-authored-by: Cameron Lennox Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> --- code/__defines/robot.dm | 9 + code/_helpers/global_lists_vr.dm | 265 +++++- code/_onclick/cyborg.dm | 2 +- .../subsystems/overmap_renamer_vr.dm | 4 +- code/game/mecha/equipment/mecha_equipment.dm | 16 +- code/game/mecha/mecha.dm | 4 +- .../micro/mecha_construction_paths_vr.dm | 2 - code/game/mecha/micro/mecha_parts_vr.dm | 3 +- code/game/mecha/micro/mecha_vr.dm | 6 +- code/game/mecha/micro/micro.dm | 3 +- code/game/mecha/micro/micro_equipment.dm | 3 +- code/game/mecha/micro/security.dm | 3 +- code/game/mecha/micro/utility.dm | 3 - code/game/objects/items/blueprints_vr.dm | 28 +- .../objects/items/devices/denecrotizer_vr.dm | 10 +- code/game/objects/items/devices/multitool.dm | 7 - .../game/objects/items/stacks/matter_synth.dm | 14 +- code/game/objects/items/stacks/stack.dm | 2 + .../objects/items/weapons/surgery_tools.dm | 39 - .../objects/items/weapons/tools/crowbar.dm | 7 - .../items/weapons/tools/screwdriver.dm | 6 - .../items/weapons/tools/weldingtool.dm | 12 +- .../items/weapons/tools/wirecutters.dm | 6 - .../objects/items/weapons/tools/wrench.dm | 6 - .../structures/crates_lockers/largecrate.dm | 2 +- code/game/objects/structures/gargoyle.dm | 4 +- .../objects/structures/ghost_pods/event_vr.dm | 8 +- .../structures/ghost_pods/ghost_pods.dm | 5 +- .../structures/ghost_pods/ghost_pods_vr.dm | 8 +- code/game/objects/trash_eating.dm | 2 +- code/modules/admin/modify_robot.dm | 65 ++ code/modules/admin/verbs/buildmode.dm | 4 +- .../overmap_renamer/debrisfield_renamer.dm | 2 +- .../awaymissions/overmap_renamer/readme.md | 4 +- code/modules/events/roaming_wildlife.dm | 4 +- code/modules/materials/materials/glass.dm | 2 +- code/modules/mob/dead/observer/observer_vr.dm | 4 +- .../mob/living/carbon/human/death_vr.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 4 +- .../mob/living/carbon/human/stripping.dm | 14 +- code/modules/mob/living/living_defense.dm | 4 +- .../silicon/robot/dogborg/dog_sleeper.dm | 4 +- .../living/silicon/robot/drone/drone_items.dm | 431 --------- .../mob/living/silicon/robot/inventory.dm | 26 +- .../silicon/robot/robot_modules/event.dm | 12 +- .../silicon/robot/robot_modules/station.dm | 170 +--- .../silicon/robot/robot_modules/syndicate.dm | 41 +- .../silicon/robot/robot_simple_items.dm | 896 ++++++++++++++++++ .../silicon/robot/subtypes/boozeborg.dm | 4 +- .../subtypes/animal/alien animals/teppi.dm | 4 +- .../subtypes/animal/farm animals/chicken.dm | 4 +- .../subtypes/animal/passive/mouse.dm | 4 +- .../subtypes/animal/passive/raccoon_ch.dm | 6 +- code/modules/overmap/sectors.dm | 2 +- code/modules/power/cable.dm | 15 - .../vore/eating/bellymodes_datum_vr.dm | 4 +- code/modules/vore/eating/living_vr.dm | 2 +- code/modules/vore/eating/transforming_vr.dm | 4 +- .../artifacts/replicator_vr.dm | 4 +- code/modules/xenobio/items/extracts_vr.dm | 44 +- code/modules/xenobio/items/slimepotions_vr.dm | 2 +- icons/obj/tools_robot.dmi | Bin 0 -> 15045 bytes .../game/objects/items/devices/mind_binder.dm | 2 +- .../game/objects/items/devices/vacpack.dm | 4 +- .../species/shadekin/shadekin_abilities.dm | 2 +- .../simple_mob/subtypes/vore/swoopie.dm | 2 +- .../southern_cross_overrides.dm | 2 +- .../ModifyRobotTabs/ModifyRobotAccess.tsx | 3 +- .../ModifyRobotTabs/ModifyRobotComponent.tsx | 2 +- .../ModifyRobotTabs/ModifyRobotModules.tsx | 4 +- .../ModifyRobotTabs/ModifyRobotRadio.tsx | 2 +- .../ModifyRobotSpecialModules.tsx | 32 + .../ModifyRobotTabs/ModifyRobotUpgrades.tsx | 150 +-- .../SubTabs/ModifyRobotMultiBelt.tsx | 141 +++ .../{ => SubTabs}/ModifyRobotPKA.tsx | 9 +- .../tgui/interfaces/ModifyRobot/index.tsx | 274 +++--- .../tgui/interfaces/ModifyRobot/types.ts | 11 + vorestation.dme | 1 + 78 files changed, 1785 insertions(+), 1133 deletions(-) create mode 100644 code/modules/mob/living/silicon/robot/robot_simple_items.dm create mode 100644 icons/obj/tools_robot.dmi create mode 100644 tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotSpecialModules.tsx create mode 100644 tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/SubTabs/ModifyRobotMultiBelt.tsx rename tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/{ => SubTabs}/ModifyRobotPKA.tsx (94%) diff --git a/code/__defines/robot.dm b/code/__defines/robot.dm index 30026857d7..55fe9eebd1 100644 --- a/code/__defines/robot.dm +++ b/code/__defines/robot.dm @@ -1 +1,10 @@ #define DEFAULT_ROBOT_SPRITE_NAME "M-USE NanoTrasen" + +// Synthesizers +#define METAL_SYNTH "Metal Synthesizer" +#define PLASTEEL_SYNTH "Plasteel Synthesizer" +#define GLASS_SYNTH "Glass Synthesizer" +#define WOOD_SYNTH "Wood Synthesizer" +#define PLASTIC_SYNTH "Plastic Synthesizer" +#define WIRE_SYNTH "Wire Synthesizer" +#define CLOTH_SYNTH "Cloth Synthesizer" diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 469d3cc7cf..6d12eafdab 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -2,7 +2,7 @@ * VOREStation global lists */ -var/global/list/hair_accesories_list= list()// Stores /datum/sprite_accessory/hair_accessory indexed by type +GLOBAL_LIST_EMPTY(hair_accesories_list) // Stores /datum/sprite_accessory/hair_accessory indexed by type GLOBAL_LIST_EMPTY(negative_traits) // Negative custom species traits, indexed by path GLOBAL_LIST_EMPTY(neutral_traits) // Neutral custom species traits, indexed by path GLOBAL_LIST_EMPTY(positive_traits) // Positive custom species traits, indexed by path @@ -11,11 +11,11 @@ GLOBAL_LIST_EMPTY(everyone_traits_neutral) // Neutral traits available to all sp GLOBAL_LIST_EMPTY(everyone_traits_negative) // Neutral traits available to all species, indexed by path GLOBAL_LIST_EMPTY(traits_costs) // Just path = cost list, saves time in char setup GLOBAL_LIST_EMPTY(all_traits) // All of 'em at once (same instances) -var/global/list/active_ghost_pods = list() +GLOBAL_LIST_EMPTY(active_ghost_pods) //Global vars for making the overmap_renamer subsystem. //Collects all instances by reference of visitable overmap objects of /obj/effect/overmap/visitable like the debris field. -var/global/list/visitable_overmap_object_instances = list() +GLOBAL_LIST_EMPTY(visitable_overmap_object_instances) GLOBAL_LIST_INIT(sensorpreflist, list("Off", "Binary", "Vitals", "Tracking", "No Preference")) @@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(vantag_choices_list, list( //CHOMPEdit end //Blacklist to exclude items from object ingestion. Digestion blacklist located in digest_act_vr.dm -var/global/list/item_vore_blacklist = list( +GLOBAL_LIST_INIT(item_vore_blacklist, list( /obj/item/hand_tele, /obj/item/card/id/gold/captain/spare, /obj/item/gun, @@ -59,7 +59,7 @@ var/global/list/item_vore_blacklist = list( /obj/item/areaeditor/blueprints, /obj/item/clothing/head/helmet/space, /obj/item/disk/nuclear, - /obj/item/clothing/suit/storage/hooded/wintercoat/roiz) + /obj/item/clothing/suit/storage/hooded/wintercoat/roiz)) //Classic Vore sounds GLOBAL_LIST_INIT(classic_vore_sounds, list( @@ -164,7 +164,7 @@ GLOBAL_LIST_INIT(global_vore_egg_types, list( "Spotted Pink" )) -var/global/list/tf_vore_egg_types = list( +GLOBAL_LIST_INIT(tf_vore_egg_types, list( "Unathi" = /obj/item/storage/vore_egg/unathi, "Tajara" = /obj/item/storage/vore_egg/tajaran, "Akula" = /obj/item/storage/vore_egg/shark, @@ -197,9 +197,9 @@ var/global/list/tf_vore_egg_types = list( "Purple" = /obj/item/storage/vore_egg/purple, "Red" = /obj/item/storage/vore_egg/red, "Rainbow" = /obj/item/storage/vore_egg/rainbow, - "Spotted Pink" = /obj/item/storage/vore_egg/pinkspots) + "Spotted Pink" = /obj/item/storage/vore_egg/pinkspots)) -var/global/list/edible_trash = list(/obj/item/broken_device, +GLOBAL_LIST_INIT(edible_trash, list(/obj/item/broken_device, /obj/item/clothing/accessory/collar, /obj/item/communicator, /obj/item/clothing/mask, @@ -281,7 +281,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/roulette_ball, /obj/item/pizzabox, /obj/item/card/id - ) + )) GLOBAL_LIST_INIT(contamination_flavors, list( "Generic" = GLOB.contamination_flavors_generic, @@ -572,7 +572,7 @@ GLOBAL_LIST_EMPTY(existing_solargrubs) paths = subtypesof(/datum/sprite_accessory/hair_accessory) for(var/path in paths) var/datum/sprite_accessory/hair_accessory/instance = new path() - hair_accesories_list[path] = instance + GLOB.hair_accesories_list[path] = instance // Custom species traits paths = typesof(/datum/trait) - /datum/trait - /datum/trait/negative - /datum/trait/neutral - /datum/trait/positive @@ -631,7 +631,7 @@ GLOBAL_LIST_EMPTY(weavable_structures) GLOBAL_LIST_EMPTY(weavable_items) -var/global/list/xenobio_metal_materials_normal = list( +GLOBAL_LIST_INIT(xenobio_metal_materials_normal, list( /obj/item/stack/material/steel = 20, /obj/item/stack/material/glass = 15, /obj/item/stack/material/plastic = 12, @@ -645,9 +645,9 @@ var/global/list/xenobio_metal_materials_normal = list( /obj/item/stack/material/copper = 4, /obj/item/stack/material/tin = 4, /obj/item/stack/material/bronze = 4, - /obj/item/stack/material/aluminium = 4) + /obj/item/stack/material/aluminium = 4)) -var/global/list/xenobio_metal_materials_adv = list( +GLOBAL_LIST_INIT(xenobio_metal_materials_adv, list( /obj/item/stack/material/glass/reinforced = 15, /obj/item/stack/material/marble = 10, /obj/item/stack/material/plasteel = 10, @@ -662,9 +662,9 @@ var/global/list/xenobio_metal_materials_adv = list( /obj/item/stack/material/durasteel = 2, /obj/item/stack/material/painite = 1, /obj/item/stack/material/void_opal = 1, - /obj/item/stack/material/quartz = 1) + /obj/item/stack/material/quartz = 1)) -var/global/list/xenobio_metal_materials_weird = list( +GLOBAL_LIST_INIT(xenobio_metal_materials_weird, list( /obj/item/stack/material/cloth = 10, /obj/item/stack/material/leather = 5, /obj/item/stack/material/fiber = 5, @@ -673,29 +673,29 @@ var/global/list/xenobio_metal_materials_weird = list( /obj/item/stack/material/snowbrick = 3, /obj/item/stack/material/flint = 3, /obj/item/stack/material/stick = 3, - /obj/item/stack/material/chitin = 1) + /obj/item/stack/material/chitin = 1)) -var/global/list/xenobio_silver_materials_basic = list( +GLOBAL_LIST_INIT(xenobio_silver_materials_basic, list( /obj/item/stack/material/silver = 10, /obj/item/stack/material/uranium = 8, /obj/item/stack/material/gold = 6, /obj/item/stack/material/titanium = 4, - /obj/item/stack/material/phoron = 1) + /obj/item/stack/material/phoron = 1)) -var/global/list/xenobio_silver_materials_adv = list( +GLOBAL_LIST_INIT(xenobio_silver_materials_adv, list( /obj/item/stack/material/deuterium = 5, /obj/item/stack/material/tritium = 5, /obj/item/stack/material/osmium = 5, /obj/item/stack/material/mhydrogen = 3, /obj/item/stack/material/diamond = 2, - /obj/item/stack/material/verdantium = 1) + /obj/item/stack/material/verdantium = 1)) -var/global/list/xenobio_silver_materials_special = list( +GLOBAL_LIST_INIT(xenobio_silver_materials_special, list( /obj/item/stack/material/valhollide = 1, /obj/item/stack/material/morphium = 1, - /obj/item/stack/material/supermatter = 1) + /obj/item/stack/material/supermatter = 1)) -var/global/list/xenobio_gold_mobs_hostile = list( +GLOBAL_LIST_INIT(xenobio_gold_mobs_hostile, list( /mob/living/simple_mob/vore/alienanimals/space_jellyfish, /mob/living/simple_mob/vore/alienanimals/skeleton, /mob/living/simple_mob/vore/alienanimals/space_ghost, @@ -757,9 +757,9 @@ var/global/list/xenobio_gold_mobs_hostile = list( /mob/living/simple_mob/vore/sect_queen, /mob/living/simple_mob/vore/weretiger, /mob/living/simple_mob/vore/wolf, - /mob/living/simple_mob/vore/xeno_defanged) + /mob/living/simple_mob/vore/xeno_defanged)) -var/global/list/xenobio_gold_mobs_bosses = list( +GLOBAL_LIST_INIT(xenobio_gold_mobs_bosses, list( /mob/living/simple_mob/animal/giant_spider/broodmother, /mob/living/simple_mob/vore/leopardmander, /mob/living/simple_mob/vore/leopardmander/blue, @@ -767,9 +767,9 @@ var/global/list/xenobio_gold_mobs_bosses = list( /mob/living/simple_mob/vore/greatwolf, /mob/living/simple_mob/vore/greatwolf/black, /mob/living/simple_mob/vore/greatwolf/grey, - /mob/living/simple_mob/vore/bigdragon) + /mob/living/simple_mob/vore/bigdragon)) -var/global/list/xenobio_gold_mobs_safe = list( +GLOBAL_LIST_INIT(xenobio_gold_mobs_safe, list( /mob/living/simple_mob/vore/alienanimals/dustjumper, /mob/living/simple_mob/vore/alienanimals/teppi, /mob/living/simple_mob/animal/passive/chicken, @@ -811,9 +811,9 @@ var/global/list/xenobio_gold_mobs_safe = list( /mob/living/simple_mob/vore/redpanda, /mob/living/simple_mob/vore/sheep, /mob/living/simple_mob/vore/squirrel, - /mob/living/simple_mob/vore/solargrub) + /mob/living/simple_mob/vore/solargrub)) -var/global/list/xenobio_gold_mobs_birds = list(/mob/living/simple_mob/animal/passive/bird/black_bird, +GLOBAL_LIST_INIT(xenobio_gold_mobs_birds, list(/mob/living/simple_mob/animal/passive/bird/black_bird, /mob/living/simple_mob/animal/passive/bird/azure_tit, /mob/living/simple_mob/animal/passive/bird/european_robin, /mob/living/simple_mob/animal/passive/bird/goldcrest, @@ -833,9 +833,9 @@ var/global/list/xenobio_gold_mobs_birds = list(/mob/living/simple_mob/animal/pas /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey, /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo, /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo, - /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo) //There's too dang many + /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo)) //There's too dang many -var/global/list/xenobio_cerulean_potions = list( +GLOBAL_LIST_INIT(xenobio_cerulean_potions, list( /obj/item/slimepotion/enhancer, /obj/item/slimepotion/stabilizer, /obj/item/slimepotion/mutator, @@ -853,9 +853,9 @@ var/global/list/xenobio_cerulean_potions = list( /obj/item/slimepotion/reinvigoration, /obj/item/slimepotion/mimic, /obj/item/slimepotion/sapience, - /obj/item/slimepotion/obedience) + /obj/item/slimepotion/obedience)) -var/global/list/xenobio_rainbow_extracts = list( +GLOBAL_LIST_INIT(xenobio_rainbow_extracts, list( /obj/item/slime_extract/grey = 2, /obj/item/slime_extract/metal = 3, /obj/item/slime_extract/blue = 3, @@ -877,13 +877,13 @@ var/global/list/xenobio_rainbow_extracts = list( /obj/item/slime_extract/ruby = 3, /obj/item/slime_extract/emerald = 3, /obj/item/slime_extract/light_pink = 1, - /obj/item/slime_extract/rainbow = 1) + /obj/item/slime_extract/rainbow = 1)) //// Wildlife lists //Listed by-type. Under each type are lists of lists that contain 'groupings' of wildlife. Sorted from 1 to 5 by threat level. -var/global/list/event_wildlife_aquatic = list( +GLOBAL_LIST_INIT(event_wildlife_aquatic, list( list( list(/mob/living/simple_mob/animal/passive/fish/koi = 1, /mob/living/simple_mob/animal/passive/fish/pike = 2, @@ -912,9 +912,9 @@ var/global/list/event_wildlife_aquatic = list( list( list(/mob/living/simple_mob/animal/sif/hooligan_crab = 1) ) - ) + )) -var/global/list/event_wildlife_roaming = list( +GLOBAL_LIST_INIT(event_wildlife_roaming, list( list( list(/mob/living/simple_mob/animal/passive/mouse/jerboa = 1, /mob/living/simple_mob/animal/passive/mouse/black = 2, @@ -969,7 +969,7 @@ var/global/list/event_wildlife_roaming = list( list(/mob/living/simple_mob/vore/aggressive/giant_snake = 1), list(/mob/living/simple_mob/vore/aggressive/corrupthound = 1) ) - ) + )) GLOBAL_LIST_INIT(selectable_speech_bubbles, list( @@ -1022,15 +1022,15 @@ GLOBAL_LIST_INIT(selectable_speech_bubbles, list( // These lists are, obviously, unfinished. // ALLOWING BUILDING IN AN AREA: -// If you want someone to be able to build a new area in a place, add the area to the 'BUILDABLE_AREA_TYPES' and 'blacklisted_areas' -// BUILDABLE_AREA_TYPES means they can build an area there. The blacklisted_areas means they CAN NOT EXPAND that area. No making space bigger! +// If you want someone to be able to build a new area in a place, add the area to the 'GLOB.BUILDABLE_AREA_TYPES' and 'GLOB.blacklisted_areas' +// GLOB.BUILDABLE_AREA_TYPES means they can build an area there. The GLOB.blacklisted_areas means they CAN NOT EXPAND that area. No making space bigger! // DISALLOW BUILDING/AREA MANIPULATION IN AN AREA (OR A TURF TYPE): // Likewise, if you want someone to never ever EVER be able to do anything area generation/expansion related to an area -// Then add it to SPECIALS and area_or_turf_fail_types +// Then add it to GLOB.SPECIALS and GLOB.area_or_turf_fail_types // If you want someone to -var/global/list/BUILDABLE_AREA_TYPES = list( +GLOBAL_LIST_INIT(BUILDABLE_AREA_TYPES, list( /area/space, /area/mine // /area/surface/outside, //SC //CHOMP Comment - Actually these are causing compilation error. @@ -1043,9 +1043,9 @@ var/global/list/BUILDABLE_AREA_TYPES = list( // /area/offmap/aerostat/surface, // /area/tether_away/beach, // /area/tether_away/cave, -) +)) -var/static/list/blacklisted_areas = typecacheof(list( +GLOBAL_LIST_INIT(blacklisted_areas, typecacheof(list( /area/space, /area/mine // /area/surface/outside, //SC //CHOMP Comment - Actually these are causing compilation error. @@ -1060,9 +1060,9 @@ var/static/list/blacklisted_areas = typecacheof(list( // /area/offmap/aerostat/surface, // /area/tether_away/beach, // /area/tether_away/cave - )) + ))) -var/global/list/SPECIALS = list( +GLOBAL_LIST_INIT(SPECIALS, list( /turf/space, /area/shuttle, /area/admin, @@ -1082,9 +1082,9 @@ var/global/list/SPECIALS = list( /area/submap/casino_event, /area/vr // /area/derelict //commented out, all hail derelict-rebuilders! -) +)) -var/global/list/area_or_turf_fail_types = typecacheof(list( +GLOBAL_LIST_INIT(area_or_turf_fail_types, typecacheof(list( /turf/space, /area/shuttle, /area/admin, @@ -1104,4 +1104,171 @@ var/global/list/area_or_turf_fail_types = typecacheof(list( /area/submap/event, /area/submap/casino_event, /area/vr //CHOMPedit - )) + ))) + +//GRIPPERS!!! +#define BASIC_GRIPPER \ + /obj/item/cell, \ + /obj/item/airlock_electronics, \ + /obj/item/tracker_electronics, \ + /obj/item/module/power_control, \ + /obj/item/bluespace_crystal, \ + /obj/item/stock_parts, \ + /obj/item/frame, \ + /obj/item/camera_assembly, \ + /obj/item/tank, \ + /obj/item/circuitboard, \ + /obj/item/smes_coil, \ + /obj/item/fuel_assembly, \ + /obj/item/stack/tile/floor + +#define OMNI_GRIPPER \ + /obj/item + +#define MINER_GRIPPER \ + /obj/item/cell, \ + /obj/item/stock_parts + +#define SECURITY_GRIPPER \ + /obj/item/paper, \ + /obj/item/paper_bundle, \ + /obj/item/pen, \ + /obj/item/sample, \ + /obj/item/forensics/sample_kit, \ + /obj/item/taperecorder, \ + /obj/item/rectape, \ + /obj/item/uv_light + +#define PAPERWORK_GRIPPER \ + /obj/item/clipboard, \ + /obj/item/paper, \ + /obj/item/paper_bundle, \ + /obj/item/card/id, \ + /obj/item/book, \ + /obj/item/newspaper + +#define MEDICAL_GRIPPER \ + /obj/item/reagent_containers/glass, \ + /obj/item/storage/pill_bottle, \ + /obj/item/reagent_containers/pill, \ + /obj/item/reagent_containers/blood, \ + /obj/item/nif, \ + /obj/item/stack/material/phoron, \ + /obj/item/tank/anesthetic, \ + /obj/item/disk/body_record + +#define RESEARCH_GRIPPER \ + /obj/item/cell, \ + /obj/item/stock_parts, \ + /obj/item/mmi, \ + /obj/item/robot_parts, \ + /obj/item/borg/upgrade, \ + /obj/item/flash, \ + /obj/item/disk, \ + /obj/item/circuitboard, \ + /obj/item/reagent_containers/glass, \ + /obj/item/assembly/prox_sensor, \ + /obj/item/healthanalyzer, \ + /obj/item/slime_cube, \ + /obj/item/slime_crystal, \ + /obj/item/disposable_teleporter/slime, \ + /obj/item/slimepotion, \ + /obj/item/slime_extract, \ + /obj/item/reagent_containers/food/snacks/monkeycube + +#define CIRCUIT_GRIPPER \ + /obj/item/cell/device, \ + /obj/item/electronic_assembly, \ + /obj/item/assembly/electronic_assembly, \ + /obj/item/clothing/under/circuitry, \ + /obj/item/clothing/gloves/circuitry, \ + /obj/item/clothing/glasses/circuitry, \ + /obj/item/clothing/shoes/circuitry, \ + /obj/item/clothing/head/circuitry, \ + /obj/item/clothing/ears/circuitry, \ + /obj/item/clothing/suit/circuitry, \ + /obj/item/implant/integrated_circuit, \ + /obj/item/integrated_circuit + +#define SERVICE_GRIPPER \ + /obj/item/reagent_containers/glass, \ + /obj/item/reagent_containers/food, \ + /obj/item/seeds, \ + /obj/item/grown, \ + /obj/item/trash, \ + /obj/item/reagent_containers/cooking_container + +#define GRAVEYARD_GRIPPER \ + /obj/item/seeds, \ + /obj/item/grown, \ + /obj/item/material/gravemarker + +#define SCENE_GRIPPER \ + /obj/item/capture_crystal, \ + /obj/item/clothing, \ + /obj/item/implanter, \ + /obj/item/disk/nifsoft/compliance, \ + /obj/item/handcuffs, \ + /obj/item/toy, \ + /obj/item/petrifier, \ + /obj/item/dice, \ + /obj/item/casino_platinum_chip, \ + /obj/item/spacecasinocash + +#define ORGAN_GRIPPER \ + /obj/item/organ, \ + /obj/item/nif + +#define ROBOTICS_ORGAN_GRIPPER \ + /obj/item/organ/external, \ + /obj/item/organ/internal/brain, \ + /obj/item/organ/internal/cell, \ + /obj/item/organ/internal/eyes/robot, \ + /obj/item/nif + +#define EXOSUIT_GRIPPER \ + /obj/item/mecha_parts/part, \ + /obj/item/mecha_parts/micro/part, \ + /obj/item/mecha_parts/mecha_equipment, \ + /obj/item/mecha_parts/mecha_tracking, \ + /obj/item/mecha_parts/component + +#define SHEET_GRIPPER \ + /obj/item/stack/material + +GLOBAL_LIST_INIT(all_borg_multitool_options, list( + /obj/item/tool/screwdriver/cyborg, + /obj/item/tool/wrench/cyborg, + /obj/item/tool/crowbar/cyborg, + /obj/item/tool/wirecutters/cyborg, + /obj/item/multitool/cyborg, + /obj/item/weldingtool/electric/mounted/cyborg, + /obj/item/surgical/retractor/cyborg, + /obj/item/surgical/hemostat/cyborg, + /obj/item/surgical/cautery/cyborg, + /obj/item/surgical/surgicaldrill/cyborg, + /obj/item/surgical/scalpel/cyborg, + /obj/item/surgical/circular_saw/cyborg, + /obj/item/surgical/bonegel/cyborg, + /obj/item/surgical/FixOVein/cyborg, + /obj/item/surgical/bonesetter/cyborg, + /obj/item/surgical/bioregen/cyborg, + /obj/item/autopsy_scanner, + /obj/item/material/minihoe/cyborg, + /obj/item/material/knife/machete/hatchet/cyborg, + /obj/item/analyzer/plant_analyzer/cyborg, + /obj/item/material/knife/cyborg, + /obj/item/robot_harvester, + /obj/item/material/kitchen/rollingpin/cyborg, + /obj/item/reagent_containers/spray, +)) + +GLOBAL_LIST_INIT(material_synth_list, list( + METAL_SYNTH = /datum/matter_synth/metal, + PLASTEEL_SYNTH = /datum/matter_synth/plasteel, + GLASS_SYNTH = /datum/matter_synth/glass, + WOOD_SYNTH = /datum/matter_synth/wood, + PLASTIC_SYNTH = /datum/matter_synth/plastic, + WIRE_SYNTH = /datum/matter_synth/wire, + CLOTH_SYNTH = /datum/matter_synth/cloth + )) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index fd7a927539..e226d65e67 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -56,7 +56,7 @@ return */ - var/obj/item/W = get_active_hand() + var/obj/item/W = get_active_hand(A) // Cyborgs have no range-checking unless there is item use if(!W) diff --git a/code/controllers/subsystems/overmap_renamer_vr.dm b/code/controllers/subsystems/overmap_renamer_vr.dm index d82aadbfcb..149ece296e 100644 --- a/code/controllers/subsystems/overmap_renamer_vr.dm +++ b/code/controllers/subsystems/overmap_renamer_vr.dm @@ -17,9 +17,9 @@ SUBSYSTEM_DEF(overmap_renamer) /*Shouldn't be a switch statement. We want ALL of the if(map_template.name in visitable_z_leves_name_list) to fire if we end up with multiple renamable lateload overmap objects.*/ /datum/controller/subsystem/overmap_renamer/proc/update_names() - if(!visitable_overmap_object_instances || !islist(visitable_overmap_object_instances) || !length(visitable_overmap_object_instances)) + if(!GLOB.visitable_overmap_object_instances || !islist(GLOB.visitable_overmap_object_instances) || !length(GLOB.visitable_overmap_object_instances)) return - for(var/obj/effect/overmap/visitable/V in visitable_overmap_object_instances) + for(var/obj/effect/overmap/visitable/V in GLOB.visitable_overmap_object_instances) if(V.unique_identifier == "Debris Field") V.modify_descriptors() if(V.visitable_renamed) //could just if(D.modify_descriptors()), but having a var recording renaming is useful for debugging and stuff! diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 3cae6ecd9b..27003d8ee0 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -69,14 +69,12 @@ chassis.special_equipment -= src listclearnulls(chassis.special_equipment) //VOREStation Addition begin: MICROMECHS - //CHOMPedit commented micromech stuff, because fuck this trash - /* if(equip_type == EQUIP_MICRO_UTILITY) chassis.micro_utility_equipment -= src listclearnulls(chassis.micro_utility_equipment) if(equip_type == EQUIP_MICRO_WEAPON) chassis.micro_weapon_equipment -= src - listclearnulls(chassis.micro_weapon_equipment) */ + listclearnulls(chassis.micro_weapon_equipment) //VOREStation Addition end: MICROMECHS chassis.universal_equipment -= src chassis.equipment -= src @@ -161,12 +159,10 @@ if(equip_type == EQUIP_SPECIAL && M.special_equipment.len < M.max_special_equip) return 1 //VOREStation Addition begin: MICROMECHS - //CHOMPedit commented micromech stuff, because fuck this trash - /* if(equip_type == EQUIP_MICRO_UTILITY && M.micro_utility_equipment.len < M.max_micro_utility_equip) return 1 if(equip_type == EQUIP_MICRO_WEAPON && M.micro_weapon_equipment.len < M.max_micro_weapon_equip) - return 1 */ + return 1 //VOREStation Addition end: MICROMECHS if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip) //The exosuit needs to be military grade to actually have a universal slot capable of accepting a true weapon. if(equip_type == EQUIP_WEAPON && !istype(M, /obj/mecha/combat)) @@ -197,14 +193,12 @@ M.special_equipment += src has_equipped = 1 //VOREStation Addition begin: MICROMECHS - //CHOMPedit commented micromech stuff, because fuck this trash - /* if(equip_type == EQUIP_MICRO_UTILITY && M.micro_utility_equipment.len < M.max_micro_utility_equip && !has_equipped) M.micro_utility_equipment += src has_equipped = 1 if(equip_type == EQUIP_MICRO_WEAPON && M.micro_weapon_equipment.len < M.max_micro_weapon_equip && !has_equipped) M.micro_weapon_equipment += src - has_equipped = 1 */ + has_equipped = 1 //VOREStation Addition end: MICROMECHS if(equip_type != EQUIP_SPECIAL && M.universal_equipment.len < M.max_universal_equip && !has_equipped) M.universal_equipment += src @@ -243,12 +237,10 @@ if(EQUIP_SPECIAL) chassis.special_equipment -= src //VOREStation Addition begin: MICROMECHS - //CHOMPedit commented micromech stuff, because fuck this trash - /* if(EQUIP_MICRO_UTILITY)//CHOMPstation edit - This was improperly named bugging detaching on my equipment fix. chassis.micro_utility_equipment -= src if(EQUIP_MICRO_WEAPON) - chassis.micro_weapon_equipment -= src */ + chassis.micro_weapon_equipment -= src //VOREStation Addition end: MICROMECHS if(chassis.selected == src) chassis.selected = null diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 9ba846d35a..d9847ac3f5 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -2348,7 +2348,7 @@ output += "Universal Module: [W.name] Detach
" for(var/obj/item/mecha_parts/mecha_equipment/W in special_equipment) output += "Special Module: [W.name] Detach
" - /*for(var/obj/item/mecha_parts/mecha_equipment/W in micro_utility_equipment)//CHOMPstation Edit - Adds micro equipent to the menu + for(var/obj/item/mecha_parts/mecha_equipment/W in micro_utility_equipment) // VOREstation Edit - Adds micro equipent to the menu output += "Micro Utility Module: [W.name] Detach
" for(var/obj/item/mecha_parts/mecha_equipment/W in micro_weapon_equipment) output += "Micro Weapon Module: [W.name] Detach
" @@ -2360,7 +2360,7 @@ Available universal slots: [max_universal_equip-universal_equipment.len]
Available special slots: [max_special_equip-special_equipment.len]
- "} */ //CHOMPedit commented micromech stuff, because fuck this trash + "} return output /obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html diff --git a/code/game/mecha/micro/mecha_construction_paths_vr.dm b/code/game/mecha/micro/mecha_construction_paths_vr.dm index 123555c44d..54c68d716b 100644 --- a/code/game/mecha/micro/mecha_construction_paths_vr.dm +++ b/code/game/mecha/micro/mecha_construction_paths_vr.dm @@ -1,4 +1,3 @@ -/* //CHOMPedit commented micromech stuff, because fuck this trash /datum/construction/mecha/polecat_chassis steps = list( list("key"=/obj/item/mecha_parts/micro/part/polecat_torso),//1 @@ -761,4 +760,3 @@ ..() feedback_inc("mecha_weasel_created",1) return - */ diff --git a/code/game/mecha/micro/mecha_parts_vr.dm b/code/game/mecha/micro/mecha_parts_vr.dm index 5098b9f54d..878ab95051 100644 --- a/code/game/mecha/micro/mecha_parts_vr.dm +++ b/code/game/mecha/micro/mecha_parts_vr.dm @@ -1,5 +1,4 @@ //new micro parts define -/* //CHOMPedit commented micromech stuff, because fuck this trash /obj/item/mecha_parts/micro name = "mecha part" icon = 'icons/mecha/mech_construct_vr.dmi' @@ -140,4 +139,4 @@ /obj/item/mecha_parts/micro/part/weasel_tri_leg name="Weasel Legs" icon_state = "weasel-leg-all" - origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) */ + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) diff --git a/code/game/mecha/micro/mecha_vr.dm b/code/game/mecha/micro/mecha_vr.dm index f6f789c908..57a03c576f 100644 --- a/code/game/mecha/micro/mecha_vr.dm +++ b/code/game/mecha/micro/mecha_vr.dm @@ -1,7 +1,7 @@ -/*#ifdef T_BOARD_MICRO_MECHA ////CHOMPedit commented micromech stuff, because fuck this trash +#ifdef T_BOARD_MICRO_MECHA #error T_BOARD_MICRO_MECHA already defined elsewhere, we can't use it. #endif -# define T_BOARD_MICRO_MECHA(name) "exosuit module circuit board (" + (name) + ")" +#define T_BOARD_MICRO_MECHA(name) "exosuit module circuit board (" + (name) + ")" /obj/item/circuitboard/mecha/gopher origin_tech = list(TECH_DATA = 3) @@ -45,4 +45,4 @@ /obj/item/circuitboard/mecha/weasel/main name = T_BOARD_MICRO_MECHA("Weasel central control") icon_state = "mainboard" -# undef T_BOARD_MICRO_MECHA */ +#undef T_BOARD_MICRO_MECHA diff --git a/code/game/mecha/micro/micro.dm b/code/game/mecha/micro/micro.dm index b5d29d879e..95950320c6 100644 --- a/code/game/mecha/micro/micro.dm +++ b/code/game/mecha/micro/micro.dm @@ -1,4 +1,3 @@ -/* //CHOMPedit commented micromech stuff, because fuck this trash /obj/mecha/micro icon = 'icons/mecha/micro.dmi' force = 10 //still a robot @@ -146,4 +145,4 @@ return result /obj/effect/decal/mecha_wreckage/micro - icon = 'icons/mecha/micro.dmi' */ + icon = 'icons/mecha/micro.dmi' diff --git a/code/game/mecha/micro/micro_equipment.dm b/code/game/mecha/micro/micro_equipment.dm index 6749e1d2d4..b1a5e2e254 100644 --- a/code/game/mecha/micro/micro_equipment.dm +++ b/code/game/mecha/micro/micro_equipment.dm @@ -3,7 +3,6 @@ ///////////////////////////// //// WEAPONS BELOW //// ///////////////////////////// -/* //CHOMPedit commented micromech stuff, because fuck this trash /obj/item/mecha_parts/mecha_equipment/weapon/energy/microlaser w_class = ITEMSIZE_LARGE desc = "A mounted micro laser-carbine for micro mechs." //CHOMPedit @@ -225,4 +224,4 @@ O.loc = src.loc to_chat(usr, span_info("You empty the ore box")) - return */ + return diff --git a/code/game/mecha/micro/security.dm b/code/game/mecha/micro/security.dm index 62be51bb57..777ae8912b 100644 --- a/code/game/mecha/micro/security.dm +++ b/code/game/mecha/micro/security.dm @@ -1,4 +1,3 @@ -/* //CHOMPedit commented micromech stuff, because fuck this trash /obj/mecha/micro/sec/moved_inside(var/mob/living/carbon/human/H as mob) if(..()) if(H.client) @@ -54,4 +53,4 @@ /obj/effect/decal/mecha_wreckage/micro/sec/weasel name = "Weasel wreckage" - icon_state = "weasel-broken" */ + icon_state = "weasel-broken" diff --git a/code/game/mecha/micro/utility.dm b/code/game/mecha/micro/utility.dm index fcf32f1a2f..46f0a2b26b 100644 --- a/code/game/mecha/micro/utility.dm +++ b/code/game/mecha/micro/utility.dm @@ -1,5 +1,3 @@ -/* //CHOMPedit commented micromech stuff, because fuck this trash - /obj/mecha/micro/utility/gopher //small digging creature, to keep the theme desc = "A tough little utility mech for micro crewmembers, based on a miner borg chassis." name = "Gopher" @@ -20,4 +18,3 @@ /obj/effect/decal/mecha_wreckage/micro/utility/gopher name = "Gopher wreckage" icon_state = "gopher-broken" -*/ diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm index 4ccadf2121..d8a3f1c9dd 100644 --- a/code/game/objects/items/blueprints_vr.dm +++ b/code/game/objects/items/blueprints_vr.dm @@ -8,7 +8,7 @@ // Now that I've scared away half the people looking at this file, here's the relevant info: -// Banning areas: Go to global_lists_vr, jump to the BUILDABLE_AREA_TYPES and read the comments left there. +// Banning areas: Go to global_lists_vr, jump to the GLOB.BUILDABLE_AREA_TYPES and read the comments left there. @@ -339,11 +339,11 @@ if(A.outdoors) return AREA_SPACE - for (var/type in BUILDABLE_AREA_TYPES) + for (var/type in GLOB.BUILDABLE_AREA_TYPES) if ( istype(A,type) ) return AREA_SPACE - for (var/type in SPECIALS) + for (var/type in GLOB.SPECIALS) if ( istype(A,type) ) return AREA_SPECIAL return AREA_STATION @@ -471,7 +471,7 @@ to_chat(creator, span_warning("You need more paper before you can even think of editing this area!")) return - var/list/turfs = detect_room(get_turf(creator), area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) + var/list/turfs = detect_room(get_turf(creator), GLOB.area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) if(!turfs) to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle.")) return @@ -483,7 +483,7 @@ for(var/i in 1 to length(turfs)) var/area/place = get_area(turfs[i]) - if(blacklisted_areas[place.type]) + if(GLOB.blacklisted_areas[place.type]) continue if(!place.requires_power || (place.flag_check(BLUE_SHIELDED))) continue // No expanding powerless rooms etc @@ -551,7 +551,7 @@ to_chat(creator, span_warning("You need more paper before you can even think of editing this area!")) return - var/res = detect_room_ex(get_turf(creator), can_create_areas_into, area_or_turf_fail_types) + var/res = detect_room_ex(get_turf(creator), can_create_areas_into, GLOB.area_or_turf_fail_types) if(!res) to_chat(creator, span_warning("There is an area forbidden from being edited here! Use the fine-tune area creator! (3x3)")) return @@ -578,7 +578,7 @@ var/str //What the new area is named. var/can_make_new_area = 1 //If they can make a new area here or not. - var/list/nearby_turfs_to_check = detect_room(get_turf(creator), area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) //Get the nearby areas. + var/list/nearby_turfs_to_check = detect_room(get_turf(creator), GLOB.area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) //Get the nearby areas. if(!nearby_turfs_to_check) to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle.")) @@ -589,10 +589,10 @@ for(var/i in 1 to length(nearby_turfs_to_check)) var/area/place = get_area(nearby_turfs_to_check[i]) - if(blacklisted_areas[place.type]) + if(GLOB.blacklisted_areas[place.type]) if(!creator.lastarea != place) //Stops them from merging a blacklisted area to make it larger. Allows them to merge a blacklisted area into an allowed area. (Expansion!) continue - if(!BUILDABLE_AREA_TYPES[place.type]) //TODOTODOTODO + if(!GLOB.BUILDABLE_AREA_TYPES[place.type]) //TODOTODOTODO can_make_new_area = 0 if(!place.requires_power || (place.flag_check(BLUE_SHIELDED))) continue // No expanding powerless rooms etc @@ -810,14 +810,14 @@ /proc/get_new_area_type(area/A) //1 = can build in. 0 = can not build in. if (!A) A = get_area(usr) - if(A.outdoors) //ALWAYS able to build outdoors. This means if it's missed in BUILDABLE_AREA_TYPES it's fine. + if(A.outdoors) //ALWAYS able to build outdoors. This means if it's missed in GLOB.BUILDABLE_AREA_TYPES it's fine. return 1 - for (var/type in BUILDABLE_AREA_TYPES) //This works well. + for (var/type in GLOB.BUILDABLE_AREA_TYPES) //This works well. if ( istype(A,type) ) return 1 - for (var/type in SPECIALS) + for (var/type in GLOB.SPECIALS) if ( istype(A,type) ) return 0 return 0 //If it's not a buildable area, don't let them build in it. @@ -891,7 +891,7 @@ var/area/oldA = get_area(get_turf(creator)) //The old area (area currently standing in) var/str //What the new area is named. - var/list/nearby_turfs_to_check = detect_room(get_turf(creator), area_or_turf_fail_types, 70) //Get the nearby areas. + var/list/nearby_turfs_to_check = detect_room(get_turf(creator), GLOB.area_or_turf_fail_types, 70) //Get the nearby areas. if(!nearby_turfs_to_check) to_chat(creator, span_warning("The new area must have a floor and not a part of a shuttle.")) @@ -901,7 +901,7 @@ return //They can select an area they want to turn their current area into. - str = sanitizeSafe(tgui_input_text(usr, "What would you like to name the area?", "Area Name", null, MAX_NAME_LEN), MAX_NAME_LEN) + str = sanitizeSafe(tgui_input_text(creator, "What would you like to name the area?", "Area Name", null, MAX_NAME_LEN), MAX_NAME_LEN) if(isnull(str)) //They pressed cancel. to_chat(creator, span_warning("No new area made. Cancelling.")) return diff --git a/code/game/objects/items/devices/denecrotizer_vr.dm b/code/game/objects/items/devices/denecrotizer_vr.dm index b8375bf50c..be75240d77 100644 --- a/code/game/objects/items/devices/denecrotizer_vr.dm +++ b/code/game/objects/items/devices/denecrotizer_vr.dm @@ -11,10 +11,10 @@ if(var_value) ghostjoin = TRUE - active_ghost_pods |= src + GLOB.active_ghost_pods |= src else ghostjoin = FALSE - active_ghost_pods -= src + GLOB.active_ghost_pods -= src ghostjoin_icon() . = TRUE @@ -63,7 +63,7 @@ /// Inject a ghost into this mob. Assumes you've done all sanity before this point. /mob/living/simple_mob/proc/ghost_join(mob/observer/dead/D) log_and_message_admins("joined [src] as a ghost [ADMIN_FLW(src)]", D) - active_ghost_pods -= src + GLOB.active_ghost_pods -= src // Move the ghost in if(D.mind) @@ -159,7 +159,7 @@ target.faction = user.faction target.revivedby = user.name target.ghostjoin = 1 - active_ghost_pods += target + GLOB.active_ghost_pods += target target.ghostjoin_icon() last_used = world.time charges-- @@ -188,7 +188,7 @@ log_and_message_admins("used a denecrotizer to revive a simple mob: [target]. [ADMIN_FLW(src)]", user) if(!target.mind) //if it doesn't have a mind then no one has been playing as it, and it is safe to offer to ghosts. target.ghostjoin = 1 - active_ghost_pods |= target + GLOB.active_ghost_pods |= target target.ghostjoin_icon() last_used = world.time charges-- diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 65640675b2..b26bb1e4b0 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -67,13 +67,6 @@ return -/obj/item/multitool/cyborg - name = "multitool" - desc = "Optimised and stripped-down version of a regular multitool." - toolspeed = 0.5 - - - /datum/category_item/catalogue/anomalous/precursor_a/alien_multitool name = "Precursor Alpha Object - Pulse Tool" desc = "This ancient object appears to be an electrical tool. \ diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm index 32c657134a..66a42ccb73 100644 --- a/code/game/objects/items/stacks/matter_synth.dm +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -32,23 +32,23 @@ name = "Nanite Synthesizer" /datum/matter_synth/metal - name = "Metal Synthesizer" + name = METAL_SYNTH /datum/matter_synth/plasteel - name = "Plasteel Synthesizer" + name = PLASTEEL_SYNTH max_energy = 10000 /datum/matter_synth/glass - name = "Glass Synthesizer" + name = GLASS_SYNTH /datum/matter_synth/wood - name = "Wood Synthesizer" + name = WOOD_SYNTH /datum/matter_synth/plastic - name = "Plastic Synthesizer" + name = PLASTIC_SYNTH /datum/matter_synth/wire - name = "Wire Synthesizer" + name = WIRE_SYNTH max_energy = 50 recharge_rate = 2 @@ -58,7 +58,7 @@ recharge_rate = 1 /datum/matter_synth/cloth - name = "Cloth Synthesizer" + name = CLOTH_SYNTH /datum/matter_synth/beacon name = "Beacon Synthesizer" diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d324718d7f..0074d8ff12 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -50,6 +50,8 @@ return 1 if (src && usr && usr.machine == src) usr << browse(null, "window=stack") + if(islist(synths)) + synths.Cut() return ..() /obj/item/stack/update_icon() diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 6b1e01e6e6..9268197420 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -225,46 +225,7 @@ throw_range = 5 attack_verb = list("attacked", "hit", "bludgeoned") -/* - * Cyborg Tools - */ -/obj/item/surgical/retractor/cyborg - icon_state = "cyborg_retractor" - toolspeed = 0.5 -/obj/item/surgical/hemostat/cyborg - icon_state = "cyborg_hemostat" - toolspeed = 0.5 - -/obj/item/surgical/cautery/cyborg - icon_state = "cyborg_cautery" - toolspeed = 0.5 - -/obj/item/surgical/surgicaldrill/cyborg - icon_state = "cyborg_drill" - toolspeed = 0.5 - -/obj/item/surgical/scalpel/cyborg - icon_state = "cyborg_scalpel" - toolspeed = 0.5 - -/obj/item/surgical/circular_saw/cyborg - icon_state = "cyborg_saw" - toolspeed = 0.5 - -/obj/item/surgical/bonegel/cyborg - toolspeed = 0.5 - -/obj/item/surgical/FixOVein/cyborg - toolspeed = 0.5 - -/obj/item/surgical/bonesetter/cyborg - icon_state = "cyborg_setter" - toolspeed = 0.5 - -/obj/item/surgical/bioregen/cyborg //VoreStation edit: let the borgs S U C C - icon_state = "cyborg_bioregen" - toolspeed = 0.5 /* * Alien Tools diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 3ff534a3bb..14457b6a05 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -65,13 +65,6 @@ origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 3) reach = 2 -/obj/item/tool/crowbar/cyborg - name = "hydraulic crowbar" - desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbars in industrial synthetics." - usesound = 'sound/items/jaws_pry.ogg' - force = 10 - toolspeed = 0.5 - /obj/item/tool/crowbar/power name = "power pryer" desc = "You shouldn't see this." diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 3e4b8eb07a..256be0a59e 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -100,12 +100,6 @@ random_color = FALSE reach = 2 -/obj/item/tool/screwdriver/cyborg - name = "powered screwdriver" - desc = "An electrical screwdriver, designed to be both precise and quick." - usesound = 'sound/items/drill_use.ogg' - toolspeed = 0.5 - /obj/item/tool/screwdriver/power name = "power screwdriver" desc = "You shouldn't see this." diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 08d3c28913..b80d579835 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -362,11 +362,6 @@ origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2) matter = list(MAT_STEEL = 70, MAT_GLASS = 60) -/obj/item/weldingtool/largetank/cyborg - name = "integrated welding tool" - desc = "An advanced welder designed to be used in robotic systems." - toolspeed = 0.5 - /obj/item/weldingtool/hugetank name = "upgraded welding tool" desc = "A much larger welder with a huge tank." @@ -639,6 +634,10 @@ ..() /obj/item/weldingtool/electric/proc/get_external_power_supply() + if(istype(src.loc, /obj/item/robotic_multibelt)) //We are in a multibelt + if(istype(src.loc.loc, /mob/living/silicon/robot)) //We are in a multibelt that is in a robot! This is sanity in case someone spawns a multibelt in via admin commands. + var/mob/living/silicon/robot/R = src.loc.loc + return R.cell if(isrobot(src.loc)) var/mob/living/silicon/robot/R = src.loc return R.cell @@ -659,9 +658,6 @@ /obj/item/weldingtool/electric/mounted use_external_power = 1 -/obj/item/weldingtool/electric/mounted/cyborg - toolspeed = 0.5 - /obj/item/weldingtool/electric/mounted/exosuit var/obj/item/mecha_parts/mecha_equipment/equip_mount = null flame_intensity = 1 diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index da4b8f2ed4..94d6a3e7d3 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -81,12 +81,6 @@ origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4) random_color = FALSE -/obj/item/tool/wirecutters/cyborg - name = "wirecutters" - desc = "This cuts wires. With science." - usesound = 'sound/items/jaws_cut.ogg' - toolspeed = 0.5 - /obj/item/tool/wirecutters/hybrid name = "strange wirecutters" desc = "This cuts wires. With " + span_purple("Science!") diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index aeb4b15f66..066348c018 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -19,12 +19,6 @@ pickup_sound = 'sound/items/pickup/wrench.ogg' tool_qualities = list(TOOL_WRENCH) -/obj/item/tool/wrench/cyborg - name = "automatic wrench" - desc = "An advanced robotic wrench. Can be found in industrial synthetic shells." - usesound = 'sound/items/drill_use.ogg' - toolspeed = 0.5 - /obj/item/tool/wrench/pipe name = "pipe wrench" desc = "A wrench used for plumbing. Can make a good makeshift weapon." diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index b27a6bc9d2..be3c7ef231 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -37,7 +37,7 @@ if(!AMBLINAL.mind) AMBLINAL.ghostjoin = 1 AMBLINAL.ghostjoin_icon() - active_ghost_pods |= AMBLINAL + GLOB.active_ghost_pods |= AMBLINAL //VOREStation Add End user.visible_message(span_notice("[user] pries \the [src] open."), \ span_notice("You pry open \the [src]."), \ diff --git a/code/game/objects/structures/gargoyle.dm b/code/game/objects/structures/gargoyle.dm index 73f3f72f5c..02d076ae3e 100644 --- a/code/game/objects/structures/gargoyle.dm +++ b/code/game/objects/structures/gargoyle.dm @@ -252,7 +252,7 @@ if(istype(W,/obj/item/grab || /obj/item/holder)) gargoyle.vore_attackby(W, user) return - if(gargoyle.adminbus_trash || is_type_in_list(W,edible_trash) && W.trash_eatable && !is_type_in_list(W,item_vore_blacklist)) + if(gargoyle.adminbus_trash || is_type_in_list(W, GLOB.edible_trash) && W.trash_eatable && !is_type_in_list(W, GLOB.item_vore_blacklist)) to_chat(user, span_warning("You slip [W] into [gargoyle]'s [lowertext(gargoyle.vore_selected.name)] .")) user.drop_item() W.forceMove(gargoyle.vore_selected) @@ -276,7 +276,7 @@ /obj/structure/gargoyle/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR) if(istype(AM,/obj/item) && gargoyle && gargoyle.vore_selected && gargoyle.trash_catching) var/obj/item/I = AM - if(gargoyle.adminbus_trash || is_type_in_list(I,edible_trash) && I.trash_eatable && !is_type_in_list(I,item_vore_blacklist)) + if(gargoyle.adminbus_trash || is_type_in_list(I, GLOB.edible_trash) && I.trash_eatable && !is_type_in_list(I, GLOB.item_vore_blacklist)) gargoyle.hitby(AM, speed) return else if(isliving(AM) && gargoyle) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 6ad09905b1..a8318c0ca1 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -1,5 +1,5 @@ /obj/structure/ghost_pod/proc/reset_ghostpod() //Makes the ghost pod usable again and re-adds it to the active ghost pod list if it is not on it. - active_ghost_pods |= src + GLOB.active_ghost_pods |= src used = FALSE busy = FALSE @@ -189,8 +189,7 @@ /obj/structure/ghost_pod/ghost_activated/maintpred/redgate/Initialize(mapload) . = ..() - if(!(src in active_ghost_pods)) - active_ghost_pods += src + GLOB.active_ghost_pods += src /obj/structure/ghost_pod/ghost_activated/maint_lurker name = "strange maintenance hole" @@ -275,8 +274,7 @@ /obj/structure/ghost_pod/ghost_activated/maint_lurker/Initialize(mapload) . = ..() - if(!(src in active_ghost_pods)) - active_ghost_pods += src + GLOB.active_ghost_pods += src /// redspace variant diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index 97bd9089d0..b1c41a8bb7 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -51,10 +51,7 @@ // Override this to create whatever mob you need. Be sure to call ..() if you don't want it to make infinite mobs. /obj/structure/ghost_pod/proc/create_occupant(var/mob/M) used = TRUE - //VOREStation Addition Start - if(src in active_ghost_pods) - active_ghost_pods -= src - //VOREStation Addition End + GLOB.active_ghost_pods -= src return TRUE diff --git a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm index d69946073c..ff2523d652 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm @@ -1,7 +1,6 @@ /obj/structure/ghost_pod/Destroy() - if(src in active_ghost_pods) - active_ghost_pods -= src - ..() + GLOB.active_ghost_pods -= src + . = ..() /obj/structure/ghost_pod var/spawn_active = FALSE @@ -47,8 +46,7 @@ create_occupant(user) /obj/structure/ghost_pod/proc/ghostpod_startup(var/notify = FALSE) - if(!(src in active_ghost_pods)) - active_ghost_pods += src + GLOB.active_ghost_pods |= src if(notify) trigger() diff --git a/code/game/objects/trash_eating.dm b/code/game/objects/trash_eating.dm index 8d087064a0..f9bf7ae899 100644 --- a/code/game/objects/trash_eating.dm +++ b/code/game/objects/trash_eating.dm @@ -1,7 +1,7 @@ // checks for when items are consumed by trash/ore eater /obj/item/proc/on_trash_eaten(var/mob/living/user) SHOULD_CALL_PARENT(TRUE) - if(is_type_in_list(src,item_vore_blacklist) && !user.adminbus_trash) //If someone has adminbus, they can eat whatever they want. + if(is_type_in_list(src, GLOB.item_vore_blacklist) && !user.adminbus_trash) //If someone has adminbus, they can eat whatever they want. to_chat(user, span_warning("You are not allowed to eat this.")) return FALSE if(!trash_eatable) //OOC pref. This /IS/ respected, even if adminbus_trash is enabled diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm index 6bf1b642c8..14a94da98e 100644 --- a/code/modules/admin/modify_robot.dm +++ b/code/modules/admin/modify_robot.dm @@ -20,6 +20,7 @@ var/supplied_law = "SuppliedLaw" var/supplied_law_position = MIN_SUPPLIED_LAW_NUMBER var/list/datum/ai_laws/law_list + var/obj/item/robotic_multibelt/multibelt_holder //Currently selected multibelt. /datum/eventkit/modify_robot/New() . = ..() @@ -81,6 +82,10 @@ var/obj/item/gun/energy/kinetic_accelerator/kin = locate() in target.module.modules if(kin) .["target"]["pka"] += get_pka(kin) + for(var/obj/item/robotic_multibelt/multibelt in target.module.modules) + .["target"]["multibelt"] += list(get_mult_belt(multibelt)) + + // Radio section var/list/radio_channels = list() for(var/channel in target.radio.channels) @@ -336,6 +341,39 @@ kin.modkits.Remove(rem_kit) qdel(rem_kit) return TRUE + if("select_multibelt") + multibelt_holder = locate(params["multibelt"]) + return TRUE + if("install_tool") + if(!istype(multibelt_holder)) + return FALSE + if(istype(multibelt_holder, /obj/item/robotic_multibelt/materials)) + target.add_new_material(text2path(params["tool"])) + return TRUE + var/new_tool = text2path(params["tool"]) + if(new_tool in GLOB.all_borg_multitool_options) + multibelt_holder.cyborg_integrated_tools += new_tool //Make sure you don't add items directly to it, or you can't ever remove them. + multibelt_holder.generate_tools() + return TRUE + + if("remove_tool") + if(!istype(multibelt_holder)) + return FALSE + if(istype(multibelt_holder, /obj/item/robotic_multibelt/materials)) + var/datum/matter_synth/synth = locate(params["tool"]) + target.module.synths -= synth + qdel(synth) + target.update_material_multibelts() + return TRUE + var/obj/item/rem_tool = locate(params["tool"]) + if(multibelt_holder.selected_item == rem_tool) + multibelt_holder.dropped() //Reset to original icon. + multibelt_holder.contents -= rem_tool + multibelt_holder.cyborg_integrated_tools -= rem_tool.type + multibelt_holder.integrated_tools_by_name -= rem_tool.name + multibelt_holder.integrated_tool_images -= rem_tool.name + qdel(rem_tool) + return TRUE if("add_channel") var/selected_radio_channel = params["channel"] if(selected_radio_channel == CHANNEL_SPECIAL_OPS || selected_radio_channel == CHANNEL_RESPONSE_TEAM) @@ -694,6 +732,33 @@ pka["max_capacity"] = kin.max_mod_capacity return pka +/datum/eventkit/modify_robot/proc/get_mult_belt(var/obj/item/robotic_multibelt/mult_belt) + var/list/multi_belt_list = list() + multi_belt_list["name"] = mult_belt.name + multi_belt_list["ref"] = REF(mult_belt) + var/list/integrated_tools = list() + var/list/tools = list() + if(istype(mult_belt, /obj/item/robotic_multibelt/materials)) + for(var/datum/matter_synth/synth in target.module.synths) + integrated_tools += list(list("name" = synth.name, "ref" = "\ref[synth]")) + for(var/tool in GLOB.material_synth_list) + var/material_path = GLOB.material_synth_list[tool] + if(!target.can_install_synth(material_path)) //Don't add it to the list if we already have it! + continue + tools += list(list("name" = tool, "path" = material_path)) + else + for(var/obj/tool in mult_belt.contents) + integrated_tools += list(list("name" = tool.name, "ref" = "\ref[tool]")) + for(var/tool in GLOB.all_borg_multitool_options) + if(tool in mult_belt.cyborg_integrated_tools) //Don't add it to the list if we already have it! + continue + var/obj/item/tool_to_add = tool + tools += list(list("name" = initial(tool_to_add.name), "path" = tool_to_add)) + multi_belt_list["integrated_tools"] = integrated_tools + multi_belt_list["tools"] = tools + return multi_belt_list + + /datum/eventkit/modify_robot/proc/get_cells() var/list/cell_options = list() for(var/cell in typesof(/obj/item/cell)) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index a57139ba07..25b47e8363 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -861,11 +861,11 @@ CHOMP Remove end */ if(A.outdoors) return AREA_SPACE - for (var/type in BUILDABLE_AREA_TYPES) + for (var/type in GLOB.BUILDABLE_AREA_TYPES) if ( istype(A,type) ) return AREA_SPACE - for (var/type in SPECIALS) + for (var/type in GLOB.SPECIALS) if ( istype(A,type) ) return AREA_SPECIAL return AREA_STATION diff --git a/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm b/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm index a0621b0149..f7bdeccfdd 100644 --- a/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm +++ b/code/modules/awaymissions/overmap_renamer/debrisfield_renamer.dm @@ -10,7 +10,7 @@ . = ..() if(!reference) // testing("First overmap descriptor, name: [name]") - for(var/obj/effect/overmap/visitable/D in visitable_overmap_object_instances) + for(var/obj/effect/overmap/visitable/D in GLOB.visitable_overmap_object_instances) if(D.unique_identifier == "Debris Field") if(D.possible_descriptors && islist(D.possible_descriptors)) D.possible_descriptors |= list(descriptors) diff --git a/code/modules/awaymissions/overmap_renamer/readme.md b/code/modules/awaymissions/overmap_renamer/readme.md index 6927ef394b..e370bbfaeb 100644 --- a/code/modules/awaymissions/overmap_renamer/readme.md +++ b/code/modules/awaymissions/overmap_renamer/readme.md @@ -51,14 +51,14 @@ How to use - for mappers: Important procs, vars etc. contained within the following files: code\_helpers\global_lists_vr.dm - var/list/visitable_overmap_object_instances - Collects instances with reference for things like the Debris Field, Space Whale, Talon etc. We need it to call the proc on the instance + GLOBAL_LIST_EMPTY(visitable_overmap_object_instances) - Collects instances with reference for things like the Debris Field, Space Whale, Talon etc. We need it to call the proc on the instance code\modules\overmap\sectors.dm var/list/possible_descriptors - contains a list of list("name","desc","scanner_desc") var/unique_identifier - A way to check if the object in question loaded without causing a compiler error. Name them sth easy to recognize, like "Debris field" for... debris field. var/real_name - Used to handle known = FALSE overmap objects properly var/real_desc - same as real_name - /obj/effect/overmap/visitable/Initialize() - adds the object's instance with reference to visitable_overmap_object_instances + /obj/effect/overmap/visitable/Initialize() - adds the object's instance with reference to GLOB.visitable_overmap_object_instances code\modules\awaymissions\overmap_renamer\overmap_renamer.dm /obj/effect/overmap/visitable/proc/modify_descriptors() - Takes possible_descriptors from src, picks a valid one after sanitization. Gives warnings if input is invalid. diff --git a/code/modules/events/roaming_wildlife.dm b/code/modules/events/roaming_wildlife.dm index 1d855d2c21..2bb50590d9 100644 --- a/code/modules/events/roaming_wildlife.dm +++ b/code/modules/events/roaming_wildlife.dm @@ -44,9 +44,9 @@ var/list/spawn_list switch(WL.wildlife_type) if(1) - spawn_list = event_wildlife_aquatic + spawn_list = GLOB.event_wildlife_aquatic if(2) - spawn_list = event_wildlife_roaming + spawn_list = GLOB.event_wildlife_roaming if(!spawn_list) continue diff --git a/code/modules/materials/materials/glass.dm b/code/modules/materials/materials/glass.dm index b7c3ef7359..fcc679cea5 100644 --- a/code/modules/materials/materials/glass.dm +++ b/code/modules/materials/materials/glass.dm @@ -36,7 +36,7 @@ var/message = "Sheet-[used_stack.name] ([used_stack.get_amount()] sheet\s left)" var/choice = tgui_input_list(user, message, "Window Construction", window_options) - if(!choice || !used_stack || !user || used_stack.loc != user || user.stat || user.loc != T) + if(!choice || !used_stack || !user || (used_stack.loc != user && !isrobot(user)) || user.stat || user.loc != T) return 1 // Get data for building windows here. diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index e5092bd1fd..9c2034aae7 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -113,12 +113,12 @@ if(!isobserver(src)) //Make sure they're an observer! return - var/input = tgui_input_list(src, "Select a ghost pod:", "Ghost Jump", observe_list_format(active_ghost_pods)) + var/input = tgui_input_list(src, "Select a ghost pod:", "Ghost Jump", observe_list_format(GLOB.active_ghost_pods)) if(!input) to_chat(src, span_filter_notice("No active ghost pods detected.")) return - var/target = observe_list_format(active_ghost_pods)[input] + var/target = observe_list_format(GLOB.active_ghost_pods)[input] if (!target)//Make sure we actually have a target return else diff --git a/code/modules/mob/living/carbon/human/death_vr.dm b/code/modules/mob/living/carbon/human/death_vr.dm index 41d63107c9..70afe4c60e 100644 --- a/code/modules/mob/living/carbon/human/death_vr.dm +++ b/code/modules/mob/living/carbon/human/death_vr.dm @@ -35,5 +35,5 @@ /mob/living/simple_mob/death() ..() ghostjoin = 0 - active_ghost_pods -= src + GLOB.active_ghost_pods -= src ghostjoin_icon() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 08dff27628..e0ec041f4d 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -427,8 +427,8 @@ emp_act var/obj/O = AM if(stat != DEAD && istype(O,/obj/item) && trash_catching && vore_selected) //Ported from chompstation var/obj/item/I = O - if(adminbus_trash || is_type_in_list(I,edible_trash) && I.trash_eatable && !is_type_in_list(I,item_vore_blacklist)) - visible_message(span_vwarning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) //CHOMPEdit + if(adminbus_trash || is_type_in_list(I, GLOB.edible_trash) && I.trash_eatable && !is_type_in_list(I, GLOB.item_vore_blacklist)) + visible_message(span_vwarning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) I.throwing = 0 I.forceMove(vore_selected) return diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index 45115377bc..4e8aa9bd5c 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -70,12 +70,10 @@ var/obj/item/held = user.get_active_hand() if(!istype(held) || is_robot_module(held)) stripping = TRUE - //CHOMPEdit Start - Let borg grippers put stuff on. if(is_robot_module(held) && istype(held, /obj/item/gripper)) var/obj/item/gripper/G = held if(istype(G.wrapped)) stripping = FALSE - //CHOMPEdit End else var/obj/item/holder/holder = held if(istype(holder) && src == holder.held_mob) @@ -92,19 +90,17 @@ to_chat(user, span_warning("You cannot remove \the [src]'s [target_slot.name].")) return visible_message(span_danger("\The [user] is trying to remove \the [src]'s [target_slot.name]!")) - else if(!istype(held, /obj/item/gripper)) //CHOMPEdit - Let borg grippers put stuff on. + else if(!istype(held, /obj/item/gripper)) if(slot_to_strip == slot_wear_mask && istype(held, /obj/item/grenade)) visible_message(span_danger("\The [user] is trying to put \a [held] in \the [src]'s mouth!")) else visible_message(span_danger("\The [user] is trying to put \a [held] on \the [src]!")) - //CHOMPEdit Start - Let borg grippers put stuff on. else var/obj/item/gripper/G = held if(slot_to_strip == slot_wear_mask && istype(G.wrapped, /obj/item/grenade)) visible_message(span_danger("\The [user] is trying to put \a [G.wrapped] in \the [src]'s mouth!")) else visible_message(span_danger("\The [user] is trying to put \a [G.wrapped] on \the [src]!")) - //CHOMPEdit End if(!do_after(user,HUMAN_STRIP_DELAY,src)) return @@ -120,14 +116,14 @@ if(stripping) add_attack_logs(user,src,"Removed equipment from slot [target_slot]") unEquip(target_slot) - //CHOMPEdit Start - Let borg grippers put stuff on. else if(is_robot_module(held) && istype(held, /obj/item/gripper)) var/obj/item/gripper/G = held var/obj/item/wrapped = G.wrapped if(istype(wrapped)) - G.drop_item_nm() - equip_to_slot_if_possible(wrapped, text2num(slot_to_strip), 0, 1, 1) - //CHOMPEdit End + if(equip_to_slot_if_possible(wrapped, text2num(slot_to_strip), 0, 1, 1)) + G.wrapped = null + G.generate_icons() + G.current_pocket = pick(G.pockets) else if(user.unEquip(held)) equip_to_slot_if_possible(held, text2num(slot_to_strip), 0, 1, 1) if(held.loc != src) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5887c3ad9c..2bd79733e0 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -269,8 +269,8 @@ var/obj/O = AM if(stat != DEAD && istype(O,/obj/item) && trash_catching && vore_selected) //ported from chompstation var/obj/item/I = O - if(adminbus_trash || is_type_in_list(I,edible_trash) && I.trash_eatable && !is_type_in_list(I,item_vore_blacklist)) - visible_message(span_vwarning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) //CHOMPEdit + if(adminbus_trash || is_type_in_list(I, GLOB.edible_trash) && I.trash_eatable && !is_type_in_list(I, GLOB.item_vore_blacklist)) + visible_message(span_vwarning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) I.throwing = 0 I.forceMove(vore_selected) return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm index 94a252d74f..18f1eea686 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm @@ -83,7 +83,7 @@ return if(compactor) - if(is_type_in_list(target,item_vore_blacklist)) + if(is_type_in_list(target, GLOB.item_vore_blacklist)) to_chat(user, span_warning("You are hard-wired to not ingest this item.")) return if(istype(target, /obj/item) || istype(target, /obj/effect/decal/remains)) @@ -180,7 +180,7 @@ ingest_living(ingesting, belly) else if (istype(ingesting, /obj/item)) var/obj/item/to_eat = ingesting - if (is_type_in_list(to_eat, item_vore_blacklist)) + if (is_type_in_list(to_eat, GLOB.item_vore_blacklist)) return if (istype(to_eat, /obj/item/holder)) //just in case var/obj/item/holder/micro = ingesting diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 8722ac4105..3d080e6972 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -1,434 +1,3 @@ -//Simple borg hand. -//Limited use. -/obj/item/gripper - name = "magnetic gripper" - desc = "A simple grasping tool specialized in construction and engineering work." - description_info = "Ctrl-Clicking on the gripper will drop whatever it is holding.
\ - Using an object on the gripper will interact with the item inside it, if it exists, instead." - icon = 'icons/obj/device.dmi' - icon_state = "gripper" - flags = NOBLUDGEON - - //Has a list of items that it can hold. - var/list/can_hold = list( - /obj/item/cell, - /obj/item/airlock_electronics, - /obj/item/tracker_electronics, - /obj/item/module/power_control, - /obj/item/stock_parts, - /obj/item/frame, - /obj/item/camera_assembly, - /obj/item/tank, - /obj/item/circuitboard, - /obj/item/smes_coil, - /obj/item/fuel_assembly, - /obj/item/bluespace_crystal //Chomp EDIT - ) // CHOMPEdit - Buffing the gripper to allow bluespace crystal use for telesci building. - - var/obj/item/wrapped = null // Item currently being held. - - var/force_holder = null // - pickup_sound = 'sound/items/pickup/device.ogg' - drop_sound = 'sound/items/drop/device.ogg' - -/obj/item/gripper/examine(mob/user) - . = ..() - if(wrapped) - . += span_notice("\The [src] is holding \the [wrapped].") - . += wrapped.examine(user) - -/obj/item/gripper/CtrlClick(mob/user) - drop_item() - return - -/obj/item/gripper/AltClick(mob/user) - drop_item() - return - -/obj/item/gripper/omni - name = "omni gripper" - desc = "A strange grasping tool that can hold anything a human can, but still maintains the limitations of application its more limited cousins have." - icon_state = "gripper-omni" - - can_hold = list(/obj/item) // Testing and Event gripper. - -// VEEEEERY limited version for mining borgs. Basically only for swapping cells and upgrading the drills. -/obj/item/gripper/miner - name = "drill maintenance gripper" - desc = "A simple grasping tool for the maintenance of heavy drilling machines." - icon_state = "gripper-mining" - - can_hold = list( - /obj/item/cell, - /obj/item/stock_parts - ) - -/obj/item/gripper/security - name = "security gripper" - desc = "A simple grasping tool for corporate security work." - icon_state = "gripper-sec" - - can_hold = list( - /obj/item/paper, - /obj/item/paper_bundle, - /obj/item/pen, - /obj/item/sample, - /obj/item/forensics/sample_kit, - /obj/item/taperecorder, - /obj/item/rectape, - /obj/item/uv_light - ) - -/obj/item/gripper/paperwork - name = "paperwork gripper" - desc = "A simple grasping tool for clerical work." - - can_hold = list( - /obj/item/clipboard, - /obj/item/paper, - /obj/item/paper_bundle, - /obj/item/card/id, - /obj/item/book, - /obj/item/newspaper - ) - -/obj/item/gripper/medical - name = "medical gripper" - desc = "A simple grasping tool for medical work." - - can_hold = list( - /obj/item/reagent_containers/glass, - /obj/item/storage/pill_bottle, - /obj/item/reagent_containers/pill, - /obj/item/reagent_containers/blood, - /obj/item/nif, //Chompedit Add Nif handling - /obj/item/stack/material/phoron, - /obj/item/tank/anesthetic, - /obj/item/disk/body_record //Vorestation Edit: this lets you get an empty sleeve or help someone else - ) - -/obj/item/gripper/research //A general usage gripper, used for toxins/robotics/xenobio/etc - name = "scientific gripper" - icon_state = "gripper-sci" - desc = "A simple grasping tool suited to assist in a wide array of research applications." - - can_hold = list( - /obj/item/cell, - /obj/item/stock_parts, - /obj/item/mmi, - /obj/item/robot_parts, - /obj/item/borg/upgrade, - /obj/item/flash, //to build borgs, - /obj/item/disk, - /obj/item/circuitboard, - /obj/item/reagent_containers/glass, - /obj/item/assembly/prox_sensor, - /obj/item/healthanalyzer, //to build medibots, - /obj/item/slime_cube, - /obj/item/slime_crystal, - /obj/item/disposable_teleporter/slime, - /obj/item/slimepotion, - /obj/item/slime_extract, - /obj/item/reagent_containers/food/snacks/monkeycube - ) - -/obj/item/gripper/circuit - name = "circuit assembly gripper" - icon_state = "gripper-circ" - desc = "A complex grasping tool used for working with circuitry." - - can_hold = list( - /obj/item/cell/device, - /obj/item/electronic_assembly, - /obj/item/assembly/electronic_assembly, - /obj/item/clothing/under/circuitry, - /obj/item/clothing/gloves/circuitry, - /obj/item/clothing/glasses/circuitry, - /obj/item/clothing/shoes/circuitry, - /obj/item/clothing/head/circuitry, - /obj/item/clothing/ears/circuitry, - /obj/item/clothing/suit/circuitry, - /obj/item/implant/integrated_circuit, - /obj/item/integrated_circuit - - ) - -/obj/item/gripper/service //Used to handle food, drinks, and seeds. - name = "service gripper" - icon_state = "gripper" - desc = "A simple grasping tool used to perform tasks in the service sector, such as handling food, drinks, and seeds." - - can_hold = list( - /obj/item/reagent_containers/glass, - /obj/item/reagent_containers/food, - /obj/item/seeds, - /obj/item/grown, - /obj/item/trash, - /obj/item/reagent_containers/cooking_container - ) - -/obj/item/gripper/gravekeeper //Used for handling grave things, flowers, etc. - name = "grave gripper" - icon_state = "gripper" - desc = "A specialized grasping tool used in the preparation and maintenance of graves." - - can_hold = list( - /obj/item/seeds, - /obj/item/grown, - /obj/item/material/gravemarker - ) - -/obj/item/gripper/scene - name = "misc gripper" - desc = "A simple grasping tool that can hold a variety of 'general' objects..." - - can_hold = list( - /obj/item/capture_crystal, - /obj/item/clothing, - /obj/item/implanter, - /obj/item/disk/nifsoft/compliance, - /obj/item/handcuffs, - /obj/item/toy, - /obj/item/petrifier, - /obj/item/dice, - /obj/item/casino_platinum_chip, - /obj/item/spacecasinocash - ) - -/obj/item/gripper/no_use/organ - name = "organ gripper" - icon_state = "gripper-flesh" - desc = "A specialized grasping tool used to preserve and manipulate organic material." - - can_hold = list( - /obj/item/organ, - /obj/item/nif //NIFs can be slapped in during surgery - ) - -/obj/item/gripper/no_use/organ/Entered(var/atom/movable/AM) - if(istype(AM, /obj/item/organ)) - var/obj/item/organ/O = AM - O.preserved = 1 - for(var/obj/item/organ/organ in O) - organ.preserved = 1 - ..() - -/obj/item/gripper/no_use/organ/Exited(var/atom/movable/AM) - if(istype(AM, /obj/item/organ)) - var/obj/item/organ/O = AM - O.preserved = 0 - for(var/obj/item/organ/organ in O) - organ.preserved = 0 - ..() - -/obj/item/gripper/no_use/organ/robotics - name = "robotics organ gripper" - icon_state = "gripper-flesh" - desc = "A specialized grasping tool used in robotics work." - - can_hold = list( - /obj/item/organ/external, - /obj/item/organ/internal/brain, //to insert into MMIs, - /obj/item/organ/internal/cell, - /obj/item/organ/internal/eyes/robot, - /obj/item/nif //NIFs can be slapped in during surgery - ) - -/obj/item/gripper/no_use/mech - name = "exosuit gripper" - icon_state = "gripper-mech" - desc = "A large, heavy-duty grasping tool used in construction of mechs." - - can_hold = list( - /obj/item/mecha_parts/part, - //obj/item/mecha_parts/micro/part, //VOREStation Edit: Allow construction of micromechs //CHOMPedit commented micromech stuff, because fuck this trash - /obj/item/mecha_parts/mecha_equipment, - /obj/item/mecha_parts/mecha_tracking, - /obj/item/mecha_parts/component - ) - -/obj/item/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item - -/obj/item/gripper/no_use/attack_self(mob/user as mob) - return - -/obj/item/gripper/no_use/loader //This is used to disallow building with metal. - name = "sheet loader" - desc = "A specialized loading device, designed to pick up and insert sheets of materials inside machines. Also can pick up floor tiles." - icon_state = "gripper-sheet" - - can_hold = list( - /obj/item/stack/material, - /obj/item/stack/tile - ) - -/obj/item/gripper/attack_self(mob/user as mob) - if(wrapped) - return wrapped.attack_self(user) - return ..() - -/obj/item/gripper/attackby(var/obj/item/O, var/mob/user) - if(wrapped) // We're interacting with the item inside. If you can hold a cup with 2 fingers and stick a straw in it, you could do that with a gripper and another robotic arm. - wrapped.loc = src.loc - var/resolved = wrapped.attackby(O, user) - if(QDELETED(wrapped) || wrapped.loc != src.loc) //Juuuust in case. - wrapped = null - if(!resolved && wrapped && O) - O.afterattack(wrapped,user,1) - if(QDELETED(wrapped) || wrapped.loc != src.loc) // I don't know of a nicer way to do this. - wrapped = null - if(wrapped) - wrapped.loc = src - return resolved - return ..() - -/obj/item/gripper/verb/drop_gripper_item() - - set name = "Drop Item" - set desc = "Release an item from your magnetic gripper." - set category = "Abilities.Silicon" - - drop_item() - -/obj/item/gripper/proc/drop_item() - if(!wrapped) - //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z - for(var/obj/item/thing in src.contents) - thing.loc = get_turf(src) - return - - if(wrapped.loc != src) - wrapped = null - return - - to_chat(src.loc, span_notice("You drop \the [wrapped].")) - wrapped.loc = get_turf(src) - wrapped = null - //update_icon() - -/obj/item/gripper/proc/drop_item_nm() - - if(!wrapped) - for(var/obj/item/thing in src.contents) - thing.loc = get_turf(src) - return - - if(wrapped.loc != src) - wrapped = null - return - - wrapped.loc = get_turf(src) - wrapped = null - //update_icon() - -/obj/item/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack(). - force_holder = wrapped.force - wrapped.force = 0.0 - if(QDELETED(wrapped) || wrapped.loc != src.loc) //qdel check here so it doesn't duplicate/spawn ghost items - wrapped = null - else - wrapped.loc = src.loc //To ensure checks pass. - wrapped.attack(M,user) - M.attackby(wrapped, user) //attackby reportedly gets procced by being clicked on, at least according to Anewbe. - if(QDELETED(wrapped) || wrapped.loc != src.loc) - wrapped = null - if(wrapped) //In the event nothing happened to wrapped, go back into the gripper. - wrapped.loc = src - return 1 - return 0 - -/obj/item/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params) - - if(!proximity) - return // This will prevent them using guns at range but adminbuse can add them directly to modules, so eh. - - //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z - if(!wrapped) - for(var/obj/item/thing in src.contents) - wrapped = thing - break - - if(wrapped) //Already have an item. - //Temporary put wrapped into user so target's attackby() checks pass. - wrapped.loc = user - - //Pass the attack on to the target. This might delete/relocate wrapped. - var/resolved = target.attackby(wrapped,user) - if(!resolved && wrapped && target) - wrapped.afterattack(target,user,1) - - //wrapped's force was set to zero. This resets it to the value it had before. - if(wrapped) - wrapped.force = force_holder - force_holder = null - //If wrapped was neither deleted nor put into target, put it back into the gripper. - if(wrapped && user && (wrapped.loc == user)) - wrapped.loc = src - else - wrapped = null - return - - else if(istype(target,/obj/item)) //Check that we're not pocketing a mob. - - //...and that the item is not in a container. - if(!isturf(target.loc)) - return - - var/obj/item/I = target - - if(I.anchored) - to_chat(user,span_notice("You are unable to lift \the [I] from \the [I.loc].")) - return - - //Check if the item is blacklisted. - var/grab = 0 - for(var/typepath in can_hold) - if(istype(I,typepath)) - grab = 1 - break - - //We can grab the item, finally. - if(grab) - to_chat(user, "You collect \the [I].") - I.loc = src - wrapped = I - return - else - to_chat(user, span_danger("Your gripper cannot hold \the [target].")) - - else if(istype(target,/obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = target - if(A.opened) - if(A.cell && is_type_in_list(A.cell, can_hold)) - - wrapped = A.cell - - A.cell.add_fingerprint(user) - A.cell.update_icon() - A.cell.loc = src - A.cell = null - - A.charging = 0 - A.update_icon() - - user.visible_message(span_danger("[user] removes the power cell from [A]!"), "You remove the power cell.") - - else if(istype(target,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/A = target - if(A.opened) - if(A.cell && is_type_in_list(A.cell, can_hold)) - - wrapped = A.cell - - A.cell.add_fingerprint(user) - A.cell.update_icon() - A.update_icon() - A.cell.loc = src - A.cell = null - - user.visible_message(span_danger("[user] removes the power cell from [A]!"), "You remove the power cell.") - //TODO: Matter decompiler. /obj/item/matter_decompiler diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 0775ae9cbd..6255fcb081 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -2,7 +2,13 @@ //as they handle all relevant stuff like adding it to the player's screen and such //Returns the thing in our active hand (whatever is in our active module-slot, in this case) -/mob/living/silicon/robot/get_active_hand() +/mob/living/silicon/robot/get_active_hand(atom/A) + if(module_active == A) //If we are interacting with the item itself (I.E swapping multibelt items) + return module_active + else if(istype(module_active, /obj/item/robotic_multibelt)) //If we are hitting something with a multibelt + var/obj/item/robotic_multibelt/belt = module_active + if(belt.selected_item) + return belt.selected_item return module_active /*-------TODOOOOOOOOOO--------*/ @@ -23,6 +29,9 @@ return if(module_state_1 == I) + if(istype(module_state_1,/obj/item/robotic_multibelt)) + var/obj/item/robotic_multibelt/toolbelt = module_state_1 + toolbelt.original_state() if(istype(module_state_1,/obj/item/borg/sight)) sight_mode &= ~module_state_1:sight_mode if (client) @@ -33,6 +42,9 @@ module_state_1 = null inv1.icon_state = "inv1" else if(module_state_2 == I) + if(istype(module_state_2,/obj/item/robotic_multibelt)) + var/obj/item/robotic_multibelt/toolbelt = module_state_2 + toolbelt.original_state() if(istype(module_state_2,/obj/item/borg/sight)) sight_mode &= ~module_state_2:sight_mode if (client) @@ -43,6 +55,9 @@ module_state_2 = null inv2.icon_state = "inv2" else if(module_state_3 == I) + if(istype(module_state_3,/obj/item/robotic_multibelt)) + var/obj/item/robotic_multibelt/toolbelt = module_state_3 + toolbelt.original_state() if(istype(module_state_3,/obj/item/borg/sight)) sight_mode &= ~module_state_3:sight_mode if (client) @@ -126,6 +141,9 @@ return 0 /mob/living/silicon/robot/proc/activated(obj/item/O) + var/belt_check = using_multibelt(O) + if(belt_check) + return belt_check if(module_state_1 == O) return 1 else if(module_state_2 == O) @@ -135,6 +153,12 @@ else return 0 +/mob/living/silicon/robot/proc/using_multibelt(obj/item/O) + for(var/obj/item/robotic_multibelt/materials/material_belt in contents) + if(material_belt.selected_item == O) + return TRUE + return FALSE + /mob/living/silicon/robot/proc/get_active_modules() return list(module_state_1, module_state_2, module_state_3) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm index 2e30e93db5..d53ac8ff7f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm @@ -23,7 +23,7 @@ src.modules += new /obj/item/tool/screwdriver/cyborg(src) src.modules += new /obj/item/tool/wrench/cyborg(src) src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/multitool(src) + src.modules += new /obj/item/multitool/cyborg(src) // Sci src.modules += new /obj/item/robotanalyzer(src) @@ -34,10 +34,6 @@ var/datum/matter_synth/wire = new /datum/matter_synth/wire() synths += wire - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - src.modules += new /obj/item/dogborg/sleeper/lost(src) src.modules += new /obj/item/dogborg/pounce(src) @@ -57,11 +53,7 @@ src.modules += new /obj/item/tool/wrench/cyborg(src) // For growing flowers - src.modules += new /obj/item/material/minihoe(src) - src.modules += new /obj/item/material/knife/machete/hatchet(src) - src.modules += new /obj/item/analyzer/plant_analyzer(src) - src.modules += new /obj/item/storage/bag/plants(src) - src.modules += new /obj/item/robot_harvester(src) + src.modules += new /obj/item/robotic_multibelt/botanical(src) // For digging and beautifying graves src.modules += new /obj/item/shovel(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 0c4085f341..0d3faa6800 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -267,18 +267,8 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/healthanalyzer(src) src.modules += new /obj/item/sleevemate(src) src.modules += new /obj/item/reagent_containers/borghypo/surgeon(src) - src.modules += new /obj/item/autopsy_scanner(src) - src.modules += new /obj/item/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/surgical/hemostat/cyborg(src) - src.modules += new /obj/item/surgical/retractor/cyborg(src) - src.modules += new /obj/item/surgical/cautery/cyborg(src) - src.modules += new /obj/item/surgical/bonegel/cyborg(src) - src.modules += new /obj/item/surgical/FixOVein/cyborg(src) - src.modules += new /obj/item/surgical/bonesetter/cyborg(src) - src.modules += new /obj/item/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/surgical/surgicaldrill/cyborg(src) - src.modules += new /obj/item/surgical/bioregen/cyborg(src) - src.modules += new /obj/item/gripper/no_use/organ(src) + src.modules += new /obj/item/robotic_multibelt/medical(src) + src.modules += new /obj/item/robotic_multibelt/medical(src) src.modules += new /obj/item/gripper/medical(src) src.modules += new /obj/item/shockpaddles/robot(src) src.modules += new /obj/item/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis @@ -342,21 +332,11 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/reagent_containers/glass/beaker/large/borg(src) src.modules += new /obj/item/reagent_containers/dropper/industrial(src) src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/gripper/no_use/organ(src) src.modules += new /obj/item/gripper/medical(src) src.modules += new /obj/item/shockpaddles/robot(src) //Surgeon Modules below - src.modules += new /obj/item/autopsy_scanner(src) - src.modules += new /obj/item/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/surgical/hemostat/cyborg(src) - src.modules += new /obj/item/surgical/retractor/cyborg(src) - src.modules += new /obj/item/surgical/cautery/cyborg(src) - src.modules += new /obj/item/surgical/bonegel/cyborg(src) - src.modules += new /obj/item/surgical/FixOVein/cyborg(src) - src.modules += new /obj/item/surgical/bonesetter/cyborg(src) - src.modules += new /obj/item/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/surgical/surgicaldrill/cyborg(src) - src.modules += new /obj/item/surgical/bioregen/cyborg(src) + src.modules += new /obj/item/robotic_multibelt/medical(src) + src.modules += new /obj/item/robotic_multibelt/medical(src) //Surgeon Modules End src.modules += new /obj/item/inflatable_dispenser/robot(src) src.modules += new /obj/item/holosign_creator/medical(src) @@ -417,18 +397,14 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/engineering/create_equipment(var/mob/living/silicon/robot/robot) ..() + src.modules += new /obj/item/robotic_multibelt(src) + src.modules += new /obj/item/robotic_multibelt(src) src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/multitool(src) src.modules += new /obj/item/t_scanner(src) src.modules += new /obj/item/analyzer(src) src.modules += new /obj/item/geiger(src) src.modules += new /obj/item/taperoll/engineering(src) - src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/gripper/circuit(src) + src.modules += new /obj/item/gripper/engineering(src) src.modules += new /obj/item/lightreplacer(src) src.modules += new /obj/item/pipe_dispenser(src) src.modules += new /obj/item/floor_painter(src) @@ -437,7 +413,6 @@ var/global/list/robot_modules = list( src.emag += new /obj/item/melee/robotic/baton/arm(src) src.modules += new /obj/item/rcd/electric/mounted/borg(src) src.modules += new /obj/item/pickaxe/plasmacutter/borg(src) - src.modules += new /obj/item/gripper/no_use/loader(src) src.modules += new /obj/item/dogborg/stasis_clamp(src) src.modules += new /obj/item/holosign_creator/combifan(src) //CHOMPAdd @@ -455,55 +430,6 @@ var/global/list/robot_modules = list( synths += plastic synths += wire - var/obj/item/matter_decompiler/MD = new /obj/item/matter_decompiler(src) - MD.metal = metal - MD.glass = glass - src.modules += MD - - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) - G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/material/cyborg/plasteel/PS = new (src) - PS.synths = list(plasteel) - src.modules += PS - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) - S.synths = list(metal) - src.modules += S - - var/obj/item/stack/tile/roofing/cyborg/CT = new /obj/item/stack/tile/roofing/cyborg(src) - CT.synths = list(metal) - src.modules += CT - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) - WT.synths = list(wood) - src.modules += WT - - var/obj/item/stack/material/cyborg/wood/W = new (src) - W.synths = list(wood) - src.modules += W - - var/obj/item/stack/material/cyborg/plastic/PL = new (src) - PL.synths = list(plastic) - src.modules += PL - var/obj/item/dogborg/sleeper/compactor/decompiler/BD = new /obj/item/dogborg/sleeper/compactor/decompiler(src) BD.metal = metal BD.glass = glass @@ -511,6 +437,7 @@ var/global/list/robot_modules = list( BD.plastic = plastic src.modules += BD + src.modules += new /obj/item/robotic_multibelt/materials(src) src.emag += new /obj/item/dogborg/pounce(src) /obj/item/robot_module/robot/security @@ -532,7 +459,6 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/taperoll/police(src) src.modules += new /obj/item/reagent_containers/spray/pepper(src) src.modules += new /obj/item/gripper/security(src) - src.modules += new /obj/item/ticket_printer(src) //VOREStation Add src.modules += new /obj/item/gun/energy/robotic/phasegun(src) // CHOMPedit: Phasegun for regular sec cyborg. src.emag += new /obj/item/gun/energy/robotic/laser/rifle(src) @@ -570,6 +496,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/lightreplacer(src) src.modules += new /obj/item/vac_attachment(src) //CHOMPAdd src.modules += new /obj/item/borg/sight/janitor(src) + src.modules += new /obj/item/reagent_containers/glass/bucket/cyborg(src) var/obj/item/reagent_containers/spray/LS = new /obj/item/reagent_containers/spray(src) src.emag += LS LS.reagents.add_reagent(REAGENT_ID_LUBE, 250) @@ -659,15 +586,8 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/clerical/butler/create_equipment(var/mob/living/silicon/robot/robot) ..() src.modules += new /obj/item/gripper/service(src) - src.modules += new /obj/item/reagent_containers/glass/bucket(src) - src.modules += new /obj/item/material/minihoe(src) - src.modules += new /obj/item/material/knife/machete/hatchet(src) - src.modules += new /obj/item/analyzer/plant_analyzer(src) + src.modules += new /obj/item/robotic_multibelt/service(src) src.modules += new /obj/item/storage/bag/serviceborg(src) - src.modules += new /obj/item/robot_harvester(src) - src.modules += new /obj/item/material/knife(src) - src.modules += new /obj/item/material/kitchen/rollingpin(src) - src.modules += new /obj/item/multitool(src) //to freeze trays var/obj/item/rsf/M = new /obj/item/rsf(src) M.stored_matter = 30 @@ -709,15 +629,12 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/clerical/honkborg/create_equipment(var/mob/living/silicon/robot/R) src.modules += new /obj/item/gripper/service(src) - src.modules += new /obj/item/reagent_containers/glass/bucket(src) - src.modules += new /obj/item/material/minihoe(src) - src.modules += new /obj/item/analyzer/plant_analyzer(src) - src.modules += new /obj/item/storage/bag/serviceborg(src) - src.modules += new /obj/item/robot_harvester(src) - src.modules += new /obj/item/multitool(src) + src.modules += new /obj/item/reagent_containers/glass/bucket/cyborg(src) + src.modules += new /obj/item/robotic_multibelt/botanical(src) src.modules += new /obj/item/dogborg/pounce(src) src.modules += new /obj/item/bikehorn(src) src.modules += new /obj/item/gun/launcher/confetti_cannon/robot(src) + src.modules += new /obj/item/reagent_containers/spray/waterflower(src) var/obj/item/rsf/M = new /obj/item/rsf(src) M.stored_matter = 30 @@ -796,18 +713,12 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/research/create_equipment(var/mob/living/silicon/robot/robot) ..() src.modules += new /obj/item/portable_destructive_analyzer(src) - src.modules += new /obj/item/gripper/research(src) - src.modules += new /obj/item/gripper/circuit(src) - src.modules += new /obj/item/gripper/no_use/organ/robotics(src) - src.modules += new /obj/item/gripper/no_use/mech(src) - src.modules += new /obj/item/gripper/no_use/loader(src) src.modules += new /obj/item/robotanalyzer(src) src.modules += new /obj/item/card/robot(src) - src.modules += new /obj/item/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/multitool(src) + src.modules += new /obj/item/gripper/research(src) + src.modules += new /obj/item/robotic_multibelt(src) + src.modules += new /obj/item/robotic_multibelt(src) + src.modules += new /obj/item/robotic_multibelt/botanical(src) src.modules += new /obj/item/surgical/hemostat/cyborg(src) //Synth repair src.modules += new /obj/item/surgical/surgicaldrill/cyborg(src) //NIF repair src.modules += new /obj/item/surgical/circular_saw/cyborg(src) // Synth limb replacement @@ -833,11 +744,8 @@ var/global/list/robot_modules = list( N.synths = list(nanite) src.modules += N - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) //Cable code, taken from engiborg, - C.synths = list(wire) - src.modules += C - src.modules += new /obj/item/dogborg/sleeper/compactor/analyzer(src) + src.modules += new /obj/item/robotic_multibelt/materials(src) src.emag += new /obj/item/dogborg/pounce(src) /obj/item/robot_module/robot/research/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) @@ -891,11 +799,10 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/tool/crowbar/cyborg(src) src.modules += new /obj/item/tool/wirecutters/cyborg(src) src.modules += new /obj/item/t_scanner(src) - src.modules += new /obj/item/multitool(src) + src.modules += new /obj/item/multitool/cyborg(src) src.modules += new /obj/item/lightreplacer(src) - src.modules += new /obj/item/gripper(src) + src.modules += new /obj/item/gripper/drone(src) src.modules += new /obj/item/soap(src) - src.modules += new /obj/item/gripper/no_use/loader(src) src.modules += new /obj/item/extinguisher(src) src.modules += new /obj/item/pipe_painter(src) src.modules += new /obj/item/floor_painter(src) @@ -924,44 +831,9 @@ var/global/list/robot_modules = list( MD.glass = glass MD.wood = wood MD.plastic = plastic + src.modules += new /obj/item/robotic_multibelt/materials(src) src.modules += MD - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) - G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) - S.synths = list(metal) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) - WT.synths = list(wood) - src.modules += WT - - var/obj/item/stack/material/cyborg/wood/W = new (src) - W.synths = list(wood) - src.modules += W - - var/obj/item/stack/material/cyborg/plastic/P = new (src) - P.synths = list(plastic) - src.modules += P - /obj/item/robot_module/drone/construction name = "construction drone module" hide_on_manifest = TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm index 3db2610165..b89e1fef71 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -29,9 +29,6 @@ var/datum/matter_synth/cloth = new /datum/matter_synth/cloth(40000) synths += cloth - var/obj/item/stack/sandbags/cyborg/SB = new /obj/item/stack/sandbags/cyborg(src) - SB.synths += list(cloth) - var/jetpack = new/obj/item/tank/jetpack/carbondioxide(src) src.modules += jetpack robot.internals = jetpack @@ -59,6 +56,7 @@ src.modules += new /obj/item/dogborg/sleeper/K9/syndie(src) src.modules += new /obj/item/dogborg/pounce(src) + src.modules += new /obj/item/robotic_multibelt/materials(src) // 95% engi-borg and 15% roboticist. /obj/item/robot_module/robot/syndicate/mechanist @@ -102,26 +100,6 @@ N.synths = list(nanite) src.modules += N - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) - G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/rods = new /obj/item/stack/rods/cyborg(src) - rods.synths = list(metal) - src.modules += rods - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG - var/obj/item/dogborg/sleeper/compactor/syndie/MD = new /obj/item/dogborg/sleeper/compactor/syndie(src) MD.metal = metal MD.glass = glass @@ -129,6 +107,8 @@ src.modules += new /obj/item/dogborg/pounce(src) + src.modules += new /obj/item/robotic_multibelt/materials(src) + // Mediborg optimized for on-the-field healing, but can also do surgery if needed. @@ -143,19 +123,12 @@ // Surgery things. src.modules += new /obj/item/autopsy_scanner(src) - src.modules += new /obj/item/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/surgical/hemostat/cyborg(src) - src.modules += new /obj/item/surgical/retractor/cyborg(src) - src.modules += new /obj/item/surgical/cautery/cyborg(src) - src.modules += new /obj/item/surgical/bonegel/cyborg(src) - src.modules += new /obj/item/surgical/FixOVein/cyborg(src) - src.modules += new /obj/item/surgical/bonesetter/cyborg(src) - src.modules += new /obj/item/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/surgical/surgicaldrill/cyborg(src) - src.modules += new /obj/item/gripper/no_use/organ(src) + src.modules += new /obj/item/robotic_multibelt/medical(src) + src.modules += new /obj/item/robotic_multibelt/medical(src) + src.modules += new /obj/item/gripper/medical(src) + src.modules += new /obj/item/robotic_multibelt/materials(src) // General healing. - src.modules += new /obj/item/gripper/medical(src) src.modules += new /obj/item/shockpaddles/robot/combat(src) src.modules += new /obj/item/reagent_containers/dropper(src) // Allows borg to fix necrosis apparently src.modules += new /obj/item/reagent_containers/syringe(src) diff --git a/code/modules/mob/living/silicon/robot/robot_simple_items.dm b/code/modules/mob/living/silicon/robot/robot_simple_items.dm new file mode 100644 index 0000000000..21005ee296 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_simple_items.dm @@ -0,0 +1,896 @@ +// Robot toolbelts, such as screwdrivers and the like. All contained in one neat little package. +// The code for actually 'how these use the item inside of them instead of the item itself' can be found in _onclick/cyborg.dm (yes, click code, gross, I know.) +/* + * Engineering Tools + */ + +/obj/item/robotic_multibelt + name = "Robotic multitool" + desc = "An integrated toolbelt. Use CTRL-CLICK to interact with the selected item!" + + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_engiborg" + w_class = ITEMSIZE_HUGE + + var/obj/item/selected_item = null + + var/list/cyborg_integrated_tools = list( + /obj/item/tool/screwdriver/cyborg = null, + /obj/item/tool/wrench/cyborg = null, + /obj/item/tool/crowbar/cyborg = null, + /obj/item/tool/wirecutters/cyborg = null, + /obj/item/multitool/cyborg = null, + /obj/item/weldingtool/electric/mounted/cyborg = null, + ) + + var/list/integrated_tools_by_name + + var/list/integrated_tool_images + +/obj/item/robotic_multibelt/CtrlClick(mob/user) + if(selected_item) + selected_item.attack_self(user) + return + +/obj/item/robotic_multibelt/examine(mob/user) + . = ..() + if(selected_item) + . += span_notice("\The [src] is currently set to \the [selected_item].") + . += selected_item.examine(user) + +/obj/item/robotic_multibelt/proc/get_module() + var/obj/item/robot_module/module + if(isrobot(loc)) //We're in a robot (in hands) + var/mob/living/silicon/robot/our_robot = loc + module = our_robot.module + else if(istype(loc, /obj/item/robot_module)) //We're inside the module itself (in inventory) + module = loc + else //Admin spawned us outside of a module. + CRASH("Robotic Multibelt is not in a robot or module. This should not happen.") + return module + + +//'Alterate Tools' means we do special tool handling in Init +/obj/item/robotic_multibelt/Initialize(mapload, custom_handling = FALSE) + . = ..() + generate_tools() + +/obj/item/robotic_multibelt/proc/generate_tools() + integrated_tools_by_name = list() + + integrated_tool_images = list() + + for(var/path in cyborg_integrated_tools) + if(ispath(path)) //Some things like the materials printer makes its own tools and it won't be a path. + if(!cyborg_integrated_tools[path]) + cyborg_integrated_tools[path] = new path(src) + else + cyborg_integrated_tools[path] = path + var/obj/item/I = cyborg_integrated_tools[path] + I.canremove = FALSE + + for(var/tool in cyborg_integrated_tools) + var/obj/item/real_tool = cyborg_integrated_tools[tool] + integrated_tools_by_name[real_tool.name] = real_tool + integrated_tool_images[real_tool.name] = image(icon = real_tool.icon, icon_state = real_tool.icon_state) + +/obj/item/robotic_multibelt/Destroy() + selected_item = null + QDEL_LIST_ASSOC_VAL(cyborg_integrated_tools) + integrated_tools_by_name.Cut() + integrated_tool_images.Cut() + . = ..() + + +/obj/item/robotic_multibelt/attack_self(mob/user) + if(!cyborg_integrated_tools || !LAZYLEN(cyborg_integrated_tools)) + to_chat(user, "Your multibelt is empty!") + return + + var/list/options = list() + + for(var/Iname in integrated_tools_by_name) + options[Iname] = integrated_tool_images[Iname] + + var/list/choice = list() + if(length(options) == 1) + for(var/key in options) + choice = key + else + choice = show_radial_menu(user, src, options, radius = 40, require_near = TRUE) + if(!choice) + return + assume_selected_item(integrated_tools_by_name[choice]) + + ..() + +/obj/item/robotic_multibelt/proc/assume_selected_item(obj/item/chosen_item) + if(!chosen_item) + return + icon = chosen_item.icon + icon_state = chosen_item.icon_state + selected_item = chosen_item + +/obj/item/robotic_multibelt/dropped(mob/user) + ..() + //We go back to our initial values. + original_state() + +/obj/item/robotic_multibelt/proc/original_state(mob/user) + selected_item = null + icon = initial(icon) + icon_state = initial(icon_state) + +/obj/item/tool/screwdriver/cyborg + name = "powered screwdriver" + desc = "An electrical screwdriver, designed to be both precise and quick." + usesound = 'sound/items/drill_use.ogg' + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_engiborg_screwdriver" + random_color = FALSE + toolspeed = 0.5 + +/obj/item/tool/crowbar/cyborg + name = "hydraulic crowbar" + desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbars in industrial synthetics." + usesound = 'sound/items/jaws_pry.ogg' + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_engiborg_crowbar" + force = 10 + toolspeed = 0.5 + +/obj/item/weldingtool/electric/mounted/cyborg + name = "integrated electric welding tool" + desc = "An advanced welder designed to be used in robotic systems." + icon = 'icons/obj/tools_robot.dmi' + icon_state = "indwelder_cyborg" + usesound = 'sound/items/Welder2.ogg' + toolspeed = 0.5 + welding = TRUE + +/obj/item/tool/wirecutters/cyborg + name = "wirecutters" + desc = "This cuts wires. With science." + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_engiborg_cutters" + usesound = 'sound/items/jaws_cut.ogg' + random_color = FALSE + toolspeed = 0.5 + +/obj/item/tool/wrench/cyborg + name = "automatic wrench" + desc = "An advanced robotic wrench. Can be found in industrial synthetic shells." + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_engiborg_wrench" + usesound = 'sound/items/drill_use.ogg' + toolspeed = 0.5 + +/obj/item/multitool/cyborg + name = "multitool" + desc = "Optimised and stripped-down version of a regular multitool." + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_engiborg_multitool" + toolspeed = 0.5 + +/obj/item/stack/cable_coil/cyborg + name = "cable coil synthesizer" + desc = "A device that makes cable." + gender = NEUTER + matter = null + uses_charge = 1 + charge_costs = list(1) + +/obj/item/stack/cable_coil/cyborg/verb/set_colour() + set name = "Change Colour" + set category = "Object" + + var/selected_type = tgui_input_list(usr, "Pick new colour.", "Cable Colour", GLOB.possible_cable_coil_colours) + set_cable_color(selected_type, usr) + +/* + * Surgical Tools + */ + +/obj/item/robotic_multibelt/medical + name = "Robotic surgical multitool" + desc = "An integrated surgical toolbelt." + icon_state = "toolkit_medborg" + + cyborg_integrated_tools = list( + /obj/item/surgical/retractor/cyborg = null, + /obj/item/surgical/hemostat/cyborg = null, + /obj/item/surgical/cautery/cyborg = null, + /obj/item/surgical/surgicaldrill/cyborg = null, + /obj/item/surgical/scalpel/cyborg = null, + /obj/item/surgical/circular_saw/cyborg = null, + /obj/item/surgical/bonegel/cyborg = null, + /obj/item/surgical/FixOVein/cyborg = null, + /obj/item/surgical/bonesetter/cyborg = null, + /obj/item/surgical/bioregen/cyborg = null, + /obj/item/autopsy_scanner = null + ) + +/obj/item/surgical/retractor/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_medborg_retractor" + toolspeed = 0.5 + +/obj/item/surgical/hemostat/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_medborg_hemostat" + toolspeed = 0.5 + +/obj/item/surgical/cautery/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_medborg_cautery" + toolspeed = 0.5 + +/obj/item/surgical/surgicaldrill/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_medborg_drill" + toolspeed = 0.5 + +/obj/item/surgical/scalpel/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_medborg_scalpel" + toolspeed = 0.5 + +/obj/item/surgical/circular_saw/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_medborg_saw" + toolspeed = 0.5 + +/obj/item/surgical/bonegel/cyborg + toolspeed = 0.5 + +/obj/item/surgical/FixOVein/cyborg + toolspeed = 0.5 + +/obj/item/surgical/bonesetter/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "toolkit_medborg_bonesetter" + toolspeed = 0.5 + +/obj/item/surgical/bioregen/cyborg + icon_state = "cyborg_bioregen" + toolspeed = 0.5 + +//Service multibelt! +/obj/item/robotic_multibelt/service + name = "Service multitool" + desc = "An integrated service toolbelt." + icon_state = "toolkit_medborg" + + cyborg_integrated_tools = list( + /obj/item/material/minihoe/cyborg = null, + /obj/item/material/knife/machete/hatchet/cyborg = null, + /obj/item/analyzer/plant_analyzer/cyborg = null, + /obj/item/material/knife/cyborg = null, + /obj/item/robot_harvester = null, + /obj/item/material/kitchen/rollingpin/cyborg = null, + /obj/item/tool/wirecutters/cyborg = null, + /obj/item/multitool/cyborg = null, + /obj/item/reagent_containers/spray = null + ) + +//Botanical multibelt! +/obj/item/robotic_multibelt/botanical + name = "Botanical multitool" + desc = "An integrated botanical toolbelt." + icon_state = "toolkit_medborg" + + cyborg_integrated_tools = list( + /obj/item/material/minihoe/cyborg = null, + /obj/item/material/knife/machete/hatchet/cyborg = null, + /obj/item/analyzer/plant_analyzer/cyborg = null, + /obj/item/robot_harvester = null, + /obj/item/tool/wirecutters/cyborg = null, + /obj/item/multitool/cyborg = null, + /obj/item/reagent_containers/spray = null + ) + +/obj/item/material/minihoe/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "sili_cultivator" + +/obj/item/material/knife/machete/hatchet/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "sili_hatchet" + +/obj/item/analyzer/plant_analyzer/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "sili_secateur" + + +/obj/item/material/knife/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "sili_knife" + +/obj/item/material/kitchen/rollingpin/cyborg + icon = 'icons/obj/tools_robot.dmi' + icon_state = "sili_rolling_pin" + +//Admin proc to add new materials to their fabricator +/mob/living/silicon/robot/proc/add_new_material(mat_to_add) //Allows us to add a new material to the borg's synth and then make their multibelt refresh. + if(!module) + return + + if(!mat_to_add) + return + + var/datum/matter_synth/synth_path = ispath(mat_to_add) ? mat_to_add : GLOB.material_synth_list[mat_to_add] + + if(!can_install_synth(synth_path)) + return + + var/amount + switch(mat_to_add) + if(/datum/matter_synth/metal) + amount = 40000 + if(/datum/matter_synth/plasteel) + amount = 20000 + if(/datum/matter_synth/glass) + amount = 40000 + if(/datum/matter_synth/wood) + amount = 40000 + if(/datum/matter_synth/plastic) + amount = 40000 + if(/datum/matter_synth/wire) + amount = 50 + if(/datum/matter_synth/cloth) + amount = 40000 + + if(!amount) + return + + module.synths += new synth_path(amount) + update_material_multibelts() + +/mob/living/silicon/robot/proc/update_material_multibelts() + for(var/obj/item/robotic_multibelt/materials/mat_belt in module.contents) //If it's stowed in our inventory + mat_belt.generate_tools() + for(var/obj/item/robotic_multibelt/materials/mat_belt in contents) //If it's in our handstory + mat_belt.generate_tools() + +/mob/living/silicon/robot/proc/can_install_synth(var/datum/matter_synth/type_to_check) + if(!ispath(type_to_check, /datum/matter_synth)) + return FALSE + for(var/datum/matter_synth/synth in module.synths) + if(istype(synth, type_to_check)) + return FALSE + return TRUE + +/mob/living/silicon/robot/proc/remove_material(mat_to_remove) + if(!module) + return + + if(!mat_to_remove) + return + + var/datum/matter_synth/synth_path = ispath(mat_to_remove) ? mat_to_remove : GLOB.material_synth_list[mat_to_remove] + + for(var/datum/matter_synth/synth in module.synths) + if(istype(synth, synth_path)) + module.synths -= synth + qdel(synth) + update_material_multibelts() + +//The Material Dispenser Multibelt +//This thing is uh...Bulky. And took a lot of effort to get to work. + +/obj/item/robotic_multibelt/materials + name = "Robotic Material Dispenser" + desc = "An integrated material dispenser! Click once to select your material. Use Ctrl + Click to open the menu for the selected material." + icon_state = "toolkit_material" + + cyborg_integrated_tools = list() + +/obj/item/robotic_multibelt/materials/generate_tools() + var/obj/item/robot_module/module = get_module() + if(!module || !module.synths || !LAZYLEN(module.synths)) //We have a synths list and it has contents within it! + return + + var/datum/matter_synth/has_steel //Steel synth. For generating Rglass + var/datum/matter_synth/has_glass //Glass synth. For generating Rglass + for(var/datum/matter_synth/our_synth in module.synths) + if(our_synth.name == METAL_SYNTH) + has_steel = our_synth + continue + if(our_synth.name == GLASS_SYNTH) + has_glass = our_synth + continue + + var/list/possible_synths = list() + for(var/datum/matter_synth/our_synth in module.synths) + switch(our_synth.name) + if(METAL_SYNTH) + possible_synths += list(/obj/item/stack/material/cyborg/steel = list(our_synth)) + possible_synths += list(/obj/item/stack/tile/floor/cyborg = list(our_synth)) + possible_synths += list(/obj/item/stack/rods/cyborg = list(our_synth)) + possible_synths += list(/obj/item/stack/tile/roofing/cyborg = list(our_synth)) + if(has_glass) + possible_synths |= list(/obj/item/stack/material/cyborg/glass/reinforced = list(our_synth, has_glass)) + if(PLASTEEL_SYNTH) + possible_synths += list(/obj/item/stack/material/cyborg/plasteel = list(our_synth)) + if(GLASS_SYNTH) + possible_synths += list(/obj/item/stack/material/cyborg/glass = list(our_synth)) + if(has_steel) + possible_synths |= list(/obj/item/stack/material/cyborg/glass/reinforced = list(our_synth, has_steel)) + if(WOOD_SYNTH) + possible_synths += list(/obj/item/stack/tile/wood/cyborg = list(our_synth)) + possible_synths += list(/obj/item/stack/material/cyborg/wood = list(our_synth)) + if(PLASTIC_SYNTH) + possible_synths += list(/obj/item/stack/material/cyborg/plastic = list(our_synth)) + if(WIRE_SYNTH) + possible_synths += list(/obj/item/stack/cable_coil/cyborg = list(our_synth)) + if(CLOTH_SYNTH) + possible_synths += list(/obj/item/stack/sandbags/cyborg = list(our_synth)) + + for(var/obj/item/stack/our_item in cyborg_integrated_tools) + if(is_type_in_list(our_item, possible_synths)) + possible_synths -= our_item.type + else + cyborg_integrated_tools -= our_item + integrated_tools_by_name -= our_item + integrated_tool_images -= our_item + qdel(our_item) + + for(var/stack_to_add in possible_synths) + var/obj/item/stack/current_stack = new stack_to_add(src) + current_stack.synths = possible_synths[stack_to_add] + cyborg_integrated_tools += current_stack + + . = ..() + +/* + * Grippers + */ + +//Simple borg hand. +//Limited use. +//If you want to add more items to the gripper, add them to the global define list for that gripper. +/obj/item/gripper + name = "magnetic gripper" + desc = "A simple grasping tool specialized in construction and engineering work." + description_info = "Ctrl-Clicking on the gripper will interact with whatever it is holding.
\ + Alt-Clicking on the gripper will drop the item it is holding.
\ + Using an object on the gripper will interact with the item inside it, if it exists, instead." + icon = 'icons/obj/device.dmi' + icon_state = "gripper" + + flags = NOBLUDGEON + + //Has a list of items that it can hold. + var/list/can_hold = list(BASIC_GRIPPER) + + var/obj/item/wrapped = null // Item currently being held. + + var/total_pockets = 5 //How many total inventory slots we want to have in the gripper + + var/list/pockets = list() //List of the pockets we have. This is used to store the items inside of the gripper. + + var/obj/item/current_pocket = null //What pocket (or item!) we currently have selected + + var/list/pockets_by_name + + var/list/photo_images + + pickup_sound = 'sound/items/pickup/device.ogg' + drop_sound = 'sound/items/drop/device.ogg' + +/obj/item/storage/internal/gripper + max_w_class = ITEMSIZE_HUGE + max_storage_space = ITEMSIZE_COST_HUGE + +/obj/item/gripper/Initialize(mapload) + . = ..() + + if(total_pockets) + for(var/i = 1, i <= total_pockets, i++) + var/obj/new_pocket = new /obj/item/storage/internal/gripper(src) + new_pocket.name = "Pocket [i]" + pockets += new_pocket + current_pocket = pick(pockets) //Pick a random pocket! + +/obj/item/gripper/Destroy() + current_pocket = null + qdel_null(wrapped) + qdel_null(pockets) + . = ..() + + +/obj/item/gripper/examine(mob/user) + . = ..() + if(wrapped) + . += span_notice("\The [src] is holding \the [wrapped].") + . += wrapped.examine(user) + +/obj/item/gripper/CtrlClick(mob/user) + if(wrapped) + wrapped.attack_self(user) + return + +/obj/item/gripper/AltClick(mob/user) + drop_item() + return + + +//This is the code that updates our pockets and decides if they should have icons or not. +//This should be called every time we use the gripper and our wrapped item is used up. +/obj/item/gripper/proc/generate_icons() + if(LAZYLEN(pockets)) + + pockets_by_name = list() + + photo_images = list() + + for(var/obj/item/storage/internal/pocket_to_check in pockets) + if(!LAZYLEN(pocket_to_check.contents)) + pockets_by_name[pocket_to_check.name] = pocket_to_check + photo_images[pocket_to_check.name] = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing") + continue + var/obj/item/pocket_content = pocket_to_check.contents[1] + pockets_by_name["[pocket_to_check.name]" + "[pocket_content.name]"] = pocket_content + photo_images["[pocket_to_check.name]" + "[pocket_content.name]"] = image(icon = pocket_content.icon, icon_state = pocket_content.icon_state) + +/obj/item/gripper/attack_self(mob/user as mob) + generate_icons() + var/list/options = list() + + for(var/Iname in pockets_by_name) + options[Iname] = photo_images[Iname] + + var/list/choice = list() + choice = show_radial_menu(user, src, options, radius = 40, require_near = TRUE, autopick_single_option = FALSE) + if(choice) + current_pocket = pockets_by_name[choice] + if(!istype(current_pocket,/obj/item/storage/internal/gripper)) //The pocket we're selecting is NOT a gripper storage + if(!istype(current_pocket.loc, /obj/item/storage/internal/gripper)) //We kept the radial menu opened, used the item, then selected it again. + current_pocket = pick(pockets) //Just pick a random pocket. + wrapped = null + else + wrapped = current_pocket + else + wrapped = null + else if(wrapped) + return wrapped.attack_self(user) + return ..() + +/obj/item/gripper/attackby(var/obj/item/O, var/mob/user) + if(wrapped) + wrapped.loc = src.loc //Place it in to the robot. + var/resolved = wrapped.attackby(O, user) + if(QDELETED(wrapped) || (wrapped.loc != src.loc && !istype(wrapped.loc,/obj/item/storage/internal/gripper))) + wrapped = null + if(!resolved && wrapped && O) + O.afterattack(wrapped,user,1) + if(QDELETED(wrapped) || (wrapped.loc != src.loc && !istype(wrapped.loc,/obj/item/storage/internal/gripper))) // I don't know of a nicer way to do this. + wrapped = null + if(wrapped && wrapped != current_pocket) + wrapped.loc = current_pocket + else if(wrapped) + for(var/obj/item/storage/internal/gripper/our_pocket in pockets) + if(LAZYLEN(our_pocket.contents)) + continue + current_pocket = our_pocket + wrapped.loc = current_pocket + + return resolved + return ..() + +/obj/item/gripper/verb/drop_gripper_item() + + set name = "Drop Item" + set desc = "Release an item from your magnetic gripper." + set category = "Abilities.Silicon" + + drop_item() + +/obj/item/gripper/proc/drop_item() + if((wrapped == current_pocket && !istype(wrapped.loc, /obj/item/storage/internal/gripper))) //We have wrapped selected as our current_pocket AND wrapped is not in a gripper storage + wrapped = null + current_pocket = pick(pockets) + generate_icons() + return + + to_chat(src.loc, span_notice("You drop \the [wrapped].")) + wrapped.loc = get_turf(src) + wrapped = null + generate_icons() + //update_icon() + +/obj/item/gripper/proc/drop_item_nm() + if((wrapped == current_pocket && !istype(wrapped.loc, /obj/item/storage/internal/gripper))) //We have wrapped selected as our current_pocket AND wrapped is not in a gripper storage + wrapped = null + current_pocket = pick(pockets) + return + + wrapped.loc = get_turf(src) + wrapped = null + +/obj/item/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack(). + if(QDELETED(wrapped) || (wrapped.loc != src.loc && !istype(wrapped.loc,/obj/item/storage/internal/gripper))) //If our wrapper was deleted OR it's no longer in our internal gripper storage + wrapped = null //we become null + else + wrapped.attack(M,user) + M.attackby(wrapped, user) //attackby reportedly gets procced by being clicked on, at least according to Anewbe. + if(QDELETED(wrapped) || (wrapped.loc != src.loc && !istype(wrapped.loc,/obj/item/storage/internal/gripper))) //If our wrapper was deleted OR it's no longer in our internal gripper storage + wrapped = null + if(wrapped) //In the event nothing happened to wrapped, go back into the gripper. + wrapped.loc = current_pocket + return 1 + return 0 + +/obj/item/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params) + + if(!proximity) + return // This will prevent them using guns at range but adminbuse can add them directly to modules, so eh. + var/current_pocket_full = FALSE + //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z + if(wrapped == current_pocket) + current_pocket_full = TRUE + if(!wrapped && current_pocket) + if(LAZYLEN(current_pocket.contents)) + wrapped = current_pocket.contents[1] + current_pocket_full = TRUE + + if(current_pocket && !LAZYLEN(current_pocket.contents)) //We have a pocket selected and it has no contents! This means we're an item OR we need to null our wrapper! + if(istype(current_pocket.loc,/obj/item/storage/internal/gripper) && !LAZYLEN(current_pocket.loc.contents)) //If our pocket is a gripper, AND we have no contents, wrapped = null + wrapped = null + else if(!istype(current_pocket.loc,/obj/item/storage/internal/gripper)) //If our pocket is an item and we are not in the gripper, wrapped = null + wrapped = null + + if(!LAZYLEN(pockets)) //Shouldn't happen, but safety first. + to_chat(user, span_danger("Your gripper has nowhere to hold \the [target].")) + return + + var/obj/item/storage/internal/gripper/selected_pocket //Find an open pocket to use in case we're trying to pick something up. + for(var/obj/item/storage/internal/gripper/available_pocket in pockets) + if(LAZYLEN(available_pocket.contents)) + continue + selected_pocket = available_pocket + break + + if(wrapped) //Already have an item. + //Temporary put wrapped into user so target's attackby() checks pass. + var/obj/previous_pocket = wrapped.loc + wrapped.loc = user + + //Pass the attack on to the target. This might delete/relocate wrapped. + var/resolved = target.attackby(wrapped,user) + if(!resolved && wrapped && target) + wrapped.afterattack(target,user,1) + + //If wrapped was neither deleted nor put into target, put it back into the gripper. + if(wrapped && user && ((wrapped.loc == user) || wrapped.loc == previous_pocket)) + wrapped.loc = previous_pocket + else + wrapped = null + return + else if(current_pocket_full) //Pocket is full. No grabbing more things. + to_chat(user, "Your gripper is currently full! You can't pick anything else up!") + return + + else if(istype(target,/obj/item)) //Check that we're not pocketing a mob. + + //...and that the item is not in a container. + if(!isturf(target.loc)) + return + + var/obj/item/I = target + + if(I.anchored) + to_chat(user,span_notice("You are unable to lift \the [I] from \the [I.loc].")) + return + + //Check if the item is blacklisted. + var/grab = 0 + for(var/typepath in can_hold) + if(istype(I,typepath)) + grab = 1 + break + + //We can grab the item, finally. + if(grab) + to_chat(user, "You collect \the [I].") + I.loc = selected_pocket + wrapped = I + return + else + to_chat(user, span_danger("Your gripper cannot hold \the [target].")) + + else if(istype(target,/obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = target + if(A.opened) + if(A.cell && is_type_in_list(A.cell, can_hold)) + + wrapped = A.cell + + A.cell.add_fingerprint(user) + A.cell.update_icon() + A.cell.loc = selected_pocket + A.cell = null + + A.charging = 0 + A.update_icon() + + user.visible_message(span_danger("[user] removes the power cell from [A]!"), "You remove the power cell.") + + else if(istype(target,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/A = target + if(A.opened) + if(A.cell && is_type_in_list(A.cell, can_hold)) + + wrapped = A.cell + + A.cell.add_fingerprint(user) + A.cell.update_icon() + A.update_icon() + A.cell.loc = current_pocket + A.cell = null + + user.visible_message(span_danger("[user] removes the power cell from [A]!"), "You remove the power cell.") + + +//Different types of grippers! + +/obj/item/gripper/engineering + name = "Engineering Gripper" + desc = "An integrated Engineering Gripper." + icon_state = "gripper-omni" + can_hold = list(BASIC_GRIPPER, CIRCUIT_GRIPPER, SHEET_GRIPPER) + +/obj/item/gripper/drone + name = "Drone Gripper" + desc = "An integrated Drone Gripper." + icon_state = "gripper-old" + can_hold = list(BASIC_GRIPPER, SHEET_GRIPPER) + +/obj/item/gripper/omni + name = "omni gripper" + desc = "A strange grasping tool that can hold anything a human can, but still maintains the limitations of application its more limited cousins have." + icon_state = "gripper-omni" + + can_hold = list(OMNI_GRIPPER) // Testing and Event gripper. + +// VEEEEERY limited version for mining borgs. Basically only for swapping cells and upgrading the drills. +/obj/item/gripper/miner + name = "drill maintenance gripper" + desc = "A simple grasping tool for the maintenance of heavy drilling machines." + icon_state = "gripper-mining" + + can_hold = list(MINER_GRIPPER) + +/obj/item/gripper/security + name = "security gripper" + desc = "A simple grasping tool for corporate security work." + icon_state = "gripper-sec" + + can_hold = list(SECURITY_GRIPPER) + +/obj/item/gripper/paperwork + name = "paperwork gripper" + desc = "A simple grasping tool for clerical work." + + can_hold = list(PAPERWORK_GRIPPER) + +/obj/item/gripper/medical + name = "medical gripper" + desc = "A simple grasping tool for medical work." + icon_state = "gripper-flesh" + + can_hold = list(BASIC_GRIPPER, ORGAN_GRIPPER, MEDICAL_GRIPPER) + +/obj/item/gripper/research //A general usage gripper, used for toxins/robotics/xenobio/etc + name = "scientific gripper" + icon_state = "gripper-sci" + desc = "A simple grasping tool suited to assist in a wide array of research applications." + + can_hold = list(BASIC_GRIPPER, CIRCUIT_GRIPPER, SHEET_GRIPPER, EXOSUIT_GRIPPER, ROBOTICS_ORGAN_GRIPPER, RESEARCH_GRIPPER) + +/obj/item/gripper/circuit + name = "circuit assembly gripper" + icon_state = "gripper-circ" + desc = "A complex grasping tool used for working with circuitry." + + can_hold = list(CIRCUIT_GRIPPER) + +/obj/item/gripper/service //Used to handle food, drinks, and seeds. + name = "service gripper" + icon_state = "gripper-sheet" + desc = "A simple grasping tool used to perform tasks in the service sector, such as handling food, drinks, and seeds." + + can_hold = list(SERVICE_GRIPPER) + +/obj/item/gripper/gravekeeper //Used for handling grave things, flowers, etc. + name = "grave gripper" + icon_state = "gripper-old" + desc = "A specialized grasping tool used in the preparation and maintenance of graves." + + can_hold = list(GRAVEYARD_GRIPPER) + +/obj/item/gripper/scene + name = "misc gripper" + desc = "A simple grasping tool that can hold a variety of 'general' objects..." + + can_hold = list(SCENE_GRIPPER) + +/obj/item/gripper/no_use/organ + name = "organ gripper" + icon_state = "gripper-flesh" + desc = "A specialized grasping tool used to preserve and manipulate organic material." + + can_hold = list(ORGAN_GRIPPER) + +/obj/item/gripper/no_use/organ/Entered(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 1 + for(var/obj/item/organ/organ in O) + organ.preserved = 1 + ..() + +/obj/item/gripper/no_use/organ/Exited(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 0 + for(var/obj/item/organ/organ in O) + organ.preserved = 0 + ..() + +/obj/item/gripper/no_use/organ/robotics + name = "robotics organ gripper" + icon_state = "gripper-flesh" + desc = "A specialized grasping tool used in robotics work." + + can_hold = list(ROBOTICS_ORGAN_GRIPPER) + +/obj/item/gripper/no_use/mech + name = "exosuit gripper" + icon_state = "gripper-mech" + desc = "A large, heavy-duty grasping tool used in construction of mechs." + + can_hold = list(EXOSUIT_GRIPPER) + +/obj/item/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item + +/obj/item/gripper/no_use/attack_self(mob/user as mob) + return + +/obj/item/gripper/no_use/loader //This is used to disallow building with metal. + name = "sheet loader" + desc = "A specialized loading device, designed to pick up and insert sheets of materials inside machines." + icon_state = "gripper-sheet" + + can_hold = list(SHEET_GRIPPER) + +/* + * Misc tools + */ +/obj/item/reagent_containers/glass/bucket/cyborg + var/mob/living/silicon/robot/R + var/last_robot_loc + +/obj/item/reagent_containers/glass/bucket/cyborg/Initialize(mapload) + . = ..() + R = loc.loc + RegisterSignal(src, COMSIG_OBSERVER_MOVED, PROC_REF(check_loc)) + +/obj/item/reagent_containers/glass/bucket/cyborg/proc/check_loc(atom/movable/mover, atom/old_loc, atom/new_loc) + if(old_loc == R || old_loc == R.module) + last_robot_loc = old_loc + if(!istype(loc, /obj/machinery) && loc != R && loc != R.module) + if(last_robot_loc) + forceMove(last_robot_loc) + last_robot_loc = null + else + forceMove(R) + if(loc == R) + hud_layerise() + +/obj/item/reagent_containers/glass/bucket/cyborg/Destroy() + UnregisterSignal(src, COMSIG_OBSERVER_MOVED) + R = null + last_robot_loc = null + ..() diff --git a/code/modules/mob/living/silicon/robot/subtypes/boozeborg.dm b/code/modules/mob/living/silicon/robot/subtypes/boozeborg.dm index b1a1655670..faeab03443 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/boozeborg.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/boozeborg.dm @@ -49,14 +49,14 @@ What Borgs are available is sadly handled in the above file in the proc /obj/item/robot_module/robot/booze/create_equipment(mob/living/silicon/robot/robot) ..() src.modules += new /obj/item/gripper/service(src) - //src.modules += new /obj/item/reagent_containers/glass/bucket(src) + //src.modules += new /obj/item/reagent_containers/glass/bucket/cyborg(src) //src.modules += new /obj/item/material/minihoe(src) //src.modules += new /obj/item/analyzer/plant_analyzer(src) //src.modules += new /obj/item/storage/bag/plants(src) //src.modules += new /obj/item/robot_harvester(src) src.modules += new /obj/item/material/knife(src) src.modules += new /obj/item/material/kitchen/rollingpin(src) - src.modules += new /obj/item/multitool(src) //to freeze trays + src.modules += new /obj/item/multitool/cyborg(src) //to freeze trays src.modules += new /obj/item/dogborg/jaws/small(src) src.modules += new /obj/item/dogborg/boop_module(src) src.modules += new /obj/item/dogborg/sleeper/compactor/brewer(src) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm index d689423e92..1fdb259c52 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm @@ -775,7 +775,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? /mob/living/simple_mob/vore/alienanimals/teppi/Destroy() GLOB.teppi_count -- friend_zone = null - active_ghost_pods -= src + GLOB.active_ghost_pods -= src ai_holder.leader = null return ..() @@ -940,7 +940,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? eye_color = baby.eye_color skin_color = baby.skin_color ghostjoin = 1 - active_ghost_pods |= src + GLOB.active_ghost_pods |= src update_icon() //This sets all the things on baby teppi when they are bred from adult teppi diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm index 28a70575f9..d3af70f384 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm @@ -144,12 +144,10 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have? if(!stat) amount_grown += rand(1,2) if(amount_grown >= 100) - //VOREStation Edit Begin var/mob/living/simple_mob/animal/passive/chicken/C = new (src.loc) C.ghostjoin = 1 C.ghostjoin_icon() - active_ghost_pods |= C - //VOREStation Edit End + GLOB.active_ghost_pods |= C qdel(src) // Say Lists diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 794de7c6fe..0fe00033f9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -56,7 +56,7 @@ //CHOMPAdd Start /mob/living/simple_mob/animal/passive/mouse/Destroy() - active_ghost_pods -= src + GLOB.active_ghost_pods -= src return ..() //CHOMPAdd End @@ -65,7 +65,7 @@ //CHOMPAdd Start ghostjoin = 1 ghostjoin_icon() - active_ghost_pods += src + GLOB.active_ghost_pods += src //CHOMPAdd End add_verb(src, /mob/living/proc/ventcrawl) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm index ff878ff7e7..1b62968e9d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm @@ -41,11 +41,11 @@ . = ..() ghostjoin = 1 ghostjoin_icon() - active_ghost_pods |= src + GLOB.active_ghost_pods += src /mob/living/simple_mob/animal/passive/raccoon_ch/Destroy() - active_ghost_pods -= src - return ..() + GLOB.active_ghost_pods -= src + . = ..() /datum/say_list/raccoon_ch speak = list("HSSSSS") diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index 40446ea3d7..43235cb7a8 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -107,7 +107,7 @@ real_desc = desc desc = "Scan this to find out more information." //at the moment only used for the OM location renamer. Initializing here in case we want shuttles incl as well in future. Also proc definition convenience. - visitable_overmap_object_instances |= src + GLOB.visitable_overmap_object_instances += src //To be used by GMs and calling through var edits for the overmap object //It causes the overmap object to "reinitialize" its real_appearance for known = FALSE objects diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ac0681c02b..4c2fdf19be 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -519,14 +519,6 @@ GLOBAL_LIST_INIT(possible_cable_coil_colours, list( tool_qualities = list(TOOL_CABLE_COIL) singular_name = "cable" -/obj/item/stack/cable_coil/cyborg - name = "cable coil synthesizer" - desc = "A device that makes cable." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(1) - /obj/item/stack/cable_coil/Initialize(mapload, length = MAXCOIL, var/param_color = null) . = ..() amount = length @@ -626,13 +618,6 @@ GLOBAL_LIST_INIT(possible_cable_coil_colours, list( else to_chat(M, span_notice("You cannot do that.")) -/obj/item/stack/cable_coil/cyborg/verb/set_colour() - set name = "Change Colour" - set category = "Object" - - var/selected_type = tgui_input_list(usr, "Pick new colour.", "Cable Colour", GLOB.possible_cable_coil_colours) - set_cable_color(selected_type, usr) - // Items usable on a cable coil : // - Wirecutters : cut them duh ! // - Cable coil : merge cables diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm index 78a046a446..de21629f0e 100644 --- a/code/modules/vore/eating/bellymodes_datum_vr.dm +++ b/code/modules/vore/eating/bellymodes_datum_vr.dm @@ -259,8 +259,8 @@ GLOBAL_LIST_INIT(digest_modes, list()) egg_contents += E if(egg_contents.len) if(!B.ownegg) - if(B.egg_type in tf_vore_egg_types) - B.egg_path = tf_vore_egg_types[B.egg_type] + if(B.egg_type in GLOB.tf_vore_egg_types) + B.egg_path = GLOB.tf_vore_egg_types[B.egg_type] B.ownegg = new B.egg_path(B) if(B.ownegg && B.egg_name) B.ownegg.egg_name = B.egg_name diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index bed9ad6d01..deeef1777d 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -889,7 +889,7 @@ to_chat(src, span_notice("You are not holding anything.")) return - if(is_type_in_list(I,edible_trash) || adminbus_trash || is_type_in_list(I,edible_tech) && isSynthetic()) // adds edible tech for synth + if(is_type_in_list(I, GLOB.edible_trash) || adminbus_trash || is_type_in_list(I,edible_tech) && isSynthetic()) // adds edible tech for synth if(!I.on_trash_eaten(src)) // shows object's rejection message itself return drop_item() diff --git a/code/modules/vore/eating/transforming_vr.dm b/code/modules/vore/eating/transforming_vr.dm index 53938c2305..7c0234317f 100644 --- a/code/modules/vore/eating/transforming_vr.dm +++ b/code/modules/vore/eating/transforming_vr.dm @@ -3,8 +3,8 @@ var/egg_path = /obj/structure/closet/secure_closet/egg var/egg_name = "odd egg" - if(O.vore_egg_type in tf_vore_egg_types) - egg_path = tf_vore_egg_types[O.vore_egg_type] + if(O.vore_egg_type in GLOB.tf_vore_egg_types) + egg_path = GLOB.tf_vore_egg_types[O.vore_egg_type] egg_name = "[O.vore_egg_type] egg" var/obj/structure/closet/secure_closet/egg/egg = new egg_path(src) diff --git a/code/modules/xenoarcheaology/artifacts/replicator_vr.dm b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm index 0b45933290..52b49c2b18 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator_vr.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm @@ -211,7 +211,7 @@ /obj/machinery/replicator/vore/attackby(obj/item/W as obj, mob/living/user as mob) - if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W,item_vore_blacklist)) //No armblades, no putting possessed items in it! + if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W, GLOB.item_vore_blacklist)) //No armblades, no putting possessed items in it! to_chat(user, span_notice("You cannot put \the [W] into the machine.")) return if(istype(W, /obj/item/holder/micro)) //Are you putting a micro in it? @@ -478,7 +478,7 @@ last_process_time = world.time /obj/machinery/replicator/clothing/attackby(obj/item/W as obj, mob/living/user as mob) - if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W,item_vore_blacklist)) //No armblades, no putting already possessed items in it! + if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W, GLOB.item_vore_blacklist)) //No armblades, no putting already possessed items in it! to_chat(user, span_notice("You cannot put \the [W] into the machine.")) return if(istype(W, /obj/item/holder/micro) || istype(W, /obj/item/holder/mouse)) //Are you putting a micro/mouse in it? diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm index 488135ce99..9e4f7bcd52 100644 --- a/code/modules/xenobio/items/extracts_vr.dm +++ b/code/modules/xenobio/items/extracts_vr.dm @@ -134,7 +134,7 @@ /decl/chemical_reaction/instant/slime/metal_materials_basic/on_reaction(var/datum/reagents/holder) for(var/i = 1 to 3) - var/type_to_spawn = pickweight(xenobio_metal_materials_normal) + var/type_to_spawn = pickweight(GLOB.xenobio_metal_materials_normal) new type_to_spawn(get_turf(holder.my_atom), 10) ..() @@ -148,7 +148,7 @@ /decl/chemical_reaction/instant/slime/metal_materials_adv/on_reaction(var/datum/reagents/holder) for(var/i = 1 to 2) - var/type_to_spawn = pickweight(xenobio_metal_materials_adv) + var/type_to_spawn = pickweight(GLOB.xenobio_metal_materials_adv) new type_to_spawn(get_turf(holder.my_atom), 10) ..() @@ -162,7 +162,7 @@ /decl/chemical_reaction/instant/slime/metal_materials_weird/on_reaction(var/datum/reagents/holder) for(var/i = 1 to 3) - var/type_to_spawn = pickweight(xenobio_metal_materials_weird) + var/type_to_spawn = pickweight(GLOB.xenobio_metal_materials_weird) new type_to_spawn(get_turf(holder.my_atom), 5) ..() @@ -528,12 +528,12 @@ log_and_message_admins("Gold extract reaction (random mobs) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.forensic_data?.get_lastprint()]") var/type_to_spawn var/list/all_spawnable_types = list() - all_spawnable_types += xenobio_gold_mobs_safe - all_spawnable_types += xenobio_gold_mobs_hostile - all_spawnable_types += xenobio_gold_mobs_birds + all_spawnable_types += GLOB.xenobio_gold_mobs_safe + all_spawnable_types += GLOB.xenobio_gold_mobs_hostile + all_spawnable_types += GLOB.xenobio_gold_mobs_birds for(var/j = 1, j <= 3, j++) if(prob(1)) - type_to_spawn = pickweight(xenobio_gold_mobs_bosses) + type_to_spawn = pickweight(GLOB.xenobio_gold_mobs_bosses) else type_to_spawn = pickweight(all_spawnable_types) @@ -552,7 +552,7 @@ /decl/chemical_reaction/instant/slime/gold_hostile_mob/on_reaction(var/datum/reagents/holder) log_and_message_admins("Gold extract reaction (dangerous mob) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.forensic_data?.get_lastprint()]") - var/type_to_spawn = pickweight(xenobio_gold_mobs_hostile) + var/type_to_spawn = pickweight(GLOB.xenobio_gold_mobs_hostile) var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) for(var/l = 1, l <= rand(1, 3), l++) step(C, pick(NORTH,SOUTH,EAST,WEST)) @@ -568,10 +568,10 @@ /decl/chemical_reaction/instant/slime/gold_safe_mob/on_reaction(var/datum/reagents/holder) var/type_to_spawn - if(prob(100/(xenobio_gold_mobs_safe.len + 1))) - type_to_spawn = pickweight(xenobio_gold_mobs_birds) + if(prob(100/(GLOB.xenobio_gold_mobs_safe.len + 1))) + type_to_spawn = pickweight(GLOB.xenobio_gold_mobs_birds) else - type_to_spawn = pickweight(xenobio_gold_mobs_safe) + type_to_spawn = pickweight(GLOB.xenobio_gold_mobs_safe) var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom)) for(var/l = 1, l <= rand(1, 3), l++) step(C, pick(NORTH,SOUTH,EAST,WEST)) @@ -610,7 +610,7 @@ /decl/chemical_reaction/instant/slime/silver_materials_basic/on_reaction(var/datum/reagents/holder) for(var/i = 1 to 2) - var/type_to_spawn = pickweight(xenobio_silver_materials_basic) + var/type_to_spawn = pickweight(GLOB.xenobio_silver_materials_basic) new type_to_spawn(get_turf(holder.my_atom), 5) ..() @@ -623,7 +623,7 @@ required = /obj/item/slime_extract/silver /decl/chemical_reaction/instant/slime/silver_materials_adv/on_reaction(var/datum/reagents/holder) - var/type_to_spawn = pickweight(xenobio_silver_materials_adv) + var/type_to_spawn = pickweight(GLOB.xenobio_silver_materials_adv) new type_to_spawn(get_turf(holder.my_atom), 3) ..() @@ -639,15 +639,15 @@ var/type_to_spawn var/amount = 5 var/all_spawnable_types = list() - all_spawnable_types += xenobio_metal_materials_normal - all_spawnable_types += xenobio_metal_materials_adv - all_spawnable_types += xenobio_metal_materials_weird - all_spawnable_types += xenobio_silver_materials_basic - all_spawnable_types += xenobio_silver_materials_adv - all_spawnable_types += xenobio_silver_materials_special + all_spawnable_types += GLOB.xenobio_metal_materials_normal + all_spawnable_types += GLOB.xenobio_metal_materials_adv + all_spawnable_types += GLOB.xenobio_metal_materials_weird + all_spawnable_types += GLOB.xenobio_silver_materials_basic + all_spawnable_types += GLOB.xenobio_silver_materials_adv + all_spawnable_types += GLOB.xenobio_silver_materials_special for(var/i = 1 to 3) type_to_spawn = pickweight(all_spawnable_types) - if(type_to_spawn in xenobio_silver_materials_special) + if(type_to_spawn in GLOB.xenobio_silver_materials_special) amount = 1 new type_to_spawn(get_turf(holder.my_atom), amount) ..() @@ -1218,7 +1218,7 @@ required = /obj/item/slime_extract/cerulean /decl/chemical_reaction/instant/slime/cerulean_random_potion/on_reaction(var/datum/reagents/holder) - var/spawn_type = pickweight(xenobio_cerulean_potions) + var/spawn_type = pickweight(GLOB.xenobio_cerulean_potions) new spawn_type(get_turf(holder.my_atom)) ..() @@ -1633,7 +1633,7 @@ required = /obj/item/slime_extract/rainbow /decl/chemical_reaction/instant/slime/rainbow_random_extract/on_reaction(var/datum/reagents/holder) - var/spawn_type = pickweight(xenobio_rainbow_extracts) + var/spawn_type = pickweight(GLOB.xenobio_rainbow_extracts) new spawn_type(get_turf(holder.my_atom)) ..() diff --git a/code/modules/xenobio/items/slimepotions_vr.dm b/code/modules/xenobio/items/slimepotions_vr.dm index 22d96eb62f..ec843162d8 100644 --- a/code/modules/xenobio/items/slimepotions_vr.dm +++ b/code/modules/xenobio/items/slimepotions_vr.dm @@ -163,7 +163,7 @@ to_chat(user, span_notice("You feed \the [M] the agent. It may now eventually develop proper sapience.")) M.ghostjoin = 1 - active_ghost_pods |= M + GLOB.active_ghost_pods |= M if(!M.vore_active) add_verb(M, /mob/living/simple_mob/proc/animal_nom) M.ghostjoin_icon() diff --git a/icons/obj/tools_robot.dmi b/icons/obj/tools_robot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f7a9abe09108573cc1cedcd834e2c39e09c0b4f7 GIT binary patch literal 15045 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 ITEMSIZE_HUGE) + if(is_type_in_list(I, GLOB.item_vore_blacklist) || I.w_class >= ITEMSIZE_HUGE) return if(vac_power > I.w_class) if(vac_power == 7) diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index bf50233d0f..3612af699b 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -156,7 +156,7 @@ /datum/map_template/shelter/dark_portal/New() . = ..() blacklisted_turfs = typecacheof(list(/turf/unsimulated)) - blacklisted_areas = typecacheof(list(/area/centcom, /area/shadekin)) + GLOB.blacklisted_areas = typecacheof(list(/area/centcom, /area/shadekin)) /obj/effect/abstract/dark_maw var/mob/living/owner = null diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm index 70e124ab2a..05bc46432b 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm @@ -220,7 +220,7 @@ Vac.afterattack(S, src, 1) return for(var/obj/O in T) - if(is_type_in_list(O, edible_trash) && !O.anchored) + if(is_type_in_list(O, GLOB.edible_trash) && !O.anchored) Vac.afterattack(T, src, 1) return for(var/mob/living/L in T) diff --git a/modular_chomp/maps/southern_cross/southern_cross_overrides.dm b/modular_chomp/maps/southern_cross/southern_cross_overrides.dm index 47c17d9788..6715b3475a 100644 --- a/modular_chomp/maps/southern_cross/southern_cross_overrides.dm +++ b/modular_chomp/maps/southern_cross/southern_cross_overrides.dm @@ -15,7 +15,7 @@ /datum/map_template/shelter/dark_portal/New() . = ..() - blacklisted_areas = typecacheof(list(/area/centcom, /area/shadekin, /area/vr)) + GLOB.blacklisted_areas = typecacheof(list(/area/centcom, /area/shadekin, /area/vr)) /mob/living/carbon/human/shadekin_ability_check() . = ..() diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx index eb81672a1f..dc0685c7cc 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotAccess.tsx @@ -28,7 +28,7 @@ export const ModifyRobotAccess = (props: { return ( <> {!target.active && } - + {!target.active && } - + {!target.active && } - +
Robot to salvage @@ -179,7 +179,7 @@ const SelectionField = (props: { > - + {capitalize(modul_option.name)} diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx index de41174e64..d05242112e 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotRadio.tsx @@ -25,7 +25,7 @@ export const ModifyRobotRadio = (props: { target: Target }) => { return ( <> {!target.active && } - + { + const { target } = props; + const [tab, setTab] = useState(0); + + const tabs: React.JSX.Element[] = []; + + tabs[0] = ; + tabs[1] = ; + + return ( + + + + setTab(0)}> + PKA + + setTab(1)}> + Multibelt + + + + {tabs[tab]} + + ); +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx index 445b8fed60..1beaa0cd28 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx @@ -32,78 +32,86 @@ export const ModifyRobotUpgrades = (props: { target: Target }) => { useState(''); return ( - <> - {!target.active && } - - - + + {!target.active && ( + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/SubTabs/ModifyRobotMultiBelt.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/SubTabs/ModifyRobotMultiBelt.tsx new file mode 100644 index 0000000000..19ede46758 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/SubTabs/ModifyRobotMultiBelt.tsx @@ -0,0 +1,141 @@ +import { useEffect, useState } from 'react'; +import { useBackend } from 'tgui/backend'; +import { + Button, + Divider, + Image, + Input, + NoticeBox, + Section, + Stack, + Tabs, +} from 'tgui-core/components'; +import { capitalize } from 'tgui-core/string'; + +import { NoSpriteWarning } from '../../components'; +import { getModuleIcon, prepareSearch } from '../../functions'; +import type { Target } from '../../types'; + +export const ModifyRobotMultiBelt = (props: { target: Target }) => { + const { act } = useBackend(); + const { target } = props; + const { multibelt = [] } = target; + const [SearchMultibelt, setSearchMultibelt] = useState(''); + const [searchInstalledtext, setSearchInstalledtext] = useState(''); + const [selectedMultibelt, setSelectedMultibelt] = useState(0); + + const currentMultibelt = multibelt[selectedMultibelt]; + + useEffect(() => { + if (currentMultibelt) { + act('select_multibelt', { + multibelt: currentMultibelt.ref, + }); + } + }, []); + + return ( + <> + {!target.active && } + {!target.multibelt?.length ? ( + {target.name} has no Multibelt installed. + ) : ( + + + + {target.multibelt.map((_, i) => ( + { + setSelectedMultibelt(i); + act('select_multibelt', { + multibelt: multibelt[i].ref, + }); + }} + > + {i + 1}: {multibelt[i].name} + + ))} + + + +
+ + + + setSearchMultibelt(value)} + /> + + {prepareSearch( + target.multibelt[selectedMultibelt].tools, + SearchMultibelt, + ).map((tool, i) => { + return ( + + ); + })} + + + + + + + + setSearchInstalledtext(value)} + /> + + {prepareSearch( + target.multibelt[selectedMultibelt].integrated_tools, + searchInstalledtext, + ).map((tool, i) => { + return ( + + ); + })} + + +
+
+
+ )} + + ); +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/SubTabs/ModifyRobotPKA.tsx similarity index 94% rename from tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx rename to tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/SubTabs/ModifyRobotPKA.tsx index 8ae95ec516..6d7a310643 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/SubTabs/ModifyRobotPKA.tsx @@ -11,9 +11,9 @@ import { } from 'tgui-core/components'; import { capitalize } from 'tgui-core/string'; -import { NoSpriteWarning } from '../components'; -import { getModuleIcon, prepareSearch } from '../functions'; -import type { Target } from '../types'; +import { NoSpriteWarning } from '../../components'; +import { getModuleIcon, prepareSearch } from '../../functions'; +import type { Target } from '../../types'; export const ModifyRobotPKA = (props: { target: Target }) => { const { act } = useBackend(); @@ -27,7 +27,7 @@ export const ModifyRobotPKA = (props: { target: Target }) => { {!target.pka ? ( {target.name} has no PKA installed. ) : ( - + Remaining Capacity: {target.pka.capacity} @@ -67,6 +67,7 @@ export const ModifyRobotPKA = (props: { target: Target }) => { diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx index 9019b7c5ef..22755185cc 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx @@ -3,7 +3,6 @@ import { useBackend } from 'tgui/backend'; import { Window } from 'tgui/layouts'; import { Button, - Divider, Dropdown, Input, LabeledList, @@ -18,8 +17,8 @@ import { ModifyRobotNoModule } from './ModifyRobotNoModule'; import { ModifyRobotAccess } from './ModifyRobotTabs/ModifyRobotAccess'; import { ModifyRobotComponent } from './ModifyRobotTabs/ModifyRobotComponent'; import { ModifyRobotModules } from './ModifyRobotTabs/ModifyRobotModules'; -import { ModifyRobotPKA } from './ModifyRobotTabs/ModifyRobotPKA'; import { ModifyRobotRadio } from './ModifyRobotTabs/ModifyRobotRadio'; +import { ModifyRobotSpecialModules } from './ModifyRobotTabs/ModifyRobotSpecialModules'; import { ModifyRobotUpgrades } from './ModifyRobotTabs/ModifyRobotUpgrades'; import type { Data } from './types'; @@ -86,7 +85,7 @@ export const ModifyRobot = (props) => { /> ); tabs[1] = ; - tabs[2] = ; + tabs[2] = ; tabs[3] = ; tabs[4] = ( { { /> ); tabs[7] = ( -
+
{ return ( - {target ? ( - - {target.name} - {!!target.ckey && ' played by ' + target.ckey}. - - ) : ( - No target selected. Please pick one. - )} - - - - - - act('select_target', { - new_target: value, - }) - } - /> - - {!!target?.module && ( - <> + + + {target ? ( + + {target.name} + {!!target.ckey && ' played by ' + target.ckey}. + + ) : ( + No target selected. Please pick one. + )} + + + + + - setRobotName(value)} - /> - - - + /> - - - - + {!!target?.module && ( + <> + + setRobotName(value)} + /> + + + + + + + + + )} + + + {!!target?.module && ( + + + + + act('select_ai', { + new_ai: value, + }) + } + /> + + + + + + + + + )} - - - {!!target?.module && ( - - + + + + {!!target && + (!target.module ? ( + + + + ) : ( + <> - - act('select_ai', { - new_ai: value, - }) - } - /> + + setTab(0)}> + Module Manager + + setTab(1)}> + Upgrade Manager + + setTab(2)}> + Sub Modules + + setTab(3)}> + Radio Manager + + setTab(4)}> + Component Manager + + setTab(5)}> + Access Manager + + setTab(6)}> + Law Manager + + setTab(7)}> + Law Sets + + - - - - - - - - - )} - - - {!!target && - (!target.module ? ( - - ) : ( - <> - - setTab(0)}> - Module Manager - - setTab(1)}> - Upgrade Manager - - setTab(2)}> - PKA - - setTab(3)}> - Radio Manager - - setTab(4)}> - Component Manager - - setTab(5)}> - Access Manager - - setTab(6)}> - Law Manager - - setTab(7)}> - Law Sets - - - {tabs[tab]} - - ))} + {tabs[tab]} + + ))} + ); diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts index 0efd639349..d9a21f5d84 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts +++ b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts @@ -66,6 +66,7 @@ export type Target = { radio_channels: string[]; availalbe_channels: string[]; pka: PKA | undefined; + multibelt: Multibelt[] | undefined; components: Component[]; active_access: Access[]; }; @@ -111,6 +112,16 @@ export type PKA = { max_capacity: number; }; +export type Multibelt = { + name: string; + tools: { + name: string; + path: string; + }[]; + ref: string; + integrated_tools: { name: string; ref: string }[]; +}; + export type InstalledCell = { name: string | null; charge: number | null; diff --git a/vorestation.dme b/vorestation.dme index 22de77d711..a7ab2fdceb 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3467,6 +3467,7 @@ #include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" +#include "code\modules\mob\living\silicon\robot\robot_simple_items.dm" #include "code\modules\mob\living\silicon\robot\robot_ui.dm" #include "code\modules\mob\living\silicon\robot\robot_ui_module.dm" #include "code\modules\mob\living\silicon\robot\dogborg\dog_defense_modules.dm"