summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2024-12-01 15:34:02 +0100
committerAldrik Ramaekers <aldrikboy@gmail.com>2024-12-01 15:34:02 +0100
commit8430183d1e2b9e6d66188e364f8acf08d1ddb9c4 (patch)
tree0872eb27e5ba3053f6476d1ff83a13041d245b37 /src
parentcebbaa91a9a57a411736b4148706b6bad621140e (diff)
close #21
Diffstat (limited to 'src')
-rw-r--r--src/include/world.h18
-rw-r--r--src/scenes/world_map.c95
-rw-r--r--src/world.c26
3 files changed, 129 insertions, 10 deletions
diff --git a/src/include/world.h b/src/include/world.h
index 46e2f65..58d9a2f 100644
--- a/src/include/world.h
+++ b/src/include/world.h
@@ -331,6 +331,7 @@ typedef struct t_money_data
float expenses_from_trucks;
float expenses_from_utility;
+ float expenses_from_loans;
float expenses_from_healthcare;
float expenses_from_repairs;
float expenses_from_fuel;
@@ -352,12 +353,29 @@ typedef struct t_company_investments
u32 legal;
} company_investments;
+typedef struct t_bank_loan
+{
+ s32 amount;
+ float interest;
+ s32 days_left;
+ float monthly_payment;
+ bool is_active;
+} bank_loan;
+
+typedef struct t_bank
+{
+ bank_loan loan1;
+ bank_loan loan2;
+ bank_loan loan3;
+} bank;
+
typedef struct t_world
{
// Save State
s64 simulation_time;
u16 start_year;
float money;
+ bank bank_info;
u32 next_id;
u8 simulation_speed;
array active_jobs;
diff --git a/src/scenes/world_map.c b/src/scenes/world_map.c
index 1053420..5dc5373 100644
--- a/src/scenes/world_map.c
+++ b/src/scenes/world_map.c
@@ -207,10 +207,11 @@ static void _insights_draw_grid(float scale, bool invalid_location, money_data_c
PUSH_VAL(5, data.expenses_from_fuel, true);
PUSH_VAL(6, data.expenses_from_employees, true);
PUSH_VAL(7, data.expenses_from_trucks, true);
+ PUSH_VAL(8, data.expenses_from_loans, true);
// ADD NEW ENTRY HERE
- PUSH_VAL(9, data.total_income, false);
- PUSH_VAL(10, data.total_expenses, true);
- PUSH_VAL(11, data.total_profit, data.total_profit < 0.0f);
+ PUSH_VAL(10, data.total_income, false);
+ PUSH_VAL(11, data.total_expenses, true);
+ PUSH_VAL(12, data.total_profit, data.total_profit < 0.0f);
}
renderer->render_rectangle(x, y, width_per_item*3, h, COLOR_SCHEDULE_BG);
@@ -258,10 +259,11 @@ static void _insights_draw_grid(float scale, bool invalid_location, money_data_c
case 5: strcpy(buf, "Fuel"); break;
case 6: strcpy(buf, "Salaries"); break;
case 7: strcpy(buf, "Trucks"); break;
+ case 8: strcpy(buf, "Loans"); break;
// ADD NEW ENTRY HERE
- case 9: strcpy(buf, "Total Income"); break;
- case 10: strcpy(buf, "Total Expenses"); break;
- case 11: strcpy(buf, "Total Profit"); break;
+ case 10: strcpy(buf, "Total Income"); break;
+ case 11: strcpy(buf, "Total Expenses"); break;
+ case 12: strcpy(buf, "Total Profit"); break;
default: break;
}
@@ -304,6 +306,7 @@ static void _insights_draw_chart(platform_window*window, bool invalid_location,
CHECK_MIN_MAX(data.expenses_from_fuel);
CHECK_MIN_MAX(data.expenses_from_employees);
CHECK_MIN_MAX(data.expenses_from_trucks);
+ CHECK_MIN_MAX(data.expenses_from_loans);
// ADD NEW ENTRY HERE
CHECK_MIN_MAX(data.total_income);
CHECK_MIN_MAX(data.total_expenses);
@@ -363,6 +366,7 @@ static void _insights_draw_chart(platform_window*window, bool invalid_location,
"Fuel",
"Salaries",
"Trucks",
+ "Loans",
// ADD NEW ENTRY HERE
"Total Income",
"Total Expenses",
@@ -482,6 +486,7 @@ static void _insights_draw_chart(platform_window*window, bool invalid_location,
DRAW_LINES_FOR_DATA(data.expenses_from_fuel);
DRAW_LINES_FOR_DATA(data.expenses_from_employees);
DRAW_LINES_FOR_DATA(data.expenses_from_trucks);
+ DRAW_LINES_FOR_DATA(data.expenses_from_loans);
// ADD NEW ENTRY HERE
DRAW_LINES_FOR_DATA(data.total_income);
DRAW_LINES_FOR_DATA(data.total_expenses);
@@ -1108,16 +1113,92 @@ static void world_map_draw_night(platform_window* window)
renderer->render_image_tint(img_shadow, shadow2_offset, area.y + camera_y, area.w*zoom, area.h*zoom, rgba(255,255,255,100));
}
+#define PUSH_LOAN_BTN(_txt,_index, _loan)\
+{\
+button_row_h = 44*scale;\
+if (button_render(scale, _loan.is_active ? BUTTON_DISABLED : BUTTON_ENABLED, _txt, btn_row_x, btn_row_y, button_row_w, button_row_h)) {\
+ _loan.is_active = true;\
+ _loan.days_left = 12*28;\
+ _active_world->money += _loan.amount;\
+}\
+btn_row_x += (button_row_w+halfpad);\
+}
+
static void world_map_draw_bank(platform_window* window)
{
s32 screen_center_x = area.x + (area.w/2);
s32 screen_center_y = area.y + (area.h/2);
- s32 panel_w = 400 * scale;
+ s32 panel_w = 600 * scale;
s32 panel_h = 350 * scale;
s32 panel_x = screen_center_x - (panel_w/2);
s32 panel_y = screen_center_y - (panel_h/2);
+
panel_render(scale, panel_x, panel_y, panel_w, panel_h);
+
+ s32 pad = 20*scale;
+ s32 halfpad = pad/2;
+ s32 textpad = 20*scale;
+
+ s32 btn_row_x = panel_x + pad;
+ s32 btn_row_y = panel_y + pad;
+ s32 button_row_w = panel_w - (pad*2);
+ s32 button_row_h = 44*scale;
+ button_render(scale, BUTTON_STATIC, 0, btn_row_x, btn_row_y,button_row_w, button_row_h);
+
+ font* fnt_big = fnt_rd32;
+ s32 textx = btn_row_x+(10*scale);
+ s32 texty = btn_row_y+(button_row_h/2)-(fnt_big->px_h/2);
+ renderer->render_text(fnt_big, textx, texty, "Babobank Inc.", COLOR_TEXT);
+
+ btn_row_y += button_row_h + halfpad;
+ button_row_h += panel_h - pad*5.0f-button_row_h*2;
+
+ fnt_big = fnt_rd24;
+ button_render(scale, BUTTON_STATIC, 0, btn_row_x, btn_row_y,button_row_w, button_row_h);
+ {
+ s32 txt_offset = 0;
+ if (_active_world->bank_info.loan1.is_active) {
+ char txt[100];
+ sprintf(txt, "LOAN: 10K at $%.0f/month. %d days left.",
+ _active_world->bank_info.loan1.monthly_payment, _active_world->bank_info.loan1.days_left);
+ renderer->render_text(fnt_big, btn_row_x + textpad, btn_row_y + textpad + txt_offset, txt, COLOR_TEXT);
+ txt_offset += fnt_big->px_h + textpad;
+ }
+
+ if (_active_world->bank_info.loan2.is_active) {
+ char txt[100];
+ sprintf(txt, "LOAN: 50K at $%.0f/month. %d days left.",
+ _active_world->bank_info.loan2.monthly_payment, _active_world->bank_info.loan2.days_left);
+ renderer->render_text(fnt_big, btn_row_x + textpad, btn_row_y + textpad + txt_offset, txt, COLOR_TEXT);
+ txt_offset += fnt_big->px_h + textpad;
+ }
+
+ if (_active_world->bank_info.loan3.is_active) {
+ char txt[100];
+ sprintf(txt, "LOAN: 150K at $%.0f/month. %d days left.",
+ _active_world->bank_info.loan3.monthly_payment, _active_world->bank_info.loan3.days_left);
+ renderer->render_text(fnt_big, btn_row_x + textpad, btn_row_y + textpad + txt_offset, txt, COLOR_TEXT);
+ }
+
+ if (txt_offset == 0) {
+ renderer->render_text(fnt_big, btn_row_x + textpad, btn_row_y + textpad + txt_offset, "Take out a loan with Babobank Inc to grow your business.", COLOR_TEXT);
+ }
+ }
+
+ btn_row_y += button_row_h+halfpad;
+ button_row_w = ((button_row_w-halfpad*2)/3);
+
+ PUSH_LOAN_BTN("+ $10K @ 3\%", 0, _active_world->bank_info.loan1);
+ PUSH_LOAN_BTN("+ $50K @ 5\%", 1, _active_world->bank_info.loan2);
+ PUSH_LOAN_BTN("+ $150K @ 8\%", 2, _active_world->bank_info.loan3);
+
+
+ if (mouse_interacts(panel_x, panel_y, panel_w, panel_h)) {
+ reset_left_click();
+ } else if (is_left_clicked()) {
+ scene_state = WORLD_SCENE_STATE_IDLE;
+ }
}
static void world_map_draw_menu(platform_window* window)
diff --git a/src/world.c b/src/world.c
index a27d468..6d62b09 100644
--- a/src/world.c
+++ b/src/world.c
@@ -568,6 +568,11 @@ world* world_create_new()
new_world->log.events = array_create(sizeof(event));
new_world->log.write_cursor = 0;
new_world->log.has_unread_messages = false;
+ new_world->bank_info = (bank){0};
+ new_world->bank_info.loan1 = (bank_loan){10000, 3, 12, 846.94, 0};
+ new_world->bank_info.loan2 = (bank_loan){50000, 5, 12, 4280.38, 0};
+ new_world->bank_info.loan3 = (bank_loan){150000, 8, 12, 13048.27, 0};
+
array_reserve(&new_world->log.events, LOG_HISTORY_LENGTH);
new_world->insights = array_create(sizeof(money_data_collection));
array_reserve(&new_world->insights, 10);
@@ -1267,7 +1272,7 @@ static void give_random_fine(world* world)
case 1: snprintf(error_msg, MAX_EVENT_MESSAGE_LENGTH, "You were fined $%d because %s did not secure their load correctly.", fine, emp->name); break;
case 2: snprintf(error_msg, MAX_EVENT_MESSAGE_LENGTH, "You were fined $%d because %s had the incorrect shipping papers on their trip.", fine, emp->name); break;
}
- world->money -= fine;
+
ADD_EXPENSE(world, location, expenses_from_utility, fine);
world_report_event(world, error_msg, EVENT_TYPE_FINED, emp);
}
@@ -1285,7 +1290,6 @@ static void brake_down_random_truck(world* world)
char error_msg[MAX_EVENT_MESSAGE_LENGTH];
snprintf(error_msg, MAX_EVENT_MESSAGE_LENGTH, "%s's truck broke down and was repaired for $%d", emp->name, fine);
- world->money -= fine;
ADD_EXPENSE(world, location, expenses_from_repairs, fine);
world_report_event(world, error_msg, EVENT_TYPE_FINED, emp);
}
@@ -1313,7 +1317,6 @@ static void do_random_inspection(world* world)
char error_msg[MAX_EVENT_MESSAGE_LENGTH];
snprintf(error_msg, MAX_EVENT_MESSAGE_LENGTH, "A random inspection was performed in %s and %d employees were found to be working more hours than allowed. Fine: $%d.", location->name, total_employees_overworking, fine);
- world->money -= fine;
ADD_EXPENSE(world, location, expenses_from_utility, fine);
world_report_event(world, error_msg, EVENT_TYPE_FINED, 0);
}
@@ -1462,6 +1465,22 @@ static void world_age_employee(world* world)
}
}
+#define UPDATE_LOAN(_loan)\
+if (_loan.is_active) {\
+ _loan.days_left--;\
+ ADD_EXPENSE(world, 0, expenses_from_loans, _loan.monthly_payment/28.0f);\
+ if (_loan.days_left <= 0) {\
+ _loan.is_active = false;\
+ }\
+}
+
+static void world_update_loans(world* world)
+{
+ UPDATE_LOAN(world->bank_info.loan1);
+ UPDATE_LOAN(world->bank_info.loan2);
+ UPDATE_LOAN(world->bank_info.loan3);
+}
+
static void world_run_simulation_tick(world* world)
{
s32 elapsed_sec = MINUTES(world->simulation_speed);
@@ -1491,6 +1510,7 @@ static void world_run_simulation_tick(world* world)
if (curr_time->tm_mday <= 28) {
world_payout_salaries(world); // Pay salary first 28 days of month.
world_pay_investments(world);
+ world_update_loans(world);
}
}