cmake_minimum_required(VERSION 3.20)
project(BaitaPhishWeb LANGUAGES C CXX)
if(NOT EMSCRIPTEN)
 message(FATAL_ERROR "Use the pinned Emscripten toolchain via scripts/build-web.sh")
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(SF "${CMAKE_CURRENT_SOURCE_DIR}/../build-web/src/sfml")
add_compile_options(-O1 -fexceptions -sUSE_FREETYPE=1 -Wno-unused-value -Wno-deprecated-declarations)
add_compile_definitions(SFML_STATIC SFML_OPENGL_ES)
include_directories("${SF}/include" "${SF}/src" "${SF}/extlibs/headers/stb_image")
file(GLOB SYS "${SF}/src/SFML/System/*.cpp" "${SF}/src/SFML/System/Unix/*.cpp")
add_library(sfml-system STATIC ${SYS})
file(GLOB WIN "${SF}/src/SFML/Window/*.cpp")
list(FILTER WIN EXCLUDE REGEX "(EglContext|EGLCheck|GlExtensions)\\.cpp$")
add_library(sfml-window STATIC ${WIN})
target_link_libraries(sfml-window PUBLIC sfml-system)
file(GLOB GFX "${SF}/src/SFML/Graphics/*.cpp")
add_library(sfml-graphics STATIC ${GFX})
target_link_libraries(sfml-graphics PUBLIC sfml-window)
add_executable(backend-smoke smoke.cpp)
target_link_libraries(backend-smoke PRIVATE sfml-graphics)
target_link_options(backend-smoke PRIVATE -fexceptions -sUSE_FREETYPE=1 -sALLOW_MEMORY_GROWTH=1 -sFULL_ES2=1 -sASSERTIONS=1 -sMODULARIZE=1 -sEXPORT_NAME=ArcadeSmoke -sENVIRONMENT=web -sEXIT_RUNTIME=0 --preload-file "${CMAKE_CURRENT_SOURCE_DIR}/../build-web/smoke-assets@/resources")
set_target_properties(backend-smoke PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../dist-web")

# Actual offline ONB engine and Lua bindings.
set(BN "${CMAKE_CURRENT_SOURCE_DIR}/../build-web/src/engine")
set(POCO "${CMAKE_CURRENT_SOURCE_DIR}/../dependencies/src/poco-poco-1.12.5-release")
set(LUA "${CMAKE_CURRENT_SOURCE_DIR}/../dependencies/src/lua-5.4.7/src")
file(GLOB LUA_SRC "${LUA}/*.c")
list(FILTER LUA_SRC EXCLUDE REGEX "/(lua|luac)\\.c$")
add_library(lua STATIC ${LUA_SRC})
target_include_directories(lua PUBLIC "${LUA}")
# Buffer serialization is the sole offline Poco consumer. Retain its real exception support.
add_library(poco-offline STATIC "${POCO}/Foundation/src/Exception.cpp" "${POCO}/Foundation/src/Bugcheck.cpp" "${POCO}/Foundation/src/Debugger.cpp")
target_include_directories(poco-offline PUBLIC "${POCO}/Foundation/include" "${POCO}/Net/include")
target_compile_definitions(poco-offline PUBLIC POCO_STATIC EMSCRIPTEN POCO_NO_AUTOMATIC_LIBS)
file(GLOB AUDIO "${SF}/src/SFML/Audio/*.cpp")
list(FILTER AUDIO EXCLUDE REGEX "(Music|SoundStream|SoundRecorder|SoundBufferRecorder|SoundFileReaderFlac|SoundFileWriterFlac|SoundFileWriterOgg)\\.cpp$")
add_library(sfml-audio STATIC ${AUDIO})
target_compile_options(sfml-audio PRIVATE -sUSE_OGG=1 -sUSE_VORBIS=1)
target_link_libraries(sfml-audio PUBLIC sfml-system)
file(GLOB_RECURSE ENGINE "${BN}/*.cpp" "${BN}/zip/*.c")
list(FILTER ENGINE EXCLUDE REGEX "/(main|web-main)\\.cpp$|/sfMidi/|/Android/|/overworld/|/netplay/")
list(FILTER ENGINE EXCLUDE REGEX "/(bnNetManager|bnTitleScene|bnGameOverScene|bnPlayerCustScene|bnMenuScene)\\.cpp$")
list(APPEND ENGINE "${BN}/netplay/bnBufferReader.cpp" "${BN}/netplay/bnBufferWriter.cpp")
add_library(onb STATIC ${ENGINE})
target_include_directories(onb PUBLIC "${BN}" "${BN}/sol/include" "${CMAKE_CURRENT_SOURCE_DIR}/../engine/extern/Swoosh/src")
target_compile_definitions(onb PUBLIC BN_MOD_SUPPORT SOL_ALL_SAFETIES_ON NOMINMAX)
target_link_libraries(onb PUBLIC sfml-graphics sfml-audio lua poco-offline)
add_executable(arcade "${BN}/web-main.cpp")
target_link_libraries(arcade PRIVATE onb)
target_link_options(arcade PRIVATE -fexceptions -sUSE_FREETYPE=1 -sUSE_OGG=1 -sUSE_VORBIS=1 -lopenal -sALLOW_MEMORY_GROWTH=1 -sSTACK_SIZE=8388608 -sFULL_ES2=1 -sASSERTIONS=1 -sMODULARIZE=1 -sEXPORT_NAME=ArcadeGame -sEXPORTED_RUNTIME_METHODS=FS -sENVIRONMENT=web -sEXIT_RUNTIME=0 --preload-file "${CMAKE_CURRENT_SOURCE_DIR}/../build-web/game-assets@/")
set_target_properties(arcade PROPERTIES SUFFIX ".js" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../dist-web")
# Repackage whenever a content input changes, even if no C++ object changed.
file(GLOB_RECURSE GAME_ASSETS CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../build-web/game-assets/*")
file(GLOB_RECURSE SMOKE_ASSETS CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../build-web/smoke-assets/*")
set_property(TARGET arcade APPEND PROPERTY LINK_DEPENDS ${GAME_ASSETS})
set_property(TARGET backend-smoke APPEND PROPERTY LINK_DEPENDS ${SMOKE_ASSETS})
