summaryrefslogtreecommitdiff
path: root/soh/src/code
diff options
context:
space:
mode:
Diffstat (limited to 'soh/src/code')
-rw-r--r--soh/src/code/game.c10
-rw-r--r--soh/src/code/gfxprint.c33
-rw-r--r--soh/src/code/z_actor.c61
-rw-r--r--soh/src/code/z_cheap_proc.c10
-rw-r--r--soh/src/code/z_collision_check.c10
-rw-r--r--soh/src/code/z_construct.c10
-rw-r--r--soh/src/code/z_fcurve_data_skelanime.c2
-rw-r--r--soh/src/code/z_kanfont.c6
-rw-r--r--soh/src/code/z_map_exp.c47
-rw-r--r--soh/src/code/z_message_PAL.c23
-rw-r--r--soh/src/code/z_parameter.c142
-rw-r--r--soh/src/code/z_play.c6
-rw-r--r--soh/src/code/z_player_lib.c25
-rw-r--r--soh/src/code/z_room.c46
-rw-r--r--soh/src/code/z_skelanime.c8
-rw-r--r--soh/src/code/z_skin_awb.c2
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;