1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-06 06:10:21 +00:00

ovl_Magic_Dark (#495)

* merge upstream

* Merge upstream

* Small formatting

* Data section

* MagicDark_Draw

* Gross match of func_80B874E4

* Add func_8005A9CC to functions.h

* Work on func_80B87A18

* func_80B8772C

* Remove comment

* Work on func_80B87A18

* Correct fp constant

* Add regalloc comment ;(

* Move negatives to numbers

* Stupid casts >:(

* Use this->actor when possible

* It's so close

* Use cast + 0xFF

* func_80B87A18

* Delete asm and replace globalCtx2

* Update spec

* static everything

* Name scale

* Use decimal for alpha

* Name some stuff

* Delete reloc

* Name orbOffset

* Name some functions

* Make unused data colors (because it probably is)

* Change >= to >

* Use clamps

* Name MagicDark_DimLighting

* Name gfx

* Rename prototype params

* Cleanup

* Funny cast

Co-authored-by: Ethan Roseman <ethteck@gmail.com>
This commit is contained in:
Sirius902 2020-12-01 18:36:39 -08:00 committed by GitHub
parent 1bb13b8c70
commit 09fe32e198
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 328 additions and 858 deletions

View file

@ -12,14 +12,13 @@
void MagicDark_Init(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_Destroy(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_Update(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_Draw(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_OrbUpdate(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_OrbDraw(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_DiamondUpdate(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_DiamondDraw(Actor* thisx, GlobalContext* globalCtx);
void func_80B874E4(Actor* thisx, GlobalContext* globalCtx);
void func_80B8772C(GlobalContext* globalCtx, f32 a1);
void func_80B87A18(Actor* thisx, GlobalContext* globalCtx);
void MagicDark_DimLighting(GlobalContext* globalCtx, f32 intensity);
/*
const ActorInit Magic_Dark_InitVars = {
ACTOR_MAGIC_DARK,
ACTORTYPE_ITEMACTION,
@ -28,19 +27,23 @@ const ActorInit Magic_Dark_InitVars = {
sizeof(MagicDark),
(ActorFunc)MagicDark_Init,
(ActorFunc)MagicDark_Destroy,
(ActorFunc)MagicDark_Update,
(ActorFunc)MagicDark_Draw,
(ActorFunc)MagicDark_OrbUpdate,
(ActorFunc)MagicDark_OrbDraw,
};
*/
#include "z_magic_dark_gfx.c"
// unused
static Color_RGBA8 D_80B88B10[] = { { 50, 100, 150, 200 }, { 255, 200, 150, 100 } };
void MagicDark_Init(Actor* thisx, GlobalContext* globalCtx) {
MagicDark* this = THIS;
Player* player = PLAYER;
if (LINK_IS_CHILD) {
this->unk_15C = 0.4f;
this->scale = 0.4f;
} else {
this->unk_15C = 0.6f;
this->scale = 0.6f;
}
thisx->posRot.pos = player->actor.posRot.pos;
@ -48,14 +51,14 @@ void MagicDark_Init(Actor* thisx, GlobalContext* globalCtx) {
thisx->room = -1;
if (gSaveContext.nayrusLoveTimer != 0) {
thisx->update = func_80B874E4;
thisx->draw = func_80B87A18;
thisx->scale.x = thisx->scale.z = this->unk_15C * 1.6f;
thisx->scale.y = this->unk_15C * 0.8f;
this->unk_14C = 0;
this->unk_14E = 0;
thisx->update = MagicDark_DiamondUpdate;
thisx->draw = MagicDark_DiamondDraw;
thisx->scale.x = thisx->scale.z = this->scale * 1.6f;
thisx->scale.y = this->scale * 0.8f;
this->timer = 0;
this->primAlpha = 0;
} else {
this->unk_14C = 0;
this->timer = 0;
gSaveContext.nayrusLoveTimer = 0;
}
}
@ -66,37 +69,212 @@ void MagicDark_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Magic_Dark/func_80B874E4.s")
void MagicDark_DiamondUpdate(Actor* thisx, GlobalContext* globalCtx) {
MagicDark* this = THIS;
u8 phi_a0;
Player* player = PLAYER;
s16 pad;
s16 nayrusLoveTimer = gSaveContext.nayrusLoveTimer;
s32 msgMode = globalCtx->msgCtx.msgMode;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Magic_Dark/func_80B8772C.s")
if (1) {}
void MagicDark_Update(Actor* thisx, GlobalContext* globalCtx) {
if ((msgMode == 0xD) || (msgMode == 0x11)) {
Actor_Kill(thisx);
return;
}
if (nayrusLoveTimer >= 1200) {
player->invincibilityTimer = 0;
gSaveContext.nayrusLoveTimer = 0;
Actor_Kill(thisx);
return;
}
player->invincibilityTimer = -100;
thisx->scale.x = thisx->scale.z = this->scale;
if (this->timer < 20) {
thisx->scale.x = thisx->scale.z = (1.6f - (this->timer * 0.03f)) * this->scale;
thisx->scale.y = ((this->timer * 0.01f) + 0.8f) * this->scale;
} else {
thisx->scale.x = thisx->scale.z = this->scale;
thisx->scale.y = this->scale;
}
thisx->scale.x *= 1.3f;
thisx->scale.z *= 1.3f;
phi_a0 = (this->timer < 20) ? (this->timer * 12) : 255;
if (nayrusLoveTimer >= 1180) {
this->primAlpha = 15595 - (nayrusLoveTimer * 13);
if (nayrusLoveTimer & 1) {
this->primAlpha = (u8)(this->primAlpha >> 1);
}
} else if (nayrusLoveTimer >= 1100) {
this->primAlpha = (u8)(nayrusLoveTimer << 7) + 127;
} else {
this->primAlpha = 255;
}
if (this->primAlpha > phi_a0) {
this->primAlpha = phi_a0;
}
thisx->posRot.rot.y += 0x3E8;
thisx->shape.rot.y = thisx->posRot.rot.y + func_8005A9F4(ACTIVE_CAM);
this->timer++;
gSaveContext.nayrusLoveTimer = nayrusLoveTimer + 1;
if (nayrusLoveTimer < 1100) {
func_8002F974(thisx, NA_SE_PL_MAGIC_SOUL_NORMAL - SFX_FLAG);
} else {
func_8002F974(thisx, NA_SE_PL_MAGIC_SOUL_FLASH - SFX_FLAG);
}
}
void MagicDark_DimLighting(GlobalContext* globalCtx, f32 intensity) {
s32 i;
f32 temp_f0;
f32 phi_f0;
if (globalCtx->roomCtx.curRoom.unk_03 != 5) {
intensity = CLAMP_MIN(intensity, 0.0f);
intensity = CLAMP_MAX(intensity, 1.0f);
phi_f0 = intensity - 0.2f;
if (intensity < 0.2f) {
phi_f0 = 0.0f;
}
globalCtx->envCtx.unk_9E = (850.0f - globalCtx->envCtx.unk_D2) * phi_f0;
if (intensity == 0.0f) {
for (i = 0; i < ARRAY_COUNT(globalCtx->envCtx.unk_8C[2]); i++) {
globalCtx->envCtx.unk_8C[2][i] = 0;
}
} else {
temp_f0 = intensity * 5.0f;
if (temp_f0 > 1.0f) {
temp_f0 = 1.0f;
}
for (i = 0; i < ARRAY_COUNT(globalCtx->envCtx.unk_8C[2]); i++) {
globalCtx->envCtx.unk_8C[2][i] = -(s16)(globalCtx->envCtx.unk_CF[i] * temp_f0);
}
}
}
}
void MagicDark_OrbUpdate(Actor* thisx, GlobalContext* globalCtx) {
MagicDark* this = THIS;
s32 pad;
Player* player = PLAYER;
func_8002F974(&this->actor, NA_SE_PL_MAGIC_SOUL_BALL - SFX_FLAG);
if (this->unk_14C < 35) {
func_80B8772C(globalCtx, this->unk_14C * (1 / 45.0f));
Math_SmoothScaleMaxMinF(&thisx->scale.x, this->unk_15C * (1 / 12.000001f), 0.05f, 0.01f, 0.0001f);
if (this->timer < 35) {
MagicDark_DimLighting(globalCtx, this->timer * (1 / 45.0f));
Math_SmoothScaleMaxMinF(&thisx->scale.x, this->scale * (1 / 12.000001f), 0.05f, 0.01f, 0.0001f);
Actor_SetScale(&this->actor, thisx->scale.x);
} else if (this->unk_14C < 55) {
} else if (this->timer < 55) {
Actor_SetScale(&this->actor, thisx->scale.x * 0.9f);
Math_SmoothScaleMaxMinF(&this->unk_154, player->bodyPartsPos[0].y, 0.5f, 3.0f, 1.0f);
if (this->unk_14C >= 49) {
func_80B8772C(globalCtx, (54 - this->unk_14C) * 0.2f);
Math_SmoothScaleMaxMinF(&this->orbOffset.y, player->bodyPartsPos[0].y, 0.5f, 3.0f, 1.0f);
if (this->timer > 48) {
MagicDark_DimLighting(globalCtx, (54 - this->timer) * 0.2f);
}
} else {
thisx->update = func_80B874E4;
thisx->draw = func_80B87A18;
thisx->scale.x = thisx->scale.z = this->unk_15C * 1.6f;
thisx->scale.y = this->unk_15C * 0.8f;
this->unk_14C = 0;
this->unk_14E = 0;
thisx->update = MagicDark_DiamondUpdate;
thisx->draw = MagicDark_DiamondDraw;
thisx->scale.x = thisx->scale.z = this->scale * 1.6f;
thisx->scale.y = this->scale * 0.8f;
this->timer = 0;
this->primAlpha = 0;
}
this->unk_14C += 1;
this->timer++;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Magic_Dark/func_80B87A18.s")
void MagicDark_DiamondDraw(Actor* thisx, GlobalContext* globalCtx) {
MagicDark* this = THIS;
s32 pad;
u16 gameplayFrames = globalCtx->gameplayFrames;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Magic_Dark/MagicDark_Draw.s")
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_magic_dark.c", 525);
func_80093D84(globalCtx->state.gfxCtx);
{
Player* player = PLAYER;
f32 heightDiff;
this->actor.posRot.pos.x = player->bodyPartsPos[0].x;
this->actor.posRot.pos.z = player->bodyPartsPos[0].z;
heightDiff = player->bodyPartsPos[0].y - this->actor.posRot.pos.y;
if (heightDiff < -2.0f) {
this->actor.posRot.pos.y = player->bodyPartsPos[0].y + 2.0f;
} else if (heightDiff > 2.0f) {
this->actor.posRot.pos.y = player->bodyPartsPos[0].y - 2.0f;
}
Matrix_Translate(this->actor.posRot.pos.x, this->actor.posRot.pos.y, this->actor.posRot.pos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
Matrix_RotateY(this->actor.shape.rot.y * (M_PI / 0x8000), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_magic_dark.c", 553),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 170, 255, 255, (s32)(this->primAlpha * 0.6f) & 0xFF);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, 128);
gSPDisplayList(POLY_XLU_DISP++, sDiamondTextureDList);
gSPDisplayList(POLY_XLU_DISP++,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, gameplayFrames * 2, gameplayFrames * -4, 32, 32, 1,
0, gameplayFrames * -16, 64, 32));
gSPDisplayList(POLY_XLU_DISP++, sDiamondVertsDList);
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_magic_dark.c", 570);
}
void MagicDark_OrbDraw(Actor* thisx, GlobalContext* globalCtx) {
MagicDark* this = THIS;
Vec3f pos;
Player* player = PLAYER;
s32 pad;
f32 sp6C = globalCtx->state.frames & 0x1F;
if (this->timer < 32) {
pos.x = (player->bodyPartsPos[12].x + player->bodyPartsPos[15].x) * 0.5f;
pos.y = (player->bodyPartsPos[12].y + player->bodyPartsPos[15].y) * 0.5f;
pos.z = (player->bodyPartsPos[12].z + player->bodyPartsPos[15].z) * 0.5f;
if (this->timer > 20) {
pos.y += (this->timer - 20) * 1.4f;
}
this->orbOffset = pos;
} else if (this->timer < 130) {
pos = this->orbOffset;
} else {
return;
}
pos.x -=
(this->actor.scale.x * 300.0f * Math_Sins(func_8005A9F4(ACTIVE_CAM)) * Math_Coss(func_8005A9CC(ACTIVE_CAM)));
pos.y -= (this->actor.scale.x * 300.0f * Math_Sins(func_8005A9CC(ACTIVE_CAM)));
pos.z -=
(this->actor.scale.x * 300.0f * Math_Coss(func_8005A9F4(ACTIVE_CAM)) * Math_Coss(func_8005A9CC(ACTIVE_CAM)));
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_magic_dark.c", 619);
func_80093D84(globalCtx->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 170, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 150, 255, 255);
Matrix_Translate(pos.x, pos.y, pos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
Matrix_Mult(&globalCtx->mf_11DA0, MTXMODE_APPLY);
Matrix_Push();
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_magic_dark.c", 632),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
Matrix_RotateZ(sp6C * (M_PI / 32), MTXMODE_APPLY);
gSPDisplayList(POLY_XLU_DISP++, D_04010130);
Matrix_Pull();
Matrix_RotateZ(-sp6C * (M_PI / 32), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_magic_dark.c", 639),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_04010130);
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_magic_dark.c", 643);
}

View file

@ -8,12 +8,10 @@ struct MagicDark;
typedef struct MagicDark {
/* 0x0000 */ Actor actor;
/* 0x014C */ s16 unk_14C;
/* 0x014E */ u8 unk_14E;
/* 0x014F */ char unk_14F[0x5];
/* 0x0154 */ f32 unk_154;
/* 0x0158 */ char unk_158[0x4];
/* 0x015C */ f32 unk_15C;
/* 0x014C */ s16 timer;
/* 0x014E */ u8 primAlpha;
/* 0x0150 */ Vec3f orbOffset;
/* 0x015C */ f32 scale;
/* 0x0160 */ char unk_160[0x4];
} MagicDark; // size = 0x0164

View file

@ -0,0 +1,99 @@
#include "z_magic_dark.h"
extern UNK_TYPE D_04032490[];
static UNK_TYPE sDiamondTexture[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000001, 0x00000000, 0x00000102, 0x01000001, 0x00000000, 0x00000000, 0x00010000, 0x00000000,
0x00000001, 0x00000000, 0x00000204, 0x02000101, 0x00000000, 0x00000000, 0x00010101, 0x00000001, 0x00000001,
0x00000000, 0x00000307, 0x03010102, 0x00000000, 0x00000000, 0x01010102, 0x00000002, 0x01010001, 0x00000000,
0x00010509, 0x04010103, 0x01000000, 0x00000000, 0x01020202, 0x00000104, 0x03020101, 0x00000000, 0x0001060C,
0x06010103, 0x01000000, 0x00000000, 0x02020202, 0x00000206, 0x05040101, 0x00000000, 0x0001080F, 0x07010103,
0x01000001, 0x00000000, 0x03030202, 0x00010408, 0x07060201, 0x00000000, 0x00010911, 0x08010103, 0x01000001,
0x00000001, 0x04040303, 0x0101050B, 0x0A080301, 0x00000000, 0x00020B14, 0x0A010103, 0x01000001, 0x00010102,
0x06060403, 0x0203070D, 0x0C0A0401, 0x00000000, 0x00030D17, 0x0B020103, 0x01010001, 0x00010205, 0x09080503,
0x0205090E, 0x0E0D0501, 0x00000000, 0x01050F18, 0x0C020102, 0x01010001, 0x00010408, 0x0D0B0502, 0x03070B0F,
0x0F0F0601, 0x00000000, 0x02081219, 0x0D030102, 0x00010001, 0x0001050B, 0x130F0702, 0x04080B0F, 0x10110801,
0x00000000, 0x030C1419, 0x0E040101, 0x00010001, 0x0001070F, 0x19140A03, 0x05090B0E, 0x10130A02, 0x00000001,
0x05121719, 0x0E040100, 0x00010102, 0x01020A13, 0x1F1A0F06, 0x06090A0C, 0x10150B03, 0x01000001, 0x08181B19,
0x0F050201, 0x01020102, 0x02040D18, 0x2721140A, 0x080A0A0C, 0x11160D04, 0x02020001, 0x0B1E1E19, 0x10070403,
0x02030202, 0x0408111D, 0x2F2A1B0F, 0x0A0B0B0D, 0x12180F06, 0x04040101, 0x0E242119, 0x11090606, 0x04040304,
0x070C1623, 0x38322214, 0x0E0D0E10, 0x141A1108, 0x06060102, 0x112A241A, 0x120B0909, 0x06050507, 0x0B111C29,
0x413B291B, 0x13101216, 0x181B1209, 0x08080304, 0x152F271B, 0x140E0C0C, 0x0907080B, 0x10172230, 0x4A433223,
0x1813161D, 0x1D1E140B, 0x0A0A0608, 0x1A342B1E, 0x17110F0F, 0x0C0B0D11, 0x171F2A38, 0x534C3B2B, 0x1E161C25,
0x2221160D, 0x0B0C0A0E, 0x21393023, 0x1B151211, 0x0F0F1217, 0x1E273240, 0x5C564534, 0x251B242F, 0x2924190F,
0x0E0E0F17, 0x293E372B, 0x21181513, 0x1113181E, 0x26303B48, 0x655F4E3E, 0x2D222D3A, 0x30271C13, 0x11111520,
0x32453F35, 0x281D1714, 0x14181E25, 0x2F3A4551, 0x6F695746, 0x362B3744, 0x372A1F17, 0x15151D2A, 0x3D4D483F,
0x31231A14, 0x171E252E, 0x38444F5B, 0x7974614F, 0x4036404C, 0x3C2D231D, 0x1A1A2637, 0x4957524A, 0x3A2A1D15,
0x1A252E37, 0x43505B66, 0x837F6C59, 0x4A414750, 0x3F2E2723, 0x21213245, 0x57625D54, 0x43312216, 0x1F2D3741,
0x4D5B6671, 0x8E8B7662, 0x544B4D51, 0x3F302C2C, 0x2B2D4054, 0x656D675E, 0x4C3A281A, 0x2536414B, 0x5867717B,
0x9896816C, 0x5E545150, 0x3F323337, 0x383C5063, 0x71777168, 0x56432F21, 0x2C3F4B56, 0x63727C86, 0xA2A08B76,
0x685D5651, 0x3F343A43, 0x484D5F70, 0x7D827B71, 0x5F4C3829, 0x34465462, 0x6F7C8690, 0xACA99581, 0x72655B53,
0x42394450, 0x585E6D7C, 0x878C8479, 0x68574334, 0x3D4E5E6E, 0x7B88919A, 0xB4B09E8C, 0x7C6E6155, 0x46414F5F,
0x676E7B87, 0x92958C80, 0x71625041, 0x4857697A, 0x86929BA3, 0xBBB7A796, 0x86776658, 0x4D4B5C6E, 0x777D8791,
0x9C9F9487, 0x7A6D5C4F, 0x54617486, 0x919CA4AB, 0xC2BBAFA1, 0x907F6C5D, 0x55576A7E, 0x8589929A, 0xA5A99D90,
0x8478695E, 0x5F697F93, 0x9DA6ACB2, 0xC8BFB6AC, 0x9A877465, 0x6064788D, 0x92949BA1, 0xADB2A89C, 0x8F83766C,
0x6A718AA1, 0xA9AFB2B8, 0xCEC3BDB6, 0xA4907E70, 0x6C72879B, 0x9C9CA2A8, 0xB5BBB3A9, 0x9B8E8279, 0x737693AE,
0xB4B6B9BE, 0xD5C9C5BF, 0xAF9C8B7E, 0x7A8094A5, 0xA4A0A7B0, 0xBDC5C0B7, 0xA8998E85, 0x7B7B9AB7, 0xBDBEC0C5,
0xDBCFCCC8, 0xBAA9998E, 0x898E9FAD, 0xA8A1ACB8, 0xC6CECCC5, 0xB6A4988F, 0x8381A0BE, 0xC4C6C8CD, 0xE0D4D3D1,
0xC5B7A89D, 0x989CA8B3, 0xABA2B0C0, 0xCED8D8D2, 0xC2AEA298, 0x8C89A6C3, 0xCACED1D5, 0xE5DBDAD8, 0xD0C4B6AB,
0xA6A8B1B8, 0xAEA4B5C7, 0xD6E0E3DE, 0xCDB7ABA2, 0x9590ACC9, 0xD0D5D9DC, 0xEBE1E0DE, 0xDAD1C4B9, 0xB2B2B8BC,
0xB1A7B9CE, 0xDEE8ECE8, 0xD6BDB3AC, 0x9E98B3CE, 0xD6DBE0E3, 0xF0E9E6E3, 0xE3DDD2C6, 0xBCBABEC0, 0xB4AABED5,
0xE5EFF3F0, 0xDDC2BBB6, 0xA79FB9D4, 0xDCE2E7E9, 0xF5F0ECE7, 0xEAE8DED2, 0xC6C1C2C3, 0xB7ADC4DD, 0xEBF3F8F5,
0xE1C6C2C1, 0xB1A7BFD8, 0xE1E7EDF0, 0xF9F5F1EB, 0xF0F0E9DD, 0xCFC7C7C6, 0xBBB1CBE5, 0xF0F5FBF7, 0xE3CACACC,
0xBBB0C5DC, 0xE5ECF4F6, 0xFCF9F5EE, 0xF5F7F0E7, 0xD7CDCCCB, 0xBFB7D2EB, 0xF4F7FBF6, 0xE4CDD2D6, 0xC6B9CBE0,
0xE9F1F9FB, 0xFDFCF8F2, 0xF9FAF6EE, 0xDFD5D3D0, 0xC5BDD9F0, 0xF7F9FBF4, 0xE5D0D9E0, 0xD1C2D2E4, 0xEDF5FCFE,
0xFEFDFAF4, 0xFBFCF9F3, 0xE6DDDAD7, 0xCBC3DEF4, 0xFAFBFCF3, 0xE5D3DEE8, 0xDBCDDAE9, 0xF2F8FEFF, 0xFEFDFCF6,
0xFCFDFCF7, 0xECE4E2DF, 0xD2C9E3F7, 0xFCFDFBF3, 0xE5D6E4EF, 0xE3D6E1EE, 0xF6FAFEFF, 0xFEFDFDF8, 0xFCFDFDFA,
0xF1EAE9E7, 0xD9CFE7F9, 0xFEFEFBF3, 0xE7DBE9F4, 0xEBDFE8F3, 0xF9FCFFFF, 0xFEFDFDFA, 0xFDFDFEFC, 0xF5EFEFEE,
0xE0D5ECFB, 0xFFFEFBF3, 0xE9E1EEF8, 0xF0E6EEF6, 0xFCFDFFFF, 0xFEFDFEFC, 0xFEFDFEFE, 0xF8F4F4F3, 0xE7DDF1FD,
0xFFFEFBF3, 0xECE7F3FC, 0xF5ECF2F9, 0xFDFEFFFF, 0xFEFDFFFE, 0xFFFDFEFE, 0xFAF7F8F7, 0xEDE5F5FE, 0xFFFEFBF5,
0xF0EDF7FD, 0xF9F1F5FA, 0xFEFFFFFF, 0xFEFDFFFF, 0xFFFEFEFF, 0xFCFAFAFA, 0xF2ECF8FE, 0xFFFEFCF7, 0xF4F3FAFE,
0xFBF6F8FB, 0xFEFFFFFF, 0xFEFDFFFF, 0xFFFEFEFF, 0xFDFCFCFC, 0xF7F2FBFF, 0xFFFEFCFA, 0xF8F7FCFF, 0xFEFAFBFC,
0xFFFFFFFF, 0xFEFEFFFF, 0xFFFFFFFF, 0xFEFDFEFD, 0xFAF7FCFF, 0xFFFEFDFC, 0xFCFBFDFF, 0xFFFDFDFD, 0xFFFFFFFF,
0xFFFEFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFCFAFDFF, 0xFFFEFEFE, 0xFEFDFEFF, 0xFFFFFEFD, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFDFCFEFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFEFEFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
};
static Vtx sDiamondVerts[] = {
VTX(0, 0, 64, 1024, 512, 0x00, 0x00, 0x78, 0xFF), VTX(55, 0, 32, 1707, 512, 0x67, 0x00, 0x3C, 0xFF),
VTX(0, 108, 0, 1365, 0, 0x00, 0x78, 0x00, 0xFF), VTX(55, 0, -32, 2389, 512, 0x67, 0x00, 0xC4, 0xFF),
VTX(0, 108, 0, 2048, 0, 0x00, 0x78, 0x00, 0xFF), VTX(0, 0, -64, 3072, 512, 0x00, 0x00, 0x88, 0xFF),
VTX(0, 108, 0, 2731, 0, 0x00, 0x78, 0x00, 0xFF), VTX(-55, 0, -32, 3755, 512, 0x99, 0x00, 0xC4, 0xFF),
VTX(0, 108, 0, 3413, 0, 0x00, 0x78, 0x00, 0xFF), VTX(-55, 0, 32, 4437, 512, 0x98, 0x00, 0x3C, 0xFF),
VTX(0, 108, 0, 4096, 0, 0x00, 0x78, 0x00, 0xFF), VTX(-55, 0, 32, 341, 512, 0x98, 0x00, 0x3C, 0xFF),
VTX(0, 108, 0, 683, 0, 0x00, 0x78, 0x00, 0xFF), VTX(0, -108, 0, 683, 1024, 0x00, 0x88, 0x00, 0xFF),
VTX(0, -108, 0, 3413, 1024, 0x00, 0x88, 0x00, 0xFF), VTX(0, -108, 0, 2731, 1024, 0x00, 0x88, 0x00, 0xFF),
VTX(0, -108, 0, 2048, 1024, 0x00, 0x88, 0x00, 0xFF), VTX(0, -108, 0, 1365, 1024, 0x00, 0x88, 0x00, 0xFF),
VTX(-55, 0, 32, 2389, 512, 0x98, 0x00, 0x3C, 0xFF), VTX(-55, 0, -32, 1707, 512, 0x99, 0x00, 0xC4, 0xFF),
};
static Gfx sDiamondTextureDList[] = {
gsDPPipeSync(),
gsDPSetTextureLUT(G_TT_NONE),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
gsDPLoadTextureBlock(D_04032490, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, 1),
gsDPLoadMultiBlock(sDiamondTexture, 0x0100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 64, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_MIRROR | G_TX_WRAP, 5, 6, 13, 13),
gsDPSetCombineLERP(TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0),
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_SURF2),
gsSPClearGeometryMode(G_FOG | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR),
gsSPSetGeometryMode(G_CULL_BACK | G_LIGHTING),
gsSPEndDisplayList(),
};
static Gfx sDiamondVertsDList[] = {
gsSPVertex(sDiamondVerts, 20, 0), gsSP2Triangles(0, 1, 2, 0, 1, 3, 4, 0),
gsSP2Triangles(3, 5, 6, 0, 5, 7, 8, 0), gsSP2Triangles(7, 9, 10, 0, 11, 0, 12, 0),
gsSP2Triangles(13, 0, 11, 0, 14, 7, 5, 0), gsSP2Triangles(15, 5, 3, 0, 16, 3, 1, 0),
gsSP2Triangles(17, 1, 0, 0, 16, 18, 19, 0), gsSPEndDisplayList(),
};