mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-11 08:06:33 +01:00
7a3ad79506
## About The Pull Request It's just a partial cleanup of anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md) code from /tg/'s ancient history. I compiled & tested with my helpful assistant and damage is still working. <img width="1920" height="1040" alt="image" src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3" /> I'll upload the .cs script I used to do it shortly. ## Why It's Good For The Game Just minor code cleanup. Script used is located at https://metek.tech/camelTo-Snake.7z EDIT 11/23/25: Updated the script to use multithreading and sequential scan so it works a hell of a lot faster ``` /* // Copyright 2025 Joshua 'Joan Metekillot' Kidder This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. // */ using System.Text.RegularExpressions; class Program { static async Task Main(string[] args) { var readFile = new FileStreamOptions { Access = FileAccess.Read, Share = FileShare.ReadWrite, Options = FileOptions.Asynchronous | FileOptions.SequentialScan }; FileStreamOptions writeFile = new FileStreamOptions { Share = FileShare.ReadWrite, Access = FileAccess.ReadWrite, Mode = FileMode.Truncate, Options = FileOptions.Asynchronous }; RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled; Dictionary<string, int> changedProcs = new(); string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*"; Regex camelCaseProcRegex = new(regexPattern, regexOptions); string snakeify(Match matchingRegex) { var vals = matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray(); var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower(); string logString = $"{vals[0]} => {newVal}"; if (changedProcs.TryGetValue(logString, out int value)) { changedProcs[logString] = value + 1; } else { changedProcs.Add(logString, 1); } return newVal; } var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>(); // uses default ParallelOptions // https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) => { var reader = new StreamReader(filePath, readFile); string oldContent = await reader.ReadToEndAsync(); string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify)); if (oldContent != newContent) { var writer = new StreamWriter(filePath, writeFile); await writer.WriteAsync(newContent); await writer.DisposeAsync(); } reader.Dispose(); }); var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList(); foreach (var pair in logToList) { Console.WriteLine($"{pair.Key}: {pair.Value} locations"); } } } ``` ## Changelog 🆑 Bisar code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use snake_case, in-line with the STYLE guide. Underscores rule! /🆑
156 lines
8.0 KiB
Plaintext
156 lines
8.0 KiB
Plaintext
/datum/unit_test/amputation/Run()
|
|
var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent)
|
|
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent)
|
|
|
|
TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 0, "Patient is somehow missing limbs before surgery")
|
|
|
|
var/datum/surgery/amputation/surgery = new(patient, BODY_ZONE_R_ARM, patient.get_bodypart(BODY_ZONE_R_ARM))
|
|
|
|
var/datum/surgery_step/sever_limb/sever_limb = new
|
|
sever_limb.success(user, patient, BODY_ZONE_R_ARM, null, surgery)
|
|
|
|
TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 1, "Patient did not lose any limbs")
|
|
TEST_ASSERT_EQUAL(patient.get_missing_limbs()[1], BODY_ZONE_R_ARM, "Patient is missing a limb that isn't the one we operated on")
|
|
|
|
/datum/unit_test/brain_surgery/Run()
|
|
var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent)
|
|
patient.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY)
|
|
patient.set_organ_loss(ORGAN_SLOT_BRAIN, 20)
|
|
|
|
TEST_ASSERT(patient.has_trauma_type(), "Patient does not have any traumas, despite being given one")
|
|
|
|
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent)
|
|
|
|
var/datum/surgery_step/fix_brain/fix_brain = new
|
|
fix_brain.success(user, patient)
|
|
|
|
TEST_ASSERT(!patient.has_trauma_type(), "Patient kept their brain trauma after brain surgery")
|
|
TEST_ASSERT(patient.get_organ_loss(ORGAN_SLOT_BRAIN) < 20, "Patient did not heal their brain damage after brain surgery")
|
|
|
|
/datum/unit_test/head_transplant/Run()
|
|
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent)
|
|
|
|
var/mob/living/carbon/human/alice = allocate(/mob/living/carbon/human/consistent)
|
|
alice.fully_replace_character_name(null, "Alice")
|
|
alice.set_haircolor(COLOR_LIGHT_PINK, update = FALSE)
|
|
alice.set_hairstyle("Very Long Hair", update = FALSE)
|
|
alice.set_facial_haircolor(COLOR_LIGHT_PINK, update = FALSE)
|
|
alice.set_facial_hairstyle("Shaved", update = TRUE)
|
|
|
|
var/mob/living/carbon/human/bob = allocate(/mob/living/carbon/human/consistent)
|
|
bob.fully_replace_character_name(null, "Bob")
|
|
bob.set_haircolor(COLOR_LIGHT_BROWN, update = FALSE)
|
|
bob.set_hairstyle("Short Hair", update = FALSE)
|
|
bob.set_facial_haircolor(COLOR_LIGHT_BROWN, update = FALSE)
|
|
bob.set_facial_hairstyle("Beard (Full)", update = TRUE)
|
|
|
|
var/obj/item/bodypart/head/alices_head = alice.get_bodypart(BODY_ZONE_HEAD)
|
|
alices_head.drop_limb()
|
|
|
|
var/obj/item/bodypart/head/bobs_head = bob.get_bodypart(BODY_ZONE_HEAD)
|
|
bobs_head.drop_limb()
|
|
|
|
TEST_ASSERT_EQUAL(alice.get_bodypart(BODY_ZONE_HEAD), null, "Alice still has a head after dismemberment")
|
|
TEST_ASSERT_EQUAL(alice.get_visible_name(), "Unknown", "Alice's head was dismembered, but they are not Unknown")
|
|
|
|
TEST_ASSERT_EQUAL(bobs_head.real_name, "Bob", "Bob's head does not remember that it is from Bob")
|
|
|
|
// Put Bob's head onto Alice's body
|
|
var/datum/surgery_step/add_prosthetic/add_prosthetic = new
|
|
user.put_in_active_hand(bobs_head)
|
|
add_prosthetic.success(user, alice, BODY_ZONE_HEAD, bobs_head)
|
|
|
|
TEST_ASSERT(!isnull(alice.get_bodypart(BODY_ZONE_HEAD)), "Alice has no head after prosthetic replacement")
|
|
TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob")
|
|
TEST_ASSERT_EQUAL(alice.hairstyle, "Short Hair", "Bob's head was transplanted onto Alice's body, but their hairstyle is not Short Hair")
|
|
TEST_ASSERT_EQUAL(alice.hair_color, COLOR_LIGHT_BROWN, "Bob's head was transplanted onto Alice's body, but their hair color is not COLOR_LIGHT_BROWN")
|
|
TEST_ASSERT_EQUAL(alice.facial_hairstyle, "Beard (Full)", "Bob's head was transplanted onto Alice's body, but their facial hairstyle is not Beard (Full)")
|
|
TEST_ASSERT_EQUAL(alice.facial_hair_color, COLOR_LIGHT_BROWN, "Bob's head was transplanted onto Alice's body, but their facial hair color is not COLOR_LIGHT_BROWN")
|
|
|
|
/datum/unit_test/multiple_surgeries/Run()
|
|
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent/slow)
|
|
var/mob/living/carbon/human/patient_zero = allocate(/mob/living/carbon/human/consistent)
|
|
var/mob/living/carbon/human/patient_one = allocate(/mob/living/carbon/human/consistent)
|
|
|
|
var/obj/item/scalpel/scalpel = allocate(/obj/item/scalpel)
|
|
|
|
var/datum/surgery_step/incise/surgery_step = new
|
|
var/datum/surgery/organ_manipulation/surgery_for_zero = new
|
|
|
|
INVOKE_ASYNC(surgery_step, TYPE_PROC_REF(/datum/surgery_step, initiate), user, patient_zero, BODY_ZONE_CHEST, scalpel, surgery_for_zero)
|
|
TEST_ASSERT(surgery_for_zero.step_in_progress, "Surgery on patient zero was not initiated")
|
|
|
|
var/datum/surgery/organ_manipulation/surgery_for_one = new
|
|
|
|
// Without waiting for the incision to complete, try to start a new surgery
|
|
TEST_ASSERT(!surgery_step.initiate(user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one), "Was allowed to start a second surgery without the rod of asclepius")
|
|
TEST_ASSERT(!surgery_for_one.step_in_progress, "Surgery for patient one is somehow in progress, despite not initiating")
|
|
|
|
user.apply_status_effect(/datum/status_effect/hippocratic_oath)
|
|
INVOKE_ASYNC(surgery_step, TYPE_PROC_REF(/datum/surgery_step, initiate), user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one)
|
|
TEST_ASSERT(surgery_for_one.step_in_progress, "Surgery on patient one was not initiated, despite having rod of asclepius")
|
|
|
|
/// Ensures that the tend wounds surgery can be started
|
|
/datum/unit_test/start_tend_wounds
|
|
|
|
/datum/unit_test/start_tend_wounds/Run()
|
|
var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent)
|
|
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent)
|
|
|
|
var/datum/surgery/surgery = new /datum/surgery/healing/brute/basic
|
|
|
|
if (!surgery.can_start(user, patient))
|
|
TEST_FAIL("Can't start basic tend wounds!")
|
|
|
|
qdel(surgery)
|
|
|
|
/datum/unit_test/tend_wounds/Run()
|
|
var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent)
|
|
patient.take_overall_damage(100, 100)
|
|
|
|
var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human/consistent)
|
|
|
|
// Test that tending wounds actually lowers damage
|
|
var/datum/surgery_step/heal/brute/basic/basic_brute_heal = new
|
|
basic_brute_heal.success(user, patient, BODY_ZONE_CHEST)
|
|
TEST_ASSERT(patient.get_brute_loss() < 100, "Tending brute wounds didn't lower brute damage ([patient.get_brute_loss()])")
|
|
|
|
var/datum/surgery_step/heal/burn/basic/basic_burn_heal = new
|
|
basic_burn_heal.success(user, patient, BODY_ZONE_CHEST)
|
|
TEST_ASSERT(patient.get_fire_loss() < 100, "Tending burn wounds didn't lower burn damage ([patient.get_fire_loss()])")
|
|
|
|
// Test that wearing clothing lowers heal amount
|
|
var/mob/living/carbon/human/naked_patient = allocate(/mob/living/carbon/human/consistent)
|
|
naked_patient.take_overall_damage(100)
|
|
|
|
var/mob/living/carbon/human/clothed_patient = allocate(/mob/living/carbon/human/consistent)
|
|
clothed_patient.equipOutfit(/datum/outfit/job/doctor, TRUE)
|
|
clothed_patient.take_overall_damage(100)
|
|
|
|
basic_brute_heal.success(user, naked_patient, BODY_ZONE_CHEST)
|
|
basic_brute_heal.success(user, clothed_patient, BODY_ZONE_CHEST)
|
|
|
|
TEST_ASSERT(naked_patient.get_brute_loss() < clothed_patient.get_brute_loss(), "Naked patient did not heal more from wounds tending than a clothed patient")
|
|
|
|
/// Tests items-as-prosthetic-limbs can apply
|
|
/datum/unit_test/prosthetic_item
|
|
|
|
/datum/unit_test/prosthetic_item/Run()
|
|
var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent)
|
|
var/obj/item/claymore/sword = allocate(/obj/item/claymore)
|
|
|
|
patient.make_item_prosthetic(sword)
|
|
|
|
TEST_ASSERT(HAS_TRAIT_FROM(sword, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT), "Prosthetic item attachment failed! Item does not have the nodrop trait")
|
|
|
|
/// Specifically checks the chainsaw nullrod
|
|
/datum/unit_test/prosthetic_item/nullrod
|
|
|
|
/datum/unit_test/prosthetic_item/nullrod/Run()
|
|
var/mob/living/carbon/human/picker = allocate(/mob/living/carbon/human/consistent)
|
|
var/obj/item/nullrod/chainsaw/nullrod = allocate(/obj/item/nullrod/chainsaw)
|
|
|
|
nullrod.on_selected(null, null, picker)
|
|
|
|
TEST_ASSERT(HAS_TRAIT_FROM(nullrod, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT), "Chainsaw nullrod item attachment failed! Item does not have the nodrop trait")
|