Skip to content

Commit

Permalink
Merge branch 'upstream-master' into merge-upstream
Browse files Browse the repository at this point in the history
  • Loading branch information
larentoun committed Nov 21, 2024
2 parents a4c3402 + 85e5eb2 commit 84ab340
Show file tree
Hide file tree
Showing 217 changed files with 2,473 additions and 1,597 deletions.
4 changes: 2 additions & 2 deletions .github/guides/ISSUE_MANAGER.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ If an issue reports a runtime, it must have the actual runtime call stack provid
- usr.loc: the floor (150,25,4) (/turf/open/floor/circuit)
- call stack:
- Camera Net (/datum/cameranet): visibility(/list (/list), null, /list (/list), 1)
- AI (/mob/living/silicon/ai): camera visibility(Inactive AI Eye (/mob/eye/ai_eye))
- Inactive AI Eye (/mob/eye/ai_eye): setLoc(the floor (150,25,4) (/turf/open/floor/circuit), 0)
- AI (/mob/living/silicon/ai): camera visibility(Inactive AI Eye (/mob/eye/camera/ai))
- Inactive AI Eye (/mob/eye/camera/ai): setLoc(the floor (150,25,4) (/turf/open/floor/circuit), 0)
- AI (/mob/living/silicon/ai): create eye()
- AI (/mob/living/silicon/ai): Initialize(0, null, TagGamerGame2 (/mob/dead/new_player))
- Atoms (/datum/controller/subsystem/atoms): InitAtom(AI (/mob/living/silicon/ai), 0, /list (/list))
Expand Down
3 changes: 2 additions & 1 deletion _maps/map_files/Birdshot/birdshot.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -50755,7 +50755,8 @@
"rqt" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/decal/cleanable/dirt,
/obj/structure/aquarium/lawyer,
/obj/item/fish_tank/lawyer,
/obj/structure/table/wood,
/turf/open/floor/iron/dark,
/area/station/service/lawoffice)
"rqw" = (
Expand Down
3 changes: 2 additions & 1 deletion _maps/map_files/Deltastation/DeltaStation2.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -44890,7 +44890,8 @@
/area/station/hallway/primary/fore)
"lhp" = (
/obj/structure/sign/poster/official/report_crimes/directional/south,
/obj/structure/aquarium/lawyer,
/obj/item/fish_tank/lawyer,
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/station/service/lawoffice)
"lhC" = (
Expand Down
3 changes: 2 additions & 1 deletion _maps/map_files/IceBoxStation/IceBoxStation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -7969,7 +7969,8 @@
/turf/open/floor/iron/dark,
/area/station/service/hydroponics/garden)
"cgB" = (
/obj/structure/aquarium/lawyer,
/obj/item/fish_tank/lawyer,
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/station/service/lawoffice)
"cgC" = (
Expand Down
3 changes: 2 additions & 1 deletion _maps/map_files/MetaStation/MetaStation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -59697,7 +59697,8 @@
name = "Lawyer Requests Console"
},
/obj/machinery/newscaster/directional/west,
/obj/structure/aquarium/lawyer,
/obj/item/fish_tank/lawyer,
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/station/service/lawoffice)
"uZP" = (
Expand Down
3 changes: 2 additions & 1 deletion _maps/map_files/NorthStar/north_star.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -65672,7 +65672,8 @@
/turf/open/floor/iron/white,
/area/station/science/lobby)
"qSD" = (
/obj/structure/aquarium/lawyer,
/obj/item/fish_tank/lawyer,
/obj/structure/table/wood,
/turf/open/floor/wood/parquet,
/area/station/service/lawoffice)
"qSJ" = (
Expand Down
3 changes: 2 additions & 1 deletion _maps/map_files/tramstation/tramstation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -18865,7 +18865,8 @@
/area/station/commons/vacant_room)
"fEZ" = (
/obj/structure/noticeboard/directional/north,
/obj/structure/aquarium/lawyer,
/obj/item/fish_tank/lawyer,
/obj/structure/table/wood,
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/wood,
Expand Down
1 change: 1 addition & 0 deletions _maps/map_files/wawastation/wawastation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -67111,6 +67111,7 @@
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
"xFt" = (
Expand Down
1 change: 0 additions & 1 deletion code/__DEFINES/ai/monkey.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

#define BB_MONKEY_AGGRESSIVE "BB_monkey_aggressive"
#define BB_MONKEY_GUN_NEURONS_ACTIVATED "BB_monkey_gun_aware"
#define BB_MONKEY_GUN_WORKED "BB_monkey_gun_worked"
#define BB_MONKEY_BEST_FORCE_FOUND "BB_monkey_bestforcefound"
#define BB_MONKEY_ENEMIES "BB_monkey_enemies"
#define BB_MONKEY_BLACKLISTITEMS "BB_monkey_blacklistitems"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@
///from base of /atom/movable/point_at: (atom/A, obj/effect/temp_visual/point/point)
#define COMSIG_MOVABLE_POINTED "movable_pointed"

///From /datum/component/aquarium/get_content_beauty: (beauty_holder)
#define COMSIG_MOVABLE_GET_AQUARIUM_BEAUTY "movable_ge_aquarium_beauty"

/// Sent to movables when they are being stolen by a spy: (mob/living/spy, datum/spy_bounty/bounty)
#define COMSIG_MOVABLE_SPY_STEALING "movable_spy_stealing"
/// Called when something is pushed by a living mob bumping it: (mob/living/pusher, push force)
Expand Down
19 changes: 14 additions & 5 deletions code/__DEFINES/dcs/signals/signals_fish.dm
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
// Aquarium related signals
#define COMSIG_AQUARIUM_SURFACE_CHANGED "aquarium_surface_changed"

///From /datum/component/aquarium/ui_act, when changing the fluid of the aquarium: (fluid_type)
#define COMSIG_AQUARIUM_FLUID_CHANGED "aquarium_fluid_changed"
///Called on aquarium/attackby: (aquarium)
#define COMSIG_TRY_INSERTING_IN_AQUARIUM "item_try_inserting_in_aquarium"
///From /datum/component/aquarium/can_insert: (obj/item/item)
#define COMSIG_AQUARIUM_CAN_INSERT "aquarium_can_insert"
///The item will be inserted into the aquarium
#define COMSIG_CAN_INSERT_IN_AQUARIUM (1<<0)
///The item won't be inserted into the aquarium, but will early return attackby anyway.
#define COMSIG_CANNOT_INSERT_IN_AQUARIUM (1<<1)
///From /datum/component/aquarium_content/set_vc_base_position: (obj/effect/aquarium/visual)
#define COMSIG_AQUARIUM_SET_VISUAL "aquarium_set_visual"
///From /datum/component/aquarium_content/remove_from_aquarium: (obj/effect/aquarium/visual)
#define COMSIG_AQUARIUM_REMOVE_VISUAL "aquarium_remove_visual"
///From /obj/item/fish/try_to_reproduce: (fish, candidates)
#define COMSIG_AQUARIUM_GET_REPRODUCTION_CANDIDATES "aquarium_get_reproduction_candidates"
///From /datum/fish_evolution/check_conditions: (fish, mate, evolution)
#define COMSIG_AQUARIUM_CHECK_EVOLUTION_CONDITIONS "aquarium_check_evolution_conditions"
#define COMPONENT_ALLOW_EVOLUTION (1<<0)

///Updates the appearance of a newly generated aquarium content visual:(visual)
#define COMSIG_AQUARIUM_CONTENT_GENERATE_APPEARANCE "aquarium_content_apply_appearance"
///Updates the base position of an aquarium content visual:(aquarium, visual)
#define AQUARIUM_CONTENT_RANDOMIZE_POSITION "aquarium_content_randomize_position"
#define COMSIG_AQUARIUM_CONTENT_RANDOMIZE_POSITION "aquarium_content_randomize_position"
///Updates the animation of an aquarium content visual:(aquarium, visual)
#define COMSIG_AQUARIUM_CONTENT_DO_ANIMATION "aquarium_content_do_animation"

// Fish signals
#define COMSIG_FISH_STATUS_CHANGED "fish_status_changed"
#define COMSIG_FISH_STIRRED "fish_stirred"
///From /obj/item/fish/process: (seconds_per_tick)
#define COMSIG_FISH_LIFE "fish_life"
///From /datum/fish_trait/eat_fish: (predator)
Expand Down
36 changes: 32 additions & 4 deletions code/__DEFINES/fish.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#define FISHING_DUD "dud"
///Used in the the hydro tray fishing spot to define a random seed reward
#define FISHING_RANDOM_SEED "Random seed"
///Used in the surgery fishing spot to define a random organ reward
#define FISHING_RANDOM_ORGAN "Random organ"

// Baseline fishing difficulty levels
#define FISHING_DEFAULT_DIFFICULTY 15
Expand Down Expand Up @@ -94,14 +96,24 @@
#define FISH_ICON_WEAPON "weapon"
#define FISH_ICON_CRITTER "critter"
#define FISH_ICON_SEED "seed"
#define FISH_ICON_ORGAN "organ"

#define AQUARIUM_ANIMATION_FISH_SWIM "fish"
#define AQUARIUM_ANIMATION_FISH_DEAD "dead"

#define AQUARIUM_PROPERTIES_PX_MIN "px_min"
#define AQUARIUM_PROPERTIES_PX_MAX "px_max"
#define AQUARIUM_PROPERTIES_PY_MIN "py_min"
#define AQUARIUM_PROPERTIES_PY_MAX "py_max"
//standard layer defines for aquariums

///The distance that should separate each layer of the aquarium
#define AQUARIUM_LAYER_STEP 0.01
/// Aquarium content layer offsets
#define AQUARIUM_MIN_OFFSET 0.02
#define AQUARIUM_MAX_OFFSET 1
/// The layer of the glass overlay
#define AQUARIUM_GLASS_LAYER 0.02
/// The layer of the aquarium pane borders
#define AQUARIUM_BORDERS_LAYER AQUARIUM_MAX_OFFSET + AQUARIUM_LAYER_STEP
/// Layer for stuff rendered below the glass overlay
#define AQUARIUM_BELOW_GLASS_LAYER 0.01

#define AQUARIUM_LAYER_MODE_BOTTOM "bottom"
#define AQUARIUM_LAYER_MODE_TOP "top"
Expand Down Expand Up @@ -141,6 +153,16 @@
///Used to calculate how many bites a fish can take and therefore the amount of reagents it has.
#define FISH_WEIGHT_BITE_DIVISOR (FISH_GRIND_RESULTS_WEIGHT_DIVISOR * FISH_WEIGHT_GRIND_TO_BITE_MULT)

///Set of operations that calculate the slowdown of fish based on weight
#define GET_FISH_SLOWDOWN(weighty) round(((weighty/FISH_WEIGHT_SLOWDOWN_DIVISOR)**FISH_WEIGHT_SLOWDOWN_EXPONENT)-1.3, 0.1)

/**
* Gets a "rank" for fish weight to determine the force of the fish (or fish tank)
* basically, a gross estimate based on how weight generaly scales up (250, 500, 1000, 2000, 4000 etc...)
* for most fish
*/
#define GET_FISH_WEIGHT_RANK(weighty) max(round(1 + log(2, max(weighty/FISH_WEIGHT_FORCE_DIVISOR, 1)), 1), 1)

///The breeding timeout for newly instantiated fish is multiplied by this.
#define NEW_FISH_BREEDING_TIMEOUT_MULT 2
///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry.
Expand All @@ -158,6 +180,12 @@
#define FISH_FLAG_EXPERIMENT_SCANNABLE (1<<3)
///It lets us know that fish/update_size_and_weight() is currently running.
#define FISH_FLAG_UPDATING_SIZE_AND_WEIGHT (1<<4)
///Flag added when the population of this fish type exceeeds the stable population inside the aquarium
#define FISH_FLAG_OVERPOPULATED (1<<5)
///Flag added when in an aquarium which temperature is within its safe limits
#define FISH_FLAG_SAFE_TEMPERATURE (1<<6)
///Flag added when in an aquarium with the right fluid type.
#define FISH_FLAG_SAFE_FLUID (1<<7)


#define MIN_AQUARIUM_TEMP T0C
Expand Down
20 changes: 10 additions & 10 deletions code/__DEFINES/is_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -202,21 +202,23 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(

#define isspider(A) (istype(A, /mob/living/basic/spider))

//Eye mobs
#define iseyemob(A) (istype(A, /mob/eye))

//Misc mobs
#define isobserver(A) (istype(A, /mob/dead/observer))
#define isovermind(A) (istype(A, /mob/eye/blob))

#define isdead(A) (istype(A, /mob/dead))
#define iscameramob(A) (istype(A, /mob/eye/camera))

#define isnewplayer(A) (istype(A, /mob/dead/new_player))
#define isaicamera(A) (istype(A, /mob/eye/camera/ai))

#define isovermind(A) (istype(A, /mob/eye/blob))
#define isremotecamera(A) (istype(A, /mob/eye/camera/remote))

#define issentientdisease(A) (istype(A, /mob/eye/disease))
//Dead mobs
#define isdead(A) (istype(A, /mob/dead))

#define iseyemob(A) (istype(A, /mob/eye))
#define isobserver(A) (istype(A, /mob/dead/observer))

#define isaicamera(A) (istype(A, /mob/eye/ai_eye))
#define isnewplayer(A) (istype(A, /mob/dead/new_player))

//Objects
#define isobj(A) istype(A, /obj) //override the byond proc because it returns true on children of /atom/movable that aren't objs
Expand All @@ -241,8 +243,6 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(

#define isstructure(A) (istype(A, /obj/structure))

#define isaquarium(A) (istype(A, /obj/structure/aquarium))

#define ismachinery(A) (istype(A, /obj/machinery))

#define istramwall(A) (istype(A, /obj/structure/tram))
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/organ_movement.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
#define DELETE_IF_REPLACED (1<<0)
/// When deleting a brain, we don't delete the identity and the player can keep playing
#define NO_ID_TRANSFER (1<<1)
/// Organ inserted by the abductors surgery
#define FROM_ABDUCTOR_SURGERY (1<<2)
6 changes: 6 additions & 0 deletions code/__DEFINES/surgery.dm
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@
#define SURGERY_REQUIRES_REAL_LIMB (1<<4)
///Will grant a bonus during surgery steps to users with TRAIT_MORBID while they're using tools with CRUEL_IMPLEMENT
#define SURGERY_MORBID_CURIOSITY (1<<5)
/**
* Instead of checking if the tool used is an actual surgery tool to avoid accidentally whacking patients with the wrong tool,
* it'll check if it has a defined tool behaviour instead. Useful for surgeries that use mechanical tools instead of medical ones,
* like hardware manipulation.
*/
#define SURGERY_CHECK_TOOL_BEHAVIOUR (1<<6)

///Return true if target is not in a valid body position for the surgery
#define IS_IN_INVALID_SURGICAL_POSITION(target, surgery) ((surgery.surgery_flags & SURGERY_REQUIRE_RESTING) && (target.mobility_flags & MOBILITY_LIEDOWN && target.body_position != LYING_DOWN))
20 changes: 18 additions & 2 deletions code/__DEFINES/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///Mobs won't slip on a wet turf while it has this trait
#define TRAIT_TURF_IGNORE_SLIPPERY "turf_ignore_slippery"

///failsafe for whether an item with the beauty element is influencing the beauty of the area of not.
#define TRAIT_BEAUTY_APPLIED "beauty_applied"

/// Mobs with this trait can't send the mining shuttle console when used outside the station itself
#define TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION "forbid_mining_shuttle_console_outside_station"

Expand Down Expand Up @@ -799,8 +802,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_ROD_ATTRACT_SHINY_LOVERS "rod_attract_shiny_lovers"
/// This rod can be used to fish on lava
#define TRAIT_ROD_LAVA_USABLE "rod_lava_usable"
/// Stuff that can go inside fish cases
#define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile"
/// Stuff that can go inside fish cases and aquariums
#define TRAIT_AQUARIUM_CONTENT "aquarium_content"
/// If the item can be used as a bit.
#define TRAIT_FISHING_BAIT "fishing_bait"
/// This bait will kill any fish that doesn't have it on its favorite_bait list
Expand All @@ -818,6 +821,19 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
* instead, it'll allow the fishing dud to be there unless there's at least one fish that likes the bait
*/
#define TRAIT_BAIT_ALLOW_FISHING_DUD "bait_dont_affect_fishing_dud"
/**
* This location has the aquarium component. Not much different than a GetComponent()
* disguised as an 'is_x' macro, but I don't have to hide anything here.
* I just don't want a confusing 'is_aquarium(A)' macro which people think it's interchangable with
* an 'istype(A, /obj/structure/aquarium)' when it's the component what truly matters.
*/
#define TRAIT_IS_AQUARIUM "is_aquarium"
/// A location (probably aquarium) that amplifies the zaps of electricity-generating fish.
#define TRAIT_BIOELECTRIC_GENERATOR "bioelectric_generator"
/// A location (likely aquarium) that doesn't allow fish to growth and reproduce
#define TRAIT_STOP_FISH_REPRODUCTION_AND_GROWTH "stop_fish_reproduction_and_growth"
/// This is an aquarium with an open panel
#define TRAIT_AQUARIUM_PANEL_OPEN "aquarium_panel_open"
/// Plants that were mutated as a result of passive instability, not a mutation threshold.
#define TRAIT_PLANT_WILDMUTATE "wildmutation"
/// If you hit an APC with exposed internals with this item it will try to shock you
Expand Down
3 changes: 3 additions & 0 deletions code/__DEFINES/traits/sources.dm
Original file line number Diff line number Diff line change
Expand Up @@ -309,3 +309,6 @@

/// Trait from an engraving
#define ENGRAVED_TRAIT "engraved"

/// From the aquarium component
#define AQUARIUM_TRAIT "aquarium"
6 changes: 2 additions & 4 deletions code/__HELPERS/view.dm
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
/proc/getviewsize(view)
if(!view) // Just to avoid any runtimes that could otherwise cause constant disconnect loops.
stack_trace("Missing value for 'view' in getviewsize(), defaulting to world.view!")
view = world.view
/proc/getviewsize(view = world.view)
SHOULD_BE_PURE(TRUE)

if(isnum(view))
var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view
Expand Down
2 changes: 1 addition & 1 deletion code/_compile_options.dm
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
#endif // REFERENCE_TRACKING_STANDARD

// If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between
// #define UNIT_TESTS
//#define UNIT_TESTS

// If this is uncommented, will attempt to load and initialize prof.dll/libprof.so by default.
// Even if it's not defined, you can pass "tracy" via -params in order to try to load it.
Expand Down
3 changes: 3 additions & 0 deletions code/_globalvars/bitfields.dm
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,9 @@ DEFINE_BITFIELD(fish_flags, list(
"FISH_DO_FLOP_ANIM" = FISH_DO_FLOP_ANIM,
"FISH_FLAG_PETTED" = FISH_FLAG_PETTED,
"FISH_FLAG_EXPERIMENT_SCANNABLE" = FISH_FLAG_EXPERIMENT_SCANNABLE,
"FISH_FLAG_UPDATING_SIZE_AND_WEIGHT" = FISH_FLAG_OVERPOPULATED,
"FISH_FLAG_SAFE_TEMPERATURE" = FISH_FLAG_SAFE_TEMPERATURE,
"FISH_FLAG_SAFE_FLUID" = FISH_FLAG_SAFE_FLUID,
))

DEFINE_BITFIELD(bot_mode_flags, list(
Expand Down
2 changes: 1 addition & 1 deletion code/_globalvars/lists/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ GLOBAL_LIST_EMPTY(available_ai_shells)
GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list())) // One for each AI_* status define
GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs
GLOBAL_LIST_EMPTY(bots_list)
GLOBAL_LIST_EMPTY(aiEyes)
GLOBAL_LIST_EMPTY(camera_eyes)
GLOBAL_LIST_EMPTY(suit_sensors_list) //all people with suit sensors on

/// All alive mobs with clients.
Expand Down
23 changes: 23 additions & 0 deletions code/_globalvars/lists/objects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,13 @@ GLOBAL_LIST_EMPTY(deliverybeacontags)
GLOBAL_LIST_EMPTY_TYPED(singularities, /datum/component/singularity)

GLOBAL_LIST_EMPTY(item_to_design_list)

/// list of all surgeries by name, associated with their path.
GLOBAL_LIST_INIT(surgeries_list, init_surgeries())

/// list of all surgery steps, associated by their path.
GLOBAL_LIST_INIT(surgery_steps, init_subtypes_w_path_keys(/datum/surgery_step, list()))

/// Global list of all non-cooking related crafting recipes.
GLOBAL_LIST_EMPTY(crafting_recipes)
/// This is a global list of typepaths, these typepaths are atoms or reagents that are associated with crafting recipes.
Expand Down Expand Up @@ -80,3 +84,22 @@ GLOBAL_LIST_EMPTY(roundstart_station_borgcharger_areas)

/// List of area names of roundstart station mech rechargers, for the low charge/no charge mech screen alert tooltips.
GLOBAL_LIST_EMPTY(roundstart_station_mechcharger_areas)

// List of organ typepaths that are not unit test-able, and shouldn't be spawned by some things, such as certain class prototypes.
GLOBAL_LIST_INIT(prototype_organs, typecacheof(list(
/obj/item/organ,
/obj/item/organ/wings,
/obj/item/organ/wings/functional,
/obj/item/organ/wings/functional/moth,
/obj/item/organ/cyberimp,
/obj/item/organ/cyberimp/brain,
/obj/item/organ/cyberimp/mouth,
/obj/item/organ/cyberimp/arm,
/obj/item/organ/cyberimp/chest,
/obj/item/organ/cyberimp/eyes,
/obj/item/organ/alien,
/obj/item/organ/brain/dullahan,
/obj/item/organ/ears/dullahan,
/obj/item/organ/tongue/dullahan,
/obj/item/organ/eyes/dullahan,
), only_root_path = TRUE))
Loading

0 comments on commit 84ab340

Please sign in to comment.