Browse Source

Add objcursmod

Load user modded cursor graphics
pull/8410/head
Eric Robinson 3 months ago
parent
commit
eda403eabf
  1. 52
      Source/cursor.cpp

52
Source/cursor.cpp

@ -63,6 +63,7 @@ namespace {
/** Cursor images CEL */ /** Cursor images CEL */
OptionalOwnedClxSpriteList pCursCels; OptionalOwnedClxSpriteList pCursCels;
OptionalOwnedClxSpriteList pCursCels2; OptionalOwnedClxSpriteList pCursCels2;
OptionalOwnedClxSpriteList pCursCelsMod;
OptionalOwnedClxSpriteList *HalfSizeItemSprites; OptionalOwnedClxSpriteList *HalfSizeItemSprites;
OptionalOwnedClxSpriteList *HalfSizeItemSpritesRed; OptionalOwnedClxSpriteList *HalfSizeItemSpritesRed;
@ -441,12 +442,17 @@ void InitCursor()
#ifdef UNPACKED_MPQS #ifdef UNPACKED_MPQS
pCursCels = LoadClx("data\\inv\\objcurs.clx"); pCursCels = LoadClx("data\\inv\\objcurs.clx");
pCursCels2 = LoadOptionalClx("data\\inv\\objcurs2.clx"); pCursCels2 = LoadOptionalClx("data\\inv\\objcurs2.clx");
pCursCelsMod = LoadOptionalClx("data\\inv\\objcursmod.clx");
#else #else
pCursCels = LoadCel("data\\inv\\objcurs", ReadWidths(FindAsset("data\\inv\\objcurs-widths.txt")).data()); pCursCels = LoadCel("data\\inv\\objcurs", ReadWidths(FindAsset("data\\inv\\objcurs-widths.txt")).data());
AssetRef ref = FindAsset("data\\inv\\objcurs2-widths.txt"); AssetRef ref = FindAsset("data\\inv\\objcurs2-widths.txt");
if (ref.ok()) { if (ref.ok()) {
pCursCels2 = LoadOptionalCel("data\\inv\\objcurs2", ReadWidths(std::move(ref)).data()); 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 #endif
ClearCursor(); ClearCursor();
} }
@ -455,19 +461,31 @@ void FreeCursor()
{ {
pCursCels = std::nullopt; pCursCels = std::nullopt;
pCursCels2 = std::nullopt; pCursCels2 = std::nullopt;
pCursCelsMod = std::nullopt;
ClearCursor(); ClearCursor();
} }
ClxSprite GetInvItemSprite(int cursId) ClxSprite GetInvItemSprite(int cursId)
{ {
assert(cursId > 0); assert(cursId > 0);
const size_t numSprites = pCursCels->numSprites();
if (static_cast<size_t>(cursId) <= numSprites) { const size_t n1 = pCursCels->numSprites();
return (*pCursCels)[cursId - 1]; size_t idx = static_cast<size_t>(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()); assert(pCursCelsMod.has_value());
return (*pCursCels2)[cursId - numSprites - 1]; const size_t n3 = pCursCelsMod->numSprites();
assert(idx <= n3);
return (*pCursCelsMod)[idx - 1];
} }
Size GetInvItemSize(int cursId) Size GetInvItemSize(int cursId)
@ -490,8 +508,12 @@ void CreateHalfSizeItemSprites()
{ {
if (HalfSizeItemSprites != nullptr) if (HalfSizeItemSprites != nullptr)
return; return;
const uint32_t numInvItems = pCursCels->numSprites() - (static_cast<uint32_t>(CURSOR_FIRSTITEM) - 1)
+ (pCursCels2.has_value() ? pCursCels2->numSprites() : 0); const uint32_t baseItemCount = pCursCels->numSprites() - (static_cast<uint32_t>(CURSOR_FIRSTITEM) - 1);
const uint32_t hfItemCount = pCursCels2.has_value() ? static_cast<uint32_t>(pCursCels2->numSprites()) : 0;
const uint32_t modItemCount = pCursCelsMod.has_value() ? static_cast<uint32_t>(pCursCelsMod->numSprites()) : 0;
const uint32_t numInvItems = baseItemCount + hfItemCount + modItemCount;
HalfSizeItemSprites = new OptionalOwnedClxSpriteList[numInvItems]; HalfSizeItemSprites = new OptionalOwnedClxSpriteList[numInvItems];
HalfSizeItemSpritesRed = new OptionalOwnedClxSpriteList[numInvItems]; HalfSizeItemSpritesRed = new OptionalOwnedClxSpriteList[numInvItems];
const uint8_t *redTrn = GetInfravisionTRN(); const uint8_t *redTrn = GetInfravisionTRN();
@ -526,14 +548,22 @@ void CreateHalfSizeItemSprites()
}; };
size_t outputIndex = 0; size_t outputIndex = 0;
for (size_t i = static_cast<int>(CURSOR_FIRSTITEM) - 1, n = pCursCels->numSprites(); i < n; ++i, ++outputIndex) {
for (size_t i = static_cast<size_t>(static_cast<int>(CURSOR_FIRSTITEM) - 1), n = pCursCels->numSprites(); i < n; ++i, ++outputIndex) {
createHalfSize((*pCursCels)[i], outputIndex); createHalfSize((*pCursCels)[i], outputIndex);
} }
if (pCursCels2.has_value()) { 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); 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() void FreeHalfSizeItemSprites()

Loading…
Cancel
Save