diff --git a/source/gui/scripting/ScriptFunctions.cpp b/source/gui/scripting/ScriptFunctions.cpp index d230f1fa34..c42c7a64cc 100644 --- a/source/gui/scripting/ScriptFunctions.cpp +++ b/source/gui/scripting/ScriptFunctions.cpp @@ -19,26 +19,18 @@ #include "scriptinterface/ScriptInterface.h" -#include "graphics/FontMetrics.h" -#include "graphics/GameView.h" -#include "graphics/MapReader.h" #include "graphics/scripting/JSInterface_GameView.h" #include "gui/IGUIObject.h" #include "gui/scripting/JSInterface_GUIManager.h" #include "gui/scripting/JSInterface_GUITypes.h" #include "i18n/scripting/JSInterface_L10n.h" -#include "lib/sysdep/sysdep.h" -#include "lib/utf8.h" #include "lobby/scripting/JSInterface_Lobby.h" #include "network/scripting/JSInterface_Network.h" -#include "ps/GUID.h" -#include "ps/GameSetup/Atlas.h" -#include "ps/Globals.h" // g_frequencyFilter -#include "ps/Hotkey.h" #include "ps/scripting/JSInterface_ConfigDB.h" #include "ps/scripting/JSInterface_Console.h" #include "ps/scripting/JSInterface_Debug.h" #include "ps/scripting/JSInterface_Game.h" +#include "ps/scripting/JSInterface_Main.h" #include "ps/scripting/JSInterface_Mod.h" #include "ps/scripting/JSInterface_SavedGame.h" #include "ps/scripting/JSInterface_VFS.h" @@ -46,7 +38,6 @@ #include "renderer/scripting/JSInterface_Renderer.h" #include "simulation2/scripting/JSInterface_Simulation.h" #include "soundmanager/scripting/JSInterface_Sound.h" -#include "tools/atlas/GameInterface/GameLoop.h" /* * This file defines a set of functions that are available to GUI scripts, to allow @@ -54,127 +45,26 @@ * Functions are exposed to scripts within the global object 'Engine', so * scripts should call "Engine.FunctionName(...)" etc. */ - -extern void restart_mainloop_in_atlas(); // from main.cpp -extern void EndGame(); -extern void kill_mainloop(); - -namespace { - -void OpenURL(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& url) -{ - sys_open_url(url); -} - -std::wstring GetMatchID(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - return ps_generate_guid().FromUTF8(); -} - -void RestartInAtlas(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - restart_mainloop_in_atlas(); -} - -bool AtlasIsAvailable(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - return ATLAS_IsAvailable(); -} - -bool IsAtlasRunning(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - return g_AtlasGameLoop && g_AtlasGameLoop->running; -} - -JS::Value LoadMapSettings(ScriptInterface::CxPrivate* pCxPrivate, const VfsPath& pathname) -{ - JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); - JSAutoRequest rq(cx); - - CMapSummaryReader reader; - - if (reader.LoadMap(pathname) != PSRETURN_OK) - return JS::UndefinedValue(); - - JS::RootedValue settings(cx); - reader.GetMapSettings(*(pCxPrivate->pScriptInterface), &settings); - return settings; -} - -bool HotkeyIsPressed_(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& hotkeyName) -{ - return HotkeyIsPressed(hotkeyName); -} - -void Script_EndGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - EndGame(); -} - -CStrW GetSystemUsername(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - return sys_get_user_name(); -} - -void ExitProgram(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - kill_mainloop(); -} - -// - This value is recalculated once a frame. We take special care to -// filter it, so it is both accurate and free of jitter. -int GetFps(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) -{ - int freq = 0; - if (g_frequencyFilter) - freq = g_frequencyFilter->StableFrequency(); - return freq; -} - -int GetTextWidth(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStr& fontName, const CStrW& text) -{ - int width = 0; - int height = 0; - CStrIntern _fontName(fontName); - CFontMetrics fontMetrics(_fontName); - fontMetrics.CalculateStringSize(text.c_str(), width, height); - return width; -} - -} // namespace - void GuiScriptingInit(ScriptInterface& scriptInterface) { JSI_IGUIObject::init(scriptInterface); JSI_GUITypes::init(scriptInterface); - JSI_GameView::RegisterScriptFunctions(scriptInterface); - JSI_Renderer::RegisterScriptFunctions(scriptInterface); - JSI_Console::RegisterScriptFunctions(scriptInterface); JSI_ConfigDB::RegisterScriptFunctions(scriptInterface); + JSI_Console::RegisterScriptFunctions(scriptInterface); JSI_Debug::RegisterScriptFunctions(scriptInterface); - JSI_Game::RegisterScriptFunctions(scriptInterface); JSI_GUIManager::RegisterScriptFunctions(scriptInterface); - JSI_Mod::RegisterScriptFunctions(scriptInterface); - JSI_Network::RegisterScriptFunctions(scriptInterface); - JSI_SavedGame::RegisterScriptFunctions(scriptInterface); - JSI_Sound::RegisterScriptFunctions(scriptInterface); - JSI_Simulation::RegisterScriptFunctions(scriptInterface); + JSI_Game::RegisterScriptFunctions(scriptInterface); + JSI_GameView::RegisterScriptFunctions(scriptInterface); JSI_L10n::RegisterScriptFunctions(scriptInterface); JSI_Lobby::RegisterScriptFunctions(scriptInterface); + JSI_Main::RegisterScriptFunctions(scriptInterface); + JSI_Mod::RegisterScriptFunctions(scriptInterface); + JSI_Network::RegisterScriptFunctions(scriptInterface); + JSI_Renderer::RegisterScriptFunctions(scriptInterface); + JSI_SavedGame::RegisterScriptFunctions(scriptInterface); + JSI_Simulation::RegisterScriptFunctions(scriptInterface); + JSI_Sound::RegisterScriptFunctions(scriptInterface); JSI_VFS::RegisterScriptFunctions(scriptInterface); JSI_VisualReplay::RegisterScriptFunctions(scriptInterface); - - scriptInterface.RegisterFunction("EndGame"); - scriptInterface.RegisterFunction("OpenURL"); - scriptInterface.RegisterFunction("GetMatchID"); - scriptInterface.RegisterFunction("RestartInAtlas"); - scriptInterface.RegisterFunction("AtlasIsAvailable"); - scriptInterface.RegisterFunction("IsAtlasRunning"); - scriptInterface.RegisterFunction("LoadMapSettings"); - scriptInterface.RegisterFunction("HotkeyIsPressed"); - scriptInterface.RegisterFunction("Exit"); - scriptInterface.RegisterFunction("GetFPS"); - scriptInterface.RegisterFunction("GetTextWidth"); - scriptInterface.RegisterFunction("GetSystemUsername"); } diff --git a/source/ps/scripting/JSInterface_Game.cpp b/source/ps/scripting/JSInterface_Game.cpp index 4ae8d399d6..de1c1843a5 100644 --- a/source/ps/scripting/JSInterface_Game.cpp +++ b/source/ps/scripting/JSInterface_Game.cpp @@ -30,6 +30,8 @@ #include "simulation2/Simulation2.h" #include "soundmanager/SoundManager.h" +extern void EndGame(); + void JSI_Game::StartGame(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs, int playerID) { ENSURE(!g_NetServer); @@ -50,6 +52,11 @@ void JSI_Game::StartGame(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue g_Game->StartGame(&gameAttribs, ""); } +void JSI_Game::Script_EndGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + EndGame(); +} + int JSI_Game::GetPlayerID(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) { if (!g_Game) @@ -155,6 +162,7 @@ void JSI_Game::DumpTerrainMipmap(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) void JSI_Game::RegisterScriptFunctions(const ScriptInterface& scriptInterface) { scriptInterface.RegisterFunction("StartGame"); + scriptInterface.RegisterFunction("EndGame"); scriptInterface.RegisterFunction("GetPlayerID"); scriptInterface.RegisterFunction("SetPlayerID"); scriptInterface.RegisterFunction("SetViewedPlayer"); diff --git a/source/ps/scripting/JSInterface_Game.h b/source/ps/scripting/JSInterface_Game.h index cdba96268d..06e99913de 100644 --- a/source/ps/scripting/JSInterface_Game.h +++ b/source/ps/scripting/JSInterface_Game.h @@ -23,6 +23,7 @@ namespace JSI_Game { void StartGame(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs, int playerID); + void Script_EndGame(ScriptInterface::CxPrivate* pCxPrivate); int GetPlayerID(ScriptInterface::CxPrivate* pCxPrivate); void SetPlayerID(ScriptInterface::CxPrivate* pCxPrivate, int id); void SetViewedPlayer(ScriptInterface::CxPrivate* pCxPrivate, int id); diff --git a/source/ps/scripting/JSInterface_Main.cpp b/source/ps/scripting/JSInterface_Main.cpp new file mode 100644 index 0000000000..12cc3692d4 --- /dev/null +++ b/source/ps/scripting/JSInterface_Main.cpp @@ -0,0 +1,124 @@ +/* Copyright (C) 2017 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +#include "precompiled.h" + +#include "JSInterface_Main.h" + +#include "graphics/FontMetrics.h" +#include "graphics/MapReader.h" +#include "lib/sysdep/sysdep.h" +#include "lib/utf8.h" +#include "ps/CStrIntern.h" +#include "ps/GUID.h" +#include "ps/GameSetup/Atlas.h" +#include "ps/Globals.h" +#include "ps/Hotkey.h" +#include "tools/atlas/GameInterface/GameLoop.h" + +extern void restart_mainloop_in_atlas(); +extern void kill_mainloop(); + +void JSI_Main::ExitProgram(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + kill_mainloop(); +} + +void JSI_Main::RestartInAtlas(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + restart_mainloop_in_atlas(); +} + +bool JSI_Main::AtlasIsAvailable(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + return ATLAS_IsAvailable(); +} + +bool JSI_Main::IsAtlasRunning(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + return g_AtlasGameLoop && g_AtlasGameLoop->running; +} + +void JSI_Main::OpenURL(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& url) +{ + sys_open_url(url); +} + +std::wstring JSI_Main::GetSystemUsername(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + return sys_get_user_name(); +} + +std::wstring JSI_Main::GetMatchID(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + return ps_generate_guid().FromUTF8(); +} + +JS::Value JSI_Main::LoadMapSettings(ScriptInterface::CxPrivate* pCxPrivate, const VfsPath& pathname) +{ + JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); + JSAutoRequest rq(cx); + + CMapSummaryReader reader; + + if (reader.LoadMap(pathname) != PSRETURN_OK) + return JS::UndefinedValue(); + + JS::RootedValue settings(cx); + reader.GetMapSettings(*(pCxPrivate->pScriptInterface), &settings); + return settings; +} + +bool JSI_Main::HotkeyIsPressed_(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& hotkeyName) +{ + return HotkeyIsPressed(hotkeyName); +} + +// This value is recalculated once a frame. We take special care to +// filter it, so it is both accurate and free of jitter. +int JSI_Main::GetFps(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + if (!g_frequencyFilter) + return 0; + + return g_frequencyFilter->StableFrequency(); +} + +int JSI_Main::GetTextWidth(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& fontName, const std::wstring& text) +{ + int width = 0; + int height = 0; + CStrIntern _fontName(fontName); + CFontMetrics fontMetrics(_fontName); + fontMetrics.CalculateStringSize(text.c_str(), width, height); + return width; +} + +void JSI_Main::RegisterScriptFunctions(const ScriptInterface& scriptInterface) +{ + scriptInterface.RegisterFunction("Exit"); + scriptInterface.RegisterFunction("RestartInAtlas"); + scriptInterface.RegisterFunction("AtlasIsAvailable"); + scriptInterface.RegisterFunction("IsAtlasRunning"); + scriptInterface.RegisterFunction("OpenURL"); + scriptInterface.RegisterFunction("GetSystemUsername"); + scriptInterface.RegisterFunction("GetMatchID"); + scriptInterface.RegisterFunction("LoadMapSettings"); + scriptInterface.RegisterFunction("HotkeyIsPressed"); + scriptInterface.RegisterFunction("GetFPS"); + scriptInterface.RegisterFunction("GetTextWidth"); +} diff --git a/source/ps/scripting/JSInterface_Main.h b/source/ps/scripting/JSInterface_Main.h new file mode 100644 index 0000000000..06772bcc56 --- /dev/null +++ b/source/ps/scripting/JSInterface_Main.h @@ -0,0 +1,40 @@ +/* Copyright (C) 2017 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +#ifndef INCLUDED_JSI_MAIN +#define INCLUDED_JSI_MAIN + +#include "scriptinterface/ScriptInterface.h" + +namespace JSI_Main +{ + void ExitProgram(ScriptInterface::CxPrivate* pCxPrivate); + void RestartInAtlas(ScriptInterface::CxPrivate* pCxPrivate); + bool AtlasIsAvailable(ScriptInterface::CxPrivate* pCxPrivate); + bool IsAtlasRunning(ScriptInterface::CxPrivate* pCxPrivate); + void OpenURL(ScriptInterface::CxPrivate* pCxPrivate, const std::string& url); + std::wstring GetSystemUsername(ScriptInterface::CxPrivate* pCxPrivate); + std::wstring GetMatchID(ScriptInterface::CxPrivate* pCxPrivate); + JS::Value LoadMapSettings(ScriptInterface::CxPrivate* pCxPrivate, const VfsPath& pathname); + bool HotkeyIsPressed_(ScriptInterface::CxPrivate* pCxPrivate, const std::string& hotkeyName); + int GetFps(ScriptInterface::CxPrivate* pCxPrivate); + int GetTextWidth(ScriptInterface::CxPrivate* pCxPrivate, const std::string& fontName, const std::wstring& text); + + void RegisterScriptFunctions(const ScriptInterface& scriptInterface); +} + +#endif