
// 电脑的IP地址和端口
#define PC_IP "192.168.200.3"
#define PC_SCRIPT_PORT "39018"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#ifdef __SWITCH__
#include <switch.h>
#include <sys/socket.h>
#include <curl/curl.h>
#else
#include <windows.h>
#endif

#include "Asset/Asset_ImagePack.h"
#include "Asset/Asset_Script.h"
#include "squirrel/SquirrelEx.h"
#include "Tool/Logger.h"
#include "EngineCore/Game.h"
#include "Scene/Scene_Loading_UI.h"
#include "Tool/RefPtr.h"
#include "Global/Global_Game.h"
#include "Tool/ThreadPool.h"

void InitScript()
{
    // 初始化脚本资源系统
    Asset_Script::GetInstance().Init();
    // 初始化Image资源系统
    Asset_ImagePack::GetInstance().Init();

    // 更改全局游戏类初始化标志
    Global_Game::GetInstance().InitGame();
}

void RunSetup()
{
    // 初始化全局游戏类
    Global_Game::GetInstance().Init();
    // 初始化Squirrel脚本引擎
    SquirrelEx::GetInstance().Run();

    // 设定UI层场景
    RefPtr<Scene_Loading_UI> sceneUI = new Scene_Loading_UI;
    Game::GetInstance().ChangeUIScene(sceneUI);

    ThreadPool::GetInstance().enqueueToThread(2, InitScript);
}

int main(int argc, char *argv[])
{
#ifdef __SWITCH__
    socketInitializeDefault();
    nxlinkStdio();                         // 启用nxlink调试输出
    curl_global_init(CURL_GLOBAL_DEFAULT); // 初始化libcurl
    chdir("/switch/Lenheart/");
#else
    AllocConsole();
    SetConsoleTitleA("Yosin & Engine");
    SetConsoleOutputCP(65001);
#endif

    // 初始化Image资源系统
    Asset_ImagePack::GetInstance();
    // 初始化脚本资源系统
    Asset_Script::GetInstance();
    // 初始化线程池
    ThreadPool::GetInstance();
    // 初始化日志系统
    // Logger::GetInstance().Init();
    // 初始化Squirrel脚本系统
    SquirrelEx::GetInstance().Init();
    // 初始化游戏引擎
    Game &game = Game::GetInstance();
    // 初始化各项目
    game.Init(RunSetup);
    // 进入游戏循环逻辑
    game.Run();
    game.Clear();

#ifdef __SWITCH__
    socketExit();
    curl_global_cleanup();
#endif
    return 0;
}
