diff options
| author | briaguya <70942617+briaguya-ai@users.noreply.github.com> | 2023-04-27 19:20:41 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-27 19:20:41 -0400 |
| commit | 4166dbf9072e74c2f3e093461d6abc1b06af8475 (patch) | |
| tree | 25a2f180a3ef253b2ad024fc050377c80020f9ef /soh/src/code | |
| parent | 2af99dfc3ae2ed46de7d6cc6b84495f8e0fc83b1 (diff) | |
spockalicious (#2751)
* Rough mockup of LUS XML loading
* Updated code for merge
* Loading from FS support and custom DList WIP implementation
* Added current directory support to F3D and impl most of the dlist cmds
* WIP Skeleton support
* Almost done
* Rebase fixes
* Submodule updates
* HD Texture Support
* Fixes
* bump lus
* fix exporter build, header update
* soh builds
* setMesh image path cleanup
* Update soh/src/overlays/actors/ovl_player_actor/z_player.c
* Update soh/src/overlays/actors/ovl_player_actor/z_player.c
* Update OTRExporter/OTRExporter/Main.cpp
* Update ZAPDTR/ZAPD/ZResource.h
* Update soh/src/code/z_skelanime.c
* Update OTRExporter/OTRExporter/Main.cpp
* Fixed jpeg backgrounds and decreased icon buffer size
* Bump lus
* Increased even more the buffer because it crashes on long texts
* Removed print because sometimes the if is not triggered when the image is already byteswapped
* fix non-windows build
* fix build
Co-authored-by: Kenix <kenixwhisperwind@gmail.com>
* add hd checkbox
* Various fixes for custom model support (#23)
* Some fixes
* Updated LUS Version
* Fixed issue with Link Skirt on pause menu
* Added CVar for custom link model changes
* Fixed headers
* Additional header fixes
* Tweaks
* Unload HD game assets on scene transition. (#16)
* Unload game assets on scene transition.
* Bump LUS
* Unloads all HD assets on scene transition.
* Only unload hd assets if hd assets are turned on.
* Fixes issues on toggling between HD and non HD assets.
---------
Co-authored-by: briaguya <briaguya@alice>
* fix: actually load hd debug font (#27)
* fix: actually load hd debug font
* toggle debug text correctly
---------
Co-authored-by: briaguya <briaguya>
* Yes. (#28)
* Merge branch 'develop' into dev-to-ghost
* HD Skeleton Swapping and Language Fixes (#32)
* Yes.
* HD Skeleton Swapping and Language Fixes
* Test
* Fixed issues with ganon cape (#34)
* Fixed Bongo Bongo Crash (#35)
* Added HD Assets Toggle (#37)
* Ivan the Fairy - Coop Mode (#36)
* wip
* hookshotable ivan
* added hookshot item
* new items & changes & fixes & restored navi
* farore, din and nayru's spells are done
* fixed slingshot & bow
* added more items supported
* done with all main items
* bug fixes & ready
* added imgui button
* wip
* hookshotable ivan
* added hookshot item
* new items & changes & fixes & restored navi
* farore, din and nayru's spells are done
* fixed slingshot & bow
* added more items supported
* fix own dungeon items on shuffled boss rooms (#2683)
* bump lus (#2692)
* fix: lowercase package names for vcpkg (#2693)
vcpkg was throwing an error `error: invalid character in package name (must be lowercase, digits, '-')`
this updates our calls to `vcpkg_install_packages` to use lowercase package names instead of uppercase
* fix death mountain cloud in rando (#2691)
* Fix: Switch Age No Longer Reloads Start Room (#2679)
* [Reduced Clutter] Disable Hot/Underwater Warning Text (#2684)
* Disable Warning Text
* Moved to Reduced Clutter
* done with all main items
* bug fixes & ready
* fix: process roms in consistent order (#2696)
* chore: move rando savefile setup and document flags (#2697)
* remove rando save init from sram
* move rando savefile init logic and set more flags
* document flags for rando save creation
* Fix: Use correct fps value for frame interpolation with match refresh rate (#2694)
* Fix: Kak GS placement on construction site (#2695)
* added imgui button
* addressed kenix's comments
* fixed useless null
* added rupee dash mode in extra modes
* changed menu position
---------
Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com>
Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com>
* LUS Scancodes (#42)
* Added HD Assets Toggle
* Switched out SDL for LUS scancodes
* Ivan tweaks (#45)
* Magic consumption slowed down;
Bosses now affected by Ivan's Din spell
* Adjust magic timer
* clean up imgui
* model fixes/improvements (#50)
* replace `gUseCustomLinkModel` with custom resource check
* handle adult/child
* bump lus
* fix model switching with tab
* use lus main
* fix carpet man (#52)
Co-authored-by: Rozelette <Rozelette@users.noreply.github.com>
* get ship model and lus texture into soh.otr, use `gAuthenticLogo` to toggle between ship and authentic (#55)
* Use libultra features for CPU-modified textures (#40)
* Use libultra features for CPU-modified textures
* Comment
* bump lus on ghost (#58)
* fix: properly use `Interface_LoadActionLabel` to display start button text (#61)
* Changes hd -> alt for texture replacement. (#65)
* Changes hd -> alt for texture replacement.
* Renames variables in gfxprint for hd -> alt change.
* Update soh/soh/resource/type/Skeleton.cpp
---------
Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
* Fixes kaleido dungeon maps (#67)
* skeleton stuff (#69)
* comment out wii u build (#70)
* bump lus (#71)
* Rework readme (#72)
* Update README.md
* docs
* put custom music docs somewhere
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* dark/light title image
* lus
* Update README.md
* Fixed vanilla minimap (#73)
* Fixed vanilla minimap
* Workaround for pulsing SD maps with non-broken HD maps.
---------
Co-authored-by: Christopher Leggett <chris@leggett.dev>
* Skeleton fix fixed (#75)
* WIP skelton patcher fix
* Fixes skeleton reference change.
* Adds const back to name in ResourceMgr_LoadSkeletonByName
---------
Co-authored-by: Christopher Leggett <chris@leggett.dev>
Co-authored-by: Kenix <kenixwhisperwind@gmail.com>
* Fixes z_message_otr memory leak.
* Update soh/soh/z_message_OTR.cpp
* Update soh/src/code/game.c
* docs: add how to find otr files to switch instructions (#78)
* bump lus (#79)
* comment out RegisterBlendedTexture in king d (#80)
---------
Co-authored-by: Nicholas Estelami <NEstelami@users.noreply.github.com>
Co-authored-by: David Chavez <david@dcvz.io>
Co-authored-by: briaguya <briaguya@alice>
Co-authored-by: Kenix3 <kenixwhisperwind@gmail.com>
Co-authored-by: KiritoDv <kiritodev01@gmail.com>
Co-authored-by: briaguya <briaguya>
Co-authored-by: Ralphie Morell <stratomaster64@gmail.com>
Co-authored-by: MelonSpeedruns <melonspeedruns@outlook.com>
Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com>
Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com>
Co-authored-by: Rozelette <Rozelette@users.noreply.github.com>
Co-authored-by: Christopher Leggett <chris@leggett.dev>
Co-authored-by: Lywx <36680385+KiritoDv@users.noreply.github.com>
Diffstat (limited to 'soh/src/code')
| -rw-r--r-- | soh/src/code/game.c | 10 | ||||
| -rw-r--r-- | soh/src/code/gfxprint.c | 33 | ||||
| -rw-r--r-- | soh/src/code/z_actor.c | 61 | ||||
| -rw-r--r-- | soh/src/code/z_cheap_proc.c | 10 | ||||
| -rw-r--r-- | soh/src/code/z_collision_check.c | 10 | ||||
| -rw-r--r-- | soh/src/code/z_construct.c | 10 | ||||
| -rw-r--r-- | soh/src/code/z_fcurve_data_skelanime.c | 2 | ||||
| -rw-r--r-- | soh/src/code/z_kanfont.c | 6 | ||||
| -rw-r--r-- | soh/src/code/z_map_exp.c | 47 | ||||
| -rw-r--r-- | soh/src/code/z_message_PAL.c | 23 | ||||
| -rw-r--r-- | soh/src/code/z_parameter.c | 142 | ||||
| -rw-r--r-- | soh/src/code/z_play.c | 6 | ||||
| -rw-r--r-- | soh/src/code/z_player_lib.c | 25 | ||||
| -rw-r--r-- | soh/src/code/z_room.c | 46 | ||||
| -rw-r--r-- | soh/src/code/z_skelanime.c | 8 | ||||
| -rw-r--r-- | soh/src/code/z_skin_awb.c | 2 |
16 files changed, 196 insertions, 245 deletions
diff --git a/soh/src/code/game.c b/soh/src/code/game.c index 546901d3e..26b26e94c 100644 --- a/soh/src/code/game.c +++ b/soh/src/code/game.c @@ -1,6 +1,7 @@ #include <string.h> #include "global.h" #include "vt.h" +#include "libultraship/bridge.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" SpeedMeter D_801664D0; @@ -13,6 +14,7 @@ u16 sLastButtonPressed; // Forward declared, because this in a C++ header. int gfx_create_framebuffer(uint32_t width, uint32_t height); +void gfx_texture_cache_clear(); void GameState_FaultPrint(void) { static char sBtnChars[] = "ABZSuldr*+LRudlr"; @@ -459,6 +461,14 @@ void GameState_Destroy(GameState* gameState) { Fault_RemoveClient(&sGameFaultClient); osSyncPrintf("game デストラクタ終了\n"); // "game destructor end" + + // Performing clear skeletons before unload resources fixes an actor heap corruption crash due to the skeleton patching system. + ResourceMgr_ClearSkeletons(); + + if (CVarGetInteger("gAltAssets", 0)) { + UnloadResourceDirectory("alt/*"); + gfx_texture_cache_clear(); + } } GameStateFunc GameState_GetInit(GameState* gameState) { diff --git a/soh/src/code/gfxprint.c b/soh/src/code/gfxprint.c index 2dfc21da9..f7aa20a76 100644 --- a/soh/src/code/gfxprint.c +++ b/soh/src/code/gfxprint.c @@ -128,6 +128,7 @@ u8 sGfxPrintFontData[(16 * 256) / 2] = { // Can be used to set GFXP_FLAG_ENLARGE by default static u8 sDefaultSpecialFlags; +static const char rGfxPrintFontData[] = "__OTR__alt/textures/font/sGfxPrintFontData"; void GfxPrint_Setup(GfxPrint* this) { s32 width = 16; @@ -140,13 +141,26 @@ void GfxPrint_Setup(GfxPrint* this) { G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PRIM | G_RM_XLU_SURF | G_RM_XLU_SURF2); gDPSetCombineMode(this->dList++, G_CC_DECALRGBA, G_CC_DECALRGBA); - gDPLoadTextureBlock_4b(this->dList++, sGfxPrintFontData, G_IM_FMT_CI, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + bool useAltTexture = ResourceMgr_FileExists(rGfxPrintFontData) && CVarGetInteger("gAltAssets", 0); + if (!useAltTexture) { + gDPLoadTextureBlock_4b(this->dList++, sGfxPrintFontData, G_IM_FMT_CI, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + } else { + gDPLoadTextureBlock_4b(this->dList++, rGfxPrintFontData, G_IM_FMT_CI, width * 4, height, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + } + gDPLoadTLUT(this->dList++, 64, 256, sGfxPrintFontTLUT); for (i = 1; i < 4; i++) { - gDPSetTile(this->dList++, G_IM_FMT_CI, G_IM_SIZ_4b, 1, 0, i * 2, i, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, - G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); + if (useAltTexture) { + gDPSetTile(this->dList++, G_IM_FMT_RGBA, G_IM_SIZ_4b, 1, 0, i * 2, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); + } else { + gDPSetTile(this->dList++, G_IM_FMT_CI, G_IM_SIZ_4b, 1, 0, i * 2, i, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); + } gDPSetTileSize(this->dList++, i * 2, 0, 0, 60, 1020); } @@ -174,7 +188,7 @@ void GfxPrint_SetColor(GfxPrint* this, u32 r, u32 g, u32 b, u32 a) { } void GfxPrint_SetPosPx(GfxPrint* this, s32 x, s32 y) { - this->posX = this->baseX + (x * 4); + this->posX = this->baseX + (x * 4) + CVarGetInteger("gGfxPrintCharStartOffset", 0); this->posY = this->baseY + (y * 4); } @@ -189,6 +203,8 @@ void GfxPrint_SetBasePosPx(GfxPrint* this, s32 x, s32 y) { void GfxPrint_PrintCharImpl(GfxPrint* this, u8 c) { u32 tile = (c & 0xFF) * 2; + u8 offset = ((c * 2) & 0x7) / 2; + u8 useAltTexture = ResourceMgr_FileExists(rGfxPrintFontData) && CVarGetInteger("gAltAssets", 0); if (this->flags & GFXP_FLAG_UPDATE) { this->flags &= ~GFXP_FLAG_UPDATE; @@ -226,11 +242,12 @@ void GfxPrint_PrintCharImpl(GfxPrint* this, u8 c) { gSPTextureRectangle(this->dList++, (this->posX) << 1, (this->posY) << 1, (this->posX + 32) << 1, (this->posY + 32) << 1, tile, (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1 << 9, 1 << 9); } else { - gSPTextureRectangle(this->dList++, this->posX, this->posY, this->posX + 32, this->posY + 32, tile, - (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1 << 10, 1 << 10); + gSPTextureRectangle(this->dList++, this->posX, this->posY, this->posX + 32, this->posY + 32, + useAltTexture ? 0 : tile, (useAltTexture ? ((128 * 4) * offset) : 0) + (u16)((c & 4) * 64), + (u16)(c >> 3) * 256, 1 << 10, 1 << 10); } - this->posX += 32; + this->posX += CVarGetInteger("gGfxPrintCharSpacing", 32); } void GfxPrint_PrintStringWithSize(GfxPrint* this, const void* buffer, u32 charSize, u32 charCount) { diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index ae2db5b78..21d4e8702 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -799,9 +799,22 @@ void func_8002CDE4(PlayState* play, TitleCardContext* titleCtx) { void TitleCard_InitBossName(PlayState* play, TitleCardContext* titleCtx, void* texture, s16 x, s16 y, u8 width, u8 height, s16 hasTranslation) { - - if (ResourceMgr_OTRSigCheck(texture)) - texture = GetResourceDataByName(texture, false); + static char newName[512]; + + if (gSaveContext.language != LANGUAGE_ENG) { + size_t length = strlen(texture); + strcpy(newName, texture); + if (gSaveContext.language == LANGUAGE_FRA) { + newName[length - 6] = 'F'; + newName[length - 5] = 'R'; + newName[length - 4] = 'A'; + } else if (gSaveContext.language == LANGUAGE_GER) { + newName[length - 6] = 'G'; + newName[length - 5] = 'E'; + newName[length - 4] = 'R'; + } + texture = newName; + } titleCtx->texture = texture; titleCtx->isBossCard = true; @@ -1005,7 +1018,7 @@ void TitleCard_InitPlaceName(PlayState* play, TitleCardContext* titleCtx, void* } - char newName[512]; + static char newName[512]; if (gSaveContext.language != LANGUAGE_ENG) { size_t length = strlen(texture); @@ -1023,7 +1036,7 @@ void TitleCard_InitPlaceName(PlayState* play, TitleCardContext* titleCtx, void* texture = newName; } - titleCtx->texture = GetResourceDataByName(texture, false); + titleCtx->texture = texture; titleCtx->isBossCard = false; titleCtx->hasTranslation = false; titleCtx->x = x; @@ -1067,14 +1080,9 @@ void TitleCard_Update(PlayState* play, TitleCardContext* titleCtx) { void TitleCard_Draw(PlayState* play, TitleCardContext* titleCtx) { s32 width; s32 height; - s32 unused; s32 titleX; s32 doubleWidth; s32 titleY; - s32 titleSecondY; - s32 textureLanguageOffset; - s32 shiftTopY; - s32 shiftBottomY; if (titleCtx->alpha != 0) { width = titleCtx->width; @@ -1107,52 +1115,21 @@ void TitleCard_Draw(PlayState* play, TitleCardContext* titleCtx) { OPEN_DISPS(play->state.gfxCtx); - height = (width * height > 0x1000) ? 0x1000 / width : height; - titleSecondY = titleY + (height * 4); - - textureLanguageOffset = 0x0; - shiftTopY = 0x0; - shiftBottomY = 0x1000; - - //if this card is bosses cards, has translation and that is not using English language. - if (titleCtx->isBossCard && titleCtx->hasTranslation && gSaveContext.language != LANGUAGE_ENG) { - textureLanguageOffset = (width * height * gSaveContext.language); - if (gSaveContext.language == LANGUAGE_GER) { - shiftTopY = 0x400; - shiftBottomY = 0x1400; - } else if (gSaveContext.language == LANGUAGE_FRA) { - shiftTopY = 0x800; - shiftBottomY = 0x1800; - } - } - // WORLD_OVERLAY_DISP Goes over POLY_XLU_DISP but under POLY_KAL_DISP WORLD_OVERLAY_DISP = Gfx_SetupDL_52NoCD(WORLD_OVERLAY_DISP); gDPSetPrimColor(WORLD_OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensityR, (u8)titleCtx->intensityG, (u8)titleCtx->intensityB, (u8)titleCtx->alpha); - gDPLoadTextureBlock(WORLD_OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + shiftTopY, G_IM_FMT_IA, + gDPLoadTextureBlock(WORLD_OVERLAY_DISP++, (uintptr_t)titleCtx->texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - //Removing the -1 there remove the gap between top and bottom textures. gSPWideTextureRectangle(WORLD_OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4), G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); height = titleCtx->height - height; - // If texture is bigger than 0x1000, display the rest - if (height > 0) { - gDPLoadTextureBlock(WORLD_OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + shiftBottomY, - G_IM_FMT_IA, - G_IM_SIZ_8b, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - //Removing the -1 there remove the gap between top and bottom textures. - gSPWideTextureRectangle(WORLD_OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4, - titleSecondY + (height * 4), G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); - } - CLOSE_DISPS(play->state.gfxCtx); } } diff --git a/soh/src/code/z_cheap_proc.c b/soh/src/code/z_cheap_proc.c index a5d0a8bc9..cf52db2d3 100644 --- a/soh/src/code/z_cheap_proc.c +++ b/soh/src/code/z_cheap_proc.c @@ -6,7 +6,11 @@ void Gfx_DrawDListOpa(PlayState* play, Gfx* dlist) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); - gSPDisplayList(POLY_OPA_DISP++, dlist); + + if (ResourceMgr_OTRSigCheck(dlist) == 1) + gsSPPushCD(POLY_OPA_DISP++, dlist); + + gSPDisplayList(POLY_OPA_DISP++, dlist); CLOSE_DISPS(play->state.gfxCtx); } @@ -17,6 +21,10 @@ void Gfx_DrawDListXlu(PlayState* play, Gfx* dlist) { Gfx_SetupDL_25Xlu(play->state.gfxCtx); gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + + if (ResourceMgr_OTRSigCheck(dlist) == 1) + gsSPPushCD(POLY_XLU_DISP++, dlist); + gSPDisplayList(POLY_XLU_DISP++, dlist); CLOSE_DISPS(play->state.gfxCtx); diff --git a/soh/src/code/z_collision_check.c b/soh/src/code/z_collision_check.c index 785e68836..d04a097cf 100644 --- a/soh/src/code/z_collision_check.c +++ b/soh/src/code/z_collision_check.c @@ -3045,6 +3045,10 @@ void CollisionCheck_ApplyDamage(PlayState* play, CollisionCheckContext* colChkCt if (!(collider->acFlags & AC_HARD)) { collider->actor->colChkInfo.damage += damage; } + + if (CVarGetInteger("gIvanCoopModeEnabled", 0)) { + collider->actor->colChkInfo.damage *= GET_PLAYER(play)->ivanDamageMultiplier; + } } /** @@ -3649,7 +3653,7 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a * Gets damage from a sword strike using generic values, and returns 0 if the attack is * not sword-type. Used by bosses to require that a sword attack deal the killing blow. */ -u8 CollisionCheck_GetSwordDamage(s32 dmgFlags) { +u8 CollisionCheck_GetSwordDamage(s32 dmgFlags, PlayState* play) { u8 damage = 0; if (dmgFlags & 0x00400100) { @@ -3662,6 +3666,10 @@ u8 CollisionCheck_GetSwordDamage(s32 dmgFlags) { damage = 8; } + if (CVarGetInteger("gIvanCoopModeEnabled", 0)) { + damage *= GET_PLAYER(play)->ivanDamageMultiplier; + } + KREG(7) = damage; return damage; } diff --git a/soh/src/code/z_construct.c b/soh/src/code/z_construct.c index 44b0ee5e7..1aae3fcf8 100644 --- a/soh/src/code/z_construct.c +++ b/soh/src/code/z_construct.c @@ -41,18 +41,16 @@ void func_801109B0(PlayState* play) { DmaMgr_SendRequest1(interfaceCtx->parameterSegment, (uintptr_t)_parameter_staticSegmentRomStart, parameterSize, __FILE__, 162); - interfaceCtx->doActionSegment = GAMESTATE_ALLOC_MC(&play->state, 0x480); + interfaceCtx->doActionSegment = GAMESTATE_ALLOC_MC(&play->state, 3 * sizeof(char*)); osSyncPrintf("DOアクション テクスチャ初期=%x\n", 0x480); // "DO Action Texture Initialization" osSyncPrintf("parameter->do_actionSegment=%x\n", interfaceCtx->doActionSegment); ASSERT(interfaceCtx->doActionSegment != NULL); - uint32_t attackDoActionTexSize = GetResourceTexSizeByName(gAttackDoActionENGTex, false); - memcpy(interfaceCtx->doActionSegment, GetResourceDataByName(gAttackDoActionENGTex, false), attackDoActionTexSize); - memcpy(interfaceCtx->doActionSegment + (attackDoActionTexSize / 2), GetResourceDataByName(gCheckDoActionENGTex, false), attackDoActionTexSize); - - memcpy(interfaceCtx->doActionSegment + attackDoActionTexSize, GetResourceDataByName(gReturnDoActionENGTex, false), GetResourceTexSizeByName(gReturnDoActionENGTex, false)); + interfaceCtx->doActionSegment[0] = gAttackDoActionENGTex; + interfaceCtx->doActionSegment[1] = gCheckDoActionENGTex; + interfaceCtx->doActionSegment[2] = gReturnDoActionENGTex; interfaceCtx->iconItemSegment = GAMESTATE_ALLOC_MC( &play->state, 0x1000 * ARRAY_COUNT(gSaveContext.equips.buttonItems)); diff --git a/soh/src/code/z_fcurve_data_skelanime.c b/soh/src/code/z_fcurve_data_skelanime.c index 2ae49c3dd..a0eeace16 100644 --- a/soh/src/code/z_fcurve_data_skelanime.c +++ b/soh/src/code/z_fcurve_data_skelanime.c @@ -15,7 +15,7 @@ s32 SkelCurve_Init(PlayState* play, SkelAnimeCurve* skelCurve, SkelCurveLimbList TransformUpdateIndex* transUpdIdx) { if (ResourceMgr_OTRSigCheck(limbListSeg)) - limbListSeg = ResourceMgr_LoadSkeletonByName(limbListSeg); + limbListSeg = ResourceMgr_LoadSkeletonByName(limbListSeg, NULL); SkelCurveLimb** limbs; SkelCurveLimbList* limbList = SEGMENTED_TO_VIRTUAL(limbListSeg); diff --git a/soh/src/code/z_kanfont.c b/soh/src/code/z_kanfont.c index 0eea9be34..2dd9cda80 100644 --- a/soh/src/code/z_kanfont.c +++ b/soh/src/code/z_kanfont.c @@ -174,7 +174,7 @@ void Font_LoadChar(Font* font, u8 character, u16 codePointIndex) { //__FILE__, __LINE__); if (character < 0x8B) - memcpy(&font->charTexBuf[codePointIndex], GetResourceDataByName(fntTbl[character], false), FONT_CHAR_TEX_SIZE); + memcpy(&font->charTexBuf[codePointIndex], fntTbl[character], strlen(fntTbl[character]) + 1); } /** @@ -183,7 +183,7 @@ void Font_LoadChar(Font* font, u8 character, u16 codePointIndex) { * The different icons are given in the MessageBoxIcon enum. */ void Font_LoadMessageBoxIcon(Font* font, u16 icon) { - memcpy(font->iconBuf, GetResourceDataByName(msgStaticTbl[4 + icon], false), FONT_CHAR_TEX_SIZE); + memcpy(font->iconBuf, msgStaticTbl[4 + icon], strlen(msgStaticTbl[4 + icon]) + 1); } /** @@ -218,7 +218,7 @@ void Font_LoadOrderedFont(Font* font) { osSyncPrintf("nes_mes_buf[%d]=%d\n", codePointIndex, font->msgBuf[codePointIndex]); offset = (font->msgBuf[codePointIndex] - '\x20') * FONT_CHAR_TEX_SIZE; - memcpy(fontBuf, GetResourceDataByName(fntTbl[offset / FONT_CHAR_TEX_SIZE], false), FONT_CHAR_TEX_SIZE); + memcpy(fontBuf, fntTbl[offset / FONT_CHAR_TEX_SIZE], strlen(fntTbl[offset / FONT_CHAR_TEX_SIZE]) + 1); //DmaMgr_SendRequest1(fontBuf, fontStatic + offset, FONT_CHAR_TEX_SIZE, __FILE__, __LINE__); fontBufIndex += FONT_CHAR_TEX_SIZE / 8; } diff --git a/soh/src/code/z_map_exp.c b/soh/src/code/z_map_exp.c index 690c81e21..af1c1784d 100644 --- a/soh/src/code/z_map_exp.c +++ b/soh/src/code/z_map_exp.c @@ -413,8 +413,8 @@ void Map_InitData(PlayState* play, s16 room) { //gMapData->owMinimapTexSize[mapIndex], __FILE__, __LINE__); if (sEntranceIconMapIndex < 24) { - const char* textureName = minimapTableOW[sEntranceIconMapIndex]; - memcpy(play->interfaceCtx.mapSegment, GetResourceDataByName(textureName, false), GetResourceTexSizeByName(textureName, false)); + play->interfaceCtx.mapSegment[0] = GetResourceDataByName(minimapTableOW[sEntranceIconMapIndex], true); + play->interfaceCtx.mapSegmentName[0] = minimapTableOW[sEntranceIconMapIndex]; } interfaceCtx->unk_258 = mapIndex; @@ -447,9 +447,8 @@ void Map_InitData(PlayState* play, s16 room) { //((gMapData->dgnMinimapTexIndexOffset[mapIndex] + room) * 0xFF0), //0xFF0, __FILE__, __LINE__); - const char* textureName = minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room]; - memcpy(play->interfaceCtx.mapSegment, GetResourceDataByName(textureName, false), GetResourceTexSizeByName(textureName, false)); - + play->interfaceCtx.mapSegment[0] = GetResourceDataByName(minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room], true); + play->interfaceCtx.mapSegmentName[0] = minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room]; R_COMPASS_OFFSET_X = gMapData->roomCompassOffsetX[mapIndex][room]; R_COMPASS_OFFSET_Y = gMapData->roomCompassOffsetY[mapIndex][room]; Map_SetFloorPalettesData(play, VREG(30)); @@ -519,7 +518,8 @@ void Map_Init(PlayState* play) { interfaceCtx->unk_258 = -1; interfaceCtx->unk_25A = -1; - interfaceCtx->mapSegment = GAMESTATE_ALLOC_MC(&play->state, 0x1000); + interfaceCtx->mapSegment = GAMESTATE_ALLOC_MC(&play->state, 2 * sizeof(char*)); + interfaceCtx->mapSegmentName = GAMESTATE_ALLOC_MC(&play->state, 2 * sizeof(char*)); // "MAP texture initialization scene_data_ID=%d mapSegment=%x" osSyncPrintf("\n\n\nMAP テクスチャ初期化 scene_data_ID=%d\nmapSegment=%x\n\n", play->sceneNum, interfaceCtx->mapSegment, play); @@ -639,20 +639,20 @@ void Minimap_DrawCompassIcons(PlayState* play) { if (CVarGetInteger("gMinimapPosType", 0) == 1) {//Anchor Left if (CVarGetInteger("gMinimapUseMargins", 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; Matrix_Translate( - OTRGetDimensionFromLeftEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), + OTRGetDimensionFromLeftEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), (R_COMPASS_OFFSET_Y + ((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger("gMinimapPosY", 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); } else if (CVarGetInteger("gMinimapPosType", 0) == 2) {//Anchor Right if (CVarGetInteger("gMinimapUseMargins", 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; Matrix_Translate( - OTRGetDimensionFromRightEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), + OTRGetDimensionFromRightEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), (R_COMPASS_OFFSET_Y +((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger("gMinimapPosY", 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); } else if (CVarGetInteger("gMinimapPosType", 0) == 3) {//Anchor None Matrix_Translate( - (R_COMPASS_OFFSET_X + tempX + (CVarGetInteger("gMinimapPosX", 0)*10) / 10.0f), + (R_COMPASS_OFFSET_X + tempX + (CVarGetInteger("gMinimapPosX", 0)*10) / 10.0f), (R_COMPASS_OFFSET_Y + ((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger("gMinimapPosY", 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); } else if (CVarGetInteger("gMinimapPosType", 0) == 4) {//Hidden Matrix_Translate( - (R_COMPASS_OFFSET_X+(9999*10) + tempX / 10.0f), + (R_COMPASS_OFFSET_X+(9999*10) + tempX / 10.0f), (R_COMPASS_OFFSET_Y+(9999*10) - tempZ) / 10.0f, 0.0f, MTXMODE_NEW); } } else { @@ -677,20 +677,20 @@ void Minimap_DrawCompassIcons(PlayState* play) { if (CVarGetInteger("gMinimapPosType", 0) == 1) {//Anchor Left if (CVarGetInteger("gMinimapUseMargins", 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; Matrix_Translate( - OTRGetDimensionFromLeftEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), + OTRGetDimensionFromLeftEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), (R_COMPASS_OFFSET_Y + ((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger("gMinimapPosY", 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); } else if (CVarGetInteger("gMinimapPosType", 0) == 2) {//Anchor Right if (CVarGetInteger("gMinimapUseMargins", 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; Matrix_Translate( - OTRGetDimensionFromRightEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), + OTRGetDimensionFromRightEdge((R_COMPASS_OFFSET_X + (X_Margins_Minimap*10) + tempX + (CVarGetInteger("gMinimapPosX", 0)*10)) / 10.0f), (R_COMPASS_OFFSET_Y +((Y_Margins_Minimap*10)*-1) - tempZ + ((CVarGetInteger("gMinimapPosY", 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); } else if (CVarGetInteger("gMinimapPosType", 0) == 3) {//Anchor None Matrix_Translate( - (R_COMPASS_OFFSET_X + tempX + (CVarGetInteger("gMinimapPosX", 0)*10) / 10.0f), + (R_COMPASS_OFFSET_X + tempX + (CVarGetInteger("gMinimapPosX", 0)*10) / 10.0f), (R_COMPASS_OFFSET_Y - tempZ + ((CVarGetInteger("gMinimapPosY", 0)*10)*-1)) / 10.0f, 0.0f, MTXMODE_NEW); } else if (CVarGetInteger("gMinimapPosType", 0) == 4) {//Hidden Matrix_Translate( - (R_COMPASS_OFFSET_X+(9999*10) + tempX / 10.0f), + (R_COMPASS_OFFSET_X+(9999*10) + tempX / 10.0f), (R_COMPASS_OFFSET_Y+(9999*10) - tempZ) / 10.0f, 0.0f, MTXMODE_NEW); } } else { @@ -756,8 +756,7 @@ void Minimap_Draw(PlayState* play) { if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, mapIndex)) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, minimapColor.r, minimapColor.g, minimapColor.b, interfaceCtx->minimapAlpha); - gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->mapSegment); - gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_I, 96, 85, 0, + gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegmentName[0], G_IM_FMT_I, 96, 85, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); @@ -767,7 +766,7 @@ void Minimap_Draw(PlayState* play) { dgnMiniMapY = R_DGN_MINIMAP_Y+CVarGetInteger("gMinimapPosY", 0)+Y_Margins_Minimap; if (CVarGetInteger("gMinimapPosType", 0) == 1) {//Anchor Left if (CVarGetInteger("gMinimapUseMargins", 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; - dgnMiniMapX = OTRGetDimensionFromLeftEdge(R_DGN_MINIMAP_X+CVarGetInteger("gMinimapPosX", 0)+X_Margins_Minimap); + dgnMiniMapX = OTRGetDimensionFromLeftEdge(R_DGN_MINIMAP_X+CVarGetInteger("gMinimapPosX", 0)+X_Margins_Minimap); } else if (CVarGetInteger("gMinimapPosType", 0) == 2) {//Anchor Right if (CVarGetInteger("gMinimapUseMargins", 0) != 0) {X_Margins_Minimap = Right_MM_Margin;}; dgnMiniMapX = OTRGetDimensionFromRightEdge(R_DGN_MINIMAP_X+CVarGetInteger("gMinimapPosX", 0)+X_Margins_Minimap); @@ -827,7 +826,7 @@ void Minimap_Draw(PlayState* play) { gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, minimapColor.r, minimapColor.g, minimapColor.b, interfaceCtx->minimapAlpha); - gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_IA, + gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegmentName[0], G_IM_FMT_IA, gMapData->owMinimapWidth[mapIndex], gMapData->owMinimapHeight[mapIndex], 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); @@ -897,7 +896,7 @@ void Minimap_Draw(PlayState* play) { //No idea why and how Original value work but this does actually fix them all. PosY = PosY+1024; } - + if (((gMapData->owEntranceFlag[sEntranceIconMapIndex] == 0xFFFF) || ((gMapData->owEntranceFlag[sEntranceIconMapIndex] != 0xFFFF) && (gSaveContext.infTable[26] & gBitFlags[gMapData->owEntranceFlag[mapIndex]]) @@ -912,9 +911,9 @@ void Minimap_Draw(PlayState* play) { } s16 entranceX = OTRGetRectDimensionFromRightEdge(270 + X_Margins_Minimap); - s16 entranceY = 154 + Y_Margins_Minimap; + s16 entranceY = 154 + Y_Margins_Minimap; if (CVarGetInteger("gMinimapPosType", 0) != 0) { - entranceY = 154 + Y_Margins_Minimap + CVarGetInteger("gMinimapPosY", 0); + entranceY = 154 + Y_Margins_Minimap + CVarGetInteger("gMinimapPosY", 0); if (CVarGetInteger("gMinimapPosType", 0) == 1) {//Anchor Left if (CVarGetInteger("gMinimapUseMargins", 0) != 0) {X_Margins_Minimap = Left_MM_Margin;}; entranceX = OTRGetRectDimensionFromLeftEdge(270 + X_Margins_Minimap + CVarGetInteger("gMinimapPosX", 0)); @@ -932,15 +931,15 @@ void Minimap_Draw(PlayState* play) { gDPLoadTextureBlock(OVERLAY_DISP++, gMapDungeonEntranceIconTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 8, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPWideTextureRectangle(OVERLAY_DISP++, entranceX << 2, entranceY << 2, (entranceX + 32) << 2, (entranceY + 8) << 2, + gSPWideTextureRectangle(OVERLAY_DISP++, entranceX << 2, entranceY << 2, (entranceX + 32) << 2, (entranceY + 8) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); } else if ((play->sceneNum == SCENE_SPOT08) && CVarGetInteger("gAlwaysShowDungeonMinimapIcon", 0) != 0){ - + gDPLoadTextureBlock(OVERLAY_DISP++, gMapDungeonEntranceIconTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 8, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPWideTextureRectangle(OVERLAY_DISP++, entranceX << 2, entranceY << 2, (entranceX + 32) << 2, (entranceY + 8) << 2, + gSPWideTextureRectangle(OVERLAY_DISP++, entranceX << 2, entranceY << 2, (entranceX + 32) << 2, (entranceY + 8) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); } diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index 1a8c777a2..762e06b55 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -32,10 +32,10 @@ s16 sMessageHasSetSfx = false; u16 sOcarinaSongBitFlags = 0; // ocarina bit flags -MessageTableEntry* sNesMessageEntryTablePtr; -MessageTableEntry* sGerMessageEntryTablePtr; -MessageTableEntry* sFraMessageEntryTablePtr; -MessageTableEntry* sStaffMessageEntryTablePtr; +MessageTableEntry* sNesMessageEntryTablePtr = NULL; +MessageTableEntry* sGerMessageEntryTablePtr = NULL; +MessageTableEntry* sFraMessageEntryTablePtr = NULL; +MessageTableEntry* sStaffMessageEntryTablePtr = NULL; char* _message_0xFFFC_nes; @@ -562,7 +562,6 @@ void Message_DrawTextboxIcon(PlayState* play, Gfx** p, s16 x, s16 y) { *p = gfx; } -#define MESSAGE_SPACE_WIDTH 6 f32 sFontWidths[144] = { 8.0f, // ' ' 8.0f, // '!' @@ -865,7 +864,7 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { Message_SetTextColor(msgCtx, msgCtx->msgBufDecoded[++i] & 0xF); break; case ' ': - msgCtx->textPosX += MESSAGE_SPACE_WIDTH; + msgCtx->textPosX += CVarGetInteger("gTextSpacing", 6); break; case MESSAGE_BOX_BREAK: if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) { @@ -1131,7 +1130,7 @@ void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 y) { R_TEXTBOX_ICON_YPOS = y + 6; R_TEXTBOX_ICON_SIZE = 32; memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, - GetResourceDataByName(gItemIcons[itemId], false), GetResourceTexSizeByName(gItemIcons[itemId], false)); + gItemIcons[itemId], strlen(gItemIcons[itemId]) + 1); // "Item 32-0" osSyncPrintf("アイテム32-0\n"); } else { @@ -1139,7 +1138,7 @@ void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 y) { R_TEXTBOX_ICON_YPOS = y + 10; R_TEXTBOX_ICON_SIZE = 24; memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, - GetResourceDataByName(gItemIcons[itemId], false), GetResourceTexSizeByName(gItemIcons[itemId], false)); + gItemIcons[itemId], strlen(gItemIcons[itemId]) + 1); // "Item 24" osSyncPrintf("アイテム24=%d (%d) {%d}\n", itemId, itemId - ITEM_KOKIRI_EMERALD, 84); } @@ -1525,10 +1524,8 @@ void Message_Decode(PlayState* play) { msgCtx->textboxBackgroundYOffsetIdx = (font->msgBuf[msgCtx->msgBufPos + 3] & 0xF0) >> 4; msgCtx->textboxBackgroundUnkArg = font->msgBuf[msgCtx->msgBufPos + 3] & 0xF; - memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, - GetResourceDataByName(gRedMessageXLeftTex, false), GetResourceTexSizeByName(gRedMessageXLeftTex, false)); - memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900, - GetResourceDataByName(gRedMessageXRightTex, false), GetResourceTexSizeByName(gRedMessageXRightTex, false)); + memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, gRedMessageXLeftTex, strlen(gRedMessageXLeftTex) + 1); + memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900, gRedMessageXRightTex, strlen(gRedMessageXRightTex) + 1); msgCtx->msgBufPos += 3; R_TEXTBOX_BG_YPOS = R_TEXTBOX_Y + 8; @@ -1674,7 +1671,7 @@ void Message_OpenText(PlayState* play, u16 textId) { osSyncPrintf("吹き出し種類=%d\n", msgCtx->textBoxType); if (textBoxType < TEXTBOX_TYPE_NONE_BOTTOM) { const char* textureName = msgStaticTbl[messageStaticIndices[textBoxType]]; - memcpy(msgCtx->textboxSegment, GetResourceDataByName(textureName, false), MESSAGE_STATIC_TEX_SIZE); + memcpy(msgCtx->textboxSegment, textureName, strlen(textureName) + 1); if (textBoxType == TEXTBOX_TYPE_BLACK) { msgCtx->textboxColorRed = 0; msgCtx->textboxColorGreen = 0; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 68db893fb..8198caebf 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -16,30 +16,9 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -static uint16_t _doActionTexWidth, _doActionTexHeight = -1; -static uint16_t DO_ACTION_TEX_WIDTH() { - return 48; - - // TODO: Figure out why Ship::Texture is not returning a valid width - if (_doActionTexWidth == -1) - _doActionTexWidth = GetResourceTexWidthByName(gCheckDoActionENGTex, false); - return _doActionTexWidth; -} -static uint16_t DO_ACTION_TEX_HEIGHT() { - return 16; - - // TODO: Figure out why Ship::Texture is not returning a valid height - if (_doActionTexHeight == -1) - _doActionTexHeight = GetResourceTexHeightByName(gCheckDoActionENGTex, false); - return _doActionTexHeight; -} - -static uint32_t _doActionTexSize = -1; -static uint32_t DO_ACTION_TEX_SIZE() { - if (_doActionTexSize == -1) - _doActionTexSize = GetResourceTexSizeByName(gCheckDoActionENGTex, false); - return _doActionTexSize; -} +#define DO_ACTION_TEX_WIDTH() 48 +#define DO_ACTION_TEX_HEIGHT() 16 +#define DO_ACTION_TEX_SIZE() ((DO_ACTION_TEX_WIDTH() * DO_ACTION_TEX_HEIGHT()) / 2) // The button statuses include the A button when most things are only the equip item buttons // So, when indexing into it with a item button index, we need to adjust @@ -225,6 +204,8 @@ static const char* actionsTbl[] = gNum8DoActionENGTex, }; +static const char gDoEmptyTexture[] = "__OTR__textures/virtual/gEmptyTexture"; + // original name: "alpha_change" void Interface_ChangeAlpha(u16 alphaType) { if (alphaType != gSaveContext.unk_13EA) { @@ -2848,11 +2829,7 @@ bool Inventory_HatchPocketCucco(PlayState* play) { } void func_80086D5C(s32* buf, u16 size) { - u16 i; - - //buf = GetResourceDataByName(buf, false); - - for (i = 0; i < size; i++) { + for (u16 i = 0; i < size; i++) { buf[i] = 0; } } @@ -2865,46 +2842,25 @@ void Interface_LoadActionLabel(InterfaceContext* interfaceCtx, u16 action, s16 l char* doAction = actionsTbl[action]; - char newName[512]; + static char newName[4][512]; if (gSaveContext.language != LANGUAGE_ENG) { size_t length = strlen(doAction); - strcpy(newName, doAction); + strcpy(newName[loadOffset], doAction); if (gSaveContext.language == LANGUAGE_FRA) { - newName[length - 6] = 'F'; - newName[length - 5] = 'R'; - newName[length - 4] = 'A'; + newName[loadOffset][length - 6] = 'F'; + newName[loadOffset][length - 5] = 'R'; + newName[loadOffset][length - 4] = 'A'; } else if (gSaveContext.language == LANGUAGE_GER) { - newName[length - 6] = 'G'; - newName[length - 5] = 'E'; - newName[length - 4] = 'R'; + newName[loadOffset][length - 6] = 'G'; + newName[loadOffset][length - 5] = 'E'; + newName[loadOffset][length - 4] = 'R'; } - doAction = newName; - } - - /* - if (gSaveContext.language != LANGUAGE_ENG) { - action += DO_ACTION_MAX; - } - - if (gSaveContext.language == LANGUAGE_FRA) { - action += DO_ACTION_MAX; - }*/ - - - if (action != DO_ACTION_NONE) { - //osCreateMesgQueue(&interfaceCtx->loadQueue, &interfaceCtx->loadMsg, OS_MESG_BLOCK); - memcpy(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE()), GetResourceDataByName(doAction, false), - DO_ACTION_TEX_SIZE()); - //DmaMgr_SendRequest2(&interfaceCtx->dmaRequest_160, - //interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE), - //(uintptr_t)_do_action_staticSegmentRomStart + (action * DO_ACTION_TEX_SIZE), DO_ACTION_TEX_SIZE, - //0, &interfaceCtx->loadQueue, NULL, __FILE__, __LINE__); - //osRecvMesg(&interfaceCtx->loadQueue, NULL, OS_MESG_BLOCK); - } else { - gSegments[7] = VIRTUAL_TO_PHYSICAL(interfaceCtx->doActionSegment); - //func_80086D5C(SEGMENTED_TO_VIRTUAL(sDoActionTextures[loadOffset]), DO_ACTION_TEX_SIZE / 4); - func_80086D5C(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE()), DO_ACTION_TEX_SIZE() / 4); + doAction = newName[loadOffset]; } + + char* segment = interfaceCtx->doActionSegment[loadOffset]; + interfaceCtx->doActionSegment[loadOffset] = action != DO_ACTION_NONE ? doAction : gDoEmptyTexture; + gSegments[7] = interfaceCtx->doActionSegment[loadOffset]; } void Interface_SetDoAction(PlayState* play, u16 action) { @@ -2950,7 +2906,7 @@ void Interface_LoadActionLabelB(PlayState* play, u16 action) { InterfaceContext* interfaceCtx = &play->interfaceCtx; char* doAction = actionsTbl[action]; - char newName[512]; + static char newName[512]; if (gSaveContext.language != LANGUAGE_ENG) { size_t length = strlen(doAction); @@ -2967,24 +2923,10 @@ void Interface_LoadActionLabelB(PlayState* play, u16 action) { doAction = newName; } - /*if (gSaveContext.language != LANGUAGE_ENG) { - action += DO_ACTION_MAX; - } - - if (gSaveContext.language == LANGUAGE_FRA) { - action += DO_ACTION_MAX; - }*/ - interfaceCtx->unk_1FC = action; - - - - // OTRTODO - osCreateMesgQueue(&interfaceCtx->loadQueue, &interfaceCtx->loadMsg, OS_MESG_BLOCK); - memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE(), GetResourceDataByName(doAction, false), DO_ACTION_TEX_SIZE()); - //DmaMgr_SendRequest2(&interfaceCtx->dmaRequest_160, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE, - //(uintptr_t)_do_action_staticSegmentRomStart + (action * DO_ACTION_TEX_SIZE), DO_ACTION_TEX_SIZE, 0, - //&interfaceCtx->loadQueue, NULL, __FILE__, __LINE__); + + char* segment = interfaceCtx->doActionSegment[1]; + interfaceCtx->doActionSegment[1] = action != DO_ACTION_NONE ? doAction : gDoEmptyTexture; osRecvMesg(&interfaceCtx->loadQueue, NULL, OS_MESG_BLOCK); interfaceCtx->unk_1FA = 1; @@ -4040,28 +3982,8 @@ void Interface_DrawItemButtons(PlayState* play) { gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - - //There is probably a more elegant way to do it. - char* doAction = actionsTbl[3]; - char newName[512]; - if (gSaveContext.language != LANGUAGE_ENG) { - size_t length = strlen(doAction); - strcpy(newName, doAction); - if (gSaveContext.language == LANGUAGE_FRA) { - newName[length - 6] = 'F'; - newName[length - 5] = 'R'; - newName[length - 4] = 'A'; - } else if (gSaveContext.language == LANGUAGE_GER) { - newName[length - 6] = 'G'; - newName[length - 5] = 'E'; - newName[length - 4] = 'R'; - } - doAction = newName; - } - - memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2, GetResourceDataByName(doAction, false), DO_ACTION_TEX_SIZE()); - - gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2, G_IM_FMT_IA, + Interface_LoadActionLabel(interfaceCtx, 3, 2); + gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment[2], G_IM_FMT_IA, DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_HEIGHT(), 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); @@ -4076,7 +3998,7 @@ void Interface_DrawItemButtons(PlayState* play) { gSPMatrix(OVERLAY_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[4], 4, 0); - Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2); + Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment[2]); gDPPipeSync(OVERLAY_DISP++); } } @@ -4900,10 +4822,6 @@ void Interface_Draw(PlayState* play) { OPEN_DISPS(play->state.gfxCtx); - // Invalidate Do Action textures as they may have changed - gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->doActionSegment); - gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE()); - gSPSegment(OVERLAY_DISP++, 0x02, interfaceCtx->parameterSegment); gSPSegment(OVERLAY_DISP++, 0x07, interfaceCtx->doActionSegment); gSPSegment(OVERLAY_DISP++, 0x08, interfaceCtx->iconItemSegment); @@ -5211,7 +5129,7 @@ void Interface_Draw(PlayState* play) { PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha); - gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE(), G_IM_FMT_IA, + gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment[1], G_IM_FMT_IA, DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_HEIGHT(), 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); @@ -5301,7 +5219,7 @@ void Interface_Draw(PlayState* play) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, dPadColor.r, dPadColor.g, dPadColor.b, dpadAlpha); if (fullUi) { - gDPLoadTextureBlock(OVERLAY_DISP++, GetResourceDataByName("__OTR__textures/parameter_static/gDPad", false), + gDPLoadTextureBlock(OVERLAY_DISP++, "__OTR__textures/parameter_static/gDPad", G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2, @@ -5417,9 +5335,9 @@ void Interface_Draw(PlayState* play) { gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[4], 4, 0); if ((interfaceCtx->unk_1EC < 2) || (interfaceCtx->unk_1EC == 3)) { - Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment); + Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment[0]); } else { - Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE()); + Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment[1]); } gDPPipeSync(OVERLAY_DISP++); diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c index 488207a97..9ac45cdcc 100644 --- a/soh/src/code/z_play.c +++ b/soh/src/code/z_play.c @@ -682,6 +682,12 @@ void Play_Init(GameState* thisx) { DmaMgr_DmaRomToRam(0x03FEB000, D_8012D1F0, sizeof(D_801614D0)); } #endif + + if (CVarGetInteger("gIvanCoopModeEnabled", 0)) { + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_PARTNER, GET_PLAYER(play)->actor.world.pos.x, + GET_PLAYER(play)->actor.world.pos.y + Player_GetHeight(GET_PLAYER(play)) + 5.0f, + GET_PLAYER(play)->actor.world.pos.z, 0, 0, 0, 1, true); + } } void Play_Update(PlayState* play) { diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 8df5b5a91..01d5e0409 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -330,6 +330,12 @@ void Player_SetBootData(PlayState* play, Player* this) { } } +// Custom method used to determine if we're using a custom model for link +uint8_t Player_IsCustomLinkModel() { + return (LINK_IS_ADULT && GetResourceIsCustomByName(gLinkAdultSkel, true)) || + (LINK_IS_CHILD && GetResourceIsCustomByName(gLinkChildSkel, true)); +} + s32 Player_InBlockingCsMode(PlayState* play, Player* this) { return (this->stateFlags1 & 0x20000080) || (this->csMode != 0) || (play->sceneLoadFlag == 0x14) || (this->stateFlags1 & 1) || (this->stateFlags3 & 0x80) || @@ -788,6 +794,11 @@ void func_8008F470(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dLis gDPSetEnvColor(POLY_OPA_DISP++, color->r, color->g, color->b, 0); + // If we have a custom link model, always use the most detailed LOD + if (Player_IsCustomLinkModel()) { + lod = 0; + } + sDListsLodOffset = lod * 2; SkelAnime_DrawFlexLod(play, skeleton, jointTable, dListCount, overrideLimbDraw, postLimbDraw, data, lod); @@ -1024,7 +1035,8 @@ s32 func_8008FCC8(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s s32 func_80090014(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { Player* this = (Player*)thisx; - if (!func_8008FCC8(play, limbIndex, dList, pos, rot, thisx)) { + if (!func_8008FCC8(play, limbIndex, dList, pos, rot, thisx)) + { if (limbIndex == PLAYER_LIMB_L_HAND) { Gfx** dLists = this->leftHandDLists; @@ -1072,7 +1084,12 @@ s32 func_80090014(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s } else if (limbIndex == PLAYER_LIMB_WAIST) { - *dList = ResourceMgr_LoadGfxByName(this->waistDLists[sDListsLodOffset]); + + if (!Player_IsCustomLinkModel()) { + *dList = ResourceMgr_LoadGfxByName( + this->waistDLists[sDListsLodOffset]); // NOTE: This needs to be disabled when using custom + // characters - they're not going to have LODs anyways... + } } } @@ -1678,6 +1695,10 @@ s32 func_80091880(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s } } else if (limbIndex == PLAYER_LIMB_WAIST) { type = gPlayerModelTypes[modelGroup][4]; + + if (Player_IsCustomLinkModel()) { + return 0; + } } else { return 0; } diff --git a/soh/src/code/z_room.c b/soh/src/code/z_room.c index d10a5089e..f30bb5b03 100644 --- a/soh/src/code/z_room.c +++ b/soh/src/code/z_room.c @@ -1,3 +1,7 @@ +#ifdef WIN32 +#include <vcruntime_string.h> +#endif + #include "global.h" #include "vt.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h" @@ -222,42 +226,29 @@ void func_80095D04(PlayState* play, Room* room, u32 flags) { s32 swapAndConvertJPEG(void* data) { OSTime time; + if (BE32SWAP(*(u32*)data) == JPEG_MARKER) { + size_t size = 320 * 240 * 2; - if (BE32SWAP(*(u32*)data) == JPEG_MARKER) - { - char* decodedJpeg = ResourceMgr_LoadJPEG(data, 320 * 240 * 2); - //char* decodedJpeg = ResourceMgr_LoadJPEG(data, 480 * 240 * 2); + char *decodedJpeg = ResourceMgr_LoadJPEG(data, size); - osSyncPrintf("JPEGデータを展開します\n"); // "Expanding jpeg data" - osSyncPrintf("JPEGデータアドレス %08x\n", data); // "Jpeg data address %08x" - // "Work buffer address (Z buffer) %08x" - osSyncPrintf("ワークバッファアドレス(Zバッファ)%08x\n", gZBuffer); + osSyncPrintf("Expanding jpeg data\n"); + osSyncPrintf("Work buffer address (Z buffer) %08x\n", gZBuffer); time = osGetTime(); - //if (!Jpeg_Decode(data, gZBuffer, gGfxSPTaskOutputBuffer, sizeof(gGfxSPTaskOutputBuffer))) - if (1) - { - memcpy(data, decodedJpeg, 320 * 240 * 2); - //memcpy(data, decodedJpeg, 480 * 240 * 2); - time = osGetTime() - time; - - // "Success... I think. time = %6.3f ms" - osSyncPrintf("成功…だと思う。 time = %6.3f ms \n", OS_CYCLES_TO_USEC(time) / 1000.0f); - // "Writing back to original address from work buffer." - osSyncPrintf("ワークバッファから元のアドレスに書き戻します。\n"); - // "If the original buffer size isn't at least 150kb, it will be out of control." - osSyncPrintf("元のバッファのサイズが150キロバイト無いと暴走するでしょう。\n"); - - //bcopy(gZBuffer, data, sizeof(gZBuffer)); - } else { - osSyncPrintf("失敗!なんで〜\n"); // "Failure! Why is it 〜" - } + memcpy(data, decodedJpeg, size); + time = osGetTime() - time; + + osSyncPrintf("Success... I think. time = %6.3f ms", OS_CYCLES_TO_USEC(time) / 1000.0f); + osSyncPrintf("Writing back to original address from work buffer."); + osSyncPrintf("If the original buffer size isn't at least 150kb, it will be out of control."); + return 1; } return 0; } + void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0, u16 tlutCount, f32 frameX, f32 frameY) { Gfx* displayListHead; @@ -265,7 +256,6 @@ void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 h s32 temp; displayListHead = *displayList; - swapAndConvertJPEG(SEGMENTED_TO_VIRTUAL(source)); bg = (uObjBg*)(displayListHead + 1); gSPBranchList(displayListHead, (u8*)bg + sizeof(uObjBg)); @@ -413,7 +403,7 @@ BgImage* func_80096A74(PolygonType1* polygon1, PlayState* play) { // camera (such as din's fire) on scenes with prerendered backgrounds return NULL; } - + // jfifid camId2 = func_80041C10(&play->colCtx, camId, BGCHECK_SCENE)[2].y; if (camId2 >= 0) { diff --git a/soh/src/code/z_skelanime.c b/soh/src/code/z_skelanime.c index d0404ae17..908a83bcf 100644 --- a/soh/src/code/z_skelanime.c +++ b/soh/src/code/z_skelanime.c @@ -1077,7 +1077,7 @@ void SkelAnime_InitLink(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeade LinkAnimationHeader* animation, s32 flags, Vec3s* jointTable, Vec3s* morphTable, s32 limbBufCount) { if (ResourceMgr_OTRSigCheck(skeletonHeaderSeg) != 0) - skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg); + skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg, skelAnime); FlexSkeletonHeader* skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg); s32 headerJointCount = skeletonHeader->sh.limbCount; @@ -1429,7 +1429,7 @@ s32 LinkAnimation_OnFrame(SkelAnime* skelAnime, f32 frame) { s32 SkelAnime_Init(PlayState* play, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount) { if (ResourceMgr_OTRSigCheck(skeletonHeaderSeg)) - skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg); + skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg, skelAnime); SkeletonHeader* skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg); @@ -1462,7 +1462,7 @@ s32 SkelAnime_Init(PlayState* play, SkelAnime* skelAnime, SkeletonHeader* skelet s32 SkelAnime_InitFlex(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg, AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount) { if (ResourceMgr_OTRSigCheck(skeletonHeaderSeg) != 0) - skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg); + skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg, skelAnime); FlexSkeletonHeader* skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg); @@ -1921,6 +1921,8 @@ void SkelAnime_Free(SkelAnime* skelAnime, PlayState* play) { } else { osSyncPrintf("morf_joint あきまへん!!\n"); // "morf_joint is freed !!" } + + ResourceMgr_UnregisterSkeleton(skelAnime); } /** diff --git a/soh/src/code/z_skin_awb.c b/soh/src/code/z_skin_awb.c index f3a2e6390..eea1967a9 100644 --- a/soh/src/code/z_skin_awb.c +++ b/soh/src/code/z_skin_awb.c @@ -38,7 +38,7 @@ void Skin_InitAnimatedLimb(PlayState* play, Skin* skin, s32 limbIndex) { */ void Skin_Init(PlayState* play, Skin* skin, SkeletonHeader* skeletonHeader, AnimationHeader* animationHeader) { if (ResourceMgr_OTRSigCheck(skeletonHeader)) - skeletonHeader = ResourceMgr_LoadSkeletonByName(skeletonHeader); + skeletonHeader = ResourceMgr_LoadSkeletonByName(skeletonHeader, NULL); s32 limbCount; s32 i; |
