mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-15 18:14:22 +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! /🆑
146 lines
4.2 KiB
Plaintext
146 lines
4.2 KiB
Plaintext
#define RAISE_FIRE_COUNT 3
|
|
#define RAISE_FIRE_TIME 3
|
|
|
|
/datum/hallucination/fire
|
|
random_hallucination_weight = 3
|
|
hallucination_tier = HALLUCINATION_TIER_UNCOMMON
|
|
|
|
/// Are we currently burning our mob?
|
|
var/active = TRUE
|
|
/// What stare of fire are we in?
|
|
var/stage = 0
|
|
|
|
/// What icon file to use for our hallucinator
|
|
var/fire_icon = 'icons/mob/effects/onfire.dmi'
|
|
/// What icon state to use for our hallucinator
|
|
var/fire_icon_state = "human_big_fire"
|
|
/// Our fire overlay we generate
|
|
var/image/fire_overlay
|
|
|
|
/// When should we do our next action of the hallucination?
|
|
var/next_action = 0
|
|
/// How may times do we apply stamina damage to our mob?
|
|
var/times_to_lower_stamina
|
|
/// Are we currently fake-clearing our hallucinated fire?
|
|
var/fire_clearing = FALSE
|
|
/// Are the stages going up or down?
|
|
var/increasing_stages = TRUE
|
|
/// How long have we spent on fire?
|
|
var/time_spent = 0
|
|
|
|
var/fake_firestacks = 0
|
|
|
|
/datum/hallucination/fire/proc/make_overlay()
|
|
var/mutable_appearance/real_overlay = hallucinator.get_fire_overlay(fake_firestacks)
|
|
if(!real_overlay)
|
|
return null
|
|
if(real_overlay.icon_state == fire_overlay?.icon_state)
|
|
return fire_overlay
|
|
|
|
var/image/new_overlay = image(real_overlay.icon, hallucinator, real_overlay.icon_state, real_overlay.layer)
|
|
new_overlay.appearance_flags = real_overlay.appearance_flags
|
|
return new_overlay
|
|
|
|
/datum/hallucination/fire/start()
|
|
fake_firestacks = rand(5, 15)
|
|
fire_overlay = make_overlay()
|
|
if(!fire_overlay)
|
|
return FALSE
|
|
|
|
hallucinator.client?.images |= fire_overlay
|
|
to_chat(hallucinator, span_userdanger("You're set on fire!"))
|
|
var/atom/movable/screen/alert/fire/fake/alert = hallucinator.throw_alert(ALERT_FIRE, /atom/movable/screen/alert/fire/fake, override = TRUE)
|
|
alert.hallucination_weakref = WEAKREF(src)
|
|
times_to_lower_stamina = rand(5, 10)
|
|
addtimer(CALLBACK(src, PROC_REF(start_expanding)), 2 SECONDS)
|
|
return TRUE
|
|
|
|
/datum/hallucination/fire/Destroy()
|
|
hallucinator.clear_alert(ALERT_FIRE, clear_override = TRUE)
|
|
hallucinator.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE)
|
|
if(fire_overlay)
|
|
hallucinator.client?.images -= fire_overlay
|
|
fire_overlay = null
|
|
|
|
STOP_PROCESSING(SSfastprocess, src)
|
|
return ..()
|
|
|
|
/datum/hallucination/fire/proc/start_expanding()
|
|
if(QDELETED(src))
|
|
return
|
|
|
|
START_PROCESSING(SSfastprocess, src)
|
|
|
|
/datum/hallucination/fire/process(seconds_per_tick)
|
|
if(QDELETED(src))
|
|
return
|
|
|
|
fake_firestacks -= (0.25 * seconds_per_tick)
|
|
if(fake_firestacks <= 0)
|
|
clear_fire()
|
|
else
|
|
var/new_overlay = make_overlay()
|
|
if(new_overlay && new_overlay != fire_overlay)
|
|
hallucinator.client?.images -= fire_overlay
|
|
fire_overlay = new_overlay
|
|
hallucinator.client?.images |= fire_overlay
|
|
|
|
time_spent += seconds_per_tick
|
|
|
|
if(fire_clearing)
|
|
next_action -= seconds_per_tick
|
|
if(next_action < 0)
|
|
stage -= 1
|
|
update_temp()
|
|
next_action += 3
|
|
|
|
else if(increasing_stages)
|
|
var/new_stage = min(round(time_spent / RAISE_FIRE_TIME), RAISE_FIRE_COUNT)
|
|
if(stage != new_stage)
|
|
stage = new_stage
|
|
update_temp()
|
|
|
|
if(stage == RAISE_FIRE_COUNT)
|
|
increasing_stages = FALSE
|
|
|
|
else if(times_to_lower_stamina)
|
|
next_action -= seconds_per_tick
|
|
if(next_action < 0)
|
|
hallucinator.adjust_stamina_loss(15)
|
|
next_action += 2
|
|
times_to_lower_stamina -= 1
|
|
|
|
else
|
|
clear_fire()
|
|
|
|
/datum/hallucination/fire/proc/update_temp()
|
|
if(stage <= 0)
|
|
hallucinator.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE)
|
|
if(!active)
|
|
qdel(src)
|
|
else
|
|
hallucinator.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE)
|
|
hallucinator.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, stage, override = TRUE)
|
|
|
|
/datum/hallucination/fire/proc/clear_fire()
|
|
if(!active)
|
|
return
|
|
|
|
active = FALSE
|
|
hallucinator.clear_alert(ALERT_FIRE, clear_override = TRUE)
|
|
hallucinator.client?.images -= fire_overlay
|
|
fire_overlay = null
|
|
fire_clearing = TRUE
|
|
next_action = 0
|
|
|
|
#undef RAISE_FIRE_COUNT
|
|
#undef RAISE_FIRE_TIME
|
|
|
|
/// This alert is thrown when hallucinating fire
|
|
/atom/movable/screen/alert/fire/fake
|
|
/// We need to track the original hallucination so we can pass it to the status effect
|
|
var/datum/weakref/hallucination_weakref
|
|
|
|
/atom/movable/screen/alert/fire/fake/handle_stop_drop_roll(mob/living/roller)
|
|
return !!roller.apply_status_effect(/datum/status_effect/stop_drop_roll/hallucinating, hallucination_weakref)
|