Merge pull request #17902 from VOREStation/master

6/22/25 - Map Swap
This commit is contained in:
Casey
2025-06-22 14:37:40 -04:00
committed by GitHub
298 changed files with 4423 additions and 2311 deletions
@@ -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"
+1
View File
@@ -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
+1 -1
View File
@@ -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")
*/
+7 -1
View File
@@ -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)
+7 -9
View File
@@ -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
+9
View File
@@ -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
View File
@@ -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>")
+1
View File
@@ -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
+3
View File
@@ -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"
+2
View File
@@ -0,0 +1,2 @@
/// Trait applied by element
#define ELEMENT_TRAIT(source) "element_trait_[source]"
+3
View File
@@ -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,
)
))
+216 -49
View File
@@ -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
))
+1 -1
View File
@@ -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)
+214 -1
View File
@@ -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)
+47 -2
View File
@@ -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!
+5 -1
View File
@@ -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()
+105 -3
View File
@@ -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
View File
@@ -1,5 +1,6 @@
/datum/disease/anxiety
name = "Severe Anxiety"
medical_name = "Lepidopteric Hyperemesis"
form = "Infection"
max_stages = 4
spread_text = "On contact"
+1
View File
@@ -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
View File
@@ -1,5 +1,6 @@
/datum/disease/beesease
name = "Beesease"
medical_name = "Apidaemia"
form = "Infection"
max_stages = 4
spread_text = "On contact"
+2 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
+2 -1
View File
@@ -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
View File
@@ -1,5 +1,6 @@
/datum/disease/flu
name = "The Flu"
medical_name = "Influenza"
max_stages = 3
spread_text = "Airborne"
cure_text = REAGENT_SPACEACILLIN
+1
View File
@@ -1,5 +1,6 @@
/datum/disease/food_poisoning
name = "Food Poisoning"
medical_name = "Gastroenteritis"
max_stages = 3
stage_prob = 5
spread_text = "Non-Contagious"
+4
View File
@@ -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
View File
@@ -1,5 +1,6 @@
/datum/disease/lycan
name = "Lycancoughy"
medical_name = "Lycanthropic Hyperemesis"
form = "Infection"
max_stages = 4
spread_text = "On contact"
+1
View File
@@ -1,5 +1,6 @@
/datum/disease/magnitis
name = "Magnitis"
medical_name = "Acquired Magnetotaxis Disorder"
max_stages = 4
spread_text = "Airbone"
cure_text = REAGENT_IRON
+251
View File
@@ -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
+5 -20
View File
@@ -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()
+1 -1
View File
@@ -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
-70
View File
@@ -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
View File
@@ -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
+6 -17
View File
@@ -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
+5 -12
View File
@@ -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])")
+1 -1
View File
@@ -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)
+1
View File
@@ -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
+2
View File
@@ -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."))
+1
View File
@@ -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)
. = ..()
+5 -1
View File
@@ -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())
+1 -89
View File
@@ -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
+1
View File
@@ -16,6 +16,7 @@
/obj/machinery/floodlight/Initialize(mapload)
. = ..()
cell = new(src)
AddElement(/datum/element/climbable)
/obj/machinery/floodlight/update_icon()
cut_overlays()
+2
View File
@@ -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)
+1
View File
@@ -35,6 +35,7 @@
update_icon()
if(!LAZYLEN(getTracksList()))
stat |= BROKEN
AddElement(/datum/element/climbable)
/obj/machinery/media/jukebox/Destroy()
qdel(wires)
+4 -3
View File
@@ -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))
+4 -3
View File
@@ -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(..())
+1
View File
@@ -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
+4 -2
View File
@@ -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(..())
+4 -2
View File
@@ -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"])
+1
View File
@@ -32,6 +32,7 @@
/obj/machinery/washing_machine/Initialize(mapload)
. = ..()
default_apply_parts()
AddElement(/datum/element/climbable)
/obj/machinery/washing_machine/AltClick()
start()
+3
View File
@@ -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()
+2 -4
View File
@@ -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)
+14 -14
View File
@@ -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. \
+5 -1
View File
@@ -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"
+2
View File
@@ -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))
+4 -3
View File
@@ -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