mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-07-31 15:17:20 -05:00
335 lines
7.2 KiB
C
335 lines
7.2 KiB
C
#include "unk_02027B70.h"
|
|
|
|
#include <nitro.h>
|
|
#include <string.h>
|
|
|
|
#include "struct_decls/struct_berry_data_decl.h"
|
|
#include "struct_defs/struct_02027854.h"
|
|
#include "struct_defs/struct_02027BF4.h"
|
|
|
|
#include "berry_data.h"
|
|
#include "heap.h"
|
|
#include "narc.h"
|
|
|
|
static void sub_02027C50(UnkStruct_02027854 *param0);
|
|
static int sub_02027C7C(const UnkStruct_02027BF4 *param0, int param1, int param2);
|
|
|
|
void sub_02027B70(UnkStruct_02027854 *param0)
|
|
{
|
|
int v0;
|
|
|
|
MI_CpuClear8(param0, sizeof(UnkStruct_02027854) * 128);
|
|
|
|
for (v0 = 0; v0 < 128; v0++) {
|
|
param0[v0].unk_01 = 0;
|
|
param0[v0].unk_00 = 0;
|
|
}
|
|
}
|
|
|
|
void sub_02027B90(UnkStruct_02027854 *param0, int param1, const u16 *param2, int param3)
|
|
{
|
|
int v0;
|
|
UnkStruct_02027BF4 *v1 = sub_02027BF4(param1);
|
|
|
|
for (v0 = 0; v0 < 128 || v0 < param3; v0++) {
|
|
sub_02027C50(¶m0[v0]);
|
|
param0[v0].unk_00 = param2[v0 * 2] - 149 + 1;
|
|
param0[v0].unk_01 = 5;
|
|
param0[v0].unk_02 = sub_02027C7C(v1, param0[v0].unk_00, param0[v0].unk_0C) * 4;
|
|
param0[v0].unk_08 = param2[v0 * 2 + 1];
|
|
param0[v0].unk_0A = 100;
|
|
param0[v0].unk_0B = 3;
|
|
}
|
|
|
|
Heap_FreeToHeap(v1);
|
|
}
|
|
|
|
UnkStruct_02027BF4 *sub_02027BF4(int param0)
|
|
{
|
|
int v0;
|
|
UnkStruct_02027BF4 *v1;
|
|
BerryData *v2;
|
|
NARC *v3;
|
|
|
|
v3 = BerryData_NARC_ctor(param0);
|
|
v1 = Heap_AllocFromHeap(param0, sizeof(UnkStruct_02027BF4) * 64);
|
|
|
|
for (v0 = 0; v0 < 64; v0++) {
|
|
v2 = sub_020973A8(v3, v0, param0);
|
|
|
|
v1[v0].unk_00 = BerryData_GetAttribute(v2, 3);
|
|
v1[v0].unk_01 = BerryData_GetAttribute(v2, 4);
|
|
v1[v0].unk_02 = BerryData_GetAttribute(v2, 2);
|
|
|
|
Heap_FreeToHeap(v2);
|
|
}
|
|
|
|
BerryData_NARC_dtor(v3);
|
|
return v1;
|
|
}
|
|
|
|
static void sub_02027C50(UnkStruct_02027854 *param0)
|
|
{
|
|
param0->unk_00 = 0;
|
|
param0->unk_01 = 0;
|
|
param0->unk_02 = 0;
|
|
param0->unk_04 = 0;
|
|
param0->unk_06 = 0;
|
|
param0->unk_08 = 0;
|
|
param0->unk_0A = 0;
|
|
param0->unk_0B = 0;
|
|
param0->unk_0C = 0;
|
|
param0->unk_0D = 0;
|
|
}
|
|
|
|
static int sub_02027C68(UnkStruct_02027854 *param0, const UnkStruct_02027BF4 *param1)
|
|
{
|
|
return param1[param0->unk_00 - 1].unk_02 * param0->unk_0B;
|
|
}
|
|
|
|
static int sub_02027C7C(const UnkStruct_02027BF4 *param0, int param1, int param2)
|
|
{
|
|
int v0;
|
|
|
|
v0 = param0[param1 - 1].unk_00 * 60;
|
|
|
|
if (param2 == 1) {
|
|
v0 = (v0 * 3) / 4;
|
|
} else if (param2 == 2) {
|
|
v0 = v0 + (v0 / 2);
|
|
}
|
|
|
|
return v0;
|
|
}
|
|
|
|
static int sub_02027CA8(const UnkStruct_02027BF4 *param0, int param1, int param2)
|
|
{
|
|
int v0 = param0[param1 - 1].unk_01;
|
|
|
|
if (param2 == 2) {
|
|
return v0 / 2;
|
|
} else if (param2 == 1) {
|
|
return v0 + v0 / 2;
|
|
} else {
|
|
return v0;
|
|
}
|
|
}
|
|
|
|
static int sub_02027CCC(const UnkStruct_02027854 *param0)
|
|
{
|
|
if (param0->unk_0C == 3) {
|
|
return 4 + 2;
|
|
} else {
|
|
return 4;
|
|
}
|
|
}
|
|
|
|
static int sub_02027CDC(const UnkStruct_02027854 *param0)
|
|
{
|
|
if (param0->unk_0C == 4) {
|
|
return 10 + 5;
|
|
} else {
|
|
return 10;
|
|
}
|
|
}
|
|
|
|
static int sub_02027CEC(UnkStruct_02027854 *param0)
|
|
{
|
|
return 1 + (1 + 1 + 1 + sub_02027CCC(param0)) * sub_02027CDC(param0);
|
|
}
|
|
|
|
int sub_02027D04(const UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
return param0[param1].unk_01;
|
|
}
|
|
|
|
int sub_02027D10(const UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
return param0[param1].unk_00;
|
|
}
|
|
|
|
int sub_02027D18(const UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
int v0;
|
|
|
|
v0 = param0[param1].unk_0A;
|
|
|
|
if (v0 == 0) {
|
|
return 0;
|
|
} else if (v0 <= 50) {
|
|
return 1;
|
|
} else {
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
int sub_02027D34(const UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
return param0[param1].unk_0B;
|
|
}
|
|
|
|
void sub_02027D40(UnkStruct_02027854 *param0, int param1, const UnkStruct_02027BF4 *param2, int param3)
|
|
{
|
|
param0[param1].unk_00 = param3;
|
|
param0[param1].unk_01 = 1;
|
|
param0[param1].unk_02 = sub_02027C7C(param2, param3, param0[param1].unk_0C);
|
|
param0[param1].unk_04 = 0;
|
|
param0[param1].unk_06 = 0;
|
|
param0[param1].unk_08 = 0;
|
|
param0[param1].unk_0A = 100;
|
|
param0[param1].unk_0B = 5;
|
|
param0[param1].unk_0D = 1;
|
|
}
|
|
|
|
void sub_02027D78(UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
param0[param1].unk_0A = 100;
|
|
}
|
|
|
|
BOOL sub_02027D84(const UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
return param0[param1].unk_0D;
|
|
}
|
|
|
|
void sub_02027D90(UnkStruct_02027854 *param0, int param1, BOOL param2)
|
|
{
|
|
param0[param1].unk_0D = param2;
|
|
}
|
|
|
|
int sub_02027D9C(const UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
return param0[param1].unk_0C;
|
|
}
|
|
|
|
void sub_02027DA8(UnkStruct_02027854 *param0, int param1, int param2)
|
|
{
|
|
param0[param1].unk_0C = param2;
|
|
}
|
|
|
|
int sub_02027DB4(const UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
return param0[param1].unk_08;
|
|
}
|
|
|
|
int sub_02027DC0(UnkStruct_02027854 *param0, int param1)
|
|
{
|
|
int v0;
|
|
|
|
v0 = param0[param1].unk_08;
|
|
sub_02027C50(¶m0[param1]);
|
|
|
|
return v0;
|
|
}
|
|
|
|
static void sub_02027DD4(UnkStruct_02027854 *param0, const UnkStruct_02027BF4 *param1)
|
|
{
|
|
switch (param0->unk_01) {
|
|
case 0:
|
|
GF_ASSERT(0);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
param0->unk_01++;
|
|
break;
|
|
case 4:
|
|
param0->unk_08 = sub_02027C68(param0, param1);
|
|
|
|
if (param0->unk_08 < 2) {
|
|
param0->unk_08 = 2;
|
|
}
|
|
|
|
param0->unk_01++;
|
|
break;
|
|
case 5:
|
|
param0->unk_08 = 0;
|
|
param0->unk_01 = 2;
|
|
param0->unk_0B = 5;
|
|
param0->unk_06++;
|
|
|
|
if (param0->unk_06 == sub_02027CDC(param0)) {
|
|
sub_02027C50(param0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void sub_02027E40(UnkStruct_02027854 *param0, const UnkStruct_02027BF4 *param1, int param2)
|
|
{
|
|
int v0;
|
|
int v1;
|
|
int v2;
|
|
|
|
if (param0->unk_01 == 5) {
|
|
return;
|
|
}
|
|
|
|
v1 = sub_02027CA8(param1, param0->unk_00, param0->unk_0C);
|
|
param2 += param0->unk_04;
|
|
|
|
v0 = param2 / 60;
|
|
param0->unk_04 = param2 % 60;
|
|
|
|
if (v0 == 0) {
|
|
return;
|
|
}
|
|
|
|
if (param0->unk_0A >= v1 * v0) {
|
|
param0->unk_0A -= v1 * v0;
|
|
return;
|
|
}
|
|
|
|
if (param0->unk_0A > 0) {
|
|
v2 = (param0->unk_0A + (v1 - 1)) / v1;
|
|
v0 -= v2;
|
|
param0->unk_0A = 0;
|
|
}
|
|
|
|
if (param0->unk_0B > v0) {
|
|
param0->unk_0B -= v0;
|
|
} else {
|
|
param0->unk_0B = 0;
|
|
}
|
|
}
|
|
|
|
void sub_02027EAC(UnkStruct_02027854 *param0, const UnkStruct_02027BF4 *param1, int param2)
|
|
{
|
|
int v0;
|
|
s32 v1;
|
|
UnkStruct_02027854 *v2;
|
|
|
|
for (v0 = 0; v0 < 128; v0++) {
|
|
v2 = ¶m0[v0];
|
|
|
|
if ((v2->unk_00 == 0) || (v2->unk_01 == 0) || (v2->unk_0D == 0)) {
|
|
continue;
|
|
}
|
|
|
|
if (param2 >= sub_02027C7C(param1, v2->unk_00, v2->unk_0C) * sub_02027CEC(v2)) {
|
|
sub_02027C50(v2);
|
|
continue;
|
|
}
|
|
|
|
v1 = param2;
|
|
|
|
while (v2->unk_01 != 0 && v1 != 0) {
|
|
if (v2->unk_02 > v1) {
|
|
sub_02027E40(v2, param1, v1);
|
|
v2->unk_02 -= v1;
|
|
v1 = 0;
|
|
break;
|
|
} else {
|
|
sub_02027E40(v2, param1, v2->unk_02);
|
|
sub_02027DD4(v2, param1);
|
|
|
|
v1 -= v2->unk_02;
|
|
v2->unk_02 = sub_02027C7C(param1, v2->unk_00, v2->unk_0C);
|
|
|
|
if (v2->unk_01 == 5) {
|
|
v2->unk_02 *= sub_02027CCC(v2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|