/ src / debug.ts
debug.ts
 1  import { MOD_ID } from "$mod";
 2  import noita from "@noita-ts/base";
 3  import { Ptr } from "@noita-ts/ffi";
 4  import GLOBAL_STATS from "@noita-ts/ffi/global_stats";
 5  
 6  export default (sessionRender: Ptr<number>, prevBestRender: Ptr<number>) => {
 7    // just init our memory so render doesn't show garbage
 8    noita.on("PlayerSpawned", () => {
 9      let streak = (ModSettingGet(MOD_ID + ".streak") || 0) as number;
10      const worst = (ModSettingGet(MOD_ID + ".worst") || 0) as number;
11      sessionRender[0] = -streak;
12      prevBestRender[0] = -worst;
13    });
14  
15    let debugGui: GuiID | undefined;
16  
17    const renderDebug = (shade: number) => {
18      if (!debugGui) {
19        debugGui = GuiCreate();
20      }
21  
22      GuiStartFrame(debugGui);
23  
24      const text = string.format(
25        "game: %d/%d | render: %d/%d | wins/deaths: (%d+%d)/%d",
26        GLOBAL_STATS.session.streak,
27        GLOBAL_STATS.highest.streak,
28        sessionRender[0],
29        prevBestRender[0],
30        GLOBAL_STATS.KEY_VALUE_STATS.get("progress_ending0") ?? 0,
31        GLOBAL_STATS.KEY_VALUE_STATS.get("progress_ending1") ?? 0,
32        GLOBAL_STATS.global.death_count,
33      );
34      GuiColorSetForNextWidget(debugGui, shade, shade, shade, 1);
35      GuiText(debugGui, 65, 0, text);
36  
37      GuiColorSetForNextWidget(debugGui, shade, shade, shade, 1);
38      const [left, right] = GuiButton(debugGui, 1, 65, 8, "[reset]");
39  
40      if (left) {
41        ModSettingSet(MOD_ID + ".streak", 0);
42        sessionRender[0] = 0;
43      }
44  
45      if (right) {
46        ModSettingSet(MOD_ID + ".worst", 0);
47        prevBestRender[0] = 0;
48      }
49  
50      GuiColorSetForNextWidget(debugGui, shade, shade, shade, 1);
51      const [left2, right2] = GuiButton(debugGui, 2, 100, 8, "[die/win]");
52  
53      if (left2) {
54        const [player] = EntityGetWithTag("player_unit");
55        if (player !== null) {
56          EntityInflictDamage(
57            player,
58            999999,
59            "DAMAGE_PHYSICS_HIT",
60            "suicide",
61            "NORMAL",
62            0,
63            0,
64          );
65        }
66      }
67  
68      if (right2) {
69        GameAddFlagRun("ending_game_completed");
70        AddFlagPersistent(
71          InputIsKeyDown(225) || InputIsKeyDown(229) // lshift/rshift
72            ? "progress_ending1"
73            : "progress_ending0",
74        );
75        GameOnCompleted();
76        const [player] = EntityGetWithTag("player_unit");
77        if (player !== null) {
78          EntityInflictDamage(
79            player,
80            999999,
81            "DAMAGE_PHYSICS_HIT",
82            "he won",
83            "NORMAL",
84            0,
85            0,
86          );
87        }
88      }
89    };
90  
91    noita.on("WorldPreUpdate", () => renderDebug(1));
92    noita.on("PausePreUpdate", () => renderDebug(0.5));
93  };