cmake_minimum_required(VERSION 3.20)
project(MegaMan6Recomp C CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(NESRECOMP_GAME_VERSION "0.2.0" CACHE STRING "Game release version")
option(MM6_NETPLAY_QUALIFIED "Allow the qualified MM6 simulation profile online" ON)
option(MM6_ENABLE_NETPLAY "Build shared rollback netplay and lobby" ON)
set(NESRECOMP_ROOT "${CMAKE_SOURCE_DIR}/nesrecomp" CACHE PATH "NESRecomp checkout")
set(NESRECOMP_BACKEND "cycle" CACHE STRING "CPU backend")
set(NESRECOMP_ROM "" CACHE FILEPATH "Original Mega Man 6 USA ROM")
if(NOT NESRECOMP_BACKEND STREQUAL "cycle")
    message(FATAL_ERROR "Mega Man 6 requires the cycle backend")
endif()
if(NOT EXISTS "${NESRECOMP_ROM}")
    message(FATAL_ERROR "Supply -DNESRECOMP_ROM with your Mega Man 6 (USA) ROM")
endif()
find_package(Python3 3.11 REQUIRED COMPONENTS Interpreter)
set(mm6_art "${CMAKE_CURRENT_SOURCE_DIR}/mods/preloaded/packages/mega-man-6-usa.character.protoman/1.0.0/assets")
file(READ "${mm6_art}/protoman.png" MM6_PROTO_PNG_BYTES HEX)
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1,\n" MM6_PROTO_PNG_BYTES "${MM6_PROTO_PNG_BYTES}")
file(READ "${mm6_art}/jump-open.png" MM6_PROTO_JUMP_PNG_BYTES HEX)
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1,\n" MM6_PROTO_JUMP_PNG_BYTES "${MM6_PROTO_JUMP_PNG_BYTES}")
configure_file(src/mm6_proto_sheet.h.in "${CMAKE_CURRENT_BINARY_DIR}/mm6_proto_sheet.h" @ONLY)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${mm6_art}/protoman.png" "${mm6_art}/jump-open.png")
execute_process(COMMAND "${Python3_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/tools/rom_profile.py" "${NESRECOMP_ROM}"
    RESULT_VARIABLE profile_result OUTPUT_VARIABLE profile OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT profile_result EQUAL 0)
    message(FATAL_ERROR "Mega Man 6 ROM profile validation failed")
endif()
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/tools/rom_profile.py" "${NESRECOMP_ROM}")
include("${NESRECOMP_ROOT}/runner/cyc/project.cmake")
nesrecomp_add_cycle_game(MegaMan6Recomp ROM "${NESRECOMP_ROM}"
    GAME_CONFIG "${CMAKE_SOURCE_DIR}/game.toml" SEED_FILE "${CMAKE_SOURCE_DIR}/cyc_seeds_usa.txt" GAME_ID "mega-man-6-usa"
    PLAYERS 2 REGION NTSC MODS GAME_ID "mega-man-6-usa"
    HOST_EXTRAS "${CMAKE_SOURCE_DIR}/src/mm6_host.c" "${CMAKE_SOURCE_DIR}/src/mm6_net.c" "${CMAKE_SOURCE_DIR}/src/mm6_proto.c"
        "${CMAKE_SOURCE_DIR}/src/mm6_view.c" "${CMAKE_SOURCE_DIR}/src/mm6_coop.c" "${CMAKE_SOURCE_DIR}/src/mm6_menu.c" "${CMAKE_SOURCE_DIR}/src/mm6_charge.c" "${CMAKE_SOURCE_DIR}/src/mm6_sprites.c" "${CMAKE_SOURCE_DIR}/src/mm6_world.c" "${CMAKE_SOURCE_DIR}/src/mm6_wide.c" "${CMAKE_SOURCE_DIR}/src/mm6_hud.c"
        "${NESRECOMP_ROOT}/runner/cyc/cyc_protoman_atlas.c")
target_include_directories(MegaMan6Recomp PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_BINARY_DIR}" "${NESRECOMP_ROOT}/runner/src")
target_compile_definitions(MegaMan6Recomp PRIVATE MM6_NETPLAY_QUALIFIED=$<BOOL:${MM6_NETPLAY_QUALIFIED}>)
if(MM6_ENABLE_NETPLAY OR NESRECOMP_ENABLE_NET)
    nesrecomp_enable_recomp_net(MegaMan6Recomp)
endif()
add_custom_command(TARGET MegaMan6Recomp POST_BUILD
    COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_SOURCE_DIR}/mods/preloaded" "$<TARGET_FILE_DIR:MegaMan6Recomp>/mods")
