mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-29 06:58:30 +01:00
@@ -11,6 +11,10 @@
|
||||
var/obj/machinery/atmospherics/unary/heat_exchanger/partner = null
|
||||
var/update_cycle
|
||||
|
||||
/obj/machinery/atmospherics/unary/heat_exchanger/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/atmospherics/unary/heat_exchanger/update_icon()
|
||||
if(node)
|
||||
icon_state = "intact"
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
/obj/machinery/atmospherics/pipe/tank/Initialize(mapload)
|
||||
icon_state = "air"
|
||||
. = ..()
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/tank/init_dir()
|
||||
initialize_directions = dir
|
||||
|
||||
@@ -56,6 +56,6 @@
|
||||
/*
|
||||
/datum/robot_sprite/combat/fluff/foopwotch/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) //Make sure the path is correct!
|
||||
..() //THIS IS ESSENTIAL. IF YOU FORGET THIS LINE, YOU WILL NOT GET THE NORMAL SPRITES.
|
||||
if(ourborg.has_active_type(/obj/item/weapon/combat_borgblade))
|
||||
if(ourborg.has_active_type(/obj/item/combat_borgblade))
|
||||
ourborg.add_overlay("[sprite_icon_state]-dagger")
|
||||
*/
|
||||
|
||||
@@ -278,7 +278,6 @@
|
||||
/* #define HEARING_RADIO_FREQ 5
|
||||
#define HEARING_SPANS 6
|
||||
#define HEARING_MESSAGE_MODE 7 */
|
||||
|
||||
///from /datum/controller/subsystem/motion_tracker/notice() (/datum/weakref/source_atom,/turf/echo_turf_location)
|
||||
#define COMSIG_MOVABLE_MOTIONTRACKER "move_motiontracker"
|
||||
|
||||
@@ -431,6 +430,13 @@
|
||||
///called in /obj/update_icon()
|
||||
#define COMSIG_OBJ_UPDATE_ICON "obj_update_icon"
|
||||
|
||||
// climbable signals
|
||||
|
||||
///called when a mob is mousedropped onto, or uses a verb to climb an object
|
||||
#define COMSIG_CLIMBABLE_START_CLIMB "starting_climb_action"
|
||||
///called when an object is considered unsafe to climb on
|
||||
#define COMSIG_CLIMBABLE_SHAKE_CLIMBERS "shaking_climbing_mobs"
|
||||
|
||||
// /obj/machinery signals
|
||||
|
||||
///from /obj/machinery/obj_break(damage_flag): (damage_flag)
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
// Modes for examine text output
|
||||
#define EXAMINE_MODE_DEFAULT 0
|
||||
#define EXAMINE_MODE_INCLUDE_USAGE 1
|
||||
#define EXAMINE_MODE_SWITCH_TO_PANEL 2
|
||||
#define EXAMINE_MODE_SLIM "Slim"
|
||||
#define EXAMINE_MODE_VERBOSE "Verbose"
|
||||
#define EXAMINE_MODE_SWITCH_TO_PANEL "Switch To Panel"
|
||||
|
||||
// Should be one higher than the above
|
||||
#define EXAMINE_MODE_MAX 3
|
||||
|
||||
// Modes for parsing multilingual speech
|
||||
#define MULTILINGUAL_DEFAULT 0
|
||||
#define MULTILINGUAL_SPACE 1
|
||||
#define MULTILINGUAL_DOUBLE_DELIMITER 2
|
||||
#define MULTILINGUAL_OFF 3
|
||||
#define MULTILINGUAL_DEFAULT "Default"
|
||||
#define MULTILINGUAL_SPACE "Space"
|
||||
#define MULTILINGUAL_DOUBLE_DELIMITER "Double Delimiter"
|
||||
#define MULTILINGUAL_OFF "Single Language"
|
||||
|
||||
#define MULTILINGUAL_MODE_MAX 4
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
// Adds a generic box around whatever message you're sending in chat. Really makes things stand out.
|
||||
#define examine_block(str) ("<div class='examine_block'>" + str + "</div>")
|
||||
|
||||
//for the foldout stuff
|
||||
#define span_details(title, content) ("<details>"+"<summary>" + title + "</summary>" + content + "</details>")
|
||||
|
||||
// Filtered both under OOC!
|
||||
#define span_ooc(str) ("<span class='ooc'>" + str + "</span>")
|
||||
#define span_aooc(str) ("<span class='aooc'>" + str + "</span>")
|
||||
|
||||
@@ -198,6 +198,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define FIRE_PRIORITY_TICKER 60
|
||||
#define FIRE_PRIORITY_PLANETS 75
|
||||
#define FIRE_PRIORITY_MACHINES 100
|
||||
#define FIRE_PRIORITY_MOBS 100
|
||||
#define FIRE_PRIORITY_TGUI 110
|
||||
#define FIRE_PRIORITY_PROJECTILES 150
|
||||
#define FIRE_PRIORITY_STATPANEL 390
|
||||
|
||||
@@ -9,3 +9,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
|
||||
/// Trait given to a mob that is currently thinking (giving off the "thinking" icon), used in an IC context
|
||||
#define TRAIT_THINKING_IN_CHARACTER "currently_thinking_IC"
|
||||
|
||||
/// Climbable trait, given and taken by the climbable element when added or removed. Exists to be easily checked via HAS_TRAIT().
|
||||
#define TRAIT_CLIMBABLE "trait_climbable"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/// Trait applied by element
|
||||
#define ELEMENT_TRAIT(source) "element_trait_[source]"
|
||||
@@ -18,5 +18,8 @@ GLOBAL_LIST_INIT(radiation_levels, list(
|
||||
GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
/mob = list(
|
||||
"TRAIT_THINKING_IN_CHARACTER" = TRAIT_THINKING_IN_CHARACTER,
|
||||
),
|
||||
/obj = list(
|
||||
"TRAIT_CLIMBABLE" = TRAIT_CLIMBABLE,
|
||||
)
|
||||
))
|
||||
|
||||
@@ -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,171 @@ 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/bluespace_crystal, \
|
||||
/obj/item/stock_parts, \
|
||||
/obj/item/frame, \
|
||||
/obj/item/camera_assembly, \
|
||||
/obj/item/tank, \
|
||||
/obj/item/circuitboard, \
|
||||
/obj/item/smes_coil, \
|
||||
/obj/item/fuel_assembly, \
|
||||
/obj/item/stack/tile/floor
|
||||
|
||||
#define OMNI_GRIPPER \
|
||||
/obj/item
|
||||
|
||||
#define MINER_GRIPPER \
|
||||
/obj/item/cell, \
|
||||
/obj/item/stock_parts
|
||||
|
||||
#define SECURITY_GRIPPER \
|
||||
/obj/item/paper, \
|
||||
/obj/item/paper_bundle, \
|
||||
/obj/item/pen, \
|
||||
/obj/item/sample, \
|
||||
/obj/item/forensics/sample_kit, \
|
||||
/obj/item/taperecorder, \
|
||||
/obj/item/rectape, \
|
||||
/obj/item/uv_light
|
||||
|
||||
#define PAPERWORK_GRIPPER \
|
||||
/obj/item/clipboard, \
|
||||
/obj/item/paper, \
|
||||
/obj/item/paper_bundle, \
|
||||
/obj/item/card/id, \
|
||||
/obj/item/book, \
|
||||
/obj/item/newspaper
|
||||
|
||||
#define MEDICAL_GRIPPER \
|
||||
/obj/item/reagent_containers/glass, \
|
||||
/obj/item/storage/pill_bottle, \
|
||||
/obj/item/reagent_containers/pill, \
|
||||
/obj/item/reagent_containers/blood, \
|
||||
/obj/item/nif, \
|
||||
/obj/item/stack/material/phoron, \
|
||||
/obj/item/tank/anesthetic, \
|
||||
/obj/item/disk/body_record
|
||||
|
||||
#define RESEARCH_GRIPPER \
|
||||
/obj/item/cell, \
|
||||
/obj/item/stock_parts, \
|
||||
/obj/item/mmi, \
|
||||
/obj/item/robot_parts, \
|
||||
/obj/item/borg/upgrade, \
|
||||
/obj/item/flash, \
|
||||
/obj/item/disk, \
|
||||
/obj/item/circuitboard, \
|
||||
/obj/item/reagent_containers/glass, \
|
||||
/obj/item/assembly/prox_sensor, \
|
||||
/obj/item/healthanalyzer, \
|
||||
/obj/item/slime_cube, \
|
||||
/obj/item/slime_crystal, \
|
||||
/obj/item/disposable_teleporter/slime, \
|
||||
/obj/item/slimepotion, \
|
||||
/obj/item/slime_extract, \
|
||||
/obj/item/reagent_containers/food/snacks/monkeycube
|
||||
|
||||
#define CIRCUIT_GRIPPER \
|
||||
/obj/item/cell/device, \
|
||||
/obj/item/electronic_assembly, \
|
||||
/obj/item/assembly/electronic_assembly, \
|
||||
/obj/item/clothing/under/circuitry, \
|
||||
/obj/item/clothing/gloves/circuitry, \
|
||||
/obj/item/clothing/glasses/circuitry, \
|
||||
/obj/item/clothing/shoes/circuitry, \
|
||||
/obj/item/clothing/head/circuitry, \
|
||||
/obj/item/clothing/ears/circuitry, \
|
||||
/obj/item/clothing/suit/circuitry, \
|
||||
/obj/item/implant/integrated_circuit, \
|
||||
/obj/item/integrated_circuit
|
||||
|
||||
#define SERVICE_GRIPPER \
|
||||
/obj/item/reagent_containers/glass, \
|
||||
/obj/item/reagent_containers/food, \
|
||||
/obj/item/seeds, \
|
||||
/obj/item/grown, \
|
||||
/obj/item/trash, \
|
||||
/obj/item/reagent_containers/cooking_container
|
||||
|
||||
#define GRAVEYARD_GRIPPER \
|
||||
/obj/item/seeds, \
|
||||
/obj/item/grown, \
|
||||
/obj/item/material/gravemarker
|
||||
|
||||
#define SCENE_GRIPPER \
|
||||
/obj/item/capture_crystal, \
|
||||
/obj/item/clothing, \
|
||||
/obj/item/implanter, \
|
||||
/obj/item/disk/nifsoft/compliance, \
|
||||
/obj/item/handcuffs, \
|
||||
/obj/item/toy, \
|
||||
/obj/item/petrifier, \
|
||||
/obj/item/dice, \
|
||||
/obj/item/casino_platinum_chip, \
|
||||
/obj/item/spacecasinocash
|
||||
|
||||
#define ORGAN_GRIPPER \
|
||||
/obj/item/organ, \
|
||||
/obj/item/nif
|
||||
|
||||
#define ROBOTICS_ORGAN_GRIPPER \
|
||||
/obj/item/organ/external, \
|
||||
/obj/item/organ/internal/brain, \
|
||||
/obj/item/organ/internal/cell, \
|
||||
/obj/item/organ/internal/eyes/robot, \
|
||||
/obj/item/nif
|
||||
|
||||
#define EXOSUIT_GRIPPER \
|
||||
/obj/item/mecha_parts/part, \
|
||||
/obj/item/mecha_parts/micro/part, \
|
||||
/obj/item/mecha_parts/mecha_equipment, \
|
||||
/obj/item/mecha_parts/mecha_tracking, \
|
||||
/obj/item/mecha_parts/component
|
||||
|
||||
#define SHEET_GRIPPER \
|
||||
/obj/item/stack/material
|
||||
|
||||
GLOBAL_LIST_INIT(all_borg_multitool_options, list(
|
||||
/obj/item/tool/screwdriver/cyborg,
|
||||
/obj/item/tool/wrench/cyborg,
|
||||
/obj/item/tool/crowbar/cyborg,
|
||||
/obj/item/tool/wirecutters/cyborg,
|
||||
/obj/item/multitool/cyborg,
|
||||
/obj/item/weldingtool/electric/mounted/cyborg,
|
||||
/obj/item/surgical/retractor/cyborg,
|
||||
/obj/item/surgical/hemostat/cyborg,
|
||||
/obj/item/surgical/cautery/cyborg,
|
||||
/obj/item/surgical/surgicaldrill/cyborg,
|
||||
/obj/item/surgical/scalpel/cyborg,
|
||||
/obj/item/surgical/circular_saw/cyborg,
|
||||
/obj/item/surgical/bonegel/cyborg,
|
||||
/obj/item/surgical/FixOVein/cyborg,
|
||||
/obj/item/surgical/bonesetter/cyborg,
|
||||
/obj/item/surgical/bioregen/cyborg,
|
||||
/obj/item/autopsy_scanner,
|
||||
/obj/item/material/minihoe/cyborg,
|
||||
/obj/item/material/knife/machete/hatchet/cyborg,
|
||||
/obj/item/analyzer/plant_analyzer/cyborg,
|
||||
/obj/item/material/knife/cyborg,
|
||||
/obj/item/robot_harvester,
|
||||
/obj/item/material/kitchen/rollingpin/cyborg,
|
||||
/obj/item/reagent_containers/spray,
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(material_synth_list, list(
|
||||
METAL_SYNTH = /datum/matter_synth/metal,
|
||||
PLASTEEL_SYNTH = /datum/matter_synth/plasteel,
|
||||
GLASS_SYNTH = /datum/matter_synth/glass,
|
||||
WOOD_SYNTH = /datum/matter_synth/wood,
|
||||
PLASTIC_SYNTH = /datum/matter_synth/plastic,
|
||||
WIRE_SYNTH = /datum/matter_synth/wire,
|
||||
CLOTH_SYNTH = /datum/matter_synth/cloth
|
||||
))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -20,6 +20,8 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
VAR_PRIVATE/list/drinkreact = list()
|
||||
VAR_PRIVATE/list/chemreact = list()
|
||||
VAR_PRIVATE/list/botseeds = list()
|
||||
VAR_PRIVATE/list/viruses = list()
|
||||
VAR_PRIVATE/list/genes = list()
|
||||
|
||||
VAR_PRIVATE/list/foodrecipe = list()
|
||||
|
||||
@@ -33,6 +35,8 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
VAR_PRIVATE/list/searchcache_chemreact = list()
|
||||
VAR_PRIVATE/list/searchcache_catalogs = list()
|
||||
VAR_PRIVATE/list/searchcache_botseeds = list()
|
||||
VAR_PRIVATE/list/searchcache_viruses = list()
|
||||
VAR_PRIVATE/list/searchcache_genes = list()
|
||||
|
||||
VAR_PRIVATE/list/spoiler_entries = list()
|
||||
|
||||
@@ -44,7 +48,7 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
VAR_PRIVATE/highest_cached_donator = null
|
||||
|
||||
/datum/controller/subsystem/internal_wiki/stat_entry(msg)
|
||||
msg = "P: [pages.len] | O: [ores.len] | M: [materials.len] | S: [smashers.len] | F: [foodrecipe.len] | D: [drinkreact.len] | C: [chemreact.len] | B: [botseeds.len] "
|
||||
msg = "P: [pages.len] | O: [ores.len] | M: [materials.len] | S: [smashers.len] | F: [foodrecipe.len] | D: [drinkreact.len] | C: [chemreact.len] | B: [botseeds.len] | V: [viruses.len] | G: [genes.len] "
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/internal_wiki/Initialize()
|
||||
@@ -53,8 +57,10 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
init_particle_smasher_data()
|
||||
init_reagent_data()
|
||||
init_seed_data()
|
||||
init_virus_data()
|
||||
init_kitchen_data()
|
||||
init_lore_data()
|
||||
init_gene_data()
|
||||
// Donation gag
|
||||
donation_goal = rand(min_donation,max_donation)
|
||||
donation_goal = round(donation_goal,1)
|
||||
@@ -126,6 +132,14 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
RETURN_TYPE(/datum/internal_wiki/page/seed)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
return botseeds[search]
|
||||
/datum/controller/subsystem/internal_wiki/proc/get_page_virus(var/search)
|
||||
RETURN_TYPE(/datum/internal_wiki/page/virus)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
return viruses[search]
|
||||
/datum/controller/subsystem/internal_wiki/proc/get_page_gene(var/search)
|
||||
RETURN_TYPE(/datum/internal_wiki/page/gene)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
return genes[search]
|
||||
/datum/controller/subsystem/internal_wiki/proc/get_page_catalog(var/search)
|
||||
RETURN_TYPE(/datum/internal_wiki/page/catalog)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
@@ -163,6 +177,14 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
RETURN_TYPE(/list)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
return searchcache_botseeds
|
||||
/datum/controller/subsystem/internal_wiki/proc/get_searchcache_viruses()
|
||||
RETURN_TYPE(/list)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
return searchcache_viruses
|
||||
/datum/controller/subsystem/internal_wiki/proc/get_searchcache_genes()
|
||||
RETURN_TYPE(/list)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
return searchcache_genes
|
||||
/datum/controller/subsystem/internal_wiki/proc/get_catalogs()
|
||||
RETURN_TYPE(/list)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
@@ -511,6 +533,37 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
botseeds["[S.display_name]"] = P
|
||||
pages.Add(P)
|
||||
|
||||
/datum/controller/subsystem/internal_wiki/proc/init_virus_data()
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
PRIVATE_PROC(TRUE)
|
||||
// viruses or diseases
|
||||
for(var/datum/disease/D as anything in subtypesof(/datum/disease))
|
||||
if(initial(D.name) == DEVELOPER_WARNING_NAME)
|
||||
continue
|
||||
if(initial(D.visibility_flags) & HIDDEN_PANDEMIC)
|
||||
spoiler_entries.Add(D)
|
||||
continue
|
||||
var/datum/internal_wiki/page/virus/P = new()
|
||||
P.assemble(D)
|
||||
searchcache_viruses.Add("[initial(D.medical_name)]")
|
||||
viruses["[initial(D.medical_name)]"] = P
|
||||
pages.Add(P)
|
||||
|
||||
/datum/controller/subsystem/internal_wiki/proc/init_gene_data()
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
PRIVATE_PROC(TRUE)
|
||||
// viruses or diseases
|
||||
for(var/datum/gene/G in GLOB.dna_genes)
|
||||
var/N = G.name
|
||||
if(istype(G,/datum/gene/trait))
|
||||
var/datum/gene/trait/T = G
|
||||
N = T.get_name()
|
||||
var/datum/internal_wiki/page/gene/P = new()
|
||||
P.assemble(G)
|
||||
searchcache_genes.Add("[N]")
|
||||
genes["[N]"] = P
|
||||
pages.Add(P)
|
||||
|
||||
/datum/controller/subsystem/internal_wiki/proc/init_kitchen_data()
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
PRIVATE_PROC(TRUE)
|
||||
@@ -1311,6 +1364,166 @@ SUBSYSTEM_DEF(internal_wiki)
|
||||
data["name"] = catalog_record.name
|
||||
data["desc"] = catalog_record.desc
|
||||
|
||||
// VIRUSES
|
||||
/////////////////////////////////////////////
|
||||
/datum/internal_wiki/page/virus/assemble(var/datum/disease/D)
|
||||
title = initial(D.name)
|
||||
data["title"] = title
|
||||
data["description"] = initial(D.desc)
|
||||
data["form"] = initial(D.form)
|
||||
data["agent"] = initial(D.agent)
|
||||
data["danger"] = initial(D.danger)
|
||||
data["max_stages"] = initial(D.max_stages)
|
||||
|
||||
var/infectivity = ""
|
||||
switch(initial(D.infectivity))
|
||||
if(0)
|
||||
infectivity = "NA"
|
||||
if(1 to 3)
|
||||
infectivity = "Low"
|
||||
if(4 to 7)
|
||||
infectivity = "Medium"
|
||||
if(8 to INFINITY)
|
||||
infectivity = "High"
|
||||
data["infectivity"] = infectivity
|
||||
|
||||
var/resiliance = ""
|
||||
switch(initial(D.cure_chance))
|
||||
if(0 to 8)
|
||||
resiliance = "Extreme"
|
||||
if(9 to 12)
|
||||
resiliance = "High"
|
||||
if(13 to 16)
|
||||
resiliance = "Medium"
|
||||
if(17 to INFINITY)
|
||||
resiliance = "Low"
|
||||
data["resiliance"] = resiliance
|
||||
|
||||
var/discovery = ""
|
||||
switch(initial(D.discovery_threshold))
|
||||
if(0 to 0.24)
|
||||
discovery = "Extremely Elusive"
|
||||
if(0.25 to 0.49)
|
||||
discovery = "Difficult"
|
||||
if(0.5 to 0.74)
|
||||
discovery = "Moderate"
|
||||
if(0.75 to 0.89)
|
||||
discovery = "Easy"
|
||||
if(0.9 to INFINITY)
|
||||
discovery = "Trivial"
|
||||
data["discovery"] = discovery
|
||||
|
||||
var/spread_flags = initial(D.spread_flags)
|
||||
var/spread_type = "NA"
|
||||
if(spread_flags & DISEASE_SPREAD_CONTACT)
|
||||
spread_type = "Contact"
|
||||
else if(spread_flags & DISEASE_SPREAD_FLUIDS)
|
||||
spread_type = "Fluids"
|
||||
else if(spread_flags & DISEASE_SPREAD_BLOOD)
|
||||
spread_type = "Blood"
|
||||
else if(spread_flags & DISEASE_SPREAD_AIRBORNE)
|
||||
spread_type = "Airborne"
|
||||
else if(spread_flags & DISEASE_SPREAD_FALTERED)
|
||||
spread_type = "Faltered"
|
||||
data["spread"] = spread_type
|
||||
|
||||
var/mod_flags = initial(D.virus_modifiers)
|
||||
data["all_cures"] = mod_flags & NEEDS_ALL_CURES
|
||||
data["aggressive"] = mod_flags & BYPASSES_IMMUNITY
|
||||
var/flags = initial(D.disease_flags)
|
||||
data["curable"] = flags & CURABLE
|
||||
data["resistable"] = flags & CAN_RESIST
|
||||
data["carriable"] = flags & CAN_CARRY
|
||||
data["spread_dead"] = flags & SPREAD_DEAD
|
||||
data["infect_synth"] = flags & INFECT_SYNTHETICS
|
||||
|
||||
/datum/internal_wiki/page/virus/get_print()
|
||||
var/body = ""
|
||||
body += "<b>Description: </b>[data["description"]]<br>"
|
||||
body += "<br>"
|
||||
body += "<b>Type: [data["form"]] - [data["agent"]]</b><br>"
|
||||
body += "<b>Hazard Level: [data["danger"]]</b><br>"
|
||||
body += "<b>Growth Stages: [data["max_stages"]]</b><br>"
|
||||
body += "<b>Curable: [(data["curable"]) ? "Yes" : "No"][!(data["all_cures"]) ? " - single treatment" : ""]</b><br>"
|
||||
body += "<b>Resistable: [(data["resistable"]) ? "Yes" : "No"]</b><br>"
|
||||
body += "<br>"
|
||||
// Transmission type
|
||||
body += "<b>Transmission: [data["spread"]] [(data["aggressive"]) ? "Aggressive" : ""]</b><br>"
|
||||
if(data["carriable"])
|
||||
body += "<b>Transmissable without symptoms</b><br>"
|
||||
if(data["spread_dead"])
|
||||
body += "<b>Transmissable from dead tissue</b><br>"
|
||||
if(data["infect_synth"])
|
||||
body += "<b>Inorganic pathogen</b><br>"
|
||||
// Difficulty of discovery
|
||||
body += "<b>Discoverability: [data["discovery"]]</b><br>"
|
||||
// Probability of spreading
|
||||
body += "<b>Infectivity: [data["infectivity"]]</b><br>"
|
||||
// Probability of cure, 10 to 20 regularly
|
||||
body += "<b>Resiliance: [data["resiliance"]]</b><br>"
|
||||
return body
|
||||
|
||||
// GENES
|
||||
/////////////////////////////////////////////
|
||||
/datum/internal_wiki/page/gene/assemble(var/datum/gene/G)
|
||||
if(istype(G,/datum/gene/trait))
|
||||
// Trait genetics
|
||||
var/datum/gene/trait/T = G
|
||||
title = T.get_name()
|
||||
data["title"] = title
|
||||
data["description"] = T.get_desc()
|
||||
if(istype(T.linked_trait,/datum/trait/positive))
|
||||
if(!T.linked_trait.hidden)
|
||||
data["trait_type"] = "Positive"
|
||||
else
|
||||
data["trait_type"] = "Super Power" // Likely eye lasers
|
||||
else if(istype(T.linked_trait,/datum/trait/negative))
|
||||
if(!T.linked_trait.hidden)
|
||||
data["trait_type"] = "Negative"
|
||||
else
|
||||
data["trait_type"] = "Disability" // Likely gibbings or such
|
||||
else
|
||||
if(!T.linked_trait.hidden)
|
||||
data["trait_type"] = "Neutral"
|
||||
else
|
||||
data["trait_type"] = "Strange" // Not sure what neutrals are hidden, but just incase
|
||||
// Conflicts
|
||||
data["blockers"] = null
|
||||
var/list/output_blockers = list()
|
||||
var/list/blockers = T.conflict_traits
|
||||
for(var/path in blockers)
|
||||
var/datum/trait/TG = GLOB.all_traits[path]
|
||||
output_blockers.Add(TG.name)
|
||||
if(output_blockers.len)
|
||||
data["blockers"] = output_blockers
|
||||
else
|
||||
// Old style gene
|
||||
title = G.name
|
||||
data["title"] = title
|
||||
data["description"] = G.desc
|
||||
data["trait_type"] = "Neutral"
|
||||
data["blockers"] = null
|
||||
var/list/bounds = GetDNABounds(G.block)
|
||||
data["bounds_off_min"] = EncodeDNABlock(bounds[1]) // Minimum hex where gene is off
|
||||
data["bounds_off_max"] = EncodeDNABlock(bounds[2]) // Maximum hex where gene is off
|
||||
data["bounds_on_min"] = EncodeDNABlock(bounds[3]) // Minimum hex where gene is on
|
||||
data["bounds_on_max"] = EncodeDNABlock(bounds[4]) // Maximum hex where gene is on
|
||||
|
||||
/datum/internal_wiki/page/gene/get_print()
|
||||
var/body = ""
|
||||
body += "<b>Description: </b>[data["description"]]<br>"
|
||||
body += "<br>"
|
||||
body += "<b>Type: [data["trait_type"]]</b><br>"
|
||||
body += "<b>Active Range: [data["bounds_on_min"]] - [data["bounds_on_max"]]</b><br>"
|
||||
body += "<b>Inactive Range: [data["bounds_off_min"]] - [data["bounds_off_max"]]</b><br>"
|
||||
body += "<br>"
|
||||
var/list/blockers = data["blockers"]
|
||||
if(blockers)
|
||||
body += "<b>Suppressed By:</b><br>"
|
||||
for(var/trait_name in blockers)
|
||||
body += "-[trait_name]<br>"
|
||||
return body
|
||||
|
||||
// MISC HELPERS
|
||||
////////////////////////////////////////////
|
||||
/datum/internal_wiki/page/proc/print_allergens(var/list/allergens)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
SUBSYSTEM_DEF(mobs)
|
||||
name = "Mobs"
|
||||
priority = 100
|
||||
priority = FIRE_PRIORITY_MOBS
|
||||
wait = 2 SECONDS
|
||||
flags = SS_KEEP_TIMING|SS_NO_INIT
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
@@ -19,8 +19,10 @@ SUBSYSTEM_DEF(mobs)
|
||||
var/slept_mobs = 0
|
||||
var/list/process_z = list()
|
||||
|
||||
var/list/death_list = list()
|
||||
|
||||
/datum/controller/subsystem/mobs/stat_entry(msg)
|
||||
msg = "P: [global.mob_list.len] | S: [slept_mobs]"
|
||||
msg = "P: [global.mob_list.len] | S: [slept_mobs] | D: [death_list.len]"
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/mobs/fire(resumed = 0)
|
||||
@@ -30,6 +32,15 @@ SUBSYSTEM_DEF(mobs)
|
||||
slept_mobs = 0
|
||||
for(var/level in 1 to process_z.len)
|
||||
process_z[level] = GLOB.living_players_by_zlevel[level].len
|
||||
// Lets handle all of these while we have time, should always remain extremely small...
|
||||
if(death_list.len) // Don't contact DB if this list is empty
|
||||
if(CONFIG_GET(flag/sql_enabled))
|
||||
establish_db_connection()
|
||||
if(!SSdbcore.IsConnected())
|
||||
log_game("SQL ERROR during death reporting. Failed to connect.")
|
||||
else
|
||||
SSdbcore.MassInsert(format_table_name("death"), death_list)
|
||||
death_list.Cut()
|
||||
|
||||
//cache for sanic speed (lists are references anyways)
|
||||
var/list/currentrun = src.currentrun
|
||||
@@ -92,3 +103,37 @@ SUBSYSTEM_DEF(mobs)
|
||||
/datum/controller/subsystem/mobs/critfail()
|
||||
..()
|
||||
log_recent()
|
||||
|
||||
/datum/controller/subsystem/mobs/proc/report_death(var/mob/living/L)
|
||||
if(!L)
|
||||
return
|
||||
if(!L.key || !L.mind)
|
||||
return
|
||||
if(!ticker || !ticker.mode)
|
||||
return
|
||||
ticker.mode.check_win()
|
||||
|
||||
// Don't bother with the rest if we've not got a DB to do anything with
|
||||
if(!CONFIG_GET(flag/enable_stat_tracking) || !CONFIG_GET(flag/sql_enabled))
|
||||
return
|
||||
|
||||
var/area/placeofdeath = get_area(L)
|
||||
var/podname = placeofdeath ? placeofdeath.name : "Unknown area"
|
||||
|
||||
var/list/data = list(
|
||||
"name" = L.real_name,
|
||||
"byondkey" = L.key,
|
||||
"job" = L.mind.assigned_role,
|
||||
"special" = L.mind.special_role,
|
||||
"pod" = podname,
|
||||
"tod" = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss"),
|
||||
"laname" = L.lastattacker ? L.lastattacker:real_name : null,
|
||||
"lakey" = L.lastattacker ? L.lastattacker:key : null,
|
||||
"gender" = L.gender,
|
||||
"bruteloss" = L.getBruteLoss(),
|
||||
"fireloss" = L.getFireLoss(),
|
||||
"brainloss" = L.brainloss,
|
||||
"oxyloss" = L.getOxyLoss(),
|
||||
"coord" = "[L.x], [L.y], [L.z]"
|
||||
)
|
||||
death_list += list(data)
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -170,7 +170,11 @@ SUBSYSTEM_DEF(statpanels)
|
||||
if(description_holders["antag"])
|
||||
examine_update += span_red(span_bold("[description_holders["antag"]]")) + "<br />" //Red, malicious antag-related text
|
||||
|
||||
target.stat_panel.send_message("update_examine", list("EX" = examine_update, "UPD" = target.prefs.examine_text_mode == EXAMINE_MODE_SWITCH_TO_PANEL))
|
||||
var/update_panel = FALSE
|
||||
if(target.prefs?.read_preference(/datum/preference/choiced/examine_mode) == EXAMINE_MODE_SWITCH_TO_PANEL)
|
||||
update_panel = TRUE
|
||||
|
||||
target.stat_panel.send_message("update_examine", list("EX" = examine_update, "UPD" = update_panel))
|
||||
|
||||
/datum/controller/subsystem/statpanels/proc/set_tickets_tab(client/target)
|
||||
var/list/tickets = list()
|
||||
|
||||
@@ -219,3 +219,43 @@
|
||||
/datum/component/hose_connector/output/handle_pump(var/datum/reagents/connected_to)
|
||||
ASSERT(connected_to)
|
||||
connected_to.trans_to_holder(reagents, reagents.maximum_volume)
|
||||
|
||||
/// Endless source, produces a reagent and pumps it out forever. Does not require attached object to have reagents.
|
||||
/datum/component/hose_connector/endless_source
|
||||
name = "source connector"
|
||||
flow_direction = HOSE_OUTPUT
|
||||
var/reagent_id = null
|
||||
|
||||
/datum/component/hose_connector/endless_source/Initialize()
|
||||
. = ..()
|
||||
name = initial(name)
|
||||
|
||||
/datum/component/hose_connector/endless_source/connected_reagents()
|
||||
if(!carrier)
|
||||
return null
|
||||
return reagents // Ourselves, not our carrier
|
||||
|
||||
/datum/component/hose_connector/endless_source/handle_pump(var/datum/reagents/connected_to)
|
||||
ASSERT(connected_to)
|
||||
connected_to.add_reagent(reagent_id,5)
|
||||
|
||||
/datum/component/hose_connector/endless_source/water
|
||||
reagent_id = REAGENT_ID_WATER
|
||||
|
||||
/// Endless drain, removes reagents from existance
|
||||
/datum/component/hose_connector/endless_drain
|
||||
name = "drain connector"
|
||||
flow_direction = HOSE_INPUT
|
||||
|
||||
/datum/component/hose_connector/endless_drain/Initialize()
|
||||
. = ..()
|
||||
name = initial(name)
|
||||
|
||||
/datum/component/hose_connector/endless_drain/connected_reagents()
|
||||
if(!carrier)
|
||||
return null
|
||||
return reagents // Ourselves, not our carrier
|
||||
|
||||
/datum/component/hose_connector/endless_drain/handle_pump(var/datum/reagents/connected_to)
|
||||
ASSERT(connected_to)
|
||||
connected_to.clear_reagents()
|
||||
|
||||
@@ -17,7 +17,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
|
||||
))
|
||||
|
||||
/datum/disease/advance
|
||||
name = "Unknown"
|
||||
name = DEVELOPER_WARNING_NAME
|
||||
desc = "An engineered disease which can contain a multitude of symptoms."
|
||||
form = "Advance Disease"
|
||||
agent = "advance microbes"
|
||||
@@ -178,7 +178,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
|
||||
else
|
||||
var/datum/disease/advance/A = GLOB.archive_diseases[GetDiseaseID()]
|
||||
var/actual_name = A.name
|
||||
if(actual_name != "Unknown")
|
||||
if(actual_name != DEVELOPER_WARNING_NAME)
|
||||
name = actual_name
|
||||
|
||||
|
||||
@@ -266,8 +266,10 @@ GLOBAL_LIST_INIT(advance_cures, list(
|
||||
severity = DISEASE_HARMFUL
|
||||
if(4)
|
||||
severity = DISEASE_DANGEROUS
|
||||
if(5 to INFINITY)
|
||||
if(5)
|
||||
severity = DISEASE_BIOHAZARD
|
||||
if(6 to INFINITY)
|
||||
severity = DISEASE_PANDEMIC
|
||||
else
|
||||
severity = "Unknown"
|
||||
|
||||
@@ -477,3 +479,103 @@ GLOBAL_LIST_INIT(advance_cures, list(
|
||||
GLOB.active_diseases += A
|
||||
|
||||
log_admin("[key_name(src)] has contracted the virus \"[A]\"")
|
||||
|
||||
/*
|
||||
* Generates a random name for a disease, depending on where it comes from
|
||||
*/
|
||||
/datum/disease/advance/proc/random_disease_name(var/atom/diseasesource)
|
||||
|
||||
if(length(symptoms) == 1)
|
||||
var/datum/symptom/main_symptom = symptoms[1]
|
||||
if(istype(main_symptom) && length(main_symptom.name))
|
||||
return main_symptom.name
|
||||
|
||||
// Prefixes. These need a space right after.
|
||||
var/list/prefixes = list("Spacer's ", "Space ", "Infectious ","Viral ", "The ", "[capitalize(prob(50) ? pick(first_names_male) : pick(first_names_female))]'s ", "[capitalize(pick(last_names))]'s ", "Acute ")
|
||||
var/list/bodies = list(pick("[capitalize(prob(50) ? pick(first_names_male) : pick(first_names_female))]", "[pick(last_names)]"), "Space", "Disease", "Noun", "Cold", "Germ", "Virus")
|
||||
// These might need some space before the word, depends on what you want to add.
|
||||
var/list/suffixes = list("ism", "itis", "osis", "itosis", " #[rand(1,10000)]", "-[rand(1,100)]", "s", "y", " Virus", " Bug", " Infection", " Disease", " Complex", " Syndrome", " Sickness")
|
||||
|
||||
if(stealth >=2)
|
||||
prefixes += "Crypto "
|
||||
switch(max(resistance - (symptoms.len / 2), 1))
|
||||
if(1)
|
||||
suffixes += "-alpha"
|
||||
if(2)
|
||||
suffixes += "-beta"
|
||||
if(3)
|
||||
suffixes += "-gamma"
|
||||
if(4)
|
||||
suffixes += "-delta"
|
||||
if(5)
|
||||
suffixes += "-epsilon"
|
||||
if(6)
|
||||
suffixes += pick("-zeta", "-eta", "-theta", "-iota")
|
||||
if(7)
|
||||
suffixes += pick("-kappa", "-lambda")
|
||||
if(8)
|
||||
suffixes += pick("-mu", "-nu", "-xi", "-omicron")
|
||||
if(9)
|
||||
suffixes += pick("-pi", "-rho", "-sigma", "-tau")
|
||||
if(10)
|
||||
suffixes += pick("-upsilon", "-phi", "-chi", "-psi")
|
||||
if(11 to INFINITY)
|
||||
suffixes += "-omega"
|
||||
prefixes += "Robust "
|
||||
switch(transmission - symptoms.len)
|
||||
if(-INFINITY to 2)
|
||||
prefixes += "Bloodborne "
|
||||
if(3)
|
||||
prefixes += list("Mucous ", "Kissing ")
|
||||
if(4)
|
||||
prefixes += "Contact "
|
||||
suffixes += " Flu"
|
||||
if(5 to INFINITY)
|
||||
prefixes += "Airborne "
|
||||
suffixes += " Plague"
|
||||
switch(severity)
|
||||
if(-INFINITY to 0)
|
||||
prefixes += "Altruistic "
|
||||
if(1 to 2)
|
||||
prefixes += "Benign "
|
||||
if(3 to 4)
|
||||
prefixes += "Malignant "
|
||||
if(5)
|
||||
prefixes += "Deadly "
|
||||
bodies += "Death"
|
||||
if(6 to INFINITY)
|
||||
prefixes += "Morbid "
|
||||
bodies += "Death"
|
||||
if(diseasesource)
|
||||
if(ishuman(diseasesource))
|
||||
var/mob/living/carbon/human/H = diseasesource
|
||||
prefixes += pick("[H.name]'s ", "[H.job]'s ", "[H.get_species()]'s ")
|
||||
bodies += pick("[H.name]", "[H.job]", "[H.get_species()]")
|
||||
if(H.get_species() == SPECIES_UNATHI || H.get_species() == SPECIES_TAJARAN)
|
||||
prefixes += list("Vermin ", "Zoo", "Maintenance ")
|
||||
bodies += list("Rat", "Maint")
|
||||
if(ismouse(diseasesource) && !istype(diseasesource, /mob/living/simple_mob/animal/passive/mouse/white/virology))
|
||||
prefixes += list("Vermin ", "Zoo", "Maintenance ")
|
||||
bodies += list("Rat", "Maint")
|
||||
else switch(diseasesource.type)
|
||||
if(/mob/living/simple_mob/animal/passive/mouse/white/virology)
|
||||
prefixes += list("Fleming's ", "Standard ")
|
||||
bodies += list("Freebie")
|
||||
if(/obj/effect/decal/cleanable/blood, /obj/effect/decal/cleanable/vomit/old)
|
||||
prefixes += list("Bloody ", "Maintenance ")
|
||||
bodies += list("Maint")
|
||||
if(/obj/item/reagent_containers/syringe/old)
|
||||
prefixes += list("Junkie ", "Maintenance ")
|
||||
bodies += list("Needle", "Maint")
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
if(!S.neutered)
|
||||
prefixes += S.prefixes
|
||||
bodies += S.bodies
|
||||
suffixes += S.suffixes
|
||||
switch(rand(1, 3))
|
||||
if(1)
|
||||
return "[pick(prefixes)][pick(bodies)]"
|
||||
if(2)
|
||||
return "[pick(prefixes)][pick(bodies)][pick(suffixes)]"
|
||||
if(3)
|
||||
return "[pick(bodies)][pick(suffixes)]"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
/datum/disease/advance/random/minor
|
||||
max_symptoms_override = 4
|
||||
|
||||
/datum/disease/advance/random/New(max_symptoms, max_level = 6, min_level = 1, list/guaranteed_symptoms = setsymptom)
|
||||
/datum/disease/advance/random/New(max_symptoms, max_level = 6, min_level = 1, list/guaranteed_symptoms = setsymptom, var/atom/infected)
|
||||
if(!max_symptoms)
|
||||
max_symptoms = (2 + rand(1, (VIRUS_SYMPTOM_LIMIT - 2)))
|
||||
if(max_symptoms_override)
|
||||
@@ -35,6 +35,11 @@
|
||||
symptoms += new guaranteed_symptom
|
||||
Finalize()
|
||||
|
||||
if(randomname)
|
||||
var/randname = random_disease_name(infected)
|
||||
AssignName(randname)
|
||||
name = randname
|
||||
|
||||
/mob/living/carbon/human/proc/give_random_dormant_disease(biohazard = 25, min_symptoms = 2, max_symptoms = 4, min_level = 4, max_level = 9, list/guaranteed_symptoms = list())
|
||||
. = FALSE
|
||||
var/sickrisk = 1
|
||||
@@ -53,7 +58,7 @@
|
||||
|
||||
if(prob(min(100, (biohazard * sickrisk))))
|
||||
var/symptom_amt = rand(min_symptoms, max_symptoms)
|
||||
var/datum/disease/advance/dormant_disease = new /datum/disease/advance/random(symptom_amt, max_level, min_level, guaranteed_symptoms)
|
||||
var/datum/disease/advance/dormant_disease = new /datum/disease/advance/random(symptom_amt, max_level, min_level, guaranteed_symptoms, infected = src)
|
||||
dormant_disease.virus_modifiers |= DORMANT
|
||||
dormant_disease.spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
dormant_disease.spread_text = "None"
|
||||
|
||||
@@ -37,6 +37,9 @@ BONUS
|
||||
var/strong_blob
|
||||
var/node_blob
|
||||
|
||||
prefixes = list("Xeno", "Sporing ")
|
||||
bodies = list("Blob")
|
||||
|
||||
/datum/symptom/blobspores/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.resistance >= 14)
|
||||
|
||||
@@ -35,6 +35,9 @@ Bonus
|
||||
"Transmission 8" = "Doubles the damage caused by the symptom."
|
||||
)
|
||||
|
||||
bodies = list("Lung")
|
||||
suffixes = list(" Tuberculosis")
|
||||
|
||||
/datum/symptom/choking/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.transmission >= 8)
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
"Transmission 8" = "When the host dies, more roaches spawn."
|
||||
)
|
||||
|
||||
prefixes = list("Blatto")
|
||||
bodies = list("Roach")
|
||||
|
||||
/datum/symptom/cockroach/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -33,6 +33,9 @@ Bonus
|
||||
"Stealth 4" = "The symptom remains hidden until active."
|
||||
)
|
||||
|
||||
prefixes = list("Dizzy ")
|
||||
bodies = list("Ditz")
|
||||
|
||||
/datum/symptom/confusion/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.resistance >= 6)
|
||||
|
||||
@@ -38,6 +38,8 @@ BONUS
|
||||
"Transmission 11" = "The hosts coughing will occasionally spread the virus."
|
||||
)
|
||||
|
||||
bodies = list("Cough")
|
||||
|
||||
/datum/symptom/cough/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.resistance >= 3)
|
||||
|
||||
@@ -33,6 +33,9 @@ Bonus
|
||||
"Stealth 4" = "The symptom remains hidden until active."
|
||||
)
|
||||
|
||||
prefixes = list("Aural ")
|
||||
bodies = list("Ear")
|
||||
|
||||
/datum/symptom/deafness/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.resistance >= 9)
|
||||
|
||||
@@ -35,12 +35,17 @@ Bonus
|
||||
"Resistance 10" = "Further increases fever intensity."
|
||||
)
|
||||
|
||||
bodies = list("Fever")
|
||||
suffixes = list(" Fever")
|
||||
|
||||
/datum/symptom/fever/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.resistance >= 5)
|
||||
severity += 1
|
||||
prefixes = list("Desert")
|
||||
if(A.resistance >= 10)
|
||||
severity += 1
|
||||
prefixes = list("Volcanic")
|
||||
|
||||
/datum/symptom/fever/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
|
||||
@@ -38,6 +38,10 @@ Bonus
|
||||
"Stealth 4" = "The symptom remains hidden until active."
|
||||
)
|
||||
|
||||
prefixes = list("Burning ")
|
||||
bodies = list("Combustion")
|
||||
suffixes = list(" Combustion")
|
||||
|
||||
/datum/symptom/fire/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -36,6 +36,9 @@ Bonus
|
||||
"Transmission 8" = "The host will bleed far more violently, loosing even more blood, and spraying infected blood everywhere."
|
||||
)
|
||||
|
||||
prefixes = list("Bloody ", "Hemo")
|
||||
bodies = list("Hemophilia")
|
||||
|
||||
/datum/symptom/flesh_eating/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -27,6 +27,9 @@ BONUS
|
||||
level = 1
|
||||
severity = 0
|
||||
|
||||
prefixes = list("Acrobat's ", "Flippin' ")
|
||||
bodies = list("Flip")
|
||||
|
||||
/datum/symptom/flip/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -28,6 +28,8 @@ BONUS
|
||||
symptom_delay_min = 45
|
||||
symptom_delay_max = 90
|
||||
|
||||
bodies = list("Bald", "Scalp")
|
||||
|
||||
/datum/symptom/shedding/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -30,6 +30,9 @@ Bonus
|
||||
|
||||
var/fake_healthy = FALSE
|
||||
|
||||
prefixes = list("Narcotic ", "Narco", "Psycho-")
|
||||
suffixes = list(" Psychosis")
|
||||
|
||||
threshold_descs = list(
|
||||
"Stage Speed 7" = "Increases the amount of hallucinations.",
|
||||
"Stealth 2" = "The virus mimics positive symptoms"
|
||||
|
||||
@@ -34,6 +34,8 @@ BONUS
|
||||
"Stealth 4" = "Reduces headache frequency until later stages."
|
||||
)
|
||||
|
||||
bodies = list("Skull", "Migraine")
|
||||
|
||||
/datum/symptom/headache/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.stage_rate >= 6)
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
"Stage Speed 6" = "Consumed chemicals nourish the host."
|
||||
)
|
||||
|
||||
prefixes = list("Toxo")
|
||||
|
||||
/datum/symptom/heal/chem/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
@@ -98,6 +100,9 @@
|
||||
"Stage Speed 12" = "The disease heals brute damage incredibly fast, but deteriorates cell health and causes tumors to become more advanced. The disease will also regenerate lost limbs."
|
||||
)
|
||||
|
||||
prefixes = list("Blood ", "Meat ", "Flesh ")
|
||||
bodies = list("Giant")
|
||||
|
||||
/datum/symptom/growth/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
@@ -165,6 +170,9 @@
|
||||
"Stage Speed 10" = "Chemical metabolization is tripled instead of doubled."
|
||||
)
|
||||
|
||||
prefixes = list("Metabolic ", "Junkie's ", "Chemical ")
|
||||
bodies = list("Hunger")
|
||||
|
||||
/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -34,6 +34,9 @@ BONUS
|
||||
"Stage Speed 7" = "The host will scratch itself when itchin, causing superficial damage."
|
||||
)
|
||||
|
||||
prefixes = list("Irritant ")
|
||||
bodies = list("Itch")
|
||||
|
||||
/datum/symptom/itching/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -33,6 +33,9 @@ Bonus
|
||||
"Resistance 5" = "The host might end up speaking a completely made up language."
|
||||
)
|
||||
|
||||
prefixes = list("Babel's ", "Tongue-Twisting ")
|
||||
bodies = list("Tongue", "Language")
|
||||
|
||||
/datum/symptom/language/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
"Stealth 3" = "The virus causes a wider disparity between light and dark."
|
||||
)
|
||||
|
||||
prefixes = list("Photo", "Light ")
|
||||
bodies = list("Cramp")
|
||||
|
||||
/datum/symptom/light/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.stealth >= 3)
|
||||
|
||||
@@ -38,6 +38,9 @@ BONUS
|
||||
"Transmission 12" = "Phages will carry all diseases within the host, instead of only containing their own."
|
||||
)
|
||||
|
||||
prefixes = list("Ambulant ", "Macro")
|
||||
bodies = list("Phage")
|
||||
|
||||
/datum/symptom/macrophage/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.transmission >= 10)
|
||||
|
||||
@@ -32,6 +32,9 @@ BONUS
|
||||
"Transmission 8" = "The host will spread the virus through saliva when mlemming."
|
||||
)
|
||||
|
||||
prefixes = list("Mlemington's ", "Licking-")
|
||||
bodies = list("Mlem", "Lick")
|
||||
|
||||
/datum/symptom/mlem/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.transmission >= 8)
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
"Speed 8" = "Host takes radiation damage faster."
|
||||
)
|
||||
|
||||
prefixes = list("Gamma ")
|
||||
bodies = list("Radiation")
|
||||
|
||||
/datum/symptom/radiation/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.stage_rate >= 8)
|
||||
@@ -65,6 +68,8 @@
|
||||
"Resistance 12" = "The disease also kills off genetically damaged cells, coverting Genetic damage to Burn damage, an inefficient rate."
|
||||
)
|
||||
|
||||
suffixes = list(" Aptosis")
|
||||
|
||||
/datum/symptom/radconversion/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.stage_rate >= 6)
|
||||
|
||||
@@ -34,6 +34,9 @@ Bonus
|
||||
"Stage Speed 10" = "Further increases cooling speed."
|
||||
)
|
||||
|
||||
bodies = list("Shiver")
|
||||
suffixes = list(" Shivers")
|
||||
|
||||
/datum/symptom/shivering/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.stage_rate >= 5)
|
||||
|
||||
@@ -43,7 +43,11 @@ BONUS
|
||||
min_size = RESIZE_NORMAL
|
||||
max_size = RESIZE_MAXIMUM
|
||||
|
||||
prefixes = list("Growing ", "Gigantic ")
|
||||
|
||||
/datum/symptom/size/shrink
|
||||
name = "Dwindling Malady"
|
||||
min_size = RESIZE_MINIMUM
|
||||
max_size = RESIZE_NORMAL
|
||||
|
||||
prefixes = list("Shrinking ", "Micro-")
|
||||
|
||||
@@ -35,6 +35,9 @@ Bonus
|
||||
"Trasmission 12" = "The host may spread the disease through sneezing."
|
||||
)
|
||||
|
||||
prefixes = list("Nasal ")
|
||||
bodies = list("Cold")
|
||||
|
||||
/datum/symptom/sneeze/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
@@ -86,6 +89,9 @@ Bonus
|
||||
level = 4
|
||||
severity = 3
|
||||
|
||||
prefixes = list("Nasal ", "Displacing ")
|
||||
bodies = list("Cold", "Bluespace")
|
||||
|
||||
/datum/symptom/bsneeze/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -31,6 +31,9 @@ BONUS
|
||||
|
||||
var/bigspin = FALSE
|
||||
|
||||
prefixes = list("Spinning ", "Rotatory ")
|
||||
bodies = list("Rotato")
|
||||
|
||||
/datum/symptom/spyndrome/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -34,12 +34,17 @@ Bonus
|
||||
"Stage 8" = "The virus causes extreme nervousness and paranoia, resulting in occasional hallucinations, and extreme restlessness, but great overall energy."
|
||||
)
|
||||
|
||||
prefixes = list("Gray ", "Amped ", "Nervous ")
|
||||
bodies = list("Hyper")
|
||||
|
||||
/datum/symptom/stimulant/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.resistance >= 8)
|
||||
severity -= 1
|
||||
if(A.stage_rate >= 8)
|
||||
severity -= 1
|
||||
prefixes = list("Gray ", "Amped ", "Paranoid ")
|
||||
suffixes = list(" Madness", " Insanity")
|
||||
|
||||
/datum/symptom/stimulant/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
|
||||
@@ -29,6 +29,10 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
|
||||
var/neutered = FALSE
|
||||
var/stopped = FALSE // Used for Viral Suspended Animaton, stops a symptom but doesn't neuter it.
|
||||
|
||||
var/list/prefixes = list()
|
||||
var/list/bodies = list()
|
||||
var/list/suffixes = list()
|
||||
|
||||
/datum/symptom/New()
|
||||
var/list/S = GLOB.list_symptoms
|
||||
for(var/i = 1; i <= length(S); i++)
|
||||
@@ -53,6 +57,9 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
|
||||
|
||||
/datum/symptom/proc/severityset(datum/disease/advance/A)
|
||||
severity = initial(severity)
|
||||
prefixes = initial(prefixes)
|
||||
bodies = initial(bodies)
|
||||
suffixes = initial(suffixes)
|
||||
|
||||
// Called when the advance disease is going to be deleted or when the advance disease stops processing.
|
||||
/datum/symptom/proc/End(datum/disease/advance/A)
|
||||
|
||||
@@ -23,6 +23,8 @@ BONUS
|
||||
level = 4
|
||||
severity = 0
|
||||
|
||||
prefixes = list("Chronic ")
|
||||
|
||||
/*
|
||||
//////////////////////////////////////
|
||||
Viral evolution
|
||||
@@ -47,6 +49,8 @@ BONUS
|
||||
transmission = 3
|
||||
level = 4
|
||||
|
||||
prefixes = list("Unstable ")
|
||||
|
||||
/datum/symptom/viralpower
|
||||
name = "Viral Power Multiplier"
|
||||
desc = "The vrus has more powerful symptoms. May have unpredictable effects."
|
||||
@@ -116,6 +120,8 @@ BONUS
|
||||
|
||||
var/time_to_cure
|
||||
|
||||
prefixes = list("Spontaneous ")
|
||||
|
||||
/datum/symptom/viralreverse/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -35,6 +35,10 @@ Bonus
|
||||
"Stealth 4" = "The symptom remains hidden until active."
|
||||
)
|
||||
|
||||
prefixes = list("Eye ")
|
||||
bodies = list("Blind")
|
||||
suffixes = list(" Blindness")
|
||||
|
||||
/datum/symptom/visionloss/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.resistance >= 12)
|
||||
|
||||
@@ -37,6 +37,10 @@ Bonus
|
||||
"Stealth 4" = "The symptom remans hidden until active."
|
||||
)
|
||||
|
||||
prefixes = list("Digestive ")
|
||||
bodies = list("Vomit")
|
||||
suffixes = list(" Emission")
|
||||
|
||||
/datum/symptom/vomit/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -26,6 +26,8 @@ Bonus
|
||||
level = 3
|
||||
severity = 3
|
||||
|
||||
prefixes = list("Weakening ", "Weak's ")
|
||||
|
||||
/datum/symptom/weakness/Activate(datum/disease/advance/A)
|
||||
..()
|
||||
if(prob(SYMPTOM_ACTIVATION_PROB))
|
||||
|
||||
@@ -35,6 +35,8 @@ Bonus
|
||||
"Stealth 2" = "The symptom is less noticeable, and does not cause starvation."
|
||||
)
|
||||
|
||||
prefixes = list("Hungry ")
|
||||
|
||||
/datum/symptom/weight_loss/severityset(datum/disease/advance/A)
|
||||
. = ..()
|
||||
if(A.stealth >= 2)
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
symptom_delay_min = 25 SECONDS
|
||||
symptom_delay_max = 50 SECONDS
|
||||
|
||||
prefixes = list("Eternal ")
|
||||
bodies = list("Immortal", "Elixir")
|
||||
|
||||
/datum/symptom/youth/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/anxiety
|
||||
name = "Severe Anxiety"
|
||||
medical_name = "Lepidopteric Hyperemesis"
|
||||
form = "Infection"
|
||||
max_stages = 4
|
||||
spread_text = "On contact"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/datum/disease/appendicitis
|
||||
form = "Condition"
|
||||
name = "Appendicitis"
|
||||
medical_name = "Appendicitis"
|
||||
max_stages = 3
|
||||
spread_text = "Non-contagious"
|
||||
disease_flags = CAN_CARRY|CAN_RESIST|CAN_NOT_POPULATE
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/beesease
|
||||
name = "Beesease"
|
||||
medical_name = "Apidaemia"
|
||||
form = "Infection"
|
||||
max_stages = 4
|
||||
spread_text = "On contact"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/brainrot
|
||||
name = "Brainrot"
|
||||
medical_name = "Encephalonecrosis"
|
||||
max_stages = 4
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS | DISEASE_SPREAD_CONTACT
|
||||
@@ -8,7 +9,7 @@
|
||||
agent = "Cryptococcus Cosmosis"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
cure_chance = 15
|
||||
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
|
||||
desc = "Destroys the braincells, causing brain fever, brain necrosis and general intoxication."
|
||||
required_organs = list(/obj/item/organ/internal/brain)
|
||||
danger = DISEASE_HARMFUL
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/choreomania
|
||||
name = "Choreomania"
|
||||
medical_name = "Choreatic Hyperkinesia"
|
||||
max_stages = 3
|
||||
spread_text = "Airborne"
|
||||
spread_flags = DISEASE_SPREAD_AIRBORNE | DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/cold
|
||||
name = "The Cold"
|
||||
medical_name = "Common Cold"
|
||||
max_stages = 3
|
||||
spread_text = "Airborne"
|
||||
spread_flags = DISEASE_SPREAD_AIRBORNE
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/fake_gbs
|
||||
name = "GBS"
|
||||
medical_name = "Neutered Guillain-Barré Syndrome"
|
||||
max_stages = 5
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
|
||||
@@ -7,7 +8,7 @@
|
||||
cures = list(REAGENT_ID_ADRANOL, REAGENT_ID_SULFUR)
|
||||
agent = "Gravitokinetic Bipotential SADS-"
|
||||
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
|
||||
desc = "if left untreated death will occur."
|
||||
desc = "If left untreated death will occur."
|
||||
danger = DISEASE_BIOHAZARD // Mimics real GBS
|
||||
|
||||
/datum/disease/fake_gbs/stage_act()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/flu
|
||||
name = "The Flu"
|
||||
medical_name = "Influenza"
|
||||
max_stages = 3
|
||||
spread_text = "Airborne"
|
||||
cure_text = REAGENT_SPACEACILLIN
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/food_poisoning
|
||||
name = "Food Poisoning"
|
||||
medical_name = "Gastroenteritis"
|
||||
max_stages = 3
|
||||
stage_prob = 5
|
||||
spread_text = "Non-Contagious"
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
/datum/disease/gbs
|
||||
name = "GBS"
|
||||
medical_name = "Guillain-Barré Syndrome"
|
||||
desc = "If left untreated death will occur."
|
||||
max_stages = 5
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
|
||||
@@ -40,6 +42,8 @@
|
||||
|
||||
/datum/disease/gbs/curable
|
||||
name = "Non-Contagious GBS"
|
||||
medical_name = "Non-Contagious Guillain-Barré Syndrome"
|
||||
desc = "If left untreated death will occur."
|
||||
stage_prob = 5
|
||||
spread_text = "Non-contagious"
|
||||
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/lycan
|
||||
name = "Lycancoughy"
|
||||
medical_name = "Lycanthropic Hyperemesis"
|
||||
form = "Infection"
|
||||
max_stages = 4
|
||||
spread_text = "On contact"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/disease/magnitis
|
||||
name = "Magnitis"
|
||||
medical_name = "Acquired Magnetotaxis Disorder"
|
||||
max_stages = 4
|
||||
spread_text = "Airbone"
|
||||
cure_text = REAGENT_IRON
|
||||
|
||||
@@ -0,0 +1,251 @@
|
||||
///Climbable element. Allows climbing an object using mousedrag or a verb
|
||||
/datum/element/climbable
|
||||
element_flags = ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_BESPOKE
|
||||
argument_hash_start_idx = 2
|
||||
|
||||
VAR_PRIVATE/list/current_climbers
|
||||
VAR_PRIVATE/climb_delay = 3.5 SECONDS
|
||||
VAR_PRIVATE/climb_to_adjacent_turf = FALSE // for railings
|
||||
|
||||
/datum/element/climbable/Attach(obj/target, var/climb_delay = 3.5 SECONDS, var/vaulting = FALSE)
|
||||
. = ..()
|
||||
if(!isobj(target))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
|
||||
src.climb_delay = climb_delay
|
||||
src.climb_to_adjacent_turf = vaulting
|
||||
|
||||
RegisterSignal(target, COMSIG_CLIMBABLE_START_CLIMB, PROC_REF(start_climb))
|
||||
RegisterSignal(target, COMSIG_CLIMBABLE_SHAKE_CLIMBERS, PROC_REF(shaken))
|
||||
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(move_shaken))
|
||||
RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
|
||||
target.verbs += /obj/proc/climb_on
|
||||
|
||||
ADD_TRAIT(target, TRAIT_CLIMBABLE, ELEMENT_TRAIT(type))
|
||||
|
||||
/datum/element/climbable/Detach(obj/source)
|
||||
UnregisterSignal(source, COMSIG_CLIMBABLE_START_CLIMB)
|
||||
UnregisterSignal(source, COMSIG_CLIMBABLE_SHAKE_CLIMBERS)
|
||||
UnregisterSignal(source, COMSIG_MOVABLE_MOVED)
|
||||
UnregisterSignal(source, COMSIG_PARENT_EXAMINE)
|
||||
source.verbs -= /obj/proc/climb_on
|
||||
|
||||
REMOVE_TRAIT(source, TRAIT_CLIMBABLE, ELEMENT_TRAIT(type))
|
||||
return ..()
|
||||
|
||||
|
||||
/// Starts climbing the object
|
||||
/datum/element/climbable/proc/start_climb(var/obj/climbed_thing, mob/user)
|
||||
SIGNAL_HANDLER
|
||||
var/mob/living/H = user
|
||||
if(istype(H) && can_climb(climbed_thing,H))
|
||||
addtimer(CALLBACK(src, PROC_REF(do_climb), climbed_thing, user, climb_delay), 0, TIMER_DELETE_ME) // Isolate from signal handler
|
||||
|
||||
/// Check if the mob is in any condition to climb the object, if the destination is blocked, and how to climb it
|
||||
/datum/element/climbable/proc/can_climb(var/obj/climbed_thing, var/mob/living/user, post_climb_check=0)
|
||||
if(user.is_incorporeal()) // No! Bad shadekin!
|
||||
return FALSE
|
||||
|
||||
var/list/climbers = LAZYACCESS(current_climbers, climbed_thing)
|
||||
if (!can_touch(climbed_thing, user) || (!post_climb_check && (user in climbers)))
|
||||
return FALSE
|
||||
|
||||
if (!user.Adjacent(climbed_thing))
|
||||
to_chat(user, span_danger("You can't climb there, the way is blocked."))
|
||||
return FALSE
|
||||
|
||||
var/obj/occupied = can_climb_turf(climbed_thing)
|
||||
if(occupied)
|
||||
to_chat(user, span_danger("There's \a [occupied] in the way."))
|
||||
return FALSE
|
||||
|
||||
// Railings are a bit snowflakey, but needed for when you climb from their turf to their facing turf!
|
||||
if(climb_to_adjacent_turf)
|
||||
if(get_turf(user) == get_turf(climbed_thing))
|
||||
occupied = can_climb_neighbor_turf(climbed_thing)
|
||||
if(occupied)
|
||||
to_chat(user, span_danger("You can't climb there, there's \a [occupied] in the way."))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/// Performs the wait and any remaining checks before the climb resolves.
|
||||
/datum/element/climbable/proc/do_climb(var/obj/climbed_thing, var/mob/living/user, var/delay_time)
|
||||
if(QDELETED(user) || QDELETED(climbed_thing))
|
||||
return
|
||||
|
||||
user.visible_message(span_warning("[user] starts climbing onto \the [climbed_thing]!"))
|
||||
LAZYADDASSOCLIST(current_climbers, climbed_thing, user)
|
||||
|
||||
if(do_after(user,(issmall(user) ? delay_time * 0.6 : delay_time)))
|
||||
if(can_climb(climbed_thing, user, post_climb_check=1))
|
||||
climb_to(climbed_thing, user)
|
||||
if(get_turf(user) == get_turf(climbed_thing))
|
||||
user.visible_message(span_warning("[user] climbs onto \the [climbed_thing]!"))
|
||||
else
|
||||
user.visible_message(span_warning("[user] climbed over \the [climbed_thing]!"))
|
||||
else
|
||||
to_chat(user, span_warning("You fail to climb onto \the [climbed_thing]."))
|
||||
LAZYREMOVEASSOC(current_climbers, climbed_thing, user)
|
||||
|
||||
/// Resolve the climb by moving the mob to its final destination.
|
||||
/datum/element/climbable/proc/climb_to(var/obj/climbed_thing, var/mob/living/user)
|
||||
if(climb_to_adjacent_turf && get_turf(user) == get_turf(climbed_thing))
|
||||
user.forceMove(get_step(climbed_thing, climbed_thing.dir))
|
||||
else
|
||||
user.forceMove(get_turf(climbed_thing))
|
||||
|
||||
/// Check if a mob is capable of climbing at all
|
||||
/datum/element/climbable/proc/can_touch(var/obj/climbed_thing, var/mob/user)
|
||||
if (!user)
|
||||
return 0
|
||||
if(!climbed_thing.Adjacent(user))
|
||||
return 0
|
||||
if (user.restrained() || user.buckled)
|
||||
to_chat(user, span_notice("You need your hands and legs free for this."))
|
||||
return 0
|
||||
if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
|
||||
return 0
|
||||
if (isAI(user))
|
||||
to_chat(user, span_notice("You need hands for this."))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/// Shakes an object, called from movement so it needs to be cleaned up a bit!
|
||||
/datum/element/climbable/proc/move_shaken(obj/climbed_thing, atom/oldloc, direction, forced, list/old_locs, momentum_change)
|
||||
SIGNAL_HANDLER
|
||||
if(!forced) // Don't perform this if going up stairs
|
||||
shaken(climbed_thing, null)
|
||||
|
||||
/// Shakes an object, if anyone is climbing it, causes them to fall off it.
|
||||
/datum/element/climbable/proc/shaken(var/obj/climbed_thing, var/mob/user)
|
||||
SIGNAL_HANDLER
|
||||
var/list/climbers = LAZYACCESS(current_climbers, climbed_thing)
|
||||
// You cannot shake yourself
|
||||
if(user) // Crates pass null on open because no user
|
||||
if(!LAZYLEN(climbers) || (user in climbers))
|
||||
return
|
||||
user.visible_message(span_warning("\The [user] shakes \the [climbed_thing]."), span_notice("You shake \the [climbed_thing]."))
|
||||
|
||||
for(var/mob/living/M in climbers)
|
||||
M.Weaken(1)
|
||||
to_chat(M, span_danger("You topple as you are shaken off \the [climbed_thing]!"))
|
||||
climbers.Cut(1,2)
|
||||
|
||||
for(var/mob/living/M in get_turf(climbed_thing))
|
||||
if(M.is_incorporeal())
|
||||
continue
|
||||
if(M.lying) //No spamming this on people.
|
||||
continue
|
||||
if(M.pulling == climbed_thing) // Pulling stuff up stairs can get weird
|
||||
continue
|
||||
|
||||
M.Weaken(3)
|
||||
to_chat(M, span_danger("You topple as \the [climbed_thing] moves under you!"))
|
||||
|
||||
if(prob(25))
|
||||
var/damage = rand(15,30)
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!istype(H))
|
||||
to_chat(H, span_danger("You land heavily!"))
|
||||
M.adjustBruteLoss(damage)
|
||||
continue
|
||||
|
||||
var/obj/item/organ/external/affecting
|
||||
|
||||
switch(pick(list("ankle","wrist","head","knee","elbow")))
|
||||
if("ankle")
|
||||
affecting = H.get_organ(pick(BP_L_FOOT, BP_R_FOOT))
|
||||
if("knee")
|
||||
affecting = H.get_organ(pick(BP_L_LEG, BP_R_LEG))
|
||||
if("wrist")
|
||||
affecting = H.get_organ(pick(BP_L_HAND, BP_R_HAND))
|
||||
if("elbow")
|
||||
affecting = H.get_organ(pick(BP_L_ARM, BP_R_ARM))
|
||||
if("head")
|
||||
affecting = H.get_organ(BP_HEAD)
|
||||
|
||||
if(affecting)
|
||||
to_chat(M, span_danger("You land heavily on your [affecting.name]!"))
|
||||
affecting.take_damage(damage, 0)
|
||||
if(affecting.parent)
|
||||
affecting.parent.add_autopsy_data("Misadventure", damage)
|
||||
else
|
||||
to_chat(H, span_danger("You land heavily!"))
|
||||
H.adjustBruteLoss(damage)
|
||||
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
|
||||
/datum/element/climbable/proc/on_examine(datum/source, mob/user, list/examine_texts)
|
||||
SIGNAL_HANDLER
|
||||
examine_texts += span_notice("It looks climbable.")
|
||||
|
||||
// Cliff climbing requires climbing gear.
|
||||
/datum/element/climbable/cliff/do_climb(obj/climbed_thing, mob/living/user, delay_time)
|
||||
// Special snowflake handling, because north facing cliffs require half the time
|
||||
var/obj/structure/cliff/C = climbed_thing
|
||||
if(C.is_double_cliff)
|
||||
delay_time /= 2
|
||||
. = ..(climbed_thing, user, delay_time)
|
||||
|
||||
/datum/element/climbable/cliff/can_climb(var/obj/climbed_thing, var/mob/living/user, post_climb_check=0)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/clothing/shoes/shoes = H.shoes
|
||||
if(shoes && shoes.rock_climbing)
|
||||
return ..() // Do the other checks too.
|
||||
|
||||
to_chat(user, span_warning("\The [climbed_thing] is too steep to climb unassisted."))
|
||||
return FALSE
|
||||
|
||||
|
||||
// Breaks if climbed while unanchored, railings.
|
||||
/datum/element/climbable/unanchored_can_break/climb_to(var/obj/climbed_thing, var/mob/living/user)
|
||||
. = ..()
|
||||
if(!climbed_thing.anchored)
|
||||
climbed_thing.take_damage(9999) // Fatboy, was originally maxhealth, but that var doesn't exist on everything
|
||||
|
||||
|
||||
// Table flipping is important!
|
||||
/datum/element/climbable/table/climb_to(var/obj/climbed_thing, mob/living/mover)
|
||||
var/obj/structure/table/TBL = climbed_thing
|
||||
if(TBL.flipped == 1 && mover.loc == TBL.loc)
|
||||
var/turf/T = get_step(climbed_thing, TBL.dir)
|
||||
if(T.Enter(mover))
|
||||
return T
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
/// Verb for climbing objects, calls same signal as mouse drop
|
||||
/obj/proc/climb_on()
|
||||
set name = "Climb structure"
|
||||
set desc = "Climbs onto a structure."
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_CLIMBABLE_START_CLIMB, usr)
|
||||
|
||||
/// Checks if something is blocking our climb destination, ignores climbable objects
|
||||
/proc/can_climb_turf(var/obj/climbed_thing)
|
||||
var/turf/T = get_turf(climbed_thing)
|
||||
if(!T || !istype(T))
|
||||
return "empty void"
|
||||
if(T.density)
|
||||
return T
|
||||
for(var/obj/O in T.contents)
|
||||
if(O && O.density && !(O.flags & ON_BORDER) && !HAS_TRAIT(O,TRAIT_CLIMBABLE)) //ON_BORDER structures are handled by the Adjacent() check.
|
||||
return O
|
||||
return 0
|
||||
|
||||
/// Check if the destination turf for vaulting is blocked by something. Extremely similar to above.
|
||||
/proc/can_climb_neighbor_turf(var/obj/climbed_thing)
|
||||
var/turf/T = get_step(climbed_thing, climbed_thing.dir)
|
||||
if(!T || !istype(T))
|
||||
return 0
|
||||
if(T.density == 1)
|
||||
return T
|
||||
for(var/obj/O in T.contents)
|
||||
if(O && O.density && !(O.flags & ON_BORDER && !(turn(O.dir, 180) & climbed_thing.dir)) && !HAS_TRAIT(O,TRAIT_CLIMBABLE))
|
||||
return O
|
||||
return 0
|
||||
@@ -82,10 +82,7 @@
|
||||
/datum/forensics_crime/proc/merge_prints(var/datum/forensics_crime/origin)
|
||||
if(!islist(origin?.fingerprints))
|
||||
return
|
||||
if(fingerprints)
|
||||
fingerprints |= origin.fingerprints
|
||||
else
|
||||
fingerprints = origin.fingerprints.Copy()
|
||||
LAZYOR(fingerprints,origin.fingerprints)
|
||||
|
||||
/// Clears data to default state, wiping all evidence
|
||||
/datum/forensics_crime/proc/clear_prints()
|
||||
@@ -146,10 +143,7 @@
|
||||
/datum/forensics_crime/proc/merge_hiddenprints(var/datum/forensics_crime/origin)
|
||||
if(!islist(origin?.fingerprintshidden))
|
||||
return
|
||||
if(fingerprintshidden)
|
||||
fingerprintshidden |= origin.fingerprintshidden
|
||||
else
|
||||
fingerprintshidden = origin.fingerprintshidden.Copy()
|
||||
LAZYOR(fingerprintshidden,origin.fingerprintshidden)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -201,10 +195,7 @@
|
||||
/datum/forensics_crime/proc/merge_fibres(var/datum/forensics_crime/origin)
|
||||
if(!islist(origin?.suit_fibres))
|
||||
return
|
||||
if(suit_fibres)
|
||||
suit_fibres |= origin.suit_fibres
|
||||
else
|
||||
suit_fibres = origin.suit_fibres.Copy()
|
||||
LAZYOR(suit_fibres,origin.suit_fibres)
|
||||
|
||||
/// Clears data to default state, wiping all evidence
|
||||
/datum/forensics_crime/proc/clear_fibres()
|
||||
@@ -262,18 +253,12 @@
|
||||
/datum/forensics_crime/proc/merge_blooddna(var/datum/forensics_crime/origin, var/list/raw_list = null)
|
||||
// Copying from a list, blood on a mob's feet is stored as a list outside of forensics data
|
||||
if(raw_list)
|
||||
if(blood_DNA)
|
||||
blood_DNA |= raw_list
|
||||
else
|
||||
blood_DNA = raw_list.Copy()
|
||||
LAZYOR(blood_DNA,raw_list)
|
||||
return
|
||||
// Copying from another datums
|
||||
if(!islist(origin?.blood_DNA))
|
||||
return
|
||||
if(blood_DNA)
|
||||
blood_DNA |= origin.blood_DNA
|
||||
else
|
||||
blood_DNA = origin.blood_DNA.Copy()
|
||||
LAZYOR(blood_DNA,origin.blood_DNA)
|
||||
|
||||
/// Clears data to default state, wiping all evidence
|
||||
/datum/forensics_crime/proc/clear_blooddna()
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
satchel_one = /obj/item/storage/backpack/satchel/eng
|
||||
id_type = /obj/item/card/id/cargo/miner
|
||||
pda_type = /obj/item/pda/shaftminer
|
||||
backpack_contents = list(/obj/item/tool/crowbar = 1, /obj/item/storage/bag/ore = 1)
|
||||
backpack_contents = list(/obj/item/tool/crowbar = 1, /obj/item/storage/bag/ore = 1, /obj/item/mining_voucher = 1)
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
|
||||
|
||||
headset = /obj/item/radio/headset/miner
|
||||
|
||||
@@ -26,76 +26,6 @@
|
||||
if(!CONFIG_GET(flag/enable_stat_tracking))
|
||||
return
|
||||
|
||||
/proc/sql_report_death(var/mob/living/carbon/human/H)
|
||||
if(!CONFIG_GET(flag/enable_stat_tracking))
|
||||
return
|
||||
if(!H)
|
||||
return
|
||||
if(!H.key || !H.mind)
|
||||
return
|
||||
|
||||
var/area/placeofdeath = get_area(H)
|
||||
var/podname = placeofdeath ? placeofdeath.name : "Unknown area"
|
||||
|
||||
var/sqlname = sanitizeSQL(H.real_name)
|
||||
var/sqlkey = sanitizeSQL(H.key)
|
||||
var/sqlpod = sanitizeSQL(podname)
|
||||
var/sqlspecial = sanitizeSQL(H.mind.special_role)
|
||||
var/sqljob = sanitizeSQL(H.mind.assigned_role)
|
||||
var/laname
|
||||
var/lakey
|
||||
if(H.lastattacker)
|
||||
laname = sanitizeSQL(H.lastattacker:real_name)
|
||||
lakey = sanitizeSQL(H.lastattacker:key)
|
||||
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
|
||||
var/coord = "[H.x], [H.y], [H.z]"
|
||||
//to_world("INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])")
|
||||
establish_db_connection()
|
||||
if(!SSdbcore.IsConnected())
|
||||
log_game("SQL ERROR during death reporting. Failed to connect.")
|
||||
else
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()], '[coord]')")
|
||||
if(!query.Execute())
|
||||
var/err = query.ErrorMsg()
|
||||
log_game("SQL ERROR during death reporting. Error : \[[err]\]\n")
|
||||
qdel(query)
|
||||
|
||||
|
||||
/proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H)
|
||||
if(!CONFIG_GET(flag/enable_stat_tracking))
|
||||
return
|
||||
if(!H)
|
||||
return
|
||||
if(!H.key || !H.mind)
|
||||
return
|
||||
|
||||
var/area/placeofdeath = get_area(H)
|
||||
var/podname = placeofdeath ? placeofdeath.name : "Unknown area"
|
||||
|
||||
var/sqlname = sanitizeSQL(H.real_name)
|
||||
var/sqlkey = sanitizeSQL(H.key)
|
||||
var/sqlpod = sanitizeSQL(podname)
|
||||
var/sqlspecial = sanitizeSQL(H.mind.special_role)
|
||||
var/sqljob = sanitizeSQL(H.mind.assigned_role)
|
||||
var/laname
|
||||
var/lakey
|
||||
if(H.lastattacker)
|
||||
laname = sanitizeSQL(H.lastattacker:real_name)
|
||||
lakey = sanitizeSQL(H.lastattacker:key)
|
||||
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
|
||||
var/coord = "[H.x], [H.y], [H.z]"
|
||||
//to_world("INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])")
|
||||
establish_db_connection()
|
||||
if(!SSdbcore.IsConnected())
|
||||
log_game("SQL ERROR during death reporting. Failed to connect.")
|
||||
else
|
||||
var/datum/db_query/query = SSdbcore.NewQuery("INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()], '[coord]')")
|
||||
if(!query.Execute())
|
||||
var/err = query.ErrorMsg()
|
||||
log_game("SQL ERROR during death reporting. Error : \[[err]\]\n")
|
||||
qdel(query)
|
||||
|
||||
|
||||
/proc/statistic_cycle()
|
||||
set waitfor = 0
|
||||
if(!CONFIG_GET(flag/enable_stat_tracking))
|
||||
|
||||
+11
-4
@@ -196,11 +196,18 @@
|
||||
else
|
||||
f_name += "oil-stained [name][infix]."
|
||||
|
||||
var/examine_text = replacetext(get_examine_desc(), "||", "")
|
||||
var/list/output = list("[icon2html(src,user.client)] That's [f_name] [suffix]", examine_text)
|
||||
var/borg = "" // Borg grippers say if the item can be gripped
|
||||
if(isrobot(user) && isitem(src))
|
||||
borg = "None of your grippers can hold this."
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(R.module?.modules)
|
||||
for(var/obj/item/gripper/G in R.module.modules)
|
||||
if(is_type_in_list(src,G.can_hold))
|
||||
borg = span_boldnotice("\The [G]") + span_notice(" can hold this.")
|
||||
break
|
||||
|
||||
if(user.client?.prefs.examine_text_mode == EXAMINE_MODE_INCLUDE_USAGE)
|
||||
output += description_info
|
||||
var/examine_text = replacetext(get_examine_desc(), "||", "")
|
||||
var/list/output = list("[icon2html(src,user.client)] That's [f_name] [suffix] [borg]", examine_text)
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, output)
|
||||
return output
|
||||
|
||||
@@ -94,40 +94,29 @@
|
||||
if(P == path)
|
||||
continue
|
||||
|
||||
// check if cached first...
|
||||
if(!isnull(conflict_traits[P]))
|
||||
if(quick_scan && conflict_traits[P])
|
||||
// Quickscan time
|
||||
if(quick_scan)
|
||||
if(P in conflict_traits)
|
||||
return TRUE
|
||||
continue
|
||||
|
||||
// check trait if not. CONFLICT-O-TRON ENGAGE
|
||||
conflict_traits[P] = FALSE
|
||||
|
||||
var/datum/trait/instance_test = GLOB.all_traits[P]
|
||||
if(path in instance_test.excludes)
|
||||
conflict_traits[P] = TRUE
|
||||
conflict_traits |= P
|
||||
has_conflict = TRUE
|
||||
// depending on scan mode we want to scan all, or only the first failure
|
||||
if(quick_scan)
|
||||
return TRUE
|
||||
continue
|
||||
for(var/V in linked_trait.var_changes)
|
||||
if(V == "flags")
|
||||
continue
|
||||
if(V in instance_test.var_changes)
|
||||
conflict_traits[P] = TRUE
|
||||
conflict_traits |= P
|
||||
has_conflict = TRUE
|
||||
// depending on scan mode we want to scan all, or only the first failure
|
||||
if(quick_scan)
|
||||
return TRUE
|
||||
continue
|
||||
for(var/V in linked_trait.var_changes_pref)
|
||||
if(V in instance_test.var_changes_pref)
|
||||
conflict_traits[P] = TRUE
|
||||
conflict_traits |= P
|
||||
has_conflict = TRUE
|
||||
// depending on scan mode we want to scan all, or only the first failure
|
||||
if(quick_scan)
|
||||
return TRUE
|
||||
continue
|
||||
return has_conflict
|
||||
|
||||
|
||||
@@ -41,24 +41,17 @@
|
||||
if(blocks_remaining.len < 10)
|
||||
warning("DNA2: Blocks remaining is less than 10. The DNA_SE_LENGTH should be raised in dna.dm.")
|
||||
// Run conflict-o-tron on each traitgene all other traits... Lets setup an initial database of conflicts.
|
||||
// Any remaining conflicts will be handled by the conflict-o-tron midround using a quicker scan flag
|
||||
log_world("DNA2: Checking trait gene conflicts")
|
||||
var/list/compare_list = list()
|
||||
for(var/datum/gene/trait/gene in GLOB.dna_genes) // was orginally all_traits, but having 300 entry lists for 50 genes at launch was pointless. the caches will fill as characters spawn with traits instead... A small tradeoff
|
||||
if(gene.linked_trait)
|
||||
compare_list.Add(gene.linked_trait.type)
|
||||
for(var/datum/gene/trait/gene in GLOB.dna_genes)
|
||||
gene.has_conflict( compare_list, FALSE )
|
||||
gene.has_conflict( GLOB.all_traits, FALSE) // Check all traits beforehand to build the conflict list, so all future checks can be done with a quick contents check
|
||||
log_world("DNA2: Initial Conflict summary")
|
||||
// Future coders: Don't worry, has_conflict() is run whenever a traitgene tries to enable itself as well, and adds to the trait conflict lists in each gene...
|
||||
// This is to setup the initial segments for the gene editing machines to sort gene segments with.
|
||||
for(var/datum/gene/trait/gene in GLOB.dna_genes)
|
||||
if(gene.conflict_traits.len)
|
||||
var/summery = ""
|
||||
for(var/path in gene.conflict_traits)
|
||||
if(gene.conflict_traits[path]) // check if it actually conflicts
|
||||
var/datum/trait/T = GLOB.all_traits[path]
|
||||
if(summery != "")
|
||||
summery += ", "
|
||||
summery += "[T.name]"
|
||||
var/datum/trait/T = GLOB.all_traits[path]
|
||||
if(summery != "")
|
||||
summery += ", "
|
||||
summery += "[T.name]"
|
||||
log_world("DNA2: [gene.get_name()] - ([summery])")
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
take_victim(target, user)
|
||||
|
||||
/obj/machinery/optable/verb/climb_on()
|
||||
/obj/machinery/optable/verb/climb_onto()
|
||||
set name = "Climb On Table"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
/obj/machinery/power/thermoregulator/Initialize(mapload)
|
||||
. = ..()
|
||||
default_apply_parts()
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/power/thermoregulator/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
var/release_log = ""
|
||||
var/update_flag = 0
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/drain_power()
|
||||
return -1
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
var/list/air_mix = StandardAirMix()
|
||||
src.air_contents.adjust_multi(GAS_O2, air_mix[GAS_O2], GAS_N2, air_mix[GAS_N2])
|
||||
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/portable_atmospherics/powered/pump/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
. = ..()
|
||||
if(!skip_cell)
|
||||
cell = new/obj/item/cell/apc(src)
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/portable_atmospherics/powered/scrubber/emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
@@ -173,6 +174,9 @@
|
||||
|
||||
name = "[name] (ID [id])"
|
||||
|
||||
// Not climbable!
|
||||
RemoveElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(var/mob/user as mob)
|
||||
to_chat(user, span_notice("You can't directly interact with this machine. Use the scrubber control console."))
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
/obj/machinery/organ_printer/Initialize(mapload)
|
||||
. = ..()
|
||||
default_apply_parts()
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/organ_printer/examine(var/mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -217,7 +217,11 @@
|
||||
to_chat(O, span_infoplain(span_bold("[U]") + " holds \a [itemname] up to one of your cameras ..."))
|
||||
else
|
||||
to_chat(O, span_infoplain(span_bold("<a href='byond://?src=\ref[O];track2=\ref[O];track=\ref[U];trackname=[U.name]'>[U]</a>") + " holds \a [itemname] up to one of your cameras ..."))
|
||||
O << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", itemname, info), text("window=[]", itemname))
|
||||
|
||||
var/datum/browser/popup = new(O, itemname, itemname)
|
||||
popup.add_head_content("<TITLE>[itemname]</TITLE>")
|
||||
popup.set_content("<TT>[info]</TT>")
|
||||
popup.open()
|
||||
|
||||
else if (istype(W, /obj/item/camera_bug))
|
||||
if (!src.can_use())
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
idle_power_usage = 300
|
||||
active_power_usage = 300
|
||||
blocks_emissive = FALSE
|
||||
var/climbable = TRUE
|
||||
var/list/climbers
|
||||
var/climb_delay = 3.5 SECONDS
|
||||
var/processing = 0
|
||||
|
||||
var/icon_keyboard = "generic_key"
|
||||
@@ -25,8 +22,7 @@
|
||||
. = ..()
|
||||
power_change()
|
||||
update_icon()
|
||||
if(climbable)
|
||||
verbs += /obj/structure/proc/climb_on
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/computer/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
@@ -37,7 +33,6 @@
|
||||
if(prob(20/severity)) set_broken()
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/computer/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
@@ -136,86 +131,3 @@
|
||||
return
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
/obj/machinery/computer/proc/climb_on()
|
||||
set name = "Climb structure"
|
||||
set desc = "Climbs onto a structure."
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
do_climb(usr)
|
||||
|
||||
/obj/machinery/computer/MouseDrop_T(mob/target, mob/user)
|
||||
var/mob/living/H = user
|
||||
if(istype(H) && can_climb(H) && target == user)
|
||||
do_climb(target)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/proc/can_climb(var/mob/living/user, post_climb_check=0)
|
||||
if (!climbable || !can_touch(user) || (!post_climb_check && (user in climbers)))
|
||||
return 0
|
||||
|
||||
if (!user.Adjacent(src))
|
||||
to_chat(user, span_danger("You can't climb there, the way is blocked."))
|
||||
return 0
|
||||
|
||||
var/obj/occupied = turf_is_crowded()
|
||||
if(occupied)
|
||||
to_chat(user, span_danger("There's \a [occupied] in the way."))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/proc/turf_is_crowded()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T || !istype(T))
|
||||
return "empty void"
|
||||
if(T.density)
|
||||
return T
|
||||
for(var/obj/O in T.contents)
|
||||
if(istype(O,/obj/machinery/computer))
|
||||
var/obj/machinery/computer/S = O
|
||||
if(S.climbable) continue
|
||||
if(O && O.density && !(O.flags & ON_BORDER)) //ON_BORDER structures are handled by the Adjacent() check.
|
||||
return O
|
||||
return 0
|
||||
|
||||
/obj/machinery/computer/proc/do_climb(var/mob/living/user)
|
||||
if (!can_climb(user))
|
||||
return
|
||||
|
||||
user.visible_message(span_warning("[user] starts climbing onto \the [src]!"))
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay)))
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if (!can_climb(user, post_climb_check=1))
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
user.forceMove(climb_to(user))
|
||||
|
||||
if (get_turf(user) == get_turf(src))
|
||||
user.visible_message(span_warning("[user] climbs onto \the [src]!"))
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/machinery/computer/proc/climb_to(var/mob/living/user)
|
||||
return get_turf(src)
|
||||
|
||||
|
||||
/obj/machinery/computer/proc/can_touch(var/mob/user)
|
||||
if (!user)
|
||||
return 0
|
||||
if(!Adjacent(user))
|
||||
return 0
|
||||
if (user.restrained() || user.buckled)
|
||||
to_chat(user, span_notice("You need your hands and legs free for this."))
|
||||
return 0
|
||||
if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
|
||||
return 0
|
||||
if (isAI(user))
|
||||
to_chat(user, span_notice("You need hands for this."))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
/obj/machinery/floodlight/Initialize(mapload)
|
||||
. = ..()
|
||||
cell = new(src)
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/floodlight/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
@@ -296,6 +296,8 @@ GLOBAL_LIST(construction_frame_floor)
|
||||
|
||||
update_icon()
|
||||
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/structure/frame/attackby(obj/item/P as obj, mob/user as mob)
|
||||
if(P.has_tool_quality(TOOL_WRENCH))
|
||||
if(state == FRAME_PLACED && !anchored)
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
update_icon()
|
||||
if(!LAZYLEN(getTracksList()))
|
||||
stat |= BROKEN
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/media/jukebox/Destroy()
|
||||
qdel(wires)
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = span_bold("Magnetic Control Console") + "<BR><BR>"
|
||||
var/dat = ""
|
||||
if(!autolink)
|
||||
dat += {"
|
||||
Frequency: <a href='byond://?src=\ref[src];operation=setfreq'>[frequency]</a><br>
|
||||
@@ -263,8 +263,9 @@
|
||||
dat += "Moving: <a href='byond://?src=\ref[src];operation=togglemoving'>[moving ? "Enabled":"Disabled"]</a>"
|
||||
|
||||
|
||||
user << browse("<html>[dat]</html>", "window=magnet;size=400x500")
|
||||
onclose(user, "magnet")
|
||||
var/datum/browser/popup = new(user, "magnet", "Magnetic Control Console", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/magnetic_controller/Topic(href, href_list)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
|
||||
@@ -56,9 +56,10 @@ Please wait until completion...</TT><BR>
|
||||
<A href='byond://?src=\ref[src];make=7'>Robot Frame (75,000 cc metal).<BR>
|
||||
"}
|
||||
|
||||
user << browse("<html><HEAD><TITLE>Robotic Fabricator Control Panel</TITLE></HEAD><TT>[dat]</TT></html>", "window=robot_fabricator")
|
||||
onclose(user, "robot_fabricator")
|
||||
return
|
||||
var/datum/browser/popup = new(user, "robot_fabricator", "Robot Fabricator")
|
||||
popup.add_head_content("<TITLE>Robotic Fabricator Control Panel</TITLE>")
|
||||
popup.set_content("<TT>[dat]</TT>")
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/robotic_fabricator/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
cell = new cell_type(src)
|
||||
default_apply_parts()
|
||||
update_icon()
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/space_heater/RefreshParts(var/limited = 0)
|
||||
min_temperature = DEFAULT_MIN_TEMP
|
||||
|
||||
@@ -32,8 +32,10 @@
|
||||
if(!selfdestructing)
|
||||
dat += "<br><br><A href='byond://?src=\ref[src];betraitor=1;traitormob=\ref[user]'>\"[pick("I want to switch teams.", "I want to work for you.", "Let me join you.", "I can be of use to you.", "You want me working for you, and here's why...", "Give me an objective.", "How's the 401k over at the Syndicate?")]\"</A><BR>"
|
||||
dat += temptext
|
||||
user << browse("<html>[dat]</html>", "window=syndbeacon")
|
||||
onclose(user, "syndbeacon")
|
||||
|
||||
var/datum/browser/popup = new(user, "syndbeacon", "Ominous Beacon")
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/syndicate_beacon/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
if(!selfdestructing)
|
||||
dat += "<br><br><A href='byond://?src=\ref[src];betraitor=1;traitormob=\ref[user]'>\"[pick("Send me some supplies!", "Transfer supplies.")]\"</A><BR>"
|
||||
dat += temptext
|
||||
user << browse("<html>[dat]</html>", "window=syndbeacon")
|
||||
onclose(user, "syndbeacon")
|
||||
|
||||
var/datum/browser/popup = new(user, "syndbeacon", "Ominous Beacon")
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/syndicate_beacon/virgo/Topic(href, href_list)
|
||||
if(href_list["betraitor"])
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
/obj/machinery/washing_machine/Initialize(mapload)
|
||||
. = ..()
|
||||
default_apply_parts()
|
||||
AddElement(/datum/element/climbable)
|
||||
|
||||
/obj/machinery/washing_machine/AltClick()
|
||||
start()
|
||||
|
||||
@@ -38,6 +38,9 @@
|
||||
if(can_buckle && istype(M))
|
||||
if(user_buckle_mob(M, user))
|
||||
return TRUE
|
||||
if(M == user && HAS_TRAIT(src,TRAIT_CLIMBABLE)) // Buckling takes priority
|
||||
SEND_SIGNAL(src, COMSIG_CLIMBABLE_START_CLIMB, user)
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/has_buckled_mobs()
|
||||
return LAZYLEN(buckled_mobs)
|
||||
|
||||
@@ -269,7 +269,7 @@ var/global/list/image/splatter_cache=list()
|
||||
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
|
||||
/obj/effect/decal/cleanable/mucus/mapped/Initialize(mapload)
|
||||
. = ..()
|
||||
viruses |= new /datum/disease/advance
|
||||
viruses |= new /datum/disease/advance/random(rand(3, 6), 9, 4, infected = src)
|
||||
|
||||
/obj/effect/decal/cleanable/mucus/mapped/Destroy()
|
||||
viruses.Cut()
|
||||
|
||||
@@ -47,10 +47,8 @@
|
||||
gib.update_icon()
|
||||
|
||||
gib.init_forensic_data()
|
||||
if(MobDNA)
|
||||
gib.add_blooddna(MobDNA,null)
|
||||
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
|
||||
gib.add_blooddna(null,null)
|
||||
gib.add_blooddna(MobDNA,null)
|
||||
|
||||
if(istype(location,/turf/))
|
||||
var/list/directions = gibdirections[i]
|
||||
if(directions.len)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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--
|
||||
|
||||
@@ -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. \
|
||||
|
||||
@@ -64,11 +64,15 @@
|
||||
icon = 'icons/obj/closets/poireactor.dmi'
|
||||
closet_appearance = null
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor)
|
||||
climbable = FALSE
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/fuel_assembly/deuterium = 6)
|
||||
|
||||
/obj/structure/closet/crate/oldreactor/Initialize(mapload)
|
||||
. = ..()
|
||||
// Not climbable!
|
||||
RemoveElement(/datum/element/climbable)
|
||||
|
||||
/obj/item/poi/brokenoldreactor
|
||||
icon_state = "poireactor_broken"
|
||||
name = "ruptured fission reactor rack"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -42,9 +42,10 @@
|
||||
if(src.occupant)
|
||||
dat += "[src.ready ? "<A href='byond://?src=\ref[src];implant=1'>Implant</A>" : "Recharging"]<BR>"
|
||||
user.set_machine(src)
|
||||
user << browse("<html>[dat]</html>", "window=implant")
|
||||
onclose(user, "implant")
|
||||
|
||||
var/datum/browser/popup = new(user, "implant", "Implant")
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/implantchair/Topic(href, href_list)
|
||||
if((get_dist(src, usr) <= 1) || isAI(usr))
|
||||
|
||||
@@ -26,9 +26,10 @@
|
||||
dat += span_bold("Four uses use them wisely:") + "<BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];spell_teleport=1'>Teleport</A><BR>"
|
||||
dat += "Kind regards,<br>Wizards Federation<br><br>P.S. Don't forget to bring your gear, you'll need it to cast most spells.<HR>"
|
||||
user << browse("<html>[dat]</html>", "window=scroll")
|
||||
onclose(user, "scroll")
|
||||
return
|
||||
|
||||
var/datum/browser/popup = new(user, "scroll", "Scroll")
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/item/teleportation_scroll/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user