From 01edd8c27a7430157b0119145b401b7bb0d52d0d Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Wed, 9 Sep 2026 09:06:35 -0700 Subject: [PATCH] d_a_grid mostly done (#1198) * d_a_grid mostly done * demo fixes --- config/D44J01/config.yml | 17 + config/GZLE01/config.yml | 17 + config/GZLJ01/config.yml | 17 + config/GZLP01/config.yml | 17 + include/d/actor/d_a_grid.h | 150 +++++++- src/d/actor/d_a_grid.cpp | 713 ++++++++++++++++++++++++++++++++++++- src/d/actor/d_a_ship.cpp | 2 +- 7 files changed, 902 insertions(+), 31 deletions(-) diff --git a/config/D44J01/config.yml b/config/D44J01/config.yml index b28cab304..538909fff 100644 --- a/config/D44J01/config.yml +++ b/config/D44J01/config.yml @@ -3564,3 +3564,20 @@ extract: - symbol: l_matDL!.data:0x80385FC0 binary: assets/l_matDL__d_menu_cloth.bin header: assets/l_matDL__d_menu_cloth.h + +- symbol: l_pos!.data:0x8037F358 + binary: assets/l_pos__d_a_grid.bin + header: assets/l_pos__d_a_grid.h + header_type: none + custom_type: Vec +- symbol: l_texCoord!.data:0x8037F754 + binary: assets/l_texCoord__d_a_grid.bin + header: assets/l_texCoord__d_a_grid.h + header_type: none + custom_type: cXy +- symbol: l_DL!.data:0x8037FA00 + binary: assets/l_DL__d_a_grid.bin + header: assets/l_DL__d_a_grid.h +- symbol: l_matDL!.data:0x8037FC40 + binary: assets/l_matDL__d_a_grid.bin + header: assets/l_matDL__d_a_grid.h diff --git a/config/GZLE01/config.yml b/config/GZLE01/config.yml index 8937fe2c5..5f70bc9e4 100644 --- a/config/GZLE01/config.yml +++ b/config/GZLE01/config.yml @@ -3113,3 +3113,20 @@ extract: - symbol: l_matDL!.data:0x80391DE0 binary: assets/l_matDL__d_menu_cloth.bin header: assets/l_matDL__d_menu_cloth.h + +- symbol: l_pos!.data:0x8038B1D8 + binary: assets/l_pos__d_a_grid.bin + header: assets/l_pos__d_a_grid.h + header_type: none + custom_type: Vec +- symbol: l_texCoord!.data:0x8038B5D4 + binary: assets/l_texCoord__d_a_grid.bin + header: assets/l_texCoord__d_a_grid.h + header_type: none + custom_type: cXy +- symbol: l_DL!.data:0x8038B880 + binary: assets/l_DL__d_a_grid.bin + header: assets/l_DL__d_a_grid.h +- symbol: l_matDL!.data:0x8038BAC0 + binary: assets/l_matDL__d_a_grid.bin + header: assets/l_matDL__d_a_grid.h diff --git a/config/GZLJ01/config.yml b/config/GZLJ01/config.yml index 9995da032..654bf1dd5 100644 --- a/config/GZLJ01/config.yml +++ b/config/GZLJ01/config.yml @@ -2697,3 +2697,20 @@ extract: - symbol: l_matDL!.data:0x80385480 binary: assets/l_matDL__d_menu_cloth.bin header: assets/l_matDL__d_menu_cloth.h + +- symbol: l_pos!.data:0x8037E878 + binary: assets/l_pos__d_a_grid.bin + header: assets/l_pos__d_a_grid.h + header_type: none + custom_type: Vec +- symbol: l_texCoord!.data:0x8037EC74 + binary: assets/l_texCoord__d_a_grid.bin + header: assets/l_texCoord__d_a_grid.h + header_type: none + custom_type: cXy +- symbol: l_DL!.data:0x8037EF20 + binary: assets/l_DL__d_a_grid.bin + header: assets/l_DL__d_a_grid.h +- symbol: l_matDL!.data:0x8037F160 + binary: assets/l_matDL__d_a_grid.bin + header: assets/l_matDL__d_a_grid.h diff --git a/config/GZLP01/config.yml b/config/GZLP01/config.yml index fb547fbba..0570d2a70 100644 --- a/config/GZLP01/config.yml +++ b/config/GZLP01/config.yml @@ -2709,3 +2709,20 @@ extract: - symbol: l_matDL!.data:0x80398AC0 binary: assets/l_matDL__d_menu_cloth.bin header: assets/l_matDL__d_menu_cloth.h + +- symbol: l_pos!.data:0x80391EB8 + binary: assets/l_pos__d_a_grid.bin + header: assets/l_pos__d_a_grid.h + header_type: none + custom_type: Vec +- symbol: l_texCoord!.data:0x803922B4 + binary: assets/l_texCoord__d_a_grid.bin + header: assets/l_texCoord__d_a_grid.h + header_type: none + custom_type: cXy +- symbol: l_DL!.data:0x80392560 + binary: assets/l_DL__d_a_grid.bin + header: assets/l_DL__d_a_grid.h +- symbol: l_matDL!.data:0x803927A0 + binary: assets/l_matDL__d_a_grid.bin + header: assets/l_matDL__d_a_grid.h diff --git a/include/d/actor/d_a_grid.h b/include/d/actor/d_a_grid.h index 81d066229..05f77ebb3 100644 --- a/include/d/actor/d_a_grid.h +++ b/include/d/actor/d_a_grid.h @@ -2,19 +2,61 @@ #define D_A_GRID_H #include "f_op/f_op_actor.h" +#include "JSystem/J3DGraphBase/J3DPacket.h" +#include "m_Do/m_Do_hostIO.h" -class daHo_packet_c { +class daHo_packet_c : public J3DMatPacket { public: + daHo_packet_c() { + field_0x18a2 = 0; + field_0x189c = 0; + field_0x18a0 = 0; + field_0x189e = 0; + mAlpha = 0xFF; + setShapePacket(&mShapePacket); + } + void setBackNrm(); void setNrmMtx(cXyz&); void setNrmVtx(cXyz*, int, int); void setTopNrmVtx(cXyz*); - void draw(); + + virtual void draw(); + virtual ~daHo_packet_c() {} + + cXyz* getPos() { return mPos[field_0x18a2]; } + cXyz* getNrm() { return mNrm[field_0x18a2]; } + void changeCurrentPos() { field_0x18a2 ^= 1; } + void setAlpha(u8 i_alpha) { mAlpha = i_alpha; } + u8 getAlpha() { return mAlpha; } + void setTevStr(dKy_tevstr_c* i_tevstr) { mpTevStr = i_tevstr; } + MtxP getMtx() { return mMtx; } + + // fake? doesn't appear in debug map, but fixes some issues and exists in other similar classes + cXyz* getBackNrm() { return mBackNrm[field_0x18a2]; } + +public: + /* 0x003C */ J3DShapePacket mShapePacket; + /* 0x0080 */ Mtx mMtx; + /* 0x00B0 */ dKy_tevstr_c* mpTevStr; + /* 0x00B4 */ cXyz mPos[2][85]; + /* 0x08AC */ cXyz mNrm[2][85]; + /* 0x10A4 */ cXyz mBackNrm[2][85]; + /* 0x189C */ s16 field_0x189c; + /* 0x189E */ s16 field_0x189e; + /* 0x18A0 */ s16 field_0x18a0; + /* 0x18A2 */ u8 field_0x18a2; + /* 0x18A3 */ u8 mAlpha; }; class daGrid_c : public fopAc_ac_c { public: - void force_calc_wind_rel_angle(short param_1) { m2216 = param_1; m2218 = 1; } + daGrid_c() {} + + void force_calc_wind_rel_angle(s16 i_angle) { + mForceWindRelAngle = i_angle; + mIsForceWindRelAngle = TRUE; + } cPhs_State _create(); bool _delete(); @@ -22,18 +64,104 @@ public: bool _draw(); public: - /* 0x0290 */ u8 m0290[0x2200 - 0x290]; - /* 0x2200 */ f32 m2200; - /* 0x2204 */ u8 m2219[0x2216 - 0x2204]; - /* 0x2216 */ s16 m2216; - /* 0x2218 */ u8 m2218; + /* 0x0290 */ request_of_phase_process_class mClothPhase; + /* 0x0298 */ request_of_phase_process_class mShipPhase; + /* 0x02A0 */ daHo_packet_c mPacket; + /* 0x1B44 */ u32 field_0x1b44; + /* 0x1B48 */ s8 field_0x1b48; + /* 0x1B49 */ u8 field_0x1b49; + /* 0x1B4A */ s16 field_0x1b4a; + /* 0x1B4C */ s16 field_0x1b4c; + /* 0x1B4E */ s16 field_0x1b4e; + /* 0x1B50 */ u8 field_0x1B50[0x1B54 - 0x1B50]; + /* 0x1B54 */ f32 field_0x1b54[85]; + /* 0x1CA8 */ cXyz field_0x1ca8[85]; + /* 0x20A4 */ u8 field_0x20A4[0x2200 - 0x20A4]; + /* 0x2200 */ f32 field_0x2200; + /* 0x2204 */ f32 field_0x2204; + /* 0x2208 */ f32 field_0x2208; + /* 0x220C */ u8 field_0x220C[0x2210 - 0x220C]; + /* 0x2210 */ s16 field_0x2210; + /* 0x2212 */ s16 field_0x2212; + /* 0x2214 */ s16 field_0x2214; + /* 0x2216 */ s16 mForceWindRelAngle; + /* 0x2218 */ u8 mIsForceWindRelAngle; }; -class daHo_HIO_c { +class daHo_HIO_c : public JORReflexible { public: - virtual ~daHo_HIO_c() {} + daHo_HIO_c() { + mNo = -1; + field_0x5 = 1; + field_0x7 = 0; + field_0x14 = 40.0f; + field_0x6 = 0; + field_0x8 = 0; + field_0x18 = 0.5f; + field_0x1c = 0.1f; + field_0xc = 0.1f; + field_0x20 = 0.4f; + field_0x24 = 1.0f; + field_0x28 = 1.0f; + field_0x2c = 1.0f; + field_0x30 = 0xFF; + field_0x31 = 50; + field_0x34 = 900.0f; + field_0x38 = 0; + field_0x39 = 0; - u8 field_0x4[0xa4 - 0x04]; + field_0x70[0] = 1.0f; + field_0x70[1] = 0.425f; + field_0x70[2] = 0.45f; + field_0x70[3] = 0.4f; + field_0x70[4] = 0.2f; + field_0x70[5] = 0.4f; + field_0x70[6] = 0.45f; + field_0x70[7] = 0.4f; + field_0x70[8] = 0.2f; + field_0x70[9] = 0.5f; + field_0x70[10] = 0.75f; + field_0x70[11] = 1.0f; + field_0x70[12] = 1.0f; + + field_0x3c[0] = 0.05f; + field_0x3c[1] = 0.125f; + field_0x3c[2] = 0.175f; + field_0x3c[3] = 0.15f; + field_0x3c[4] = 0.0625f; + field_0x3c[5] = 0.15f; + field_0x3c[6] = 0.2f; + field_0x3c[7] = 0.15f; + field_0x3c[8] = 0.075f; + field_0x3c[9] = 0.175f; + field_0x3c[10] = 0.175f; + field_0x3c[11] = 0.1f; + field_0x3c[12] = 0.0f; + } + + virtual ~daHo_HIO_c() { mNo = -1; } + + /* 0x04 */ s8 mNo; + /* 0x05 */ u8 field_0x5; + /* 0x06 */ u8 field_0x6; + /* 0x07 */ u8 field_0x7; + /* 0x08 */ u8 field_0x8; + /* 0x0C */ f32 field_0xc; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1c; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2c; + /* 0x30 */ u8 field_0x30; + /* 0x31 */ u8 field_0x31; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ u8 field_0x38; + /* 0x39 */ u8 field_0x39; + /* 0x3C */ f32 field_0x3c[13]; + /* 0x70 */ f32 field_0x70[13]; }; #endif /* D_A_GRID_H */ diff --git a/src/d/actor/d_a_grid.cpp b/src/d/actor/d_a_grid.cpp index 1944daab7..70e3f42c1 100644 --- a/src/d/actor/d_a_grid.cpp +++ b/src/d/actor/d_a_grid.cpp @@ -1,37 +1,274 @@ -// -// Generated by dtk -// Translation Unit: d_a_grid.cpp -// - #include "d/dolzel.h" // IWYU pragma: keep #include "d/actor/d_a_grid.h" -#include "JSystem/J3DGraphBase/J3DPacket.h" +#include "d/actor/d_a_ship.h" +#include "f_op/f_op_camera.h" +#include "d/d_kankyo_wether.h" +#include "d/d_s_play.h" + +#include "res/Object/Cloth.h" +#include "res/Object/Ship.h" static daHo_HIO_c l_HIO; +static daShip_c* l_ship; + +static f32 dummyFloat(int _) { + switch (_) { + case 0: return 1.0f; + default: return 0.5f; + } +} + +static f64 dummyDouble() { + return 4503601774854144.0; +} /* 800E8CC0-800E8D48 .text setBackNrm__13daHo_packet_cFv */ void daHo_packet_c::setBackNrm() { - /* Nonmatching */ + cXyz* nrm_p = mNrm[field_0x18a2]; + cXyz* backNrm_p = mBackNrm[field_0x18a2]; + + for (int i = 0; i < 85; i++) { + backNrm_p->set(0.0f, 0.0f, 0.0f); + *backNrm_p -= *nrm_p; + nrm_p++; + backNrm_p++; + } } /* 800E8D48-800E8D74 .text setNrmMtx__13daHo_packet_cFR4cXyz */ void daHo_packet_c::setNrmMtx(cXyz&) { - /* Nonmatching */ + cMtx_YrotS(*calc_mtx, field_0x189c); } /* 800E8D74-800E92AC .text setNrmVtx__13daHo_packet_cFP4cXyzii */ -void daHo_packet_c::setNrmVtx(cXyz*, int, int) { - /* Nonmatching */ +void daHo_packet_c::setNrmVtx(cXyz* o_vtx, int i_x, int i_y) { + cXyz x_diff; + cXyz y_diff; + cXyz norm; + cXyz total; + cXyz pos; + + cXyz* pos_p = getPos(); + int idx = i_y * 7; + + pos = pos_p[i_x + idx]; + total.setall(0.0f); + + if (i_x != 0) { + x_diff = pos_p[idx - 1 + i_x] - pos; + + if (i_y != 0 && i_y != 9) { + y_diff = pos_p[(i_y - 1) * 7 + i_x] - pos; + norm = x_diff.outprod(y_diff); + norm = norm.normZC(); + total += norm; + } + + if (i_y == 11) { + y_diff = pos_p[84] - pos; + norm = y_diff.outprod(x_diff); + norm = norm.normZC(); + total += norm; + } else if (i_y != 8) { + y_diff = pos_p[(i_y + 1) * 7 + i_x] - pos; + norm = y_diff.outprod(x_diff); + norm = norm.normZC(); + total += norm; + } + } + + if (i_x != 6) { + x_diff = pos_p[i_x + 1 + idx] - pos; + + if (i_y != 0 && i_y != 9) { + y_diff = pos_p[(i_y - 1) * 7 + i_x] - pos; + norm = y_diff.outprod(x_diff); + norm = norm.normZC(); + total += norm; + } + + if (i_y == 11) { + y_diff = pos_p[84] - pos; + norm = x_diff.outprod(y_diff); + norm = norm.normZC(); + total += norm; + } else if (i_y != 8) { + y_diff = pos_p[(i_y + 1) * 7 + i_x] - pos; + norm = x_diff.outprod(y_diff); + norm = norm.normZC(); + total += norm; + } + } + + if (i_y > 7) { + total.y = 0.0f; + } + + if (!total.normalizeRS()) { + total.x = 1.0f; + total.y = 0.0f; + total.z = 0.0f; + } + + MtxPush(); + cMtx_YrotM(*calc_mtx, cM_ssin((i_x + i_y) * -800) * 900.0f); + MtxPosition(&total, &norm); + *o_vtx = norm.normZC(); + MtxPull(); } /* 800E92AC-800E93B8 .text setTopNrmVtx__13daHo_packet_cFP4cXyz */ -void daHo_packet_c::setTopNrmVtx(cXyz*) { - /* Nonmatching */ +void daHo_packet_c::setTopNrmVtx(cXyz* o_vtx) { + cXyz sp68; + cXyz sp5C; + cXyz sp50; + cXyz sp44; + + cXyz* pos_p = getPos(); + sp68 = pos_p[77] - pos_p[84]; + sp5C = pos_p[83] - pos_p[84]; + + sp44 = sp68.outprod(sp5C); + sp44 = sp44.normZC(); + MtxPosition(&sp44, &sp50); + *o_vtx = sp50.normZC(); } +#include "assets/l_pos__d_a_grid.h" +#include "assets/l_texCoord__d_a_grid.h" +#include "assets/l_DL__d_a_grid.h" +#include "assets/l_matDL__d_a_grid.h" + /* 800E93B8-800E9BE8 .text draw__13daHo_packet_cFv */ void daHo_packet_c::draw() { - /* Nonmatching */ + j3dSys.reinitGX(); + + #if VERSION >= VERSION_USA + GXSetNumIndStages(0); + #endif + + dKy_GxFog_tevstr_set(mpTevStr); + + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX8); + GXSetVtxDesc(GX_VA_NRM, GX_INDEX8); + GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GXSetArray(GX_VA_POS, getPos(), sizeof(cXyz)); + GXSetArray(GX_VA_NRM, getNrm(), sizeof(cXyz)); + GXSetArray(GX_VA_TEX0, l_texCoord, sizeof(cXy)); + + GXTexObj texObj; + GXTlutObj tlutObj; + + ResTIMG* ho1_timg = (ResTIMG*)dComIfG_getObjectRes("Ship", dRes_ID_SHIP_BTI_NEW_HO1_e); + GXInitTlutObj(&tlutObj, (u8*)ho1_timg + ho1_timg->paletteOffset, GX_TL_RGB565, 0x100); + GXInitTexObjCI(&texObj, (u8*)ho1_timg + ho1_timg->imageOffset, ho1_timg->width, ho1_timg->height, + (GXCITexFmt)ho1_timg->format, (GXTexWrapMode)ho1_timg->wrapS, + (GXTexWrapMode)ho1_timg->wrapT, ho1_timg->mipmapCount > 1, GX_TLUT0); + GXInitTexObjLOD(&texObj, (GXTexFilter)ho1_timg->minFilter, (GXTexFilter)ho1_timg->magFilter, + ho1_timg->minLOD * 0.125f, ho1_timg->maxLOD * 0.125f, ho1_timg->LODBias * 0.01f, + ho1_timg->biasClamp, ho1_timg->doEdgeLOD, (GXAnisotropy)ho1_timg->maxAnisotropy); + GXLoadTlut(&tlutObj, GX_TLUT0); + GXLoadTexObj(&texObj, GX_TEXMAP0); + + ResTIMG* toon_timg = (ResTIMG*)dComIfG_getObjectRes("Cloth", dRes_ID_CLOTH_BTI_CLOTHTOON_e); + GXInitTexObj(&texObj, (u8*)toon_timg + toon_timg->imageOffset, toon_timg->width, toon_timg->height, + (GXTexFmt)toon_timg->format, (GXTexWrapMode)toon_timg->wrapS, + (GXTexWrapMode)toon_timg->wrapT, toon_timg->mipmapCount > 1); + GXInitTexObjLOD(&texObj, (GXTexFilter)toon_timg->minFilter, (GXTexFilter)toon_timg->magFilter, + toon_timg->minLOD * 0.125f, toon_timg->maxLOD * 0.125f, + toon_timg->LODBias * 0.01f, toon_timg->biasClamp, toon_timg->doEdgeLOD, + (GXAnisotropy)toon_timg->maxAnisotropy); + GXLoadTexObj(&texObj, GX_TEXMAP1); + + GXSetNumChans(1); + + u8 num_stages; + u8 light_mask; + if (mpTevStr->mColorK1.a != 0) { + num_stages = 3; + light_mask = GX_LIGHT0 | GX_LIGHT1; + } else { + num_stages = 2; + light_mask = GX_LIGHT0; + } + + if (l_HIO.field_0x5) { + GXSetChanCtrl(GX_COLOR0, 1, GX_SRC_REG, GX_SRC_REG, light_mask, GX_DF_CLAMP, GX_AF_NONE); + GXSetNumTexGens(2); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_SRTG, GX_TG_COLOR0, GX_IDENTITY); + GXSetNumTevStages(num_stages); + GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C0, GX_CC_C1, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + + if (num_stages == 3) { + GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP0, GX_TEV_SWAP2); + GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_C2, GX_CC_TEXC, GX_CC_CPREV); + GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + } + } else { + GXSetChanCtrl(GX_COLOR0, 1, GX_SRC_REG, GX_SRC_REG, light_mask, GX_DF_CLAMP, GX_AF_NONE); + GXSetNumTexGens(1); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetNumTevStages(num_stages); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP1, GX_TEV_SWAP0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C0, GX_CC_C1, GX_CC_RASC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_CPREV, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + + if (num_stages == 3) { + GXSetTevSwapMode(GX_TEVSTAGE2, GX_TEV_SWAP2, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_C2, GX_CC_RASC, GX_CC_CPREV); + GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + } + } + + mpTevStr->mColorC0.a = mAlpha; + GXSetTevColorS10(GX_TEVREG0, mpTevStr->mColorC0); + GXSetTevColor(GX_TEVREG1, mpTevStr->mColorK0); + GXSetTevColor(GX_TEVREG2, mpTevStr->mColorK1); + GXCallDisplayList(l_matDL, 0x20); + + GXLoadPosMtxImm(getMtx(), 0); + GXLoadNrmMtxImm(getMtx(), 0); + GXSetCullMode(GX_CULL_BACK); + GXCallDisplayList(l_DL, 0x220); + + GXSetCullMode(GX_CULL_FRONT); + GXSetArray(GX_VA_NRM, mBackNrm[field_0x18a2], sizeof(cXyz)); + GXCallDisplayList(l_DL, 0x220); + + #if VERSION >= VERSION_USA + J3DShape::resetVcdVatCache(); + #endif } /* 800E9BE8-800E9C0C .text daGrid_Draw__FP8daGrid_c */ @@ -40,8 +277,249 @@ static BOOL daGrid_Draw(daGrid_c* i_this) { } /* 800E9C0C-800EA928 .text ho_move__FP8daGrid_c */ -void ho_move(daGrid_c*) { - /* Nonmatching */ +// NONMATCHING - some small reg alloc +void ho_move(daGrid_c* i_this) { + if (l_HIO.field_0x38) { + return; + } + + static f32 z_rate_tbl[] = { + 0.05f, 0.125f, 0.175f, 0.15f, 0.0625f, 0.15f, 0.2f, + 0.15f, 0.075f, 0.175f, 0.175f, 0.1f, 0.0f, + }; + + static f32 z_rate_tbl2[] = { + 1.0f, 0.425f, 0.45f, 0.4f, 0.2f, 0.4f, 0.45f, + 0.4f, 0.2f, 0.5f, 0.75f, 1.0f, 1.0f, + }; + + static f32 x_rate_tbl[] = { + 1.0f, 0.95f, 0.9f, 0.85f, 0.8f, 0.75f, 0.7f, + 0.65f, 0.55f, 0.4f, 0.25f, 0.1f, 0.0f, + }; + + f32 temp_f31; + f32 temp_f30; + + #if VERSION == VERSION_DEMO + f32 temp_f15 = 0.4f * (2.0f + 0.05f * REG10_F(1)); + #endif + + cXyz* windVec = dKyw_get_wind_vec(); + f32 windPow = dKyw_get_wind_pow(); + i_this->mPacket.changeCurrentPos(); + + i_this->field_0x1b4c = 7500; + i_this->field_0x1b4e = 7200; + + s16 sail_angle = l_ship->getSailAngle(); + + s16 windAngle = cM_atan2s(windVec->x, windVec->z); + int var_r28 = (s16)(i_this->current.angle.y + sail_angle); + var_r28 -= windAngle; + + s16 temp_r3 = var_r28 + 0x8000; + if (temp_r3 > 0) { + if (sail_angle > 0 && sail_angle < 0x4000) { + temp_r3 = 0; + } + } else if (sail_angle < 0 && sail_angle > -0x4000) { + temp_r3 = 0; + } + + s16 temp_r4 = 0.6f * temp_r3; + if (!i_this->mIsForceWindRelAngle) { + cLib_addCalcAngleS2(&i_this->field_0x2210, temp_r4, 4, 0x1000); + } else { + s16 temp_r4_2 = i_this->mForceWindRelAngle - l_ship->getSailAngle() + 0x8000; + cLib_addCalcAngleS2(&i_this->field_0x2210, temp_r4_2, 2, 0x1400); + } + + i_this->mIsForceWindRelAngle = FALSE; + + cMtx_YrotS(*calc_mtx, i_this->field_0x2210); + cXyz sp34(0.0f, 0.0f, DEMO_SELECT((temp_f15 * 0.08f) * (1.0f + REG10_F(0)), 0.064f)); + cXyz sp28; + MtxPosition(&sp34, &sp28); + + f32 temp_f1 = std::fabsf(sp28.z) + 0.02f; + sp34.x = 1.0f; + sp34.z = 0.0f; + MtxPosition(&sp34, &sp28); + + f32 temp_f28 = std::fabsf(sp28.z); + temp_f28 *= 1.0f - i_this->field_0x2200; + f32 temp_f = 1.0f + (0.01f + REG6_F(15)) * (temp_f28 * cM_ssin(i_this->field_0x1b44)); + s32 temp_r0_2 = 2500.0f + (9000.0f * (DEMO_SELECT(temp_f15, 0.8f) * windPow)) * DEMO_SELECT((1.0f + REG10_F(3)), 1); + i_this->field_0x1b44 += cLib_maxLimit(temp_r0_2, (s32)10000); + i_this->field_0x2212 += (s16)(3000.0f * cM_scos(var_r28)); + + s16 temp_r3_2; + if (i_this->field_0x2212 > 0) { + temp_r3_2 = 300; + } else { + temp_r3_2 = -300; + } + i_this->field_0x2212 += temp_r3_2; + + f32 temp_f26 = 0.5f * cM_ssin(var_r28); + sp34.x = 0.0f; + sp34.z = DEMO_SELECT(temp_f15 * (REG0_F(14) + 2.0f), 1.6f); + + cXyz* pos = i_this->mPacket.getPos(); + + if (!l_HIO.field_0x8) { + if (l_ship->getSailOn()) { + if (i_this->field_0x2208 == 0.0f) { + if (i_this->field_0x2200 <= 0.0001f + l_HIO.field_0xc) { + i_this->field_0x2208 = 1.0f; + i_this->field_0x1b4a = 15; + } + } else if (i_this->field_0x1b4a > 0) { + cLib_addCalc2(&i_this->field_0x2204, 1.414f, 0.25f, l_HIO.field_0x20); + i_this->field_0x1b4a--; + } else { + cLib_addCalc2(&i_this->field_0x2204, 1.0f, 0.1f, 0.05f); + } + } else { + if (i_this->field_0x2200 > 0.7f) { + i_this->field_0x2208 = 0.0f; + i_this->field_0x1b4a = 0; + } + cLib_addCalc2(&i_this->field_0x2204, 1.0f - 0.65f * i_this->field_0x2200, 0.1f, 0.05f); + } + } else { + i_this->field_0x2200 = l_HIO.field_0x10; + } + + int var_r24 = 0; + int var_r23 = 0; + for (int i = 0; i < 85; i++, pos++) { + f32 temp_f25 = 1.0f - i_this->field_0x2200; + f32 temp_f24 = 3 - var_r24; + f32 temp_f23 = var_r23 - 2 + DEMO_SELECT(REG0_F(5), 0); + s16 sp50 = 10922.0f * x_rate_tbl[var_r23]; + + temp_f31 = temp_f1 * cM_ssin(i_this->field_0x1b44 + i * i_this->field_0x1b4c); + temp_f30 = 0.5f * (temp_f1 * cM_scos(i_this->field_0x1b44 + i * i_this->field_0x1b4e)); + + MtxPosition(&sp34, &sp28); + f32 x_value = 0.25f + 0.75f * windPow; + sp28.x = sp28.x * cLib_maxLimit(x_value, 1.0f); + + f32 z_value = 0.5f + 0.25f * windPow; + sp28.z = sp28.z * cLib_maxLimit(z_value, 1.0f); + + temp_f31 += i_this->field_0x2204 * (temp_f25 * (sp28.x * temp_f)); + temp_f30 += i_this->field_0x2204 * (temp_f25 * (sp28.z * temp_f28)); + + f32 temp_f2 = std::sqrtf(SQUARE(temp_f31) + SQUARE(temp_f30)); + f32 temp_f2_2 = 0.05f * temp_f2; + f32 temp_f0_2 = i_this->field_0x1b54[i]; + + temp_f31 *= temp_f0_2; + temp_f2_2 *= temp_f0_2; + temp_f30 *= temp_f0_2; + + f32 temp_f0_3 = temp_f23 < 0.0f ? temp_f23 : 0.0f; + f32 temp_f1_2 = 0.67f + 0.3f * (SQUARE(temp_f0_3) / DEMO_SELECT(SQUARE(2 - REG10_S(5)), 4)); + f32 temp_f3 = 1.0f - temp_f1_2 * i_this->field_0x2200; + f32 z_rate; + f32 temp_f4 = 120.0f; + f32 temp_f5; + + if (l_HIO.field_0x39) { + temp_f3 *= temp_f25 + l_HIO.field_0x70[var_r23] * i_this->field_0x2200; + z_rate = l_HIO.field_0x3c[var_r23]; + temp_f4 *= z_rate * i_this->field_0x2200; + temp_f5 = i_this->field_0x2200 * (5.0f * z_rate * var_r24); + } else { + temp_f3 *= temp_f25 + z_rate_tbl2[var_r23] * i_this->field_0x2200; + z_rate = z_rate_tbl[var_r23]; + temp_f4 *= i_this->field_0x2200 * z_rate; + temp_f5 = i_this->field_0x2200 * (var_r24 * (5.0f * z_rate)); + } + + pos->x = l_pos[i].x; + pos->y = temp_f3 * l_pos[i].y + (1.0f - temp_f3) * l_pos[var_r23 * 7].y; + pos->z = temp_f3 * l_pos[i].z; + + f32 ivar16 = cM_ssin(i_this->field_0x2212 + sp50 * var_r24); + f32 temp_f6 = 9.0f - SQUARE(temp_f24); + f32 temp_f7 = ((i_this->field_0x2200 * ivar16 * temp_f6) / 9.0f) - ((temp_f26 * temp_f6) / 9.0f); + temp_f4 *= temp_f7; + + f32 cos_ = cM_scos(i_this->field_0x2212 + sp50 * var_r24); + temp_f5 *= (i_this->field_0x2200 * cos_ * var_r24) / 6.0f; + + f32 temp = 1.0f - 0.5f * (SQUARE(temp_f0_3) / 4); + temp_f5 *= temp; + temp_f4 *= temp; + + f32 temp_f0_5 = std::sqrtf(SQUARE(temp_f4) + SQUARE(temp_f5)); + f32 temp_f1_3 = 0.25f * -temp_f0_5; + if (var_r24 > 4) { + f32 temp = std::fabsf(cM_ssin(i_this->field_0x2212 + (sp50 * 2) * var_r24)); + temp_f1_3 += 4.25f * ((var_r24 - 4) * temp); + } + + if (l_HIO.field_0x39) { + temp_f1_3 *= i_this->field_0x2200 * (6.0f * l_HIO.field_0x3c[var_r23] * (var_r24 / 6.0f)); + } else { + temp_f1_3 *= i_this->field_0x2200 * (6.0f * z_rate_tbl[var_r23] * (var_r24 / 6.0f)); + } + + pos->x += temp_f4 + (0.65f * temp_f25 + 0.35f) * (temp_f31 * i_this->field_0x2204); + pos->y += temp_f5 + temp_f2_2 * (0.65f * temp_f25 + 0.35f); + pos->z += temp_f1_3 + ((0.65f * temp_f25 + 0.35f) * (temp_f30 * i_this->field_0x2204) - 13.75f); + + var_r23 = var_r24 < 6 ? var_r23 : var_r23 + 1; + var_r24 = var_r24 < 6 ? var_r24 + 1 : 0; + } + + pos = i_this->mPacket.getPos(); + + f32 temp_f4_2 = std::fabsf(pos[59].x); + f32 fvar5 = 1.0f - temp_f4_2 * (0.0015f + REG6_F(8)); + f32 fvar11 = 1.0f - temp_f4_2 * (0.000700000033f + REG6_F(9)); + f32 fvar12 = 1.0f - temp_f4_2 * (0.000200000068f + REG6_F(10)); + f32 fvar10 = 1.0f - temp_f4_2 * (0.0015f + REG6_F(11)); + f32 fvar6 = 1.0f - temp_f4_2 * (0.0012f + REG6_F(12)); + + for (int i = 0; i < 85; i++, pos++) { + if (i >= 56 && i <= 62) { + pos->z *= fvar5; + } else if (i >= 49 && i <= 55) { + pos->z *= fvar11; + } else if (i >= 42 && i <= 48) { + pos->z *= fvar12; + } else if (i >= 63 && i <= 69) { + pos->z *= fvar10; + } else if (i >= 70 && i <= 77) { + pos->z *= fvar6; + } + } + + cXyz* nrm = i_this->mPacket.getNrm(); + cXyz sp1C = i_this->tevStr.mLightPosWorld - i_this->current.pos; + i_this->mPacket.setNrmMtx(sp1C); + + for (int y = 0; y < 12; y++) { + for (int x = 0; x < 7; x++) { + i_this->mPacket.setNrmVtx(nrm, x, y); + nrm++; + } + } + + i_this->mPacket.setTopNrmVtx(nrm); + i_this->mPacket.setBackNrm(); + + DCStoreRangeNoSync(i_this->mPacket.getPos(), sizeof(i_this->mPacket.mPos[0])); + + #if VERSION >= VERSION_USA + DCStoreRangeNoSync(i_this->mPacket.getNrm(), sizeof(i_this->mPacket.mNrm[0])); + DCStoreRangeNoSync(i_this->mPacket.getBackNrm(), sizeof(i_this->mPacket.mBackNrm[0])); + #endif } /* 800EA928-800EA94C .text daGrid_Execute__FP8daGrid_c */ @@ -66,22 +544,219 @@ static cPhs_State daGrid_Create(fopAc_ac_c* i_this) { /* 800EA998-800EAEAC .text _create__8daGrid_cFv */ cPhs_State daGrid_c::_create() { - /* Nonmatching */ + #if VERSION == VERSION_DEMO + field_0x1b48 = fopAcM_GetParam(this); + + cPhs_State phase = dComIfG_resLoad(&mClothPhase, "Cloth"); + cPhs_State phase2 = dComIfG_resLoad(&mShipPhase, "Ship"); + if (phase == cPhs_ERROR_e || phase2 == cPhs_ERROR_e) { + return cPhs_ERROR_e; + } + + if (phase != cPhs_COMPLEATE_e) { + return phase; + } + + if (phase2 != cPhs_COMPLEATE_e) { + return phase2; + } + + cPhs_State temp_r0 = cPhs_COMPLEATE_e; + if (temp_r0 == cPhs_COMPLEATE_e) { + #endif + + fopAcM_ct(this, daGrid_c); + + #if VERSION >= VERSION_JPN + field_0x1b48 = fopAcM_GetParam(this); + + cPhs_State phase = dComIfG_resLoad(&mClothPhase, "Cloth"); + if (phase != cPhs_COMPLEATE_e) { + return phase; + } + + phase = dComIfG_resLoad(&mShipPhase, "Ship"); + if (phase != cPhs_COMPLEATE_e) { + return phase; + } + #endif + + if (l_HIO.mNo < 0) { + l_HIO.mNo = mDoHIO_createChild("船の帆", &l_HIO); + } + + int var_r29; + int i = 0; + Vec* pos_p = l_pos; + + for (; i < 85; i++) { + f32 var_f27; + if (i >= 0 && i <= 6) { + var_f27 = 10.0f * (4.0f + DEMO_SELECT(REG0_F(18), 0)); + } else if (i >= 7 && i <= 13) { + var_f27 = 10.0f * (7.0f + DEMO_SELECT(REG0_F(4), 0)); + } else if ((i >= 49 && i <= 55) || (i >= 42 && i <= 48)) { + var_f27 = 10.0f * (8.5f + DEMO_SELECT(REG0_F(19), 0)); + } else { + var_f27 = 10.0f * (8.0f + DEMO_SELECT(REG0_F(13), 0)); + } + + var_r29 = 6; + + f32 temp_f4 = std::fabsf(pos_p[0].z - pos_p[i].z); + f32 temp_f2 = std::fabsf(pos_p[var_r29].z - pos_p[i].z); + f32 temp_f0 = std::fabsf(pos_p[0].z - pos_p[var_r29].z); + temp_f0 *= 0.5f; + + f32 temp_f1 = 1.05f * ((M_PI / 2) / temp_f0); + if (temp_f4 > temp_f2) { + temp_f4 = temp_f2; + } + + f32 temp_f1_2 = sin(temp_f4 * temp_f1); + var_f27 *= temp_f1_2; + + for (int j = 0; j < 7; j++) { + if (i == j + || i == j + 7 + || i == j + 14 + || i == j + 21 + || i == j + 28 + || i == j + 35 + || i == j + 42 + || i == j + 49 + || i == j + 56 + || i == j + 63 + || i == j + 70 + || i == j + 77) + { + var_r29 = j + 56; + } + } + + f32 pos_y = pos_p[i].y; + Vec* temp_r0 = &pos_p[var_r29]; + + f32 temp_f26; + f32 temp_f1_3; + f32 temp_f1_4; + f32 temp_f0_2; + if (pos_y < temp_r0->y) { + temp_f0_2 = std::fabsf(pos_p[0].y - pos_y); + temp_f1_3 = std::fabsf(temp_r0->y - pos_y); + + f32 temp_f2_2 = std::fabsf(temp_r0->y - pos_p[0].y); + temp_f2_2 *= 0.5f; + temp_f1_4 = 1.05f * ((M_PI / 2) / temp_f2_2); + + if (var_r29 == 56) { + temp_f26 = 10.0f * (3.5f + DEMO_SELECT(REG0_F(16), 0)); + } else if (var_r29 == 57) { + temp_f26 = 10.0f * (7.0f + DEMO_SELECT(REG0_F(5), 0)); + } else { + temp_f26 = 10.0f * (8.0f + DEMO_SELECT(REG0_F(15), 0)); + } + } else { + temp_f0_2 = std::fabsf(temp_r0->y - pos_y); + temp_f1_3 = std::fabsf(pos_p[84].y - pos_y); + + f32 temp_f2_2 = std::fabsf(temp_r0->y - pos_p[84].y); + temp_f2_2 *= 0.5f; + temp_f1_4 = 1.15f * ((M_PI / 2) / temp_f2_2); + temp_f26 = 10.0f * (2.0f + DEMO_SELECT(REG0_F(17), 0)); + } + + if (temp_f0_2 > temp_f1_3) { + temp_f0_2 = temp_f1_3; + } + + f32 sin_ = sin(temp_f0_2 * temp_f1_4); + f32 temp_f4_2 = temp_f26 * sin_; + field_0x1b54[i] = std::sqrtf(SQUARE(var_f27) + SQUARE(temp_f4_2)); + } + + l_ship = (daShip_c*)fopAcM_SearchByName(fpcNm_SHIP_e); + ho_move(this); + +#if VERSION == VERSION_DEMO + } +#endif + + return cPhs_COMPLEATE_e; } /* 800EAEAC-800EAF28 .text _delete__8daGrid_cFv */ bool daGrid_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mClothPhase, "Cloth"); + dComIfG_resDelete(&mShipPhase, "Ship"); + + if (l_HIO.mNo >= 0) { + mDoHIO_deleteChild(l_HIO.mNo); + l_HIO.mNo = -1; + } + + return true; } /* 800EAF28-800EB0EC .text _execute__8daGrid_cFv */ bool daGrid_c::_execute() { - /* Nonmatching */ + u8 alpha = mPacket.getAlpha(); + u8 target_alpha; + + if (!dComIfGp_event_runCheck()) { + cXyz eye = dComIfGp_getCamera(0)->mCamera.Eye(); + f32 cam_eye_dist = (current.pos - eye).abs(); + + u8 target; + if (cam_eye_dist > l_HIO.field_0x34) { + target = l_HIO.field_0x30; + } else { + f32 rate = cam_eye_dist / l_HIO.field_0x34; + target = l_HIO.field_0x30 * rate + l_HIO.field_0x31 * (1.0f - rate); + } + target_alpha = target; + } else { + target_alpha = l_HIO.field_0x30; + } + + if (target_alpha > alpha + 5) { + mPacket.setAlpha(alpha + 5); + } else if (target_alpha < alpha - 5) { + mPacket.setAlpha(alpha - 5); + } else { + mPacket.setAlpha(target_alpha); + } + + if (scale.y < 0.06f) { + return true; + } + + ho_move(this); + return true; } /* 800EB0EC-800EB328 .text _draw__8daGrid_cFv */ bool daGrid_c::_draw() { - /* Nonmatching */ + if (scale.y < 0.06f) { + return TRUE; + } + + tevStr = l_ship->tevStr; + + MtxTrans(current.pos.x, current.pos.y, current.pos.z, false); + cMtx_YrotM(*calc_mtx, current.angle.y); + cMtx_XrotM(*calc_mtx, current.angle.x); + cMtx_ZrotM(*calc_mtx, current.angle.z); + cMtx_YrotM(*calc_mtx, l_ship->getSailAngle()); + MtxScale(1.0f, scale.y, 1.0f, true); + MtxScale(l_HIO.field_0x24, l_HIO.field_0x28, l_HIO.field_0x2c, true); + cMtx_concat(j3dSys.getViewMtx(), *calc_mtx, mPacket.getMtx()); + mPacket.setTevStr(&tevStr); + + J3DDrawBuffer* buffer = mDoGph_gInf_c::isMonotone() ? dComIfGd_getXluListP1() : dComIfGd_getXluList(); + buffer->setZMtx(*calc_mtx); + buffer->entryZSort(&mPacket); + return true; } static actor_method_class l_daGrid_Method = { diff --git a/src/d/actor/d_a_ship.cpp b/src/d/actor/d_a_ship.cpp index 1d9dafd39..876c99caf 100644 --- a/src/d/actor/d_a_ship.cpp +++ b/src/d/actor/d_a_ship.cpp @@ -4067,7 +4067,7 @@ BOOL daShip_c::execute() { mpGrid->scale.y = spD8.abs() / 365.0f; cMtx_multVecSR(model1->getAnmMtx(FN_BODY_JNT_J_FN_SAIL2_e), &XZ_top_offset, &spD8); - grid->m2200 = 1.0f - (spD8.abs() / 265.0f); // No idea why this is generating an extra lwz instruction for loading mpGrid when the instructions above don't + grid->field_0x2200 = 1.0f - (spD8.abs() / 265.0f); // No idea why this is generating an extra lwz instruction for loading mpGrid when the instructions above don't if (mTornadoActor) { mpGrid->force_calc_wind_rel_angle(DEMO_SELECT(REG4_S(5), 0x3000));