|
|
|
@@ -0,0 +1,369 @@
|
|
|
|
|
#include "m_repay_ovl.h"
|
|
|
|
|
|
|
|
|
|
#include "m_common_data.h"
|
|
|
|
|
#include "m_font.h"
|
|
|
|
|
#include "m_name_table.h"
|
|
|
|
|
#include "m_player_lib.h"
|
|
|
|
|
#include "sys_matrix.h"
|
|
|
|
|
|
|
|
|
|
static mRP_Ovl_c rp_ovl_data;
|
|
|
|
|
static mActor_name_t mRP_money_name[MONEY_NUM] = { ITM_MONEY_100, ITM_MONEY_1000, ITM_MONEY_10000, ITM_MONEY_30000 };
|
|
|
|
|
static u32 mRP_money_amount[MONEY_NUM] = { 100, 1000, 10000, 30000 };
|
|
|
|
|
|
|
|
|
|
static int mRP_money_repay(mRP_Ovl_c* repay_ovl) {
|
|
|
|
|
mActor_name_t* item_p;
|
|
|
|
|
mActor_name_t* money_name_p = mRP_money_name;
|
|
|
|
|
u32* money_amount_p = mRP_money_amount;
|
|
|
|
|
u32 total_money = Common_Get(now_private)->inventory.wallet;
|
|
|
|
|
int j;
|
|
|
|
|
int i;
|
|
|
|
|
u32 money_left = 0;
|
|
|
|
|
|
|
|
|
|
if (total_money >= repay_ovl->repay_amount) {
|
|
|
|
|
money_left = total_money - repay_ovl->repay_amount;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
for (i = 0; i < MONEY_NUM; i++) {
|
|
|
|
|
item_p = Common_Get(now_private)->inventory.pockets;
|
|
|
|
|
for (j = 0; j < mPr_POCKETS_SLOT_COUNT; j++) {
|
|
|
|
|
if (
|
|
|
|
|
mPr_GET_ITEM_COND(Common_Get(now_private)->inventory.item_conditions, j) == mPr_ITEM_COND_NORMAL &&
|
|
|
|
|
*item_p == *money_name_p
|
|
|
|
|
) {
|
|
|
|
|
total_money += *money_amount_p;
|
|
|
|
|
mPr_SetPossessionItem(Common_Get(now_private), j, EMPTY_NO, mPr_ITEM_COND_NORMAL);
|
|
|
|
|
|
|
|
|
|
if (total_money >= repay_ovl->repay_amount) {
|
|
|
|
|
return total_money - repay_ovl->repay_amount;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
item_p++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
money_name_p++;
|
|
|
|
|
money_amount_p++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return money_left;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
|
|
|
(*submenu->overlay->move_Move_proc)(submenu, menu_info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
|
|
|
static u32 step_money[mRP_CURSOR_NUM] = {
|
|
|
|
|
100000,
|
|
|
|
|
10000,
|
|
|
|
|
1000,
|
|
|
|
|
100,
|
|
|
|
|
10,
|
|
|
|
|
1,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
mRP_Ovl_c* repay_ovl = submenu->overlay->repay_ovl;
|
|
|
|
|
u32 trigger = submenu->overlay->menu_control.trigger;
|
|
|
|
|
|
|
|
|
|
if ((trigger & BUTTON_B)) {
|
|
|
|
|
(*submenu->overlay->move_chg_base_proc)(menu_info, mSM_MOVE_OUT_TOP);
|
|
|
|
|
sAdo_SysTrgStart(2);
|
|
|
|
|
}
|
|
|
|
|
else if (repay_ovl->cursor_idx >= mRP_CURSOR_OK || (trigger & BUTTON_START)) {
|
|
|
|
|
if ((trigger & BUTTON_A) || (trigger & BUTTON_START)) {
|
|
|
|
|
if (repay_ovl->repay_amount != 0) {
|
|
|
|
|
mPlib_request_main_give_from_submenu(ITM_MONEY_10000, mSM_OVL_REPAY, FALSE, TRUE);
|
|
|
|
|
Common_Get(now_private)->inventory.loan = repay_ovl->loan;
|
|
|
|
|
Common_Get(now_private)->inventory.wallet = mRP_money_repay(repay_ovl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
(*submenu->overlay->move_chg_base_proc)(menu_info, mSM_MOVE_OUT_TOP);
|
|
|
|
|
sAdo_SysTrgStart(2);
|
|
|
|
|
}
|
|
|
|
|
else if ((trigger & (BUTTON_CUP | BUTTON_CLEFT))) {
|
|
|
|
|
repay_ovl->cursor_idx--;
|
|
|
|
|
sAdo_SysTrgStart(1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (repay_ovl->cursor_idx != 0 && (trigger & BUTTON_CLEFT)) {
|
|
|
|
|
repay_ovl->cursor_idx--;
|
|
|
|
|
sAdo_SysTrgStart(1);
|
|
|
|
|
}
|
|
|
|
|
else if ((trigger & BUTTON_CRIGHT)) {
|
|
|
|
|
repay_ovl->cursor_idx++;
|
|
|
|
|
sAdo_SysTrgStart(1);
|
|
|
|
|
}
|
|
|
|
|
else if ((trigger & (BUTTON_CDOWN | BUTTON_CUP))) {
|
|
|
|
|
u32 repay_amount = repay_ovl->repay_amount;
|
|
|
|
|
|
|
|
|
|
if ((trigger & BUTTON_CDOWN)) {
|
|
|
|
|
if (repay_amount < step_money[repay_ovl->cursor_idx]) {
|
|
|
|
|
if (repay_amount == 0) {
|
|
|
|
|
sAdo_SysTrgStart(0x1003);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
repay_amount = 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
repay_amount -= step_money[repay_ovl->cursor_idx];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (repay_amount == repay_ovl->max_repay) {
|
|
|
|
|
sAdo_SysTrgStart(0x1003);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
repay_amount += step_money[repay_ovl->cursor_idx];
|
|
|
|
|
if (repay_amount > repay_ovl->max_repay) {
|
|
|
|
|
repay_amount = repay_ovl->max_repay;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sAdo_SysTrgStart(0x426);
|
|
|
|
|
repay_ovl->money = repay_ovl->max_money - repay_amount;
|
|
|
|
|
repay_ovl->loan = Common_Get(now_private)->inventory.loan - repay_amount;
|
|
|
|
|
repay_ovl->repay_amount = repay_amount;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) {
|
|
|
|
|
(*submenu->overlay->move_End_proc)(submenu, menu_info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef void (*mRP_MOVE_PROC)(Submenu*, mSM_MenuInfo_c*);
|
|
|
|
|
|
|
|
|
|
static void mRP_repay_ovl_move(Submenu* submenu) {
|
|
|
|
|
static mRP_MOVE_PROC ovl_move_proc[mSM_OVL_PROC_NUM] = {
|
|
|
|
|
&mRP_move_Move,
|
|
|
|
|
&mRP_move_Play,
|
|
|
|
|
(mRP_MOVE_PROC)none_proc1,
|
|
|
|
|
(mRP_MOVE_PROC)none_proc1,
|
|
|
|
|
&mRP_move_End
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_REPAY];
|
|
|
|
|
|
|
|
|
|
(*menu_info->pre_move_func)(submenu);
|
|
|
|
|
(*ovl_move_proc[menu_info->proc_status])(submenu, menu_info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern Gfx fkm_win_mode[];
|
|
|
|
|
extern Gfx fkm_win_model[];
|
|
|
|
|
|
|
|
|
|
static void mRP_set_frame_dl(Submenu* submenu, GRAPH* graph, mSM_MenuInfo_c* menu_info, f32 x, f32 y) {
|
|
|
|
|
f32 tex_x;
|
|
|
|
|
f32 tex_y;
|
|
|
|
|
int s;
|
|
|
|
|
int t;
|
|
|
|
|
Gfx* gfx;
|
|
|
|
|
|
|
|
|
|
Matrix_scale(16.0f, 16.0f, 1.0f, 0);
|
|
|
|
|
Matrix_translate(x, y, 140.0f, 1);
|
|
|
|
|
|
|
|
|
|
OPEN_DISP(graph);
|
|
|
|
|
gfx = NOW_POLY_OPA_DISP;
|
|
|
|
|
|
|
|
|
|
/* Setup RDP */
|
|
|
|
|
gSPDisplayList(gfx++, fkm_win_mode);
|
|
|
|
|
|
|
|
|
|
/* Setup matrix */
|
|
|
|
|
gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
|
|
|
|
|
|
|
|
/* Set background texture scroll position */
|
|
|
|
|
tex_x = -submenu->overlay->menu_control.texture_pos[0] * 4.0f;
|
|
|
|
|
tex_y = -submenu->overlay->menu_control.texture_pos[1] * 4.0f;
|
|
|
|
|
s = (int)tex_x & 0xFF;
|
|
|
|
|
t = (int)tex_y & 0xFF;
|
|
|
|
|
gDPSetTileSize_Dolphin(gfx++, G_TX_RENDERTILE, s, t, 32, 32);
|
|
|
|
|
|
|
|
|
|
/* Draw background frame */
|
|
|
|
|
gSPDisplayList(gfx++, fkm_win_model);
|
|
|
|
|
|
|
|
|
|
SET_POLY_OPA_DISP(gfx);
|
|
|
|
|
CLOSE_DISP(graph);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_set_num_str(GAME* game, u32 num, rgba_t* str_col_p, f32 x, f32 y, f32 scale) {
|
|
|
|
|
u8 str[7];
|
|
|
|
|
|
|
|
|
|
mFont_UnintToString(str, sizeof(str), num, 6, FALSE, FALSE, TRUE);
|
|
|
|
|
x -= scale * mFont_GetStringWidth(str, sizeof(str), TRUE);
|
|
|
|
|
mFont_SetLineStrings(
|
|
|
|
|
game,
|
|
|
|
|
str, sizeof(str),
|
|
|
|
|
x, y,
|
|
|
|
|
str_col_p->r, str_col_p->g, str_col_p->b, 255,
|
|
|
|
|
FALSE,
|
|
|
|
|
TRUE,
|
|
|
|
|
scale, scale,
|
|
|
|
|
mFont_MODE_POLY
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_set_character_dl(Submenu* submenu, GAME* game, f32 x, f32 y) {
|
|
|
|
|
static u8 kingaku_str[9] = "Your Loan";
|
|
|
|
|
static u8 kettei_str[2] = "OK";
|
|
|
|
|
static rgba_t money_col = { 100, 40, 255, 255 };
|
|
|
|
|
static rgba_t repay_col = { 70, 120, 245, 255 };
|
|
|
|
|
static rgba_t select_col = { 215, 0, 0, 255 };
|
|
|
|
|
static rgba_t kettei_col = { 70, 120, 245, 255 };
|
|
|
|
|
static rgba_t loan_col = { 40, 185, 110, 255 };
|
|
|
|
|
|
|
|
|
|
mRP_Ovl_c* repay_ovl = submenu->overlay->repay_ovl;
|
|
|
|
|
rgba_t* color_p;
|
|
|
|
|
u8 repay_amount_str[7];
|
|
|
|
|
int sel;
|
|
|
|
|
f32 char_y;
|
|
|
|
|
f32 char_x;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
(*submenu->overlay->set_char_matrix_proc)(game->graph);
|
|
|
|
|
mFont_SetLineStrings(
|
|
|
|
|
game,
|
|
|
|
|
kingaku_str, sizeof(kingaku_str),
|
|
|
|
|
x + 153.0f, -y + 64.0f,
|
|
|
|
|
255, 255, 255, 255,
|
|
|
|
|
FALSE,
|
|
|
|
|
TRUE,
|
|
|
|
|
0.875f, 0.875f,
|
|
|
|
|
mFont_MODE_POLY
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
mRP_set_num_str(game, repay_ovl->money, &money_col, x + 206.0f, -y + 91.0f, 0.875f);
|
|
|
|
|
sel = repay_ovl->cursor_idx;
|
|
|
|
|
if (sel >= mRP_CURSOR_100) {
|
|
|
|
|
sel++; // move past the comma
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mFont_UnintToString(repay_amount_str, sizeof(repay_amount_str), repay_ovl->repay_amount, 6, FALSE, TRUE, TRUE);
|
|
|
|
|
|
|
|
|
|
/* Draw each individual character in the repayment amount string */
|
|
|
|
|
char_x = x - mFont_GetStringWidth(repay_amount_str, 7, TRUE) + 206.0f;
|
|
|
|
|
char_y = -y + 112.0f;
|
|
|
|
|
for (i = 0; i < 7; i++) {
|
|
|
|
|
if (sel == i) {
|
|
|
|
|
color_p = &select_col;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
color_p = &repay_col;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mFont_SetLineStrings(
|
|
|
|
|
game,
|
|
|
|
|
&repay_amount_str[i], 1,
|
|
|
|
|
char_x, char_y,
|
|
|
|
|
color_p->r, color_p->g, color_p->b, 255,
|
|
|
|
|
FALSE,
|
|
|
|
|
TRUE,
|
|
|
|
|
1.0f, 1.0f,
|
|
|
|
|
mFont_MODE_POLY
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
char_x += mFont_GetStringWidth(&repay_amount_str[i], 1, TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (repay_ovl->cursor_idx < mRP_CURSOR_OK) {
|
|
|
|
|
color_p = &kettei_col;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
color_p = &select_col;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mFont_SetLineStrings(
|
|
|
|
|
game,
|
|
|
|
|
kettei_str, sizeof(kettei_str),
|
|
|
|
|
x + 207.0f, -y + 128.0f,
|
|
|
|
|
color_p->r, color_p->g, color_p->b, 255,
|
|
|
|
|
FALSE,
|
|
|
|
|
TRUE,
|
|
|
|
|
0.875f, 0.875f,
|
|
|
|
|
mFont_MODE_POLY
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
mRP_set_num_str(game, repay_ovl->loan, &loan_col, x + 209.0f, -y + 155.0f, 0.875f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_set_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info) {
|
|
|
|
|
GRAPH* graph = game->graph;
|
|
|
|
|
f32 x = menu_info->position[0];
|
|
|
|
|
f32 y = menu_info->position[1];
|
|
|
|
|
|
|
|
|
|
mRP_set_frame_dl(submenu, graph, menu_info, x, y);
|
|
|
|
|
mRP_set_character_dl(submenu, game, x, y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_repay_ovl_draw(Submenu* submenu, GAME* game) {
|
|
|
|
|
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_REPAY];
|
|
|
|
|
|
|
|
|
|
(*menu_info->pre_draw_func)(submenu, game);
|
|
|
|
|
mRP_set_dl(submenu, game, menu_info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern void mRP_repay_ovl_set_proc(Submenu* submenu) {
|
|
|
|
|
mSM_Control_c* control = &submenu->overlay->menu_control;
|
|
|
|
|
|
|
|
|
|
control->menu_move_func = &mRP_repay_ovl_move;
|
|
|
|
|
control->menu_draw_func = &mRP_repay_ovl_draw;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void mRP_repay_ovl_init(Submenu* submenu) {
|
|
|
|
|
mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_REPAY];
|
|
|
|
|
mRP_Ovl_c* repay_ovl = submenu->overlay->repay_ovl;
|
|
|
|
|
mActor_name_t* item_p = Common_Get(now_private)->inventory.pockets;
|
|
|
|
|
int i;
|
|
|
|
|
u32 max_repay;
|
|
|
|
|
|
|
|
|
|
submenu->overlay->menu_control.animation_flag = FALSE;
|
|
|
|
|
menu_info->proc_status = mSM_OVL_PROC_MOVE;
|
|
|
|
|
menu_info->next_proc_status = mSM_OVL_PROC_PLAY;
|
|
|
|
|
menu_info->move_drt = mSM_MOVE_IN_TOP;
|
|
|
|
|
|
|
|
|
|
repay_ovl->money = Common_Get(now_private)->inventory.wallet;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++, item_p++) {
|
|
|
|
|
if (mPr_GET_ITEM_COND(Common_Get(now_private)->inventory.item_conditions, i) == mPr_ITEM_COND_NORMAL) {
|
|
|
|
|
int j;
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < MONEY_NUM; j++) {
|
|
|
|
|
if (*item_p == mRP_money_name[j]) {
|
|
|
|
|
repay_ovl->money += mRP_money_amount[j];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
repay_ovl->max_money = repay_ovl->money;
|
|
|
|
|
repay_ovl->loan = Common_Get(now_private)->inventory.loan;
|
|
|
|
|
repay_ovl->repay_amount = 0;
|
|
|
|
|
|
|
|
|
|
if (repay_ovl->max_money > Common_Get(now_private)->inventory.loan) {
|
|
|
|
|
max_repay = Common_Get(now_private)->inventory.loan;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
max_repay = repay_ovl->max_money;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
repay_ovl->max_repay = max_repay;
|
|
|
|
|
repay_ovl->cursor_idx = mRP_CURSOR_100000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern void mRP_repay_ovl_construct(Submenu* submenu) {
|
|
|
|
|
Submenu_Overlay_c* overlay = submenu->overlay;
|
|
|
|
|
|
|
|
|
|
if (overlay->repay_ovl == NULL) {
|
|
|
|
|
mem_clear((u8*)&rp_ovl_data, sizeof(mRP_Ovl_c), 0);
|
|
|
|
|
overlay->repay_ovl = &rp_ovl_data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mRP_repay_ovl_init(submenu);
|
|
|
|
|
mRP_repay_ovl_set_proc(submenu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern void mRP_repay_ovl_destruct(Submenu* submenu) {
|
|
|
|
|
submenu->overlay->repay_ovl = NULL;
|
|
|
|
|
}
|