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 a5645a4f8d..c23b2729de 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"))
@@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(vantag_choices_list, list(
VANTAG_KILL = "Be Killed"))
//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,
@@ -50,7 +50,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(
@@ -155,7 +155,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,
@@ -188,9 +188,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,
@@ -248,7 +248,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,
@@ -536,7 +536,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
@@ -595,7 +595,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,
@@ -609,9 +609,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,
@@ -626,9 +626,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,
@@ -637,29 +637,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,
@@ -721,9 +721,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,
@@ -731,9 +731,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/animal/passive/chicken,
/mob/living/simple_mob/animal/passive/cow,
@@ -774,9 +774,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,
@@ -796,9 +796,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,
@@ -816,9 +816,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,
@@ -840,13 +840,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,
@@ -875,9 +875,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,
@@ -931,7 +931,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(
@@ -984,15 +984,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
@@ -1005,9 +1005,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
@@ -1022,9 +1022,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,
@@ -1044,9 +1044,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,
@@ -1065,4 +1065,169 @@ var/global/list/area_or_turf_fail_types = typecacheof(list(
/area/submap/virgo2,
/area/submap/event,
/area/submap/casino_event
- ))
+ )))
+
+//GRIPPERS!!!
+#define BASIC_GRIPPER \
+ /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/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/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 80d086a298..906b90096c 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/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm
index 81bf755e80..52d7104ade 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 b4af408bf7..808222582c 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--
@@ -189,7 +189,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 09d52831fa..2d7618e454 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 4662f0a176..39344ccdca 100644
--- a/code/game/objects/items/weapons/tools/crowbar.dm
+++ b/code/game/objects/items/weapons/tools/crowbar.dm
@@ -64,13 +64,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 125b5cae43..6c7a255797 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 764e082b3a..6718eb171b 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 aa56913a7d..4c36b0f0ee 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 94d63546da..cc73428a83 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
@@ -174,8 +174,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"
@@ -260,8 +259,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 4b39bfa08d..acc9faa2f4 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -860,11 +860,11 @@ GLOBAL_LIST_EMPTY(active_buildmode_holders)
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 11da02c4d7..3313316b62 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 fee0d71b69..e99e33f3c2 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -427,7 +427,7 @@ 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))
+ 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_warning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!"))
I.throwing = 0
I.forceMove(vore_selected)
diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm
index b39101d98a..4e8aa9bd5c 100644
--- a/code/modules/mob/living/carbon/human/stripping.dm
+++ b/code/modules/mob/living/carbon/human/stripping.dm
@@ -70,6 +70,10 @@
var/obj/item/held = user.get_active_hand()
if(!istype(held) || is_robot_module(held))
stripping = TRUE
+ if(is_robot_module(held) && istype(held, /obj/item/gripper))
+ var/obj/item/gripper/G = held
+ if(istype(G.wrapped))
+ stripping = FALSE
else
var/obj/item/holder/holder = held
if(istype(holder) && src == holder.held_mob)
@@ -86,11 +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
+ 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]!"))
+ 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]!"))
if(!do_after(user,HUMAN_STRIP_DELAY,src))
return
@@ -103,10 +113,17 @@
to_chat(user, span_warning("You can't put someone on themselves! Stop trying to break reality!"))
return
-
if(stripping)
add_attack_logs(user,src,"Removed equipment from slot [target_slot]")
unEquip(target_slot)
+ 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))
+ 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 d7124c9371..91520f0e5c 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -261,7 +261,7 @@
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))
+ 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_warning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!"))
I.throwing = 0
I.forceMove(vore_selected)
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 a4bb527feb..765bdb6045 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm
@@ -79,7 +79,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))
@@ -176,7 +176,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 9e8b2931c1..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,433 +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
- )
-
- 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/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,
- /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 360baa18b6..b90544646a 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 66b0f6e062..80da91bb60 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm
@@ -22,7 +22,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)
@@ -33,10 +33,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)
@@ -56,11 +52,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 a8c78e3e60..729cc4c980 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -255,18 +255,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
@@ -327,21 +317,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)
@@ -402,18 +382,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)
@@ -422,7 +398,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)
var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000)
@@ -439,55 +414,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
@@ -495,6 +421,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
@@ -516,7 +443,7 @@ 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/ticket_printer(src)
src.emag += new /obj/item/gun/energy/robotic/laser/rifle(src)
src.modules += new /obj/item/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig.
@@ -552,6 +479,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/pupscrubber(src)
src.modules += new /obj/item/lightreplacer(src)
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)
@@ -641,15 +569,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
@@ -691,15 +612,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
@@ -776,18 +694,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
@@ -813,11 +725,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)
@@ -871,11 +780,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)
@@ -904,44 +812,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 b337ace184..c1d530b94c 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
@@ -773,7 +773,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 ..()
@@ -938,7 +938,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/overmap/sectors.dm b/code/modules/overmap/sectors.dm
index 27a517e763..24a5f8ff2f 100644
--- a/code/modules/overmap/sectors.dm
+++ b/code/modules/overmap/sectors.dm
@@ -91,7 +91,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
for(var/i in 1 to length(levels_for_distress))
var/current = levels_for_distress[i]
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 e3fdf572ce..9dd5c70993 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 4c456355d5..f1d418f9b0 100644
--- a/code/modules/xenoarcheaology/artifacts/replicator_vr.dm
+++ b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm
@@ -210,7 +210,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?
@@ -477,7 +477,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 ce317e2e0c..75af8e6b93 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 0000000000..f7a9abe091
Binary files /dev/null and b/icons/obj/tools_robot.dmi differ
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 7d1e537e02..66627a12f8 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3308,6 +3308,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"