308 lines
12 KiB
C
308 lines
12 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
extern f32 func_802FB0E4(struct8s *);
|
|
|
|
/* .data */
|
|
u16 D_8036A070[0xD][0x10] = {
|
|
{0x0000, 0xF33D, 0x1085, 0xB167, 0xF439, 0x9963, 0xF233, 0x6117, 0xDA6F, 0xF2B7, 0xDC33, 0xFD3D, 0x38CF, 0xC9EB, 0x819F, 0xD32D},
|
|
{0x0000, 0xF2FD, 0x30CD, 0xC9EB, 0xF4BB, 0xA1A5, 0x8261, 0xF277, 0xDB31, 0xDCB3, 0xA267, 0x6319, 0xF379, 0xF231, 0xC26F, 0xDA2D},
|
|
{0x0000, 0xF2FB, 0x0847, 0xA163, 0xCB2F, 0x521F, 0xF479, 0xFFFF, 0xD1ED, 0x5115, 0xADEF, 0x7BA1, 0x3AA1, 0xF273, 0x6BF1, 0xD433},
|
|
{0x0000, 0xE22F, 0xB9A7, 0x108B, 0xF47B, 0xACEB, 0x4A61, 0xC739, 0xF2B9, 0x891F, 0x0263, 0x84AB, 0xCC31, 0xB2EB, 0x314D, 0x0915},
|
|
{0x0000, 0xDA2F, 0xB1A5, 0x088D, 0xD3F3, 0x8C65, 0xCF39, 0x1A63, 0x80DD, 0xF2B9, 0x5257, 0xFCBB, 0x38D7, 0xA5B5, 0x6BA9, 0xF273},
|
|
{0x0000, 0xE22F, 0xB1A7, 0x08CF, 0xE3B5, 0xBC6F, 0x6A61, 0xC6B7, 0xF2B9, 0x88DD, 0x09DF, 0x3AA7, 0x8C67, 0xF4BB, 0x5295, 0x40D5},
|
|
{0x0000, 0xE22F, 0xC1E9, 0x088D, 0xD3B1, 0xBDF1, 0x8C27, 0xF2B9, 0x9161, 0xF4B9, 0x6DB7, 0x099D, 0x4151, 0x436D, 0x6A23, 0x739D},
|
|
{0x0000, 0xF2B9, 0x5259, 0xAA29, 0x108D, 0xF439, 0x7BA5, 0xBDF1, 0xEA2F, 0x33AF, 0x9121, 0x963B, 0x119B, 0xCBEF, 0xBAF1, 0xD1EB},
|
|
{0x0000, 0xF275, 0x0849, 0xA165, 0xF479, 0x521B, 0xA52F, 0xCEF9, 0x19E1, 0xD9ED, 0x4BED, 0xC32F, 0x73A3, 0x2951, 0xF2FB, 0xDBF3},
|
|
{0x0000, 0xEA33, 0xA1A5, 0x1917, 0xB56D, 0x429D, 0xF2FB, 0xECB9, 0x0847, 0xCB6F, 0x22B1, 0x6159, 0x7CAD, 0xD1ED, 0x39D1, 0x73A3},
|
|
{0x0000, 0xF2FB, 0xB1A5, 0x4995, 0xCBAF, 0x9CE7, 0x1049, 0xD9EF, 0xC5F3, 0x095B, 0xF439, 0xA337, 0x4AE1, 0xA2E9, 0xF273, 0x64AD},
|
|
{0x0000, 0xF2B9, 0x6159, 0xC9EB, 0xCB2F, 0xF47B, 0xA9A5, 0xF273, 0x92E5, 0x20C9, 0xDBF1, 0xF2FD, 0x39CF, 0xE22F, 0x9961, 0xBAEB},
|
|
{0x0000, 0xF2BB, 0xC9EB, 0x6959, 0xC32D, 0xEA31, 0x314D, 0xF3FB, 0x5AD7, 0xA965, 0xF53B, 0xF277, 0x911F, 0xD431, 0xE2F3, 0xFB3F}
|
|
};
|
|
|
|
enum asset_e D_8036A210[5] = {0x7DF, 0x7DF, 0x7DF, 0x7DF, 0x7DF};
|
|
|
|
Gfx D_8036A228[] =
|
|
{
|
|
gsDPPipeSync(),
|
|
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
|
|
gsSPSetGeometryMode(G_SHADE | G_TEXTURE_GEN_LINEAR | G_SHADING_SMOOTH),
|
|
gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),
|
|
gsDPSetCycleType(G_CYC_1CYCLE),
|
|
gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2),
|
|
gsSPEndDisplayList(),
|
|
};
|
|
|
|
/* .bss */
|
|
u16 D_80381620[0xD][5][0x10];
|
|
BKSprite *D_80381E40[5];
|
|
f32 D_80381E54;
|
|
u8 D_80381E58[5];
|
|
f32 D_80381E60[5];
|
|
f32 D_80381E78[5];
|
|
struct7s D_80381E90;
|
|
|
|
|
|
/* .code */
|
|
#ifndef nonmatching
|
|
#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_78100/func_802FF090.s")
|
|
#else
|
|
struct7s *func_802FF090(s32 arg0) {
|
|
f32 *var_s6;
|
|
f64 temp_f20;
|
|
f64 temp_f22;
|
|
f64 temp_f28;
|
|
s32 temp_t6;
|
|
s32 temp_t8;
|
|
s32 green;
|
|
s32 blue;
|
|
s32 red;
|
|
s32 alpha;
|
|
s32 tmp_blue;
|
|
s32 tmp_green;
|
|
s32 tmp_red;
|
|
s32 tmp_alpha;
|
|
s32 var_t2;
|
|
s8 *var_s5;
|
|
u16 *var_ra;
|
|
u16 *var_t3;
|
|
u16 rgba;
|
|
u32 jinjo_id;
|
|
void *var_s3;
|
|
void *var_t4;
|
|
s32 i;
|
|
|
|
D_80381E54 = 1.0f;
|
|
for(jinjo_id = 0; jinjo_id < 5; jinjo_id++){
|
|
D_80381E60[jinjo_id] = 0.0f;
|
|
D_80381E58[jinjo_id] = (item_getCount(ITEM_12_JINJOS) & (1 << jinjo_id)) ? 3 : 0;
|
|
for(i = 0; i < 0xD; i++){
|
|
for(var_t2 = 0; var_t2 < 0x10; var_t2++){
|
|
rgba = D_8036A070[i][var_t2];
|
|
red = tmp_red = (rgba >> 0xB) & 0x1F;
|
|
green = tmp_green = (rgba >> 6) & 0x1F;
|
|
blue = tmp_blue = (rgba >> 1) & 0x1F;
|
|
alpha = tmp_alpha = (rgba >> 0) & 0x1;
|
|
if ((red < 0x10) || (green < 0x10) || (blue < 0x10)) {
|
|
switch (jinjo_id) {
|
|
case 3:
|
|
red = tmp_red;
|
|
green = tmp_green;
|
|
blue = tmp_blue;
|
|
alpha = tmp_alpha;
|
|
break;
|
|
|
|
case 0:
|
|
green = tmp_green * 1.5;
|
|
red = tmp_red * 0.25;
|
|
blue = tmp_blue;
|
|
alpha = tmp_alpha;
|
|
break;
|
|
|
|
case 1:
|
|
red = tmp_red * 0.2;
|
|
green = tmp_blue;
|
|
blue = tmp_blue * 0.2;
|
|
alpha = tmp_alpha;
|
|
break;
|
|
|
|
case 2:
|
|
{s32 var_v1;
|
|
red = tmp_red;
|
|
blue = tmp_green * 0.4;
|
|
green = tmp_blue * 0.6;
|
|
alpha = tmp_alpha;
|
|
}
|
|
break;
|
|
case 4:
|
|
red = tmp_red;
|
|
green = tmp_blue;
|
|
blue = tmp_green * 0.4;
|
|
alpha = tmp_alpha;
|
|
break;
|
|
}
|
|
}
|
|
D_80381620[i][jinjo_id][var_t2] = ((red << 0xB) | (green << 6) | (blue << 1) | alpha);
|
|
}
|
|
}
|
|
}
|
|
return &D_80381E90;
|
|
}
|
|
#endif
|
|
|
|
void fxjinjoscore_free(enum item_e item_id, struct8s * arg1){
|
|
s32 i;
|
|
|
|
for(i = 0; i < 5; i++){
|
|
if(D_80381E40[i] != NULL){
|
|
func_8033BD4C(D_80381E40[i]);
|
|
D_80381E40[i] = NULL;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//fxjinjoscore_draw
|
|
void fxjinjoscore_draw(s32 arg0, struct8s *arg1, Gfx **gfx, Mtx **mtx, Vtx **vtx) {
|
|
BKSprite *sprite; // s1
|
|
s32 draw_index; // s5
|
|
s32 texture_width; // sp11C
|
|
s32 texture_height; // sp118
|
|
s32 jinjo_id; // sp114
|
|
f32 center_y; // f14 (sp110)
|
|
f32 center_x; // f20 (sp10C)
|
|
f32 x_offset; // f26 (sp108)
|
|
f32 y_offset; // f28 (sp104)
|
|
f32 pos_x; // f30 (sp100)
|
|
s32 i; // v1 (spFC)
|
|
s32 j; // v0_2 (spF8)
|
|
|
|
gSPDisplayList((*gfx)++, D_8036A228);
|
|
func_8024C7B8(gfx, mtx);
|
|
pos_x = 44.0f;
|
|
// Draw all jinjo heads
|
|
for(jinjo_id = 0; jinjo_id < 5; jinjo_id++){
|
|
s32 jinjo_collected; // spF0 <----
|
|
sprite = D_80381E40[jinjo_id];
|
|
jinjo_collected = (D_80381E58[jinjo_id] != 0) ? 1 : 0;
|
|
if (sprite != NULL) {
|
|
func_80347FC0(gfx, sprite, (s32) D_80381E60[jinjo_id], 0, 0, 0, 0, 2, 2, &texture_width, &texture_height);
|
|
// Load the palette for the corresponding jinjo color
|
|
gDPLoadTLUT_pal16((*gfx)++, 0, D_80381620[(s32)D_80381E60[jinjo_id]][jinjo_id]);
|
|
x_offset = 0.0f;
|
|
y_offset = 0.0f;
|
|
// Draw the jinjo head, once if uncollected and twice if collected
|
|
// If the head is drawn twice then the first draw will be the drop shadow
|
|
for (draw_index = jinjo_collected; draw_index >= 0; draw_index--){
|
|
gDPPipeSync((*gfx)++);
|
|
// Draw 0 is the jinjo's head, anything else is a shadow
|
|
if (draw_index != 0) {
|
|
// Use only primitive color as the color input in order to make a solid color shadow
|
|
gDPSetCombineLERP((*gfx)++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0);
|
|
// Set up a translucent black for primitive color to draw the shadow
|
|
gDPSetPrimColor((*gfx)++, 0, 0, 0x00, 0x00, 0x00, 0x8C);
|
|
} else {
|
|
// Use the texture as the color input
|
|
gDPSetCombineLERP((*gfx)++, 0, 0, 0, TEXEL0, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0, TEXEL0, 0, PRIMITIVE, 0);
|
|
// If the jinjo is collected then it's drawn fully opaque, otherwise it's drawn with partial alpha
|
|
gDPSetPrimColor((*gfx)++, 0, 0, 0x00, 0x00, 0x00, jinjo_collected ? 0xFF : 0x6E);
|
|
}
|
|
center_x = pos_x - (f32) D_80276588 / 2 + x_offset;
|
|
center_y = (f32) D_8027658C / 2 + func_802FB0E4(arg1) - 266.0f + 40.0f + y_offset - D_80381E78[jinjo_id];
|
|
gSPVertex((*gfx)++, *vtx, 4, 0);
|
|
// Set up the positions of the four vertices
|
|
for(i = 0; i < 2; i++){
|
|
for(j = 0; j < 2; j++){
|
|
(*vtx)->v.ob[0] = ((texture_width * D_80381E54 * j) - (texture_width * D_80381E54 / 2) + center_x) * 4;
|
|
(*vtx)->v.ob[1] = ((texture_height * D_80381E54 / 2) - (texture_height * D_80381E54 * i) + center_y) * 4;
|
|
(*vtx)->v.ob[2] = -20;
|
|
(*vtx)->v.tc[0] = ((texture_width - 1) * j) << 6;
|
|
(*vtx)->v.tc[1] = ((texture_height - 1) * i) << 6;
|
|
(*vtx)++;
|
|
}
|
|
}
|
|
// Draw a quad made of the four vertices
|
|
gSP1Quadrangle((*gfx)++, 0, 1, 3, 2, 0);
|
|
x_offset += -2;
|
|
y_offset += 2;
|
|
}
|
|
}
|
|
// Move the next jinjo head over by 32 pixels
|
|
pos_x += 32.0f;
|
|
}
|
|
gDPPipeSync((*gfx)++);
|
|
gDPSetTextureLUT((*gfx)++, G_TT_NONE);
|
|
gDPPipelineMode((*gfx)++, G_PM_NPRIMITIVE);
|
|
func_8024C904(gfx, mtx);
|
|
}
|
|
|
|
bool func_802FFA10(f32 arg0, s32 arg1, s32 arg2){
|
|
if(arg1 == 0){
|
|
return TRUE;
|
|
}
|
|
|
|
return (D_80381E78[arg1 - 1] < arg0);
|
|
}
|
|
|
|
void fxjinjoscore_update(enum item_e item_id, struct8s *arg1) {
|
|
f32 var_f24;
|
|
s32 temp_s3;
|
|
s32 jinjo_id;
|
|
s32 sp78;
|
|
|
|
var_f24 = time_getDelta();
|
|
temp_s3 = func_802FB0D4(arg1);
|
|
sp78 = item_getCount(item_id);
|
|
switch(temp_s3){
|
|
case 1:
|
|
for(jinjo_id = 0; jinjo_id < 5; jinjo_id++){
|
|
if (D_80381E40[jinjo_id] == NULL) {
|
|
D_80381E40[jinjo_id] = assetcache_get(D_8036A210[jinjo_id]);
|
|
D_80381E78[jinjo_id] = 64.0f;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 0:
|
|
fxjinjoscore_free(item_id, arg1);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (temp_s3 != 0) {
|
|
for(jinjo_id = 0; jinjo_id < 5; jinjo_id++){
|
|
switch (D_80381E58[jinjo_id]) {
|
|
case 0:
|
|
if (((1 << jinjo_id) & sp78) && (temp_s3 == 2) && (D_80381E78[jinjo_id] < 1.0f)) {
|
|
D_80381E58[jinjo_id] = 2;
|
|
func_8030E560(SFX_3EE, 26000);
|
|
}
|
|
break;
|
|
case 2:
|
|
D_80381E60[jinjo_id] += var_f24 * 15.0;
|
|
if ((s32) D_80381E60[jinjo_id] >= 9) {
|
|
D_80381E60[jinjo_id] = 9.0f;
|
|
D_80381E58[jinjo_id] = 3;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (0.95 < randf2(0.0f, 1.0f)) {
|
|
D_80381E58[jinjo_id] = 4;
|
|
}
|
|
break;
|
|
case 4:
|
|
D_80381E60[jinjo_id] += var_f24 * 30.0;
|
|
if ((s32) D_80381E60[jinjo_id] >= 12) {
|
|
D_80381E58[jinjo_id] = 3;
|
|
D_80381E60[jinjo_id] = 12.0f;
|
|
}
|
|
break;
|
|
case 3:
|
|
D_80381E60[jinjo_id] -= var_f24 * 30.0;
|
|
if ((s32) D_80381E60[jinjo_id] < 10) {
|
|
D_80381E60[jinjo_id] = 9.0f;
|
|
D_80381E58[jinjo_id] = 1;
|
|
}
|
|
break;
|
|
}
|
|
|
|
switch (temp_s3) { /* switch 1; irregular */
|
|
case 3: /* switch 1 */
|
|
break;
|
|
case 1: /* switch 1 */
|
|
case 2: /* switch 1 */
|
|
if (func_802FFA10(15.0f, jinjo_id, 5)) {
|
|
if (D_80381E78[jinjo_id] >= 1.0f) {
|
|
D_80381E78[jinjo_id] *= 0.6;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|