add_library(obl_common STATIC
    ui/palette_modifiers.cpp
    ui/palette_modifiers.h
    game/rng.cpp
    ui/gui_widget_virtual.h
    ui/renderer_api.h
    tables/catalog_load.cpp
    tables/catalog_load.h
    tables/guest_set_load.cpp
    tables/guest_set_load.h
    objects/guest_sets.h
    world/scenario_load.cpp
    world/scenario_load.h
    ../platform/renderer_jpeg.cpp
    ui/gui_manager_dialogs.h
    ui/gui_manager_buttons.h
    ui/gui_records.h
    ui/gui_radar.h
    ui/scripted_sound.cpp
    ui/scripted_sound_pack.cpp
    ui/loop_sounds.h
    ui/loop_sound_types.h
    ui/gui_modes_place.h
    ui/media_pack.cpp
    ui/media_pack.h
    ui/gui_definitions.h
    game/credits.h
    game/game.h
    game/game_context.h
    ui/sprite.h
    ui/sound_bank.cpp
    ui/sound_bank.h
    ui/font_pack.cpp
    ui/font_pack.h
    ui/blit.cpp
    ui/blit.h
    ui/day_night_present.cpp
    ui/day_night_present.h
    ui/line_draw.cpp
    ui/line_draw.h
    ui/render_geometry.cpp
    ui/render_geometry.h
    ui/sprite_draw.cpp
    ui/sprite_draw.h
    ui/map_math.cpp
    ui/map_math.h
    ui/map_camera.cpp
    ui/map_camera.h
    ui/map_blocks.cpp
    ui/map_blocks.h
    ui/map_culling.cpp
    ui/map_culling.h
    ui/map_rebuild.h
    ui/map_restore.h
    ui/map_view_lifecycle.h
    ui/fill_observer.cpp
    ui/fill_observer.h
    ui/text_observer.cpp
    ui/text_observer.h
    ui/renderer_ops.cpp
    ui/renderer_ops.h
    ../platform/renderer_dirty.h
    ui/map_effects.cpp
    ui/map_effects.h
    map/water_anim.cpp
    map/water_anim.h
    ui/sprite_scan.cpp
    ui/sprite_scan.h
    ui/sprite_preview.cpp
    ui/sprite_preview.h
    ui/sprite_bake.h
    ui/sprite_animation.cpp
    ui/sprite_animation.h
    ui/gui_layouts.cpp
    ui/gui_layouts.h
    map/path_tile_script.cpp
    map/path_tile_script.h
    objects/script_program.cpp
    objects/script_program.h
    objects/script_program_api.cpp
    objects/script_program_api.h
    objects/script_program_ids.cpp
    objects/script_program_ids.h
    objects/script_program_types.h
    objects/script_types.h
    objects/script_program_exec.h
    world/world_script_api.cpp
    world/world_script_api.h
    world/world_script_parse.cpp
    world/world_script_parse.h
    world/world_script_types.h
    map/path_tiles.h
    map/path_tiles_lifecycle.h
    map/path_tiles_rebuild.h
    map/path_tiles_state.h
    map/grid_areas.h
    map/grid_save.h
    map/grid_math.h
    map/grid_class_map.h
    map/grid_screen_rect.h
    objects/object_manager_queries.h
    objects/scenery_queries.h
    objects/object_manager_lifecycle.h
    world/world_queries.h
    tables/building_behavior.h
    tables/world_params_reset.h
    world/world_params_queries.h
    world/world_params.h
    world/world_script_load.h
    world/world_script_load_ids.cpp
    feedback/feedback_vocabulary.cpp
    feedback/feedback_vocabulary.h
    game/scenario_outcome.cpp
    game/scenario_outcome.h
    ../platform/instance_lock.cpp
    ../platform/instance_lock.h
    map/path_state.h
    world/world_snapshot.cpp
    world/world_snapshot.h
    world/world_snapshot_model.cpp
    world/world_snapshot_model.h
    world/world_snapshot_objects.cpp
    world/save_json_values.h
    world/map_load_json.cpp
    world/map_load_json.h
    world/save_sections_load.cpp
    world/save_sections_load.h
    world/save_sections_json.cpp
    world/save_sections_json.h
    world/save_objects_json.cpp
    world/save_objects_json.h
    world/save_objects_load.cpp
    world/save_objects_load.h
    world/save_guests_load.cpp
    world/save_guests_load.h
    world/world_load_json.cpp
    world/world_load_json.h
    world/world_save_json.cpp
    world/world_save_json.h
    world/world_sections.cpp
    world/world_sections.h
    game/command.cpp
    game/command.h
    game/command_recorder.cpp
    game/command_recorder.h
    bot/bot.cpp
    bot/bot.h
    bot/bot_build_tree.cpp
    bot/bot_build_tree.h
    bot/chaos.cpp
    bot/chaos.h
    world/world_daily_stats.h
    objects/building_open_state.h
    game/game_parameters_construct.cpp
    game/game_parameters_construct.h
    ${CMAKE_SOURCE_DIR}/src/game/tables/text_table.cpp
    ${CMAKE_SOURCE_DIR}/src/game/world/world_state.cpp
    ui/save_slot_header.cpp
    ui/save_slot_header.h
    game/start_settings.cpp
    game/start_settings.h
    tables/text_load.cpp
    tables/text_load.h
    game/own_credits.cpp
    game/own_credits.h
    ui/gui_canvas.cpp
    ui/gui_canvas.h
    ui/gui_controls.h
    ui/gui_tables.h
    ui/gui_variable.cpp
    ui/gui_variable.h
    ui/gui_variable_image.cpp
    ui/gui_variable_image.h
    ui/gui_modes_tools.cpp
    ui/gui_modes_tools.h
    objects/building_events.h
    game/game_state_base.h
    game/game_states.h
    game/game_states_logic.h)
target_include_directories(obl_common PUBLIC ${CMAKE_SOURCE_DIR}/src)
target_link_libraries(obl_common PUBLIC SDL3::SDL3-static nlohmann_json::nlohmann_json obl_core obl_formats obl_json_schema)
# All project targets share one float contract: AVX2 scalar math, no FMA contraction
# (/fp:precise without /fp:contract); keep external libraries on their own flags.
if(MSVC)
    target_compile_options(obl_common PUBLIC /arch:AVX2 /fp:precise)
endif()

include(${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/gui_content.cmake)
obl_gui_content_schemas(obl_common)

include(${CMAKE_CURRENT_LIST_DIR}/../../cmake/catalog_schemas.cmake)
obl_catalog_schemas(obl_common)
