From eda403eabf9cfccaeb393afcb929f2d58c8be66f Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Thu, 8 Jan 2026 13:27:27 -0500 Subject: [PATCH] Add objcursmod Load user modded cursor graphics --- Source/cursor.cpp | 52 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/Source/cursor.cpp b/Source/cursor.cpp index 0fa280b6c..c062a5319 100644 --- a/Source/cursor.cpp +++ b/Source/cursor.cpp @@ -63,6 +63,7 @@ namespace { /** Cursor images CEL */ OptionalOwnedClxSpriteList pCursCels; OptionalOwnedClxSpriteList pCursCels2; +OptionalOwnedClxSpriteList pCursCelsMod; OptionalOwnedClxSpriteList *HalfSizeItemSprites; OptionalOwnedClxSpriteList *HalfSizeItemSpritesRed; @@ -441,12 +442,17 @@ void InitCursor() #ifdef UNPACKED_MPQS pCursCels = LoadClx("data\\inv\\objcurs.clx"); pCursCels2 = LoadOptionalClx("data\\inv\\objcurs2.clx"); + pCursCelsMod = LoadOptionalClx("data\\inv\\objcursmod.clx"); #else pCursCels = LoadCel("data\\inv\\objcurs", ReadWidths(FindAsset("data\\inv\\objcurs-widths.txt")).data()); AssetRef ref = FindAsset("data\\inv\\objcurs2-widths.txt"); if (ref.ok()) { pCursCels2 = LoadOptionalCel("data\\inv\\objcurs2", ReadWidths(std::move(ref)).data()); } + ref = FindAsset("data\\inv\\objcursmod-widths.txt"); + if (ref.ok()) { + pCursCelsMod = LoadOptionalCel("data\\inv\\objcursmod", ReadWidths(std::move(ref)).data()); + } #endif ClearCursor(); } @@ -455,19 +461,31 @@ void FreeCursor() { pCursCels = std::nullopt; pCursCels2 = std::nullopt; + pCursCelsMod = std::nullopt; ClearCursor(); } ClxSprite GetInvItemSprite(int cursId) { assert(cursId > 0); - const size_t numSprites = pCursCels->numSprites(); - if (static_cast(cursId) <= numSprites) { - return (*pCursCels)[cursId - 1]; + + const size_t n1 = pCursCels->numSprites(); + size_t idx = static_cast(cursId); + if (idx <= n1) + return (*pCursCels)[idx - 1]; + idx -= n1; + + if (pCursCels2.has_value()) { + const size_t n2 = pCursCels2->numSprites(); + if (idx <= n2) + return (*pCursCels2)[idx - 1]; + idx -= n2; } - assert(pCursCels2.has_value()); - assert(cursId - numSprites <= pCursCels2->numSprites()); - return (*pCursCels2)[cursId - numSprites - 1]; + + assert(pCursCelsMod.has_value()); + const size_t n3 = pCursCelsMod->numSprites(); + assert(idx <= n3); + return (*pCursCelsMod)[idx - 1]; } Size GetInvItemSize(int cursId) @@ -490,8 +508,12 @@ void CreateHalfSizeItemSprites() { if (HalfSizeItemSprites != nullptr) return; - const uint32_t numInvItems = pCursCels->numSprites() - (static_cast(CURSOR_FIRSTITEM) - 1) - + (pCursCels2.has_value() ? pCursCels2->numSprites() : 0); + + const uint32_t baseItemCount = pCursCels->numSprites() - (static_cast(CURSOR_FIRSTITEM) - 1); + const uint32_t hfItemCount = pCursCels2.has_value() ? static_cast(pCursCels2->numSprites()) : 0; + const uint32_t modItemCount = pCursCelsMod.has_value() ? static_cast(pCursCelsMod->numSprites()) : 0; + const uint32_t numInvItems = baseItemCount + hfItemCount + modItemCount; + HalfSizeItemSprites = new OptionalOwnedClxSpriteList[numInvItems]; HalfSizeItemSpritesRed = new OptionalOwnedClxSpriteList[numInvItems]; const uint8_t *redTrn = GetInfravisionTRN(); @@ -526,14 +548,22 @@ void CreateHalfSizeItemSprites() }; size_t outputIndex = 0; - for (size_t i = static_cast(CURSOR_FIRSTITEM) - 1, n = pCursCels->numSprites(); i < n; ++i, ++outputIndex) { + + for (size_t i = static_cast(static_cast(CURSOR_FIRSTITEM) - 1), n = pCursCels->numSprites(); i < n; ++i, ++outputIndex) { createHalfSize((*pCursCels)[i], outputIndex); } + if (pCursCels2.has_value()) { - for (size_t i = 0, n = pCursCels2->numSprites(); i < n; ++i, ++outputIndex) { + for (size_t i = 0, n = pCursCels2->numSprites(); i < n; ++i, ++outputIndex) createHalfSize((*pCursCels2)[i], outputIndex); - } } + + if (pCursCelsMod.has_value()) { + for (size_t i = 0, n = pCursCelsMod->numSprites(); i < n; ++i, ++outputIndex) + createHalfSize((*pCursCelsMod)[i], outputIndex); + } + + assert(outputIndex == numInvItems); } void FreeHalfSizeItemSprites()