Files
perfect-dark/src/game/camdraw.c
T
2022-07-09 21:46:41 +10:00

4319 lines
104 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "game/camdraw.h"
#include "game/tex.h"
#include "game/menu.h"
#include "game/stubs/game_102230.h"
#include "game/bg.h"
#include "game/lang.h"
#include "game/pak.h"
#include "game/splat.h"
#include "game/utils.h"
#include "bss.h"
#include "lib/main.h"
#include "lib/memp.h"
#include "lib/model.h"
#include "lib/mema.h"
#include "lib/rng.h"
#include "lib/mtx.h"
#include "lib/libc/ll.h"
#include "data.h"
#include "types.h"
struct camerafile {
u8 unk00[128];
u16 unk80;
u16 unk82;
u16 unk84;
u8 unk86;
u8 unk87;
u8 unk88;
u8 unk89;
u8 unk8a;
u8 unk8b;
u8 unk8c;
u8 unk8d;
u16 unk8e_00 : 1;
u16 unk8e_01 : 1;
u16 unk8e_02 : 8;
s16 unk90[7];
u8 unk9e[1024];
};
struct var800a45a0 *var800a45a0;
u32 var800a45a4;
struct texturething var800a45a8;
u32 var800a45b8;
u32 var800a45bc;
const char var7f1b6050[] = "Init";
const char var7f1b6058[] = "Start Header Read";
const char var7f1b606c[] = "Header Read Done";
const char var7f1b6080[] = "Null";
const char var7f1b6088[] = "Exit 1";
const char var7f1b6090[] = "Exit 2";
const char var7f1b6098[] = "Exit 3";
const u32 var7f1b60a0[][2] = {
{ 0, 0 },
{ 0, 1 },
{ 1, 0 },
{ 2, 0 },
{ 1, 1 },
{ 0, 2 },
{ 0, 3 },
{ 1, 2 },
{ 2, 1 },
{ 3, 0 },
{ 4, 0 },
{ 3, 1 },
{ 2, 2 },
{ 1, 3 },
{ 0, 4 },
{ 0, 5 },
{ 1, 4 },
{ 2, 3 },
{ 3, 2 },
{ 4, 1 },
{ 5, 0 },
{ 6, 0 },
{ 5, 1 },
{ 4, 2 },
{ 3, 3 },
{ 2, 4 },
{ 1, 5 },
{ 0, 6 },
{ 0, 7 },
{ 1, 6 },
{ 2, 5 },
{ 3, 4 },
{ 4, 3 },
{ 5, 2 },
{ 6, 1 },
{ 7, 0 },
{ 7, 1 },
{ 6, 2 },
{ 5, 3 },
{ 4, 4 },
{ 3, 5 },
{ 2, 6 },
{ 1, 7 },
{ 2, 7 },
{ 3, 6 },
{ 4, 5 },
{ 5, 4 },
{ 6, 3 },
{ 7, 2 },
{ 7, 3 },
{ 6, 4 },
{ 5, 5 },
{ 4, 6 },
{ 3, 7 },
{ 4, 7 },
{ 5, 6 },
{ 6, 5 },
{ 7, 4 },
{ 7, 5 },
{ 6, 6 },
{ 5, 7 },
{ 6, 7 },
{ 7, 6 },
{ 7, 7 },
};
const u32 var7f1b62a0[] = {0x00000000};
const u32 var7f1b62a4[] = {0xffffffff};
const u32 var7f1b62a8[] = {0xdc9785ff};
const u32 var7f1b62ac[] = {0xdc917bff};
const u32 var7f1b62b0[] = {0xdd8d71ff};
const u32 var7f1b62b4[] = {0xdd8367ff};
const u32 var7f1b62b8[] = {0xdf795dff};
const u32 var7f1b62bc[] = {0xdf7953ff};
const u32 var7f1b62c0[] = {0x00000000};
const u32 var7f1b62c4[] = {0xffffffff};
const u32 var7f1b62c8[] = {0xa67b6dff};
const u32 var7f1b62cc[] = {0xa16152ff};
const u32 var7f1b62d0[] = {0x8c6741ff};
const u32 var7f1b62d4[] = {0x81544cff};
const u32 var7f1b62d8[] = {0x6a4031ff};
const u32 var7f1b62dc[] = {0x4f433cff};
const u32 var7f1b62e0[] = {0x00000000};
const u32 var7f1b62e4[] = {0xffffffff};
const u32 var7f1b62e8[] = {0xccb38dff};
const u32 var7f1b62ec[] = {0xddc07cff};
const u32 var7f1b62f0[] = {0xe6a667ff};
const u32 var7f1b62f4[] = {0xd1ab50ff};
const u32 var7f1b62f8[] = {0xc69f6dff};
const u32 var7f1b62fc[] = {0xb27e5bff};
const u32 var7f1b6300[] = {0x00000000};
const u32 var7f1b6304[] = {0xffffffff};
const u32 var7f1b6308[] = {0x5f3a25ff};
const u32 var7f1b630c[] = {0x553a20ff};
const u32 var7f1b6310[] = {0x4b351cff};
const u32 var7f1b6314[] = {0x412d19ff};
const u32 var7f1b6318[] = {0x41260fff};
const u32 var7f1b631c[] = {0x371e04ff};
const u32 var7f1b6320[] = {0x00000000};
const u32 var7f1b6324[] = {0xffffffff};
const u32 var7f1b6328[] = {0xe9d679ff};
const u32 var7f1b632c[] = {0x654f40ff};
const u32 var7f1b6330[] = {0xebb279ff};
const u32 var7f1b6334[] = {0x846b51ff};
const u32 var7f1b6338[] = {0xebc579ff};
const u32 var7f1b633c[] = {0xab8d6fff};
const u32 var7f1b6340[] = {0x00000000};
const u32 var7f1b6344[] = {0xffffffff};
const u32 var7f1b6348[] = {0x26374dff};
const u32 var7f1b634c[] = {0x18253eff};
const u32 var7f1b6350[] = {0x171d20ff};
const u32 var7f1b6354[] = {0x060e16ff};
const u32 var7f1b6358[] = {0x00001cff};
const u32 var7f1b635c[] = {0x000001ff};
const u32 var7f1b6360[] = {0x00000000};
const u32 var7f1b6364[] = {0xffffffff};
const u32 var7f1b6368[] = {0x972f1aff};
const u32 var7f1b636c[] = {0x822817ff};
const u32 var7f1b6370[] = {0x6e1e12ff};
const u32 var7f1b6374[] = {0x5a140dff};
const u32 var7f1b6378[] = {0x460a08ff};
const u32 var7f1b637c[] = {0x200001ff};
const u32 var7f1b6380[] = {0x00000000};
const u32 var7f1b6384[] = {0xffffffff};
const u32 var7f1b6388[] = {0x79b2ebff};
const u32 var7f1b638c[] = {0x007fffff};
const u32 var7f1b6390[] = {0x1f5fdfff};
const u32 var7f1b6394[] = {0x0043caff};
const u32 var7f1b6398[] = {0x00147eff};
const u32 var7f1b639c[] = {0x0c1857ff};
const char var7f1b63a0[] = "RWI : Cam Alloc : Guid=%d -> Total = %u (%d at %s)\n";
u32 var8007f8c0 = (u32)&var7f1b6050;
u32 var8007f8c4 = (u32)&var7f1b6058;
u32 var8007f8c8 = (u32)&var7f1b606c;
u32 var8007f8cc = (u32)&var7f1b6080;
u32 var8007f8d0 = (u32)&var7f1b6088;
u32 var8007f8d4 = (u32)&var7f1b6090;
u32 var8007f8d8 = (u32)&var7f1b6098;
struct var8007f8dc *var8007f8dc = NULL;
struct var8007f8e0 *var8007f8e0 = NULL;
u32 var8007f8e4 = 0x00000000;
u32 var8007f8e8 = 0x00000008;
u32 var8007f8ec = 0x0000005a;
u32 var8007f8f0 = 0x00000005;
u32 var8007f8f4 = 0x000000c8;
u32 var8007f8f8 = 0x00000000;
u32 var8007f8fc = 0x00000001;
u32 var8007f900 = 0x00000078;
u16 var8007f904[] = {
0x0200, 0x0233, 0x024e, 0x026b,
0x0289, 0x02a9, 0x02ca, 0x02ed,
0x0312, 0x0338, 0x0360, 0x038b,
0x03b7, 0x03e5, 0x0416, 0x0449,
0x047f, 0x04b7, 0x04f2, 0x0530,
0x0570, 0x05b4, 0x05fc, 0x0646,
0x0695, 0x06e7, 0x073d, 0x0798,
0x07f7, 0x085a, 0x08c3, 0x0930,
0x09a3, 0x0a1b, 0x0a9a, 0x0b1e,
0x0ba9, 0x0c3b, 0x0cd4, 0x0d74,
0x0e1c, 0x0ecc, 0x0f85, 0x1047,
0x1113, 0x11e8, 0x12c8, 0x13b3,
0x14a9, 0x15ab, 0x16ba, 0x17d6,
0x18ff, 0x1a38, 0x1b7f, 0x1cd7,
0x1e3f, 0x1fb9, 0x2146, 0x22e6,
0x249a, 0x2663, 0x2843, 0x2a3a,
0x2c49, 0x2e73, 0x30b7, 0x3318,
0x3596, 0x3834, 0x3af2, 0x3dd3,
0x40d7, 0x4402, 0x4753, 0x4acf,
0x4e75, 0x524a, 0x564e, 0x5a84,
0x5eef, 0x6392, 0x686e, 0x6d87,
0x72df, 0x787a, 0x7e5c, 0x8487,
0x8aff, 0x91c7, 0x98e5, 0xa05b,
0xa82f, 0xb065, 0xb901, 0xc208,
0xcb81, 0xd570, 0xdfdb, 0xeac8,
0xf63d, 0xffff,
};
u32 var8007f9d0 = 0x00000000;
/**
* Fill the texture buffer with a linear gradient: black (left) to white (right).
*/
void func0f149c90(struct textureconfig *tconfig)
{
s32 x;
s32 y;
for (y = 0; y < tconfig->height; y++) {
for (x = 0; x < tconfig->width; x++) {
s32 value = (x * 8 / tconfig->width) * 32;
s32 fudge = (y & 1) ? ((x & 4) ? -4 : 4) : 0;
tconfig->textureptr[y * 64 + x + fudge] = value;
}
}
}
void *func0f149d58(u32 size, u32 line, char *file)
{
s32 i;
void *allocation;
static u32 var8007f9d4 = 0;
size = align16(size);
bgGarbageCollectRooms(size, 1);
var8007f9d0 += size;
allocation = memaAlloc(size);
var8007f9d4++;
for (i = 0; i < var800a45a0->unk37c; i++) {
if (var800a45a0->unk380[i] == NULL) {
// @bug? Is this meant to be writing to [i]?
// Otherwise it's appending to the array without increasing unk37c.
var800a45a0->unk380[var800a45a0->unk37c] = allocation;
var800a45a0->unk3f8[var800a45a0->unk37c] = size;
return allocation;
}
}
var800a45a0->unk380[var800a45a0->unk37c] = allocation;
var800a45a0->unk3f8[var800a45a0->unk37c] = size;
var800a45a0->unk37c++;
return allocation;
}
void func0f149e58(u8 *arg0, u32 size)
{
s32 i;
var8007f9d0 -= size;
for (i = 0; i < var800a45a0->unk37c; i++) {
if (arg0 == NULL || arg0 == var800a45a0->unk380[i]) {
memaFree(var800a45a0->unk380[i], var800a45a0->unk3f8[i]);
var800a45a0->unk380[i] = 0;
}
}
if (arg0 == NULL) {
var800a45a0->unk37c = 0;
}
}
void func0f149f10(void)
{
// empty
}
void func0f149f18(void)
{
struct var8007f8e0 *thing;
s32 i;
func0f14b394(func0f14a06c(-1));
thing = func0f14a06c(-1);
thing->unk3f4_00 = false;
if (var800a45a0->unk470) {
for (i = 0; i < 0x4000; i++) {
var800a45a0->unk470[i] = random() % 255;
}
}
}
void func0f149fc8(s32 index)
{
func0f14c50c(func0f14a06c(index), func0f14a06c(-1), 1040, "camdraw.c");
}
const char var7f1b63e0[] = "Cam -> Dumping head vertex colour information\n";
const char var7f1b6410[] = "Cam -> Face Col - Pal=%d, Entry=%d, Col=%08x\n";
const char var7f1b6440[] = "Cam -> Hair Col - Pal=%d, Entry=%d, Col=%08x\n";
const char var7f1b6470[] = "Cam_Tick (%d Total Slots)";
const char var7f1b648c[] = "Current Camera Slot = %d\n";
const char var7f1b64a8[] = "Slot %d -> Active = %d";
void func0f14a00c(bool arg0)
{
struct var8007f8e0 *thing;
thing = func0f14a06c(-1);
thing->unk3f4_04 = arg0;
thing = func0f14a06c(-2);
thing->unk3f4_04 = arg0;
}
struct var8007f8e0 *func0f14a06c(s32 index)
{
if (index == -1) {
return &var8007f8e0[var800a45a0->unk16c];
}
if (index == -4) {
return &var8007f8e0[var800a45a0->unk174];
}
if (index == -5) {
return &var8007f8e0[var800a45a0->unk178];
}
if (index == -2) {
return &var8007f8e0[var800a45a0->unk014[var800a45a0->unk004]];
}
if (index == -3) {
return &var8007f8e0[var800a45a0->unk170];
}
return &var8007f8e0[var800a45a0->unk014[index]];
}
void func0f14a16c(s32 arg0)
{
struct var8007f8dc *thing = func0f14a20c();
thing->unk100 = arg0;
}
bool func0f14a194(void)
{
return var8007f8dc[var800a45a0->unk000].unk0d4_04 & 0xff;
}
/**
* 0 returns "Style 1"
* 1 returns "Style 2"
* 2 returns "Style 3"
* 3 returns "Style 4"
*/
char *phGetStyleName(s32 stylenum)
{
return langGet(L_MISC_429 + stylenum);
}
/**
* 0 returns "Blonde"
* 1 returns "Black"
* 2 returns "Auburn"
* 3 returns "Blue Rinse"
*/
char *phGetColourName(s32 colournum)
{
return langGet(L_MISC_433 + colournum);
}
struct var8007f8dc *func0f14a20c(void)
{
return &var8007f8dc[func0f14a5a4()];
}
void func0f14a240(void)
{
s32 i;
s32 j;
var800a45a0->unk48c = 0;
var800a45a0->unk484 = 0;
var800a45a0->unk470 = 0;
var800a45a0->unk474 = 0;
var800a45a0->unk478 = 0;
var800a45a0->unk47c = 0;
var800a45a0->unk480 = 0;
var800a45a0->unk37c = 0;
var800a45a0->unk000 = 0;
var800a45a0->unk004 = -1;
var800a45a0->unk008 = 1;
for (i = 0; i < 4; i++) {
for (j = 0; j < 8; j++) {
// empty
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 8; j++) {
// empty
}
}
}
bool func0f14a2fc(s32 index, u32 line, char *file)
{
struct var8007f8e0 *thing = func0f14a06c(index);
return thing->unk3f4_00;
}
void pheadInit(void)
{
s32 i;
if (IS8MB()) {
u32 size1 = align16(sizeof(struct var8007f8dc) * 4);
u32 size2 = align16(sizeof(struct var800a45a0));
var8007f8dc = mempAlloc(size1, MEMPOOL_PERMANENT);
var800a45a0 = mempAlloc(size2, MEMPOOL_PERMANENT);
func0f14a240();
for (i = 0; i < 4; i++) {
func0f14ad58(i);
}
}
}
void pheadInit2(void)
{
// empty
}
void pheadReset(void)
{
s32 i;
var800a45a0->unk37c = 0;
for (i = 0; i < 4; i++) {
var8007f8dc[i].unk0d4_03 = false;
}
}
void func0f14a404(void)
{
func0f149e58(NULL, 0);
}
void func0f14a428(void)
{
s32 i;
for (i = 0; i < 22; i++) {
func0f14a2fc(i, 1296, "camdraw.c");
}
}
const char var7f1b64cc[] = "CAM : Cam_StartCamFileRead - Go\n";
const char var7f1b64f0[] = "************ Cam_ActivateAndClearSlot ************ : Slot=%d\n";
void func0f14a480(void)
{
// empty
}
void func0f14a488(void)
{
s32 i;
func0f14aed0(-1);
for (i = 0; i < 32; i++) {
func0f149c90(&var800a45a0->unk484[i]);
}
for (i = 0; i < 4; i++) {
var8007f8dc[i].unk0f4 = 0;
pak0f11d478(i);
}
}
void func0f14a52c(void)
{
s32 i;
for (i = 0; i < 4; i++) {
var8007f8dc[i].unk0d4_03 = true;
}
}
void func0f14a560(void)
{
s32 i;
for (i = 0; i < 4; i++) {
var8007f8dc[i].unk0d4_03 = false;
}
}
void func0f14a594(s32 arg0)
{
var800a45a0->unk000 = arg0;
}
s32 func0f14a5a4(void)
{
return var800a45a0->unk000;
}
void func0f14a5b4(s32 index)
{
var800a45a0->unk004 = index;
func0f14b394(func0f14a06c(index));
}
void func0f14a5e4(void)
{
func0f14def0(-1, 1407, "camdraw.c");
}
void func0f14a610(void)
{
func0f14def0(-1, 1415, "camdraw.c");
func0f14c50c(func0f14a06c(-2), func0f14a06c(-1), 1416, "camdraw.c");
}
s32 func0f14a668(void)
{
return var800a45a0->unk004;
}
void func0f14a678(void)
{
func0f14c50c(func0f14a06c(-2), func0f14a06c(-1), 1433, "camdraw.c");
}
void func0f14a6bc(void)
{
func0f14c50c(func0f14a06c(-4), func0f14a06c(-1), 1441, "camdraw.c");
func0f14c50c(func0f14a06c(-1), func0f14a06c(-3), 1442, "camdraw.c");
func0f14c50c(func0f14a06c(-3), func0f14a06c(-4), 1443, "camdraw.c");
}
const char var7f1b6584[] = "Cam_CopyEditorToUndo\n";
void func0f14a760(void)
{
func0f14c50c(func0f14a06c(-3), func0f14a06c(-1), 1452, "camdraw.c");
}
const char var7f1b65a8[] = "Cam_CopyUndoToEditor\n";
void func0f14a7a4(void)
{
func0f14c50c(func0f14a06c(-1), func0f14a06c(-3), 1461, "camdraw.c");
}
void func0f14a7e8(s32 index)
{
func0f14c50c(func0f14a06c(-1), func0f14a06c(index), 1470, "camdraw.c");
}
void func0f14a830(void)
{
struct var8007f8dc *thing = func0f14a20c();
if (thing->unk0d4_00) {
thing->unk0d4_00 = false;
} else {
thing->unk0d4_00 = true;
}
if (thing->unk0d4_00) {
func0f14def0(-1, 1484, "camdraw.c");
}
}
struct textureconfig *func0f14a89c(s32 index)
{
struct var8007f8e0 *thing = func0f14a06c(index);
return &thing->unk004;
}
bool func0f14a8c0(void)
{
struct var8007f8dc *thing = func0f14a20c();
return thing->unk0d4_00;
}
bool func0f14a8e8(void)
{
struct var8007f8dc *thing = func0f14a20c();
return thing->unk0f8 == 0 ? false : true;
}
void func0f14a91c(s32 arg0)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3bc = arg0;
func0f14def0(-1, 1518, "camdraw.c");
}
const char var7f1b65f0[] = "Cam -> Setting current hair colour to %s\n";
const char var7f1b661c[] = "Cam -> Setting current face colour to %s\n";
void func0f14a95c(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3bc = 0x80;
}
s32 func0f14a984(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
return thing->unk3bc;
}
void func0f14a9a8(s32 arg0)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3a4 = arg0;
}
void func0f14a9d4(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3a4 = 0;
}
s32 func0f14a9f8(s32 index)
{
struct var8007f8e0 *thing = func0f14a06c(index);
return thing->unk3a4;
}
void func0f14aa1c(s32 arg0)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3b8 = arg0;
}
void func0f14aa48(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3b8 = 6;
}
s32 func0f14aa70(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
return thing->unk3b8;
}
void func0f14aa94(s32 colournum)
{
struct var8007f8e0 *thing;
phGetColourName(colournum);
thing = func0f14a06c(-1);
thing->colournum = colournum;
}
void func0f14aac4(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->colournum = 0;
}
s32 func0f14aae8(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
return thing->colournum;
}
void func0f14ab0c(s32 stylenum)
{
struct var8007f8e0 *thing;
phGetStyleName(stylenum);
thing = func0f14a06c(-1);
thing->stylenum = stylenum;
}
void func0f14ab3c(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->stylenum = 0;
}
s32 func0f14ab60(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
return thing->stylenum;
}
void func0f14ab84(s32 arg0)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3b4 = arg0;
}
s32 func0f14abb0(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
return thing->unk3b4;
}
void func0f14abd4(s32 index, s32 arg1)
{
var8007f8dc[index].unk06c = arg1;
}
s32 func0f14abf4(s32 index)
{
return var8007f8dc[index].unk06c;
}
bool func0f14ac14(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
return thing->unk3f4_02;
}
void func0f14ac3c(bool arg0)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->unk3f4_02 = arg0;
func0f14def0(-1, 1681, "camdraw.c");
}
const char var7f1b6654[] = "Cam_SetAutoDeArtefact -> State = %d\n";
bool func0f14ac90(void)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
return thing->unk3f4_01;
}
void func0f14acb8(bool arg0)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
if (arg0) {
thing->unk3f4_01 = true;
} else {
thing->unk3f4_01 = false;
}
func0f14def0(-1, 1699, "camdraw.c");
}
u16 func0f14ad14(s32 device)
{
return var8007f8dc[device].unk05c & 0xffff;
}
s32 func0f14ad38(s32 device)
{
return var8007f8dc[device].unk060;
}
const char var7f1b6688[] = "Cam_ClearCameraLoadBuffer -> Camera=%d\n";
const char var7f1b66b0[] = "Cam_StartTemp : Need %u bytes for temp cam images buffer\n";
GLOBAL_ASM(
glabel func0f14ad58
.late_rodata
glabel var7f1b72e4
.word 0x3dcccccd
glabel var7f1b72e8
.word 0x3e4ccccd
.text
/* f14ad58: 3c0f8008 */ lui $t7,%hi(var8007f8dc)
/* f14ad5c: 8deff8dc */ lw $t7,%lo(var8007f8dc)($t7)
/* f14ad60: 00047180 */ sll $t6,$a0,0x6
/* f14ad64: 3c013f80 */ lui $at,0x3f80
/* f14ad68: 01c47021 */ addu $t6,$t6,$a0
/* f14ad6c: 44810000 */ mtc1 $at,$f0
/* f14ad70: 000e7080 */ sll $t6,$t6,0x2
/* f14ad74: 3c0142dc */ lui $at,0x42dc
/* f14ad78: 01cf1021 */ addu $v0,$t6,$t7
/* f14ad7c: 44812000 */ mtc1 $at,$f4
/* f14ad80: ac400000 */ sw $zero,0x0($v0)
/* f14ad84: 3c017f1b */ lui $at,%hi(var7f1b72e4)
/* f14ad88: e4400004 */ swc1 $f0,0x4($v0)
/* f14ad8c: e4400008 */ swc1 $f0,0x8($v0)
/* f14ad90: e4440050 */ swc1 $f4,0x50($v0)
/* f14ad94: c42672e4 */ lwc1 $f6,%lo(var7f1b72e4)($at)
/* f14ad98: 3c017f1b */ lui $at,%hi(var7f1b72e8)
/* f14ad9c: 44801000 */ mtc1 $zero,$f2
/* f14ada0: e446000c */ swc1 $f6,0xc($v0)
/* f14ada4: c42872e8 */ lwc1 $f8,%lo(var7f1b72e8)($at)
/* f14ada8: 3c0141f0 */ lui $at,0x41f0
/* f14adac: 44815000 */ mtc1 $at,$f10
/* f14adb0: 2403ffff */ addiu $v1,$zero,-1
/* f14adb4: 2418001e */ addiu $t8,$zero,0x1e
/* f14adb8: ac430058 */ sw $v1,0x58($v0)
/* f14adbc: ac430068 */ sw $v1,0x68($v0)
/* f14adc0: ac40006c */ sw $zero,0x6c($v0)
/* f14adc4: ac400070 */ sw $zero,0x70($v0)
/* f14adc8: ac400074 */ sw $zero,0x74($v0)
/* f14adcc: ac400084 */ sw $zero,0x84($v0)
/* f14add0: ac580054 */ sw $t8,0x54($v0)
/* f14add4: 3c198008 */ lui $t9,%hi(var8007f904+0x3c)
/* f14add8: e4400024 */ swc1 $f0,0x24($v0)
/* f14addc: e4400028 */ swc1 $f0,0x28($v0)
/* f14ade0: e440003c */ swc1 $f0,0x3c($v0)
/* f14ade4: e4420014 */ swc1 $f2,0x14($v0)
/* f14ade8: e4420018 */ swc1 $f2,0x18($v0)
/* f14adec: e442001c */ swc1 $f2,0x1c($v0)
/* f14adf0: e4420020 */ swc1 $f2,0x20($v0)
/* f14adf4: e442002c */ swc1 $f2,0x2c($v0)
/* f14adf8: e4420030 */ swc1 $f2,0x30($v0)
/* f14adfc: e4420034 */ swc1 $f2,0x34($v0)
/* f14ae00: e4420038 */ swc1 $f2,0x38($v0)
/* f14ae04: e4420040 */ swc1 $f2,0x40($v0)
/* f14ae08: e4480010 */ swc1 $f8,0x10($v0)
/* f14ae0c: e44a0044 */ swc1 $f10,0x44($v0)
/* f14ae10: 9739f940 */ lhu $t9,%lo(var8007f904+0x3c)($t9)
/* f14ae14: 904b00d4 */ lbu $t3,0xd4($v0)
/* f14ae18: 24080006 */ addiu $t0,$zero,0x6
/* f14ae1c: ac480060 */ sw $t0,0x60($v0)
/* f14ae20: 316dff7f */ andi $t5,$t3,0xff7f
/* f14ae24: 31af00bf */ andi $t7,$t5,0xbf
/* f14ae28: 2409000e */ addiu $t1,$zero,0xe
/* f14ae2c: 3c013f80 */ lui $at,0x3f80
/* f14ae30: a04d00d4 */ sb $t5,0xd4($v0)
/* f14ae34: 31e800df */ andi $t0,$t7,0xdf
/* f14ae38: 44818000 */ mtc1 $at,$f16
/* f14ae3c: ac49008c */ sw $t1,0x8c($v0)
/* f14ae40: a04f00d4 */ sb $t7,0xd4($v0)
/* f14ae44: 240a0001 */ addiu $t2,$zero,0x1
/* f14ae48: 24030003 */ addiu $v1,$zero,0x3
/* f14ae4c: a04800d4 */ sb $t0,0xd4($v0)
/* f14ae50: 35090008 */ ori $t1,$t0,0x8
/* f14ae54: ac4a0088 */ sw $t2,0x88($v0)
/* f14ae58: ac400090 */ sw $zero,0x90($v0)
/* f14ae5c: ac400064 */ sw $zero,0x64($v0)
/* f14ae60: ac4000f4 */ sw $zero,0xf4($v0)
/* f14ae64: ac400094 */ sw $zero,0x94($v0)
/* f14ae68: a04900d4 */ sb $t1,0xd4($v0)
/* f14ae6c: ac4000f8 */ sw $zero,0xf8($v0)
/* f14ae70: ac4300fc */ sw $v1,0xfc($v0)
/* f14ae74: ac430100 */ sw $v1,0x100($v0)
/* f14ae78: ac4000e0 */ sw $zero,0xe0($v0)
/* f14ae7c: ac4000e4 */ sw $zero,0xe4($v0)
/* f14ae80: ac4000e8 */ sw $zero,0xe8($v0)
/* f14ae84: ac4000ec */ sw $zero,0xec($v0)
/* f14ae88: ac4000f0 */ sw $zero,0xf0($v0)
/* f14ae8c: ac400078 */ sw $zero,0x78($v0)
/* f14ae90: ac40007c */ sw $zero,0x7c($v0)
/* f14ae94: ac59005c */ sw $t9,0x5c($v0)
/* f14ae98: 03e00008 */ jr $ra
/* f14ae9c: e4500048 */ swc1 $f16,0x48($v0)
);
// Mismatch: need to fiddle with the order of these
//void func0f14ad58(s32 index)
//{
// struct var8007f8dc *thing = &var8007f8dc[index];
//
// thing->unk000 = 0;
// thing->unk004 = 1.0f;
// thing->unk008 = 1.0f;
// thing->unk050 = 110.0f;
// thing->unk00c = 0.1f;
// thing->unk010 = 0.2f;
// thing->unk054 = 30;
// thing->unk058 = -1;
// thing->unk068 = -1;
// thing->unk06c = 0;
// thing->unk070 = 0;
// thing->unk074 = 0;
// thing->unk084 = 0;
// thing->unk024 = 1.0f;
// thing->unk028 = 1.0f;
// thing->unk03c = 1.0f;
// thing->unk014 = 0.0f;
// thing->unk018 = 0.0f;
// thing->unk01c = 0.0f;
// thing->unk020 = 0.0f;
// thing->unk02c = 0.0f;
// thing->unk030 = 0.0f;
// thing->unk034 = 0.0f;
// thing->unk038 = 0.0f;
// thing->unk040 = 0.0f;
// thing->unk044 = 30.0f;
// thing->unk060 = 6;
// thing->unk08c = 14;
// thing->unk088 = 1;
// thing->unk090 = 0;
// thing->unk064 = 0;
// thing->unk0f4 = 0;
// thing->unk094 = 0;
// thing->unk0f8 = 0;
// thing->unk0fc = 3;
// thing->unk100 = 3;
// thing->unk0e0 = 0;
// thing->unk0e4 = 0;
// thing->unk0e8 = 0;
// thing->unk0ec = 0;
// thing->unk0f0 = 0;
// thing->unk078 = 0;
// thing->unk07c = 0;
// thing->unk05c = var8007f940;
// thing->unk048 = 1.0f;
// thing->unk0d4_00 = false;
// thing->unk0d4_01 = false;
// thing->unk0d4_02 = false;
// thing->unk0d4_04 = true;
//}
bool func0f14aea0(s32 device)
{
return var8007f8dc[device].unk0d4_03;
}
void func0f14aec8(void)
{
// empty
}
void func0f14aed0(s32 device)
{
// empty
}
void func0f14aed8(void)
{
// empty
}
void func0f14aee0(void)
{
s32 i;
s32 j;
if (var800a45a0->unk484 == NULL) {
struct textureconfig tconfig;
u8 *ptr;
s32 texturesize;
s32 count = 33;
s32 totalsize;
u32 stack[2];
func0f14c7dc(&tconfig);
texturesize = align32(func0f14c814(&tconfig));
totalsize = align16(sizeof(struct textureconfig) * count);
totalsize += align16(texturesize * count);
ptr = mempAlloc(totalsize, MEMPOOL_STAGE);
var800a45a0->unk484 = (struct textureconfig *)ptr;
ptr += sizeof(struct textureconfig) * count;
for (i = 0; i < count; i++) {
func0f14c7dc(&var800a45a0->unk484[i]);
var800a45a0->unk484[i].textureptr = ptr;
ptr += texturesize;
}
for (i = 0; i < count; i++) {
func0f149c90(&var800a45a0->unk484[i]);
}
var800a45a0->unk488 = var800a45a0->unk484 + 32;
}
var800a45a0->unk37c = 0;
var800a45a0->unk470 = func0f149d58(0x4000, 1915, "camdraw.c");
var800a45a0->unk474 = func0f149d58(0x10000, 1916, "camdraw.c");
var800a45a0->unk478 = func0f149d58(0x10000, 1917, "camdraw.c");
var800a45a0->unk47c = func0f149d58(0x78, 1918, "camdraw.c");
var800a45a0->unk480 = func0f149d58(0x1000, 1919, "camdraw.c");
for (i = 0; i < 4; i++) {
struct var8007f8dc *thing = &var8007f8dc[i];
thing->unk0dc = (u32 *)var800a45a0->unk47c;
thing->unk0d8 = var800a45a0->unk480;
thing->unk07c = -1;
thing->unk078 = 0;
pak0f117150(i, thing->unk0d8);
pak0f1171b4(SAVEDEVICE_CONTROLLERPAK1, 3, 0);
func0f14aed0(i);
thing->unk094 = 0;
for (j = 0; j < ARRAYCOUNT(thing->unk098); j++) {
thing->unk098[j] = 0xff;
thing->unk0b6[j] = 0xff;
}
}
func0f14a594(0);
}
const char var7f1b6728[] = "Camera -> Cam_Start for Camera %d\n";
const char var7f1b674c[] = "Camera -> Cam_Stop\n";
const char var7f1b6760[] = "Camera -> Cam_Finish - Done\n";
const char var7f1b6780[] = "Camera ->Created a new slot - Id=%d\n";
const char var7f1b67a8[] = "Camera -> CD_DeleteSlot - Dumping slot %d\n";
void func0f14b150(void)
{
var800a45a0->unk48c = 0;
func0f14b178();
}
void func0f14b178(void)
{
s32 i;
func0f149e58(var800a45a0->unk470, 0x4000);
func0f149e58(var800a45a0->unk474, 0x10000);
func0f149e58(var800a45a0->unk478, 0x10000);
func0f149e58(var800a45a0->unk47c, 0x78);
func0f149e58(var800a45a0->unk480, 0x1000);
for (i = 0; i < 4; i++) {
struct var8007f8dc *thing = &var8007f8dc[i];
thing->unk0d4_03 = false;
thing->unk0dc = NULL;
thing->unk0d8 = 0;
}
}
void func0f14b228(struct var8007f8e0 *arg0)
{
s32 i;
arg0->unk03c = 0;
arg0->unk3f4_00 = false;
for (i = 0; i < ARRAYCOUNT(arg0->unk040); i++) {
arg0->unk040[i] = 0xff;
}
for (i = 0; i < ARRAYCOUNT(arg0->unk2fc); i++) {
arg0->unk2fc[i] = 0xff;
}
for (i = 0; i < ARRAYCOUNT(arg0->unk108); i++) {
arg0->unk108[i] = 0xff;
}
for (i = 0; i < ARRAYCOUNT(arg0->unk3d0); i++) {
arg0->unk3d0[i] = 1.0f;
}
arg0->unk036 = 3;
arg0->unk3f4_01 = false;
arg0->unk3f4_02 = true;
arg0->unk3f4_03 = false;
arg0->unk028 = 0;
arg0->unk02c = 0;
arg0->unk034 = 0;
arg0->unk030 = 1.0f;
arg0->unk3f4_04 = false;
arg0->colournum = 0;
arg0->stylenum = 0;
arg0->unk3a4 = 0;
arg0->unk3a8 = -1;
arg0->unk3ac = -1;
arg0->unk3b0 = -1;
arg0->unk3b4 = 0x10;
arg0->unk3b8 = 6;
arg0->unk3bc = 0x80;
arg0->unk3c0 = 10;
arg0->unk3c4 = 0x36;
arg0->unk3c8 = 3;
arg0->unk3cc = 0x3d;
arg0->unk3ec = 0;
arg0->unk3f0 = 0;
arg0->fileguid.fileid = 0;
arg0->fileguid.deviceserial = 0;
}
void func0f14b358(void)
{
// empty
}
void func0f14b360(s32 index)
{
struct var8007f8e0 *thing = func0f14a06c(index);
func0f14b228(thing);
func0f14b394(thing);
}
void func0f14b394(struct var8007f8e0 *arg0)
{
s32 size;
s32 i;
size = align32(func0f14c814(&arg0->unk004));
for (i = 0; i < size; i++) {
arg0->unk004.textureptr[i] = random() % 0xff;
}
size = align32(func0f14c814(&arg0->unk010));
for (i = 0; i < size; i++) {
arg0->unk010.textureptr[i] = random() % 0xff;
}
func0f14b228(arg0);
}
bool func0f14b484(s32 index)
{
struct var8007f8dc *thing = &var8007f8dc[index];
thing->unk004 = var8007f8e8 * 0.01f;
thing->unk008 = var8007f8ec * 0.01f;
thing->unk00c = var8007f8f0 * 0.01f;
thing->unk010 = var8007f8f4 * 0.01f;
thing->unk000 = var8007f8fc;
thing->unk050 = var8007f900;
thing->unk020 = thing->unk024;
thing->unk038 = thing->unk03c;
thing->unk024 = osGetCount() * 0.0000001f;
thing->unk028 = thing->unk024 - thing->unk020;
if (thing->unk028 > 15) {
thing->unk028 = 15;
}
thing->unk03c = thing->unk04c - thing->unk050;
thing->unk01c = thing->unk03c;
thing->unk018 = thing->unk03c / thing->unk028;
thing->unk014 += thing->unk03c * thing->unk028;
if (thing->unk014 > 500) {
thing->unk014 = 500;
}
if (thing->unk014 < -500) {
thing->unk014 = -500;
}
thing->unk034 = thing->unk010 * -1.0f * thing->unk018;
thing->unk02c = thing->unk008 * thing->unk01c;
thing->unk030 = thing->unk00c * thing->unk014;
thing->unk040 = -thing->unk004 * ((thing->unk010 * -1.0f * thing->unk018) + thing->unk008 * thing->unk01c + thing->unk00c * thing->unk014);
if (thing->unk000) {
if (ABS(thing->unk03c) > 10.0f) {
if (ABS(thing->unk040) >= 1.0f) {
thing->unk054 += (s32)thing->unk040;
if (thing->unk054 > 80) {
thing->unk054 = 80;
}
if (thing->unk054 < 1) {
thing->unk054 = 1;
}
thing->unk044 += thing->unk040;
if (thing->unk044 > 80) {
thing->unk044 = 80;
}
if (thing->unk044 < 1) {
thing->unk044 = 1;
}
thing->unk05c = var8007f904[thing->unk054];
if (thing->unk05c < var8007f904[1]) {
thing->unk05c = var8007f904[1];
thing->unk060--;
if (thing->unk060 < 2) {
thing->unk060 = 2;
}
} else if (thing->unk05c > var8007f904[80]) {
thing->unk05c = var8007f904[80];
thing->unk060++;
if (thing->unk060 > 10) {
thing->unk060 = 10;
}
}
thing->unk014 = 0.0f;
}
} else {
thing->unk014 = 0.0f;
}
}
if (thing->unk04c < 70 || thing->unk04c > 160) {
return false;
}
return true;
}
void func0f14b8ac(s32 index)
{
struct var8007f8dc *thing = &var8007f8dc[index];
mainOverrideVariable("kg", &var8007f8e8);
mainOverrideVariable("Kp", &var8007f8ec);
mainOverrideVariable("Ki", &var8007f8f0);
mainOverrideVariable("Kd", &var8007f8f4);
mainOverrideVariable("tInt", &var8007f8f8);
mainOverrideVariable("gocal", &var8007f8fc);
mainOverrideVariable("aim", &var8007f900);
if (thing->unk0d4_00) {
func0f14cf6c();
return;
}
func0f14a95c();
if (pak0f11d3f8(func0f14a5a4())) {
pak0f11d620(func0f14a5a4());
if (thing->unk0f8 == 0 && var8007f8dc[var800a45a0->unk000].unk0d4_04 == false) {
func0f14e790(var800a45a0->unk470);
func0f14a16c(1);
func0f14bc04();
return;
}
switch (pakGetUnk008(func0f14a5a4())) {
case 12:
func0f14a95c();
func0f14aa48();
func0f14e790(var800a45a0->unk470);
func0f14cf6c();
pak0f11e3bc(func0f14a5a4());
func0f14a16c(1);
func0f14bc04();
break;
case 1:
pak0f11d4dc(func0f14a5a4());
break;
case 11:
pak0f11d9c4(func0f14a5a4(), var800a45a0->unk470, 0, 0);
func0f14d064(index, var800a45a0->unk470);
pak0f11d478(func0f14a5a4());
if (thing->unk0f8 == 0) {
func0f14a16c(3);
func0f14bc04();
if (var8007f8dc[var800a45a0->unk000].unk0d4_04) {
struct var8007f8e0 *thing2 = func0f14a06c(-1);
thing2->unk3f4_00 = true;
}
} else {
func0f14a16c(4);
func0f14bc04();
}
if (!func0f14a8e8()) {
func0f14b484(var800a45a0->unk000);
}
break;
}
} else {
func0f14cf6c();
func0f14e7e0(var800a45a0->unk470);
func0f14a16c(3);
func0f14bc04();
}
}
const char var7f1b67f8[] = "CAM : Cam_MakeTextures\n";
void func0f14bc04(void)
{
struct var8007f8e0 *thing1 = func0f14a06c(-1);
struct var8007f8dc *thing2 = func0f14a20c();
thing1->unk3f4_02 = true;
switch (thing2->unk100) {
case 0:
break;
case 1:
thing1->unk3f4_02 = false;
func0f14d714(var800a45a0->unk470, thing1->unk01c);
break;
case 4:
func0f14d714(var800a45a0->unk470, thing1->unk01c);
break;
case 2:
func0f14d2c8(var800a45a0->unk470, thing1->unk01c);
break;
case 3:
func0f14d4f0(var800a45a0->unk470, thing1->unk01c);
break;
case 5:
func0f14ff94(thing1);
break;
}
func0f14def0(-1, 2433, "camdraw.c");
if (thing2->unk100 != 4) {
phead0f14dac0(var800a45a0->unk470, &thing1->unk010);
}
thing1->unk3f4_03 = false;
}
const char var7f1b681c[] = "pD->ReadMode = %s";
const char var7f1b6830[] = "Camera -> Getting Header Info\n";
const char var7f1b6850[] = "Camera -> Item=%d, pD->CamHeader[i]=%d\n";
const char var7f1b6878[] = "Camera -> Found %d Valid images\n";
const char var7f1b689c[] = "Camera -> Item=%d, Valid=%s, Bank=%d\n";
const char var7f1b68c4[] = "YES";
const char var7f1b68c8[] = "NO";
const char var7f1b68cc[] = "CD_TransferCurrentCacheToEditorAndExit : Player=%d, pD->CamRdImg=%d\n";
const char var7f1b6914[] = "Camera -> CD_CycleHandleRead - Need to load up the camera header\n";
const char var7f1b6958[] = "Camera -> CD_CycleHandleRead - Image %d needs loading for editor coppying on menu exit\n";
const char var7f1b69b0[] = "Camera -> CD_CycleHandleRead - Error ekCamReadModeExit2 in Null cycle\n";
const char var7f1b69f8[] = "CAMERA : COPY SLOT (%d of %s): Slot %d(%s) -> Slot %d(%s)\n";
const char var7f1b6a34[] = "ACTIVE";
const char var7f1b6a3c[] = "NULL";
const char var7f1b6a44[] = "ACTIVE";
const char var7f1b6a4c[] = "NULL";
const char var7f1b6a54[] = "RWI : Warning -> Not copying the thumbnail texture\n";
const char var7f1b6a88[] = "CD_DrawTexture : pTex=%x\n";
const char var7f1b6aa4[] = "Cam -> WARNING - Not done intensity table recalc :- No samples within threshold\n";
const char var7f1b6af8[] = "Camera -> Call to reset auto calibrate\n";
const char var7f1b6b20[] = "AC -> ekCamAutoCalStatusReset - pD->tTime = %d, pD->tTimeNxAdd = %d\n";
const char var7f1b6b68[] = "Cam 0 -> Time = %d, Target = %d, tInt = %.2f\n";
const char var7f1b6b98[] = "Cam 0 -> Too Low -> Adding Time\n";
const char var7f1b6bbc[] = "Cam 0 -> Too High -> Subbing Time\n";
const char var7f1b6be0[] = "Cam -> ekCamAutoCalStatusSettingTime - New time = %d\n";
const char var7f1b6c18[] = "%s%sAC -> Gain = %d, Target = %.2f, tInt = %.2f\n";
const char var7f1b6c4c[] = "";
const char var7f1b6c50[] = "";
const char var7f1b6c54[] = "Auto Calibrate is removing the menu message\n";
const char var7f1b6c84[] = "Auto Calibrate is shutting down\n";
const char var7f1b6ca8[] = "Cam -> Cam_BalanceSlot %d -> tZroShift = %d\n";
const char var7f1b6cd8[] = "Cam_BuildFaceTexture (slot=%d): %d of %s\n";
void func0f14bd34(s32 index)
{
struct var8007f8dc *thing = &var8007f8dc[index];
if (thing->unk080 != -1) {
pak0f1171b4(func0f14a5a4(), 3, 0);
pak0f11d540(func0f14a5a4(), thing->unk0b6[thing->unk080]);
}
}
void func0f14bdbc(s32 index)
{
struct var8007f8dc *thing = &var8007f8dc[index];
struct var8007f8e0 *thing2;
s32 i;
s32 value;
for (i = 0; i < 30; i++) {
thing->unk0dc[i] = NULL;
}
thing->unk094 = 0;
for (i = 0; i < 30; i++) {
thing->unk098[i] = 0xff;
thing->unk0b6[i] = 0xff;
}
value = var8007f8dc[index].unk0f4;
if (value == 4 || value == 5) {
thing->unk0f4 = 6;
g_MpPlayerNum = index;
menuSetBanner(-1, false);
thing2 = func0f14a06c(-1);
thing2->unk3f4_00 = false;
g_MpPlayerNum = index;
menuPopDialog();
g_MpPlayerNum = 0;
} else {
pak0f11e3bc(func0f14a5a4());
thing->unk0f4 = 0;
}
}
void func0f14bec8(s32 index)
{
struct var8007f8dc *thing = &var8007f8dc[index];
struct var8007f8e0 *thing2 = func0f14a06c(-1);
struct textureconfig *thing3;
s32 i;
if (thing->unk0f4 == 4 && thing->unk080 == thing->unk074) {
thing->unk0f4 = 5;
}
switch (thing->unk0f4) {
case 1:
pak0f11d9c4(index, NULL, thing->unk098, 0);
thing->unk0f4 = 2;
for (i = 0; i < 30; i++) {
if (thing->unk098[i] != 0xff) {
thing->unk098[i] += 2;
}
}
for (i = 0, thing->unk094 = 0; i < 30; i++) {
if (thing->unk098[i] != 0xff) {
thing->unk0b6[thing->unk094] = thing->unk098[i];
thing->unk094++;
}
}
for (i = thing->unk094; i < 30; i++) {
thing->unk0b6[i] = 0xff;
}
if (thing->unk094);
for (i = 0; i < 30; i++);
pak0f1171b4(func0f14a5a4(), 3, 0);
pak0f11d478(func0f14a5a4());
break;
case 3:
pak0f11d9c4(func0f14a5a4(), var800a45a0->unk470, 0, 1);
thing3 = &var800a45a0->unk484[thing->unk080];
func0f14a16c(2);
func0f14bc04();
func0f14c75c(thing3, &thing2->unk004);
thing->unk0dc[thing->unk080] = 1;
pak0f11d478(func0f14a5a4());
break;
case 4:
pak0f11d478(func0f14a5a4());
break;
case 5:
pak0f11d9c4(func0f14a5a4(), var800a45a0->unk470, 0, 1);
func0f14a16c(3);
func0f14bc04();
pak0f11d478(func0f14a5a4());
g_MpPlayerNum = index;
menuSetBanner(-1, false);
func0f14a678();
thing2->unk3f4_00 = true;
g_MpPlayerNum = index;
stub0f102230();
g_MpPlayerNum = 0;
thing->unk0f4 = 6;
break;
case 2:
case 6:
break;
}
}
void func0f14c1cc(s32 index)
{
struct var8007f8dc *thing = &var8007f8dc[index];
s32 count = func0f14f008(index);
s32 max = count / 2 + 1;
s32 i;
switch (thing->unk0f4) {
case 0:
pak0f1171b4(func0f14a5a4(), 0, 0);
pak0f11d5b0(func0f14a5a4());
thing->unk0f4 = 1;
break;
case 2:
thing->unk0f4 = 3;
break;
case 4:
if (thing->unk074 != thing->unk080) {
thing->unk0dc[thing->unk074] = 0;
thing->unk080 = thing->unk074;
thing->unk0f4 = 5;
func0f14bd34(index);
}
break;
case 3:
thing->unk080 = -1;
for (i = 0; i < max; i++) {
s32 a = (thing->unk074 + i) % count;
s32 b = thing->unk074 - i;
if (b < 0) {
b += count;
}
if (thing->unk0dc[a] == 0 && thing->unk0b6[a] != 0xff) {
thing->unk080 = a;
break;
}
if (thing->unk0dc[b] == 0 && thing->unk0b6[b] != 0xff) {
thing->unk080 = b;
break;
}
}
func0f14bd34(index);
break;
case 1:
case 5:
break;
}
}
void func0f14c3a4(s32 index)
{
struct var8007f8dc *thing = &var8007f8dc[index];
s32 i;
if (pak0f11d3f8(func0f14a5a4()) == 0) {
for (i = 0; i < 30; i++) {
thing->unk0dc[i] = 0;
}
for (i = 0; i < 30; i++) {
thing->unk094 = 0;
thing->unk098[i] = 0xff;
thing->unk0b6[i] = 0xff;
}
} else {
pak0f11d620(func0f14a5a4());
switch (pakGetUnk008(func0f14a5a4())) {
case 1:
func0f14c1cc(index);
break;
case 11:
func0f14bec8(index);
break;
case 12:
func0f14bdbc(index);
break;
}
}
}
void func0f14c4c0(s32 index)
{
var8007f8dc[index].unk0f4 = 4;
g_MpPlayerNum = index;
menuSetBanner(MENUBANNER_DOWNLOADINGIMAGE, false);
}
GLOBAL_ASM(
glabel func0f14c50c
/* f14c50c: 27bdffe0 */ addiu $sp,$sp,-32
/* f14c510: afa60028 */ sw $a2,0x28($sp)
/* f14c514: afb10018 */ sw $s1,0x18($sp)
/* f14c518: afb00014 */ sw $s0,0x14($sp)
/* f14c51c: 3c068008 */ lui $a2,%hi(var8007f8e0)
/* f14c520: 00808025 */ or $s0,$a0,$zero
/* f14c524: 00a08825 */ or $s1,$a1,$zero
/* f14c528: afbf001c */ sw $ra,0x1c($sp)
/* f14c52c: afa7002c */ sw $a3,0x2c($sp)
/* f14c530: 8cc6f8e0 */ lw $a2,%lo(var8007f8e0)($a2)
/* f14c534: 00001025 */ or $v0,$zero,$zero
/* f14c538: 24420001 */ addiu $v0,$v0,0x1
.L0f14c53c:
/* f14c53c: 28410016 */ slti $at,$v0,0x16
/* f14c540: 5420fffe */ bnezl $at,.L0f14c53c
/* f14c544: 24420001 */ addiu $v0,$v0,0x1
/* f14c548: 8e2203f4 */ lw $v0,0x3f4($s1)
/* f14c54c: 920c03f4 */ lbu $t4,0x3f4($s0)
/* f14c550: 02001825 */ or $v1,$s0,$zero
/* f14c554: 00027fc2 */ srl $t7,$v0,0x1f
/* f14c558: 000fc9c0 */ sll $t9,$t7,0x7
/* f14c55c: 318dff7f */ andi $t5,$t4,0xff7f
/* f14c560: 032d7025 */ or $t6,$t9,$t5
/* f14c564: a20e03f4 */ sb $t6,0x3f4($s0)
/* f14c568: 8e2f03f4 */ lw $t7,0x3f4($s1)
/* f14c56c: 00001025 */ or $v0,$zero,$zero
/* f14c570: 02202025 */ or $a0,$s1,$zero
/* f14c574: 000fc040 */ sll $t8,$t7,0x1
/* f14c578: 001867c2 */ srl $t4,$t8,0x1f
/* f14c57c: 000cc980 */ sll $t9,$t4,0x6
/* f14c580: 332d0040 */ andi $t5,$t9,0x40
/* f14c584: 31cf00bf */ andi $t7,$t6,0xbf
/* f14c588: 01afc025 */ or $t8,$t5,$t7
/* f14c58c: a21803f4 */ sb $t8,0x3f4($s0)
/* f14c590: 8e2c03f4 */ lw $t4,0x3f4($s1)
/* f14c594: 24050007 */ addiu $a1,$zero,0x7
/* f14c598: 240a003f */ addiu $t2,$zero,0x3f
/* f14c59c: 000cc880 */ sll $t9,$t4,0x2
/* f14c5a0: 001977c2 */ srl $t6,$t9,0x1f
/* f14c5a4: 000e6940 */ sll $t5,$t6,0x5
/* f14c5a8: 31af0020 */ andi $t7,$t5,0x20
/* f14c5ac: 330c00df */ andi $t4,$t8,0xdf
/* f14c5b0: 01ecc825 */ or $t9,$t7,$t4
/* f14c5b4: a21903f4 */ sb $t9,0x3f4($s0)
/* f14c5b8: 8e2e03f4 */ lw $t6,0x3f4($s1)
/* f14c5bc: 00004025 */ or $t0,$zero,$zero
/* f14c5c0: 24070fc0 */ addiu $a3,$zero,0xfc0
/* f14c5c4: 000e68c0 */ sll $t5,$t6,0x3
/* f14c5c8: 000dc7c2 */ srl $t8,$t5,0x1f
/* f14c5cc: 00187900 */ sll $t7,$t8,0x4
/* f14c5d0: 31ec0010 */ andi $t4,$t7,0x10
/* f14c5d4: 332e00ef */ andi $t6,$t9,0xef
/* f14c5d8: 018e6825 */ or $t5,$t4,$t6
/* f14c5dc: a20d03f4 */ sb $t5,0x3f4($s0)
/* f14c5e0: 8e38039c */ lw $t8,0x39c($s1)
/* f14c5e4: 240bffc0 */ addiu $t3,$zero,-64
/* f14c5e8: 24090040 */ addiu $t1,$zero,0x40
/* f14c5ec: ae18039c */ sw $t8,0x39c($s0)
/* f14c5f0: 8e2f03a0 */ lw $t7,0x3a0($s1)
/* f14c5f4: ae0f03a0 */ sw $t7,0x3a0($s0)
/* f14c5f8: 8e3903a4 */ lw $t9,0x3a4($s1)
/* f14c5fc: ae1903a4 */ sw $t9,0x3a4($s0)
/* f14c600: 8e2c03b4 */ lw $t4,0x3b4($s1)
/* f14c604: ae0c03b4 */ sw $t4,0x3b4($s0)
/* f14c608: 8e2e03b8 */ lw $t6,0x3b8($s1)
/* f14c60c: ae0e03b8 */ sw $t6,0x3b8($s0)
/* f14c610: 8e2d03bc */ lw $t5,0x3bc($s1)
/* f14c614: ae0d03bc */ sw $t5,0x3bc($s0)
/* f14c618: 8e3803c0 */ lw $t8,0x3c0($s1)
/* f14c61c: ae1803c0 */ sw $t8,0x3c0($s0)
/* f14c620: 8e2f03c4 */ lw $t7,0x3c4($s1)
/* f14c624: ae0f03c4 */ sw $t7,0x3c4($s0)
/* f14c628: 8e3903c8 */ lw $t9,0x3c8($s1)
/* f14c62c: ae1903c8 */ sw $t9,0x3c8($s0)
/* f14c630: 8e2c03cc */ lw $t4,0x3cc($s1)
/* f14c634: ae0c03cc */ sw $t4,0x3cc($s0)
/* f14c638: 8e2e03ec */ lw $t6,0x3ec($s1)
/* f14c63c: ae0e03ec */ sw $t6,0x3ec($s0)
/* f14c640: 8e2d03f0 */ lw $t5,0x3f0($s1)
/* f14c644: ae0d03f0 */ sw $t5,0x3f0($s0)
/* f14c648: 8e3803f8 */ lw $t8,0x3f8($s1)
/* f14c64c: ae1803f8 */ sw $t8,0x3f8($s0)
/* f14c650: 962f03fc */ lhu $t7,0x3fc($s1)
/* f14c654: a60f03fc */ sh $t7,0x3fc($s0)
.L0f14c658:
/* f14c658: c48403d0 */ lwc1 $f4,0x3d0($a0)
/* f14c65c: 24420001 */ addiu $v0,$v0,0x1
/* f14c660: 24630004 */ addiu $v1,$v1,0x4
/* f14c664: 24840004 */ addiu $a0,$a0,0x4
/* f14c668: 1445fffb */ bne $v0,$a1,.L0f14c658
/* f14c66c: e46403cc */ swc1 $f4,0x3cc($v1)
/* f14c670: 8e19001c */ lw $t9,0x1c($s0)
/* f14c674: 1320001a */ beqz $t9,.L0f14c6e0
.L0f14c678:
/* f14c678: 00001025 */ or $v0,$zero,$zero
/* f14c67c: 31460001 */ andi $a2,$t2,0x1
.L0f14c680:
/* f14c680: 10c00008 */ beqz $a2,.L0f14c6a4
/* f14c684: 8e05001c */ lw $a1,0x1c($s0)
/* f14c688: 304c0004 */ andi $t4,$v0,0x4
/* f14c68c: 11800003 */ beqz $t4,.L0f14c69c
/* f14c690: 24030004 */ addiu $v1,$zero,0x4
/* f14c694: 10000004 */ b .L0f14c6a8
/* f14c698: 2404fffc */ addiu $a0,$zero,-4
.L0f14c69c:
/* f14c69c: 10000002 */ b .L0f14c6a8
/* f14c6a0: 00602025 */ or $a0,$v1,$zero
.L0f14c6a4:
/* f14c6a4: 00002025 */ or $a0,$zero,$zero
.L0f14c6a8:
/* f14c6a8: 8e2e0004 */ lw $t6,0x4($s1)
/* f14c6ac: 00a8c821 */ addu $t9,$a1,$t0
/* f14c6b0: 03226021 */ addu $t4,$t9,$v0
/* f14c6b4: 008e6821 */ addu $t5,$a0,$t6
/* f14c6b8: 01a7c021 */ addu $t8,$t5,$a3
/* f14c6bc: 03027821 */ addu $t7,$t8,$v0
/* f14c6c0: 91e30000 */ lbu $v1,0x0($t7)
/* f14c6c4: 24420001 */ addiu $v0,$v0,0x1
/* f14c6c8: 1449ffed */ bne $v0,$t1,.L0f14c680
/* f14c6cc: a1830000 */ sb $v1,0x0($t4)
/* f14c6d0: 24e7ffc0 */ addiu $a3,$a3,-64
/* f14c6d4: 254affff */ addiu $t2,$t2,-1
/* f14c6d8: 1567ffe7 */ bne $t3,$a3,.L0f14c678
/* f14c6dc: 25080040 */ addiu $t0,$t0,0x40
.L0f14c6e0:
/* f14c6e0: 26040004 */ addiu $a0,$s0,0x4
/* f14c6e4: 0fc531d7 */ jal func0f14c75c
/* f14c6e8: 26250004 */ addiu $a1,$s1,0x4
/* f14c6ec: 8e0e0010 */ lw $t6,0x10($s0)
/* f14c6f0: 51c00008 */ beqzl $t6,.L0f14c714
/* f14c6f4: 8e3803f4 */ lw $t8,0x3f4($s1)
/* f14c6f8: 8e2d0010 */ lw $t5,0x10($s1)
/* f14c6fc: 26040010 */ addiu $a0,$s0,0x10
/* f14c700: 51a00004 */ beqzl $t5,.L0f14c714
/* f14c704: 8e3803f4 */ lw $t8,0x3f4($s1)
/* f14c708: 0fc531d7 */ jal func0f14c75c
/* f14c70c: 26250010 */ addiu $a1,$s1,0x10
/* f14c710: 8e3803f4 */ lw $t8,0x3f4($s1)
.L0f14c714:
/* f14c714: 00001025 */ or $v0,$zero,$zero
/* f14c718: 24030400 */ addiu $v1,$zero,0x400
/* f14c71c: 0018c8c0 */ sll $t9,$t8,0x3
/* f14c720: 0723000a */ bgezl $t9,.L0f14c74c
/* f14c724: 8fbf001c */ lw $ra,0x1c($sp)
.L0f14c728:
/* f14c728: 8e2c0020 */ lw $t4,0x20($s1)
/* f14c72c: 8e180020 */ lw $t8,0x20($s0)
/* f14c730: 01827021 */ addu $t6,$t4,$v0
/* f14c734: 91cd0000 */ lbu $t5,0x0($t6)
/* f14c738: 03027821 */ addu $t7,$t8,$v0
/* f14c73c: 24420001 */ addiu $v0,$v0,0x1
/* f14c740: 1443fff9 */ bne $v0,$v1,.L0f14c728
/* f14c744: a1ed0000 */ sb $t5,0x0($t7)
/* f14c748: 8fbf001c */ lw $ra,0x1c($sp)
.L0f14c74c:
/* f14c74c: 8fb00014 */ lw $s0,0x14($sp)
/* f14c750: 8fb10018 */ lw $s1,0x18($sp)
/* f14c754: 03e00008 */ jr $ra
/* f14c758: 27bd0020 */ addiu $sp,$sp,0x20
);
// Mismatch: Goal loads var8007f8e0 into a2 then does nothing with it.
// The below optimises it out.
//void func0f14c50c(struct var8007f8e0 *dst, struct var8007f8e0 *src, u32 line, char *file)
//{
// struct var8007f8e0 *thing = var8007f8e0;
// s32 i;
// s32 j;
// s32 row = 0;
//
// for (i = 0; i < 22; i++);
//
// dst->unk3f4_00 = src->unk3f4_00;
// dst->unk3f4_01 = src->unk3f4_01;
// dst->unk3f4_02 = src->unk3f4_02;
// dst->unk3f4_03 = src->unk3f4_03;
// dst->colournum = src->colournum;
// dst->stylenum = src->stylenum;
// dst->unk3a4 = src->unk3a4;
// dst->unk3b4 = src->unk3b4;
// dst->unk3b8 = src->unk3b8;
// dst->unk3bc = src->unk3bc;
// dst->unk3c0 = src->unk3c0;
// dst->unk3c4 = src->unk3c4;
// dst->unk3c8 = src->unk3c8;
// dst->unk3cc = src->unk3cc;
// dst->unk3ec = src->unk3ec;
// dst->unk3f0 = src->unk3f0;
//
// dst->fileguid.fileid = src->fileguid.fileid;
// dst->fileguid.deviceserial = src->fileguid.deviceserial;
//
// for (i = 0; i != 7; i++) {
// dst->unk3d0[i] = src->unk3d0[i];
// }
//
// if (dst->unk01c) {
// s32 i;
//
// for (i = 63; i != -1; i--) {
// for (j = 0; j != 64; j++) {
// s32 fudge = (i & 1) ? ((j & 4) ? -4 : 4) : 0;
//
// dst->unk01c[row * 64 + j] = src->unk004.textureptr[i * 64 + j + fudge];
// }
//
// row++;
// }
// }
//
// func0f14c75c(&dst->unk004, &src->unk004);
//
// if (dst->unk010.textureptr && src->unk010.textureptr) {
// func0f14c75c(&dst->unk010, &src->unk010);
// }
//
// if (src->unk3f4_04) {
// for (i = 0; i < 1024; i++) {
// dst->unk020[i] = src->unk020[i];
// }
// }
//}
void func0f14c75c(struct textureconfig *arg0, struct textureconfig *arg1)
{
s32 i;
u32 size = align32(func0f14c814(arg0));
align32(func0f14c814(arg1));
for (i = 0; i < size; i++) {
arg0->textureptr[i] = arg1->textureptr[i];
}
}
void func0f14c7dc(struct textureconfig *tconfig)
{
tconfig->width = 64;
tconfig->height = 64;
tconfig->level = 0;
tconfig->format = 4;
tconfig->depth = 1;
tconfig->s = 0;
tconfig->t = 1;
tconfig->unk0b = 1;
}
void func0f14c80c(void)
{
// empty
}
u32 func0f14c814(struct textureconfig *tconfig)
{
u32 size = tconfig->width * tconfig->height;
switch (tconfig->depth) {
case 0:
size >>= 1;
break;
case 2:
size *= 2;
break;
case 3:
size *= 4;
break;
case 1:
break;
}
return size;
}
Gfx *func0f14c870(Gfx *gdl, struct textureconfig *tconfig, f32 *arg2, f32 arg3, f32 arg4)
{
u32 x = (arg2[0] + 0.5f) * 4.0f;
u32 y = (arg2[1] + 0.5f) * 4.0f;
u32 width = ((arg2[0] - 0.5f) + (arg3 * tconfig->width)) * 4.0f;
u32 height = ((arg2[1] - 0.5f) + (arg3 * tconfig->height)) * 4.0f;
u32 stack;
s32 sp28 = (tconfig->height - 0.5f) * 32.0f;
gDPPipeSync(gdl++);
gDPSetTextureFilter(gdl++, G_TF_POINT);
gDPSetTexturePersp(gdl++, G_TP_NONE);
gDPSetAlphaCompare(gdl++, G_AC_NONE);
gDPSetTextureLOD(gdl++, G_TL_TILE);
gDPSetTextureConvert(gdl++, G_TC_FILT);
gDPSetCombineMode(gdl++, G_CC_MODULATEI, G_CC_MODULATEI);
texSelect(&gdl, tconfig, 1, 0, 2, 1, &var800a45a8);
gDPSetCycleType(gdl++, G_CYC_1CYCLE);
gDPSetCombineMode(gdl++, G_CC_DECALRGBA, G_CC_DECALRGBA);
gSPTextureRectangle(gdl++,
x * g_ScaleX, y,
width * g_ScaleX, height,
G_TX_RENDERTILE, 16, sp28,
(s32)(1024.0f / arg3) / g_ScaleX,
(s32)(1024.0f / arg4));
return gdl;
}
void func0f14cdb8(s32 index, u8 *arg1)
{
s32 count;
s32 i;
s32 j;
var8007f8dc[index].unk04c = 0;
count = 0;
for (i = 0x1000; i < 0x3000; i += 0x80) {
for (j = 0x20; j < 0x60; j++) {
count++;
var8007f8dc[index].unk04c += arg1[i + j];
}
}
if (count > 0) {
var8007f8dc[index].unk04c /= count;
return;
}
var8007f8dc[index].unk04c = 0;
}
void func0f14ce84(void)
{
if (pak0f11d3f8(func0f14a5a4())) {
if (pakGetUnk008(func0f14a5a4()) != 12) {
var8007f8dc[func0f14a5a4()].unk0f8 = 1;
var8007f8dc[func0f14a5a4()].unk0d4_00 = false;
func0f14a95c();
func0f14aa48();
func0f14aac4();
func0f14ab3c();
} else {
pak0f11e3bc(func0f14a5a4());
}
}
}
void func0f14cf6c(void)
{
g_MpPlayerNum = 0;
menuSetBanner(-1, false);
if (var8007f8dc[func0f14a5a4()].unk0f8) {
switch (var8007f8dc[func0f14a5a4()].unk0f8) {
case 2:
case 3:
case 4:
case 5:
case 6:
pak0f1171b4(func0f14a5a4(), 3, 0);
g_MpPlayerNum = 0;
menuSetBanner(-1, false);
break;
}
var8007f8dc[func0f14a5a4()].unk0f8 = 0;
}
}
void func0f14d064(s32 index, u8 *arg1)
{
struct var8007f8dc *thing = &var8007f8dc[index];
f32 a;
f32 b;
if (thing->unk0f8 == 1) {
thing->unk05c = 0x4000;
thing->unk064 = 0x2000;
thing->unk060 = 6;
g_MpPlayerNum = index;
menuSetBanner(MENUBANNER_CALIBRATINGCAMERA, false);
func0f14a16c(1);
pak0f1171b4(func0f14a5a4(), 1, 1);
thing->unk0f8 = 3;
return;
}
if (thing->unk0f8 == 3) {
func0f14cdb8(index, arg1);
a = thing->unk04c;
if (a > 130) {
b = a - 130;
} else {
b = -(a - 130);
}
if (b < 10 || thing->unk064 == 64) {
thing->unk0f8 = 2;
} else {
if (a < 130) {
thing->unk05c += thing->unk064;
} else {
thing->unk05c -= thing->unk064;
}
thing->unk064 >>= 1;
}
}
if (thing->unk0f8 == 2) {
func0f14cdb8(index, arg1);
if (thing->unk060 == 12 || thing->unk04c > 120) {
thing->unk0f8 = 6;
} else {
thing->unk060 += 2;
}
}
if (thing->unk0f8 == 6) {
pak0f1171b4(func0f14a5a4(), 3, 0);
thing->unk0f8 = 6;
thing->unk100 = thing->unk0fc;
g_MpPlayerNum = index;
menuSetBanner(-1, false);
pak0f1171b4(func0f14a5a4(), 3, 0);
var8007f8dc[var800a45a0->unk000].unk0d4_04 = true;
thing->unk0f8 = 0;
}
if (thing->unk0f8 == 0) {
func0f14cdb8(index, arg1);
}
}
GLOBAL_ASM(
glabel func0f14d2c8
/* f14d2c8: 27bdff70 */ addiu $sp,$sp,-144
/* f14d2cc: 3c02800a */ lui $v0,%hi(var800a45a0)
/* f14d2d0: 8c4245a0 */ lw $v0,%lo(var800a45a0)($v0)
/* f14d2d4: afb20028 */ sw $s2,0x28($sp)
/* f14d2d8: afbf002c */ sw $ra,0x2c($sp)
/* f14d2dc: afb10024 */ sw $s1,0x24($sp)
/* f14d2e0: afb00020 */ sw $s0,0x20($sp)
/* f14d2e4: afa50094 */ sw $a1,0x94($sp)
/* f14d2e8: 3c0f8008 */ lui $t7,%hi(var8007f9d8)
/* f14d2ec: 25eff9d8 */ addiu $t7,$t7,%lo(var8007f9d8)
/* f14d2f0: 00809025 */ or $s2,$a0,$zero
/* f14d2f4: 24080080 */ addiu $t0,$zero,0x80
/* f14d2f8: 25ea0024 */ addiu $t2,$t7,0x24
/* f14d2fc: 27ae0050 */ addiu $t6,$sp,0x50
/* f14d300: 8c510474 */ lw $s1,0x474($v0)
/* f14d304: 8c500478 */ lw $s0,0x478($v0)
.L0f14d308:
/* f14d308: 8de10000 */ lw $at,0x0($t7)
/* f14d30c: 25ef000c */ addiu $t7,$t7,0xc
/* f14d310: 25ce000c */ addiu $t6,$t6,0xc
/* f14d314: adc1fff4 */ sw $at,-0xc($t6)
/* f14d318: 8de1fff8 */ lw $at,-0x8($t7)
/* f14d31c: adc1fff8 */ sw $at,-0x8($t6)
/* f14d320: 8de1fffc */ lw $at,-0x4($t7)
/* f14d324: 15eafff8 */ bne $t7,$t2,.L0f14d308
/* f14d328: adc1fffc */ sw $at,-0x4($t6)
/* f14d32c: 00003825 */ or $a3,$zero,$zero
/* f14d330: 24050080 */ addiu $a1,$zero,0x80
/* f14d334: 000731c0 */ sll $a2,$a3,0x7
.L0f14d338:
/* f14d338: 00065880 */ sll $t3,$a2,0x2
/* f14d33c: 022b1821 */ addu $v1,$s1,$t3
/* f14d340: 02462021 */ addu $a0,$s2,$a2
/* f14d344: 00001025 */ or $v0,$zero,$zero
.L0f14d348:
/* f14d348: 908c0000 */ lbu $t4,0x0($a0)
/* f14d34c: 24420001 */ addiu $v0,$v0,0x1
/* f14d350: 24840001 */ addiu $a0,$a0,0x1
/* f14d354: 448c2000 */ mtc1 $t4,$f4
/* f14d358: 3c014f80 */ lui $at,0x4f80
/* f14d35c: 05810004 */ bgez $t4,.L0f14d370
/* f14d360: 468021a0 */ cvt.s.w $f6,$f4
/* f14d364: 44814000 */ mtc1 $at,$f8
/* f14d368: 00000000 */ nop
/* f14d36c: 46083180 */ add.s $f6,$f6,$f8
.L0f14d370:
/* f14d370: 24630004 */ addiu $v1,$v1,0x4
/* f14d374: 1445fff4 */ bne $v0,$a1,.L0f14d348
/* f14d378: e466fffc */ swc1 $f6,-0x4($v1)
/* f14d37c: 24e70001 */ addiu $a3,$a3,0x1
/* f14d380: 00e8082a */ slt $at,$a3,$t0
/* f14d384: 5420ffec */ bnezl $at,.L0f14d338
/* f14d388: 000731c0 */ sll $a2,$a3,0x7
/* f14d38c: 27a40050 */ addiu $a0,$sp,0x50
/* f14d390: 0fc53613 */ jal func0f14d84c
/* f14d394: 24050003 */ addiu $a1,$zero,0x3
/* f14d398: 240d0003 */ addiu $t5,$zero,0x3
/* f14d39c: afad0010 */ sw $t5,0x10($sp)
/* f14d3a0: 02202025 */ or $a0,$s1,$zero
/* f14d3a4: 02002825 */ or $a1,$s0,$zero
/* f14d3a8: 24060080 */ addiu $a2,$zero,0x80
/* f14d3ac: 0fc53636 */ jal func0f14d8d8
/* f14d3b0: 27a70050 */ addiu $a3,$sp,0x50
/* f14d3b4: 3c013e80 */ lui $at,0x3e80
/* f14d3b8: 44817000 */ mtc1 $at,$f14
/* f14d3bc: 3c01437f */ lui $at,0x437f
/* f14d3c0: 44816000 */ mtc1 $at,$f12
/* f14d3c4: 44801000 */ mtc1 $zero,$f2
/* f14d3c8: 8fa80094 */ lw $t0,0x94($sp)
/* f14d3cc: 00003825 */ or $a3,$zero,$zero
/* f14d3d0: 24093f00 */ addiu $t1,$zero,0x3f00
/* f14d3d4: 2406007e */ addiu $a2,$zero,0x7e
.L0f14d3d8:
/* f14d3d8: 00001825 */ or $v1,$zero,$zero
/* f14d3dc: 01002025 */ or $a0,$t0,$zero
/* f14d3e0: 00e02825 */ or $a1,$a3,$zero
.L0f14d3e4:
/* f14d3e4: 0005c880 */ sll $t9,$a1,0x2
/* f14d3e8: 03301021 */ addu $v0,$t9,$s0
/* f14d3ec: c44a0000 */ lwc1 $f10,0x0($v0)
/* f14d3f0: c4500004 */ lwc1 $f16,0x4($v0)
/* f14d3f4: c4440200 */ lwc1 $f4,0x200($v0)
/* f14d3f8: c4460204 */ lwc1 $f6,0x204($v0)
/* f14d3fc: 46105480 */ add.s $f18,$f10,$f16
/* f14d400: 24a50002 */ addiu $a1,$a1,0x2
/* f14d404: 24630002 */ addiu $v1,$v1,0x2
/* f14d408: 240a0001 */ addiu $t2,$zero,0x1
/* f14d40c: 46049200 */ add.s $f8,$f18,$f4
/* f14d410: 3c014f00 */ lui $at,0x4f00
/* f14d414: 46083280 */ add.s $f10,$f6,$f8
/* f14d418: 460e5002 */ mul.s $f0,$f10,$f14
/* f14d41c: 4602003c */ c.lt.s $f0,$f2
/* f14d420: 00000000 */ nop
/* f14d424: 45020003 */ bc1fl .L0f14d434
/* f14d428: 4600603c */ c.lt.s $f12,$f0
/* f14d42c: 46001006 */ mov.s $f0,$f2
/* f14d430: 4600603c */ c.lt.s $f12,$f0
.L0f14d434:
/* f14d434: 00000000 */ nop
/* f14d438: 45020003 */ bc1fl .L0f14d448
/* f14d43c: 4458f800 */ cfc1 $t8,$31
/* f14d440: 46006006 */ mov.s $f0,$f12
/* f14d444: 4458f800 */ cfc1 $t8,$31
.L0f14d448:
/* f14d448: 44caf800 */ ctc1 $t2,$31
/* f14d44c: 00000000 */ nop
/* f14d450: 46000424 */ cvt.w.s $f16,$f0
/* f14d454: 444af800 */ cfc1 $t2,$31
/* f14d458: 00000000 */ nop
/* f14d45c: 314a0078 */ andi $t2,$t2,0x78
/* f14d460: 51400013 */ beqzl $t2,.L0f14d4b0
/* f14d464: 440a8000 */ mfc1 $t2,$f16
/* f14d468: 44818000 */ mtc1 $at,$f16
/* f14d46c: 240a0001 */ addiu $t2,$zero,0x1
/* f14d470: 46100401 */ sub.s $f16,$f0,$f16
/* f14d474: 44caf800 */ ctc1 $t2,$31
/* f14d478: 00000000 */ nop
/* f14d47c: 46008424 */ cvt.w.s $f16,$f16
/* f14d480: 444af800 */ cfc1 $t2,$31
/* f14d484: 00000000 */ nop
/* f14d488: 314a0078 */ andi $t2,$t2,0x78
/* f14d48c: 15400005 */ bnez $t2,.L0f14d4a4
/* f14d490: 00000000 */ nop
/* f14d494: 440a8000 */ mfc1 $t2,$f16
/* f14d498: 3c018000 */ lui $at,0x8000
/* f14d49c: 10000007 */ b .L0f14d4bc
/* f14d4a0: 01415025 */ or $t2,$t2,$at
.L0f14d4a4:
/* f14d4a4: 10000005 */ b .L0f14d4bc
/* f14d4a8: 240affff */ addiu $t2,$zero,-1
/* f14d4ac: 440a8000 */ mfc1 $t2,$f16
.L0f14d4b0:
/* f14d4b0: 00000000 */ nop
/* f14d4b4: 0540fffb */ bltz $t2,.L0f14d4a4
/* f14d4b8: 00000000 */ nop
.L0f14d4bc:
/* f14d4bc: 44d8f800 */ ctc1 $t8,$31
/* f14d4c0: 24840001 */ addiu $a0,$a0,0x1
/* f14d4c4: 1466ffc7 */ bne $v1,$a2,.L0f14d3e4
/* f14d4c8: a08affff */ sb $t2,-0x1($a0)
/* f14d4cc: 24e70100 */ addiu $a3,$a3,0x100
/* f14d4d0: 14e9ffc1 */ bne $a3,$t1,.L0f14d3d8
/* f14d4d4: 25080040 */ addiu $t0,$t0,0x40
/* f14d4d8: 8fbf002c */ lw $ra,0x2c($sp)
/* f14d4dc: 8fb00020 */ lw $s0,0x20($sp)
/* f14d4e0: 8fb10024 */ lw $s1,0x24($sp)
/* f14d4e4: 8fb20028 */ lw $s2,0x28($sp)
/* f14d4e8: 03e00008 */ jr $ra
/* f14d4ec: 27bd0090 */ addiu $sp,$sp,0x90
);
f32 var8007f9d8 = 1;
f32 var8007f9dc = 1;
f32 var8007f9e0 = 1;
f32 var8007f9e4 = 1;
f32 var8007f9e8 = 1;
f32 var8007f9ec = 1;
f32 var8007f9f0 = 1;
f32 var8007f9f4 = 1;
f32 var8007f9f8 = 1;
// Mismatch: Regalloc and some swapped instructions
//void func0f14d2c8(u8 *arg0, u8 *arg1)
//{
// f32 *s1 = (f32 *)var800a45a0->unk474;
// f32 *s0 = (f32 *)var800a45a0->unk478;
// s32 size = 128;
// s32 i;
// s32 j;
// s32 k;
// s32 l;
// f32 sp50[] = {1, 1, 1, 1, 1, 1, 1, 1, 1};
//
// for (i = 0; i < size; i++) {
// for (j = 0; j < size; j++) {
// s1[i * size + j] = *(j + arg0 + i * size);
// }
// }
//
// func0f14d84c(sp50, 3);
// func0f14d8d8(s1, s0, 128, sp50, 3);
//
// for (k = 0; k < 63 * 64; k += 64) {
// for (l = 0; l < 63; l++) {
// f32 *ptr = &s0[k * 4 + l * 2];
// f32 f0;
//
// f0 = (ptr[0] + ptr[1] + ptr[128] + ptr[129]) / 4.0f;
//
// if (f0 < 0.0f) {
// f0 = 0.0f;
// }
//
// if (f0 > 255.0f) {
// f0 = 255.0f;
// }
//
// arg1[k + l] = f0;
// }
// }
//}
GLOBAL_ASM(
glabel func0f14d4f0
/* f14d4f0: 27bdff30 */ addiu $sp,$sp,-208
/* f14d4f4: 3c02800a */ lui $v0,%hi(var800a45a0)
/* f14d4f8: 8c4245a0 */ lw $v0,%lo(var800a45a0)($v0)
/* f14d4fc: afb20028 */ sw $s2,0x28($sp)
/* f14d500: afbf002c */ sw $ra,0x2c($sp)
/* f14d504: afb10024 */ sw $s1,0x24($sp)
/* f14d508: afb00020 */ sw $s0,0x20($sp)
/* f14d50c: afa500d4 */ sw $a1,0xd4($sp)
/* f14d510: 3c0f8008 */ lui $t7,%hi(var8007f9fc)
/* f14d514: 25eff9fc */ addiu $t7,$t7,%lo(var8007f9fc)
/* f14d518: 00809025 */ or $s2,$a0,$zero
/* f14d51c: 24080080 */ addiu $t0,$zero,0x80
/* f14d520: 25ea0060 */ addiu $t2,$t7,0x60
/* f14d524: 27ae0050 */ addiu $t6,$sp,0x50
/* f14d528: 8c510474 */ lw $s1,0x474($v0)
/* f14d52c: 8c500478 */ lw $s0,0x478($v0)
.L0f14d530:
/* f14d530: 8de10000 */ lw $at,0x0($t7)
/* f14d534: 25ef000c */ addiu $t7,$t7,0xc
/* f14d538: 25ce000c */ addiu $t6,$t6,0xc
/* f14d53c: adc1fff4 */ sw $at,-0xc($t6)
/* f14d540: 8de1fff8 */ lw $at,-0x8($t7)
/* f14d544: adc1fff8 */ sw $at,-0x8($t6)
/* f14d548: 8de1fffc */ lw $at,-0x4($t7)
/* f14d54c: 15eafff8 */ bne $t7,$t2,.L0f14d530
/* f14d550: adc1fffc */ sw $at,-0x4($t6)
/* f14d554: 8de10000 */ lw $at,0x0($t7)
/* f14d558: 00003825 */ or $a3,$zero,$zero
/* f14d55c: 24050080 */ addiu $a1,$zero,0x80
/* f14d560: adc10000 */ sw $at,0x0($t6)
/* f14d564: 000731c0 */ sll $a2,$a3,0x7
.L0f14d568:
/* f14d568: 00065880 */ sll $t3,$a2,0x2
/* f14d56c: 022b1821 */ addu $v1,$s1,$t3
/* f14d570: 02462021 */ addu $a0,$s2,$a2
/* f14d574: 00001025 */ or $v0,$zero,$zero
.L0f14d578:
/* f14d578: 908c0000 */ lbu $t4,0x0($a0)
/* f14d57c: 24420001 */ addiu $v0,$v0,0x1
/* f14d580: 24840001 */ addiu $a0,$a0,0x1
/* f14d584: 448c2000 */ mtc1 $t4,$f4
/* f14d588: 3c014f80 */ lui $at,0x4f80
/* f14d58c: 05810004 */ bgez $t4,.L0f14d5a0
/* f14d590: 468021a0 */ cvt.s.w $f6,$f4
/* f14d594: 44814000 */ mtc1 $at,$f8
/* f14d598: 00000000 */ nop
/* f14d59c: 46083180 */ add.s $f6,$f6,$f8
.L0f14d5a0:
/* f14d5a0: 24630004 */ addiu $v1,$v1,0x4
/* f14d5a4: 1445fff4 */ bne $v0,$a1,.L0f14d578
/* f14d5a8: e466fffc */ swc1 $f6,-0x4($v1)
/* f14d5ac: 24e70001 */ addiu $a3,$a3,0x1
/* f14d5b0: 00e8082a */ slt $at,$a3,$t0
/* f14d5b4: 5420ffec */ bnezl $at,.L0f14d568
/* f14d5b8: 000731c0 */ sll $a2,$a3,0x7
/* f14d5bc: 240d0005 */ addiu $t5,$zero,0x5
/* f14d5c0: afad0010 */ sw $t5,0x10($sp)
/* f14d5c4: 02202025 */ or $a0,$s1,$zero
/* f14d5c8: 02002825 */ or $a1,$s0,$zero
/* f14d5cc: 24060080 */ addiu $a2,$zero,0x80
/* f14d5d0: 0fc53636 */ jal func0f14d8d8
/* f14d5d4: 27a70050 */ addiu $a3,$sp,0x50
/* f14d5d8: 3c013e80 */ lui $at,0x3e80
/* f14d5dc: 44817000 */ mtc1 $at,$f14
/* f14d5e0: 3c01437f */ lui $at,0x437f
/* f14d5e4: 44816000 */ mtc1 $at,$f12
/* f14d5e8: 44801000 */ mtc1 $zero,$f2
/* f14d5ec: 8fa800d4 */ lw $t0,0xd4($sp)
/* f14d5f0: 00003825 */ or $a3,$zero,$zero
/* f14d5f4: 24093f00 */ addiu $t1,$zero,0x3f00
/* f14d5f8: 2406007e */ addiu $a2,$zero,0x7e
.L0f14d5fc:
/* f14d5fc: 00001825 */ or $v1,$zero,$zero
/* f14d600: 01002025 */ or $a0,$t0,$zero
/* f14d604: 00e02825 */ or $a1,$a3,$zero
.L0f14d608:
/* f14d608: 0005c880 */ sll $t9,$a1,0x2
/* f14d60c: 03301021 */ addu $v0,$t9,$s0
/* f14d610: c44a0000 */ lwc1 $f10,0x0($v0)
/* f14d614: c4500004 */ lwc1 $f16,0x4($v0)
/* f14d618: c4440200 */ lwc1 $f4,0x200($v0)
/* f14d61c: c4460204 */ lwc1 $f6,0x204($v0)
/* f14d620: 46105480 */ add.s $f18,$f10,$f16
/* f14d624: 24a50002 */ addiu $a1,$a1,0x2
/* f14d628: 24630002 */ addiu $v1,$v1,0x2
/* f14d62c: 240a0001 */ addiu $t2,$zero,0x1
/* f14d630: 46049200 */ add.s $f8,$f18,$f4
/* f14d634: 3c014f00 */ lui $at,0x4f00
/* f14d638: 46083280 */ add.s $f10,$f6,$f8
/* f14d63c: 460e5002 */ mul.s $f0,$f10,$f14
/* f14d640: 4602003c */ c.lt.s $f0,$f2
/* f14d644: 00000000 */ nop
/* f14d648: 45020003 */ bc1fl .L0f14d658
/* f14d64c: 4600603c */ c.lt.s $f12,$f0
/* f14d650: 46001006 */ mov.s $f0,$f2
/* f14d654: 4600603c */ c.lt.s $f12,$f0
.L0f14d658:
/* f14d658: 00000000 */ nop
/* f14d65c: 45020003 */ bc1fl .L0f14d66c
/* f14d660: 4458f800 */ cfc1 $t8,$31
/* f14d664: 46006006 */ mov.s $f0,$f12
/* f14d668: 4458f800 */ cfc1 $t8,$31
.L0f14d66c:
/* f14d66c: 44caf800 */ ctc1 $t2,$31
/* f14d670: 00000000 */ nop
/* f14d674: 46000424 */ cvt.w.s $f16,$f0
/* f14d678: 444af800 */ cfc1 $t2,$31
/* f14d67c: 00000000 */ nop
/* f14d680: 314a0078 */ andi $t2,$t2,0x78
/* f14d684: 51400013 */ beqzl $t2,.L0f14d6d4
/* f14d688: 440a8000 */ mfc1 $t2,$f16
/* f14d68c: 44818000 */ mtc1 $at,$f16
/* f14d690: 240a0001 */ addiu $t2,$zero,0x1
/* f14d694: 46100401 */ sub.s $f16,$f0,$f16
/* f14d698: 44caf800 */ ctc1 $t2,$31
/* f14d69c: 00000000 */ nop
/* f14d6a0: 46008424 */ cvt.w.s $f16,$f16
/* f14d6a4: 444af800 */ cfc1 $t2,$31
/* f14d6a8: 00000000 */ nop
/* f14d6ac: 314a0078 */ andi $t2,$t2,0x78
/* f14d6b0: 15400005 */ bnez $t2,.L0f14d6c8
/* f14d6b4: 00000000 */ nop
/* f14d6b8: 440a8000 */ mfc1 $t2,$f16
/* f14d6bc: 3c018000 */ lui $at,0x8000
/* f14d6c0: 10000007 */ b .L0f14d6e0
/* f14d6c4: 01415025 */ or $t2,$t2,$at
.L0f14d6c8:
/* f14d6c8: 10000005 */ b .L0f14d6e0
/* f14d6cc: 240affff */ addiu $t2,$zero,-1
/* f14d6d0: 440a8000 */ mfc1 $t2,$f16
.L0f14d6d4:
/* f14d6d4: 00000000 */ nop
/* f14d6d8: 0540fffb */ bltz $t2,.L0f14d6c8
/* f14d6dc: 00000000 */ nop
.L0f14d6e0:
/* f14d6e0: 44d8f800 */ ctc1 $t8,$31
/* f14d6e4: 24840001 */ addiu $a0,$a0,0x1
/* f14d6e8: 1466ffc7 */ bne $v1,$a2,.L0f14d608
/* f14d6ec: a08affff */ sb $t2,-0x1($a0)
/* f14d6f0: 24e70100 */ addiu $a3,$a3,0x100
/* f14d6f4: 14e9ffc1 */ bne $a3,$t1,.L0f14d5fc
/* f14d6f8: 25080040 */ addiu $t0,$t0,0x40
/* f14d6fc: 8fbf002c */ lw $ra,0x2c($sp)
/* f14d700: 8fb00020 */ lw $s0,0x20($sp)
/* f14d704: 8fb10024 */ lw $s1,0x24($sp)
/* f14d708: 8fb20028 */ lw $s2,0x28($sp)
/* f14d70c: 03e00008 */ jr $ra
/* f14d710: 27bd00d0 */ addiu $sp,$sp,0xd0
);
u32 var8007f9fc = 0x3b42938e;
u32 var8007fa00 = 0x3c5a0169;
u32 var8007fa04 = 0x3cb3b752;
u32 var8007fa08 = 0x3c5a0169;
u32 var8007fa0c = 0x3b42938e;
u32 var8007fa10 = 0x3c5a0169;
u32 var8007fa14 = 0x3d7442c8;
u32 var8007fa18 = 0x3dc95bff;
u32 var8007fa1c = 0x3d7442c8;
u32 var8007fa20 = 0x3c5a0169;
u32 var8007fa24 = 0x3cb3b752;
u32 var8007fa28 = 0x3dc95bff;
u32 var8007fa2c = 0x3e25fe54;
u32 var8007fa30 = 0x3dc95bff;
u32 var8007fa34 = 0x3cb3b752;
u32 var8007fa38 = 0x3c5a0169;
u32 var8007fa3c = 0x3d7442c8;
u32 var8007fa40 = 0x3dc95bff;
u32 var8007fa44 = 0x3d7442c8;
u32 var8007fa48 = 0x3c5a0169;
u32 var8007fa4c = 0x3b42938e;
u32 var8007fa50 = 0x3c5a0169;
u32 var8007fa54 = 0x3cb3b752;
u32 var8007fa58 = 0x3c5a0169;
u32 var8007fa5c = 0x3b42938e;
// Mismatch: Different codegen. The function is generating a 64x64 thumbnail
// from a 128x128 source, and there's lots of different ways that variables can
// be used to do this.
//void func0f14d4f0(u8 *arg0, u8 *arg1)
//{
// f32 *s1 = (f32 *) var800a45a0->unk474;
// f32 *s0 = (f32 *) var800a45a0->unk478;
// s32 i;
// s32 j;
// s32 x;
// s32 y;
//
// f32 sp50[] = {
// 0.0029690000228584f,
// 0.013306000269949f,
// 0.021937999874353f,
// 0.013306000269949f,
// 0.0029690000228584f,
// 0.013306000269949f,
// 0.059634000062943f,
// 0.098319999873638f,
// 0.059634000062943f,
// 0.013306000269949f,
// 0.021937999874353f,
// 0.098319999873638f,
// 0.16210299730301f,
// 0.098319999873638f,
// 0.021937999874353f,
// 0.013306000269949f,
// 0.059634000062943f,
// 0.098319999873638f,
// 0.059634000062943f,
// 0.013306000269949f,
// 0.0029690000228584f,
// 0.013306000269949f,
// 0.021937999874353f,
// 0.013306000269949f,
// 0.0029690000228584f,
// };
//
// for (i = 0; i < 128; i++) {
// for (j = 0; j < 128; j++) {
// s1[i * 128 + j] = arg0[i * 128 + j];
// }
// }
//
// func0f14d8d8(s1, s0, 128, sp50, 5);
//
// for (y = 0; y < 63; y++) {
// for (x = 0; x < 63; x++) {
// f32 value = (
// s0[y * 2 * 128 + x * 2 + 0] +
// s0[y * 2 * 128 + x * 2 + 1] +
// s0[y * 2 * 128 + x * 2 + 128] +
// s0[y * 2 * 128 + x * 2 + 129]) * 0.25f;
//
// if (value < 0.0f) {
// value = 0.0f;
// }
//
// if (value > 255.0f) {
// value = 255.0f;
// }
//
// arg1[y * 64 + x] = value;
// }
// }
//}
void func0f14d714(u8 *arg0, u8 *arg1)
{
s32 x;
s32 y;
for (y = 0; y < 63; y++) {
for (x = 0; x < 63; x++) {
f32 value = (arg0[y * 256 + x * 2]
+ arg0[y * 256 + x * 2 + 1]
+ arg0[y * 256 + x * 2 + 0x80]
+ arg0[y * 256 + x * 2 + 0x81]) * 0.25f;
if (value < 0.0f) {
value = 0.0f;
}
if (value > 255.0f) {
value = 255.0f;
}
arg1[y * 64 + x] = value;
}
}
}
void func0f14d84c(f32 *arg0, s32 arg1)
{
f32 sum = 0;
s32 len = arg1 * arg1;
f32 mult;
s32 i;
for (i = 0; i < len; i++) {
sum += arg0[i];
}
mult = 1 / sum;
for (i = 0; i < len; i++) {
arg0[i] *= mult;
}
}
void func0f14d8d8(f32 *arg0, f32 *arg1, s32 arg2, f32 *arg3, s32 arg4)
{
s32 t0 = arg4 / 2;
s32 t1 = t0 + 1;
s32 v0 = arg2 - 1;
s32 a3 = -t0;
s32 i;
s32 j;
s32 k;
s32 l;
f32 sp5c[19][19];
s32 m;
s32 n;
for (i = 0; i < arg4; i++) {
for (j = 0; j < arg4; j++) {
sp5c[i][j] = arg3[i * arg4 + j];
}
}
for (k = 0; k < arg2; k++) {
for (l = 0; l < arg2; l++) {
f32 f0 = 0.0f;
for (m = a3; m < t1; m++) {
s32 t5 = k + m;
if (t5 > v0) {
t5 = v0;
}
if (t5 < 0) {
t5 = 0;
}
for (n = a3; n < t1; n++) {
s32 s2 = l + n;
if (s2 > v0) {
s2 = v0;
}
if (s2 < 0) {
s2 = 0;
}
f0 += sp5c[m + t0][n + t0] * arg0[t5 * arg2 + s2];
}
}
arg1[k * arg2 + l] = f0;
}
}
}
void phead0f14dac0(u8 *arg0, struct textureconfig *arg1)
{
s32 i;
s32 j;
s32 k;
s32 l;
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
f32 f12 = 0.0f;
for (k = 0; k < 8; k++) {
for (l = 0; l < 8; l++) {
f12 += arg0[(i * 8 + l) * 128 + j * 8 + k];
}
}
f12 *= 0.015625f;
if (f12 > 255.0f) {
f12 = 255.0f;
}
f12 *= 0.0625f;
if (arg1 != NULL) {
func0f14e884(arg1, 15 - i, j, f12);
}
}
}
}
void func0f14dc30(s32 index, bool arg1)
{
f32 f26 = func0f14a984() - 128;
s32 sp80;
s32 sp7c;
s32 y;
s32 j;
struct var8007f8e0 *thing = func0f14a06c(index);
f32 f22;
f22 = thing->unk3f4_02 ? func0f14e4ac(0, &sp80, &sp7c) : 0.0f;
for (y = 0; y < 64; y++) {
for (j = 0; j < 64; j++) {
f32 f14 = thing->unk01c[y * 64 + j];
f32 f12;
f32 f2;
if (arg1 && thing->unk3f4_02 && sp7c) {
f32 f0 = sp80 - j;
f32 fVar8 = f0 > 0.0f ? f0 : -f0;
f12 = fVar8 / sp7c;
if (f12 > 1.0f) {
f12 = 1.0f;
}
f2 = f22 * f12;
if (j > sp80) {
f2 *= -1.0f;
}
f2 *= var8007f8dc->unk088;
} else {
f2 = 0.0f;
}
f12 = f14 + f2 + f26;
if (f12 < 0.0f) {
f12 = 0.0f;
}
if (f12 > 255.0f) {
f12 = 255.0f;
}
thing->unk004.textureptr[(u32)(63 - y) * 64 + j + (((u32)(63 - y) & 1) ? ((j & 4) ? -4 : 4) : 0)] = f12;
}
}
}
void func0f14def0(s32 index, u32 line, char *file)
{
struct var8007f8e0 *a = func0f14a06c(-1);
struct var8007f8e0 *b = (index != -1 ? func0f14a06c(index) : NULL);
struct var8007f8e0 *c = func0f14a06c(-4);
struct var8007f8e0 *d = func0f14a06c(-5);
func0f14c50c(d, a, 3508, "camdraw.c");
func0f14dc30(-1, false);
if (b != NULL) {
func0f14e1c4(b);
}
func0f14dc30(-5, true);
func0f14e1c4(d);
func0f14c50c(c, d, 3519, "camdraw.c");
}
const char var7f1b6d1c[] = "Cam %d -> Balance : No Data Available\n";
s32 func0f14dfc0(struct var8007f8e0 *arg0, s32 arg1, s32 arg2)
{
u32 sp3c[5];
u32 sp28[5];
s32 i;
s32 j;
s32 len;
sp28[0] = *(arg0->unk004.textureptr + arg2 * 64 + ((arg2 & 1) ? ((arg1 & 4) ? -4 : 4) : 0) + arg1);
sp28[1] = *(arg0->unk004.textureptr + (arg2 - 1) * 64 + (((arg2 - 1) & 1) ? ((arg1 & 4) ? -4 : 4) : 0) + arg1);
sp28[2] = *(arg0->unk004.textureptr + arg2 * 64 + ((arg2 & 1) ? (((arg1 - 1) & 4) ? -4 : 4) : 0) + arg1 - 1);
sp28[3] = *(arg0->unk004.textureptr + (arg2 + 1) * 64 + (((arg2 + 1) & 1) ? ((arg1 & 4) ? -4 : 4) : 0) + arg1);
sp28[4] = *(arg0->unk004.textureptr + arg2 * 64 + ((arg2 & 1) ? (((arg1 + 1) & 4) ? -4 : 4) : 0) + arg1 + 1);
len = 0;
for (i = 0; i < 5; i++) {
s32 bestvalue = 9999;
s32 bestindex = -1;
for (j = 0; j < 5; j++) {
if (sp28[j] < bestvalue) {
bestindex = j;
bestvalue = sp28[j];
}
}
if (bestindex != -1) {
sp3c[len] = sp28[bestindex];
len++;
sp28[bestindex] = 99999;
}
}
return (sp3c[1] + sp3c[2] + sp3c[3]) / 3;
}
void func0f14e1c4(struct var8007f8e0 *arg0)
{
s32 spbc;
s32 spb8;
s32 spb4;
s32 spb0;
s32 mid1;
s32 mid2;
f32 f26;
s32 a;
s32 b;
s32 value1;
s32 value2;
f32 f22;
f32 f20;
s32 i;
func0f14ecd8(&spbc, &spb8, &spb4, &spb0);
mid1 = (u32) (spb0 + spb8) >> 1;
mid2 = (u32) (spb4 + spbc) >> 1;
f26 = (f32) (spb4 - spbc);
a = mid2 - (u32)(f26 * 0.25f);
b = (u32)(f26 * 0.25f) + mid2;
value1 = func0f14dfc0(arg0, a, mid1);
value2 = func0f14dfc0(arg0, b, mid1);
f22 = f26 * 0.5f;
for (f20 = 0.0f; f20 < f22; f20 += 1.0f) {
s32 size = f22 - sqrtf(2.0f * f22 * f20 - f20 * f20);
s32 y1 = ((s32)f20 + spb8);
s32 y2 = (spb0 - (s32)f20);
for (i = 0; i < size; i++) {
s32 x1 = spbc + i;
s32 x2 = spb4 - i;
arg0->unk004.textureptr[y1 * 64 + x1 + ((y1 & 1) ? ((x1 & 4) ? -4 : 4) : 0)] = value1;
arg0->unk004.textureptr[y2 * 64 + x1 + ((y2 & 1) ? ((x1 & 4) ? -4 : 4) : 0)] = value1;
arg0->unk004.textureptr[y1 * 64 + x2 + ((y1 & 1) ? ((x2 & 4) ? -4 : 4) : 0)] = value2;
arg0->unk004.textureptr[y2 * 64 + x2 + ((y2 & 1) ? ((x2 & 4) ? -4 : 4) : 0)] = value2;
}
}
}
f32 func0f14e4ac(s32 arg0, s32 *arg1, s32 *arg2)
{
struct var8007f8e0 *spa4 = func0f14a06c(-1);
s32 i;
s32 j;
s32 sp98;
s32 sp94;
s32 sp90;
s32 sp8c;
s32 range;
s32 count1;
s32 count2;
f32 sum1;
f32 sum2;
s32 avg1;
s32 avg2;
s32 upper1;
s32 upper2;
s32 lower1;
s32 lower2;
s32 halfdiff1;
s32 halfdiff2;
f32 result;
func0f14ecd8(&sp98, &sp94, &sp90, &sp8c);
if (arg1 != NULL) {
*arg1 = 0;
}
count1 = 0;
count2 = 0;
sum1 = 0.0f;
if (arg2 != NULL) {
*arg2 = 0;
}
sum2 = 0.0f;
range = sp90 - sp98;
if (range < 32) {
lower1 = ((sp90 + sp98) >> 1) - 16;
if (lower1 < 0) {
lower1 = 0;
}
upper1 = lower1 + 32;
} else {
lower1 = ((sp90 + sp98) >> 1) - (range >> 1);
upper1 = lower1 + range;
}
range = sp8c - sp94;
if (range < 32) {
lower2 = ((sp8c + sp94) >> 1) - 16;
if (lower2 < 0) {
lower2 = 0;
}
upper2 = lower2 + 32;
} else {
lower2 = ((sp8c + sp94) >> 1) - (range >> 1);
upper2 = lower2 + range;
}
halfdiff1 = (upper1 - lower1) >> 1;
halfdiff2 = (upper2 - lower2) >> 1;
for (i = 0; i < halfdiff2; i++) {
s32 start = halfdiff1 - 16;
if (start < 0) {
start = 0;
}
avg1 = (lower1 + upper1) >> 1;
avg2 = (lower2 + upper2) >> 1;
for (j = start; j < halfdiff1; j++) {
u8 value1 = spa4->unk01c[(avg2 - i) * 64 + avg1 - j];
u8 value2 = spa4->unk01c[(avg2 + i) * 64 + avg1 + j];
if (value1 >= 21 && value1 < 200 && value2 >= 21 && value2 < 200) {
sum1 += value1;
sum2 += value2;
count1++;
count2++;
}
}
}
if (count1 != 0 && count2 != 0) {
sum1 *= 1.0f / count1;
sum2 *= 1.0f / count2;
if (arg1 != NULL) {
*arg1 = (lower1 + upper1) >> 1;
}
if (arg2 != NULL) {
*arg2 = halfdiff1;
}
result = (sum1 + sum2) * 0.5f - sum1;
if (1);
var8007f8dc[arg0].unk090 = result;
return result;
}
return 0.0f;
}
void func0f14e790(u8 *arg0)
{
s32 i;
s32 j;
for (i = 0; i < 128; i++) {
for (j = 0; j < 128; j++) {
arg0[i * 128 + j] = j / 16 * 32;
}
}
}
void func0f14e7e0(u8 *arg0)
{
s32 i;
s32 j;
for (i = 0; i < 128; i++) {
for (j = 0; j < 128; j++) {
arg0[i * 128 + j] = random() % 255;
}
}
}
void func0f14e884(struct textureconfig *tconfig, s32 numrows, s32 arg2, u64 arg3)
{
s32 sp5c;
s32 numbytes;
s32 bitsperpixel;
u32 stack;
s32 pixelsperdword;
s64 sp40;
s64 mask;
s64 *sp34;
switch (tconfig->depth) {
case G_IM_SIZ_4b:
pixelsperdword = 16;
mask = 0xf;
sp5c = arg2 >> 1;
bitsperpixel = 4;
numbytes = (tconfig->width >> 1) * numrows;
break;
case G_IM_SIZ_8b:
pixelsperdword = 8;
mask = 0xff;
sp5c = arg2;
bitsperpixel = 8;
numbytes = tconfig->width * numrows;
break;
case G_IM_SIZ_16b:
pixelsperdword = 4;
mask = 0xffff;
sp5c = arg2 * 2;
bitsperpixel = 16;
numbytes = tconfig->width * 2 * numrows;
break;
case G_IM_SIZ_32b:
pixelsperdword = 2;
mask = 0xffffffff;
sp5c = arg2 * 4;
bitsperpixel = 32;
numbytes = tconfig->width * 4 * numrows;
break;
}
sp40 = ((arg2 % pixelsperdword) * bitsperpixel);
sp40 = (0x40 - sp40 - bitsperpixel) & 0x3f;
if (numrows & 1) {
sp40 = (sp40 + 0x20) & 0x3f;
}
sp34 = (s64 *)(tconfig->textureptr + ((sp5c >> 3) + (numbytes >> 3)) * 8);
*sp34 = (*sp34 & ~(mask << sp40)) + (arg3 << sp40);
}
Gfx *func0f14eb04(Gfx *gdl, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5)
{
f32 sp30[2];
struct var8007f8e0 *thing;
u32 stack[2];
sp30[0] = arg2;
sp30[1] = arg3;
thing = func0f14a06c(arg1);
gdl = func0f14c870(gdl, &thing->unk004, sp30, (arg4 - arg2) * 0.015625f, (arg5 - arg3) * 0.015625f);
return gdl;
}
Gfx *func0f14eb98(Gfx *gdl, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5)
{
f32 sp30[2];
struct var8007f8e0 *thing;
u32 stack[2];
sp30[0] = arg2;
sp30[1] = arg3;
thing = func0f14a06c(arg1);
gdl = func0f14c870(gdl, &thing->unk010, sp30, (arg4 - arg2) * 0.0625f, (arg5 - arg3) * 0.0625f);
return gdl;
}
void func0f14ec2c(u32 arg0, u32 arg1, u32 arg2, u32 arg3)
{
struct var8007f8e0 *thing1 = func0f14a06c(-1);
struct var8007f8e0 *thing2 = func0f14a06c(-2);
if (thing1) {
thing1->unk3c0 = arg0;
thing1->unk3c8 = arg1;
thing1->unk3c4 = arg2;
thing1->unk3cc = arg3;
thing1->unk3ec = 0;
thing1->unk3f0 = 0;
}
if (thing2) {
thing2->unk3c0 = arg0;
thing2->unk3c8 = arg1;
thing2->unk3c4 = arg2;
thing2->unk3cc = arg3;
thing2->unk3ec = 0;
thing2->unk3f0 = 0;
}
func0f14def0(-1, 4159, "camdraw.c");
}
const char var7f1b6d50[] = "Cam_SetSquashZ : %u, %u, %f\n";
void func0f14ecd8(s32 *arg0, s32 *arg1, s32 *arg2, s32 *arg3)
{
struct var8007f8e0 *thing = func0f14a06c(-2);
*arg0 = thing->unk3c0;
*arg1 = thing->unk3c8;
*arg2 = thing->unk3c4;
*arg3 = thing->unk3cc;
}
void func0f14ed38(void)
{
func0f14ec2c(10, 3, 54, 61);
}
u32 func0f14ed64(void)
{
f32 foo[7];
func0f14ef50(foo);
return (u32)(foo[6] * 100) - 25;
}
void func0f14ee18(u32 arg0)
{
f32 foo[7];
arg0 += 25;
func0f14ef50(foo);
foo[6] = arg0 * 0.01f;
if (foo[6] > 1.9f) {
foo[6] = 1.9f;
}
if (foo[6] < 0.1f) {
foo[6] = 0.1f;
}
func0f14eeb0(foo);
}
// @bug? Nothing is done with tmp
void func0f14eeb0(f32 *arg0)
{
struct var8007f8e0 *thing1 = func0f14a06c(-1);
struct var8007f8e0 *thing2 = func0f14a06c(-2);
s32 i;
for (i = 0; i < 7; i++) {
f32 tmp = arg0[i];
if (tmp > 1.9f) {
tmp = 1.9f;
}
if (tmp < 0.1f) {
tmp = 0.1f;
}
if (thing1) {
thing1->unk3d0[i] = arg0[i];
}
if (thing2) {
thing2->unk3d0[i] = arg0[i];
}
}
func0f14def0(-1, 4240, "camdraw.c");
}
void func0f14ef50(f32 *arg0)
{
s32 i;
for (i = 0; i < 7; i++) {
struct var8007f8e0 *thing = func0f14a06c(-2);
arg0[i] = thing->unk3d0[i];
}
}
const char var7f1b6d7c[] = "Cam : Alloc for copy of Vtx %d bytes\n";
const char var7f1b6da4[] = "CAM : Cam_AllocAndCopyAllVtx -> Ptr all-ready allocted - No extra needed\n";
void func0f14efa8(void)
{
f32 array[] = {1, 1, 1, 1, 1, 1, 1};
func0f14eeb0(array);
}
s32 func0f14f008(s32 index)
{
if (index == -1) {
index = var800a45a0->unk000;
}
return var8007f8dc[index].unk094;
}
void func0f14f03c(s32 index, s32 value)
{
var8007f8dc[index].unk074 = value;
}
s32 func0f14f05c(s32 index)
{
return var8007f8dc[index].unk074;
}
Gfx *func0f14f07c(Gfx *gdl, s32 headorbodynum, s32 x1, s32 y1, s32 x2, s32 y2)
{
struct textureconfig *thing = &var800a45a0->unk484[headorbodynum];
f32 sp34[2];
u32 stack;
sp34[0] = x1;
sp34[1] = y1;
if (func0f14a20c()->unk0b6[headorbodynum] != 0xff) {
if (func0f14a20c()->unk0dc[headorbodynum] == 0) {
gdl = func0f14c870(gdl, var800a45a0->unk488, sp34,
(x2 - x1) * (1.0f / 64.0f),
(y2 - y1) * (1.0f / 64.0f));
} else {
gdl = func0f14c870(gdl, thing, sp34,
(x2 - x1) * (1.0f / 64.0f),
(y2 - y1) * (1.0f / 64.0f));
}
}
return gdl;
}
/**
* Calculate the bounding box of the src coordinates and store it in dst.
*
* Note that each element in src is 12 bytes
* but only the first 6 are coordinates.
*/
void func0f14f1d4(s16 *src, s32 len, s32 *dst)
{
s32 i;
if (len > 0) {
dst[0] = dst[3] = src[0];
dst[1] = dst[4] = src[1];
dst[2] = dst[5] = src[2];
for (i = 1; i < len; i++) {
if (src[i * 6] > dst[3]) {
dst[3] = src[i * 6];
} else if (src[i * 6] < dst[0]) {
dst[0] = src[i * 6];
}
if (src[i * 6 + 1] > dst[4]) {
dst[4] = src[i * 6 + 1];
} else if (src[i * 6 + 1] < dst[1]) {
dst[1] = src[i * 6 + 1];
}
if (src[i * 6 + 2] > dst[5]) {
dst[5] = src[i * 6 + 2];
} else if (src[i * 6 + 2] < dst[2]) {
dst[2] = src[i * 6 + 2];
}
}
}
}
s32 func0f14f2b4(struct modelfiledata *filedata, struct gfxvtx **dst, u32 *len)
{
struct modelnode *node1 = modelGetPart(filedata, MODELPART_HEAD_0190);
struct modelnode *node2 = modelGetPart(filedata, MODELPART_HEAD_0191);
struct modelnode *node3 = modelGetPart(filedata, MODELPART_HEAD_0192);
s32 totalverts = 0;
if (len != NULL) {
*len = 0;
}
if (node1 && node2 && node3) {
struct modelrodata_dl *node1rodata = &node1->rodata->dl;
struct modelrodata_dl *node2rodata = &node2->rodata->dl;
struct modelrodata_dl *node3rodata = &node3->rodata->dl;
s32 node1numverts = node1rodata->numvertices;
s32 node2numverts = node2rodata->numvertices;
s32 node3numverts = node3rodata->numvertices;
s32 size;
totalverts = node1numverts + node2numverts + node3numverts;
size = align16(totalverts * sizeof(struct gfxvtx));
if (*dst == 0) {
*dst = func0f149d58(size, 4429, "camdraw.c");
}
memcpy(*dst, node1rodata->vertices, node1numverts * sizeof(struct gfxvtx));
memcpy(*dst + node1numverts, node2rodata->vertices, node2numverts * sizeof(struct gfxvtx));
memcpy(*dst + node1numverts + node2numverts, node3rodata->vertices, node3numverts * sizeof(struct gfxvtx));
if (len != NULL) {
*len = size;
}
}
return totalverts;
}
const char var7f1b6dfc[] = "Cam_RebuildHead : Slot=%d\n";
const char var7f1b6e18[] = "Cam -> Cam_ColourHeadOnePart - Remapping %s\n";
const char var7f1b6e48[] = "Cam_ColourHead : Face Col = %u, Hair Col = %u\n";
const char var7f1b6e78[] = "FACE";
const char var7f1b6e80[] = "SIDE";
const char var7f1b6e88[] = "HAIR";
const char var7f1b6e90[] = "Cam -> Cam_SquashOnePart - pExtents=%08x, pVcopy=%08x, \n";
const char var7f1b6ecc[] = "Cam -> Cam_SquashOnePart - Head centre at (%d,%d,%d)\n";
const char var7f1b6f04[] = "Cam -> Cam_SquashOnePart - Scale Param 1 = %s%s%.3f\n";
const char var7f1b6f3c[] = "";
const char var7f1b6f40[] = "";
const char var7f1b6f44[] = "Cam -> Cam_SquashOnePart - Scale Param 2 = %s%s%.3f\n";
const char var7f1b6f7c[] = "";
const char var7f1b6f80[] = "";
const char var7f1b6f84[] = "Cam -> Cam_SquashOnePart - Scale Param 3 = %s%s%.3f\n";
const char var7f1b6fbc[] = "";
const char var7f1b6fc0[] = "";
const char var7f1b6fc4[] = "Cam -> Cam_SquashOnePart - Scale Param 4 = %s%s%.3f\n";
const char var7f1b6ffc[] = "";
const char var7f1b7000[] = "";
const char var7f1b7004[] = "Cam -> Cam_SquashOnePart - Scale Param 5 = %s%s%.3f\n";
const char var7f1b703c[] = "";
const char var7f1b7040[] = "";
const char var7f1b7044[] = "Cam -> Cam_SquashOnePart - Scale Param 6 = %s%s%.3f\n";
const char var7f1b707c[] = "";
const char var7f1b7080[] = "";
const char var7f1b7084[] = "Cam -> Cam_SquashOnePart - Scale Param 7 = %s%s%.3f\n";
const char var7f1b70bc[] = "";
const char var7f1b70c0[] = "";
const char var7f1b70c4[] = "Cam_DctInitialise_Read -> %x\n";
const char var7f1b70e4[] = "Cam_DctUnCompressSlot -> %x\n";
const char var7f1b7104[] = "Cam_LoadFromPakIntoSlot -> Pak=%d, fileGuid=%u, pakGuid=%u, Slot=%d, pS=%x, pE=%x\n";
void func0f14f444(u32 arg0, u32 arg1, u32 arg2, u32 arg3)
{
// empty
}
void func0f14f458(void)
{
// empty
}
void func0f14f460(void)
{
// empty
}
void func0f14f468(void)
{
// empty
}
void func0f14f470(void)
{
// empty
}
void func0f14f478(void)
{
// empty
}
void func0f14f480(void)
{
// empty
}
void func0f14f488(void)
{
// empty
}
void func0f14f490(void)
{
// empty
}
void func0f14f498(void)
{
// empty
}
u32 func0f14f4a0(u32 arg0)
{
return arg0;
}
void func0f14f4a8(void)
{
// empty
}
void func0f14f4b0(u32 arg0)
{
// empty
}
void func0f14f4b8(struct var8007f8e0 *arg0)
{
s32 i;
arg0->unk028 = 0;
arg0->unk02c = 0;
for (i = 0; i < 64 * 64; i++) {
arg0->unk01c[i] = 0;
}
}
void func0f14f4e4(struct var8007f8e0 *arg0)
{
s32 i;
arg0->unk028 = 0;
arg0->unk02c = 0;
for (i = 0; i < 64 * 64; i++) {
arg0->unk024[i] = 0;
}
}
GLOBAL_ASM(
glabel func0f14f510
.late_rodata
glabel var7f1b7364
.word 0x40490fda
.text
/* f14f510: 27bdffa0 */ addiu $sp,$sp,-96
/* f14f514: afb40050 */ sw $s4,0x50($sp)
/* f14f518: afb3004c */ sw $s3,0x4c($sp)
/* f14f51c: 3c14800a */ lui $s4,%hi(var800a45a0)
/* f14f520: afbf005c */ sw $ra,0x5c($sp)
/* f14f524: afb60058 */ sw $s6,0x58($sp)
/* f14f528: afb50054 */ sw $s5,0x54($sp)
/* f14f52c: afb20048 */ sw $s2,0x48($sp)
/* f14f530: afb10044 */ sw $s1,0x44($sp)
/* f14f534: afb00040 */ sw $s0,0x40($sp)
/* f14f538: f7bc0038 */ sdc1 $f28,0x38($sp)
/* f14f53c: f7ba0030 */ sdc1 $f26,0x30($sp)
/* f14f540: f7b80028 */ sdc1 $f24,0x28($sp)
/* f14f544: f7b60020 */ sdc1 $f22,0x20($sp)
/* f14f548: f7b40018 */ sdc1 $f20,0x18($sp)
/* f14f54c: 269445a0 */ addiu $s4,$s4,%lo(var800a45a0)
/* f14f550: 00009825 */ or $s3,$zero,$zero
/* f14f554: 266e0001 */ addiu $t6,$s3,0x1
.L0f14f558:
/* f14f558: 01c40019 */ multu $t6,$a0
/* f14f55c: 00008825 */ or $s1,$zero,$zero
/* f14f560: 00008025 */ or $s0,$zero,$zero
/* f14f564: 00001012 */ mflo $v0
/* f14f568: 24420001 */ addiu $v0,$v0,0x1
/* f14f56c: 00000000 */ nop
.L0f14f570:
/* f14f570: 8e8f0000 */ lw $t7,0x0($s4)
/* f14f574: 0013c140 */ sll $t8,$s3,0x5
/* f14f578: 26310001 */ addiu $s1,$s1,0x1
/* f14f57c: 01f8c821 */ addu $t9,$t7,$t8
/* f14f580: 03304021 */ addu $t0,$t9,$s0
/* f14f584: 2a210008 */ slti $at,$s1,0x8
/* f14f588: ad02006c */ sw $v0,0x6c($t0)
/* f14f58c: 00441021 */ addu $v0,$v0,$a0
/* f14f590: 1420fff7 */ bnez $at,.L0f14f570
/* f14f594: 26100004 */ addiu $s0,$s0,0x4
/* f14f598: 26730001 */ addiu $s3,$s3,0x1
/* f14f59c: 2a610008 */ slti $at,$s3,0x8
/* f14f5a0: 5420ffed */ bnezl $at,.L0f14f558
/* f14f5a4: 266e0001 */ addiu $t6,$s3,0x1
/* f14f5a8: 8e890000 */ lw $t1,0x0($s4)
/* f14f5ac: 3c013f80 */ lui $at,0x3f80
/* f14f5b0: 4481b000 */ mtc1 $at,$f22
/* f14f5b4: ad200010 */ sw $zero,0x10($t1)
/* f14f5b8: 8e8a0000 */ lw $t2,0x0($s4)
/* f14f5bc: 3c014100 */ lui $at,0x4100
/* f14f5c0: 4481a000 */ mtc1 $at,$f20
/* f14f5c4: 00008025 */ or $s0,$zero,$zero
/* f14f5c8: 00009025 */ or $s2,$zero,$zero
/* f14f5cc: 24110100 */ addiu $s1,$zero,0x100
/* f14f5d0: ad40000c */ sw $zero,0xc($t2)
.L0f14f5d4:
/* f14f5d4: 0c012974 */ jal sqrtf
/* f14f5d8: 4600a306 */ mov.s $f12,$f20
/* f14f5dc: 4600b103 */ div.s $f4,$f22,$f0
/* f14f5e0: 8e8b0000 */ lw $t3,0x0($s4)
/* f14f5e4: 01706021 */ addu $t4,$t3,$s0
/* f14f5e8: e584017c */ swc1 $f4,0x17c($t4)
/* f14f5ec: 8e820000 */ lw $v0,0x0($s4)
/* f14f5f0: 00506821 */ addu $t5,$v0,$s0
/* f14f5f4: c5a6017c */ lwc1 $f6,0x17c($t5)
/* f14f5f8: 00527021 */ addu $t6,$v0,$s2
/* f14f5fc: 26520020 */ addiu $s2,$s2,0x20
/* f14f600: 26100004 */ addiu $s0,$s0,0x4
/* f14f604: 1651fff3 */ bne $s2,$s1,.L0f14f5d4
/* f14f608: e5c6027c */ swc1 $f6,0x27c($t6)
/* f14f60c: 3c014180 */ lui $at,0x4180
/* f14f610: 4481e000 */ mtc1 $at,$f28
/* f14f614: 3c017f1b */ lui $at,%hi(var7f1b7364)
/* f14f618: c43a7364 */ lwc1 $f26,%lo(var7f1b7364)($at)
/* f14f61c: 3c013e80 */ lui $at,0x3e80
/* f14f620: 4481c000 */ mtc1 $at,$f24
/* f14f624: 24130001 */ addiu $s3,$zero,0x1
/* f14f628: 24150004 */ addiu $s5,$zero,0x4
/* f14f62c: 24160008 */ addiu $s6,$zero,0x8
.L0f14f630:
/* f14f630: 44934000 */ mtc1 $s3,$f8
/* f14f634: 00008825 */ or $s1,$zero,$zero
/* f14f638: 00008025 */ or $s0,$zero,$zero
/* f14f63c: 24120001 */ addiu $s2,$zero,0x1
/* f14f640: 468045a0 */ cvt.s.w $f22,$f8
.L0f14f644:
/* f14f644: 0c012974 */ jal sqrtf
/* f14f648: 4600c306 */ mov.s $f12,$f24
/* f14f64c: 44925000 */ mtc1 $s2,$f10
/* f14f650: 46000506 */ mov.s $f20,$f0
/* f14f654: 46805420 */ cvt.s.w $f16,$f10
/* f14f658: 461a8482 */ mul.s $f18,$f16,$f26
/* f14f65c: 00000000 */ nop
/* f14f660: 46169102 */ mul.s $f4,$f18,$f22
/* f14f664: 0c0068f4 */ jal cosf
/* f14f668: 461c2303 */ div.s $f12,$f4,$f28
/* f14f66c: 46140182 */ mul.s $f6,$f0,$f20
/* f14f670: 8e8f0000 */ lw $t7,0x0($s4)
/* f14f674: 0013c140 */ sll $t8,$s3,0x5
/* f14f678: 00134940 */ sll $t1,$s3,0x5
/* f14f67c: 01f8c821 */ addu $t9,$t7,$t8
/* f14f680: 03304021 */ addu $t0,$t9,$s0
/* f14f684: 00116140 */ sll $t4,$s1,0x5
/* f14f688: e506017c */ swc1 $f6,0x17c($t0)
/* f14f68c: 8e820000 */ lw $v0,0x0($s4)
/* f14f690: 26310001 */ addiu $s1,$s1,0x1
/* f14f694: 26520002 */ addiu $s2,$s2,0x2
/* f14f698: 00495021 */ addu $t2,$v0,$t1
/* f14f69c: 01505821 */ addu $t3,$t2,$s0
/* f14f6a0: c568017c */ lwc1 $f8,0x17c($t3)
/* f14f6a4: 004c6821 */ addu $t5,$v0,$t4
/* f14f6a8: 01b57021 */ addu $t6,$t5,$s5
/* f14f6ac: 26100004 */ addiu $s0,$s0,0x4
/* f14f6b0: 1636ffe4 */ bne $s1,$s6,.L0f14f644
/* f14f6b4: e5c8027c */ swc1 $f8,0x27c($t6)
/* f14f6b8: 26730001 */ addiu $s3,$s3,0x1
/* f14f6bc: 1676ffdc */ bne $s3,$s6,.L0f14f630
/* f14f6c0: 26b50004 */ addiu $s5,$s5,0x4
/* f14f6c4: 8fbf005c */ lw $ra,0x5c($sp)
/* f14f6c8: d7b40018 */ ldc1 $f20,0x18($sp)
/* f14f6cc: d7b60020 */ ldc1 $f22,0x20($sp)
/* f14f6d0: d7b80028 */ ldc1 $f24,0x28($sp)
/* f14f6d4: d7ba0030 */ ldc1 $f26,0x30($sp)
/* f14f6d8: d7bc0038 */ ldc1 $f28,0x38($sp)
/* f14f6dc: 8fb00040 */ lw $s0,0x40($sp)
/* f14f6e0: 8fb10044 */ lw $s1,0x44($sp)
/* f14f6e4: 8fb20048 */ lw $s2,0x48($sp)
/* f14f6e8: 8fb3004c */ lw $s3,0x4c($sp)
/* f14f6ec: 8fb40050 */ lw $s4,0x50($sp)
/* f14f6f0: 8fb50054 */ lw $s5,0x54($sp)
/* f14f6f4: 8fb60058 */ lw $s6,0x58($sp)
/* f14f6f8: 03e00008 */ jr $ra
/* f14f6fc: 27bd0060 */ addiu $sp,$sp,0x60
);
//void func0f14f510(s32 arg0)
//{
// s32 i;
// s32 j;
//
// for (i = 0; i < 8; i++) {
// s32 tmp = (i + 1) * arg0 + 1;
//
// for (j = 0; j < 8; j++) {
// var800a45a0->unk06c[i * 8 + j] = tmp + j * arg0;
// }
// }
//
// var800a45a0->unk010 = 0;
// var800a45a0->unk00c = 0;
//
// for (i = 0; i < 8; i++) {
// var800a45a0->unk17c[i] = 1 / sqrtf(8);
// var800a45a0->unk27c[i * 8] = var800a45a0->unk17c[i];
// }
//
// for (i = 1; i < 8; i++) {
// for (j = 0; j < 8; j++) {
// var800a45a0->unk17c[i * 8 + j] = sqrtf(0.25f) * cosf(((1 + j * 2) * M_PI * i) / 16.0f);
// var800a45a0->unk27c[j * 8 + i] = var800a45a0->unk17c[i * 8 + j];
// }
// }
//}
void func0f14f700(struct var8007f8e0 *arg0, u32 arg1, u32 arg2)
{
u32 bit;
for (bit = 1 << (arg2 + 31); bit != 0; bit >>= 1) {
if (bit & arg1) {
s32 remainder = arg0->unk02c % 8;
s32 index = arg0->unk02c / 8;
u8 mask = 1 << (7 - remainder);
arg0->unk024[index] |= mask;
}
arg0->unk02c++;
}
}
u32 func0f14f76c(struct var8007f8e0 *arg0, u32 arg1)
{
u32 bit;
u32 bits;
for (bit = 1 << (arg1 + 31), bits = 0; bit != 0; bit >>= 1) {
u32 remainder = arg0->unk02c % 8;
u32 index = arg0->unk02c / 8;
u8 mask = 1 << (7 - remainder);
if (arg0->unk020[index] & mask) {
bits |= bit;
}
arg0->unk02c++;
}
return bits;
}
s32 phead0f14f7d4(struct var8007f8e0 *arg0)
{
s32 sp24;
s32 v0;
if (var800a45a0->unk00c > 0) {
var800a45a0->unk00c--;
return 0;
}
sp24 = func0f14f76c(arg0, 2);
if (sp24 == 0) {
var800a45a0->unk00c = func0f14f76c(arg0, 4);
return 0;
}
if (sp24 == 1) {
sp24 = func0f14f76c(arg0, 1) + 1;
} else {
sp24 = func0f14f76c(arg0, 2) + sp24 * 4 - 5;
}
v0 = func0f14f76c(arg0, sp24);
if ((1 << (sp24 + 31)) & v0) {
return v0;
}
return (v0 - (1 << sp24)) + 1;
}
void phead0f14f8cc(struct var8007f8e0 *arg0, s32 arg1[8][8])
{
s32 i;
for (i = 0; i < ARRAYCOUNT(var7f1b60a0); i++) {
s32 v0 = phead0f14f7d4(arg0);
s32 upper = var7f1b60a0[i][0];
s32 lower = var7f1b60a0[i][1];
arg1[upper][lower] = var800a45a0->unk06c[upper][lower] * v0;
}
}
void func0f14f974(struct var8007f8e0 *arg0, s32 arg1)
{
s32 absarg1;
s32 sp28;
s32 sp24;
if (arg1 == 0) {
var800a45a0->unk010++;
return;
}
if (var800a45a0->unk010 != 0) {
while (var800a45a0->unk010 > 0) {
func0f14f700(arg0, 0, 2);
if (var800a45a0->unk010 < 17) {
func0f14f700(arg0, var800a45a0->unk010 - 1, 4);
var800a45a0->unk010 = 0;
} else {
func0f14f700(arg0, 15, 4);
var800a45a0->unk010 -= 16;
}
}
}
absarg1 = ABS(arg1);
sp28 = 1;
sp24 = 1;
while (sp28 < absarg1) {
sp28 = sp28 * 2 + 1;
sp24++;
}
if (sp24 < 3) {
func0f14f700(arg0, sp24 + 1, 3);
} else {
func0f14f700(arg0, sp24 + 5, 4);
}
if (arg1 > 0) {
func0f14f700(arg0, arg1, sp24);
} else {
func0f14f700(arg0, arg1 + sp28, sp24);
}
}
void func0f14faf8(struct var8007f8e0 *arg0, s32 arg1[8][8])
{
s32 i;
for (i = 0; i < ARRAYCOUNT(var7f1b60a0); i++) {
u32 upper = var7f1b60a0[i][0];
u32 lower = var7f1b60a0[i][1];
f32 f0 = (f32) arg1[upper][lower] / (f32) var800a45a0->unk06c[upper][lower];
s32 a1;
if (f0 < 0.0f) {
a1 = f0 - 0.5f;
} else {
a1 = f0 + 0.5f;
}
func0f14f974(arg0, a1);
}
}
void func0f14fbfc(u8 *arg0[8], s32 arg1[8][8])
{
f32 sp30[8][8];
s32 i;
s32 j;
s32 k;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
sp30[i][j] = 0.0f;
for (k = 0; k < 8; k++) {
sp30[i][j] += (arg0[i][k] - 0x80) * var800a45a0->unk27c[k][j];
}
}
}
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
f32 f0 = 0.0f;
for (k = 0; k < 8; k++) {
f0 += var800a45a0->unk17c[i][k] * sp30[k][j];
}
if (f0 < 0.0f) {
arg1[i][j] = f0 - 0.5f;
} else {
arg1[i][j] = f0 + 0.5f;
}
}
}
}
void phead0f14fdb0(s32 arg0[8][8], u8 **arg1)
{
f32 sp30[8][8];
s32 i;
s32 j;
s32 k;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
sp30[i][j] = 0.0f;
for (k = 0; k < 8; k++) {
sp30[i][j] += arg0[i][k] * var800a45a0->unk17c[k][j];
}
}
}
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
f32 f0 = 0.0f;
for (k = 0; k < 8; k++) {
f0 += var800a45a0->unk27c[i][k] * sp30[k][j];
}
f0 += 128.0f;
if (f0 > 255.0f) {
f0 = 255.0f;
}
if (f0 < 0.0f) {
f0 = 0.0f;
}
if (f0 < 0.0f) {
arg1[i][j] = (s8)(f0 - 0.5f);
} else {
arg1[i][j] = (s8)(f0 + 0.5f);
}
}
}
}
void func0f14ff94(struct var8007f8e0 *arg0)
{
s32 i;
s32 j;
s32 k;
s32 tmp;
s32 sp60[8][8];
u8 *sp40[8];
func0f14f4b8(arg0);
tmp = func0f14f76c(arg0, 8);
func0f14f510(tmp);
for (i = 0; i < 64; i += 8) {
for (j = 0; j < 64; j += 8) {
phead0f14f8cc(arg0, sp60);
for (k = 0; k < 8; k++) {
sp40[k] = &arg0->unk01c[(i + k) * 64 + j];
}
phead0f14fdb0(sp60, sp40);
}
}
}
void func0f150068(struct var8007f8e0 *arg0, s32 arg1)
{
s32 i;
s32 j;
s32 k;
s32 sp64[8][8];
u8 *sp44[8];
func0f14f4e4(arg0);
func0f14f510(arg1);
func0f14f700(arg0, arg1, 8);
for (i = 0; i < 0x40; i += 8) {
for (j = 0; j < 0x40; j += 8) {
for (k = 0; k < 8; k++) {
sp44[k] = &arg0->unk01c[(i + k) * 0x40 + j];
}
func0f14fbfc(sp44, sp64);
func0f14faf8(arg0, sp64);
}
}
func0f14f974(arg0, 1);
arg0->unk034 = arg0->unk02c / 8;
}
bool func0f15015c(s8 device, s32 filenum, u8 *arg2)
{
u8 stack[0x420];
u8 buffer[128];
s32 ret;
s32 i;
ret = pakReadBodyAtGuid(device, filenum, buffer, 128);
if (ret == 0) {
for (i = 0; i < sizeof(buffer); i++) {
arg2[i] = buffer[i];
}
return true;
}
if (ret == 10) {
s32 i;
s32 size = 128;
for (i = 0; i < size; i++) {
arg2[i] = random();
}
return true;
}
return false;
}
bool pheadLoadFile(s8 device, s32 fileid, u16 serial, s32 arg3)
{
s32 i;
s32 ret;
struct camerafile file;
u32 stack;
struct var8007f8e0 *s0 = func0f14a06c(arg3 == -1 ? -1 : arg3);
struct var8007f8e0 *s1 = func0f14a06c(-1);
ret = pakReadBodyAtGuid(device, fileid, (u8 *)&file, 0);
if (ret == 0) {
s0->fileguid.fileid = fileid;
s0->fileguid.deviceserial = serial;
if (s1 != s0) {
s0->unk01c = s1->unk01c;
}
s0->unk3f4_01 = (s32)file.unk8e_00;
s0->unk3f4_02 = (s32)file.unk8e_01;
s0->unk3a4 = file.unk8e_02;
s0->unk3bc = file.unk82;
s0->unk3b8 = file.unk84;
s0->colournum = file.unk8c;
s0->stylenum = file.unk8d;
s0->unk3c0 = file.unk86;
s0->unk3c4 = file.unk87;
s0->unk3c8 = file.unk88;
s0->unk3cc = file.unk89;
s0->unk3ec = file.unk8a;
s0->unk3f0 = file.unk8b;
s0->unk3f4_03 = true;
s0->unk3f4_00 = true;
for (i = 0; i < 7; i++) {
s0->unk3d0[i] = file.unk90[i] / 1000.0f;
}
for (i = 0; i < 1024; i++) {
s0->unk020[i] = file.unk9e[i];
}
if (s1 != s0) {
func0f14c50c(s1, s0, 6494, "camdraw.c");
}
func0f14a00c(false);
func0f14a16c(5);
func0f14bc04();
for (i = 0; i < 128; i++) {
s1->unk010.textureptr[i] = file.unk00[i];
}
if (s1 != s0) {
func0f14c50c(s0, s1, 6509, "camdraw.c");
}
return true;
}
g_FilemgrLastPakError = ret;
return 0;
}
const char var7f1b7170[] = "Cam -> Compressing Editor Slot\n";
const char var7f1b7190[] = "Cam -> Trying image compression at quality %u\n";
const char var7f1b71c0[] = "Cam -> Failed - Too big - This=%u, Max=%d\n";
const char var7f1b71ec[] = "Cam -> Trying lower quality setting\n";
const char var7f1b7214[] = "Cam -> Save Failed - Cant get it small enough - oo-er\n";
const char var7f1b724c[] = "Cam -> Sucess at quality %u - Size=%u, Max=%d\n";
const char var7f1b727c[] = "\nCam_SaveEditSlotToParamPakItem -> Save failed\n";
const char var7f1b72ac[] = "Camera Save Error Result: %d\n";
const char var7f1b72cc[] = "Magic Guid set to %d\n";
GLOBAL_ASM(
glabel pheadSaveFile
/* f150468: 27bdeb08 */ addiu $sp,$sp,-5368
/* f15046c: afb0001c */ sw $s0,0x1c($sp)
/* f150470: 00048600 */ sll $s0,$a0,0x18
/* f150474: 00107603 */ sra $t6,$s0,0x18
/* f150478: afbf002c */ sw $ra,0x2c($sp)
/* f15047c: afb30028 */ sw $s3,0x28($sp)
/* f150480: afb20024 */ sw $s2,0x24($sp)
/* f150484: afa414f8 */ sw $a0,0x14f8($sp)
/* f150488: 00a09025 */ or $s2,$a1,$zero
/* f15048c: 30d3ffff */ andi $s3,$a2,0xffff
/* f150490: 01c08025 */ or $s0,$t6,$zero
/* f150494: afb10020 */ sw $s1,0x20($sp)
/* f150498: afa61500 */ sw $a2,0x1500($sp)
/* f15049c: 0fc5281b */ jal func0f14a06c
/* f1504a0: 2404ffff */ addiu $a0,$zero,-1
/* f1504a4: 8c4f03f4 */ lw $t7,0x3f4($v0)
/* f1504a8: 00408825 */ or $s1,$v0,$zero
/* f1504ac: 24080001 */ addiu $t0,$zero,0x1
/* f1504b0: 000fc8c0 */ sll $t9,$t7,0x3
/* f1504b4: 07200030 */ bltz $t9,.L0f150578
/* f1504b8: 27a90044 */ addiu $t1,$sp,0x44
/* f1504bc: a0480036 */ sb $t0,0x36($v0)
/* f1504c0: ac490024 */ sw $t1,0x24($v0)
/* f1504c4: 310500ff */ andi $a1,$t0,0xff
.L0f1504c8:
/* f1504c8: 0fc5401a */ jal func0f150068
/* f1504cc: 02202025 */ or $a0,$s1,$zero
/* f1504d0: 8e2a002c */ lw $t2,0x2c($s1)
/* f1504d4: 000a58c2 */ srl $t3,$t2,0x3
/* f1504d8: 316cffff */ andi $t4,$t3,0xffff
/* f1504dc: 2d810400 */ sltiu $at,$t4,0x400
/* f1504e0: 14200009 */ bnez $at,.L0f150508
/* f1504e4: a7ab10d0 */ sh $t3,0x10d0($sp)
/* f1504e8: 922d0036 */ lbu $t5,0x36($s1)
/* f1504ec: 25ae0001 */ addiu $t6,$t5,0x1
/* f1504f0: 31c500ff */ andi $a1,$t6,0xff
/* f1504f4: 28a1000c */ slti $at,$a1,0xc
/* f1504f8: 1420fff3 */ bnez $at,.L0f1504c8
/* f1504fc: a22e0036 */ sb $t6,0x36($s1)
/* f150500: 100000a5 */ b .L0f150798
/* f150504: 2402ffff */ addiu $v0,$zero,-1
.L0f150508:
/* f150508: 97af10d0 */ lhu $t7,0x10d0($sp)
/* f15050c: 00001025 */ or $v0,$zero,$zero
/* f150510: 24050400 */ addiu $a1,$zero,0x400
/* f150514: 51e0000d */ beqzl $t7,.L0f15054c
/* f150518: 97a210d0 */ lhu $v0,0x10d0($sp)
/* f15051c: 8e380024 */ lw $t8,0x24($s1)
.L0f150520:
/* f150520: 8e290020 */ lw $t1,0x20($s1)
/* f150524: 0302c821 */ addu $t9,$t8,$v0
/* f150528: 93280000 */ lbu $t0,0x0($t9)
/* f15052c: 01225021 */ addu $t2,$t1,$v0
/* f150530: 24420001 */ addiu $v0,$v0,0x1
/* f150534: a1480000 */ sb $t0,0x0($t2)
/* f150538: 97ab10d0 */ lhu $t3,0x10d0($sp)
/* f15053c: 004b082b */ sltu $at,$v0,$t3
/* f150540: 5420fff7 */ bnezl $at,.L0f150520
/* f150544: 8e380024 */ lw $t8,0x24($s1)
/* f150548: 97a210d0 */ lhu $v0,0x10d0($sp)
.L0f15054c:
/* f15054c: 28410400 */ slti $at,$v0,0x400
/* f150550: 50200007 */ beqzl $at,.L0f150570
/* f150554: 922f03f4 */ lbu $t7,0x3f4($s1)
.L0f150558:
/* f150558: 8e2c0020 */ lw $t4,0x20($s1)
/* f15055c: 01826821 */ addu $t5,$t4,$v0
/* f150560: 24420001 */ addiu $v0,$v0,0x1
/* f150564: 1445fffc */ bne $v0,$a1,.L0f150558
/* f150568: a1a00000 */ sb $zero,0x0($t5)
/* f15056c: 922f03f4 */ lbu $t7,0x3f4($s1)
.L0f150570:
/* f150570: 35f80010 */ ori $t8,$t7,0x10
/* f150574: a23803f4 */ sb $t8,0x3f4($s1)
.L0f150578:
/* f150578: 8e3903f4 */ lw $t9,0x3f4($s1)
/* f15057c: 93ac10de */ lbu $t4,0x10de($sp)
/* f150580: 3c01447a */ lui $at,0x447a
/* f150584: 00194840 */ sll $t1,$t9,0x1
/* f150588: 000947c2 */ srl $t0,$t1,0x1f
/* f15058c: 000859c0 */ sll $t3,$t0,0x7
/* f150590: 318dff7f */ andi $t5,$t4,0xff7f
/* f150594: 016d5025 */ or $t2,$t3,$t5
/* f150598: a3aa10de */ sb $t2,0x10de($sp)
/* f15059c: 8e2f03f4 */ lw $t7,0x3f4($s1)
/* f1505a0: 314c00bf */ andi $t4,$t2,0xbf
/* f1505a4: 44810000 */ mtc1 $at,$f0
/* f1505a8: 000fc080 */ sll $t8,$t7,0x2
/* f1505ac: 0018cfc2 */ srl $t9,$t8,0x1f
/* f1505b0: 00194980 */ sll $t1,$t9,0x6
/* f1505b4: 31280040 */ andi $t0,$t1,0x40
/* f1505b8: 010c5825 */ or $t3,$t0,$t4
/* f1505bc: a3ab10de */ sb $t3,0x10de($sp)
/* f1505c0: 922d03a7 */ lbu $t5,0x3a7($s1)
/* f1505c4: 97b910de */ lhu $t9,0x10de($sp)
/* f1505c8: 24050400 */ addiu $a1,$zero,0x400
/* f1505cc: 000d7980 */ sll $t7,$t5,0x6
/* f1505d0: 31f83fc0 */ andi $t8,$t7,0x3fc0
/* f1505d4: 3329c03f */ andi $t1,$t9,0xc03f
/* f1505d8: 03097025 */ or $t6,$t8,$t1
/* f1505dc: a7ae10de */ sh $t6,0x10de($sp)
/* f1505e0: 8e2a03bc */ lw $t2,0x3bc($s1)
/* f1505e4: 27a31050 */ addiu $v1,$sp,0x1050
/* f1505e8: 02202025 */ or $a0,$s1,$zero
/* f1505ec: a7aa10d2 */ sh $t2,0x10d2($sp)
/* f1505f0: 8e2803b8 */ lw $t0,0x3b8($s1)
/* f1505f4: 27a2105e */ addiu $v0,$sp,0x105e
/* f1505f8: a7a810d4 */ sh $t0,0x10d4($sp)
/* f1505fc: 8e2c039c */ lw $t4,0x39c($s1)
/* f150600: a3ac10dc */ sb $t4,0x10dc($sp)
/* f150604: 8e2b03a0 */ lw $t3,0x3a0($s1)
/* f150608: a3ab10dd */ sb $t3,0x10dd($sp)
/* f15060c: 8e2d03c0 */ lw $t5,0x3c0($s1)
/* f150610: a3ad10d6 */ sb $t5,0x10d6($sp)
/* f150614: 8e2f03c4 */ lw $t7,0x3c4($s1)
/* f150618: a3af10d7 */ sb $t7,0x10d7($sp)
/* f15061c: 8e3903c8 */ lw $t9,0x3c8($s1)
/* f150620: a3b910d8 */ sb $t9,0x10d8($sp)
/* f150624: 8e3803cc */ lw $t8,0x3cc($s1)
/* f150628: a3b810d9 */ sb $t8,0x10d9($sp)
/* f15062c: 8e2903ec */ lw $t1,0x3ec($s1)
/* f150630: a3a910da */ sb $t1,0x10da($sp)
/* f150634: 8e2e03f0 */ lw $t6,0x3f0($s1)
/* f150638: a3ae10db */ sb $t6,0x10db($sp)
/* f15063c: c49003d0 */ lwc1 $f16,0x3d0($a0)
/* f150640: 24630002 */ addiu $v1,$v1,0x2
/* f150644: 46008482 */ mul.s $f18,$f16,$f0
/* f150648: 5062000c */ beql $v1,$v0,.L0f15067c
/* f15064c: 4600940d */ trunc.w.s $f16,$f18
/* f150650: 4600940d */ trunc.w.s $f16,$f18
.L0f150654:
/* f150654: 24840004 */ addiu $a0,$a0,0x4
/* f150658: 24630002 */ addiu $v1,$v1,0x2
/* f15065c: 44088000 */ mfc1 $t0,$f16
/* f150660: 00000000 */ nop
/* f150664: a468008c */ sh $t0,0x8c($v1)
/* f150668: c49003d0 */ lwc1 $f16,0x3d0($a0)
/* f15066c: 46008482 */ mul.s $f18,$f16,$f0
/* f150670: 5462fff8 */ bnel $v1,$v0,.L0f150654
/* f150674: 4600940d */ trunc.w.s $f16,$f18
/* f150678: 4600940d */ trunc.w.s $f16,$f18
.L0f15067c:
/* f15067c: 24840004 */ addiu $a0,$a0,0x4
/* f150680: 44088000 */ mfc1 $t0,$f16
/* f150684: 00000000 */ nop
/* f150688: a468008e */ sh $t0,0x8e($v1)
/* f15068c: 00001025 */ or $v0,$zero,$zero
/* f150690: 27a31050 */ addiu $v1,$sp,0x1050
.L0f150694:
/* f150694: 8e2c0010 */ lw $t4,0x10($s1)
/* f150698: 24630001 */ addiu $v1,$v1,0x1
/* f15069c: 01825821 */ addu $t3,$t4,$v0
/* f1506a0: 916d0000 */ lbu $t5,0x0($t3)
/* f1506a4: 24420001 */ addiu $v0,$v0,0x1
/* f1506a8: 28410080 */ slti $at,$v0,0x80
/* f1506ac: 1420fff9 */ bnez $at,.L0f150694
/* f1506b0: a06dffff */ sb $t5,-0x1($v1)
/* f1506b4: 00001025 */ or $v0,$zero,$zero
/* f1506b8: 27a31050 */ addiu $v1,$sp,0x1050
.L0f1506bc:
/* f1506bc: 8e2f0020 */ lw $t7,0x20($s1)
/* f1506c0: 24630001 */ addiu $v1,$v1,0x1
/* f1506c4: 01e2c821 */ addu $t9,$t7,$v0
/* f1506c8: 93380000 */ lbu $t8,0x0($t9)
/* f1506cc: 24420001 */ addiu $v0,$v0,0x1
/* f1506d0: 1445fffa */ bne $v0,$a1,.L0f1506bc
/* f1506d4: a078009d */ sb $t8,0x9d($v1)
/* f1506d8: 00102600 */ sll $a0,$s0,0x18
/* f1506dc: 24090001 */ addiu $t1,$zero,0x1
/* f1506e0: 3c018007 */ lui $at,%hi(g_FileLists+0x1c)
/* f1506e4: 00047603 */ sra $t6,$a0,0x18
/* f1506e8: 27aa1044 */ addiu $t2,$sp,0x1044
/* f1506ec: ac295bdc */ sw $t1,%lo(g_FileLists+0x1c)($at)
/* f1506f0: afaa0010 */ sw $t2,0x10($sp)
/* f1506f4: 01c02025 */ or $a0,$t6,$zero
/* f1506f8: 02402825 */ or $a1,$s2,$zero
/* f1506fc: 24060008 */ addiu $a2,$zero,0x8
/* f150700: 27a71050 */ addiu $a3,$sp,0x1050
/* f150704: 0fc45a0a */ jal pakSaveAtGuid
/* f150708: afa00014 */ sw $zero,0x14($sp)
/* f15070c: 1440001f */ bnez $v0,.L0f15078c
/* f150710: 00401825 */ or $v1,$v0,$zero
/* f150714: 3c12800a */ lui $s2,%hi(g_Vars)
/* f150718: 26529fc0 */ addiu $s2,$s2,%lo(g_Vars)
/* f15071c: 00008025 */ or $s0,$zero,$zero
.L0f150720:
/* f150720: 0fc5281b */ jal func0f14a06c
/* f150724: 02002025 */ or $a0,$s0,$zero
/* f150728: 8e2803f8 */ lw $t0,0x3f8($s1)
/* f15072c: 8c4c03f8 */ lw $t4,0x3f8($v0)
/* f150730: 550c000e */ bnel $t0,$t4,.L0f15076c
/* f150734: 26100001 */ addiu $s0,$s0,0x1
/* f150738: 962b03fc */ lhu $t3,0x3fc($s1)
/* f15073c: 944d03fc */ lhu $t5,0x3fc($v0)
/* f150740: 8faf1044 */ lw $t7,0x1044($sp)
/* f150744: 2a01000c */ slti $at,$s0,0xc
/* f150748: 556d0008 */ bnel $t3,$t5,.L0f15076c
/* f15074c: 26100001 */ addiu $s0,$s0,0x1
/* f150750: ac4f03f8 */ sw $t7,0x3f8($v0)
/* f150754: 14200004 */ bnez $at,.L0f150768
/* f150758: a45303fc */ sh $s3,0x3fc($v0)
/* f15075c: 8e590458 */ lw $t9,0x458($s2)
/* f150760: 37380001 */ ori $t8,$t9,0x1
/* f150764: ae580458 */ sw $t8,0x458($s2)
.L0f150768:
/* f150768: 26100001 */ addiu $s0,$s0,0x1
.L0f15076c:
/* f15076c: 24010012 */ addiu $at,$zero,0x12
/* f150770: 1601ffeb */ bne $s0,$at,.L0f150720
/* f150774: 00000000 */ nop
/* f150778: 8fa91044 */ lw $t1,0x1044($sp)
/* f15077c: a63303fc */ sh $s3,0x3fc($s1)
/* f150780: 00001025 */ or $v0,$zero,$zero
/* f150784: 10000004 */ b .L0f150798
/* f150788: ae2903f8 */ sw $t1,0x3f8($s1)
.L0f15078c:
/* f15078c: 3c01800a */ lui $at,%hi(g_FilemgrLastPakError)
/* f150790: ac2321f8 */ sw $v1,%lo(g_FilemgrLastPakError)($at)
/* f150794: 2402ffff */ addiu $v0,$zero,-1
.L0f150798:
/* f150798: 8fbf002c */ lw $ra,0x2c($sp)
/* f15079c: 8fb0001c */ lw $s0,0x1c($sp)
/* f1507a0: 8fb10020 */ lw $s1,0x20($sp)
/* f1507a4: 8fb20024 */ lw $s2,0x24($sp)
/* f1507a8: 8fb30028 */ lw $s3,0x28($sp)
/* f1507ac: 03e00008 */ jr $ra
/* f1507b0: 27bd14f8 */ addiu $sp,$sp,0x14f8
);
// Mismatch: Regalloc
//s32 pheadSaveFile(s8 device, s32 fileid, u16 serial)
//{
// u32 stack[2];
// struct camerafile file; // 1050
// struct var8007f8e0 *thing = func0f14a06c(-1);
// s32 ret;
// s32 writtenfileid; // 1044
// u8 sp44[0x1000];
// s32 i;
//
// if (!thing->unk3f4_03) {
// thing->unk036 = 1;
// thing->unk024 = sp44;
//
// while (true) {
// func0f150068(thing, thing->unk036);
//
// file.unk80 = thing->unk02c / 8;
//
// if ((u32)file.unk80 >= 1024) {
// thing->unk036++;
//
// if (thing->unk036 >= 12) {
// return -1;
// }
// } else {
// break;
// }
// }
//
// for (i = 0; i < (u32)file.unk80; i++) {
// thing->unk020[i] = thing->unk024[i];
// }
//
// for (i = file.unk80; i < 1024; i++) {
// thing->unk020[i] = 0;
// }
//
// thing->unk3f4_03 = true;
// }
//
// file.unk8e_00 = thing->unk3f4_01;
// file.unk8e_01 = thing->unk3f4_02;
// file.unk8e_02 = thing->unk3a4;
//
// file.unk82 = thing->unk3bc;
// file.unk84 = thing->unk3b8;
// file.unk8c = thing->colournum;
// file.unk8d = thing->stylenum;
// file.unk86 = thing->unk3c0;
// file.unk87 = thing->unk3c4;
// file.unk88 = thing->unk3c8;
// file.unk89 = thing->unk3cc;
// file.unk8a = thing->unk3ec;
// file.unk8b = thing->unk3f0;
//
// for (i = 0; i != ARRAYCOUNT(file.unk90); i++) {
// file.unk90[i] = thing->unk3d0[i] * 1000.0f;
// }
//
// for (i = 0; i < ARRAYCOUNT(file.unk00); i++) {
// file.unk00[i] = thing->unk010.textureptr[i];
// }
//
// for (i = 0; i < ARRAYCOUNT(file.unk9e); i++) {
// file.unk9e[i] = thing->unk020[i];
// }
//
// var80075bd0[3] = true;
//
// ret = pakSaveAtGuid(device, fileid, PAKFILETYPE_CAMERA, (u8 *)&file, &writtenfileid, NULL);
//
// if (ret == 0) {
// s32 i;
// for (i = 0; i < 18; i++) {
// struct var8007f8e0 *thing2 = func0f14a06c(i);
//
// if (thing2->fileguid.fileid == thing->fileguid.fileid
// && thing2->fileguid.deviceserial == thing->fileguid.deviceserial) {
// thing2->fileguid.fileid = writtenfileid;
// thing2->fileguid.deviceserial = serial;
//
// if (i >= 12) {
// g_Vars.modifiedfiles |= MODFILE_GAME;
// }
// }
// }
//
// thing->fileguid.fileid = writtenfileid;
// thing->fileguid.deviceserial = serial;
//
// return 0;
// }
//
// g_FilemgrLastPakError = ret;
//
// return -1;
//}
void phGetGuid(s32 index, struct fileguid *guid)
{
struct var8007f8e0 *thing = func0f14a06c(index);
guid->fileid = thing->fileguid.fileid;
guid->deviceserial = thing->fileguid.deviceserial;
}
void phSetFileId(s32 fileid)
{
struct var8007f8e0 *thing = func0f14a06c(-1);
thing->fileguid.deviceserial = 0;
thing->fileguid.fileid = fileid;
}