void save_state_select_scene_init() { } static bool push_save_state_button(float scale, bool enabled, s32 x, s32 y, s32 size) { if (enabled) { return button_render(scale, true, 0, x, y, size, size); } else { 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; } static bool push_back_button(float scale, s32 back_x, s32 back_y, s32 back_w, s32 back_h) { bool result = false; color tint = COLOR_WHITE; if (mouse_interacts(back_x,back_y,back_w,back_h)) { tint = COLOR_BUTTON_ACTIVE_TINT; platform_set_cursor(main_window, CURSOR_POINTER); if (is_left_clicked()) { result = true; audio_play_sound(snd_click, AUDIO_CHANNEL_SFX_1); } } renderer->render_image_tint(img_back, back_x, back_y, back_w, back_h, tint); font* font_sml = fnt_rd20; char* back_text = "Back"; s32 back_text_width = renderer->calculate_text_width(font_sml, back_text); s32 text_x = back_x + (back_w/2) - (back_text_width/2) + (back_w/12); s32 text_y = back_y + (back_h/2) - (font_sml->px_h/2); renderer->render_text(font_sml, text_x+2, text_y+2, back_text, COLOR_TEXT_SHADOW); renderer->render_text(font_sml, text_x, text_y, back_text, COLOR_TEXT); 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); s32 screen_center_y = area.y + (area.h/2); float vertical_pad = 20 * scale; float horizontal_pad = vertical_pad; float spacing = 5 * scale; s32 panel_h = 280 * scale; s32 panel_item_size = (panel_h - (vertical_pad*2) - (spacing*1)) / 2; s32 panel_w = (panel_item_size * 3) + (horizontal_pad*2) + (spacing*2); 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); // top row 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++) { 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 { s32 back_h = img_back->height * scale/2; s32 back_w = img_back->width * scale/2; s32 back_x = panel_x + (panel_item_size/3); s32 back_y = panel_y + panel_h - (back_h/2) - 1; if (push_back_button(scale, back_x, back_y, back_w, back_h)) { if (is_selecting_save_location) { game_set_active_scene(GAME_STATE_WORLD_MAP); } else { game_set_active_scene(GAME_STATE_MENU); } } } } void save_state_select_scene_render(platform_window* window) { menu_draw_background(window); save_state_draw_options(window); } void save_state_select_scene_update(platform_window* window) { if (keyboard_is_key_pressed(KEY_ESCAPE)) { if (is_selecting_save_location) { game_set_active_scene(GAME_STATE_WORLD_MAP); } else { game_set_active_scene(GAME_STATE_MENU); } } } void save_state_select_scene_destroy() { }