From 750255e5b215c8170b46b3eece0168c82272f984 Mon Sep 17 00:00:00 2001 From: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Date: Sun, 29 May 2022 21:06:39 +0200 Subject: [PATCH] Discord RPC enhancements/additions (#1162) * various discord rpc additions * fix formatting * revert changes in game-task-h and task-control-h * discord-rpc: refactor boss and racer/flut checks now works via checking process states * fix codacy --- game/kernel/kmachine.cpp | 42 ++++++++++++++++++++++++++++++++---- game/kernel/kmachine.h | 7 +++++- goal_src/pc/pckernel-h.gc | 5 +++++ goal_src/pc/pckernel.gc | 45 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 93 insertions(+), 6 deletions(-) diff --git a/game/kernel/kmachine.cpp b/game/kernel/kmachine.cpp index c554ef55ce..7b63edce85 100644 --- a/game/kernel/kmachine.cpp +++ b/game/kernel/kmachine.cpp @@ -827,20 +827,38 @@ void update_discord_rpc(u32 discord_info) { if (gDiscordRpcEnabled) { DiscordRichPresence rpc; char state[128]; + char large_image_text[128]; auto info = discord_info ? Ptr(discord_info).c() : NULL; if (info) { int cells = (int)*Ptr(info->fuel).c(); int orbs = (int)*Ptr(info->money_total).c(); int scout_flies = (int)*Ptr(info->buzzer_total).c(); + int deaths = *Ptr(info->deaths).c(); auto cutscene = Ptr(info->cutscene)->value; + auto ogreboss = Ptr(info->ogreboss)->value; + auto plantboss = Ptr(info->plantboss)->value; + auto racer = Ptr(info->racer)->value; + auto flutflut = Ptr(info->flutflut)->value; char* status = Ptr(info->status).c()->data(); char* level = Ptr(info->level).c()->data(); const char* full_level_name = jak1_get_full_level_name(Ptr(info->level).c()->data()); memset(&rpc, 0, sizeof(rpc)); + rpc.largeImageKey = level; + strcpy(large_image_text, full_level_name); if (!strcmp(level, "finalboss")) { strcpy(state, "Fighting Final Boss"); + } else if (plantboss != offset_of_s7()) { + strcpy(state, "Fighting Dark Eco Plant"); + rpc.largeImageKey = "plant-boss"; + strcpy(large_image_text, "Dark Eco Plant"); + } else if (ogreboss != offset_of_s7()) { + strcpy(state, "Fighting Klaww"); + rpc.largeImageKey = "ogreboss"; + strcpy(large_image_text, "Klaww"); } else if (!strcmp(level, "title")) { strcpy(state, "On title screen"); + rpc.largeImageKey = "title"; + strcpy(large_image_text, "Title screen"); } else if (!strcmp(level, "intro")) { strcpy(state, "Intro"); } else if (cutscene != offset_of_s7()) { @@ -852,14 +870,30 @@ void update_discord_rpc(u32 discord_info) { strcat(state, std::to_string(orbs).c_str()); strcat(state, " | Flies: "); strcat(state, std::to_string(scout_flies).c_str()); + + strcat(large_image_text, " | Cells: "); + strcat(large_image_text, std::to_string(cells).c_str()); + strcat(large_image_text, " | Orbs: "); + strcat(large_image_text, std::to_string(orbs).c_str()); + strcat(large_image_text, " | Flies: "); + strcat(large_image_text, std::to_string(scout_flies).c_str()); + strcat(large_image_text, " | Deaths: "); + strcat(large_image_text, std::to_string(deaths).c_str()); } + rpc.largeImageText = large_image_text; rpc.state = state; + if (racer != offset_of_s7()) { + rpc.smallImageKey = "target-racer"; + rpc.smallImageText = "Driving A-Grav Zoomer"; + } else if (flutflut != offset_of_s7()) { + rpc.smallImageKey = "flutflut"; + rpc.smallImageText = "Riding on Flut Flut"; + } else { + rpc.smallImageKey = 0; + rpc.smallImageText = 0; + } rpc.startTimestamp = gStartTime; rpc.details = status; - rpc.largeImageKey = level; - rpc.largeImageText = full_level_name; - rpc.smallImageKey = 0; - rpc.smallImageText = 0; rpc.partySize = 0; rpc.partyMax = 0; Discord_UpdatePresence(&rpc); diff --git a/game/kernel/kmachine.h b/game/kernel/kmachine.h index ead8e82537..d7a65882cb 100644 --- a/game/kernel/kmachine.h +++ b/game/kernel/kmachine.h @@ -138,9 +138,14 @@ struct DiscordInfo { u32 fuel; u32 money_total; u32 buzzer_total; + u32 deaths; u32 status; u32 level; - u32 cutscene; // check if cutscene is playing + u32 cutscene; // check if cutscene is playing + u32 ogreboss; // are we fighting ogreboss? + u32 plantboss; // are we fighting plant-boss? + u32 racer; // are we driving the zoomer? + u32 flutflut; // are we riding on flut flut? }; // static_assert(offsetof(CpadInfo, new_pad) == 76, "cpad type offset"); diff --git a/goal_src/pc/pckernel-h.gc b/goal_src/pc/pckernel-h.gc index 8f6d3d8c09..72c55952e9 100644 --- a/goal_src/pc/pckernel-h.gc +++ b/goal_src/pc/pckernel-h.gc @@ -314,9 +314,14 @@ ((fuel (pointer float)) (money-total (pointer float)) (buzzer-total (pointer float)) + (deaths (pointer int32)) (status string) (level string) (cutscene? symbol) + (ogreboss? symbol) + (plant-boss? symbol) + (racer? symbol) + (flutflut? symbol) ) ) diff --git a/goal_src/pc/pckernel.gc b/goal_src/pc/pckernel.gc index d3d290d9ac..980e5c989d 100644 --- a/goal_src/pc/pckernel.gc +++ b/goal_src/pc/pckernel.gc @@ -43,7 +43,9 @@ (unknown 15) ) - +;; forward declarations needed for discord rpc. +(declare-type ogreboss process-drawable) +(declare-type plant-boss process-drawable) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; updates @@ -191,9 +193,50 @@ (set! (-> info fuel) (&-> *game-info* fuel)) (set! (-> info money-total) (&-> *game-info* money-total)) (set! (-> info buzzer-total) (&-> *game-info* buzzer-total)) + (set! (-> info deaths) (&-> *game-info* total-deaths)) (set! (-> info status) "Playing Jak and Daxter: The Precursor Legacy™") (set! (-> info level) (symbol->string (-> (level-get-target-inside *level*) name))) ;; grab the name of level we're in (set! (-> info cutscene?) (-> obj movie?)) + (set! (-> info ogreboss?) (the-as symbol (and (process-by-ename "ogreboss-1") (case (-> (process-by-ename "ogreboss-1") next-state name) ( + ('ogreboss-die + 'ogreboss-idle + 'ogreboss-stage1 + 'ogreboss-stage2 + 'ogreboss-stage3-hit + 'ogreboss-stage3-shuffle + 'ogreboss-stage3-throw + 'ogreboss-wait-for-player) #t))))) + (set! (-> info plant-boss?) (the-as symbol (and (process-by-ename "plant-boss-3") (case (-> (process-by-ename "plant-boss-3") next-state name) ( + ('plant-boss-idle + 'plant-boss-hit + 'plant-boss-vulnerable + 'plant-boss-spawn + 'plant-boss-reset + 'plant-boss-attack) #t))))) + (set! (-> info racer?) (the-as symbol (and *target* (case (-> *target* next-state name) ( + ('target-racing + 'target-racing-bounce + 'target-racing-death + 'target-racing-falling + 'target-racing-grab + 'target-racing-hit + 'target-racing-jump + 'target-racing-smack + 'target-racing-start) #t))))) + (set! (-> info flutflut?) (the-as symbol (and *target* (case (-> *target* next-state name) ( + ('target-flut-air-attack + 'target-flut-air-attack-hit-ground + 'target-flut-double-jump + 'target-flut-falling + 'target-flut-grab + 'target-flut-hit + 'target-flut-hit-ground + 'target-flut-jump + 'target-flut-running-attack + 'target-flut-stance + 'target-flut-start + 'target-flut-walk) #t))))) + (with-profiler "discord-update" (pc-discord-rpc-update info)) )