From 496fb467ef596b73fc3eab4593881567aad832da Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Sun, 1 Dec 2024 19:31:10 +0100 Subject: working on save file --- src/include/world.h | 21 ++--- src/scenes/save_state_select.c | 179 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 183 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/include/world.h b/src/include/world.h index 58d9a2f..06a6d11 100644 --- a/src/include/world.h +++ b/src/include/world.h @@ -151,8 +151,8 @@ typedef struct t_employee s16 days_below_happiness_treshold; u32 current_location_id; u32 original_location_id; - truck* assigned_truck; u32 active_job_id; + truck* assigned_truck; // Portrait u8 portrait_hair_type; @@ -236,14 +236,15 @@ typedef struct t_world_location // Save State bool is_owned; + float score; // 0-1 + u16 purchase_year; + array employees; // Contains internal and external employees. Employee can be at 2 locations at any given time. array job_offers; array resumes; array trucks; - schedule schedule; - u16 purchase_year; array insights; - float score; // 0-1 + schedule schedule; // Dynamic array connections; @@ -375,17 +376,19 @@ typedef struct t_world s64 simulation_time; u16 start_year; float money; - bank bank_info; u32 next_id; u8 simulation_speed; - array active_jobs; + u16 days_since_last_random_event; + + bank bank_info; + company_investments investments; event_log log; + + array active_jobs; array insights; - company_investments investments; - u16 days_since_last_random_event; + array locations; // Dynamic - array locations; array companies; array firstnames; array lastnames; diff --git a/src/scenes/save_state_select.c b/src/scenes/save_state_select.c index 1bd7bc1..9972b7f 100644 --- a/src/scenes/save_state_select.c +++ b/src/scenes/save_state_select.c @@ -7,14 +7,15 @@ void save_state_select_scene_init() static bool push_save_state_button(float scale, bool enabled, s32 x, s32 y, s32 size) { if (enabled) { - button_render(scale, true, 0, x, y, size, size); + return button_render(scale, true, 0, x, y, size, size); } else { - button_render(scale, true, 0, x, y, size, size); + bool success = button_render(scale, true, 0, x, y, size, size); float close_size = size/3; float close_x = x + (size/2)-(close_size/2); float close_y = y + (size/2)-(close_size/2); renderer->render_image(img_close, close_x, close_y, close_size, close_size); + return success; } return false; @@ -46,6 +47,160 @@ static bool push_back_button(float scale, s32 back_x, s32 back_y, s32 back_w, s3 return result; } +extern world* _active_world; + +static void load_save_file(s32 index) +{ + log_info("Loading save file."); +} + +static void write_save_file(s32 index) +{ + log_info("Writing save file."); + + cJSON *world = cJSON_CreateObject(); + cJSON_AddItemToObject(world, "simulation_time", cJSON_CreateNumber(_active_world->simulation_time)); + cJSON_AddItemToObject(world, "start_year", cJSON_CreateNumber(_active_world->start_year)); + cJSON_AddItemToObject(world, "money", cJSON_CreateNumber(_active_world->money)); + cJSON_AddItemToObject(world, "next_id", cJSON_CreateNumber(_active_world->next_id)); + cJSON_AddItemToObject(world, "simulation_speed", cJSON_CreateNumber(_active_world->simulation_speed)); + cJSON_AddItemToObject(world, "days_since_last_random_event", cJSON_CreateNumber(_active_world->days_since_last_random_event)); + + cJSON *bank = cJSON_CreateObject(); + { + cJSON *loan1 = cJSON_CreateObject(); + cJSON_AddItemToObject(loan1, "amount", cJSON_CreateNumber(_active_world->bank_info.loan1.amount)); + cJSON_AddItemToObject(loan1, "interest", cJSON_CreateNumber(_active_world->bank_info.loan1.interest)); + cJSON_AddItemToObject(loan1, "days_left", cJSON_CreateNumber(_active_world->bank_info.loan1.days_left)); + cJSON_AddItemToObject(loan1, "monthly_payment", cJSON_CreateNumber(_active_world->bank_info.loan1.monthly_payment)); + cJSON_AddItemToObject(loan1, "is_active", cJSON_CreateNumber(_active_world->bank_info.loan1.is_active)); + cJSON_AddItemToObject(bank, "loan1", loan1); + + cJSON *loan2 = cJSON_CreateObject(); + cJSON_AddItemToObject(loan2, "amount", cJSON_CreateNumber(_active_world->bank_info.loan2.amount)); + cJSON_AddItemToObject(loan2, "interest", cJSON_CreateNumber(_active_world->bank_info.loan2.interest)); + cJSON_AddItemToObject(loan2, "days_left", cJSON_CreateNumber(_active_world->bank_info.loan2.days_left)); + cJSON_AddItemToObject(loan2, "monthly_payment", cJSON_CreateNumber(_active_world->bank_info.loan2.monthly_payment)); + cJSON_AddItemToObject(loan2, "is_active", cJSON_CreateNumber(_active_world->bank_info.loan2.is_active)); + cJSON_AddItemToObject(bank, "loan2", loan2); + + cJSON *loan3 = cJSON_CreateObject(); + cJSON_AddItemToObject(loan3, "amount", cJSON_CreateNumber(_active_world->bank_info.loan3.amount)); + cJSON_AddItemToObject(loan3, "interest", cJSON_CreateNumber(_active_world->bank_info.loan3.interest)); + cJSON_AddItemToObject(loan3, "days_left", cJSON_CreateNumber(_active_world->bank_info.loan3.days_left)); + cJSON_AddItemToObject(loan3, "monthly_payment", cJSON_CreateNumber(_active_world->bank_info.loan3.monthly_payment)); + cJSON_AddItemToObject(loan3, "is_active", cJSON_CreateNumber(_active_world->bank_info.loan3.is_active)); + cJSON_AddItemToObject(bank, "loan3", loan3); + + cJSON_AddItemToObject(world, "bank_info", bank); + } + + cJSON *investments = cJSON_CreateObject(); + { + cJSON_AddItemToObject(investments, "marketing", cJSON_CreateNumber(_active_world->investments.marketing)); + cJSON_AddItemToObject(investments, "human_resources", cJSON_CreateNumber(_active_world->investments.human_resources)); + cJSON_AddItemToObject(investments, "training", cJSON_CreateNumber(_active_world->investments.training)); + cJSON_AddItemToObject(investments, "legal", cJSON_CreateNumber(_active_world->investments.legal)); + + cJSON_AddItemToObject(world, "investments", investments); + } + + cJSON *log = cJSON_CreateObject(); + { + cJSON_AddItemToObject(log, "write_cursor", cJSON_CreateNumber(_active_world->log.write_cursor)); + cJSON_AddItemToObject(log, "has_unread_messages", cJSON_CreateNumber(_active_world->log.has_unread_messages)); + + cJSON* entries = cJSON_CreateArray(); + for (int i = 0; i < _active_world->log.events.length; i++) + { + event* e = array_at(&_active_world->log.events, i); + cJSON *event = cJSON_CreateObject(); + cJSON_AddItemToObject(event, "type", cJSON_CreateNumber(e->type)); + cJSON_AddItemToObject(event, "message", cJSON_CreateString (e->message)); + + cJSON_AddItemToArray(entries, event); + } + + cJSON_AddItemToObject(log, "events", entries); + cJSON_AddItemToObject(world, "log", log); + } + + cJSON *locations = cJSON_CreateArray(); + { + for (s32 i = 0; i < _active_world->locations.length; i++) + { + world_location* location = array_at(&_active_world->locations, i); + if (!location->is_owned) continue; + + cJSON *loc = cJSON_CreateObject(); + cJSON_AddItemToObject(loc, "is_owned", cJSON_CreateNumber(location->is_owned)); + cJSON_AddItemToObject(loc, "purchase_year", cJSON_CreateNumber(location->purchase_year)); + cJSON_AddItemToObject(loc, "score", cJSON_CreateNumber(location->score)); + + cJSON *employees = cJSON_CreateArray(); + { + for (s32 r = 0; r < location->employees.length; r++) + { + employee* emp = *(employee**)array_at(&location->employees, r); + + cJSON *employee = cJSON_CreateObject(); + cJSON_AddItemToObject(employee, "id", cJSON_CreateNumber(emp->id)); + cJSON_AddItemToObject(employee, "name", cJSON_CreateString(emp->name)); + cJSON_AddItemToObject(employee, "age", cJSON_CreateNumber(emp->age)); + cJSON_AddItemToObject(employee, "experience", cJSON_CreateNumber(emp->experience)); + cJSON_AddItemToObject(employee, "salary", cJSON_CreateNumber(emp->salary)); + cJSON_AddItemToObject(employee, "happiness", cJSON_CreateNumber(emp->happiness)); + cJSON_AddItemToObject(employee, "days_below_happiness_treshold", cJSON_CreateNumber(emp->days_below_happiness_treshold)); + cJSON_AddItemToObject(employee, "current_location_id", cJSON_CreateNumber(emp->current_location_id)); + cJSON_AddItemToObject(employee, "original_location_id", cJSON_CreateNumber(emp->original_location_id)); + cJSON_AddItemToObject(employee, "active_job_id", cJSON_CreateNumber(emp->active_job_id)); + cJSON_AddItemToObject(employee, "truck_id", cJSON_CreateNumber(emp->assigned_truck ? emp->assigned_truck->id :-1)); + cJSON_AddItemToObject(employee, "portrait_hair_type", cJSON_CreateNumber(emp->portrait_hair_type)); + + cJSON *c1 = cJSON_CreateObject(); + cJSON_AddItemToObject(c1, "r", cJSON_CreateNumber(emp->hair_color.r)); + cJSON_AddItemToObject(c1, "g", cJSON_CreateNumber(emp->hair_color.g)); + cJSON_AddItemToObject(c1, "b", cJSON_CreateNumber(emp->hair_color.b)); + cJSON_AddItemToObject(c1, "a", cJSON_CreateNumber(emp->hair_color.a)); + cJSON_AddItemToObject(employee, "hair_color", c1); + + cJSON *c2 = cJSON_CreateObject(); + cJSON_AddItemToObject(c2, "r", cJSON_CreateNumber(emp->face_color.r)); + cJSON_AddItemToObject(c2, "g", cJSON_CreateNumber(emp->face_color.g)); + cJSON_AddItemToObject(c2, "b", cJSON_CreateNumber(emp->face_color.b)); + cJSON_AddItemToObject(c2, "a", cJSON_CreateNumber(emp->face_color.a)); + cJSON_AddItemToObject(employee, "face_color", c2); + + cJSON *c3 = cJSON_CreateObject(); + cJSON_AddItemToObject(c3, "r", cJSON_CreateNumber(emp->body_color.r)); + cJSON_AddItemToObject(c3, "g", cJSON_CreateNumber(emp->body_color.g)); + cJSON_AddItemToObject(c3, "b", cJSON_CreateNumber(emp->body_color.b)); + cJSON_AddItemToObject(c3, "a", cJSON_CreateNumber(emp->body_color.a)); + cJSON_AddItemToObject(employee, "body_color", c3); + + cJSON_AddItemToArray(employees, employee); + } + + cJSON_AddItemToObject(loc, "employees", employees); + } + + // TODO: job_offers + // TODO: resumes + // TODO: trucks + // TODO: insights + // TODO: schedule + + cJSON_AddItemToArray(locations, loc); + } + + cJSON_AddItemToObject(world, "locations", locations); + } + + char* str = cJSON_Print(world); + printf(str); + cJSON_Delete(world); +} + static void save_state_draw_options(platform_window* window) { s32 screen_center_x = area.x + (area.w/2); @@ -64,14 +219,22 @@ static void save_state_draw_options(platform_window* window) panel_render(scale, panel_x, panel_y, panel_w, panel_h); // top row - for (s32 i = 0; i < 3; i++) - push_save_state_button(scale, 0, panel_x + horizontal_pad + (panel_item_size*i) + - (spacing*i), panel_y + horizontal_pad, panel_item_size); + for (s32 i = 0; i < 3; i++) { + if (push_save_state_button(scale, 0, panel_x + horizontal_pad + (panel_item_size*i) + + (spacing*i), panel_y + horizontal_pad, panel_item_size)) { + if (is_selecting_save_location) write_save_file(i); + else load_save_file(i); + } + } // bottom row - for (s32 i = 0; i < 3; i++) - push_save_state_button(scale, 0, panel_x + horizontal_pad + (panel_item_size*i) + (spacing*i), - panel_y + horizontal_pad + panel_item_size+spacing, panel_item_size); + for (s32 i = 0; i < 3; i++) { + if (push_save_state_button(scale, 0, panel_x + horizontal_pad + (panel_item_size*i) + (spacing*i), + panel_y + horizontal_pad + panel_item_size+spacing, panel_item_size)) { + if (is_selecting_save_location) write_save_file(3 + i); + else load_save_file(3 + i); + } + } // back button { -- cgit v1.2.3-70-g09d2