Merge remote-tracking branch 'origin/develop' into terrain-rewrite
# Conflicts: # lib/Terrain.cpp # lib/Terrain.h # lib/battle/CBattleInfoEssentials.cpp # lib/rmg/ObstaclePlacer.cpp # lib/rmg/RiverPlacer.cpp
8
.github/workflows/github.yml
vendored
@ -90,6 +90,12 @@ jobs:
|
|||||||
preset: macos-arm-conan-ninja-release
|
preset: macos-arm-conan-ninja-release
|
||||||
conan_profile: macos-arm
|
conan_profile: macos-arm
|
||||||
artifact_platform: arm
|
artifact_platform: arm
|
||||||
|
- platform: ios
|
||||||
|
os: macos-12
|
||||||
|
test: 0
|
||||||
|
pack: 1
|
||||||
|
extension: ipa
|
||||||
|
preset: ios-release
|
||||||
- platform: mxe
|
- platform: mxe
|
||||||
os: ubuntu-20.04
|
os: ubuntu-20.04
|
||||||
mxe: i686-w64-mingw32.shared
|
mxe: i686-w64-mingw32.shared
|
||||||
@ -189,6 +195,8 @@ jobs:
|
|||||||
cd '${{github.workspace}}/out/build/${{matrix.preset}}'
|
cd '${{github.workspace}}/out/build/${{matrix.preset}}'
|
||||||
CPACK_PATH=`which -a cpack | grep -m1 -v -i chocolatey`
|
CPACK_PATH=`which -a cpack | grep -m1 -v -i chocolatey`
|
||||||
"$CPACK_PATH" -C ${{env.BUILD_TYPE}} ${{ matrix.cpack_args }}
|
"$CPACK_PATH" -C ${{env.BUILD_TYPE}} ${{ matrix.cpack_args }}
|
||||||
|
test -f '${{github.workspace}}/CI/${{matrix.platform}}/post_pack.sh' \
|
||||||
|
&& '${{github.workspace}}/CI/${{matrix.platform}}/post_pack.sh' '${{github.workspace}}' "$(ls '${{ env.VCMI_PACKAGE_FILE_NAME }}'.*)"
|
||||||
rm -rf _CPack_Packages
|
rm -rf _CPack_Packages
|
||||||
|
|
||||||
- name: Additional logs
|
- name: Additional logs
|
||||||
|
2
.gitignore
vendored
@ -39,6 +39,8 @@ doc/*
|
|||||||
VCMI_VS11.sdf
|
VCMI_VS11.sdf
|
||||||
*.ipch
|
*.ipch
|
||||||
VCMI_VS11.opensdf
|
VCMI_VS11.opensdf
|
||||||
|
.DS_Store
|
||||||
|
CMakeUserPresets.json
|
||||||
|
|
||||||
# Visual Studio
|
# Visual Studio
|
||||||
*.suo
|
*.suo
|
||||||
|
@ -13,7 +13,12 @@
|
|||||||
#include "PossibleSpellcast.h"
|
#include "PossibleSpellcast.h"
|
||||||
#include "PotentialTargets.h"
|
#include "PotentialTargets.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CSpell;
|
class CSpell;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class EnemyInfo;
|
class EnemyInfo;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -33,7 +33,7 @@ endif()
|
|||||||
|
|
||||||
add_library(BattleAI SHARED ${battleAI_SRCS} ${battleAI_HEADERS})
|
add_library(BattleAI SHARED ${battleAI_SRCS} ${battleAI_HEADERS})
|
||||||
target_include_directories(BattleAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(BattleAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
target_link_libraries(BattleAI PRIVATE vcmi)
|
target_link_libraries(BattleAI PRIVATE ${VCMI_LIB_TARGET})
|
||||||
|
|
||||||
vcmi_set_output_dir(BattleAI "AI")
|
vcmi_set_output_dir(BattleAI "AI")
|
||||||
enable_pch(BattleAI)
|
enable_pch(BattleAI)
|
||||||
|
@ -9,11 +9,15 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
namespace battle
|
namespace battle
|
||||||
{
|
{
|
||||||
class Unit;
|
class Unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class EnemyInfo
|
class EnemyInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -14,8 +14,12 @@
|
|||||||
|
|
||||||
#include "../../lib/battle/Destination.h"
|
#include "../../lib/battle/Destination.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CSpell;
|
class CSpell;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class PossibleSpellcast
|
class PossibleSpellcast
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -18,9 +18,14 @@
|
|||||||
#include "../../lib/battle/BattleProxy.h"
|
#include "../../lib/battle/BattleProxy.h"
|
||||||
#include "../../lib/battle/CUnitState.h"
|
#include "../../lib/battle/CUnitState.h"
|
||||||
|
|
||||||
class HypotheticBattle;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CStack;
|
class CStack;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class HypotheticBattle;
|
||||||
|
|
||||||
///Fake random generator, used by AI to evaluate random server behavior
|
///Fake random generator, used by AI to evaluate random server behavior
|
||||||
class RNGStub : public vstd::RNG
|
class RNGStub : public vstd::RNG
|
||||||
{
|
{
|
||||||
|
@ -13,3 +13,5 @@
|
|||||||
// This header should be treated as a pre compiled header file(PCH) in the compiler building settings.
|
// This header should be treated as a pre compiled header file(PCH) in the compiler building settings.
|
||||||
|
|
||||||
// Here you can add specific libraries and macros which are specific to this project.
|
// Here you can add specific libraries and macros which are specific to this project.
|
||||||
|
|
||||||
|
VCMI_LIB_USING_NAMESPACE
|
||||||
|
@ -15,9 +15,9 @@ assign_source_group(${emptyAI_SRCS} ${emptyAI_HEADERS})
|
|||||||
|
|
||||||
add_library(EmptyAI SHARED ${emptyAI_SRCS} ${emptyAI_HEADERS})
|
add_library(EmptyAI SHARED ${emptyAI_SRCS} ${emptyAI_HEADERS})
|
||||||
target_include_directories(EmptyAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(EmptyAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
target_link_libraries(EmptyAI PRIVATE vcmi)
|
target_link_libraries(EmptyAI PRIVATE ${VCMI_LIB_TARGET})
|
||||||
|
|
||||||
vcmi_set_output_dir(EmptyAI "AI")
|
vcmi_set_output_dir(EmptyAI "AI")
|
||||||
enable_pch(EmptyAI)
|
enable_pch(EmptyAI)
|
||||||
|
|
||||||
install(TARGETS EmptyAI RUNTIME DESTINATION ${AI_LIB_DIR} LIBRARY DESTINATION ${AI_LIB_DIR})
|
install(TARGETS EmptyAI RUNTIME DESTINATION ${AI_LIB_DIR} LIBRARY DESTINATION ${AI_LIB_DIR} OPTIONAL)
|
||||||
|
@ -25,8 +25,12 @@
|
|||||||
#include "Pathfinding/AIPathfinder.h"
|
#include "Pathfinding/AIPathfinder.h"
|
||||||
#include "Engine/Nullkiller.h"
|
#include "Engine/Nullkiller.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
struct QuestInfo;
|
struct QuestInfo;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class AIStatus
|
class AIStatus
|
||||||
{
|
{
|
||||||
boost::mutex mx;
|
boost::mutex mx;
|
||||||
|
@ -130,7 +130,7 @@ add_library(Nullkiller SHARED ${Nullkiller_SRCS} ${Nullkiller_HEADERS})
|
|||||||
|
|
||||||
target_include_directories(Nullkiller PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(Nullkiller PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
target_link_libraries(Nullkiller PRIVATE vcmi fuzzylite::fuzzylite)
|
target_link_libraries(Nullkiller PRIVATE ${VCMI_LIB_TARGET} fuzzylite::fuzzylite)
|
||||||
|
|
||||||
target_link_libraries(Nullkiller PRIVATE TBB::tbb)
|
target_link_libraries(Nullkiller PRIVATE TBB::tbb)
|
||||||
|
|
||||||
@ -138,3 +138,6 @@ vcmi_set_output_dir(Nullkiller "AI")
|
|||||||
enable_pch(Nullkiller)
|
enable_pch(Nullkiller)
|
||||||
|
|
||||||
install(TARGETS Nullkiller RUNTIME DESTINATION ${AI_LIB_DIR} LIBRARY DESTINATION ${AI_LIB_DIR})
|
install(TARGETS Nullkiller RUNTIME DESTINATION ${AI_LIB_DIR} LIBRARY DESTINATION ${AI_LIB_DIR})
|
||||||
|
if(APPLE_IOS)
|
||||||
|
install(IMPORTED_RUNTIME_ARTIFACTS TBB::tbb LIBRARY DESTINATION ${LIB_DIR}) # CMake 3.21+
|
||||||
|
endif()
|
||||||
|
@ -11,8 +11,12 @@
|
|||||||
#include <fl/Headers.h>
|
#include <fl/Headers.h>
|
||||||
#include "../Goals/AbstractGoal.h"
|
#include "../Goals/AbstractGoal.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CArmedInstance;
|
class CArmedInstance;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class engineBase //subclasses create fuzzylite variables with "new" that are not freed - this is desired as fl::Engine wants to destroy these...
|
class engineBase //subclasses create fuzzylite variables with "new" that are not freed - this is desired as fl::Engine wants to destroy these...
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -10,7 +10,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "FuzzyEngines.h"
|
#include "FuzzyEngines.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CBank;
|
class CBank;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class Nullkiller;
|
class Nullkiller;
|
||||||
|
|
||||||
class DLL_EXPORT FuzzyHelper
|
class DLL_EXPORT FuzzyHelper
|
||||||
|
@ -12,9 +12,14 @@
|
|||||||
#include "../Goals/CGoal.h"
|
#include "../Goals/CGoal.h"
|
||||||
#include "../Pathfinding/AIPathfinder.h"
|
#include "../Pathfinding/AIPathfinder.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
class CGWitchHut;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class BuildingInfo;
|
class BuildingInfo;
|
||||||
class Nullkiller;
|
class Nullkiller;
|
||||||
class CGWitchHut;
|
|
||||||
|
|
||||||
class RewardEvaluator
|
class RewardEvaluator
|
||||||
{
|
{
|
||||||
|
@ -164,6 +164,7 @@ ExchangeResult ChainActor::tryExchangeNoLock(const ChainActor * specialActor, co
|
|||||||
return baseActor->tryExchangeNoLock(specialActor, other);
|
return baseActor->tryExchangeNoLock(specialActor, other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
namespace vstd
|
namespace vstd
|
||||||
{
|
{
|
||||||
template <class M, class Key, class F>
|
template <class M, class Key, class F>
|
||||||
@ -180,6 +181,7 @@ namespace vstd
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
ExchangeResult HeroActor::tryExchangeNoLock(const ChainActor * specialActor, const ChainActor * other) const
|
ExchangeResult HeroActor::tryExchangeNoLock(const ChainActor * specialActor, const ChainActor * other) const
|
||||||
{
|
{
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../../Global.h"
|
#include "../../Global.h"
|
||||||
|
VCMI_LIB_USING_NAMESPACE
|
||||||
#include "../../CCallback.h"
|
#include "../../CCallback.h"
|
||||||
|
@ -14,7 +14,7 @@ set(stupidAI_HEADERS
|
|||||||
assign_source_group(${stupidAI_SRCS} ${stupidAI_HEADERS})
|
assign_source_group(${stupidAI_SRCS} ${stupidAI_HEADERS})
|
||||||
|
|
||||||
add_library(StupidAI SHARED ${stupidAI_SRCS} ${stupidAI_HEADERS})
|
add_library(StupidAI SHARED ${stupidAI_SRCS} ${stupidAI_HEADERS})
|
||||||
target_link_libraries(StupidAI PRIVATE vcmi)
|
target_link_libraries(StupidAI PRIVATE ${VCMI_LIB_TARGET})
|
||||||
target_include_directories(StupidAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(StupidAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
vcmi_set_output_dir(StupidAI "AI")
|
vcmi_set_output_dir(StupidAI "AI")
|
||||||
|
@ -5,3 +5,5 @@
|
|||||||
// This header should be treated as a pre compiled header file(PCH) in the compiler building settings.
|
// This header should be treated as a pre compiled header file(PCH) in the compiler building settings.
|
||||||
|
|
||||||
// Here you can add specific libraries and macros which are specific to this project.
|
// Here you can add specific libraries and macros which are specific to this project.
|
||||||
|
|
||||||
|
VCMI_LIB_USING_NAMESPACE
|
||||||
|
@ -107,7 +107,7 @@ add_library(VCAI SHARED ${VCAI_SRCS} ${VCAI_HEADERS})
|
|||||||
|
|
||||||
target_include_directories(VCAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(VCAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
target_link_libraries(VCAI PRIVATE vcmi fuzzylite::fuzzylite)
|
target_link_libraries(VCAI PRIVATE ${VCMI_LIB_TARGET} fuzzylite::fuzzylite)
|
||||||
|
|
||||||
vcmi_set_output_dir(VCAI "AI")
|
vcmi_set_output_dir(VCAI "AI")
|
||||||
enable_pch(VCAI)
|
enable_pch(VCAI)
|
||||||
|
@ -11,8 +11,12 @@
|
|||||||
#include <fl/Headers.h>
|
#include <fl/Headers.h>
|
||||||
#include "Goals/AbstractGoal.h"
|
#include "Goals/AbstractGoal.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CArmedInstance;
|
class CArmedInstance;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class engineBase //subclasses create fuzzylite variables with "new" that are not freed - this is desired as fl::Engine wants to destroy these...
|
class engineBase //subclasses create fuzzylite variables with "new" that are not freed - this is desired as fl::Engine wants to destroy these...
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -10,8 +10,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "FuzzyEngines.h"
|
#include "FuzzyEngines.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CBank;
|
class CBank;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class DLL_EXPORT FuzzyHelper
|
class DLL_EXPORT FuzzyHelper
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../../Global.h"
|
#include "../../Global.h"
|
||||||
|
|
||||||
|
VCMI_LIB_USING_NAMESPACE
|
||||||
|
@ -29,8 +29,12 @@
|
|||||||
|
|
||||||
extern FuzzyHelper * fh;
|
extern FuzzyHelper * fh;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CGVisitableOPW;
|
class CGVisitableOPW;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
const double SAFE_ATTACK_CONSTANT = 1.5;
|
const double SAFE_ATTACK_CONSTANT = 1.5;
|
||||||
|
|
||||||
//one thread may be turn of AI and another will be handling a side effect for AI2
|
//one thread may be turn of AI and another will be handling a side effect for AI2
|
||||||
|
@ -26,8 +26,12 @@
|
|||||||
#include "../../lib/CondSh.h"
|
#include "../../lib/CondSh.h"
|
||||||
#include "Pathfinding/AIPathfinder.h"
|
#include "Pathfinding/AIPathfinder.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
struct QuestInfo;
|
struct QuestInfo;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class AIhelper;
|
class AIhelper;
|
||||||
|
|
||||||
class AIStatus
|
class AIStatus
|
||||||
|
3
AUTHORS
@ -81,3 +81,6 @@ Dmitry Orlov, <shubus.corporation@gmail.com>
|
|||||||
|
|
||||||
Andrey Cherkas aka nordsoft, <nordsoft@yahoo.com>
|
Andrey Cherkas aka nordsoft, <nordsoft@yahoo.com>
|
||||||
* new terrain support, random map generator features and various bug fixes
|
* new terrain support, random map generator features and various bug fixes
|
||||||
|
|
||||||
|
Andrey Filipenkov aka kambala-decapitator, <decapitator@ukr.net>
|
||||||
|
* iOS support, macOS improvements, various bug fixes
|
||||||
|
12
CCallback.h
@ -13,6 +13,8 @@
|
|||||||
#include "lib/battle/CPlayerBattleCallback.h"
|
#include "lib/battle/CPlayerBattleCallback.h"
|
||||||
#include "lib/int3.h" // for int3
|
#include "lib/int3.h" // for int3
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
class CGameState;
|
class CGameState;
|
||||||
struct CPath;
|
struct CPath;
|
||||||
@ -20,18 +22,22 @@ class CGObjectInstance;
|
|||||||
class CArmedInstance;
|
class CArmedInstance;
|
||||||
class BattleAction;
|
class BattleAction;
|
||||||
class CGTownInstance;
|
class CGTownInstance;
|
||||||
struct lua_State;
|
|
||||||
class CClient;
|
|
||||||
class IShipyard;
|
class IShipyard;
|
||||||
struct CGPathNode;
|
struct CGPathNode;
|
||||||
struct CGPath;
|
struct CGPath;
|
||||||
struct CPathsInfo;
|
struct CPathsInfo;
|
||||||
class PathfinderConfig;
|
class PathfinderConfig;
|
||||||
struct CPack;
|
struct CPack;
|
||||||
|
struct CPackForServer;
|
||||||
class IBattleEventsReceiver;
|
class IBattleEventsReceiver;
|
||||||
class IGameEventsReceiver;
|
class IGameEventsReceiver;
|
||||||
struct ArtifactLocation;
|
struct ArtifactLocation;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CClient;
|
||||||
|
struct lua_State;
|
||||||
|
|
||||||
class IBattleCallback
|
class IBattleCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -88,8 +94,6 @@ public:
|
|||||||
virtual int bulkMergeStacks(ObjectInstanceID armyId, SlotID srcSlot) = 0;
|
virtual int bulkMergeStacks(ObjectInstanceID armyId, SlotID srcSlot) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CPackForServer;
|
|
||||||
|
|
||||||
class CBattleCallback : public IBattleCallback, public CPlayerBattleCallback
|
class CBattleCallback : public IBattleCallback, public CPlayerBattleCallback
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
7
CI/ios/before_install.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo DEVELOPER_DIR=/Applications/Xcode_13.4.1.app >> $GITHUB_ENV
|
||||||
|
|
||||||
|
curl -L 'https://github.com/vcmi/vcmi-ios-deps/releases/latest/download/vcmi-ios-depends-xc13.2.1.txz' \
|
||||||
|
| tar -xf -
|
||||||
|
build/fix_install_paths.command
|
3
CI/ios/post_pack.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
"$1/ios/zip2ipa.sh" "$2"
|
@ -1,7 +1,10 @@
|
|||||||
curl -LfsS -o "vcpkg-export-${VCMI_BUILD_PLATFORM}-windows-v140.7z" \
|
curl -LfsS -o "vcpkg-export-${VCMI_BUILD_PLATFORM}-windows-v140.7z" \
|
||||||
"https://github.com/vcmi/vcmi-deps-windows/releases/download/v1.4/vcpkg-export-${VCMI_BUILD_PLATFORM}-windows-v140.7z"
|
"https://github.com/vcmi/vcmi-deps-windows/releases/download/v1.5/vcpkg-export-${VCMI_BUILD_PLATFORM}-windows-v140.7z"
|
||||||
7z x "vcpkg-export-${VCMI_BUILD_PLATFORM}-windows-v140.7z"
|
7z x "vcpkg-export-${VCMI_BUILD_PLATFORM}-windows-v140.7z"
|
||||||
|
|
||||||
rm -r -f vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/debug
|
rm -r -f vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/debug
|
||||||
mkdir -p vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/debug/bin
|
mkdir -p vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/debug/bin
|
||||||
cp vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/bin/* vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/debug/bin
|
cp vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/bin/* vcpkg/installed/${VCMI_BUILD_PLATFORM}-windows/debug/bin
|
||||||
|
|
||||||
|
DUMPBIN_DIR=$(vswhere -latest -find **/dumpbin.exe | head -n 1)
|
||||||
|
dirname "$DUMPBIN_DIR" > $GITHUB_PATH
|
104
CMakeLists.txt
@ -15,7 +15,6 @@ project(VCMI)
|
|||||||
#
|
#
|
||||||
# Vckpg:
|
# Vckpg:
|
||||||
# - Improve install code once there is better way to deploy DLLs and Qt plugins
|
# - Improve install code once there is better way to deploy DLLs and Qt plugins
|
||||||
# - Move Vcpkg install BundleUtilities code from osx/CMakeLists.txt
|
|
||||||
#
|
#
|
||||||
# Other:
|
# Other:
|
||||||
# - Cleanup remove_directory copy_directory if performance will be a problem.
|
# - Cleanup remove_directory copy_directory if performance will be a problem.
|
||||||
@ -26,6 +25,18 @@ project(VCMI)
|
|||||||
# It's used currently to make sure that 3rd-party dependencies in git submodules get proper FOLDER property
|
# It's used currently to make sure that 3rd-party dependencies in git submodules get proper FOLDER property
|
||||||
# - Make FindFuzzyLite check for the right version and disable FORCE_BUNDLED_FL by default
|
# - Make FindFuzzyLite check for the right version and disable FORCE_BUNDLED_FL by default
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
|
||||||
|
set(APPLE_MACOS 1)
|
||||||
|
else()
|
||||||
|
set(APPLE_IOS 1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(APPLE_IOS)
|
||||||
|
set(BUILD_SINGLE_APP 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
############################################
|
############################################
|
||||||
# User-provided options #
|
# User-provided options #
|
||||||
############################################
|
############################################
|
||||||
@ -41,10 +52,19 @@ set(VCMI_VERSION_MAJOR 1)
|
|||||||
set(VCMI_VERSION_MINOR 0)
|
set(VCMI_VERSION_MINOR 0)
|
||||||
set(VCMI_VERSION_PATCH 0)
|
set(VCMI_VERSION_PATCH 0)
|
||||||
|
|
||||||
|
set(APP_SHORT_VERSION "${VCMI_VERSION_MAJOR}.${VCMI_VERSION_MINOR}")
|
||||||
|
if(NOT VCMI_VERSION_PATCH EQUAL 0)
|
||||||
|
string(APPEND APP_SHORT_VERSION ".${VCMI_VERSION_PATCH}")
|
||||||
|
endif()
|
||||||
|
|
||||||
option(ENABLE_ERM "Enable compilation of ERM scripting module" OFF)
|
option(ENABLE_ERM "Enable compilation of ERM scripting module" OFF)
|
||||||
option(ENABLE_LUA "Enable compilation of LUA scripting module" OFF)
|
option(ENABLE_LUA "Enable compilation of LUA scripting module" OFF)
|
||||||
option(ENABLE_LAUNCHER "Enable compilation of launcher" ON)
|
option(ENABLE_LAUNCHER "Enable compilation of launcher" ON)
|
||||||
|
if(APPLE_IOS)
|
||||||
|
set(BUNDLE_IDENTIFIER_PREFIX "" CACHE STRING "Bundle identifier prefix")
|
||||||
|
else()
|
||||||
option(ENABLE_TEST "Enable compilation of unit tests" ON)
|
option(ENABLE_TEST "Enable compilation of unit tests" ON)
|
||||||
|
endif()
|
||||||
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0")
|
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0")
|
||||||
option(ENABLE_PCH "Enable compilation using precompiled headers" ON)
|
option(ENABLE_PCH "Enable compilation using precompiled headers" ON)
|
||||||
endif(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0")
|
endif(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0")
|
||||||
@ -53,7 +73,9 @@ option(ENABLE_DEBUG_CONSOLE "Enable debug console for Windows builds" ON)
|
|||||||
option(ENABLE_MULTI_PROCESS_BUILDS "Enable /MP flag for MSVS solution" ON)
|
option(ENABLE_MULTI_PROCESS_BUILDS "Enable /MP flag for MSVS solution" ON)
|
||||||
|
|
||||||
# Used for Snap packages and also useful for debugging
|
# Used for Snap packages and also useful for debugging
|
||||||
|
if(NOT APPLE_IOS)
|
||||||
option(ENABLE_MONOLITHIC_INSTALL "Install everything in single directory on Linux and Mac" OFF)
|
option(ENABLE_MONOLITHIC_INSTALL "Install everything in single directory on Linux and Mac" OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Allow to pass package name from Travis CI
|
# Allow to pass package name from Travis CI
|
||||||
set(PACKAGE_NAME_SUFFIX "" CACHE STRING "Suffix for CPack package name")
|
set(PACKAGE_NAME_SUFFIX "" CACHE STRING "Suffix for CPack package name")
|
||||||
@ -133,6 +155,34 @@ set(CMAKE_MAP_IMPORTED_CONFIG_MINSIZEREL MinSizeRel Release RelWithDebInfo "")
|
|||||||
# Release falls back to RelWithDebInfo, then MinSizeRel
|
# Release falls back to RelWithDebInfo, then MinSizeRel
|
||||||
set(CMAKE_MAP_IMPORTED_CONFIG_RELEASE Release RelWithDebInfo MinSizeRel "")
|
set(CMAKE_MAP_IMPORTED_CONFIG_RELEASE Release RelWithDebInfo MinSizeRel "")
|
||||||
|
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Debug] dwarf)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_NS_ASSERTIONS NO)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_NS_ASSERTIONS[variant=Debug] YES)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_64_TO_32_BIT_CONVERSION NO)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_MARKETING_VERSION ${APP_SHORT_VERSION})
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] YES)
|
||||||
|
|
||||||
|
if(BUILD_SINGLE_APP)
|
||||||
|
add_compile_definitions(SINGLE_PROCESS_APP=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(APPLE_IOS)
|
||||||
|
set(CMAKE_MACOSX_RPATH 1)
|
||||||
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.0)
|
||||||
|
|
||||||
|
list(APPEND CMAKE_FIND_ROOT_PATH "${CMAKE_PREFIX_PATH}") # required for Boost
|
||||||
|
set(CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH FALSE)
|
||||||
|
set(CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH FALSE)
|
||||||
|
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED NO)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED_FOR_APPS YES)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUNDLE_IDENTIFIER_PREFIX}.$(PRODUCT_NAME)")
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(MINGW OR MSVC)
|
if(MINGW OR MSVC)
|
||||||
# Windows Vista or newer for FuzzyLite 6 to compile
|
# Windows Vista or newer for FuzzyLite 6 to compile
|
||||||
add_definitions(-D_WIN32_WINNT=0x0600)
|
add_definitions(-D_WIN32_WINNT=0x0600)
|
||||||
@ -209,7 +259,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR NOT WIN32) #so far all *nix compilers support suc
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check if some platform-specific libraries are needed for linking
|
# Check if some platform-specific libraries are needed for linking
|
||||||
if(NOT WIN32)
|
if(NOT WIN32 AND NOT APPLE_IOS)
|
||||||
include(CheckLibraryExists)
|
include(CheckLibraryExists)
|
||||||
|
|
||||||
# Shared memory functions used by Boost.Interprocess
|
# Shared memory functions used by Boost.Interprocess
|
||||||
@ -236,7 +286,12 @@ if(TARGET zlib::zlib)
|
|||||||
add_library(ZLIB::ZLIB ALIAS zlib::zlib)
|
add_library(ZLIB::ZLIB ALIAS zlib::zlib)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(ffmpeg COMPONENTS avutil swscale avformat avcodec)
|
set(FFMPEG_COMPONENTS avutil swscale avformat avcodec)
|
||||||
|
if(APPLE_IOS)
|
||||||
|
list(APPEND FFMPEG_COMPONENTS swresample)
|
||||||
|
endif()
|
||||||
|
find_package(ffmpeg COMPONENTS ${FFMPEG_COMPONENTS})
|
||||||
|
|
||||||
option(FORCE_BUNDLED_MINIZIP "Force bundled Minizip library" OFF)
|
option(FORCE_BUNDLED_MINIZIP "Force bundled Minizip library" OFF)
|
||||||
if(NOT FORCE_BUNDLED_MINIZIP)
|
if(NOT FORCE_BUNDLED_MINIZIP)
|
||||||
find_package(minizip)
|
find_package(minizip)
|
||||||
@ -306,6 +361,7 @@ elseif(APPLE)
|
|||||||
set(LIB_DIR "." CACHE STRING "Where to install main library")
|
set(LIB_DIR "." CACHE STRING "Where to install main library")
|
||||||
set(DATA_DIR "." CACHE STRING "Where to install data files")
|
set(DATA_DIR "." CACHE STRING "Where to install data files")
|
||||||
else()
|
else()
|
||||||
|
if(APPLE_MACOS)
|
||||||
set(APP_BUNDLE_DIR "${CMAKE_PROJECT_NAME}.app")
|
set(APP_BUNDLE_DIR "${CMAKE_PROJECT_NAME}.app")
|
||||||
set(APP_BUNDLE_CONTENTS_DIR "${APP_BUNDLE_DIR}/Contents")
|
set(APP_BUNDLE_CONTENTS_DIR "${APP_BUNDLE_DIR}/Contents")
|
||||||
set(APP_BUNDLE_BINARY_DIR "${APP_BUNDLE_CONTENTS_DIR}/MacOS")
|
set(APP_BUNDLE_BINARY_DIR "${APP_BUNDLE_CONTENTS_DIR}/MacOS")
|
||||||
@ -314,6 +370,10 @@ elseif(APPLE)
|
|||||||
set(BIN_DIR "${APP_BUNDLE_BINARY_DIR}" CACHE STRING "Where to install binaries")
|
set(BIN_DIR "${APP_BUNDLE_BINARY_DIR}" CACHE STRING "Where to install binaries")
|
||||||
set(LIB_DIR "${APP_BUNDLE_CONTENTS_DIR}/Frameworks" CACHE STRING "Where to install main library")
|
set(LIB_DIR "${APP_BUNDLE_CONTENTS_DIR}/Frameworks" CACHE STRING "Where to install main library")
|
||||||
set(DATA_DIR "${APP_BUNDLE_RESOURCES_DIR}/Data" CACHE STRING "Where to install data files")
|
set(DATA_DIR "${APP_BUNDLE_RESOURCES_DIR}/Data" CACHE STRING "Where to install data files")
|
||||||
|
else()
|
||||||
|
set(LIB_DIR "Frameworks")
|
||||||
|
set(DATA_DIR ".")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
# includes lib path which determines where to install shared libraries (either /lib or /lib64)
|
# includes lib path which determines where to install shared libraries (either /lib or /lib64)
|
||||||
@ -349,6 +409,20 @@ set(SCRIPTING_LIB_DIR "${LIB_DIR}/scripting")
|
|||||||
# Add subdirectories #
|
# Add subdirectories #
|
||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
|
if(APPLE_IOS)
|
||||||
|
add_subdirectory(ios)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(VCMI_lib)
|
||||||
|
if(BUILD_SINGLE_APP)
|
||||||
|
add_subdirectory(lib_client)
|
||||||
|
add_subdirectory(lib_server)
|
||||||
|
set(VCMI_LIB_TARGET vcmi_lib_client)
|
||||||
|
else()
|
||||||
|
add_subdirectory(lib)
|
||||||
|
set(VCMI_LIB_TARGET vcmi)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ENABLE_ERM)
|
if(ENABLE_ERM)
|
||||||
add_subdirectory(scripting/erm)
|
add_subdirectory(scripting/erm)
|
||||||
endif()
|
endif()
|
||||||
@ -359,13 +433,13 @@ if(NOT TARGET minizip::minizip)
|
|||||||
add_subdirectory_with_folder("3rdparty" lib/minizip)
|
add_subdirectory_with_folder("3rdparty" lib/minizip)
|
||||||
add_library(minizip::minizip ALIAS minizip)
|
add_library(minizip::minizip ALIAS minizip)
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(lib)
|
|
||||||
add_subdirectory(client)
|
|
||||||
add_subdirectory(server)
|
|
||||||
add_subdirectory_with_folder("AI" AI)
|
|
||||||
if(ENABLE_LAUNCHER)
|
if(ENABLE_LAUNCHER)
|
||||||
add_subdirectory(launcher)
|
add_subdirectory(launcher)
|
||||||
endif()
|
endif()
|
||||||
|
add_subdirectory(client)
|
||||||
|
add_subdirectory(server)
|
||||||
|
add_subdirectory_with_folder("AI" AI)
|
||||||
if(ENABLE_TEST)
|
if(ENABLE_TEST)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
@ -376,11 +450,13 @@ endif()
|
|||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
install(DIRECTORY config DESTINATION ${DATA_DIR})
|
install(DIRECTORY config DESTINATION ${DATA_DIR})
|
||||||
install(DIRECTORY scripts DESTINATION ${DATA_DIR})
|
|
||||||
install(DIRECTORY Mods DESTINATION ${DATA_DIR})
|
install(DIRECTORY Mods DESTINATION ${DATA_DIR})
|
||||||
|
if(ENABLE_LUA)
|
||||||
|
install(DIRECTORY scripts DESTINATION ${DATA_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
# that script is useless for Windows
|
# that script is useless for Windows and iOS
|
||||||
if(NOT WIN32)
|
if(NOT WIN32 AND NOT APPLE_IOS)
|
||||||
install(FILES vcmibuilder DESTINATION ${BIN_DIR} PERMISSIONS
|
install(FILES vcmibuilder DESTINATION ${BIN_DIR} PERMISSIONS
|
||||||
OWNER_WRITE OWNER_READ OWNER_EXECUTE
|
OWNER_WRITE OWNER_READ OWNER_EXECUTE
|
||||||
GROUP_READ GROUP_EXECUTE
|
GROUP_READ GROUP_EXECUTE
|
||||||
@ -487,9 +563,9 @@ if(WIN32)
|
|||||||
set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".")
|
set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".")
|
||||||
# Use BundleUtilities to fix build when Vcpkg is used and disable it for MXE
|
# Use BundleUtilities to fix build when Vcpkg is used and disable it for MXE
|
||||||
if(NOT (${CMAKE_CROSSCOMPILING}))
|
if(NOT (${CMAKE_CROSSCOMPILING}))
|
||||||
add_subdirectory(osx)
|
add_subdirectory(win)
|
||||||
endif()
|
endif()
|
||||||
elseif(APPLE AND NOT ENABLE_MONOLITHIC_INSTALL)
|
elseif(APPLE_MACOS AND NOT ENABLE_MONOLITHIC_INSTALL)
|
||||||
set(CPACK_MONOLITHIC_INSTALL 1)
|
set(CPACK_MONOLITHIC_INSTALL 1)
|
||||||
set(CPACK_GENERATOR "DragNDrop")
|
set(CPACK_GENERATOR "DragNDrop")
|
||||||
set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/osx/dmg_background.png")
|
set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/osx/dmg_background.png")
|
||||||
@ -519,6 +595,10 @@ elseif(APPLE AND NOT ENABLE_MONOLITHIC_INSTALL)
|
|||||||
|
|
||||||
# Bundle fixing code must be in separate directory to be executed after all other install code
|
# Bundle fixing code must be in separate directory to be executed after all other install code
|
||||||
add_subdirectory(osx)
|
add_subdirectory(osx)
|
||||||
|
elseif(APPLE_IOS)
|
||||||
|
set(CPACK_GENERATOR ZIP)
|
||||||
|
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
|
||||||
|
set(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_CURRENT_BINARY_DIR};${CMAKE_PROJECT_NAME};app;/")
|
||||||
else()
|
else()
|
||||||
set(CPACK_GENERATOR TGZ)
|
set(CPACK_GENERATOR TGZ)
|
||||||
endif()
|
endif()
|
||||||
|
@ -2,19 +2,31 @@
|
|||||||
"version": 2,
|
"version": 2,
|
||||||
"configurePresets": [
|
"configurePresets": [
|
||||||
{
|
{
|
||||||
"name": "default-release",
|
"name": "release-binary-dir",
|
||||||
|
"hidden": true,
|
||||||
|
"binaryDir": "${sourceDir}/out/build/${presetName}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "base-release",
|
||||||
|
"inherits": "release-binary-dir",
|
||||||
"hidden": true,
|
"hidden": true,
|
||||||
"binaryDir": "${sourceDir}/out/build/${presetName}",
|
|
||||||
"generator": "Ninja",
|
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
|
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
|
||||||
"PACKAGE_FILE_NAME" : "$env{VCMI_PACKAGE_FILE_NAME}",
|
"PACKAGE_FILE_NAME" : "$env{VCMI_PACKAGE_FILE_NAME}",
|
||||||
"PACKAGE_NAME_SUFFIX" : "$env{VCMI_PACKAGE_NAME_SUFFIX}",
|
"PACKAGE_NAME_SUFFIX" : "$env{VCMI_PACKAGE_NAME_SUFFIX}",
|
||||||
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
|
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
|
||||||
"FORCE_BUNDLED_FL": "OFF",
|
|
||||||
"ENABLE_TEST": "OFF"
|
"ENABLE_TEST": "OFF"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "default-release",
|
||||||
|
"inherits": "base-release",
|
||||||
|
"hidden": true,
|
||||||
|
"generator": "Ninja",
|
||||||
|
"cacheVariables": {
|
||||||
|
"FORCE_BUNDLED_FL": "OFF"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name" : "linux-release",
|
"name" : "linux-release",
|
||||||
"inherits" : "default-release",
|
"inherits" : "default-release",
|
||||||
@ -87,6 +99,41 @@
|
|||||||
"description": "VCMI MacOS Xcode",
|
"description": "VCMI MacOS Xcode",
|
||||||
"inherits": "default-release",
|
"inherits": "default-release",
|
||||||
"generator": "Xcode"
|
"generator": "Xcode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ios-device",
|
||||||
|
"displayName": "Base iOS device",
|
||||||
|
"description": "Base VCMI preset for iOS device",
|
||||||
|
"generator": "Xcode",
|
||||||
|
"binaryDir": "../build-${presetName}",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_SYSTEM_NAME": "iOS",
|
||||||
|
"FORCE_BUNDLED_FL": "ON",
|
||||||
|
"FORCE_BUNDLED_MINIZIP": "ON"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ios-simulator",
|
||||||
|
"displayName": "Base iOS simulator",
|
||||||
|
"description": "Base VCMI preset for iOS simulator",
|
||||||
|
"inherits": "ios-device",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_OSX_SYSROOT": "iphonesimulator"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ios-release",
|
||||||
|
"displayName": "iOS release",
|
||||||
|
"description": "VCMI iOS release",
|
||||||
|
"inherits": [
|
||||||
|
"base-release",
|
||||||
|
"ios-device",
|
||||||
|
"release-binary-dir"
|
||||||
|
],
|
||||||
|
"cacheVariables": {
|
||||||
|
"BUNDLE_IDENTIFIER_PREFIX": "eu.vcmi",
|
||||||
|
"CMAKE_PREFIX_PATH": "${sourceDir}/build/iphoneos"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildPresets": [
|
"buildPresets": [
|
||||||
@ -135,6 +182,16 @@
|
|||||||
"name": "windows-msvc-relwithdebinfo",
|
"name": "windows-msvc-relwithdebinfo",
|
||||||
"configurePreset": "windows-msvc-release",
|
"configurePreset": "windows-msvc-release",
|
||||||
"inherits": "default-release"
|
"inherits": "default-release"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ios-release",
|
||||||
|
"configurePreset": "ios-release",
|
||||||
|
"inherits": "default-release",
|
||||||
|
"configuration": "Release",
|
||||||
|
"targets": ["vcmiclient"],
|
||||||
|
"nativeToolOptions": [
|
||||||
|
"CODE_SIGNING_ALLOWED_FOR_APPS=NO"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"testPresets": [
|
"testPresets": [
|
||||||
|
32
Global.h
@ -68,7 +68,7 @@ static_assert(sizeof(bool) == 1, "Bool needs to be 1 byte in size.");
|
|||||||
# define VCMI_UNIX
|
# define VCMI_UNIX
|
||||||
# define VCMI_APPLE
|
# define VCMI_APPLE
|
||||||
# include "TargetConditionals.h"
|
# include "TargetConditionals.h"
|
||||||
# if TARGET_IPHONE_SIMULATOR
|
# if TARGET_OS_SIMULATOR || TARGET_IPHONE_SIMULATOR
|
||||||
# define VCMI_IOS
|
# define VCMI_IOS
|
||||||
# define VCMI_IOS_SIM
|
# define VCMI_IOS_SIM
|
||||||
# elif TARGET_OS_IPHONE
|
# elif TARGET_OS_IPHONE
|
||||||
@ -82,10 +82,6 @@ static_assert(sizeof(bool) == 1, "Bool needs to be 1 byte in size.");
|
|||||||
# error "VCMI supports only Windows, OSX, Linux and Android targets"
|
# error "VCMI supports only Windows, OSX, Linux and Android targets"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VCMI_IOS
|
|
||||||
# error "iOS system isn't yet supported."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Each compiler uses own way to supress fall through warning. Try to find it.
|
// Each compiler uses own way to supress fall through warning. Try to find it.
|
||||||
#ifdef __has_cpp_attribute
|
#ifdef __has_cpp_attribute
|
||||||
# if __has_cpp_attribute(fallthrough)
|
# if __has_cpp_attribute(fallthrough)
|
||||||
@ -268,11 +264,35 @@ template<typename T, size_t N> char (&_ArrayCountObj(const T (&)[N]))[N];
|
|||||||
// should be used for variables that becomes unused in release builds (e.g. only used for assert checks)
|
// should be used for variables that becomes unused in release builds (e.g. only used for assert checks)
|
||||||
#define UNUSED(VAR) ((void)VAR)
|
#define UNUSED(VAR) ((void)VAR)
|
||||||
|
|
||||||
|
// old iOS SDKs compatibility
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
#include <AvailabilityVersions.h>
|
||||||
|
|
||||||
|
#ifndef __IPHONE_13_0
|
||||||
|
#define __IPHONE_13_0 130000
|
||||||
|
#endif
|
||||||
|
#endif // VCMI_IOS
|
||||||
|
|
||||||
|
// single-process build makes 2 copies of the main lib by wrapping it in a namespace
|
||||||
|
#ifdef VCMI_LIB_NAMESPACE
|
||||||
|
#define VCMI_LIB_NAMESPACE_BEGIN namespace VCMI_LIB_NAMESPACE {
|
||||||
|
#define VCMI_LIB_NAMESPACE_END }
|
||||||
|
#define VCMI_LIB_USING_NAMESPACE using namespace VCMI_LIB_NAMESPACE;
|
||||||
|
#define VCMI_LIB_WRAP_NAMESPACE(x) VCMI_LIB_NAMESPACE::x
|
||||||
|
#else
|
||||||
|
#define VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
#define VCMI_LIB_NAMESPACE_END
|
||||||
|
#define VCMI_LIB_USING_NAMESPACE
|
||||||
|
#define VCMI_LIB_WRAP_NAMESPACE(x) x
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------- */
|
||||||
/* VCMI standard library */
|
/* VCMI standard library */
|
||||||
/* ---------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------- */
|
||||||
#include <vstd/CLoggerBase.h>
|
#include <vstd/CLoggerBase.h>
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
void inline handleException()
|
void inline handleException()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -743,3 +763,5 @@ namespace std
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // NO_STD_TOSTRING
|
#endif // NO_STD_TOSTRING
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -20,6 +20,7 @@ To use VCMI you need to own original data files.
|
|||||||
* [Linux](https://wiki.vcmi.eu/Installation_on_Linux)
|
* [Linux](https://wiki.vcmi.eu/Installation_on_Linux)
|
||||||
* [macOS](https://wiki.vcmi.eu/Installation_on_macOS)
|
* [macOS](https://wiki.vcmi.eu/Installation_on_macOS)
|
||||||
* [Windows](https://wiki.vcmi.eu/Installation_on_Windows)
|
* [Windows](https://wiki.vcmi.eu/Installation_on_Windows)
|
||||||
|
* [iOS](https://wiki.vcmi.eu/Installation_on_iOS)
|
||||||
|
|
||||||
## Building from source
|
## Building from source
|
||||||
|
|
||||||
@ -29,6 +30,7 @@ Platform support is constantly tested by continuous integration and CMake config
|
|||||||
* [On Linux for Windows with MXE](https://wiki.vcmi.eu/How_to_build_VCMI_(Linux/Cmake/MXE))
|
* [On Linux for Windows with MXE](https://wiki.vcmi.eu/How_to_build_VCMI_(Linux/Cmake/MXE))
|
||||||
* [On macOS](https://wiki.vcmi.eu/How_to_build_VCMI_(macOS))
|
* [On macOS](https://wiki.vcmi.eu/How_to_build_VCMI_(macOS))
|
||||||
* [On Windows using MSVC and Vcpkg](https://wiki.vcmi.eu/How_to_build_VCMI_(Windows/Vcpkg))
|
* [On Windows using MSVC and Vcpkg](https://wiki.vcmi.eu/How_to_build_VCMI_(Windows/Vcpkg))
|
||||||
|
* [iOS on macOS](https://wiki.vcmi.eu/How_to_build_VCMI_(iOS))
|
||||||
|
|
||||||
## Copyright and license
|
## Copyright and license
|
||||||
|
|
||||||
|
@ -9,7 +9,11 @@
|
|||||||
*/
|
*/
|
||||||
#include "Version.h"
|
#include "Version.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
namespace GameConstants
|
namespace GameConstants
|
||||||
{
|
{
|
||||||
const char GIT_SHA1[] = "@GIT_SHA1@";
|
const char GIT_SHA1[] = "@GIT_SHA1@";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "StdInc.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
namespace GameConstants
|
namespace GameConstants
|
||||||
{
|
{
|
||||||
extern const char GIT_SHA1[];
|
extern const char GIT_SHA1[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
21
client/CFocusableHelper.cpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* CFocusableHelper.cpp, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "CFocusableHelper.h"
|
||||||
|
#include "../Global.h"
|
||||||
|
#include "widgets/TextControls.h"
|
||||||
|
|
||||||
|
void removeFocusFromActiveInput()
|
||||||
|
{
|
||||||
|
if(CFocusable::inputWithFocus == nullptr)
|
||||||
|
return;
|
||||||
|
CFocusable::inputWithFocus->focus = false;
|
||||||
|
CFocusable::inputWithFocus->redraw();
|
||||||
|
CFocusable::inputWithFocus = nullptr;
|
||||||
|
}
|
11
client/CFocusableHelper.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/*
|
||||||
|
* CFocusableHelper.h, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void removeFocusFromActiveInput();
|
@ -13,30 +13,34 @@
|
|||||||
|
|
||||||
#include "../lib/ConstTransitivePtr.h"
|
#include "../lib/ConstTransitivePtr.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CModHandler;
|
class CModHandler;
|
||||||
class CMapHandler;
|
|
||||||
class CHeroHandler;
|
class CHeroHandler;
|
||||||
class CCreatureHandler;
|
class CCreatureHandler;
|
||||||
class CSpellHandler;
|
class CSpellHandler;
|
||||||
class CSkillHandler;
|
class CSkillHandler;
|
||||||
class CBuildingHandler;
|
class CBuildingHandler;
|
||||||
class CObjectHandler;
|
class CObjectHandler;
|
||||||
class CSoundHandler;
|
|
||||||
class CMusicHandler;
|
|
||||||
class CObjectClassesHandler;
|
class CObjectClassesHandler;
|
||||||
class CTownHandler;
|
class CTownHandler;
|
||||||
class CGeneralTextHandler;
|
class CGeneralTextHandler;
|
||||||
class CConsoleHandler;
|
class CConsoleHandler;
|
||||||
class CCursorHandler;
|
|
||||||
class CGameState;
|
class CGameState;
|
||||||
class IMainVideoPlayer;
|
|
||||||
class CServerHandler;
|
|
||||||
class BattleFieldHandler;
|
class BattleFieldHandler;
|
||||||
class ObstacleHandler;
|
class ObstacleHandler;
|
||||||
class TerrainTypeHandler;
|
class TerrainTypeHandler;
|
||||||
|
|
||||||
class CMap;
|
class CMap;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CMapHandler;
|
||||||
|
class CSoundHandler;
|
||||||
|
class CMusicHandler;
|
||||||
|
class CCursorHandler;
|
||||||
|
class IMainVideoPlayer;
|
||||||
|
class CServerHandler;
|
||||||
|
|
||||||
//a class for non-mechanical client GUI classes
|
//a class for non-mechanical client GUI classes
|
||||||
class CClientState
|
class CClientState
|
||||||
|
@ -159,7 +159,7 @@ static void SDLLogCallback(void* userdata,
|
|||||||
|
|
||||||
#if defined(VCMI_WINDOWS) && !defined(__GNUC__) && defined(VCMI_WITH_DEBUG_CONSOLE)
|
#if defined(VCMI_WINDOWS) && !defined(__GNUC__) && defined(VCMI_WITH_DEBUG_CONSOLE)
|
||||||
int wmain(int argc, wchar_t* argv[])
|
int wmain(int argc, wchar_t* argv[])
|
||||||
#elif defined(VCMI_ANDROID)
|
#elif defined(VCMI_IOS) || defined(VCMI_ANDROID)
|
||||||
int SDL_main(int argc, char *argv[])
|
int SDL_main(int argc, char *argv[])
|
||||||
#else
|
#else
|
||||||
int main(int argc, char * argv[])
|
int main(int argc, char * argv[])
|
||||||
@ -170,7 +170,7 @@ int main(int argc, char * argv[])
|
|||||||
setenv("LANG", "C", 1);
|
setenv("LANG", "C", 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef VCMI_ANDROID
|
#if !defined(VCMI_ANDROID) && !defined(VCMI_IOS)
|
||||||
// Correct working dir executable folder (not bundle folder) so we can use executable relative paths
|
// Correct working dir executable folder (not bundle folder) so we can use executable relative paths
|
||||||
boost::filesystem::current_path(boost::filesystem::system_complete(argv[0]).parent_path());
|
boost::filesystem::current_path(boost::filesystem::system_complete(argv[0]).parent_path());
|
||||||
#endif
|
#endif
|
||||||
@ -217,12 +217,20 @@ int main(int argc, char * argv[])
|
|||||||
if(vm.count("help"))
|
if(vm.count("help"))
|
||||||
{
|
{
|
||||||
prog_help(opts);
|
prog_help(opts);
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
exit(0);
|
||||||
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if(vm.count("version"))
|
if(vm.count("version"))
|
||||||
{
|
{
|
||||||
prog_version();
|
prog_version();
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
exit(0);
|
||||||
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init old logging system and new (temporary) logging system
|
// Init old logging system and new (temporary) logging system
|
||||||
@ -410,7 +418,7 @@ int main(int argc, char * argv[])
|
|||||||
CCS->musich->setVolume((ui32)settings["general"]["music"].Float());
|
CCS->musich->setVolume((ui32)settings["general"]["music"].Float());
|
||||||
logGlobal->info("Initializing screen and sound handling: %d ms", pomtime.getDiff());
|
logGlobal->info("Initializing screen and sound handling: %d ms", pomtime.getDiff());
|
||||||
}
|
}
|
||||||
#ifdef __APPLE__
|
#ifdef VCMI_MAC
|
||||||
// Ctrl+click should be treated as a right click on Mac OS X
|
// Ctrl+click should be treated as a right click on Mac OS X
|
||||||
SDL_SetHint(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, "1");
|
SDL_SetHint(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, "1");
|
||||||
#endif
|
#endif
|
||||||
@ -1027,11 +1035,15 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
|
|||||||
if (displayIndex < 0)
|
if (displayIndex < 0)
|
||||||
displayIndex = 0;
|
displayIndex = 0;
|
||||||
}
|
}
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
SDL_GetWindowSize(mainWindow, &w, &h);
|
||||||
|
#else
|
||||||
if(!checkVideoMode(displayIndex, w, h))
|
if(!checkVideoMode(displayIndex, w, h))
|
||||||
{
|
{
|
||||||
logGlobal->error("Error: SDL says that %dx%d resolution is not available!", w, h);
|
logGlobal->error("Error: SDL says that %dx%d resolution is not available!", w, h);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool bufOnScreen = (screenBuf == screen);
|
bool bufOnScreen = (screenBuf == screen);
|
||||||
bool realFullscreen = settings["video"]["realFullscreen"].Bool();
|
bool realFullscreen = settings["video"]["realFullscreen"].Bool();
|
||||||
@ -1088,26 +1100,40 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
|
|||||||
|
|
||||||
if(nullptr == mainWindow)
|
if(nullptr == mainWindow)
|
||||||
{
|
{
|
||||||
|
#if defined(VCMI_ANDROID) || defined(VCMI_IOS)
|
||||||
|
auto createWindow = [displayIndex](Uint32 extraFlags) -> bool {
|
||||||
|
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN | extraFlags);
|
||||||
|
return mainWindow != nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef VCMI_ANDROID
|
# ifdef VCMI_IOS
|
||||||
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex),SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN);
|
SDL_SetHint(SDL_HINT_IOS_HIDE_HOME_INDICATOR, "1");
|
||||||
|
SDL_SetHint(SDL_HINT_RETURN_KEY_HIDES_IME, "1");
|
||||||
|
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");
|
||||||
|
|
||||||
// SDL on Android doesn't do proper letterboxing, and will show an annoying flickering in the blank space in case you're not using the full screen estate
|
Uint32 windowFlags = SDL_WINDOW_BORDERLESS | SDL_WINDOW_ALLOW_HIGHDPI;
|
||||||
|
if(!createWindow(windowFlags | SDL_WINDOW_METAL))
|
||||||
|
{
|
||||||
|
logGlobal->warn("Metal unavailable, using OpenGLES");
|
||||||
|
createWindow(windowFlags);
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
createWindow(0);
|
||||||
|
# endif // VCMI_IOS
|
||||||
|
|
||||||
|
// SDL on mobile doesn't do proper letterboxing, and will show an annoying flickering in the blank space in case you're not using the full screen estate
|
||||||
// That's why we need to make sure our width and height we'll use below have the same aspect ratio as the screen itself to ensure we fill the full screen estate
|
// That's why we need to make sure our width and height we'll use below have the same aspect ratio as the screen itself to ensure we fill the full screen estate
|
||||||
|
|
||||||
SDL_Rect screenRect;
|
SDL_Rect screenRect;
|
||||||
|
|
||||||
if(SDL_GetDisplayBounds(0, &screenRect) == 0)
|
if(SDL_GetDisplayBounds(0, &screenRect) == 0)
|
||||||
{
|
{
|
||||||
int screenWidth, screenHeight;
|
const auto screenWidth = screenRect.w;
|
||||||
double aspect;
|
const auto screenHeight = screenRect.h;
|
||||||
|
|
||||||
screenWidth = screenRect.w;
|
const auto aspect = static_cast<double>(screenWidth) / screenHeight;
|
||||||
screenHeight = screenRect.h;
|
|
||||||
|
|
||||||
aspect = (double)screenWidth / (double)screenHeight;
|
logGlobal->info("Screen size and aspect ratio: %dx%d (%lf)", screenWidth, screenHeight, aspect);
|
||||||
|
|
||||||
logGlobal->info("Screen size and aspect ration: %dx%d (%lf)", screenWidth, screenHeight, aspect);
|
|
||||||
|
|
||||||
if((double)w / aspect > (double)h)
|
if((double)w / aspect > (double)h)
|
||||||
{
|
{
|
||||||
@ -1125,7 +1151,6 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
|
|||||||
logGlobal->error("Can't fix aspect ratio for screen");
|
logGlobal->error("Can't fix aspect ratio for screen");
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if(fullscreen)
|
if(fullscreen)
|
||||||
{
|
{
|
||||||
if(realFullscreen)
|
if(realFullscreen)
|
||||||
@ -1138,7 +1163,7 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
|
|||||||
{
|
{
|
||||||
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex),SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), w, h, 0);
|
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex),SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), w, h, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // defined(VCMI_ANDROID) || defined(VCMI_IOS)
|
||||||
|
|
||||||
if(nullptr == mainWindow)
|
if(nullptr == mainWindow)
|
||||||
{
|
{
|
||||||
@ -1161,7 +1186,7 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifndef VCMI_ANDROID
|
#if !defined(VCMI_ANDROID) && !defined(VCMI_IOS)
|
||||||
|
|
||||||
if(fullscreen)
|
if(fullscreen)
|
||||||
{
|
{
|
||||||
@ -1384,7 +1409,9 @@ static void handleEvent(SDL_Event & ev)
|
|||||||
{
|
{
|
||||||
switch (ev.window.event) {
|
switch (ev.window.event) {
|
||||||
case SDL_WINDOWEVENT_RESTORED:
|
case SDL_WINDOWEVENT_RESTORED:
|
||||||
|
#ifndef VCMI_IOS
|
||||||
fullScreenChanged();
|
fullScreenChanged();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -145,6 +145,22 @@ set(client_HEADERS
|
|||||||
SDLRWwrapper.h
|
SDLRWwrapper.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(APPLE_IOS)
|
||||||
|
set(client_SRCS ${client_SRCS}
|
||||||
|
CFocusableHelper.cpp
|
||||||
|
ios/GameChatKeyboardHanlder.m
|
||||||
|
ios/main.m
|
||||||
|
ios/startSDL.mm
|
||||||
|
ios/utils.mm
|
||||||
|
)
|
||||||
|
set(client_HEADERS ${client_HEADERS}
|
||||||
|
CFocusableHelper.h
|
||||||
|
ios/GameChatKeyboardHanlder.h
|
||||||
|
ios/startSDL.h
|
||||||
|
ios/utils.h
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
assign_source_group(${client_SRCS} ${client_HEADERS} VCMI_client.rc)
|
assign_source_group(${client_SRCS} ${client_HEADERS} VCMI_client.rc)
|
||||||
|
|
||||||
if(ANDROID) # android needs client/server to be libraries, not executables, so we can't reuse the build part of this script
|
if(ANDROID) # android needs client/server to be libraries, not executables, so we can't reuse the build part of this script
|
||||||
@ -160,7 +176,16 @@ if(ENABLE_DEBUG_CONSOLE)
|
|||||||
else()
|
else()
|
||||||
add_executable(vcmiclient WIN32 ${client_SRCS} ${client_HEADERS} ${client_ICON})
|
add_executable(vcmiclient WIN32 ${client_SRCS} ${client_HEADERS} ${client_ICON})
|
||||||
endif(ENABLE_DEBUG_CONSOLE)
|
endif(ENABLE_DEBUG_CONSOLE)
|
||||||
|
|
||||||
add_dependencies(vcmiclient vcmiserver BattleAI StupidAI VCAI Nullkiller)
|
add_dependencies(vcmiclient vcmiserver BattleAI StupidAI VCAI Nullkiller)
|
||||||
|
if(APPLE_IOS)
|
||||||
|
if(ENABLE_ERM)
|
||||||
|
add_dependencies(vcmiclient vcmiERM)
|
||||||
|
endif()
|
||||||
|
if(ENABLE_LUA)
|
||||||
|
add_dependencies(vcmiclient vcmiLua)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set_target_properties(vcmiclient
|
set_target_properties(vcmiclient
|
||||||
@ -173,15 +198,64 @@ if(WIN32)
|
|||||||
target_link_libraries(vcmiclient SDL2::SDL2main)
|
target_link_libraries(vcmiclient SDL2::SDL2main)
|
||||||
endif()
|
endif()
|
||||||
target_compile_definitions(vcmiclient PRIVATE WINDOWS_IGNORE_PACKING_MISMATCH)
|
target_compile_definitions(vcmiclient PRIVATE WINDOWS_IGNORE_PACKING_MISMATCH)
|
||||||
|
|
||||||
|
# TODO: very hacky, find proper solution to copy AI dlls into bin dir
|
||||||
|
if(MSVC)
|
||||||
|
add_custom_command(TARGET vcmiclient POST_BUILD
|
||||||
|
WORKING_DIRECTORY "$<TARGET_FILE_DIR:vcmiclient>"
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E rename AI/fuzzylite.dll fuzzylite.dll
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E rename AI/tbb.dll tbb.dll
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
elseif(APPLE_IOS)
|
||||||
|
target_link_libraries(vcmiclient PRIVATE
|
||||||
|
iOS_utils
|
||||||
|
|
||||||
|
# FFmpeg
|
||||||
|
bz2
|
||||||
|
iconv
|
||||||
|
z
|
||||||
|
"-framework AudioToolbox"
|
||||||
|
"-framework AVFoundation"
|
||||||
|
"-framework CoreMedia"
|
||||||
|
"-framework VideoToolbox"
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(vcmiclient PROPERTIES
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_LIST_DIR}/ios/Info.plist"
|
||||||
|
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks"
|
||||||
|
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "$(CODE_SIGNING_ALLOWED_FOR_APPS)"
|
||||||
|
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(XCODE_RESOURCE LaunchScreen.storyboard Images.xcassets Settings.bundle vcmi_logo.png)
|
||||||
|
set(XCODE_RESOURCE_PATH ios/${XCODE_RESOURCE})
|
||||||
|
target_sources(vcmiclient PRIVATE ${XCODE_RESOURCE_PATH})
|
||||||
|
set_source_files_properties(${XCODE_RESOURCE_PATH} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
||||||
|
|
||||||
|
# workaround to prevent CMAKE_SKIP_PRECOMPILE_HEADERS being added as compile flag
|
||||||
|
# add max version condition when https://gitlab.kitware.com/cmake/cmake/-/merge_requests/7562 is merged
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.22.0")
|
||||||
|
set_source_files_properties(${XCODE_RESOURCE_PATH} PROPERTIES LANGUAGE CXX)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-e,_client_main")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(BUILD_SINGLE_APP)
|
||||||
|
target_link_libraries(vcmiclient PRIVATE vcmiserver)
|
||||||
|
if(ENABLE_LAUNCHER)
|
||||||
|
target_link_libraries(vcmiclient PRIVATE vcmilauncher)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
target_link_libraries(vcmiclient PRIVATE
|
target_link_libraries(vcmiclient PRIVATE
|
||||||
vcmi SDL2::SDL2 SDL2::Image SDL2::Mixer SDL2::TTF
|
${VCMI_LIB_TARGET} SDL2::SDL2 SDL2::Image SDL2::Mixer SDL2::TTF
|
||||||
)
|
)
|
||||||
|
|
||||||
if(ffmpeg_LIBRARIES)
|
if(ffmpeg_LIBRARIES)
|
||||||
target_link_libraries(vcmiclient PRIVATE
|
target_link_libraries(vcmiclient PRIVATE
|
||||||
ffmpeg::swscale ffmpeg::avutil ffmpeg::avcodec ffmpeg::avformat
|
${ffmpeg_LIBRARIES}
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_compile_definitions(vcmiclient PRIVATE DISABLE_VIDEO)
|
target_compile_definitions(vcmiclient PRIVATE DISABLE_VIDEO)
|
||||||
@ -193,7 +267,15 @@ target_include_directories(vcmiclient
|
|||||||
vcmi_set_output_dir(vcmiclient "")
|
vcmi_set_output_dir(vcmiclient "")
|
||||||
enable_pch(vcmiclient)
|
enable_pch(vcmiclient)
|
||||||
|
|
||||||
|
if(APPLE_IOS)
|
||||||
|
add_custom_command(TARGET vcmiclient POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} --install "${CMAKE_BINARY_DIR}" --component "${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}" --config "$<CONFIG>" --prefix "$<TARGET_BUNDLE_CONTENT_DIR:vcmiclient>"
|
||||||
|
COMMAND ${CMAKE_SOURCE_DIR}/ios/codesign.sh
|
||||||
|
)
|
||||||
|
install(TARGETS vcmiclient DESTINATION Payload COMPONENT app) # for ipa generation with cpack
|
||||||
|
else()
|
||||||
install(TARGETS vcmiclient DESTINATION ${BIN_DIR})
|
install(TARGETS vcmiclient DESTINATION ${BIN_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
#install icons and desktop file on Linux
|
#install icons and desktop file on Linux
|
||||||
if(NOT WIN32 AND NOT APPLE)
|
if(NOT WIN32 AND NOT APPLE)
|
||||||
|
@ -19,30 +19,33 @@
|
|||||||
#define sprintf_s snprintf
|
#define sprintf_s snprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class Artifact;
|
class Artifact;
|
||||||
|
|
||||||
|
struct TryMoveHero;
|
||||||
|
class CGHeroInstance;
|
||||||
|
class CStack;
|
||||||
|
class CCreature;
|
||||||
|
struct CGPath;
|
||||||
|
class CCreatureSet;
|
||||||
|
class CGObjectInstance;
|
||||||
|
struct UpgradeInfo;
|
||||||
|
template <typename T> struct CondSh;
|
||||||
|
struct CPathsInfo;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CButton;
|
class CButton;
|
||||||
class CToggleGroup;
|
class CToggleGroup;
|
||||||
struct TryMoveHero;
|
|
||||||
class CGHeroInstance;
|
|
||||||
class CAdvMapInt;
|
class CAdvMapInt;
|
||||||
class CCastleInterface;
|
class CCastleInterface;
|
||||||
class CBattleInterface;
|
class CBattleInterface;
|
||||||
class CStack;
|
|
||||||
class CComponent;
|
class CComponent;
|
||||||
class CCreature;
|
|
||||||
struct SDL_Surface;
|
|
||||||
struct CGPath;
|
|
||||||
class CCreatureAnimation;
|
class CCreatureAnimation;
|
||||||
class CSelectableComponent;
|
class CSelectableComponent;
|
||||||
class CCreatureSet;
|
|
||||||
class CGObjectInstance;
|
|
||||||
class CSlider;
|
class CSlider;
|
||||||
struct UpgradeInfo;
|
|
||||||
template <typename T> struct CondSh;
|
|
||||||
class CInGameConsole;
|
class CInGameConsole;
|
||||||
class CInGameConsole;
|
|
||||||
union SDL_Event;
|
|
||||||
class CInfoWindow;
|
class CInfoWindow;
|
||||||
class IShowActivatable;
|
class IShowActivatable;
|
||||||
class ClickableL;
|
class ClickableL;
|
||||||
@ -52,7 +55,9 @@ class KeyInterested;
|
|||||||
class MotionInterested;
|
class MotionInterested;
|
||||||
class TimeInterested;
|
class TimeInterested;
|
||||||
class IShowable;
|
class IShowable;
|
||||||
struct CPathsInfo;
|
|
||||||
|
struct SDL_Surface;
|
||||||
|
union SDL_Event;
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
|
@ -21,10 +21,15 @@
|
|||||||
|
|
||||||
#include "mainmenu/CMainMenu.h"
|
#include "mainmenu/CMainMenu.h"
|
||||||
|
|
||||||
#ifndef VCMI_ANDROID
|
#ifdef VCMI_ANDROID
|
||||||
#include "../lib/Interprocess.h"
|
|
||||||
#else
|
|
||||||
#include "../lib/CAndroidVMHelper.h"
|
#include "../lib/CAndroidVMHelper.h"
|
||||||
|
#elif defined(VCMI_IOS)
|
||||||
|
#include "ios/utils.h"
|
||||||
|
#include "../server/CVCMIServer.h"
|
||||||
|
|
||||||
|
#include <dispatch/dispatch.h>
|
||||||
|
#else
|
||||||
|
#include "../lib/Interprocess.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../lib/CConfigHandler.h"
|
#include "../lib/CConfigHandler.h"
|
||||||
#include "../lib/CGeneralTextHandler.h"
|
#include "../lib/CGeneralTextHandler.h"
|
||||||
@ -76,7 +81,7 @@ public:
|
|||||||
bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override
|
bool applyOnLobbyHandler(CServerHandler * handler, void * pack) const override
|
||||||
{
|
{
|
||||||
T * ptr = static_cast<T *>(pack);
|
T * ptr = static_cast<T *>(pack);
|
||||||
logNetwork->trace("\tImmidiately apply on lobby: %s", typeList.getTypeInfo(ptr)->name());
|
logNetwork->trace("\tImmediately apply on lobby: %s", typeList.getTypeInfo(ptr)->name());
|
||||||
return ptr->applyOnLobbyHandler(handler);
|
return ptr->applyOnLobbyHandler(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +137,7 @@ void CServerHandler::resetStateForLobby(const StartInfo::EMode mode, const std::
|
|||||||
else
|
else
|
||||||
myNames.push_back(settings["general"]["playerName"].String());
|
myNames.push_back(settings["general"]["playerName"].String());
|
||||||
|
|
||||||
#ifndef VCMI_ANDROID
|
#if !defined(VCMI_ANDROID) && !defined(VCMI_IOS)
|
||||||
shm.reset();
|
shm.reset();
|
||||||
|
|
||||||
if(!settings["session"]["disable-shm"].Bool())
|
if(!settings["session"]["disable-shm"].Bool())
|
||||||
@ -181,6 +186,14 @@ void CServerHandler::startLocalServerAndConnect()
|
|||||||
CAndroidVMHelper envHelper;
|
CAndroidVMHelper envHelper;
|
||||||
envHelper.callStaticVoidMethod(CAndroidVMHelper::NATIVE_METHODS_DEFAULT_CLASS, "startServer", true);
|
envHelper.callStaticVoidMethod(CAndroidVMHelper::NATIVE_METHODS_DEFAULT_CLASS, "startServer", true);
|
||||||
}
|
}
|
||||||
|
#elif defined(SINGLE_PROCESS_APP)
|
||||||
|
boost::condition_variable cond;
|
||||||
|
threadRunLocalServer = std::make_shared<boost::thread>([&cond, this] {
|
||||||
|
setThreadName("CVCMIServer");
|
||||||
|
CVCMIServer::create(&cond, uuid);
|
||||||
|
onServerFinished();
|
||||||
|
});
|
||||||
|
threadRunLocalServer->detach();
|
||||||
#else
|
#else
|
||||||
threadRunLocalServer = std::make_shared<boost::thread>(&CServerHandler::threadRunServer, this); //runs server executable;
|
threadRunLocalServer = std::make_shared<boost::thread>(&CServerHandler::threadRunServer, this); //runs server executable;
|
||||||
#endif
|
#endif
|
||||||
@ -188,10 +201,7 @@ void CServerHandler::startLocalServerAndConnect()
|
|||||||
|
|
||||||
th->update();
|
th->update();
|
||||||
|
|
||||||
#ifndef VCMI_ANDROID
|
#ifdef VCMI_ANDROID
|
||||||
if(shm)
|
|
||||||
shm->sr->waitTillReady();
|
|
||||||
#else
|
|
||||||
logNetwork->info("waiting for server");
|
logNetwork->info("waiting for server");
|
||||||
while(!androidTestServerReadyFlag.load())
|
while(!androidTestServerReadyFlag.load())
|
||||||
{
|
{
|
||||||
@ -200,16 +210,40 @@ void CServerHandler::startLocalServerAndConnect()
|
|||||||
}
|
}
|
||||||
logNetwork->info("waiting for server finished...");
|
logNetwork->info("waiting for server finished...");
|
||||||
androidTestServerReadyFlag = false;
|
androidTestServerReadyFlag = false;
|
||||||
|
#elif defined(SINGLE_PROCESS_APP)
|
||||||
|
{
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||||
|
iOS_utils::showLoadingIndicator();
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
|
||||||
|
boost::mutex m;
|
||||||
|
boost::unique_lock<boost::mutex> lock{m};
|
||||||
|
logNetwork->info("waiting for server");
|
||||||
|
cond.wait(lock);
|
||||||
|
logNetwork->info("server is ready");
|
||||||
|
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||||
|
iOS_utils::hideLoadingIndicator();
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if(shm)
|
||||||
|
shm->sr->waitTillReady();
|
||||||
#endif
|
#endif
|
||||||
logNetwork->trace("Waiting for server: %d ms", th->getDiff());
|
logNetwork->trace("Waiting for server: %d ms", th->getDiff());
|
||||||
|
|
||||||
th->update(); //put breakpoint here to attach to server before it does something stupid
|
th->update(); //put breakpoint here to attach to server before it does something stupid
|
||||||
|
|
||||||
#ifndef VCMI_ANDROID
|
#if !defined(VCMI_ANDROID) && !defined(VCMI_IOS)
|
||||||
justConnectToServer(settings["server"]["server"].String(), shm ? shm->sr->port : 0);
|
const ui16 port = shm ? shm->sr->port : 0;
|
||||||
#else
|
#else
|
||||||
justConnectToServer(settings["server"]["server"].String());
|
const ui16 port = 0;
|
||||||
#endif
|
#endif
|
||||||
|
justConnectToServer(settings["server"]["server"].String(), port);
|
||||||
|
|
||||||
logNetwork->trace("\tConnecting to the server: %d ms", th->getDiff());
|
logNetwork->trace("\tConnecting to the server: %d ms", th->getDiff());
|
||||||
}
|
}
|
||||||
@ -546,6 +580,11 @@ void CServerHandler::startCampaignScenario(std::shared_ptr<CCampaignState> cs)
|
|||||||
SDL_PushEvent(&event);
|
SDL_PushEvent(&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CServerHandler::showServerError(std::string txt)
|
||||||
|
{
|
||||||
|
CInfoWindow::showInfoDialog(txt, {});
|
||||||
|
}
|
||||||
|
|
||||||
int CServerHandler::howManyPlayerInterfaces()
|
int CServerHandler::howManyPlayerInterfaces()
|
||||||
{
|
{
|
||||||
int playerInts = 0;
|
int playerInts = 0;
|
||||||
@ -698,7 +737,7 @@ void CServerHandler::threadHandleConnection()
|
|||||||
|
|
||||||
void CServerHandler::threadRunServer()
|
void CServerHandler::threadRunServer()
|
||||||
{
|
{
|
||||||
#ifndef VCMI_ANDROID
|
#if !defined(VCMI_ANDROID) && !defined(VCMI_IOS)
|
||||||
setThreadName("CServerHandler::threadRunServer");
|
setThreadName("CServerHandler::threadRunServer");
|
||||||
const std::string logName = (VCMIDirs::get().userLogsPath() / "server_log.txt").string();
|
const std::string logName = (VCMIDirs::get().userLogsPath() / "server_log.txt").string();
|
||||||
std::string comm = VCMIDirs::get().serverPath().string()
|
std::string comm = VCMIDirs::get().serverPath().string()
|
||||||
@ -739,9 +778,14 @@ void CServerHandler::threadRunServer()
|
|||||||
logNetwork->error("Error: server failed to close correctly or crashed!");
|
logNetwork->error("Error: server failed to close correctly or crashed!");
|
||||||
logNetwork->error("Check %s for more info", logName);
|
logNetwork->error("Check %s for more info", logName);
|
||||||
}
|
}
|
||||||
|
onServerFinished();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void CServerHandler::onServerFinished()
|
||||||
|
{
|
||||||
threadRunLocalServer.reset();
|
threadRunLocalServer.reset();
|
||||||
CSH->campaignServerRestartLock.setn(false);
|
CSH->campaignServerRestartLock.setn(false);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CServerHandler::sendLobbyPack(const CPackForLobby & pack) const
|
void CServerHandler::sendLobbyPack(const CPackForLobby & pack) const
|
||||||
|
@ -14,7 +14,8 @@
|
|||||||
#include "../lib/StartInfo.h"
|
#include "../lib/StartInfo.h"
|
||||||
#include "../lib/CondSh.h"
|
#include "../lib/CondSh.h"
|
||||||
|
|
||||||
struct SharedMemory;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CConnection;
|
class CConnection;
|
||||||
class PlayerColor;
|
class PlayerColor;
|
||||||
struct StartInfo;
|
struct StartInfo;
|
||||||
@ -23,9 +24,15 @@ class CMapInfo;
|
|||||||
struct ClientPlayer;
|
struct ClientPlayer;
|
||||||
struct CPack;
|
struct CPack;
|
||||||
struct CPackForLobby;
|
struct CPackForLobby;
|
||||||
class CClient;
|
|
||||||
|
|
||||||
template<typename T> class CApplier;
|
template<typename T> class CApplier;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
struct SharedMemory;
|
||||||
|
|
||||||
|
class CClient;
|
||||||
|
|
||||||
class CBaseForLobbyApply;
|
class CBaseForLobbyApply;
|
||||||
|
|
||||||
// TODO: Add mutex so we can't set CONNECTION_CANCELLED if client already connected, but thread not setup yet
|
// TODO: Add mutex so we can't set CONNECTION_CANCELLED if client already connected, but thread not setup yet
|
||||||
@ -76,6 +83,7 @@ class CServerHandler : public IServerAPI, public LobbyInfo
|
|||||||
|
|
||||||
void threadHandleConnection();
|
void threadHandleConnection();
|
||||||
void threadRunServer();
|
void threadRunServer();
|
||||||
|
void onServerFinished();
|
||||||
void sendLobbyPack(const CPackForLobby & pack) const override;
|
void sendLobbyPack(const CPackForLobby & pack) const override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -137,6 +145,7 @@ public:
|
|||||||
void startGameplay();
|
void startGameplay();
|
||||||
void endGameplay(bool closeConnection = true, bool restart = false);
|
void endGameplay(bool closeConnection = true, bool restart = false);
|
||||||
void startCampaignScenario(std::shared_ptr<CCampaignState> cs = {});
|
void startCampaignScenario(std::shared_ptr<CCampaignState> cs = {});
|
||||||
|
void showServerError(std::string txt);
|
||||||
|
|
||||||
// TODO: LobbyState must be updated within game so we should always know how many player interfaces our client handle
|
// TODO: LobbyState must be updated within game so we should always know how many player interfaces our client handle
|
||||||
int howManyPlayerInterfaces();
|
int howManyPlayerInterfaces();
|
||||||
|
@ -19,25 +19,22 @@
|
|||||||
#include "../lib/CondSh.h"
|
#include "../lib/CondSh.h"
|
||||||
#include "../lib/CPathfinder.h"
|
#include "../lib/CPathfinder.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
struct CPack;
|
struct CPack;
|
||||||
struct CPackForServer;
|
struct CPackForServer;
|
||||||
class CCampaignState;
|
class CCampaignState;
|
||||||
class CBattleCallback;
|
|
||||||
class IGameEventsReceiver;
|
class IGameEventsReceiver;
|
||||||
class IBattleEventsReceiver;
|
class IBattleEventsReceiver;
|
||||||
class CBattleGameInterface;
|
class CBattleGameInterface;
|
||||||
class CGameState;
|
class CGameState;
|
||||||
class CGameInterface;
|
class CGameInterface;
|
||||||
class CCallback;
|
|
||||||
class BattleAction;
|
class BattleAction;
|
||||||
class CClient;
|
|
||||||
struct CPathsInfo;
|
struct CPathsInfo;
|
||||||
class BinaryDeserializer;
|
class BinaryDeserializer;
|
||||||
class BinarySerializer;
|
class BinarySerializer;
|
||||||
namespace boost { class thread; }
|
|
||||||
|
|
||||||
template<typename T> class CApplier;
|
template<typename T> class CApplier;
|
||||||
class CBaseForCLApply;
|
|
||||||
|
|
||||||
#if SCRIPTING_ENABLED
|
#if SCRIPTING_ENABLED
|
||||||
namespace scripting
|
namespace scripting
|
||||||
@ -51,6 +48,15 @@ namespace events
|
|||||||
class EventBus;
|
class EventBus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CBattleCallback;
|
||||||
|
class CCallback;
|
||||||
|
class CClient;
|
||||||
|
class CBaseForCLApply;
|
||||||
|
|
||||||
|
namespace boost { class thread; }
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class ThreadSafeVector
|
class ThreadSafeVector
|
||||||
{
|
{
|
||||||
|
@ -13,18 +13,23 @@
|
|||||||
#include "../lib/GameConstants.h"
|
#include "../lib/GameConstants.h"
|
||||||
#include "gui/Geometries.h"
|
#include "gui/Geometries.h"
|
||||||
|
|
||||||
struct SDL_Surface;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
class CGTownInstance;
|
class CGTownInstance;
|
||||||
class CHeroClass;
|
class CHeroClass;
|
||||||
struct SDL_Color;
|
|
||||||
struct InfoAboutHero;
|
struct InfoAboutHero;
|
||||||
struct InfoAboutTown;
|
struct InfoAboutTown;
|
||||||
class CGObjectInstance;
|
class CGObjectInstance;
|
||||||
class ObjectTemplate;
|
class ObjectTemplate;
|
||||||
class CAnimation;
|
|
||||||
class EntityService;
|
class EntityService;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
struct SDL_Surface;
|
||||||
|
struct SDL_Color;
|
||||||
|
class CAnimation;
|
||||||
|
|
||||||
enum EFonts
|
enum EFonts
|
||||||
{
|
{
|
||||||
FONT_BIG, FONT_CALLI, FONT_CREDITS, FONT_HIGH_SCORE, FONT_MEDIUM, FONT_SMALL, FONT_TIMES, FONT_TINY, FONT_VERD
|
FONT_BIG, FONT_CALLI, FONT_CREDITS, FONT_HIGH_SCORE, FONT_MEDIUM, FONT_SMALL, FONT_TIMES, FONT_TINY, FONT_VERD
|
||||||
|
@ -137,3 +137,9 @@ void LobbyUpdateState::applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler *
|
|||||||
if(hostChanged)
|
if(hostChanged)
|
||||||
lobby->toggleMode(handler->isHost());
|
lobby->toggleMode(handler->isHost());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LobbyShowMessage::applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler)
|
||||||
|
{
|
||||||
|
lobby->buttonStart->block(false);
|
||||||
|
handler->showServerError(message);
|
||||||
|
}
|
||||||
|
@ -9,7 +9,12 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
struct SDL_RWops;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CInputStream;
|
class CInputStream;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
struct SDL_RWops;
|
||||||
|
|
||||||
SDL_RWops* MakeSDLRWops(std::unique_ptr<CInputStream> in);
|
SDL_RWops* MakeSDLRWops(std::unique_ptr<CInputStream> in);
|
||||||
|
@ -7,3 +7,5 @@
|
|||||||
// This header should be treated as a pre compiled header file(PCH) in the compiler building settings.
|
// This header should be treated as a pre compiled header file(PCH) in the compiler building settings.
|
||||||
|
|
||||||
// Here you can add specific libraries and macros which are specific to this project.
|
// Here you can add specific libraries and macros which are specific to this project.
|
||||||
|
|
||||||
|
VCMI_LIB_USING_NAMESPACE
|
||||||
|
@ -12,8 +12,13 @@
|
|||||||
#include "../../lib/battle/BattleHex.h"
|
#include "../../lib/battle/BattleHex.h"
|
||||||
#include "../widgets/Images.h"
|
#include "../widgets/Images.h"
|
||||||
|
|
||||||
class CBattleInterface;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CStack;
|
class CStack;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CBattleInterface;
|
||||||
class CCreatureAnimation;
|
class CCreatureAnimation;
|
||||||
struct CatapultProjectileInfo;
|
struct CatapultProjectileInfo;
|
||||||
struct StackAttackedInfo;
|
struct StackAttackedInfo;
|
||||||
|
@ -19,14 +19,11 @@
|
|||||||
#include "../../lib/spells/CSpellHandler.h" //CSpell::TAnimation
|
#include "../../lib/spells/CSpellHandler.h" //CSpell::TAnimation
|
||||||
#include "../../lib/battle/CBattleInfoCallback.h"
|
#include "../../lib/battle/CBattleInfoCallback.h"
|
||||||
|
|
||||||
class CLabel;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CCreatureSet;
|
class CCreatureSet;
|
||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
class CStack;
|
class CStack;
|
||||||
class CCallback;
|
|
||||||
class CButton;
|
|
||||||
class CToggleButton;
|
|
||||||
class CToggleGroup;
|
|
||||||
struct BattleResult;
|
struct BattleResult;
|
||||||
struct BattleSpellCast;
|
struct BattleSpellCast;
|
||||||
struct CObstacleInstance;
|
struct CObstacleInstance;
|
||||||
@ -35,8 +32,21 @@ struct SetStackEffect;
|
|||||||
class BattleAction;
|
class BattleAction;
|
||||||
class CGTownInstance;
|
class CGTownInstance;
|
||||||
struct CatapultAttack;
|
struct CatapultAttack;
|
||||||
struct CatapultProjectileInfo;
|
|
||||||
struct BattleTriggerEffect;
|
struct BattleTriggerEffect;
|
||||||
|
struct BattleHex;
|
||||||
|
struct InfoAboutHero;
|
||||||
|
class CBattleGameInterface;
|
||||||
|
struct CustomEffectInfo;
|
||||||
|
class CSpell;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CLabel;
|
||||||
|
class CCallback;
|
||||||
|
class CButton;
|
||||||
|
class CToggleButton;
|
||||||
|
class CToggleGroup;
|
||||||
|
struct CatapultProjectileInfo;
|
||||||
class CBattleAnimation;
|
class CBattleAnimation;
|
||||||
class CBattleHero;
|
class CBattleHero;
|
||||||
class CBattleConsole;
|
class CBattleConsole;
|
||||||
@ -46,13 +56,8 @@ class CPlayerInterface;
|
|||||||
class CCreatureAnimation;
|
class CCreatureAnimation;
|
||||||
struct ProjectileInfo;
|
struct ProjectileInfo;
|
||||||
class CClickableHex;
|
class CClickableHex;
|
||||||
struct BattleHex;
|
|
||||||
struct InfoAboutHero;
|
|
||||||
class CBattleGameInterface;
|
|
||||||
struct CustomEffectInfo;
|
|
||||||
class CAnimation;
|
class CAnimation;
|
||||||
class IImage;
|
class IImage;
|
||||||
class CSpell;
|
|
||||||
|
|
||||||
/// Small struct which contains information about the id of the attacked stack, the damage dealt,...
|
/// Small struct which contains information about the id of the attacked stack, the damage dealt,...
|
||||||
struct StackAttackedInfo
|
struct StackAttackedInfo
|
||||||
|
@ -13,8 +13,20 @@
|
|||||||
#include "../../lib/battle/BattleHex.h"
|
#include "../../lib/battle/BattleHex.h"
|
||||||
#include "../windows/CWindowObject.h"
|
#include "../windows/CWindowObject.h"
|
||||||
|
|
||||||
struct SDL_Surface;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
|
struct BattleResult;
|
||||||
|
class CStack;
|
||||||
|
|
||||||
|
namespace battle
|
||||||
|
{
|
||||||
|
class Unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
struct SDL_Surface;
|
||||||
class CBattleInterface;
|
class CBattleInterface;
|
||||||
class CPicture;
|
class CPicture;
|
||||||
class CFilledTexture;
|
class CFilledTexture;
|
||||||
@ -23,12 +35,6 @@ class CToggleButton;
|
|||||||
class CToggleGroup;
|
class CToggleGroup;
|
||||||
class CLabel;
|
class CLabel;
|
||||||
class CTextBox;
|
class CTextBox;
|
||||||
struct BattleResult;
|
|
||||||
class CStack;
|
|
||||||
namespace battle
|
|
||||||
{
|
|
||||||
class Unit;
|
|
||||||
}
|
|
||||||
class CAnimImage;
|
class CAnimImage;
|
||||||
class CPlayerInterface;
|
class CPlayerInterface;
|
||||||
|
|
||||||
|
@ -21,8 +21,13 @@
|
|||||||
#undef OUT
|
#undef OUT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct SDL_Surface;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class JsonNode;
|
class JsonNode;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
struct SDL_Surface;
|
||||||
class CDefFile;
|
class CDefFile;
|
||||||
class ColorShifter;
|
class ColorShifter;
|
||||||
|
|
||||||
|
@ -13,6 +13,12 @@
|
|||||||
#include "Geometries.h"
|
#include "Geometries.h"
|
||||||
#include "SDL_Extensions.h"
|
#include "SDL_Extensions.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
template <typename T> struct CondSh;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CFramerateManager;
|
class CFramerateManager;
|
||||||
class CGStatusBar;
|
class CGStatusBar;
|
||||||
class CIntObject;
|
class CIntObject;
|
||||||
@ -20,7 +26,6 @@ class IUpdateable;
|
|||||||
class IShowActivatable;
|
class IShowActivatable;
|
||||||
class IShowable;
|
class IShowable;
|
||||||
enum class EIntObjMouseBtnType;
|
enum class EIntObjMouseBtnType;
|
||||||
template <typename T> struct CondSh;
|
|
||||||
|
|
||||||
// TODO: event handling need refactoring
|
// TODO: event handling need refactoring
|
||||||
enum EUserEvent
|
enum EUserEvent
|
||||||
|
@ -9,8 +9,12 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class JsonNode;
|
class JsonNode;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
struct Point;
|
struct Point;
|
||||||
struct SDL_Surface;
|
struct SDL_Surface;
|
||||||
struct SDL_Color;
|
struct SDL_Color;
|
||||||
|
@ -20,6 +20,10 @@
|
|||||||
#include <dispatch/dispatch.h>
|
#include <dispatch/dispatch.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
#include "ios/utils.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
const SDL_Color Colors::YELLOW = { 229, 215, 123, 0 };
|
const SDL_Color Colors::YELLOW = { 229, 215, 123, 0 };
|
||||||
const SDL_Color Colors::WHITE = { 255, 243, 222, 0 };
|
const SDL_Color Colors::WHITE = { 255, 243, 222, 0 };
|
||||||
const SDL_Color Colors::METALLIC_GOLD = { 173, 142, 66, 0 };
|
const SDL_Color Colors::METALLIC_GOLD = { 173, 142, 66, 0 };
|
||||||
@ -790,15 +794,37 @@ SDL_Color CSDL_Ext::makeColor(ui8 r, ui8 g, ui8 b, ui8 a)
|
|||||||
|
|
||||||
void CSDL_Ext::startTextInput(SDL_Rect * where)
|
void CSDL_Ext::startTextInput(SDL_Rect * where)
|
||||||
{
|
{
|
||||||
#ifdef VCMI_APPLE
|
auto impl = [](SDL_Rect * where)
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
{
|
||||||
#endif
|
|
||||||
|
|
||||||
if (SDL_IsTextInputActive() == SDL_FALSE)
|
if (SDL_IsTextInputActive() == SDL_FALSE)
|
||||||
{
|
{
|
||||||
SDL_StartTextInput();
|
SDL_StartTextInput();
|
||||||
}
|
}
|
||||||
SDL_SetTextInputRect(where);
|
SDL_SetTextInputRect(where);
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef VCMI_APPLE
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
// TODO ios: looks like SDL bug actually, try fixing there
|
||||||
|
auto renderer = SDL_GetRenderer(mainWindow);
|
||||||
|
float scaleX, scaleY;
|
||||||
|
SDL_Rect viewport;
|
||||||
|
SDL_RenderGetScale(renderer, &scaleX, &scaleY);
|
||||||
|
SDL_RenderGetViewport(renderer, &viewport);
|
||||||
|
|
||||||
|
const auto nativeScale = iOS_utils::screenScale();
|
||||||
|
auto rectInScreenCoordinates = *where;
|
||||||
|
rectInScreenCoordinates.x = (viewport.x + rectInScreenCoordinates.x) * scaleX / nativeScale;
|
||||||
|
rectInScreenCoordinates.y = (viewport.y + rectInScreenCoordinates.y) * scaleY / nativeScale;
|
||||||
|
rectInScreenCoordinates.w = rectInScreenCoordinates.w * scaleX / nativeScale;
|
||||||
|
rectInScreenCoordinates.h = rectInScreenCoordinates.h * scaleY / nativeScale;
|
||||||
|
impl(&rectInScreenCoordinates);
|
||||||
|
#else
|
||||||
|
impl(where);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef VCMI_APPLE
|
#ifdef VCMI_APPLE
|
||||||
});
|
});
|
||||||
|
23
client/ios/GameChatKeyboardHanlder.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* GameChatKeyboardHanlder.h, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface GameChatKeyboardHanlder : NSObject
|
||||||
|
|
||||||
|
@property (nonatomic, weak) UITextField * textFieldSDL;
|
||||||
|
|
||||||
|
- (void)triggerInput;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
107
client/ios/GameChatKeyboardHanlder.m
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* GameChatKeyboardHanlder.m, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "GameChatKeyboardHanlder.h"
|
||||||
|
|
||||||
|
#include <SDL_events.h>
|
||||||
|
|
||||||
|
static int watchReturnKey(void * userdata, SDL_Event * event);
|
||||||
|
|
||||||
|
static void sendKeyEvent(SDL_KeyCode keyCode)
|
||||||
|
{
|
||||||
|
SDL_Event keyEvent;
|
||||||
|
keyEvent.key = (SDL_KeyboardEvent){
|
||||||
|
.type = SDL_KEYDOWN,
|
||||||
|
.keysym.sym = keyCode,
|
||||||
|
};
|
||||||
|
SDL_PushEvent(&keyEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CGRect keyboardFrame(NSNotification * n, NSString * userInfoKey)
|
||||||
|
{
|
||||||
|
return [n.userInfo[userInfoKey] CGRectValue];
|
||||||
|
}
|
||||||
|
static CGRect keyboardFrameBegin(NSNotification * n) { return keyboardFrame(n, UIKeyboardFrameBeginUserInfoKey); }
|
||||||
|
static CGRect keyboardFrameEnd (NSNotification * n) { return keyboardFrame(n, UIKeyboardFrameEndUserInfoKey); }
|
||||||
|
|
||||||
|
|
||||||
|
@interface GameChatKeyboardHanlder ()
|
||||||
|
@property (nonatomic) BOOL wasChatMessageSent;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation GameChatKeyboardHanlder
|
||||||
|
|
||||||
|
- (void)triggerInput {
|
||||||
|
__auto_type notificationCenter = NSNotificationCenter.defaultCenter;
|
||||||
|
[notificationCenter addObserver:self selector:@selector(textDidBeginEditing:) name:UITextFieldTextDidBeginEditingNotification object:nil];
|
||||||
|
[notificationCenter addObserver:self selector:@selector(textDidEndEditing:) name:UITextFieldTextDidEndEditingNotification object:nil];
|
||||||
|
[notificationCenter addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
|
||||||
|
[notificationCenter addObserver:self selector:@selector(keyboardDidChangeFrame:) name:UIKeyboardDidChangeFrameNotification object:nil];
|
||||||
|
|
||||||
|
self.wasChatMessageSent = NO;
|
||||||
|
sendKeyEvent(SDLK_TAB);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)positionTextFieldAboveKeyboardRect:(CGRect)kbFrame {
|
||||||
|
__auto_type r = kbFrame;
|
||||||
|
r.size.height = CGRectGetHeight(self.textFieldSDL.frame);
|
||||||
|
r.origin.y -= r.size.height;
|
||||||
|
self.textFieldSDL.frame = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Notifications
|
||||||
|
|
||||||
|
- (void)textDidBeginEditing:(NSNotification *)n {
|
||||||
|
self.textFieldSDL.hidden = NO;
|
||||||
|
self.textFieldSDL.text = nil;
|
||||||
|
|
||||||
|
// watch for pressing Return to ignore sending Escape key after keyboard is closed
|
||||||
|
SDL_AddEventWatch(watchReturnKey, (__bridge void *)self);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)textDidEndEditing:(NSNotification *)n {
|
||||||
|
[NSNotificationCenter.defaultCenter removeObserver:self];
|
||||||
|
self.textFieldSDL.hidden = YES;
|
||||||
|
|
||||||
|
// discard chat message
|
||||||
|
if(!self.wasChatMessageSent)
|
||||||
|
sendKeyEvent(SDLK_ESCAPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)keyboardWillChangeFrame:(NSNotification *)n {
|
||||||
|
// animate textfield together with keyboard
|
||||||
|
[UIView performWithoutAnimation:^{
|
||||||
|
[self positionTextFieldAboveKeyboardRect:keyboardFrameBegin(n)];
|
||||||
|
}];
|
||||||
|
|
||||||
|
NSTimeInterval kbAnimationDuration = [n.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
|
||||||
|
NSUInteger kbAnimationCurve = [n.userInfo[UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue];
|
||||||
|
[UIView animateWithDuration:kbAnimationDuration delay:0 options:(kbAnimationCurve << 16) animations:^{
|
||||||
|
[self positionTextFieldAboveKeyboardRect:keyboardFrameEnd(n)];
|
||||||
|
} completion:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)keyboardDidChangeFrame:(NSNotification *)n {
|
||||||
|
[self positionTextFieldAboveKeyboardRect:keyboardFrameEnd(n)];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
static int watchReturnKey(void * userdata, SDL_Event * event)
|
||||||
|
{
|
||||||
|
if(event->type == SDL_KEYDOWN && event->key.keysym.scancode == SDL_SCANCODE_RETURN)
|
||||||
|
{
|
||||||
|
__auto_type self = (__bridge GameChatKeyboardHanlder *)userdata;
|
||||||
|
self.wasChatMessageSent = YES;
|
||||||
|
SDL_DelEventWatch(watchReturnKey, userdata);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
121
client/ios/Images.xcassets/AppIcon.appiconset/Contents.json
Executable file
@ -0,0 +1,121 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-20x20@2x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-20x20@3x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-29x29@1x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-29x29@2x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-29x29@3x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-40x40@2x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-40x40@3x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-60x60@2x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-60x60@3x.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x",
|
||||||
|
"size" : "60x60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-20x20@1x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-20x20@2x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "20x20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-29x29@1x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-29x29@2x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "29x29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-40x40@1x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-40x40@2x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "40x40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-76x76@1x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "76x76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-76x76@2x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "76x76"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Icon-App-83.5x83.5@2x.png",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"scale" : "2x",
|
||||||
|
"size" : "83.5x83.5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ios-marketing",
|
||||||
|
"scale" : "1x",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 28 KiB |
6
client/ios/Images.xcassets/Contents.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
60
client/ios/Info.plist
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>VCMI</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>$(MARKETING_VERSION)</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleURLTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleURLSchemes</key>
|
||||||
|
<array>
|
||||||
|
<string>vcmi</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSAppTransportSecurity</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
|
<true/>
|
||||||
|
<key>UIFileSharingEnabled</key>
|
||||||
|
<true/>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
<array>
|
||||||
|
<string>armv7</string>
|
||||||
|
<string>opengles-2</string>
|
||||||
|
</array>
|
||||||
|
<key>UIRequiresFullScreen</key>
|
||||||
|
<true/>
|
||||||
|
<key>UIStatusBarHidden</key>
|
||||||
|
<true/>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
39
client/ios/LaunchScreen.storyboard
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||||
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
|
||||||
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--View Controller-->
|
||||||
|
<scene sceneID="EHf-IW-A2E">
|
||||||
|
<objects>
|
||||||
|
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||||
|
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="vcmi_logo.png" translatesAutoresizingMaskIntoConstraints="NO" id="xBx-rS-h4V">
|
||||||
|
<rect key="frame" x="87.5" y="233.5" width="200" height="200"/>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<viewLayoutGuide key="safeArea" id="Jnx-JV-IwA"/>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="xBx-rS-h4V" firstAttribute="centerY" secondItem="Jnx-JV-IwA" secondAttribute="centerY" id="OgR-oG-SHt"/>
|
||||||
|
<constraint firstItem="xBx-rS-h4V" firstAttribute="centerX" secondItem="Jnx-JV-IwA" secondAttribute="centerX" id="eTp-at-qVT"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="53" y="375"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<image name="vcmi_logo.png" width="200" height="200"/>
|
||||||
|
</resources>
|
||||||
|
</document>
|
31
client/ios/Settings.bundle/Root.plist
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>StringsTable</key>
|
||||||
|
<string>Root</string>
|
||||||
|
<key>PreferenceSpecifiers</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSRadioGroupSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>LaunchType</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>LaunchType</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<integer>0</integer>
|
||||||
|
<integer>1</integer>
|
||||||
|
</array>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Launcher</string>
|
||||||
|
<string>Game</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
3
client/ios/Settings.bundle/en.lproj/Root.strings
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"LaunchType" = "App start type";
|
||||||
|
"Launcher" = "Launcher";
|
||||||
|
"Game" = "Game";
|
3
client/ios/Settings.bundle/ru.lproj/Root.strings
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"LaunchType" = "Тип запуска приложения";
|
||||||
|
"Launcher" = "Конфигурация (лаунчер)";
|
||||||
|
"Game" = "Игра";
|
57
client/ios/main.m
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* main.m, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#import "startSDL.h"
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static void startSDLManually(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
id<UIApplicationDelegate> appDelegate;
|
||||||
|
@autoreleasepool {
|
||||||
|
__auto_type sdlAppDelegateClass = NSClassFromString(@"SDLUIKitDelegate");
|
||||||
|
NSCAssert(sdlAppDelegateClass != nil, @"SDL AppDelegate class doesn't exist");
|
||||||
|
NSCAssert(class_conformsToProtocol(sdlAppDelegateClass, @protocol(UIApplicationDelegate)), @"SDL AppDelegate doesn't conform to UIApplicationDelegate");
|
||||||
|
appDelegate = [sdlAppDelegateClass new];
|
||||||
|
}
|
||||||
|
UIApplication.sharedApplication.delegate = appDelegate;
|
||||||
|
|
||||||
|
int result = startSDL(argc, argv, YES);
|
||||||
|
exit(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int qt_main_wrapper(int argc, char * argv[]);
|
||||||
|
|
||||||
|
int client_main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
NSInteger launchType;
|
||||||
|
__auto_type envVar = getenv("VCMI_LAUNCH_TYPE");
|
||||||
|
if (envVar)
|
||||||
|
launchType = envVar[0] == '0' ? 0 : 1;
|
||||||
|
else {
|
||||||
|
@autoreleasepool {
|
||||||
|
launchType = [NSUserDefaults.standardUserDefaults integerForKey:@"LaunchType"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (launchType == 1)
|
||||||
|
return startSDL(argc, argv, NO);
|
||||||
|
|
||||||
|
@autoreleasepool {
|
||||||
|
id __block startGameObserver = [NSNotificationCenter.defaultCenter addObserverForName:@"StartGame" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
|
||||||
|
[NSNotificationCenter.defaultCenter removeObserver:startGameObserver];
|
||||||
|
startGameObserver = nil;
|
||||||
|
startSDLManually(argc, argv);
|
||||||
|
}];
|
||||||
|
return qt_main_wrapper(argc, argv);
|
||||||
|
}
|
||||||
|
}
|
19
client/ios/startSDL.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* startSDL.h, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __OBJC__
|
||||||
|
#include <objc/objc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
int startSDL(int argc, char * argv[], BOOL startManually);
|
162
client/ios/startSDL.mm
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* startSDL.mm, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#import "startSDL.h"
|
||||||
|
#import "GameChatKeyboardHanlder.h"
|
||||||
|
|
||||||
|
#include "../Global.h"
|
||||||
|
#include "CMT.h"
|
||||||
|
#include "CServerHandler.h"
|
||||||
|
#include "CFocusableHelper.h"
|
||||||
|
|
||||||
|
#include <SDL_main.h>
|
||||||
|
#include <SDL_events.h>
|
||||||
|
#include <SDL_render.h>
|
||||||
|
#include <SDL_system.h>
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
@interface SDLViewObserver : NSObject <UIGestureRecognizerDelegate>
|
||||||
|
@property (nonatomic, strong) GameChatKeyboardHanlder * gameChatHandler;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation SDLViewObserver
|
||||||
|
|
||||||
|
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
|
||||||
|
[object removeObserver:self forKeyPath:keyPath];
|
||||||
|
|
||||||
|
UIView * view = [object valueForKeyPath:keyPath];
|
||||||
|
|
||||||
|
UITextField * textField;
|
||||||
|
for (UIView * v in view.subviews) {
|
||||||
|
if ([v isKindOfClass:[UITextField class]]) {
|
||||||
|
textField = (UITextField *)v;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto r = textField.frame;
|
||||||
|
r.size.height = 40;
|
||||||
|
textField.frame = r;
|
||||||
|
self.gameChatHandler.textFieldSDL = textField;
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
|
||||||
|
if(@available(iOS 13.0, *))
|
||||||
|
textField.backgroundColor = UIColor.systemBackgroundColor;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
textField.backgroundColor = UIColor.whiteColor;
|
||||||
|
|
||||||
|
auto longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
|
||||||
|
longPress.minimumPressDuration = 0.2;
|
||||||
|
[view addGestureRecognizer:longPress];
|
||||||
|
|
||||||
|
auto pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
|
||||||
|
[view addGestureRecognizer:pinch];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Gestures
|
||||||
|
|
||||||
|
- (void)handleLongPress:(UIGestureRecognizer *)gesture {
|
||||||
|
// send RMB click
|
||||||
|
SDL_EventType mouseButtonType;
|
||||||
|
switch (gesture.state)
|
||||||
|
{
|
||||||
|
case UIGestureRecognizerStateBegan:
|
||||||
|
mouseButtonType = SDL_MOUSEBUTTONDOWN;
|
||||||
|
break;
|
||||||
|
case UIGestureRecognizerStateEnded:
|
||||||
|
mouseButtonType = SDL_MOUSEBUTTONUP;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto renderer = SDL_GetRenderer(mainWindow);
|
||||||
|
float scaleX, scaleY;
|
||||||
|
SDL_Rect viewport;
|
||||||
|
SDL_RenderGetScale(renderer, &scaleX, &scaleY);
|
||||||
|
SDL_RenderGetViewport(renderer, &viewport);
|
||||||
|
|
||||||
|
auto touchedPoint = [gesture locationInView:gesture.view];
|
||||||
|
auto screenScale = UIScreen.mainScreen.nativeScale;
|
||||||
|
Sint32 x = (int)touchedPoint.x * screenScale / scaleX - viewport.x;
|
||||||
|
Sint32 y = (int)touchedPoint.y * screenScale / scaleY - viewport.y;
|
||||||
|
|
||||||
|
SDL_Event rmbEvent;
|
||||||
|
rmbEvent.button = (SDL_MouseButtonEvent){
|
||||||
|
.type = mouseButtonType,
|
||||||
|
.button = SDL_BUTTON_RIGHT,
|
||||||
|
.clicks = 1,
|
||||||
|
.x = x,
|
||||||
|
.y = y,
|
||||||
|
};
|
||||||
|
SDL_PushEvent(&rmbEvent);
|
||||||
|
|
||||||
|
// small hack to prevent cursor jumping
|
||||||
|
if (mouseButtonType == SDL_MOUSEBUTTONUP)
|
||||||
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.025 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||||
|
SDL_Event motionEvent;
|
||||||
|
motionEvent.motion = (SDL_MouseMotionEvent){
|
||||||
|
.type = SDL_MOUSEMOTION,
|
||||||
|
.x = x,
|
||||||
|
.y = y,
|
||||||
|
};
|
||||||
|
SDL_PushEvent(&motionEvent);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)handlePinch:(UIGestureRecognizer *)gesture {
|
||||||
|
if(gesture.state != UIGestureRecognizerStateBegan || CSH->state != EClientState::GAMEPLAY)
|
||||||
|
return;
|
||||||
|
[self.gameChatHandler triggerInput];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - UIGestureRecognizerDelegate
|
||||||
|
|
||||||
|
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
|
||||||
|
return [gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
int startSDL(int argc, char * argv[], BOOL startManually)
|
||||||
|
{
|
||||||
|
@autoreleasepool {
|
||||||
|
auto observer = [SDLViewObserver new];
|
||||||
|
observer.gameChatHandler = [GameChatKeyboardHanlder new];
|
||||||
|
|
||||||
|
id __block sdlWindowCreationObserver = [NSNotificationCenter.defaultCenter addObserverForName:UIWindowDidBecomeKeyNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
|
||||||
|
[NSNotificationCenter.defaultCenter removeObserver:sdlWindowCreationObserver];
|
||||||
|
sdlWindowCreationObserver = nil;
|
||||||
|
|
||||||
|
UIWindow * sdlWindow = note.object;
|
||||||
|
[sdlWindow.rootViewController addObserver:observer forKeyPath:NSStringFromSelector(@selector(view)) options:NSKeyValueObservingOptionNew context:NULL];
|
||||||
|
}];
|
||||||
|
id textFieldObserver = [NSNotificationCenter.defaultCenter addObserverForName:UITextFieldTextDidEndEditingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
|
||||||
|
removeFocusFromActiveInput();
|
||||||
|
}];
|
||||||
|
|
||||||
|
int result;
|
||||||
|
if (startManually)
|
||||||
|
{
|
||||||
|
// copied from -[SDLUIKitDelegate postFinishLaunch]
|
||||||
|
SDL_SetMainReady();
|
||||||
|
SDL_iOSSetEventPump(SDL_TRUE);
|
||||||
|
result = SDL_main(argc, argv);
|
||||||
|
SDL_iOSSetEventPump(SDL_FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = SDL_UIKitRunApp(argc, argv, SDL_main);
|
||||||
|
|
||||||
|
[NSNotificationCenter.defaultCenter removeObserver:textFieldObserver];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
18
client/ios/utils.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* utils.h, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace iOS_utils
|
||||||
|
{
|
||||||
|
double screenScale();
|
||||||
|
|
||||||
|
void showLoadingIndicator();
|
||||||
|
void hideLoadingIndicator();
|
||||||
|
}
|
46
client/ios/utils.mm
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* utils.mm, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
UIActivityIndicatorView *indicator;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace iOS_utils
|
||||||
|
{
|
||||||
|
double screenScale()
|
||||||
|
{
|
||||||
|
return UIScreen.mainScreen.nativeScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void showLoadingIndicator()
|
||||||
|
{
|
||||||
|
NSCAssert(!indicator, @"activity indicator must be hidden before attempting to show it again");
|
||||||
|
indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
|
||||||
|
[indicator startAnimating];
|
||||||
|
|
||||||
|
auto mainView = UIApplication.sharedApplication.keyWindow.rootViewController.view;
|
||||||
|
mainView.userInteractionEnabled = NO;
|
||||||
|
[mainView addSubview:indicator];
|
||||||
|
indicator.center = {CGRectGetMidX(mainView.bounds), CGRectGetMidY(mainView.bounds)};
|
||||||
|
}
|
||||||
|
|
||||||
|
void hideLoadingIndicator()
|
||||||
|
{
|
||||||
|
indicator.superview.userInteractionEnabled = YES;
|
||||||
|
[indicator stopAnimating];
|
||||||
|
[indicator removeFromSuperview];
|
||||||
|
indicator = nil;
|
||||||
|
}
|
||||||
|
}
|
BIN
client/ios/vcmi_logo.png
Normal file
After Width: | Height: | Size: 16 KiB |
@ -10,8 +10,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../windows/CWindowObject.h"
|
#include "../windows/CWindowObject.h"
|
||||||
|
|
||||||
struct SDL_Surface;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CCampaignState;
|
class CCampaignState;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
struct SDL_Surface;
|
||||||
class CButton;
|
class CButton;
|
||||||
class CTextBox;
|
class CTextBox;
|
||||||
class CToggleGroup;
|
class CToggleGroup;
|
||||||
|
@ -11,10 +11,15 @@
|
|||||||
|
|
||||||
#include "CSelectionBase.h"
|
#include "CSelectionBase.h"
|
||||||
|
|
||||||
class CSelectionBase;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
struct StartInfo;
|
struct StartInfo;
|
||||||
class CMapInfo;
|
class CMapInfo;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CSelectionBase;
|
||||||
|
|
||||||
class CSavingScreen : public CSelectionBase
|
class CSavingScreen : public CSelectionBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -11,6 +11,14 @@
|
|||||||
|
|
||||||
#include "../mainmenu/CMainMenu.h"
|
#include "../mainmenu/CMainMenu.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
class CMapInfo;
|
||||||
|
struct StartInfo;
|
||||||
|
struct PlayerInfo;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CButton;
|
class CButton;
|
||||||
class CTextBox;
|
class CTextBox;
|
||||||
class CTextInput;
|
class CTextInput;
|
||||||
@ -21,9 +29,6 @@ class OptionsTab;
|
|||||||
class SelectionTab;
|
class SelectionTab;
|
||||||
class InfoCard;
|
class InfoCard;
|
||||||
class CChatBox;
|
class CChatBox;
|
||||||
class CMapInfo;
|
|
||||||
struct StartInfo;
|
|
||||||
struct PlayerInfo;
|
|
||||||
class CLabel;
|
class CLabel;
|
||||||
class CFlagBox;
|
class CFlagBox;
|
||||||
class CLabelGroup;
|
class CLabelGroup;
|
||||||
|
@ -14,7 +14,12 @@
|
|||||||
#include "../../lib/FunctionList.h"
|
#include "../../lib/FunctionList.h"
|
||||||
#include "../../lib/GameConstants.h"
|
#include "../../lib/GameConstants.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CMapGenOptions;
|
class CMapGenOptions;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CToggleButton;
|
class CToggleButton;
|
||||||
class CLabel;
|
class CLabel;
|
||||||
class CLabelGroup;
|
class CLabelGroup;
|
||||||
|
@ -129,7 +129,7 @@ static ESortBy getSortBySelectionScreen(ESelectionScreen Type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SelectionTab::SelectionTab(ESelectionScreen Type)
|
SelectionTab::SelectionTab(ESelectionScreen Type)
|
||||||
: CIntObject(LCLICK | WHEEL | KEYBOARD | DOUBLECLICK), callOnSelect(nullptr), tabType(Type), selectionPos(0), sortModeAscending(true)
|
: CIntObject(LCLICK | WHEEL | KEYBOARD | DOUBLECLICK), callOnSelect(nullptr), tabType(Type), selectionPos(0), sortModeAscending(true), inputNameRect{32, 539, 350, 20}
|
||||||
{
|
{
|
||||||
OBJ_CONSTRUCTION;
|
OBJ_CONSTRUCTION;
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ SelectionTab::SelectionTab(ESelectionScreen Type)
|
|||||||
sortingBy = _format;
|
sortingBy = _format;
|
||||||
background = std::make_shared<CPicture>("SCSELBCK.bmp", 0, 6);
|
background = std::make_shared<CPicture>("SCSELBCK.bmp", 0, 6);
|
||||||
pos = background->pos;
|
pos = background->pos;
|
||||||
inputName = std::make_shared<CTextInput>(Rect(32, 539, 350, 20), Point(-32, -25), "GSSTRIP.bmp", 0);
|
inputName = std::make_shared<CTextInput>(inputNameRect, Point(-32, -25), "GSSTRIP.bmp", 0);
|
||||||
inputName->filters += CTextInput::filenameFilter;
|
inputName->filters += CTextInput::filenameFilter;
|
||||||
labelMapSizes = std::make_shared<CLabel>(87, 62, FONT_SMALL, EAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[510]);
|
labelMapSizes = std::make_shared<CLabel>(87, 62, FONT_SMALL, EAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[510]);
|
||||||
|
|
||||||
@ -273,6 +273,11 @@ void SelectionTab::clickLeft(tribool down, bool previousState)
|
|||||||
{
|
{
|
||||||
select(line);
|
select(line);
|
||||||
}
|
}
|
||||||
|
#ifdef VCMI_IOS
|
||||||
|
// focus input field if clicked inside it
|
||||||
|
else if(inputName && inputName->active && inputNameRect.isIn(GH.current->button.x, GH.current->button.y))
|
||||||
|
inputName->giveFocus();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +90,7 @@ private:
|
|||||||
std::shared_ptr<CLabel> labelTabTitle;
|
std::shared_ptr<CLabel> labelTabTitle;
|
||||||
std::shared_ptr<CLabel> labelMapSizes;
|
std::shared_ptr<CLabel> labelMapSizes;
|
||||||
ESelectionScreen tabType;
|
ESelectionScreen tabType;
|
||||||
|
Rect inputNameRect;
|
||||||
|
|
||||||
void parseMaps(const std::unordered_set<ResourceID> & files);
|
void parseMaps(const std::unordered_set<ResourceID> & files);
|
||||||
void parseSaves(const std::unordered_set<ResourceID> & files);
|
void parseSaves(const std::unordered_set<ResourceID> & files);
|
||||||
|
@ -11,11 +11,16 @@
|
|||||||
|
|
||||||
#include "../windows/CWindowObject.h"
|
#include "../windows/CWindowObject.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
class JsonNode;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CLabel;
|
class CLabel;
|
||||||
class CPicture;
|
class CPicture;
|
||||||
class CButton;
|
class CButton;
|
||||||
struct SDL_Surface;
|
struct SDL_Surface;
|
||||||
class JsonNode;
|
|
||||||
|
|
||||||
class CCampaignScreen : public CWindowObject
|
class CCampaignScreen : public CWindowObject
|
||||||
{
|
{
|
||||||
|
@ -428,7 +428,9 @@ CMultiPlayers::CMultiPlayers(const std::string & firstPlayer, ESelectionScreen S
|
|||||||
statusBar = CGStatusBar::create(std::make_shared<CPicture>(Rect(7, 381, 348, 18), 0)); //226, 472
|
statusBar = CGStatusBar::create(std::make_shared<CPicture>(Rect(7, 381, 348, 18), 0)); //226, 472
|
||||||
|
|
||||||
inputNames[0]->setText(firstPlayer, true);
|
inputNames[0]->setText(firstPlayer, true);
|
||||||
|
#ifndef VCMI_IOS
|
||||||
inputNames[0]->giveFocus();
|
inputNames[0]->giveFocus();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMultiPlayers::onChange(std::string newText)
|
void CMultiPlayers::onChange(std::string newText)
|
||||||
@ -490,6 +492,7 @@ void CSimpleJoinScreen::connectToServer()
|
|||||||
{
|
{
|
||||||
textTitle->setText("Connecting...");
|
textTitle->setText("Connecting...");
|
||||||
buttonOk->block(true);
|
buttonOk->block(true);
|
||||||
|
CSDL_Ext::stopTextInput();
|
||||||
|
|
||||||
boost::thread(&CSimpleJoinScreen::connectThread, this, inputAddress->text, boost::lexical_cast<ui16>(inputPort->text));
|
boost::thread(&CSimpleJoinScreen::connectThread, this, inputAddress->text, boost::lexical_cast<ui16>(inputPort->text));
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,12 @@
|
|||||||
#include "../windows/CWindowObject.h"
|
#include "../windows/CWindowObject.h"
|
||||||
#include "../../lib/JsonNode.h"
|
#include "../../lib/JsonNode.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CCampaignState;
|
class CCampaignState;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CTextInput;
|
class CTextInput;
|
||||||
class CGStatusBar;
|
class CGStatusBar;
|
||||||
class CTextBox;
|
class CTextBox;
|
||||||
|
@ -23,17 +23,22 @@
|
|||||||
#undef OUT
|
#undef OUT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CGObjectInstance;
|
class CGObjectInstance;
|
||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
class CGBoat;
|
class CGBoat;
|
||||||
class CMap;
|
class CMap;
|
||||||
struct TerrainTile;
|
struct TerrainTile;
|
||||||
|
class PlayerColor;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
struct SDL_Surface;
|
struct SDL_Surface;
|
||||||
struct SDL_Rect;
|
struct SDL_Rect;
|
||||||
class CAnimation;
|
class CAnimation;
|
||||||
class IImage;
|
class IImage;
|
||||||
class CFadeAnimation;
|
class CFadeAnimation;
|
||||||
class PlayerColor;
|
|
||||||
|
|
||||||
enum class EWorldViewIcon
|
enum class EWorldViewIcon
|
||||||
{
|
{
|
||||||
|
@ -13,21 +13,26 @@
|
|||||||
#include "../../lib/FunctionList.h"
|
#include "../../lib/FunctionList.h"
|
||||||
#include "Terrain.h"
|
#include "Terrain.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
class CArmedInstance;
|
class CArmedInstance;
|
||||||
class CAnimation;
|
|
||||||
class CAnimImage;
|
|
||||||
class CShowableAnim;
|
|
||||||
class CFilledTexture;
|
|
||||||
class CGGarrison;
|
class CGGarrison;
|
||||||
class CGObjectInstance;
|
class CGObjectInstance;
|
||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
class CGTownInstance;
|
class CGTownInstance;
|
||||||
class CButton;
|
|
||||||
struct Component;
|
struct Component;
|
||||||
class CComponent;
|
|
||||||
struct InfoAboutArmy;
|
struct InfoAboutArmy;
|
||||||
struct InfoAboutHero;
|
struct InfoAboutHero;
|
||||||
struct InfoAboutTown;
|
struct InfoAboutTown;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CAnimation;
|
||||||
|
class CAnimImage;
|
||||||
|
class CShowableAnim;
|
||||||
|
class CFilledTexture;
|
||||||
|
class CButton;
|
||||||
|
class CComponent;
|
||||||
class CHeroTooltip;
|
class CHeroTooltip;
|
||||||
class CTownTooltip;
|
class CTownTooltip;
|
||||||
class CTextBox;
|
class CTextBox;
|
||||||
|
@ -14,17 +14,21 @@
|
|||||||
|
|
||||||
#include "../../lib/FunctionList.h"
|
#include "../../lib/FunctionList.h"
|
||||||
|
|
||||||
struct SDL_Surface;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
struct Rect;
|
|
||||||
class CAnimImage;
|
|
||||||
class CLabel;
|
|
||||||
class CAnimation;
|
|
||||||
|
|
||||||
namespace config
|
namespace config
|
||||||
{
|
{
|
||||||
struct ButtonInfo;
|
struct ButtonInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
struct SDL_Surface;
|
||||||
|
struct Rect;
|
||||||
|
class CAnimImage;
|
||||||
|
class CLabel;
|
||||||
|
class CAnimation;
|
||||||
|
|
||||||
/// Typical Heroes 3 button which can be inactive or active and can
|
/// Typical Heroes 3 button which can be inactive or active and can
|
||||||
/// hold further information if you right-click it
|
/// hold further information if you right-click it
|
||||||
class CButton : public CKeyShortcut
|
class CButton : public CKeyShortcut
|
||||||
|
@ -11,12 +11,16 @@
|
|||||||
|
|
||||||
#include "MiscWidgets.h"
|
#include "MiscWidgets.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
struct ArtifactLocation;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CArtifactsOfHero;
|
class CArtifactsOfHero;
|
||||||
class CAnimImage;
|
class CAnimImage;
|
||||||
class CButton;
|
class CButton;
|
||||||
|
|
||||||
struct ArtifactLocation;
|
|
||||||
|
|
||||||
class CArtifactHolder
|
class CArtifactHolder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -11,7 +11,12 @@
|
|||||||
|
|
||||||
#include "../gui/CIntObject.h"
|
#include "../gui/CIntObject.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
struct Component;
|
struct Component;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CAnimImage;
|
class CAnimImage;
|
||||||
class CLabel;
|
class CLabel;
|
||||||
|
|
||||||
|
@ -11,13 +11,18 @@
|
|||||||
|
|
||||||
#include "../windows/CWindowObject.h"
|
#include "../windows/CWindowObject.h"
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
class CArmedInstance;
|
||||||
|
class CCreatureSet;
|
||||||
|
class CStackInstance;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
class CGarrisonInt;
|
class CGarrisonInt;
|
||||||
class CButton;
|
class CButton;
|
||||||
class CArmedInstance;
|
|
||||||
class CAnimImage;
|
class CAnimImage;
|
||||||
class CCreatureSet;
|
|
||||||
class CGarrisonSlot;
|
class CGarrisonSlot;
|
||||||
class CStackInstance;
|
|
||||||
class CLabel;
|
class CLabel;
|
||||||
|
|
||||||
/// A single garrison slot which holds one creature of a specific amount
|
/// A single garrison slot which holds one creature of a specific amount
|
||||||
|
@ -11,13 +11,18 @@
|
|||||||
|
|
||||||
#include "../gui/CIntObject.h"
|
#include "../gui/CIntObject.h"
|
||||||
|
|
||||||
class CLabel;
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
class CCreatureAnim;
|
|
||||||
class CComponent;
|
|
||||||
class CGGarrison;
|
class CGGarrison;
|
||||||
struct InfoAboutArmy;
|
struct InfoAboutArmy;
|
||||||
class CArmedInstance;
|
class CArmedInstance;
|
||||||
class IBonusBearer;
|
class IBonusBearer;
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
class CLabel;
|
||||||
|
class CCreatureAnim;
|
||||||
|
class CComponent;
|
||||||
class CAnimImage;
|
class CAnimImage;
|
||||||
|
|
||||||
/// Shows a text by moving the mouse cursor over the object
|
/// Shows a text by moving the mouse cursor over the object
|
||||||
|