Files
Bubberstation/code/modules/debugging/tracy.dm
Lucy d653870a91 Refactor debugger and byond-tracy init (#90288)
## About The Pull Request

This refactors code related to debugger and byond-tracy
`/datum/debugger` and `/datum/tracy` - which live in the `GLOBAL_REAL`
vars `Debugger` and `Tracy` respectively.

This allows code related to those two to be grouped together in their
own files, rather than mashed into `world.dm` with a bunch of other shit
- while it still initializes during the same stages of init.

In addition, this also ports
https://github.com/BeeStation/BeeStation-Hornet/pull/8947, which prints
runtime errors to chat when the debugger is enabled.

<details>
<summary><h3>Proof of Testing</h3></summary>

![2025-03-27 (1743094986) ~
Code](https://github.com/user-attachments/assets/2678542f-8338-4ca8-9435-e0376da9e80a)
![2025-03-27 (1743095425) ~
Code](https://github.com/user-attachments/assets/35a1c454-c176-4fb9-987b-82eb92f0fd31)
![2025-03-27 (1743095936) ~
dreamseeker](https://github.com/user-attachments/assets/49f607dc-c684-4fd9-8271-a287f2341c52)
![2025-03-27 (1743096001) ~
Code](https://github.com/user-attachments/assets/8cca692c-6253-48e8-9994-beff39211078)
![2025-03-27 (1743096351) ~
dreamseeker](https://github.com/user-attachments/assets/43a993dd-3884-4709-94fc-d072ff97a337)

</details>

## Why It's Good For The Game

Reduces some `GLOB` pollution, and groups a bunch of related code into
dedicated files and datums.
It's simply cleaner.

Printing runtime errors to chat is also very useful, as it allows you to
see when shit is fuck, if you don't want a breakpoint pause for each
error.

## Changelog
🆑
refactor: Refactored some code related to initialization.
code: Runtime errors will now print to the chat while debugging.
/🆑
2025-04-02 17:38:49 -04:00

65 lines
1.9 KiB
Plaintext

/// The byond-tracy instance.
/// This is a GLOBAL_REAL because it is the VERY FIRST THING to initialize, even before the MC or GLOB.
GLOBAL_REAL(Tracy, /datum/tracy)
/datum/tracy
/// Is byond-tracy enabled and running?
VAR_FINAL/enabled = FALSE
/// The error text, if initializing byond-tracy errored.
VAR_FINAL/error
/// A description of what / who enabled byond-tracy.
VAR_FINAL/init_reason
/// A path to the file containing the output trace, if any.
VAR_FINAL/trace_path
/datum/tracy/New()
if(!isnull(Tracy))
CRASH("Attempted to initialize /datum/tracy when global.Tracy is already set!")
Tracy = src
/datum/tracy/Destroy()
#ifndef OPENDREAM_REAL
if(enabled)
call_ext(TRACY_DLL_PATH, "destroy")()
#endif
return ..()
/// Tries to initialize byond-tracy.
/datum/tracy/proc/enable(init_reason)
#ifndef OPENDREAM_REAL
if(enabled)
return TRUE
src.init_reason = init_reason
if(!fexists(TRACY_DLL_PATH))
error = "[TRACY_DLL_PATH] not found"
SEND_TEXT(world.log, "Error initializing byond-tracy: [error]")
return FALSE
var/init_result = call_ext(TRACY_DLL_PATH, "init")("block")
if(length(init_result) != 0 && init_result[1] == ".") // if first character is ., then it returned the output filename
SEND_TEXT(world.log, "byond-tracy initialized (logfile: [init_result])")
enabled = TRUE
return TRUE
else if(init_result == "already initialized") // not gonna question it.
enabled = TRUE
SEND_TEXT(world.log, "byond-tracy already initialized ([trace_path ? "logfile: [trace_path]" : "no logfile"])")
return TRUE
else if(init_result != "0")
error = init_result
SEND_TEXT(world.log, "Error initializing byond-tracy: [init_result]")
return FALSE
else
enabled = TRUE
SEND_TEXT(world.log, "byond-tracy initialized (no logfile)")
return TRUE
#else
error = "OpenDream not supported"
return FALSE
#endif
/datum/tracy/vv_edit_var(var_name, var_value)
return FALSE // no.
/datum/tracy/CanProcCall(procname)
return FALSE // double no.