diff options
author | Treeki <treeki@gmail.com> | 2013-02-28 05:52:50 +0100 |
---|---|---|
committer | Treeki <treeki@gmail.com> | 2013-02-28 05:52:50 +0100 |
commit | b376ded880b4c863adfbe99ef04155d492e82c01 (patch) | |
tree | 66da8df706c1d6f82edd845c08f216198d9d7334 | |
parent | 7cd2c9dc68ceeeefc8a35f43ee11a250592ca464 (diff) | |
download | kamek-b376ded880b4c863adfbe99ef04155d492e82c01.tar.gz kamek-b376ded880b4c863adfbe99ef04155d492e82c01.zip |
update stars on File Select properly when a level is beaten
-rw-r--r-- | koopatlas.yaml | 6 | ||||
-rw-r--r-- | src/levelinfo.cpp | 55 |
2 files changed, 61 insertions, 0 deletions
diff --git a/koopatlas.yaml b/koopatlas.yaml index 3cf2aab..1b619c9 100644 --- a/koopatlas.yaml +++ b/koopatlas.yaml @@ -108,3 +108,9 @@ hooks: src_addr_pal: 0x800B2FF0 target_func: 'ResetAllCompletionCandidates(void)' + - name: UpdateFSStars + type: branch_insn + branch_type: b + src_addr_pal: 0x801028D0 + target_func: 'UpdateFSStars(void)' + diff --git a/src/levelinfo.cpp b/src/levelinfo.cpp index 728f802..d0ddd9a 100644 --- a/src/levelinfo.cpp +++ b/src/levelinfo.cpp @@ -71,3 +71,58 @@ dLevelInfo_c::entry_s *dLevelInfo_c::searchByDisplayNum(int world, int level) { return 0;
}
+
+void UpdateFSStars() {
+ dLevelInfo_c *li = &dLevelInfo_c::s_info;
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+
+ bool coinsNormal = true, exitsNormal = true;
+ bool coinsW9 = true, exitsW9 = true;
+
+ for (int i = 0; i < li->sectionCount(); i++) {
+ dLevelInfo_c::section_s *sect = li->getSectionByIndex(i);
+
+ for (int j = 0; j < sect->levelCount; j++) {
+ dLevelInfo_c::entry_s *entry = §->levels[j];
+
+ // Levels only
+ if (!(entry->flags & 2))
+ continue;
+
+ u32 conds = save->GetLevelCondition(entry->worldSlot, entry->levelSlot);
+
+ if (entry->displayWorld == 9) {
+ if ((conds & COND_COIN_ALL) != COND_COIN_ALL)
+ coinsW9 = false;
+ if (entry->flags & 0x10)
+ if (!(conds & COND_NORMAL))
+ exitsW9 = false;
+ if (entry->flags & 0x20)
+ if (!(conds & COND_SECRET))
+ exitsW9 = false;
+ } else {
+ if ((conds & COND_COIN_ALL) != COND_COIN_ALL)
+ coinsNormal = false;
+ if (entry->flags & 0x10)
+ if (!(conds & COND_NORMAL))
+ exitsNormal = false;
+ if (entry->flags & 0x20)
+ if (!(conds & COND_SECRET))
+ exitsNormal = false;
+ }
+ }
+ }
+
+ bool beatGame = (save->GetLevelCondition(7, 23) & COND_NORMAL) != 0;
+
+ save->bitfield &= ~0x3E;
+ save->bitfield |=
+ (beatGame ? 2 : 0) |
+ (exitsNormal ? 4 : 0) |
+ (coinsNormal ? 8 : 0) |
+ (exitsW9 ? 0x10 : 0) |
+ (coinsW9 ? 0x20 : 0);
+
+ OSReport("FS Stars updated: Status: Game beaten: %d, Normal exits: %d, Normal coins: %d, W9 exits: %d, W9 coins: %d\n", beatGame, exitsNormal, coinsNormal, exitsW9, coinsW9);
+}
+
|