# The game, the test interpreter and the platform layer; OpenBeach.exe links these objects (docs/architecture/portable-host.md).
add_library(openbeach OBJECT
    ../game/game/game.cpp
    ../game/game/game_parameters.cpp
    ../game/game/game_api.h
    ../platform/host_text.cpp
    ../game/game/host_text.h
    ../game/ui/scripted_sound_runtime.cpp
    ../game/ui/loop_sound_control.cpp
    ../game/world/world_script_host_game.cpp
    ../game/world/world_script_host_game.h
    ../game/ui/text_renderer.cpp
    ../game/ui/text_renderer.h
    ../game/game/game_states.cpp
    ../game/game/world_test_state.cpp
    ../game/game/world_test_state.h
    ../game/game/command_executor.cpp
    ../game/game/command_executor.h
    ../game/game/command_loop.cpp
    ../game/game/command_loop.h
    ../game/ui/gui_actions.cpp
    ../game/ui/gui_action_entries.h
    ../game/ui/gui_modes_place.cpp
    ../game/ui/gui_modes_place.h
    ../game/ui/gui_script.cpp
    ../game/ui/gui_script.h
    ../game/ui/gui_script_leaves.cpp
    ../game/ui/gui_script_leaves.h
    ../game/ui/gui_script_parse.cpp
    ../game/ui/gui_script_parse.h
    ../game/ui/gui_widgets.cpp
    ../game/ui/gui_widgets_leaves.cpp
    ../game/ui/gui_widgets_image_bar.cpp
    ../game/ui/gui_widgets.h
    ../game/ui/gui_controls.cpp
    ../game/ui/gui_controls.h
    ../game/ui/gui_controls_check.inl
    ../game/ui/gui_containers.cpp
    ../game/ui/gui_containers.h
    ../game/ui/gui_lists.cpp
    ../game/ui/gui_lists.h
    ../game/ui/gui_tables.cpp
    ../game/ui/gui_tables.h
    ../game/ui/gui_script_state.cpp
    ../game/ui/gui_script_state.h
    ../game/ui/gui_sort.cpp
    ../game/ui/gui_manager_buttons.cpp
    ../game/ui/gui_manager_buttons.h
    ../platform/file_output.cpp
    ../game/ui/file_output.h
    ../game/ui/gui_tooltip.cpp
    ../game/ui/gui_tooltip.h
    ../game/ui/gui_manager_dialogs.cpp
    ../game/ui/gui_manager_dialogs.h
    ../game/ui/gui_manager_frame.cpp
    ../game/ui/gui_manager_frame.h
    ../game/ui/gui_radar.cpp
    ../game/ui/gui_radar.h
    ../game/ui/gui_sort.h
    ../game/ui/gui_trivial_slots.cpp
    ../game/game/save_load.cpp
    ../game/game/save_load.h
    ../game/ui/save_slots.cpp
    ../game/ui/save_slots.h
    ../game/game/settings_store.cpp
    ../game/ui/sprite_bank.cpp
    ../game/ui/sprite_bank.h
    ../game/ui/gui_variable_draw.cpp
    ../game/ui/gui_variable.h
    ../game/ui/gui_variable_lifecycle.cpp
    ../game/ui/gui_variable_lifecycle.h
    ../game/ui/gui_variable_image_draw.cpp
    ../game/ui/gui_variable_image.h
    ../game/ui/gui_modes_tools_runtime.cpp
    ../game/ui/gui_modes_tools.h
    ../game/ui/sprite_observer.cpp
    ../game/ui/sprite_observer.h
    ../platform/mp3_length_scan.cpp
    ../platform/mp3_length_scan.h
    ../game/ui/gui_canvas_live.cpp
    ../game/ui/gui_canvas_live.h
    ../game/ui/sprite_instance_render.cpp
    ../game/ui/sprite_instance_render.h
    ../game/ui/sprite_instance_geometry.cpp
    ../game/ui/sprite_instance_geometry.h
    ../game/ui/map_view_projection.cpp
    ../game/ui/map_view_access.h
    ../game/ui/map_view_math.cpp
    ../game/ui/map_view_math.h
    ../game/ui/map_view_camera.cpp
    ../game/ui/map_view_blocks.cpp
    ../game/ui/map_view_blocks.h
    ../game/ui/map_view_rebuild.cpp
    ../game/ui/map_view_restore.cpp
    ../game/ui/map_view_restore.h
    ../game/ui/map_view_snapshot.h
    ../game/ui/map_view_culling.cpp
    ../game/ui/image.cpp
    ../game/ui/image.h
    ../game/ui/day_night_present_runtime.cpp
    ../game/ui/day_night_present_runtime.h
    ../game/ui/line_draw_runtime.cpp
    ../game/ui/line_draw.h
    ../game/ui/palette_modifiers_runtime.cpp
    ../game/ui/palette_modifiers.h
    ../game/ui/map_view_effects.cpp
    ../game/map/water_anim_renderer.cpp
    ../game/ui/map_view_lifecycle.cpp
    ../game/ui/sprite_instance_draw.cpp
    ../game/ui/sprite_instance_scan.cpp
    ../game/ui/sprite_instance_anim.cpp
    ../game/ui/sprite_instance_preview.cpp
    ../game/ui/sprite_instance_preview.h
    ../game/ui/sprite_instance_bake.cpp
    ../game/ui/sprite_instance_bake.h
    ../game/ui/sprite_anim.cpp
    ../game/ui/sprite_anim.h
    ${PROJECT_SOURCE_DIR}/src/platform/sample_stream.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/audio_output.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/audio_output.h
    ../game/ui/sample_stream.h
    ../game/ui/sample_mixer.cpp
    ../game/ui/sample_mixer.h
    ../testing/samples.cpp
    ../testing/spatial_samples.cpp
    ../testing/binary_serial.cpp
    ../testing/binary_serial.h
    ../testing/savegame_managers.cpp
    ../testing/savegame_managers.h
    ${PROJECT_SOURCE_DIR}/src/platform/config.cpp
    game_start.cpp
    init.h
    ../platform/headless_main.cpp
    ../platform/headless_main.h
    ../game/ui/blit_runtime.cpp
    ../game/ui/blit.h
    ${PROJECT_SOURCE_DIR}/src/platform/diagnostics.cpp
    ../game/game/diagnostics.h
    ../game/game/startup.cpp
    ../game/game/startup_tables.cpp
    ../game/game/startup.h
    ../game/game/startup_tables.h
    ../game/ui/input_backend.h
    ../game/ui/input_ops.cpp
    ../game/ui/cursor.cpp
    ../game/ui/cursor.h
    ../game/ui/display_geometry.h
    ../platform/pl_mpeg_impl.c
    ../game/objects/lifeguard_fns.cpp
    ../game/objects/lifeguard_fns.h
    ../game/construction/construction_manager.cpp
    ../game/construction/construction_manager.h
    ../game/construction/construction_assign.cpp
    ../game/construction/construction_reallocate.cpp
    ../game/ui/rep_security.cpp
    ../game/ui/rep_security.h
    ../game/construction/builder_script_queries.cpp
    ../game/construction/builder_script_queries.h
    ../game/objects/person_methods.cpp
    ../game/construction/construction_cost_point.cpp
    ../game/construction/construction_start.cpp
    ../game/construction/construction_finish.cpp
    ../game/construction/construction_workpoints.cpp
    ../game/construction/construction_footprint.cpp
    ../game/objects/mover.cpp
    ../game/objects/mover_visibility.cpp
    ../game/objects/mover_receive.cpp
    ../game/objects/entity_accessors.cpp
    ../game/objects/entity_lifecycle.cpp
    ../game/objects/mover_lifecycle.cpp
    ../game/objects/mover_env.h
    ../game/map/path_route.cpp
    ../game/map/path_search_support.h
    ../game/map/grid_areas.cpp
    ../game/map/grid_lifecycle.cpp
    ../game/map/grid_screen_rect.cpp
    ../game/map/grid_class_map.cpp
    ../game/map/grid_queries.cpp
    ../game/objects/object_manager_lifecycle.cpp
    ../game/objects/object_registry_api.cpp
    ../game/objects/object_virtuals.cpp
    ../game/objects/object_registry_api.h
    ../game/objects/scenery.cpp
    ../game/objects/scenery_lifecycle.cpp
    ../game/objects/scenery_lifecycle.h
    ../game/objects/scenery_serial.cpp
    ../game/ui/map_cache.cpp
    ../game/objects/scenery_draw.cpp
    ../game/objects/scenery_draw.h
    ../game/objects/scenery_message.cpp
    ../game/objects/scenery_state.cpp
    ../game/objects/prop.cpp
    ../game/world/world_queries.cpp
    ../game/world/world_queries_api.h
    ../game/map/path_predicates.cpp
    ../game/map/path_tiles_lifecycle.cpp
    ../game/map/path_queries.h
    ../game/map/path_tiles_rebuild.cpp
    ../game/ui/media_files.cpp
    ../game/ui/media_files.h
    ../game/ui/music_player.cpp
    ../game/ui/music_player.h
    ../game/ui/playlist_state.cpp
    ../game/ui/playlist_playback.cpp
    ../game/ui/text_table.cpp
    ../game/ui/text_table.h
    ../game/messages/message_handler.cpp
    ../game/messages/message_handler.h
    ../game/objects/script_program_load.cpp
    ../game/objects/script_program_load.h
    ../game/objects/script_program_run.cpp
    ../game/objects/script_program_run.h
    ../game/world/world_script.cpp
    ../game/world/world_script_machine.cpp
    ../game/cleaning/cleaning_manager.cpp
    ../game/cleaning/cleaning_manager.h
    ../game/feedback/feedback_manager.cpp
    ../game/feedback/feedback_manager.h
    ../game/events/event_manager.cpp
    ../game/events/event_manager.h
    ../game/ferry/ferry.cpp
    ../game/ferry/ferry.h
    ../game/repair/repair_manager.cpp
    ../game/repair/repair_manager.h
    ../game/world/world_script.h
    ../game/world/world_script_load.cpp
    ../game/objects/guest.cpp
    ../game/objects/guest_actions.cpp
    ../game/objects/guest_conflict.cpp
    ../game/objects/guest_desire_actions.cpp
    ../game/objects/guest_appearance.cpp
    ../game/objects/guest_placement.cpp
    ../game/objects/guest_selection.cpp
    ../game/objects/guest_variable_text.cpp
    ../game/objects/building_variable_text.cpp
    ../game/objects/guest_draw.cpp
    ../game/objects/guest_walk_targets.cpp
    ../game/objects/guest_dispatch.cpp
    ../game/objects/guest_pool.cpp
    ../game/objects/guest_animation.cpp
    ../game/objects/guest_walk_routes.cpp
    ../game/objects/guest_search_desire.cpp
    ../game/objects/guest_lookups.cpp
    ../game/objects/guest_thoughts.cpp
    ../game/objects/guest_beach.cpp
    ../game/objects/guest_opinion_helpers.cpp
    ../game/objects/guest_lifecycle_driver.cpp
    ../game/objects/guest.h
    ../game/objects/guest_script.cpp
    ../game/objects/guest_script.h
    ../game/objects/staff_roster.cpp
    ../game/objects/staff_direct.cpp
    ../game/objects/staff_direct.h
    ../game/objects/staff_actions.cpp
    ../game/objects/staff_actions.h
    ../game/objects/staff_construct.cpp
    ../game/objects/staff_call.cpp
    ../game/objects/staff_call.h
    ../game/objects/staff_service.cpp
    ../game/objects/staff_service.h
    ../game/objects/staff_snooty.cpp
    ../game/objects/staff_snooty.h
    ../game/objects/staff_lifecycle.cpp
    ../game/objects/performer_lifecycle.cpp
    ../game/objects/performer_methods.cpp
    ../game/objects/performer_virtuals.cpp
    ../game/objects/vehicle.cpp
    ../game/objects/vehicle_presentation.cpp
    ../game/ui/furniture_runtime.cpp
    ../game/objects/shark.cpp
    ../game/objects/staff_roster.h
    ../game/objects/staff_profession_values.cpp
    ../game/objects/staff_queries.cpp
    ../game/objects/staff_queries.h
    ../game/objects/staff_text.cpp
    ../game/objects/staff_text.h
    ../game/objects/vehicle_lifecycle.cpp
    ../game/objects/vehicle_messages.cpp
    ../game/objects/staff_feedback.cpp
    ../game/objects/staff_feedback.h
    ../game/objects/staff_values.cpp
    ../game/objects/staff_values.h
    ../game/objects/staff_variables.cpp
    ../game/objects/staff_duties.cpp
    ../game/objects/staff_select_draw.cpp
    ../game/objects/staff_variable_text.cpp
    ../game/weather/weather.cpp
    ../game/weather/weather.h
    ../game/weather/weather_lifecycle.cpp
    ../game/weather/weather_draw.cpp
    ../game/world/world_update.cpp
    ../game/world/world_update.h
    ../game/world/world_messages.cpp
    ../game/world/world_messages.h
    ../game/world/world_control.cpp
    ../game/world/world_control.h
    ../game/world/world_step.cpp
    ../game/world/world_step.h
    ../game/world/world_view.cpp
    ../game/world/world_view.h
    ../game/world/world_factory.cpp
    ../game/world/world_factory.h
    ../game/world/world_lifecycle.cpp
    ../game/world/world_lifecycle.h
    ../game/world/world_create.cpp
    ../game/world/world_create.h
    ../game/world/world_objects.cpp
    ../game/world/world_objects.h
    ../game/world/world_receive.cpp
    ../game/world/world_receive.h
    ../game/objects/building_methods.cpp
    ../game/objects/building_methods.h
    ../game/objects/building_draw.cpp
    ../game/objects/building_api.cpp
    ../game/objects/building_api.h
    ../game/objects/building_thoughts.cpp
    ../game/objects/building_destruct.cpp
    ../game/objects/building_construct.cpp
    ../game/objects/building_serial.cpp
    ../game/objects/building_queue.cpp
    ../game/objects/building_queue.h
    ../game/objects/building_queue_lifecycle.cpp
    ../game/objects/commodity_providers.cpp
    ../game/objects/commodity_providers.h
    ../game/ui/font_construct.cpp
    ../game/ui/font_construct.h
    ../game/ui/music_stream.cpp
    ../game/ui/music_stream.h
    ../game/ui/music_backend.cpp
    ../platform/dr_mp3_impl.c
    ../game/ui/resolutions.cpp
    ../game/ui/resolutions.h
    ../game/ui/text_encoding.cpp
    ../game/ui/text_encoding.h
    ${PROJECT_SOURCE_DIR}/src/platform/windowed_display.cpp
    ../game/ui/gui_content_runtime.cpp
    ../game/ui/gui_layouts_runtime.cpp
    ../game/world/world_params_process.cpp
    ../game/world/world_params_queries.cpp
    ../game/objects/building_events.cpp
    ../game/objects/building_events_trace.h
    ../platform/runtime.cpp
    fatal.cpp
    runtime_reports.h
    ../testing/autotest.cpp
    ../testing/assertions.cpp
    ../testing/assertions.h
    ../testing/autotest.h
    ../testing/breakdowns.cpp
    ../testing/building_fixture.cpp
    ../platform/test_tools/crash.cpp
    ../platform/test_tools/expected_exit.cpp
    ../platform/test_tools/expected_exit.h
    ../platform/test_tools/crash.h
    ../platform/test_tools/profile.cpp
    ../platform/test_tools/profile.h
    ../testing/determinism.cpp
    ../testing/determinism.h
    ../testing/breakdowns.h
    ../testing/building_events.cpp
    ../testing/building_events.h
    ../testing/flow.cpp
    ../testing/flow.h
    ../testing/golden.cpp
    ../testing/golden.h
    ../testing/guest_desires.cpp
    ../testing/guest_desires.h
    ../testing/commodity_providers.cpp
    ../testing/commodity_providers.h
    ../testing/mp3_scan.cpp
    ../testing/mp3_scan.h
    ../testing/image_load.cpp
    ../testing/image_load.h
    ../testing/world_dump.cpp
    ../testing/world_dump.h
    ../testing/gui_capture.cpp
    ../testing/gui_capture.h
    ../testing/gui_control.cpp
    ../testing/gui_control.h
    ../testing/gui_dump.cpp
    ../testing/gui_dump.h
    ../testing/gui_tree.cpp
    ../testing/gui_tree.h
    ../testing/music.cpp
    ../testing/music.h
    ../testing/power_startup.cpp
    ../testing/cleaning_manager.cpp
    ../testing/cleaning_manager.h
    ../testing/feedback_manager.cpp
    ../testing/feedback_manager.h
    ../testing/repair_manager.cpp
    ../testing/repair_manager.h
    ../testing/power_startup.h
    ../testing/commands.cpp
    ../testing/commands.h
    ../testing/world_state.cpp
    ../testing/world_create_props.cpp
    ../testing/world_create_props.h
    ../testing/world_create_building.cpp
    ../testing/world_create_building.h
    ../testing/world_state.h
    ../testing/bot_host.cpp
    ../testing/bot_host.h
    ../testing/chaos_host.cpp
    ../testing/chaos_host.h
    ../testing/headless_sim.cpp
    ../testing/headless_sim.h
    ../testing/world_hash.cpp
    ../testing/world_hash.h
    ../testing/replay.cpp
    ../testing/replay.h
    ../testing/world_params.cpp
    ../testing/world_params.h
    ../testing/png.cpp
    ../testing/gui_image_bar_frame.cpp
    ../testing/gui_image_bar_frame.h
    ../testing/png.h
    ../platform/test_tools/presenter.cpp
    ../platform/test_tools/presenter.h
    ../platform/test_tools/cursor.cpp
    ../platform/test_tools/cursor.h
    ../platform/test_tools/windowed_display.cpp
    ../platform/test_tools/windowed_display.h)
# src/platform/: Windows/SDL backends without layout or process-image reach (docs/architecture/platform.md).
target_sources(openbeach PRIVATE
    ${PROJECT_SOURCE_DIR}/src/platform/renderer_helpers.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/renderer_capture.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/renderer_lifecycle.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/renderer_draw.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/hidden_window.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/hidden_window.h
    ${PROJECT_SOURCE_DIR}/src/platform/import_redirect.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/import_redirect.h
    ${PROJECT_SOURCE_DIR}/src/platform/renderer_surface.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/renderer_display.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/renderer_display.h
    ${PROJECT_SOURCE_DIR}/src/platform/frame_limiter.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/frame_limiter.h
    ${PROJECT_SOURCE_DIR}/src/platform/platform_main.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/platform_main.h
    ${PROJECT_SOURCE_DIR}/src/platform/input_mapping.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/cursor.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/cursor.h
    ${PROJECT_SOURCE_DIR}/src/platform/input.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/input.h
    ${PROJECT_SOURCE_DIR}/src/platform/intro_movie.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/intro_movie.h
    ${PROJECT_SOURCE_DIR}/src/platform/playlist_id3.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/playlist_directory_scan.cpp
    ${PROJECT_SOURCE_DIR}/src/game/ui/playlist_services.h
    ${PROJECT_SOURCE_DIR}/src/platform/sdl_present.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/log_emergency.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/log_emergency.h
    ${PROJECT_SOURCE_DIR}/src/platform/window_placement.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/window_placement.h
    ${PROJECT_SOURCE_DIR}/src/platform/display_window.h
    ${PROJECT_SOURCE_DIR}/src/platform/sdl_present.h
    ${PROJECT_SOURCE_DIR}/src/platform/sound_lifecycle.cpp
    ${PROJECT_SOURCE_DIR}/src/platform/sound_lifecycle.h
    ${PROJECT_SOURCE_DIR}/src/platform/memory_mapping.cpp
    ${PROJECT_SOURCE_DIR}/src/game/ui/memory_mapping.h
)

target_include_directories(openbeach PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${pl_mpeg_SOURCE_DIR} ${dr_mp3_SOURCE_DIR})
# Third-party decoder: keep its own warnings out of the /W4 build log.
set_source_files_properties(../platform/pl_mpeg_impl.c PROPERTIES COMPILE_OPTIONS "/W0")
set_source_files_properties(../platform/dr_mp3_impl.c PROPERTIES COMPILE_OPTIONS "/W0")
target_link_libraries(openbeach PUBLIC obl_common obl_convert nlohmann_json::nlohmann_json SDL3::SDL3-static dbghelp)
include(${CMAKE_SOURCE_DIR}/cmake/embedded_icon.cmake)
obl_embedded_icon(openbeach)
