diff --git a/include/structs.h b/include/structs.h index 1b7369a0..9efbcbd5 100644 --- a/include/structs.h +++ b/include/structs.h @@ -894,4 +894,9 @@ typedef struct { u8 pad1B[1]; }Struct83s; +typedef struct{ + s16 texture_type; + s16 count; + s32 offset[]; +}Struct84s; #endif diff --git a/progress/progress_core1.svg b/progress/progress_core1.svg index 106b7921..ee95b1c9 100644 --- a/progress/progress_core1.svg +++ b/progress/progress_core1.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core1 - 70.3700% - 70.3700% + 71.6821% + 71.6821% \ No newline at end of file diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index de510048..433ce22d 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -17,7 +17,7 @@ core2 - 78.4831% - 78.4831% + 78.5048% + 78.5048% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 6b2bf19f..0f36be65 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 82.4464% - 82.4464% + 82.6493% + 82.6493% \ No newline at end of file diff --git a/src/core1/code_9D30.c b/src/core1/code_9D30.c index 0447826b..3d931e7f 100644 --- a/src/core1/code_9D30.c +++ b/src/core1/code_9D30.c @@ -2,13 +2,18 @@ #include "functions.h" #include "variables.h" + +#define IA8_I(ia) ((ia) >> 4) +#define IA8_A(ia) ((ia) & 0xF) +#define I4_2_RGBA16(i,a) ((i << 12) | (i << 7) | (i << 2) | (a)) + void func_8024A3C8(s32 x, s32 y); -void func_8024A840(s32 r, s32 g, s32 b); +void draw_prim_rect(s32 x, s32 y, s32 w, s32 h); +void set_prim_color(s32 r, s32 g, s32 b); void func_8024A85C(s32 buffer_indx); - extern s32 D_80276588; //framebuffer width -extern s16 D_803A5D00[2][0xF660]; //framebuffer +extern u16 D_803A5D00[2][0xF660]; //framebuffer extern s16 D_80275BBC; @@ -118,33 +123,381 @@ s32 func_802485BC(void){ return D_80275BD0; } -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802485C8.s") +void func_802485C8(UNK_TYPE(s32) arg0){ -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802485D0.s") +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248870.s") +//BREAK? +#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_ci4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248B40.s") +#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_ci8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248D40.s") +void draw_sprite_rgba16(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) { + BKSpriteFrame *sprite_ptr; + BKSpriteTextureBlock *chunk_ptr; + s16 *tmem; + u16 *framebuffer_ptr; + s32 fb_x; + s32 fb_y; + s32 i_chunk; + s32 txtr_x; + s32 txtr_y; + u16 *pxl_ptr; + u16 rgba; -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248F9C.s") + framebuffer_ptr = &D_803A5D00[D_802806EC][0]; + sprite_ptr = spriteGetFramePtr(sprite, frame); + if (!alpha_enabled) { + set_prim_color(0, 0, 0x80); + draw_prim_rect(x, y, sprite_ptr->w, sprite_ptr->h); + } + chunk_ptr = (BKSpriteTextureBlock *)(sprite_ptr + 1); + for(i_chunk = 0; i_chunk < sprite_ptr->chunkCnt; i_chunk++) { + for(tmem = (u16 *)(chunk_ptr + 1); (s32)tmem % 8; tmem++); -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80249210.s") + for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) { + for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++) { + fb_x = chunk_ptr->x + x + txtr_x; + if ((fb_x >= 0) && (fb_x < D_80276588)) { + fb_y = chunk_ptr->y + y + txtr_y; + if ((fb_y >= 0) && (fb_y < D_8027658C)) { + pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588); + rgba = *tmem; + if (rgba & 1) { + *pxl_ptr = rgba; + } else if (!alpha_enabled) { + *pxl_ptr = rgba | 1; + } + } + } + tmem++; + } + } + chunk_ptr = (BKSpriteTextureBlock *) tmem; + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80249428.s") +#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_i4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80249644.s") +#ifndef NONMATCHING +#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_ia4.s") +#else +void draw_sprite_ia4(s32 x, s32 y, BKSprite *sprite, s32 frame, bool aplha_enabled) { + BKSpriteFrame *frame_ptr; + BKSpriteTextureBlock *chunk_ptr; + s16 *temp_v0; + u8 *tmem; + s32 fb_x; + s32 fb_y; + s32 p1; + s32 p2; + u16 *framebuffer_ptr; + u32 p1_i; + u32 p1_a; + u32 p2_i; + u32 p2_a; + s32 txtr_y; + s32 i_chunk; + s32 txtr_x; + u16 *fb_pxl_ptr; -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802499BC.s") + framebuffer_ptr = &D_803A5D00[D_802806EC][0]; + frame_ptr = spriteGetFramePtr(sprite, frame); + if (!aplha_enabled) { + set_prim_color(0, 0, 0x80); + draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h); + } + chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1); + for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++) { + for(tmem = (u8*)(chunk_ptr + 1); (s32)tmem % 8; tmem++); + + for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) { + for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x += 2) { + fb_x = chunk_ptr->x + x + txtr_x; + if ((fb_x >= 0) && (fb_x < D_80276588)) { + fb_y = chunk_ptr->y + y + txtr_y; + if ((fb_y >= 0) && (fb_y < D_8027658C)) { + fb_pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588); + p1 = (*tmem >> 4); + p2 = *tmem & 0xF; + p1_i = p1 & 0xE; + p1_a = p1 & 1; + p2_i = p2 & 0xE; + p2_a = p2 & 1; + if (p1_a) { + *fb_pxl_ptr = (p1_i << 0xC) | (p1_i << 7) | (p1_i << 2) | p1_a; + } else if (!aplha_enabled) { + *fb_pxl_ptr = 1; + } + if (p2_a) { + *(fb_pxl_ptr + 1) = (p2_i << 0xC) | (p2_i << 7) | (p2_i << 2) | p2_a; + } else if (!aplha_enabled) { + *(fb_pxl_ptr + 1) = 1; + } + } + } + tmem++; + } + } + chunk_ptr = (BKSpriteTextureBlock *) tmem; + } +} +#endif -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802499D0.s") +void draw_sprite_i8(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) { + BKSpriteFrame *frame_ptr; + BKSpriteTextureBlock *chunk_ptr; + s16 *pixel_ptr; + u8 *txtr_ptr; + s32 fb_y; + u16 *framebuffer_ptr; + s32 intensity; + s32 fb_x; + s32 txtr_x; + s32 i_chunk; + s32 txtr_y; -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802499E4.s") + framebuffer_ptr = &D_803A5D00[D_802806EC][0]; + frame_ptr = spriteGetFramePtr(sprite, frame); + if (!alpha_enabled) { + set_prim_color(0, 0, 0x80); + draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h); + } + chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1); + for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++){ + //align + for(txtr_ptr = (u8*)(chunk_ptr + 1); (s32)txtr_ptr % 8; txtr_ptr++); -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80249CEC.s") + for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++){ + for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++){ + fb_x = chunk_ptr->x + x + txtr_x; + if (fb_x >= 0) { + if (fb_x < D_80276588) { + fb_y = chunk_ptr->y + y + txtr_y; + if ((fb_y >= 0) && (fb_y < D_8027658C)) { + pixel_ptr = framebuffer_ptr + fb_x + fb_y * D_80276588; + intensity = (s32) *txtr_ptr >> 3; + if (intensity != 0) { + *pixel_ptr = (intensity << 0xB) | (intensity << 6) | (intensity << 1) | 1; + } else if (!alpha_enabled) { + *pixel_ptr = 1; + } + } + } + } + txtr_ptr += 1; + } + } + chunk_ptr = (BKSpriteFrame *) txtr_ptr; + } +} + +void draw_sprite_ia8(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) { + BKSpriteFrame *sprite_frame; + BKSpriteTextureBlock *chunk_ptr; + s16 *temp_a1; + s16 *temp_v0; + u8 *var_t2; + u16 *framebuffer_ptr; + s32 fb_x; + s32 fb_y; + s32 var_a3; + s32 i_chunk; + s32 var_t3; + u32 temp_a2; + + framebuffer_ptr = &D_803A5D00[D_802806EC][0]; + sprite_frame = spriteGetFramePtr(sprite, frame); + if (!alpha_enabled) { + //draw blue rect over display area + set_prim_color(0, 0, 0x80); + draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h); + } + chunk_ptr = (BKSpriteTextureBlock *)(sprite_frame + 1); + for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++) { + for(var_t2 = (u8*)(chunk_ptr + 1); (s32)var_t2 % 8; var_t2++);//align + + for(var_t3 = 0; var_t3 < chunk_ptr->h; var_t3++){ + for(var_a3 = 0; var_a3 < chunk_ptr->w; var_a3++) { + fb_x = chunk_ptr->x + x + var_a3; + if ((fb_x >= 0) && (fb_x < D_80276588)) { + fb_y = chunk_ptr->y + y + var_t3; + if ((fb_y >= 0) && (fb_y < D_8027658C)) { + temp_a1 = framebuffer_ptr + fb_x + fb_y * D_80276588; + temp_a2 = *var_t2; + if (IA8_A(temp_a2)) { + *temp_a1 = I4_2_RGBA16(IA8_I(temp_a2), 1); + } else if (!alpha_enabled) { + *temp_a1 = 1; + } + } + } + var_t2++; + } + } + chunk_ptr = (BKSpriteFrame *) var_t2; + } +} + +#ifndef NONMATCHING +#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_rgba32.s") +#else +void draw_sprite_rgba32(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) { + s32 i_chunk; + BKSpriteFrame *sprite_frame; + BKSpriteTextureBlock *chunk_ptr; + u32 *var_t4; + s16 temp_v0; + s16 var_v1; + s32 temp_a1; + s32 temp_a2; + u16 *temp_s5; + s32 temp_t1; + s32 alpha; + s32 temp_v0_5; + s32 var_s0; + s32 var_t2; + u16 *temp_a3; + u16 p1_a; + u32 temp_v1; + s32 red8; + s32 green8; + s32 blue8; + + temp_s5 = &D_803A5D00[D_802806EC][0]; + sprite_frame = spriteGetFramePtr(sprite, frame); + if (!alpha_enabled) { + set_prim_color(0, 0, 0x80); + draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h); + } + chunk_ptr = (BKSpriteTextureBlock *)(sprite_frame + 1); + for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++){ + if( ((chunk_ptr->x >= -5) && (chunk_ptr->x < 0x29)) + && (chunk_ptr->y >= -5) && (chunk_ptr->y < 0x29) + ) { + //align + var_t4 = (u32 *)(chunk_ptr + 1); + while((s32)var_t4 % 8){var_t4++;} + + for(var_s0 = 0; var_s0 < chunk_ptr->h; var_s0++){ + for(var_t2 = 0; var_t2 < chunk_ptr->w; var_t2++) { + temp_a1 = chunk_ptr->x + x + var_t2; + if ((temp_a1 >= 0) && (temp_a1 < D_80276588)) { + temp_a2 = chunk_ptr->y + y + var_s0; + if ((temp_a2 >= 0) && (temp_a2 < D_8027658C)) { + temp_v1 = *var_t4; + temp_a3 = temp_s5 + temp_a1 + temp_a2 * D_80276588; + alpha = _SHIFTR(temp_v1, 0, 8); + temp_t0 = *temp_a3; + if (alpha != 0) { + + temp_v0_5 = 0xFF - alpha; + red8 = (((_SHIFTR(temp_v1, 24, 8) * alpha) + ((_SHIFTR(temp_t0, 11, 5) << 3) * temp_v0_5)) / 0xFF); + green8 = (((_SHIFTR(temp_v1, 16, 8) * alpha) + ((_SHIFTR(temp_t0, 6, 5) << 3) * temp_v0_5)) / 0xFF); + blue8 = (((_SHIFTR(temp_v1, 8, 8) * alpha) + ((_SHIFTR(temp_t0, 1, 5) << 3) * temp_v0_5)) / 0xFF); + *temp_a3 = _SHIFTL((red8 >> 3), 11, 5) + | _SHIFTL((green8 >> 3), 6, 5) + | _SHIFTL((blue8 >> 3), 1, 5) + | 1; + } else if (!alpha_enabled) { + *temp_a3 = 0x0001; + } + } + } + var_t4++; + } + } + chunk_ptr = (BKSpriteFrame *) var_t4; + } + } +} +#endif + + +void func_802499BC(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in +} + +void func_802499D0(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in +} + +void draw_texture_ci4(s32 x, s32 y, void *tmem, s32 w, s32 h, bool alpha_enabled){ + s32 ix; + s32 iy; + s32 icolor; + u16 *framebuffer_ptr; + u16 *palette_ptr; + u8 *pixel_ptr; + + palette_ptr = (u16*)tmem; + pixel_ptr = (u8*)&palette_ptr[0x10]; + framebuffer_ptr = &D_803A5D00[D_802806EC][x + y * D_80276588]; + for(iy = 0; iy < h; iy++){ + for(ix = 0; ix < w; ix++){ + icolor = (ix & 1)? pixel_ptr[ix/2 + (iy*w)/2] & 0xF + : pixel_ptr[ix/2 + (iy*w)/2] >> 4; + *framebuffer_ptr = palette_ptr[icolor]; + framebuffer_ptr++; + } + framebuffer_ptr += (D_80276588 - w); + } +} + +void func_80249CEC(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) { + s16 temp_v0; + + temp_v0 = sprite->type; + if (temp_v0 & SPRITE_TYPE_I4) { + draw_sprite_i4(x, y, sprite, frame, alpha_enabled); + } else if (temp_v0 & SPRITE_TYPE_IA4) { + draw_sprite_ia4(x, y, sprite, frame, alpha_enabled); + } else if (temp_v0 & SPRITE_TYPE_I8) { + draw_sprite_i8(x, y, sprite, frame, alpha_enabled); + } else if (temp_v0 & SPRITE_TYPE_IA8) { + draw_sprite_ia8(x, y, sprite, frame, alpha_enabled); + } else if (temp_v0 & SPRITE_TYPE_RGBA16) { + draw_sprite_rgba16(x, y, sprite, frame, alpha_enabled); + } else if (temp_v0 & SPRITE_TYPE_RGBA32) { + draw_sprite_rgba32(x, y, sprite, frame, alpha_enabled); + } else if (temp_v0 & SPRITE_TYPE_CI4) { + draw_sprite_ci4(x, y, sprite, frame, alpha_enabled); + } else if (temp_v0 & SPRITE_TYPE_CI8) { + draw_sprite_ci8(x, y, sprite, frame, alpha_enabled); + } +} + +//arg4 = alpha enabled? +void func_80249DE0(s32 x, s32 y, s16 *arg2, s32 arg3, s32 arg4) { + s32 ix; + s32 var_t2; + s32 iy; + u16 *framebuffer_ptr; + u16 *texture_ptr; + u16 temp_v1; + BKSpriteTextureBlock *temp_v0; + + temp_v0 = func_8033EFB0(arg2, arg3); + texture_ptr = (u16*)(temp_v0 + 1); + if (*arg2 == SPRITE_TYPE_CI4) { + draw_texture_ci4(x, y, temp_v0 + 1, temp_v0->w, temp_v0->h, arg4); + return; + } + //otherwise RGBA16 + framebuffer_ptr = &D_803A5D00[D_802806EC][x + y*D_80276588]; + for(iy = 0; iy < temp_v0->h; iy++){ + for(ix = 0; ix < temp_v0->w; ix++){ + temp_v1 = *texture_ptr; + if (temp_v1 & 1) { //if visible + *framebuffer_ptr = temp_v1; + } else if (arg4 == 0) { + *framebuffer_ptr = 1; + } + texture_ptr++; + framebuffer_ptr++; + } + framebuffer_ptr += (D_80276588 - temp_v0->w); + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80249DE0.s") #pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80249F34.s") @@ -230,7 +583,7 @@ void func_8024A564(s32 x, s32 y, u16 *arg2, s32 arg3, s32 arg4, f32 arg5, f32 ar #endif //fills in rectangle in frame buffer with D_802806E0 color -void func_8024A770(s32 x, s32 y, s32 w, s32 h) { +void draw_prim_rect(s32 x, s32 y, s32 w, s32 h) { s32 var_s0; s32 var_s1; s32 var_s4; @@ -244,11 +597,11 @@ void func_8024A770(s32 x, s32 y, s32 w, s32 h) { } void func_8024A810(void){ - func_8024A840(0, 0x80, 0); + set_prim_color(0, 0x80, 0); func_8024A85C(0); } -void func_8024A840(s32 r, s32 g, s32 b){ +void set_prim_color(s32 r, s32 g, s32 b){ D_802806E0 = r; D_802806E4 = g; D_802806E8 = b; diff --git a/src/core2/code_87E30.c b/src/core2/code_87E30.c index 1b7f7112..3a7c15dd 100644 --- a/src/core2/code_87E30.c +++ b/src/core2/code_87E30.c @@ -823,7 +823,7 @@ void func_80310D2C(void){ } } -int func_803110F8(s32 next_state, s32 arg1, s32 arg2, s32 arg3, s32 arg4){ +int func_803110F8(s32 next_state, s32 arg1, s32 arg2, s32 arg3, void (*arg4)(ActorMarker *, enum asset_e, s32)){ func_8025A55C(15000, 300, 2); func_80311174(next_state + 0xe57, 0x84, NULL, NULL, NULL, NULL, arg4); func_80310A5C(arg2, arg3, arg1, 0, 0); diff --git a/src/core2/code_AEDA0.c b/src/core2/code_AEDA0.c index a474e514..6f42f49c 100644 --- a/src/core2/code_AEDA0.c +++ b/src/core2/code_AEDA0.c @@ -267,7 +267,92 @@ void func_80336904(Gfx **gfx, Vtx **vtx, BKSprite *sp, u32 frame){ if(chkDataSize_1C0); }//*/ +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_80337B68.s") +#else +void func_80337B68(Gfx **gfx, Vtx **vtx, Struct84s *texture_list, s32 texture_index) { + s16 temp_a1; + s32 temp_at; + s32 temp_lo; + s32 temp_lo_2; + s32 temp_t9; + s32 temp_v1; + s32 var_a0; + s32 var_a0_2; + s32 var_a1; + s32 v2; + s32 var_ra; + s32 var_s1; + s32 var_s1_2; + s32 var_t0; + s32 var_t0_2; + s32 v0; + s32 var_t2; + s32 v1; + s32 var_t3; + s32 v3; + s32 var_t4; + s32 var_v1; + s32 var_v1_2; + s32 var_v1_3; + s32 var_v1_4; + s32 var_v1_5; + s32 var_v1_6; + s32 var_v1_7; + void *temp_a0; + void *temp_a0_2; + void *temp_a0_3; + void *temp_a0_4; + void *temp_a0_5; + void *temp_a0_6; + void *temp_a2; + void *temp_a2_2; + void *temp_s0; + Vtx *temp_s3; + BKSpriteTextureBlock *txtr_ptr; + u16 *var_t5; + + func_80335D30(); + txtr_ptr = func_8033EFB0(texture_list, texture_index); + temp_v1 = D_80383644; + temp_lo = temp_v1 / 3; + temp_s3 = *vtx; + var_s1 = 0; + var_t4 = (s32) (((f32) txtr_ptr->y / (f32) txtr_ptr->h) * (f32) temp_v1); + for(var_s1 = 0; var_s1 < 3; var_s1++){ + var_a0 = var_t4; + for(var_t2 = 0; var_t2 < 2; var_t2++){ + for(var_v1 = 0; var_v1 < 2; var_v1++){ + (*vtx)->v.ob[0] = (s16) ((var_v1 * D_80383640) + (s32) (-((f32) txtr_ptr->x / (f32) txtr_ptr->w) * (f32) D_80383640)); + (*vtx)->v.ob[1] = (s16) (-(var_t2 * (D_80383644/3) - (var_s1*(D_80383644/3))) + (s32) (((f32) txtr_ptr->x / (f32) txtr_ptr->w) * (f32) D_80383644)); + (*vtx)->v.ob[2] = 0; + (*vtx)->v.tc[0] = ((txtr_ptr->w - 1) * var_v1) << 6; + (*vtx)->n.tc[1] = (0x1A * var_v1) << 6; + *(u32*)((*vtx)->v.cn) = 0x00007F80; + (*vtx)++; + } + var_a0 += -temp_lo; + } + var_t4 -= temp_lo; + } + var_t5 = (u16*)(txtr_ptr + 1); + v0 = 0; + v1 = 1; + v3 = 3; + v2 = 2; + gSPVertex((*gfx)++, temp_s3, 12, 0); + for(var_s1 = 0; var_s1 < 3; var_s1++){ + gDPLoadTextureBlock((*gfx)++, var_t5, G_IM_FMT_RGBA, G_IM_SIZ_16b, txtr_ptr->w, ((var_s1 < 2) ? 1 : 0) + 0x1A, NULL, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gSP2Triangles((gfx++), v0, v1, v3, var_s1, v2, v0, v3,var_s1); + var_t5 += txtr_ptr->w * 0x1A; + v0 += 4; + v1 += 4; + v3 += 4; + v2 += 4; + } + func_8033687C(gfx); +} +#endif #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_80338048.s") diff --git a/src/core2/code_B8020.c b/src/core2/code_B8020.c index 3737e27b..db7d384d 100644 --- a/src/core2/code_B8020.c +++ b/src/core2/code_B8020.c @@ -2,8 +2,19 @@ #include "functions.h" #include "variables.h" + + /* .bss */ -UNK_TYPE(void *)D_80384FF0; +BKSpriteTextureBlock *D_80384FF0; /* .code */ -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B8020/func_8033EFB0.s") +BKSpriteTextureBlock *func_8033EFB0(Struct84s *arg0, s32 arg1){ + s32 *offset_ptr = &arg0->offset[arg1]; + s32 mem_ptr; + if(arg0->offset[arg1] == -1){ + return D_80384FF0; + } + + mem_ptr = *offset_ptr + (s32) &arg0[0].offset[arg0->count]; + return (BKSpriteTextureBlock *)(mem_ptr); +} diff --git a/src/core2/code_B9770.c b/src/core2/code_B9770.c index d3fb812e..e5de3da3 100644 --- a/src/core2/code_B9770.c +++ b/src/core2/code_B9770.c @@ -2,17 +2,208 @@ #include "functions.h" #include "variables.h" - +extern f32 func_80323540(struct56s *, f32, f32, f32); extern void sfxsource_setSampleRate(u8, s32); extern bool func_80323240(struct56s *, f32, f32[3]); +extern f32 func_803234FC(struct56s *, f32, f32); extern f32 func_803237E8(struct56s *); extern f32 func_80323FDC(struct56s *, f32, f32, s32 *); extern f32 func_803240E0(struct56s *, f32, f32, s32 *); +extern void func_80250530(s32, u16, f32); +extern s32 func_80255D44(s32); extern struct56s **D_80371E70; extern void **D_80371E74; extern s32 D_80371E78; extern s32 D_80371E7C; +extern s32 D_80371E80; + +typedef struct { + f32 unk0; + u8 pad4[0x8]; + struct{ + u32 pad_bit31: 9; + u32 bit22: 11; + u32 pad_bit11: 12; + }unkC; +} Struct_glspline_0; + +// typedef struct { +// u8 pad_0[0x4]; +// union { +// struct{ +// u16 bit63; +// u16 bit47:12; +// u16 unk0_3:3; +// u16 pad0_0:1; +// u32 bit31:24; +// u32 pad4_7:8; +// }t0; +// struct{ +// u32 pad_bit63: 12; +// u32 bit51: 2; +// u32 pad_bit49: 18; +// u32 bit31: 10; +// u32 bit21: 11; +// u32 bit10: 1; +// u32 pad_bit9: 1; +// u32 bit8: 1; +// u32 pad_bit7: 1; +// u32 bit6: 3; +// u32 bit3: 3; +// u32 pad_bit0: 1; +// }t1; +// struct{ +// u32 bit63: 1; +// u32 bit62: 15; +// u32 bit47: 8; +// u32 bit39: 4; +// u32 pad_bit35: 4; +// u32 pad_bit31: 32; +// }t2; +// }unk4; +// u32 padC_31:8; +// u32 unkC_23:2; +// u32 unkC_21:1; +// u32 unkC_20:8; +// u32 unkC_12:12; +// u32 unkC_0 : 1; +// union { +// struct { +// u32 pad_bit31: 24; +// u32 bit7:7; +// u32 bit0:1; +// }t0; +// struct { +// u32 pad_bit31: 25; +// u32 bit6: 1; +// u32 bit5: 1; +// u32 bit4: 1; +// u32 pad_bit3:5; +// }t1; +// struct { +// u32 pad_bit31: 24; +// u32 bit7:5; +// u32 pad_bit1:2; +// }t2; +// }unk10; +// }Struct_glspline_0; + +typedef struct { + u32 bit31: 16; + u32 bit15: 12; + u32 bit3: 3; + u32 bit0: 1; +}Struct_glspline_t0_unk4_common; + +typedef struct { + u32 bit31: 1; + u32 bit30: 15; + u32 bit15: 8; + u32 bit7: 4; + u32 bit3: 3; + u32 bit0: 1; +}Struct_glspline_t0_unk4_t7; + +typedef struct{ + u8 pad0[0x4]; + union + { + Struct_glspline_t0_unk4_common common; + Struct_glspline_t0_unk4_t7 t7; + }unk4; + struct { + u32 bit31:24; + u32 pad4_7:8; + }unk8; + struct{ + u32 pad_bit31:8; + u32 bit23:2; + u32 bit21:1; + u32 bit20:8; + u32 bit12:12; + u32 bit0:1; + }unkC; + union { + struct { + u32 pad_bit31: 24; + u32 bit7:7; + u32 bit0:1; + } common; + struct { + u32 pad_bit31: 24; + u32 bit7:6; + u32 pad_bit1:1; + u32 bit0:1; + }t7; + u32 word; + } unk10; +}Struct_glspline_t0; + +typedef struct{ + f32 unk0; + struct{ + u32 bit31: 12; + u32 bit19: 2; + u32 bit17: 2; + u32 bit15: 9; + u32 bit6: 3; + u32 bit3: 3; + u32 pad_bit0: 1; + }unk4; + struct{ + u32 bit31: 10; + u32 bit21: 11; + u32 bit10: 1; + u32 bit9: 1; + u32 bit8: 1; + u32 pad_bit7: 8; + } unk8; + struct{ +// u32 padC_31:8; +// u32 unkC_23:2; +// u32 unkC_21:1; +// u32 unkC_20:8; + u32 bit31:9; + u32 bit22:11; + u32 bit11:11; + u32 bit0 : 1; + }unkC; + struct { + u32 bit31: 12; + u32 pad_bit19: 13; + u32 bit6: 1; + u32 bit5: 1; + u32 bit4: 1; + u32 pad_bit3:3; + }unk10; +}Struct_glspline_t1; + +typedef struct{ + u8 pad0[0xC]; + struct{ + u32 pad_bit31:31; + u32 bit0:1; + }unkC; + u8 pad10[0x4]; +}Struct_glspline_common; + +typedef union{ + Struct_glspline_common common; + Struct_glspline_t0 t0; + Struct_glspline_t1 t1; + /* data */ +}Union_glspline; + + +typedef struct{ + s32 unk0; + Union_glspline spline[]; +}glspline_list; + +/* .rodata */ +extern char D_80378FF0[]; +extern f32 D_8037901C; /* .bss */ s16 *D_803858A0; @@ -24,7 +215,7 @@ f32 func_80340700(f32 value, f32 min, f32 max) { : value; } -bool func_80340748(s32 arg0, s32 arg1, s32 arg2, s32 arg3){ +bool func_80340748(s32 arg0, s32 arg1, s32 arg2, f32 arg3[3], s32 arg4, s32 arg5, s32 arg6){ return FALSE; } @@ -131,13 +322,312 @@ int func_80342064(s32 arg0){ s32 func_803421A4(s32, f32); #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803421A4.s") + #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80342244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80342260.s") +f32 func_80342260(s32 arg0, f32 arg1, s32 arg2){ + return func_803234FC(func_80342038(arg0), arg1, 1.0f) / ((f32)arg2 /4); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803422AC.s") +void func_803422AC(ActorMarker *caller, enum asset_e text_id, s32 arg2){ + jiggyscore_total(); +} +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803422D4.s") +#else +s32 func_803422D4(Actor *arg0, Union_glspline *arg1, glspline_list *arg2) { + s32 sp84 = 0; + u8 sp83; + f32 sp7C; + s32 sp78; + s32 sp74; + u32 sp70; + s32 sp6C; + s32 sp68; + s32 sp64; + f32 sp60; + f32 sp54[3]; + f32 sp50; + f32 sp4C; + Struct_glspline_t1 *sp48; /* compiler-managed */ + Struct_glspline_t1 *temp_v0_6; + + if (arg1->common.unkC.bit0) { + if (D_80371E80 == 1) { + sp84 = 1; + } + switch (arg1->t0.unk4.common.bit3) { + case 1: + func_80250530(0, arg1->t0.unk4.common.bit31, 3.0f); + break; + + case 2: + D_803858A0[arg1->t0.unk10.common.bit7] = arg1->t0.unk4.common.bit31; + func_8025A6EC(func_80255D30(arg1->t0.unk4.common.bit31), arg1->t0.unk4.common.bit15 * 8); + break; + + case 3: + sp78 = arg1->t0.unk4.common.bit31; + sp7C = arg1->t0.unk8.bit31/8.388608e6f; + sp74 = arg1->t0.unk4.common.bit15*8; + sp70 = arg1->t0.unk10.common.bit7; + if (func_8030ED70(func_80255D44(sp78))) { + sp83 = func_8030D90C(); + if (sp83 == 0){ + return sp84; + } + + sfxsource_setSfxId(sp83, func_80255D44(sp78)); + func_8030DBB4(sp83, sp7C); + sfxsource_setSampleRate(sp83, sp74); + func_8030E2C4(sp83); + if (D_803858A0[sp70] != 0) { + func_8030DA44(D_803858A0[sp70]); + } + D_803858A0[sp70] = sp83; + + } else { + func_8030E6A4(func_80255D44(sp78), sp7C, sp74); + } + break; + + case 7: + if(((arg1->t0.unk10.word << 0x1e) >>0x1f) == TRUE){ + arg0->unk124_11 = (arg1->t0.unk4.t7.bit31 == FALSE) ? 2 + : (arg1->t0.unk4.t7.bit31 == TRUE) ? 1 + : 0; + arg0->unk1C[0] = (arg1->t0.unk4.t7.bit30 != 0) ? (f32)((f32)arg1->t0.unk4.t7.bit30 * 0.25) + : 0.0f; + arg0->unk1C[1] = 0.0f; + } + if (arg1->t0.unkC.bit21 == 1) { + func_803110F8(arg1->t0.unkC.bit20, arg1->t0.unk10.t7.bit7, arg1->t0.unk4.t7.bit15, arg1->t0.unk4.t7.bit7, func_803422AC); + } + if ((arg1->t0.unkC.bit23 == 1) || (arg1->t0.unkC.bit23 == 2)) { + D_80371E80 = arg1->t0.unkC.bit23 - 1; + } + break; + + case 6: + mapSpecificFlags_set(arg1->t0.unk4.common.bit31, TRUE); + break; + + case 4: + if (D_803858A0[arg1->t0.unk10.common.bit7] != 0) { + func_8025A7DC(func_80255D30(D_803858A0[arg1->t0.unk10.common.bit7])); + D_803858A0[arg1->t0.unk10.common.bit7] = 0; + } + break; + + case 5: + if (D_803858A0[arg1->t0.unk10.common.bit7] != 0) { + func_8030DA44(D_803858A0[arg1->t0.unk10.common.bit7]); + D_803858A0[arg1->t0.unk10.common.bit7] = 0; + } + break; + } + + if (arg1->t0.unkC.bit12 != 0) { + sp64 = 0; + sp68 = func_80340760(arg1->t0.unkC.bit12, &sp6C, &sp60, sp54, arg0->unk44_14, &sp50, &sp4C); + if (sp68 == 0) { + sp64 = func_80340748(arg1->t0.unkC.bit12, &sp6C, &sp60, sp54, arg0->unk44_14, &sp50, &sp4C); + } + sp84 = 2; + arg0->unk44_14 = sp6C; + arg0->unk48 = sp60; + arg0->position[0] = sp54[0]; + arg0->position[1] = sp54[1]; + arg0->position[2] = sp54[2]; + if (sp68 != 0) { + if (sp50 != -9999.0f) { + arg0->yaw = sp50; + if (arg0->marker->unk14_20 == 0x12) { + arg0->yaw = (f32) func_80342244((s32) arg0->yaw); + } + arg0->yaw_moving = arg0->yaw; + } + if (sp4C != -9999.0f) { + arg0->pitch = sp4C; + arg0->unk6C = arg0->pitch; + } + if ((sp50 != -9999.0f) || (sp4C != -9999.0f)) { + func_802CDAC4(arg0); + } + } + if (sp64) { + + } + } + + } else { + if (D_80371E80 == 1) { + sp84 = 1; + } + if (arg1->t1.unk8.bit8) { + if (arg1->t1.unk10.bit5) { + arg0->unk138_3 = (arg1->t1.unkC.bit11 - 0x69); + } else { + arg0->unk54 = (f32)arg1->t1.unkC.bit11 / 4; + } + } + if (arg1->t1.unk8.bit10) { + arg0->unk5C = (f32)arg1->t1.unk8.bit21 / 4; + arg0->unk58_31 = func_80255D58(arg1->t1.unk8.bit31); + if (arg0->animctrl == NULL) { + arg0->animctrl = animctrl_new(0); + animctrl_reset(arg0->animctrl); + } + animctrl_setIndex(arg0->animctrl, arg0->unk58_31); + animctrl_setDuration(arg0->animctrl, arg0->unk5C); + animctrl_setDirection(arg0->animctrl, 1); + if (arg0->animctrl != NULL) { + _func_802875AC(arg0->animctrl, "glspline.c"/*&D_80378FF0*/, 0x545); + } + } + switch (arg1->t1.unk4.bit6) { /* switch 2 */ + case 1: /* switch 2 */ + arg0->unk10_4 = TRUE; + arg0->unk10_8 = TRUE; + arg0->unk10_7 = TRUE; + break; + + case 2: /* switch 2 */ + arg0->unk10_4 = FALSE; + arg0->unk10_8 = FALSE; + break; + + case 3: /* switch 2 */ + arg0->unk10_4 = FALSE; + arg0->unk10_8 = TRUE; + break; + + case 4: /* switch 2 */ + arg0->unk10_4 = FALSE; + arg0->unk10_7 = FALSE; + break; + + case 5: /* switch 2 */ + arg0->unk10_4 = FALSE; + arg0->unk10_7 = TRUE; + break; + + case 6: /* switch 2 */ + arg0->unk10_4 = FALSE; + arg0->unk10_8 = FALSE; + arg0->unk10_7 = FALSE; + break; + + case 7: /* switch 2 */ + arg0->unk10_4 = FALSE; + arg0->unk10_8 = TRUE; + arg0->unk10_7 = TRUE; + break; + } + + switch (arg1->t1.unk4.bit3) { /* switch 3 */ + case 2: /* switch 3 */ + arg0->unk10_6 = 0; + if (arg0->unk4C < 0.0f) { + arg0->unk4C = -arg0->unk4C; + } else { + arg0->unk4C = arg0->unk4C; + } + actor_playAnimationOnce(arg0); + break; + + case 3: /* switch 3 */ + arg0->unk10_6 = 0; + if (arg0->unk4C < 0.0f) { + arg0->unk4C = arg0->unk4C; + } else { + arg0->unk4C = -arg0->unk4C; + } + actor_playAnimationOnce(arg0); + break; + + case 4: /* switch 3 */ + arg0->unk10_6 = 1; + if (arg0->unk4C < 0.0f) { + arg0->unk4C = -arg0->unk4C; + } else { + arg0->unk4C = arg0->unk4C; + } + actor_loopAnimation(arg0); + break; + + case 5: /* switch 3 */ + arg0->unk10_6 = 1; + if (arg0->unk4C < 0.0f) { + arg0->unk4C = arg0->unk4C; + } else { + arg0->unk4C = -arg0->unk4C; + } + actor_loopAnimation(arg0); + break; + + case 6: /* switch 3 */ + arg0->unk10_6 = 2; + break; + } + + if (arg1->t1.unk4.bit19 != 0) { + arg0->unk10_3 = arg1->t1.unk4.bit19; + } + + if (arg1->t1.unk10.bit6 != arg0->unk138_30) { + arg0->unk138_30 = arg1->t1.unk10.bit6; + } + + if (arg1->t1.unk8.bit9) { + if (!func_802E4A08() && (arg0->modelCacheIndex == ACTOR_123_MAGIC_CARPET_2)) { + arg0->unk4C = func_80323540(func_80342038(arg0->unk44_14), arg0->unk48, 1.0f, 500.0f) / ((f32)arg1->t1.unkC.bit22 / 4); + } else { + arg0->unk4C = func_80342260(arg0->unk44_14, arg0->unk48, arg1->t1.unkC.bit22); + } + } + if (arg1->t1.unk4.bit31 != 0) { + sp48 = &arg2->spline[0].t1; + temp_v0_6 = &arg2->spline[arg2->unk0].t1; + while(sp48->unk10.bit31 != arg1->t1.unk4.bit31 && sp48 < temp_v0_6){ + sp48++; + } + arg0->unkF4_24 = arg1->t0.unk4.common.bit31; + arg0->unk70 = arg1->t1.unk0; + arg0->unk74 = sp48->unk0; + if (arg1->t1.unk4.bit17 & 1) { + arg0->unk38_13 = arg1->t1.unkC.bit31; + arg0->unk38_21 = sp48->unkC.bit31; + arg0->unk78_31 = arg1->t1.unk4.bit15; + arg0->unk78_22 = sp48->unk4.bit15; + if (arg0->marker->unk14_20 == 0x12) { + arg0->unk38_13 = func_80342244(arg0->unk38_13); + arg0->unk38_21 = func_80342244(arg0->unk38_21); + } + arg0->yaw = arg0->yaw_moving = (f32) arg0->unk38_13; + arg0->pitch = arg0->unk6C = (f32) arg0->unk78_31; + } + if (arg1->t1.unk4.bit17 & 2) { + arg0->unk140 = arg0->unk4C; + arg0->unk144 = func_803234FC(func_80342038(arg0->unk44_14), sp48->unk0, 1.0f) / ((f32)sp48->unkC.bit22 / 4); + } + } + if (!arg0->unk10_4) { + if (arg0->unk10_8) { + arg0->yaw_moving = (f32)arg1->t1.unkC.bit31; + if (arg0->marker->unk14_20 == 0x12) { + arg0->yaw_moving = (f32) func_80342244((s32) arg0->yaw_moving); + } + } + if (arg0->unk10_7) { + arg0->unk6C = (f32)arg1->t1.unk4.bit15; + } + } + } + return sp84; +} +#endif #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803430B4.s") @@ -244,7 +734,7 @@ void func_80343DEC(Actor *this){ void func_80343E20(s32 arg0, s32 arg1, f32 arg2, s32 arg3) { u8 temp_v0; - if (func_8030ED70(func_80255D44()) != 0) { + if (func_8030ED70(func_80255D44(arg0)) != 0) { temp_v0 = func_8030D90C(); if (temp_v0 != 0) { sfxsource_setSfxId(temp_v0, func_80255D44(arg0)); diff --git a/subyaml/core2.us.v10.yaml b/subyaml/core2.us.v10.yaml index 96b34571..ac16d593 100644 --- a/subyaml/core2.us.v10.yaml +++ b/subyaml/core2.us.v10.yaml @@ -341,7 +341,7 @@ segments: - [0xB6EA0, c, code_B6EA0] #DONE - [0xB7B20, c, code_B7B20] - [0xB7F40, c, code_B7F40] #DONE - - [0xB8020, c, code_B8020] + - [0xB8020, c, code_B8020] #DONE - [0xB8070, c, code_B8070] #DONE - [0xB8080, c, code_B8080] - [0xB8860, c, code_B8860] #DONE @@ -769,7 +769,9 @@ segments: - [0xF1FF0, bin, code_B6C60] - [0xF2000, .rodata, code_B6CE0] - [0xF2030, .rodata, code_B9090] - - [0xF2060, bin, data_F2060] + - [0xF2060, bin, F2060] + # - [0xF2070, .rodata, code_B9770] + # - [0xF20C8, bin, data_F20C8] - [0xF20F0, .rodata, code_BD100] - [0xF2110, .rodata, code_BDCC0] - [0xF2130, .rodata, code_BE2C0] diff --git a/symbol_addrs.core1.us.v10.txt b/symbol_addrs.core1.us.v10.txt index 1ccf2ad1..5e8cb19e 100644 --- a/symbol_addrs.core1.us.v10.txt +++ b/symbol_addrs.core1.us.v10.txt @@ -12,6 +12,16 @@ guScale = 0x80241304; _guMtxIdentF_80245D44 = 0x80245D44; guRotateRPYF = 0x80241348; guPerspective = 0x802462D4; +draw_sprite_ci4 = 0x802485D0; +draw_sprite_ci8 = 0x80248870; +draw_sprite_rgba16 = 0x80248B40; +draw_sprite_i4 = 0x80248D40; +draw_sprite_ia4 = 0x80248F9C; +draw_sprite_i8 = 0x80249210; +draw_sprite_ia8 = 0x80249428; +draw_sprite_rgba32 = 0x80249644; +draw_prim_rect = 0x8024A770; +set_prim_color = 0x8024A840; spriteGetFrameCount = 0x802510C0; spriteGetFramePtr = 0x802510C8; get_loaded_overlay_id = 0x80251230; diff --git a/symbol_addrs.core2.us.v10.txt b/symbol_addrs.core2.us.v10.txt index 85fcc87f..0dcbd982 100644 --- a/symbol_addrs.core2.us.v10.txt +++ b/symbol_addrs.core2.us.v10.txt @@ -454,6 +454,7 @@ D_80378F64 = 0x80378F64; D_80378F68 = 0x80378F68; D_80378FC8 = 0x80378FC8; D_80378FCC = 0x80378FCC; +D_8037901C = 0x8037901C; D_80379080 = 0x80379080; D_80379084 = 0x80379084; D_80379088 = 0x80379088;