mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 10:11:09 +00:00
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. --> <!-- You can view Contributing.MD for a detailed description of the pull request process. --> closes #53931, #70916, #53931 ## About The Pull Request Organs were previously stored in nullspace. Now they are stored in their prospective bodyparts. Bodyparts are now stored in the mob. I've also had to refactor a lot of code concerning organ movement. Previously, organs were only moved into bodyparts once the bodyparts were removed. To accomodate this change, two major distinctions have been made: **Bodypart removal/insertion** Called only when an organ is taken out of a bodypart. Bodypart overlays, damage modifiers or other changes that should affect a bodypart itself goes here. **Mob insertion/removal** Called when an organ is removed from a mob. This can either be directly, by taking the organ out of a mob, or by removing the bodypart that contains the organ. This lets you add and remove organ effects safely without having to worry about the bodypart. Now that we controle the movement of bodyparts and organs, we can fuck around with them more. Summoning someones head or chest or heart will actually kill them now (and quite violently I must say (chest summoning gibs lol)). https://github.com/tgstation/tgstation/assets/7501474/5efc9dd3-cfd5-4ce4-b70f-d0d74894626e I´ve also added a unit test that violently tears apart and reconstructs a person in different ways to see if they get put toghether the right way This will definitely need a testmerge. I've done a lot of testing to make sure interactions work, but more niche stuff or my own incompetence can always slip through. ## Why It's Good For The Game <!-- Argue for the merits of your changes and how they benefit the game, especially if they are controversial and/or far reaching. If you can't actually explain WHY what you are doing will improve the game, then it probably isn't good for the game in the first place. --> A lot of organ work is quite restricted. You can't C4 someones heart, you cant summon their organs and a lot of exceptions have to be made to keep organs in nullspace. This lets organs (and bodyparts) play more nicely with the rest of the game. This also makes it a lot easier to move away from extorgans since a lot of their unique movement code has been removed and or generalized. I don't like making PRs of this size (I'm so sorry reviewers), but I was in a unique position to replace the entire system in a way I couldn't have done conveniently in multiple PRs ## Changelog <!-- If your PR modifies aspects of the game that can be concretely observed by players or admins you should add a changelog. If your change does NOT meet this description, remove this section. Be sure to properly mark your PRs to prevent unnecessary GBP loss. You can read up on GBP and it's effects on PRs in the tgstation guides for contributors. Please note that maintainers freely reserve the right to remove and add tags should they deem it appropriate. You can attempt to finagle the system all you want, but it's best to shoot for clear communication right off the bat. --> 🆑 refactor: Your organs are now inside your body. Please report any issues with bodypart and organ movement, including exotic organ, on github and scream at me fix: Cases of unexpected organ movement, such as teleporting bodyparts and organs with spells, now invokes a proper reaction (usually violent death) runtime: Fixes HARS runtiming on activation/deactivation fix: Fixes lag when species swapping /🆑 <!-- Both 🆑's are required for the changelog to work! You can put your name to the right of the first 🆑 if you want to overwrite your GitHub username as author ingame. --> <!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. -->
287 lines
9.8 KiB
Plaintext
287 lines
9.8 KiB
Plaintext
//include unit test files in this module in this ifdef
|
|
//Keep this sorted alphabetically
|
|
|
|
#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM)
|
|
|
|
/// For advanced cases, fail unconditionally but don't return (so a test can return multiple results)
|
|
#define TEST_FAIL(reason) (Fail(reason || "No reason", __FILE__, __LINE__))
|
|
|
|
/// Asserts that a condition is true
|
|
/// If the condition is not true, fails the test
|
|
#define TEST_ASSERT(assertion, reason) if (!(assertion)) { return Fail("Assertion failed: [reason || "No reason"]", __FILE__, __LINE__) }
|
|
|
|
/// Asserts that a parameter is not null
|
|
#define TEST_ASSERT_NOTNULL(a, reason) if (isnull(a)) { return Fail("Expected non-null value: [reason || "No reason"]", __FILE__, __LINE__) }
|
|
|
|
/// Asserts that a parameter is null
|
|
#define TEST_ASSERT_NULL(a, reason) if (!isnull(a)) { return Fail("Expected null value but received [a]: [reason || "No reason"]", __FILE__, __LINE__) }
|
|
|
|
/// Asserts that the two parameters passed are equal, fails otherwise
|
|
/// Optionally allows an additional message in the case of a failure
|
|
#define TEST_ASSERT_EQUAL(a, b, message) do { \
|
|
var/lhs = ##a; \
|
|
var/rhs = ##b; \
|
|
if (lhs != rhs) { \
|
|
return Fail("Expected [isnull(lhs) ? "null" : lhs] to be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]", __FILE__, __LINE__); \
|
|
} \
|
|
} while (FALSE)
|
|
|
|
/// Asserts that the two parameters passed are not equal, fails otherwise
|
|
/// Optionally allows an additional message in the case of a failure
|
|
#define TEST_ASSERT_NOTEQUAL(a, b, message) do { \
|
|
var/lhs = ##a; \
|
|
var/rhs = ##b; \
|
|
if (lhs == rhs) { \
|
|
return Fail("Expected [isnull(lhs) ? "null" : lhs] to not be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]", __FILE__, __LINE__); \
|
|
} \
|
|
} while (FALSE)
|
|
|
|
/// *Only* run the test provided within the parentheses
|
|
/// This is useful for debugging when you want to reduce noise, but should never be pushed
|
|
/// Intended to be used in the manner of `TEST_FOCUS(/datum/unit_test/math)`
|
|
#define TEST_FOCUS(test_path) ##test_path { focus = TRUE; }
|
|
|
|
/// Logs a noticable message on GitHub, but will not mark as an error.
|
|
/// Use this when something shouldn't happen and is of note, but shouldn't block CI.
|
|
/// Does not mark the test as failed.
|
|
#define TEST_NOTICE(source, message) source.log_for_test((##message), "notice", __FILE__, __LINE__)
|
|
|
|
/// Constants indicating unit test completion status
|
|
#define UNIT_TEST_PASSED 0
|
|
#define UNIT_TEST_FAILED 1
|
|
#define UNIT_TEST_SKIPPED 2
|
|
|
|
#define TEST_PRE 0
|
|
#define TEST_DEFAULT 1
|
|
/// After most test steps, used for tests that run long so shorter issues can be noticed faster
|
|
#define TEST_LONGER 10
|
|
/// This must be the one of last tests to run due to the inherent nature of the test iterating every single tangible atom in the game and qdeleting all of them (while taking long sleeps to make sure the garbage collector fires properly) taking a large amount of time.
|
|
#define TEST_CREATE_AND_DESTROY 9001
|
|
/**
|
|
* For tests that rely on create and destroy having iterated through every (tangible) atom so they don't have to do something similar.
|
|
* Keep in mind tho that create and destroy will absolutely break the test platform, anything that relies on its shape cannot come after it.
|
|
*/
|
|
#define TEST_AFTER_CREATE_AND_DESTROY INFINITY
|
|
|
|
/// Change color to red on ANSI terminal output, if enabled with -DANSICOLORS.
|
|
#ifdef ANSICOLORS
|
|
#define TEST_OUTPUT_RED(text) "\x1B\x5B1;31m[text]\x1B\x5B0m"
|
|
#else
|
|
#define TEST_OUTPUT_RED(text) (text)
|
|
#endif
|
|
/// Change color to green on ANSI terminal output, if enabled with -DANSICOLORS.
|
|
#ifdef ANSICOLORS
|
|
#define TEST_OUTPUT_GREEN(text) "\x1B\x5B1;32m[text]\x1B\x5B0m"
|
|
#else
|
|
#define TEST_OUTPUT_GREEN(text) (text)
|
|
#endif
|
|
/// Change color to yellow on ANSI terminal output, if enabled with -DANSICOLORS.
|
|
#ifdef ANSICOLORS
|
|
#define TEST_OUTPUT_YELLOW(text) "\x1B\x5B1;33m[text]\x1B\x5B0m"
|
|
#else
|
|
#define TEST_OUTPUT_YELLOW(text) (text)
|
|
#endif
|
|
/// A trait source when adding traits through unit tests
|
|
#define TRAIT_SOURCE_UNIT_TESTS "unit_tests"
|
|
|
|
// BEGIN_INCLUDE
|
|
#include "abductor_baton_spell.dm"
|
|
#include "ablative_hud.dm"
|
|
#include "achievements.dm"
|
|
#include "anchored_mobs.dm"
|
|
#include "anonymous_themes.dm"
|
|
#include "antag_conversion.dm"
|
|
#include "antag_moodlets.dm"
|
|
#include "area_contents.dm"
|
|
#include "armor_verification.dm"
|
|
#include "atmospherics_sanity.dm"
|
|
#include "autowiki.dm"
|
|
#include "barsigns.dm"
|
|
#include "baseturfs.dm"
|
|
#include "bespoke_id.dm"
|
|
#include "binary_insert.dm"
|
|
#include "bitrunning.dm"
|
|
#include "blindness.dm"
|
|
#include "bloody_footprints.dm"
|
|
#include "breath.dm"
|
|
#include "burning.dm"
|
|
#include "cable_powernets.dm"
|
|
#include "card_mismatch.dm"
|
|
#include "cardboard_cutouts.dm"
|
|
#include "chain_pull_through_space.dm"
|
|
#include "changeling.dm"
|
|
#include "chat_filter.dm"
|
|
#include "circuit_component_category.dm"
|
|
#include "client_colours.dm"
|
|
#include "closets.dm"
|
|
#include "clothing_under_armor_subtype_check.dm"
|
|
#include "combat.dm"
|
|
#include "component_tests.dm"
|
|
#include "confusion.dm"
|
|
#include "connect_loc.dm"
|
|
#include "container_sanity.dm"
|
|
#include "crayons.dm"
|
|
#include "create_and_destroy.dm"
|
|
#include "dcs_check_list_arguments.dm"
|
|
#include "dcs_get_id_from_elements.dm"
|
|
#include "designs.dm"
|
|
#include "dismemberment.dm"
|
|
#include "door_access.dm"
|
|
#include "dragon_expiration.dm"
|
|
#include "drink_icons.dm"
|
|
#include "dummy_spawn.dm"
|
|
#include "dynamic_ruleset_sanity.dm"
|
|
#include "egg_glands.dm"
|
|
#include "emoting.dm"
|
|
#include "ensure_subtree_operational_datum.dm"
|
|
#include "explosion_action.dm"
|
|
#include "fish_unit_tests.dm"
|
|
#include "focus_only_tests.dm"
|
|
#include "font_awesome_icons.dm"
|
|
#include "food_edibility_check.dm"
|
|
#include "full_heal.dm"
|
|
#include "gas_transfer.dm"
|
|
#include "get_turf_pixel.dm"
|
|
#include "geyser.dm"
|
|
#include "greyscale_config.dm"
|
|
#include "hallucination_icons.dm"
|
|
#include "heretic_knowledge.dm"
|
|
#include "heretic_rituals.dm"
|
|
#include "high_five.dm"
|
|
#include "holidays.dm"
|
|
#include "hulk.dm"
|
|
#include "human_through_recycler.dm"
|
|
#include "hunger_curse.dm"
|
|
#include "hydroponics_extractor_storage.dm"
|
|
#include "hydroponics_harvest.dm"
|
|
#include "hydroponics_self_mutations.dm"
|
|
#include "hydroponics_validate_genes.dm"
|
|
#include "inhands.dm"
|
|
#include "json_savefile_importing.dm"
|
|
#include "keybinding_init.dm"
|
|
#include "knockoff_component.dm"
|
|
#include "language_transfer.dm"
|
|
#include "leash.dm"
|
|
#include "lesserform.dm"
|
|
#include "limbsanity.dm"
|
|
#include "ling_decap.dm"
|
|
#include "liver.dm"
|
|
#include "load_map_security.dm"
|
|
#include "lungs.dm"
|
|
#include "machine_disassembly.dm"
|
|
#include "mafia.dm"
|
|
#include "map_landmarks.dm"
|
|
#include "mapload_space_verification.dm"
|
|
#include "mapping.dm"
|
|
#include "mecha_damage.dm"
|
|
#include "medical_wounds.dm"
|
|
#include "merge_type.dm"
|
|
#include "metabolizing.dm"
|
|
#include "mindbound_actions.dm"
|
|
#include "missing_icons.dm"
|
|
#include "mob_chains.dm"
|
|
#include "mob_damage.dm"
|
|
#include "mob_faction.dm"
|
|
#include "mob_spawn.dm"
|
|
#include "modify_fantasy_variable.dm"
|
|
#include "modsuit.dm"
|
|
#include "modular_map_loader.dm"
|
|
#include "monkey_business.dm"
|
|
#include "mouse_bite_cable.dm"
|
|
#include "mutant_hands_consistency.dm"
|
|
#include "mutant_organs.dm"
|
|
#include "novaflower_burn.dm"
|
|
#include "nuke_cinematic.dm"
|
|
#include "objectives.dm"
|
|
#include "operating_table.dm"
|
|
#include "orderable_items.dm"
|
|
#include "organ_bodypart_shuffle.dm"
|
|
#include "organ_set_bonus.dm"
|
|
#include "organs.dm"
|
|
#include "outfit_sanity.dm"
|
|
#include "oxyloss_suffocation.dm"
|
|
#include "paintings.dm"
|
|
#include "pills.dm"
|
|
#include "plane_double_transform.dm"
|
|
#include "plane_dupe_detector.dm"
|
|
#include "plantgrowth_tests.dm"
|
|
#include "preference_species.dm"
|
|
#include "preferences.dm"
|
|
#include "projectiles.dm"
|
|
#include "quirks.dm"
|
|
#include "range_return.dm"
|
|
#include "rcd.dm"
|
|
#include "reagent_container_defaults.dm"
|
|
#include "reagent_id_typos.dm"
|
|
#include "reagent_mob_expose.dm"
|
|
#include "reagent_mod_procs.dm"
|
|
#include "reagent_names.dm"
|
|
#include "reagent_recipe_collisions.dm"
|
|
#include "reagent_transfer.dm"
|
|
#include "required_map_items.dm"
|
|
#include "resist.dm"
|
|
#include "say.dm"
|
|
#include "screenshot_antag_icons.dm"
|
|
#include "screenshot_basic.dm"
|
|
#include "screenshot_dynamic_human_icons.dm"
|
|
#include "screenshot_high_luminosity_eyes.dm"
|
|
#include "screenshot_humanoids.dm"
|
|
#include "screenshot_husk.dm"
|
|
#include "screenshot_saturnx.dm"
|
|
#include "security_levels.dm"
|
|
#include "security_officer_distribution.dm"
|
|
#include "serving_tray.dm"
|
|
#include "simple_animal_freeze.dm"
|
|
#include "siunit.dm"
|
|
#include "slime_mood.dm"
|
|
#include "slips.dm"
|
|
#include "spawn_humans.dm"
|
|
#include "spawn_mobs.dm"
|
|
#include "species_change_clothing.dm"
|
|
#include "species_change_organs.dm"
|
|
#include "species_config_sanity.dm"
|
|
#include "species_unique_id.dm"
|
|
#include "species_whitelists.dm"
|
|
#include "spell_invocations.dm"
|
|
#include "spell_jaunt.dm"
|
|
#include "spell_mindswap.dm"
|
|
#include "spell_names.dm"
|
|
#include "spell_shapeshift.dm"
|
|
#include "spritesheets.dm"
|
|
#include "stack_singular_name.dm"
|
|
#include "station_trait_tests.dm"
|
|
#include "status_effect_ticks.dm"
|
|
#include "stomach.dm"
|
|
#include "strange_reagent.dm"
|
|
#include "strippable.dm"
|
|
#include "stuns.dm"
|
|
#include "subsystem_init.dm"
|
|
#include "suit_storage_icons.dm"
|
|
#include "surgeries.dm"
|
|
#include "tail_wag.dm"
|
|
#include "teleporters.dm"
|
|
#include "tgui_create_message.dm"
|
|
#include "timer_sanity.dm"
|
|
#include "trait_addition_and_removal.dm"
|
|
#include "traitor.dm"
|
|
#include "traitor_mail_content_check.dm"
|
|
#include "trauma_granting.dm"
|
|
#include "turf_icons.dm"
|
|
#include "tutorial_sanity.dm"
|
|
#include "unit_test.dm"
|
|
#include "verify_config_tags.dm"
|
|
#include "verify_emoji_names.dm"
|
|
#include "weird_food.dm"
|
|
#include "wizard_loadout.dm"
|
|
#include "worn_icons.dm"
|
|
// END_INCLUDE
|
|
#ifdef REFERENCE_TRACKING_DEBUG //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter
|
|
#include "find_reference_sanity.dm"
|
|
#endif
|
|
|
|
#undef TEST_ASSERT
|
|
#undef TEST_ASSERT_EQUAL
|
|
#undef TEST_ASSERT_NOTEQUAL
|
|
//#undef TEST_FOCUS - This define is used by vscode unit test extension to pick specific unit tests to run and appended later so needs to be used out of scope here
|
|
#endif
|