mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Compare commits
44 Commits
experiment
...
v5.2.168
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b5f0758f4d | ||
![]() |
1e2ffe5d15 | ||
![]() |
c887769c0a | ||
![]() |
dc1ac1e094 | ||
![]() |
4b1ceeb642 | ||
![]() |
e5d92fbf43 | ||
![]() |
c323fea5bd | ||
![]() |
32f0fe9051 | ||
![]() |
be74d3efa6 | ||
![]() |
8969c9af8c | ||
![]() |
15cac278d6 | ||
![]() |
9e8a15547d | ||
![]() |
ed74a49aa3 | ||
![]() |
6ef5d0c326 | ||
![]() |
5f871e2643 | ||
![]() |
4f65fa0d82 | ||
![]() |
4d1d763bd9 | ||
![]() |
3286722b6a | ||
![]() |
656255a662 | ||
![]() |
ea7b7a778e | ||
![]() |
9b6de5affd | ||
![]() |
0c03659314 | ||
![]() |
6b08c0f033 | ||
![]() |
a1dcf03a5b | ||
![]() |
556d13c881 | ||
![]() |
0d6c42a9bf | ||
![]() |
690ce16ab4 | ||
![]() |
5f51a5e465 | ||
![]() |
b7521de138 | ||
![]() |
acea6fc595 | ||
![]() |
d8107fe3d5 | ||
![]() |
b40b95be99 | ||
![]() |
6644525dd0 | ||
![]() |
56e66d1c5a | ||
![]() |
90d8afb5a0 | ||
![]() |
d4db61a595 | ||
![]() |
90413b842d | ||
![]() |
43c788acbf | ||
![]() |
ee22b2e4b1 | ||
![]() |
007d56e946 | ||
![]() |
577c4adb14 | ||
![]() |
7f17720ff3 | ||
![]() |
288db1c941 | ||
![]() |
2496fc3eef |
@@ -15,7 +15,7 @@ jobs:
|
||||
# Build the **entire** app for macOS.
|
||||
build-macos:
|
||||
macos:
|
||||
xcode: 12.5.1
|
||||
xcode: 14.2.0
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
@@ -64,11 +64,11 @@ jobs:
|
||||
# Note: Code signing is done using CSC_LINK (see https://www.electron.build/code-signing).
|
||||
- run:
|
||||
name: Build GDevelop IDE
|
||||
command: export NODE_OPTIONS="--max-old-space-size=7168" && cd newIDE/electron-app && npm run build -- --mac --publish=never
|
||||
command: export NODE_OPTIONS="--max-old-space-size=7168" && cd newIDE/electron-app && CI=false npm run build -- --mac --publish=never
|
||||
|
||||
- run:
|
||||
name: Clean dist folder to keep only installers/binaries.
|
||||
command: rm -rf "newIDE/electron-app/dist/mac/GDevelop 5.app" && rm -rf "newIDE/electron-app/dist/mac-arm64/GDevelop 5.app"
|
||||
command: rm -rf "newIDE/electron-app/dist/mac-universal/GDevelop 5.app"
|
||||
|
||||
# Upload artifacts (CircleCI)
|
||||
- store_artifacts:
|
||||
@@ -101,8 +101,8 @@ jobs:
|
||||
command: sudo apt-get update && sudo apt install cmake
|
||||
|
||||
- run:
|
||||
name: Install Python3 dependencies for Emscripten
|
||||
command: sudo apt install python-is-python3 python3-distutils -y
|
||||
name: Install Python3 dependencies for Emscripten
|
||||
command: sudo apt install python-is-python3 python3-distutils -y
|
||||
|
||||
- run:
|
||||
name: Install Emscripten (for GDevelop.js)
|
||||
@@ -178,8 +178,8 @@ jobs:
|
||||
command: sudo apt-get update && sudo apt install cmake
|
||||
|
||||
- run:
|
||||
name: Install Python3 dependencies for Emscripten
|
||||
command: sudo apt install python-is-python3 python3-distutils -y
|
||||
name: Install Python3 dependencies for Emscripten
|
||||
command: sudo apt install python-is-python3 python3-distutils -y
|
||||
|
||||
- run:
|
||||
name: Install Emscripten (for GDevelop.js)
|
||||
|
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -127,7 +127,5 @@
|
||||
"flow.useNPMPackagedFlow": true,
|
||||
|
||||
// Clang format styling (duplicated in scripts/CMakeClangUtils.txt)
|
||||
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, BinPackParameters: false, BinPackArguments: false}",
|
||||
"prettier.prettierPath": "./GDJS/node_modules/prettier",
|
||||
"prettier.configPath": "./GDJS/.prettierrc"
|
||||
"C_Cpp.clang_format_style": "{BasedOnStyle: Google, BinPackParameters: false, BinPackArguments: false}"
|
||||
}
|
||||
|
123
CMakeLists.txt
123
CMakeLists.txt
@@ -1,100 +1,99 @@
|
||||
#This is the CMake file used to build GDevelop.
|
||||
#For more information, see the README.md file.
|
||||
# This is the CMake file used to build GDevelop.
|
||||
# For more information, see the README.md file.
|
||||
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0011 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
# Add utility functions
|
||||
include(scripts/CMakeClangUtils.txt) # To add clang-format and clang-tidy support to a target
|
||||
|
||||
# Macro for defining an option
|
||||
macro(gd_set_option var default type docstring)
|
||||
if(NOT DEFINED ${var})
|
||||
set(${var} ${default})
|
||||
endif()
|
||||
set(${var} ${${var}} CACHE ${type} ${docstring} FORCE)
|
||||
if(NOT DEFINED ${var})
|
||||
set(${var} ${default})
|
||||
endif()
|
||||
set(${var} ${${var}} CACHE ${type} ${docstring} FORCE)
|
||||
endmacro()
|
||||
|
||||
# Set options
|
||||
gd_set_option(BUILD_CORE TRUE BOOL "TRUE to build GDevelop Core library")
|
||||
gd_set_option(BUILD_GDJS TRUE BOOL "TRUE to build GDevelop JS Platform")
|
||||
gd_set_option(BUILD_EXTENSIONS TRUE BOOL "TRUE to build the extensions")
|
||||
gd_set_option(BUILD_TESTS TRUE BOOL "TRUE to build the tests")
|
||||
|
||||
# Disable deprecated code
|
||||
set(NO_GUI TRUE CACHE BOOL "" FORCE) #Force disable old GUI related code.
|
||||
set(NO_GUI TRUE CACHE BOOL "" FORCE) # Force disable old GUI related code.
|
||||
|
||||
#Setting up installation directory, for Linux (has to be done before "project" command).
|
||||
IF(NOT WIN32)
|
||||
if (NOT APPLE)
|
||||
gd_set_option(GD_INSTALL_PREFIX "/opt/gdevelop/" STRING "The directory where GDevelop should be installed")
|
||||
ELSE()
|
||||
gd_set_option(GD_INSTALL_PREFIX "." STRING "The directory where GDevelop should be installed")
|
||||
ENDIF()
|
||||
# Setting up installation directory, for Linux (has to be done before "project" command).
|
||||
if(NOT WIN32)
|
||||
if(NOT APPLE)
|
||||
gd_set_option(GD_INSTALL_PREFIX "/opt/gdevelop/" STRING "The directory where GDevelop should be installed")
|
||||
else()
|
||||
gd_set_option(GD_INSTALL_PREFIX "." STRING "The directory where GDevelop should be installed")
|
||||
endif()
|
||||
|
||||
#As we embed SFML, prevent it to be installed system-wide
|
||||
# As we embed SFML, prevent it to be installed system-wide
|
||||
set(CMAKE_INSTALL_PREFIX "${GD_INSTALL_PREFIX}/useless")
|
||||
ENDIF()
|
||||
endif()
|
||||
|
||||
project(GDevelop)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
IF(NOT WIN32 AND NOT APPLE AND NOT BUILD_TESTS)
|
||||
SET(CMAKE_SKIP_BUILD_RPATH TRUE) #Avoid errors when packaging for linux.
|
||||
ENDIF()
|
||||
IF(APPLE)
|
||||
if(NOT WIN32 AND NOT APPLE AND NOT BUILD_TESTS)
|
||||
set(CMAKE_SKIP_BUILD_RPATH TRUE) # Avoid errors when packaging for linux.
|
||||
endif()
|
||||
if(APPLE)
|
||||
set(CMAKE_MACOSX_RPATH 1)
|
||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
|
||||
set(CMAKE_INSTALL_RPATH ".")
|
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-potentially-evaluated-expression")
|
||||
ENDIF()
|
||||
#Sanity checks
|
||||
IF ("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
message( "CMAKE_BUILD_TYPE is empty, assuming build type is Release" )
|
||||
add_compile_options(
|
||||
-D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_
|
||||
-Wno-potentially-evaluated-expression)
|
||||
endif()
|
||||
# Sanity checks
|
||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
message(STATUS "CMAKE_BUILD_TYPE is empty, assuming build type is Release")
|
||||
set(CMAKE_BUILD_TYPE Release)
|
||||
ENDIF()
|
||||
endif()
|
||||
|
||||
IF("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT WIN32 AND CMAKE_COMPILER_IS_GNUCXX)
|
||||
SET(CMAKE_SHARED_LINKER_FLAGS "-s") #Force stripping to avoid errors when packaging for linux.
|
||||
ENDIF()
|
||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT WIN32 AND CMAKE_COMPILER_IS_GNUCXX)
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "-s") # Force stripping to avoid errors when packaging for linux.
|
||||
endif()
|
||||
|
||||
#Activate C++11
|
||||
include(CheckCXXCompilerFlag)
|
||||
CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_CXX11)
|
||||
CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" COMPILER_SUPPORTS_CXX0X)
|
||||
if(COMPILER_SUPPORTS_CXX11)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
|
||||
elseif(COMPILER_SUPPORTS_CXX0X)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
|
||||
else()
|
||||
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support (with GNU extensions). Please use a different C++ compiler.")
|
||||
endif()
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Mark some warnings as errors
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
# Activate as much warnings as possible to avoid errors like
|
||||
# uninitialized variables or other hard to debug bugs.
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reorder-ctor -Wno-reorder -Wno-pessimizing-move -Wno-unused-variable -Wno-unused-private-field")
|
||||
add_compile_options(
|
||||
-Wall
|
||||
-Wno-unknown-warning-option
|
||||
-Wno-reorder-ctor
|
||||
-Wno-reorder
|
||||
-Wno-pessimizing-move
|
||||
-Wno-unused-variable
|
||||
-Wno-unused-private-field
|
||||
|
||||
# Make as much warnings considered as errors as possible (only one for now).
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=return-stack-address")
|
||||
# Make as much warnings considered as errors as possible (only one for now).
|
||||
-Werror=return-stack-address)
|
||||
endif()
|
||||
|
||||
#Define common directories:
|
||||
# Define common directories:
|
||||
set(GD_base_dir ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
#Add all the CMakeLists:
|
||||
ADD_SUBDIRECTORY(ExtLibs)
|
||||
IF(BUILD_CORE)
|
||||
ADD_SUBDIRECTORY(Core)
|
||||
ENDIF()
|
||||
IF(BUILD_GDJS)
|
||||
ADD_SUBDIRECTORY(GDJS)
|
||||
ENDIF()
|
||||
IF(EMSCRIPTEN)
|
||||
ADD_SUBDIRECTORY(GDevelop.js)
|
||||
ENDIF()
|
||||
IF(BUILD_EXTENSIONS)
|
||||
ADD_SUBDIRECTORY(Extensions)
|
||||
ENDIF()
|
||||
# Add all the CMakeLists:
|
||||
add_subdirectory(ExtLibs)
|
||||
if(BUILD_CORE)
|
||||
add_subdirectory(Core)
|
||||
endif()
|
||||
if(BUILD_GDJS)
|
||||
add_subdirectory(GDJS)
|
||||
endif()
|
||||
if(EMSCRIPTEN)
|
||||
add_subdirectory(GDevelop.js)
|
||||
endif()
|
||||
if(BUILD_EXTENSIONS)
|
||||
add_subdirectory(Extensions)
|
||||
endif()
|
||||
|
@@ -1,83 +1,98 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(GDCore)
|
||||
|
||||
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1) #Force use response file: useful for Ninja build system on Windows.
|
||||
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
|
||||
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES 1)
|
||||
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 1)
|
||||
set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1) # Force use response file: useful for Ninja build system on Windows.
|
||||
set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
|
||||
set(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES 1)
|
||||
set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 1)
|
||||
|
||||
#Define common directories:
|
||||
# Define common directories:
|
||||
set(GDCORE_include_dir ${GD_base_dir}/Core PARENT_SCOPE)
|
||||
set(GDCORE_lib_dir ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME} PARENT_SCOPE)
|
||||
|
||||
#Dependencies on external libraries:
|
||||
###
|
||||
# Dependencies on external libraries:
|
||||
#
|
||||
|
||||
#Defines
|
||||
###
|
||||
add_definitions( -DGD_IDE_ONLY )
|
||||
IF (EMSCRIPTEN)
|
||||
add_definitions( -DEMSCRIPTEN )
|
||||
ENDIF()
|
||||
IF(CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||
add_definitions( -DDEBUG )
|
||||
ELSE()
|
||||
add_definitions( -DRELEASE )
|
||||
ENDIF()
|
||||
# Defines
|
||||
#
|
||||
add_definitions(-DGD_IDE_ONLY)
|
||||
if(EMSCRIPTEN)
|
||||
add_definitions(-DEMSCRIPTEN)
|
||||
endif()
|
||||
if("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
|
||||
add_definitions(-DDEBUG)
|
||||
else()
|
||||
add_definitions(-DRELEASE)
|
||||
endif()
|
||||
|
||||
IF(WIN32)
|
||||
add_definitions( -DWINDOWS )
|
||||
add_definitions( "-DGD_CORE_API=__declspec(dllexport)" )
|
||||
add_definitions( -D__GNUWIN32__ )
|
||||
ELSE()
|
||||
IF(APPLE)
|
||||
add_definitions( -DMACOS )
|
||||
ELSE()
|
||||
add_definitions( -DLINUX )
|
||||
ENDIF()
|
||||
add_definitions( -DGD_API= )
|
||||
add_definitions( -DGD_CORE_API= )
|
||||
ENDIF(WIN32)
|
||||
if(WIN32)
|
||||
add_definitions(-DWINDOWS)
|
||||
add_definitions("-DGD_CORE_API=__declspec(dllexport)")
|
||||
add_definitions(-D__GNUWIN32__)
|
||||
else()
|
||||
if(APPLE)
|
||||
add_definitions(-DMACOS)
|
||||
else()
|
||||
add_definitions(-DLINUX)
|
||||
endif()
|
||||
add_definitions(-DGD_API=)
|
||||
add_definitions(-DGD_CORE_API=)
|
||||
endif()
|
||||
|
||||
#The target
|
||||
###
|
||||
# The target
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB_RECURSE source_files GDCore/*)
|
||||
file(
|
||||
GLOB_RECURSE
|
||||
source_files
|
||||
GDCore/*)
|
||||
|
||||
file(GLOB_RECURSE formatted_source_files tests/* GDCore/Events/* GDCore/Extensions/* GDCore/IDE/* GDCore/Project/* GDCore/Serialization/* GDCore/Tools/*)
|
||||
list(REMOVE_ITEM formatted_source_files "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.h" "${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs_dialogs_bitmaps.cpp")
|
||||
file(
|
||||
GLOB_RECURSE
|
||||
formatted_source_files
|
||||
tests/*
|
||||
GDCore/Events/*
|
||||
GDCore/Extensions/*
|
||||
GDCore/IDE/*
|
||||
GDCore/Project/*
|
||||
GDCore/Serialization/*
|
||||
GDCore/Tools/*)
|
||||
list(
|
||||
REMOVE_ITEM
|
||||
formatted_source_files
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/GDCore/IDE/Dialogs/GDCoreDialogs_dialogs_bitmaps.cpp")
|
||||
gd_add_clang_utils(GDCore "${formatted_source_files}")
|
||||
|
||||
IF(EMSCRIPTEN)
|
||||
if(EMSCRIPTEN)
|
||||
# Emscripten treats all libraries as static libraries
|
||||
add_library(GDCore STATIC ${source_files})
|
||||
ELSE()
|
||||
else()
|
||||
add_library(GDCore SHARED ${source_files})
|
||||
ENDIF()
|
||||
IF(EMSCRIPTEN)
|
||||
endif()
|
||||
if(EMSCRIPTEN)
|
||||
set_target_properties(GDCore PROPERTIES SUFFIX ".bc")
|
||||
ELSEIF(WIN32)
|
||||
elseif(WIN32)
|
||||
set_target_properties(GDCore PROPERTIES PREFIX "")
|
||||
ELSE()
|
||||
else()
|
||||
set_target_properties(GDCore PROPERTIES PREFIX "lib")
|
||||
ENDIF()
|
||||
endif()
|
||||
set(LIBRARY_OUTPUT_PATH ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME})
|
||||
set(ARCHIVE_OUTPUT_PATH ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME})
|
||||
set(RUNTIME_OUTPUT_PATH ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME})
|
||||
|
||||
#Tests
|
||||
###
|
||||
# Tests
|
||||
#
|
||||
if(BUILD_TESTS)
|
||||
file(
|
||||
GLOB_RECURSE
|
||||
test_source_files
|
||||
tests/*
|
||||
)
|
||||
GLOB_RECURSE
|
||||
test_source_files
|
||||
tests/*)
|
||||
|
||||
add_executable(GDCore_tests ${test_source_files})
|
||||
set_target_properties(GDCore_tests PROPERTIES BUILD_WITH_INSTALL_RPATH FALSE) #Allow finding dependencies directly from build path on Mac OS X.
|
||||
set_target_properties(GDCore_tests PROPERTIES BUILD_WITH_INSTALL_RPATH FALSE) # Allow finding dependencies directly from build path on Mac OS X.
|
||||
target_link_libraries(GDCore_tests GDCore)
|
||||
target_link_libraries(GDCore_tests ${CMAKE_DL_LIBS})
|
||||
endif()
|
||||
|
@@ -15,7 +15,7 @@ using namespace std;
|
||||
namespace gd {
|
||||
|
||||
ForEachEvent::ForEachEvent()
|
||||
: BaseEvent(), objectsToPick(""), objectsToPickSelected(false) {}
|
||||
: BaseEvent(), objectsToPick("") {}
|
||||
|
||||
vector<gd::InstructionsList*> ForEachEvent::GetAllConditionsVectors() {
|
||||
vector<gd::InstructionsList*> allConditions;
|
||||
|
@@ -6,6 +6,8 @@
|
||||
|
||||
#ifndef FOREACHEVENT_H
|
||||
#define FOREACHEVENT_H
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/Events/Event.h"
|
||||
#include "GDCore/Events/EventsList.h"
|
||||
namespace gd {
|
||||
@@ -62,13 +64,17 @@ class GD_CORE_API ForEachEvent : public gd::BaseEvent {
|
||||
virtual void UnserializeFrom(gd::Project& project,
|
||||
const SerializerElement& element);
|
||||
|
||||
std::vector<gd::Expression*> GetAllObjectExpressions() {
|
||||
std::vector<gd::Expression*> allObjectExpressions;
|
||||
allObjectExpressions.push_back(&objectsToPick);
|
||||
return allObjectExpressions;
|
||||
}
|
||||
|
||||
private:
|
||||
gd::Expression objectsToPick;
|
||||
gd::InstructionsList conditions;
|
||||
gd::InstructionsList actions;
|
||||
gd::EventsList events;
|
||||
|
||||
bool objectsToPickSelected;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -267,11 +267,11 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
|
||||
return "/* Unknown instruction - skipped. */";
|
||||
}
|
||||
|
||||
AddIncludeFiles(instrInfos.codeExtraInformation.GetIncludeFiles());
|
||||
AddIncludeFiles(instrInfos.GetIncludeFiles());
|
||||
maxConditionsListsSize =
|
||||
std::max(maxConditionsListsSize, condition.GetSubInstructions().size());
|
||||
|
||||
if (instrInfos.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
if (instrInfos.HasCustomCodeGenerator()) {
|
||||
context.EnterCustomCondition();
|
||||
conditionCode += instrInfos.codeExtraInformation.customCodeGenerator(
|
||||
condition, *this, context);
|
||||
@@ -459,9 +459,9 @@ gd::String EventsCodeGenerator::GenerateActionCode(
|
||||
return "/* Unknown instruction - skipped. */";
|
||||
}
|
||||
|
||||
AddIncludeFiles(instrInfos.codeExtraInformation.GetIncludeFiles());
|
||||
AddIncludeFiles(instrInfos.GetIncludeFiles());
|
||||
|
||||
if (instrInfos.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
if (instrInfos.HasCustomCodeGenerator()) {
|
||||
return instrInfos.codeExtraInformation.customCodeGenerator(
|
||||
action, *this, context);
|
||||
}
|
||||
|
@@ -216,10 +216,10 @@ gd::String ExpressionCodeGenerator::GenerateFreeFunctionCode(
|
||||
const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
|
||||
const ExpressionMetadata& expressionMetadata) {
|
||||
codeGenerator.AddIncludeFiles(
|
||||
expressionMetadata.codeExtraInformation.GetIncludeFiles());
|
||||
expressionMetadata.GetIncludeFiles());
|
||||
|
||||
// Launch custom code generator if needed
|
||||
if (expressionMetadata.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
if (expressionMetadata.HasCustomCodeGenerator()) {
|
||||
return expressionMetadata.codeExtraInformation.customCodeGenerator(
|
||||
PrintParameters(parameters), codeGenerator, context);
|
||||
}
|
||||
@@ -242,10 +242,10 @@ gd::String ExpressionCodeGenerator::GenerateObjectFunctionCode(
|
||||
codeGenerator.GetObjectsAndGroups();
|
||||
|
||||
codeGenerator.AddIncludeFiles(
|
||||
expressionMetadata.codeExtraInformation.GetIncludeFiles());
|
||||
expressionMetadata.GetIncludeFiles());
|
||||
|
||||
// Launch custom code generator if needed
|
||||
if (expressionMetadata.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
if (expressionMetadata.HasCustomCodeGenerator()) {
|
||||
return expressionMetadata.codeExtraInformation.customCodeGenerator(
|
||||
PrintParameters(parameters), codeGenerator, context);
|
||||
}
|
||||
@@ -300,10 +300,10 @@ gd::String ExpressionCodeGenerator::GenerateBehaviorFunctionCode(
|
||||
codeGenerator.GetObjectsAndGroups();
|
||||
|
||||
codeGenerator.AddIncludeFiles(
|
||||
expressionMetadata.codeExtraInformation.GetIncludeFiles());
|
||||
expressionMetadata.GetIncludeFiles());
|
||||
|
||||
// Launch custom code generator if needed
|
||||
if (expressionMetadata.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
if (expressionMetadata.HasCustomCodeGenerator()) {
|
||||
return expressionMetadata.codeExtraInformation.customCodeGenerator(
|
||||
PrintParameters(parameters), codeGenerator, context);
|
||||
}
|
||||
|
@@ -282,6 +282,14 @@ class GD_CORE_API BaseEvent {
|
||||
*/
|
||||
bool IsFolded() const { return folded; }
|
||||
|
||||
/**
|
||||
* \brief Return a list of all objects linked to the event.
|
||||
*/
|
||||
virtual std::vector<gd::Expression*> GetAllObjectExpressions() {
|
||||
std::vector<gd::Expression*> allObjectExpressions;
|
||||
return allObjectExpressions;
|
||||
}
|
||||
|
||||
///@}
|
||||
|
||||
std::weak_ptr<gd::BaseEvent>
|
||||
|
@@ -17,7 +17,7 @@ const gd::String& EventsCodeNameMangler::GetMangledObjectsListName(
|
||||
return it->second;
|
||||
}
|
||||
|
||||
gd::String partiallyMangledName = originalObjectName;
|
||||
gd::String partiallyMangledName = GetMangledNameWithForbiddenUnderscore(originalObjectName);
|
||||
static const gd::String allowedCharacters =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
|
||||
@@ -43,7 +43,15 @@ const gd::String& EventsCodeNameMangler::GetExternalEventsFunctionMangledName(
|
||||
return it->second;
|
||||
}
|
||||
|
||||
gd::String partiallyMangledName = externalEventsName;
|
||||
gd::String partiallyMangledName = GetMangledNameWithForbiddenUnderscore(externalEventsName);
|
||||
|
||||
mangledExternalEventsNames[externalEventsName] = "GDExternalEvents" + partiallyMangledName;
|
||||
return mangledExternalEventsNames[externalEventsName];
|
||||
}
|
||||
|
||||
gd::String EventsCodeNameMangler::GetMangledNameWithForbiddenUnderscore(
|
||||
const gd::String &name) {
|
||||
gd::String partiallyMangledName = name;
|
||||
static const gd::String allowedCharacters =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
|
||||
@@ -57,11 +65,30 @@ const gd::String& EventsCodeNameMangler::GetExternalEventsFunctionMangledName(
|
||||
partiallyMangledName.replace(i, 1, "_" + gd::String::From(unallowedChar));
|
||||
}
|
||||
}
|
||||
|
||||
mangledExternalEventsNames[externalEventsName] = "GDExternalEvents" + partiallyMangledName;
|
||||
return mangledExternalEventsNames[externalEventsName];
|
||||
return partiallyMangledName;
|
||||
}
|
||||
|
||||
gd::String EventsCodeNameMangler::GetMangledName(
|
||||
const gd::String &name) {
|
||||
gd::String partiallyMangledName = name;
|
||||
static const gd::String allowedCharacters =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
|
||||
|
||||
for (size_t i = 0; i < partiallyMangledName.size();
|
||||
++i) // Replace all unallowed letter by an underscore and the ascii
|
||||
// number of the letter
|
||||
{
|
||||
if (allowedCharacters.find_first_of(
|
||||
std::u32string(1, partiallyMangledName[i])) == gd::String::npos) {
|
||||
char32_t unallowedChar = partiallyMangledName[i];
|
||||
partiallyMangledName.replace(i, 1, "_" + gd::String::From(unallowedChar));
|
||||
}
|
||||
}
|
||||
return partiallyMangledName;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const gd::String& ManObjListName(const gd::String &objectName) {
|
||||
return EventsCodeNameMangler::Get()->GetMangledObjectsListName(objectName);
|
||||
}
|
||||
|
@@ -36,6 +36,8 @@ class GD_CORE_API EventsCodeNameMangler {
|
||||
const gd::String &GetExternalEventsFunctionMangledName(
|
||||
const gd::String &externalEventsName);
|
||||
|
||||
static gd::String GetMangledName(const gd::String &name);
|
||||
|
||||
static EventsCodeNameMangler *Get();
|
||||
static void DestroySingleton();
|
||||
|
||||
@@ -44,6 +46,9 @@ class GD_CORE_API EventsCodeNameMangler {
|
||||
virtual ~EventsCodeNameMangler(){};
|
||||
static EventsCodeNameMangler *_singleton;
|
||||
|
||||
// This method is inlined to avoid to copy the returned string.
|
||||
static inline gd::String GetMangledNameWithForbiddenUnderscore(const gd::String &name);
|
||||
|
||||
std::unordered_map<gd::String, gd::String>
|
||||
mangledObjectNames; ///< Memoized results of mangling for objects
|
||||
std::unordered_map<gd::String, gd::String>
|
||||
|
@@ -110,11 +110,11 @@ void Direction::UnserializeFrom(const gd::SerializerElement& element) {
|
||||
.GetBoolAttribute("automatic", true));
|
||||
|
||||
if (spriteElement.HasChild("CustomCollisionMask"))
|
||||
sprite.SetCollisionMaskAutomatic(
|
||||
sprite.SetFullImageCollisionMask(
|
||||
!spriteElement.GetChild("CustomCollisionMask")
|
||||
.GetBoolAttribute("custom", false));
|
||||
else
|
||||
sprite.SetCollisionMaskAutomatic(
|
||||
sprite.SetFullImageCollisionMask(
|
||||
!spriteElement.GetBoolAttribute("hasCustomCollisionMask", false));
|
||||
|
||||
std::vector<Polygon2d> mask;
|
||||
@@ -173,7 +173,7 @@ void SaveSpritesDirection(const vector<Sprite>& sprites,
|
||||
.SetAttribute("automatic", sprites[i].IsDefaultCenterPoint());
|
||||
|
||||
spriteElement.SetAttribute("hasCustomCollisionMask",
|
||||
!sprites[i].IsCollisionMaskAutomatic());
|
||||
!sprites[i].IsFullImageCollisionMask());
|
||||
|
||||
gd::SerializerElement& collisionMaskElement =
|
||||
spriteElement.AddChild("customCollisionMask");
|
||||
|
@@ -4,7 +4,9 @@
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "GDCore/Extensions/Builtin/SpriteExtension/Sprite.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "GDCore/Extensions/Builtin/SpriteExtension/Polygon2d.h"
|
||||
|
||||
using namespace std;
|
||||
@@ -14,11 +16,10 @@ namespace gd {
|
||||
Point Sprite::badPoint("");
|
||||
|
||||
Sprite::Sprite()
|
||||
: automaticCollisionMask(true),
|
||||
: fullImageCollisionMask(false),
|
||||
origine("origine"),
|
||||
centre("centre"),
|
||||
automaticCentre(true) {
|
||||
}
|
||||
automaticCentre(true) {}
|
||||
|
||||
Sprite::~Sprite(){};
|
||||
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#ifndef SPRITE_H
|
||||
#define SPRITE_H
|
||||
#include <memory>
|
||||
|
||||
#include "GDCore/Extensions/Builtin/SpriteExtension/Point.h"
|
||||
#include "GDCore/Extensions/Builtin/SpriteExtension/Polygon2d.h"
|
||||
#include "GDCore/String.h"
|
||||
@@ -43,7 +44,7 @@ class GD_CORE_API Sprite {
|
||||
|
||||
/**
|
||||
* \brief Get the collision mask (custom or automatically generated owing to
|
||||
* IsCollisionMaskAutomatic())
|
||||
* IsFullImageCollisionMask())
|
||||
*
|
||||
* \warning If the image has not been loaded ( using LoadImage ) and the
|
||||
* collision mask is set as automatic, the returned mask won't be correct.
|
||||
@@ -66,7 +67,7 @@ class GD_CORE_API Sprite {
|
||||
|
||||
/**
|
||||
* \brief Set the custom collision mask.
|
||||
* Call then `SetCollisionMaskAutomatic(false)` to use it.
|
||||
* Call then `SetFullImageCollisionMask(false)` to use it.
|
||||
*/
|
||||
void SetCustomCollisionMask(const std::vector<Polygon2d>& collisionMask);
|
||||
|
||||
@@ -74,15 +75,15 @@ class GD_CORE_API Sprite {
|
||||
* \brief Return true if the collision mask is a bounding box, false if a
|
||||
* custom collision mask is used.
|
||||
*/
|
||||
inline bool IsCollisionMaskAutomatic() const {
|
||||
return automaticCollisionMask;
|
||||
inline bool IsFullImageCollisionMask() const {
|
||||
return fullImageCollisionMask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Un/set use of the custom collision mask.
|
||||
*/
|
||||
inline void SetCollisionMaskAutomatic(bool enabled) {
|
||||
automaticCollisionMask = enabled;
|
||||
inline void SetFullImageCollisionMask(bool enabled) {
|
||||
fullImageCollisionMask = enabled;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -161,9 +162,9 @@ class GD_CORE_API Sprite {
|
||||
private:
|
||||
gd::String image; ///< Name of the image to be loaded in Image Manager.
|
||||
|
||||
bool automaticCollisionMask; ///< True to use the custom collision mask.
|
||||
///< Otherwise, a basic bounding box is returned
|
||||
///< by GetCollisionMask()
|
||||
bool fullImageCollisionMask; ///< True to use a bounding box wrapping the
|
||||
///< whole image as collision mask. If false,
|
||||
///< custom collision mask is used.
|
||||
std::vector<Polygon2d> customCollisionMask; ///< Custom collision mask
|
||||
|
||||
std::vector<Point> points; ///< List of the points used by the sprite
|
||||
|
@@ -25,13 +25,16 @@ namespace gd {
|
||||
|
||||
Animation SpriteObject::badAnimation;
|
||||
|
||||
SpriteObject::SpriteObject() : updateIfNotVisible(false) {}
|
||||
SpriteObject::SpriteObject()
|
||||
: updateIfNotVisible(false), adaptCollisionMaskAutomatically(true) {}
|
||||
|
||||
SpriteObject::~SpriteObject(){};
|
||||
|
||||
void SpriteObject::DoUnserializeFrom(gd::Project& project,
|
||||
const gd::SerializerElement& element) {
|
||||
updateIfNotVisible = element.GetBoolAttribute("updateIfNotVisible", true);
|
||||
adaptCollisionMaskAutomatically =
|
||||
element.GetBoolAttribute("adaptCollisionMaskAutomatically", false);
|
||||
|
||||
RemoveAllAnimations();
|
||||
const gd::SerializerElement& animationsElement =
|
||||
@@ -80,6 +83,8 @@ void SpriteObject::DoUnserializeFrom(gd::Project& project,
|
||||
|
||||
void SpriteObject::DoSerializeTo(gd::SerializerElement& element) const {
|
||||
element.SetAttribute("updateIfNotVisible", updateIfNotVisible);
|
||||
element.SetAttribute("adaptCollisionMaskAutomatically",
|
||||
adaptCollisionMaskAutomatically);
|
||||
|
||||
// Animations
|
||||
gd::SerializerElement& animationsElement = element.AddChild("animations");
|
||||
|
@@ -47,8 +47,7 @@ class GD_CORE_API SpriteObject : public gd::ObjectConfiguration {
|
||||
void ExposeResources(gd::ArbitraryResourceWorker& worker) override;
|
||||
|
||||
std::map<gd::String, gd::PropertyDescriptor> GetProperties() const override;
|
||||
bool UpdateProperty(const gd::String& name,
|
||||
const gd::String& value) override;
|
||||
bool UpdateProperty(const gd::String& name, const gd::String& value) override;
|
||||
|
||||
std::map<gd::String, gd::PropertyDescriptor> GetInitialInstanceProperties(
|
||||
const gd::InitialInstance& position,
|
||||
@@ -118,14 +117,30 @@ class GD_CORE_API SpriteObject : public gd::ObjectConfiguration {
|
||||
const std::vector<Animation>& GetAllAnimations() const { return animations; }
|
||||
|
||||
/**
|
||||
* \brief Set if the object animation should be played even if the object is hidden
|
||||
* or far from the camera.
|
||||
* @brief Check if the collision mask adapts automatically to the animation.
|
||||
*/
|
||||
void SetUpdateIfNotVisible(bool updateIfNotVisible_) { updateIfNotVisible = updateIfNotVisible_; }
|
||||
bool AdaptCollisionMaskAutomatically() const {
|
||||
return adaptCollisionMaskAutomatically;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Check if the object animation should be played even if the object is hidden
|
||||
* or far from the camera (false by default).
|
||||
* @brief Set if the collision mask adapts automatically to the animation.
|
||||
*/
|
||||
void SetAdaptCollisionMaskAutomatically(bool enable) {
|
||||
adaptCollisionMaskAutomatically = enable;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set if the object animation should be played even if the object is
|
||||
* hidden or far from the camera.
|
||||
*/
|
||||
void SetUpdateIfNotVisible(bool updateIfNotVisible_) {
|
||||
updateIfNotVisible = updateIfNotVisible_;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Check if the object animation should be played even if the object
|
||||
* is hidden or far from the camera (false by default).
|
||||
*/
|
||||
bool GetUpdateIfNotVisible() const { return updateIfNotVisible; }
|
||||
///@}
|
||||
@@ -137,11 +152,15 @@ class GD_CORE_API SpriteObject : public gd::ObjectConfiguration {
|
||||
|
||||
mutable std::vector<Animation> animations;
|
||||
bool updateIfNotVisible; ///< If set to true, ask the game engine to play
|
||||
///< object animation even if hidden or far from the
|
||||
///< screen.
|
||||
///< object animation even if hidden or far from
|
||||
///< the screen.
|
||||
|
||||
static Animation badAnimation; //< Bad animation when an out of bound
|
||||
// animation is requested.
|
||||
static Animation badAnimation; //< Bad animation when an out of bound
|
||||
// animation is requested.
|
||||
bool adaptCollisionMaskAutomatically; ///< If set to true, the collision
|
||||
///< mask will be automatically
|
||||
///< adapted to the animation of the
|
||||
///< object.
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
135
Core/GDCore/Extensions/Metadata/AbstractFunctionMetadata.h
Normal file
135
Core/GDCore/Extensions/Metadata/AbstractFunctionMetadata.h
Normal file
@@ -0,0 +1,135 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include "GDCore/Events/Instruction.h"
|
||||
#include "GDCore/String.h"
|
||||
#include "ParameterMetadata.h"
|
||||
#include "ParameterOptions.h"
|
||||
|
||||
namespace gd {
|
||||
class Project;
|
||||
class Layout;
|
||||
class EventsCodeGenerator;
|
||||
class EventsCodeGenerationContext;
|
||||
class SerializerElement;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Describe user-friendly information about an expression or an
|
||||
* instruction (action or condition), its parameters and the function name as
|
||||
* well as other information for code generation.
|
||||
*
|
||||
* \ingroup Events
|
||||
*/
|
||||
class GD_CORE_API AbstractFunctionMetadata {
|
||||
public:
|
||||
AbstractFunctionMetadata(){};
|
||||
virtual ~AbstractFunctionMetadata(){};
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::AddParameter
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
AddParameter(const gd::String &type, const gd::String &label,
|
||||
const gd::String &supplementaryInformation = "",
|
||||
bool parameterIsOptional = false) = 0;
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::AddCodeOnlyParameter
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
AddCodeOnlyParameter(const gd::String &type,
|
||||
const gd::String &supplementaryInformation) = 0;
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::SetDefaultValue
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
SetDefaultValue(const gd::String &defaultValue) = 0;
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::SetParameterExtraInfo
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
SetParameterExtraInfo(const gd::String &defaultValue) = 0;
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::SetParameterLongDescription
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
SetParameterLongDescription(const gd::String &longDescription) = 0;
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::SetHidden
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &SetHidden() = 0;
|
||||
|
||||
/**
|
||||
* Set that the instruction is private - it can't be used outside of the
|
||||
* object/ behavior that it is attached too.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &SetPrivate() = 0;
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in layouts or external events.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &SetRelevantForLayoutEventsOnly() = 0;
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in function events.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &SetRelevantForFunctionEventsOnly() = 0;
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
SetRelevantForAsynchronousFunctionEventsOnly() = 0;
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in custom object events.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &SetRelevantForCustomObjectEventsOnly() = 0;
|
||||
|
||||
/**
|
||||
* \brief Set the function that should be called when generating the source
|
||||
* code from events.
|
||||
* \param functionName the name of the function to call
|
||||
* \note Shortcut for `codeExtraInformation.SetFunctionName`.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
SetFunctionName(const gd::String &functionName) = 0;
|
||||
|
||||
/**
|
||||
* \brief Erase any existing include file and add the specified include.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
SetIncludeFile(const gd::String &includeFile) = 0;
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
virtual AbstractFunctionMetadata &
|
||||
AddIncludeFile(const gd::String &includeFile) = 0;
|
||||
|
||||
/**
|
||||
* \brief Get the files that must be included to use the instruction.
|
||||
*/
|
||||
virtual const std::vector<gd::String> &GetIncludeFiles() const = 0;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -3,8 +3,10 @@
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#ifndef BEHAVIORMETADATA_H
|
||||
#define BEHAVIORMETADATA_H
|
||||
#pragma once
|
||||
|
||||
#include "InstructionOrExpressionContainerMetadata.h"
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
|
||||
@@ -25,7 +27,7 @@ namespace gd {
|
||||
*
|
||||
* \ingroup Events
|
||||
*/
|
||||
class GD_CORE_API BehaviorMetadata {
|
||||
class GD_CORE_API BehaviorMetadata : public InstructionOrExpressionContainerMetadata {
|
||||
public:
|
||||
BehaviorMetadata(
|
||||
const gd::String& extensionNamespace,
|
||||
@@ -67,7 +69,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* Declare a new action as being part of the behavior.
|
||||
@@ -80,7 +82,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* Declare a new condition as being part of the behavior.
|
||||
@@ -91,7 +93,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* Declare a new action as being part of the behavior.
|
||||
@@ -102,7 +104,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
/**
|
||||
* Declare a new action as being part of the extension.
|
||||
*/
|
||||
@@ -110,7 +112,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& fullname_,
|
||||
const gd::String& description_,
|
||||
const gd::String& group_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* Declare a new string expression as being part of the extension.
|
||||
@@ -119,7 +121,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& fullname_,
|
||||
const gd::String& description_,
|
||||
const gd::String& group_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* \brief Declare a new expression and condition as being part of the
|
||||
@@ -134,7 +136,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& description,
|
||||
const gd::String& sentenceName,
|
||||
const gd::String& group,
|
||||
const gd::String& icon);
|
||||
const gd::String& icon) override;
|
||||
|
||||
/**
|
||||
* \brief Declare a new expression, condition and action as being part of the
|
||||
@@ -151,7 +153,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& description,
|
||||
const gd::String& sentenceName,
|
||||
const gd::String& group,
|
||||
const gd::String& icon);
|
||||
const gd::String& icon) override;
|
||||
|
||||
/**
|
||||
* \brief Create a new action which is the duplicate of the specified one.
|
||||
@@ -160,7 +162,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
* one.
|
||||
*/
|
||||
gd::InstructionMetadata& AddDuplicatedAction(
|
||||
const gd::String& newActionName, const gd::String& copiedActionName);
|
||||
const gd::String& newActionName, const gd::String& copiedActionName) override;
|
||||
|
||||
/**
|
||||
* \brief Create a new condition which is the duplicate of the specified one.
|
||||
@@ -170,7 +172,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
*/
|
||||
gd::InstructionMetadata& AddDuplicatedCondition(
|
||||
const gd::String& newConditionName,
|
||||
const gd::String& copiedConditionName);
|
||||
const gd::String& copiedConditionName) override;
|
||||
|
||||
/**
|
||||
* \brief Create a new expression which is the duplicate of the specified one.
|
||||
@@ -193,9 +195,9 @@ class GD_CORE_API BehaviorMetadata {
|
||||
const gd::String& newExpressionName,
|
||||
const gd::String& copiedExpressionName);
|
||||
|
||||
BehaviorMetadata& SetFullName(const gd::String& fullname_);
|
||||
BehaviorMetadata& SetFullName(const gd::String& fullname_) override;
|
||||
BehaviorMetadata& SetDefaultName(const gd::String& defaultName_);
|
||||
BehaviorMetadata& SetDescription(const gd::String& description_);
|
||||
BehaviorMetadata& SetDescription(const gd::String& description_) override;
|
||||
BehaviorMetadata& SetGroup(const gd::String& group_);
|
||||
|
||||
/**
|
||||
@@ -203,12 +205,12 @@ class GD_CORE_API BehaviorMetadata {
|
||||
* \note The requirement may vary depending on the platform: Most of the time,
|
||||
* the include file contains the declaration of the behavior.
|
||||
*/
|
||||
BehaviorMetadata& SetIncludeFile(const gd::String& includeFile);
|
||||
BehaviorMetadata& SetIncludeFile(const gd::String& includeFile) override;
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
BehaviorMetadata& AddIncludeFile(const gd::String& includeFile);
|
||||
BehaviorMetadata& AddIncludeFile(const gd::String& includeFile) override;
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing required files.
|
||||
@@ -221,7 +223,7 @@ class GD_CORE_API BehaviorMetadata {
|
||||
* Get the help path of the behavior, relative to the GDevelop documentation
|
||||
* root.
|
||||
*/
|
||||
const gd::String& GetHelpPath() const { return helpPath; }
|
||||
const gd::String& GetHelpPath() const override { return helpPath; }
|
||||
|
||||
/**
|
||||
* Set the help path of the behavior, relative to the GDevelop documentation
|
||||
@@ -230,17 +232,17 @@ class GD_CORE_API BehaviorMetadata {
|
||||
* The behavior instructions will have this help path set by
|
||||
* default, unless you call SetHelpPath on them.
|
||||
*/
|
||||
BehaviorMetadata& SetHelpPath(const gd::String& path) {
|
||||
BehaviorMetadata& SetHelpPath(const gd::String& path) override {
|
||||
helpPath = path;
|
||||
return *this;
|
||||
}
|
||||
|
||||
const gd::String& GetName() const;
|
||||
const gd::String& GetFullName() const { return fullname; }
|
||||
const gd::String& GetName() const override;
|
||||
const gd::String& GetFullName() const override { return fullname; }
|
||||
const gd::String& GetDefaultName() const { return defaultName; }
|
||||
const gd::String& GetDescription() const { return description; }
|
||||
const gd::String& GetDescription() const override { return description; }
|
||||
const gd::String& GetGroup() const { return group; }
|
||||
const gd::String& GetIconFilename() const { return iconFilename; }
|
||||
const gd::String& GetIconFilename() const override { return iconFilename; }
|
||||
|
||||
/**
|
||||
* \brief Set the type of the object that this behavior can be used on.
|
||||
@@ -293,22 +295,22 @@ class GD_CORE_API BehaviorMetadata {
|
||||
* \brief Return a reference to a map containing the names of the actions
|
||||
* (as keys) and the metadata associated with (as values).
|
||||
*/
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllActions() { return actionsInfos; };
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllActions() override { return actionsInfos; };
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllConditions() { return conditionsInfos; };
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllConditions() override { return conditionsInfos; };
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions() { return expressionsInfos; };
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions() override { return expressionsInfos; };
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() { return strExpressionsInfos; };
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() override { return strExpressionsInfos; };
|
||||
|
||||
std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
|
||||
std::map<gd::String, gd::InstructionMetadata> actionsInfos;
|
||||
@@ -337,5 +339,3 @@ class GD_CORE_API BehaviorMetadata {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // BEHAVIORMETADATA_H
|
||||
|
@@ -3,9 +3,10 @@
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#ifndef EXPRESSIONMETADATA_H
|
||||
#define EXPRESSIONMETADATA_H
|
||||
#if defined(GD_IDE_ONLY)
|
||||
#pragma once
|
||||
|
||||
#include "AbstractFunctionMetadata.h"
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
|
||||
@@ -17,7 +18,6 @@ class Layout;
|
||||
}
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Information about how generate code for an expression
|
||||
*/
|
||||
@@ -27,79 +27,7 @@ class ExpressionCodeGenerationInformation {
|
||||
: staticFunction(false), hasCustomCodeGenerator(false){};
|
||||
virtual ~ExpressionCodeGenerationInformation(){};
|
||||
|
||||
/**
|
||||
* \brief Set the function name which will be used when generating the code.
|
||||
* \param functionName the name of the function to call
|
||||
*/
|
||||
ExpressionCodeGenerationInformation& SetFunctionName(
|
||||
const gd::String& functionName) {
|
||||
functionCallName = functionName;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set that the function is static
|
||||
*/
|
||||
ExpressionCodeGenerationInformation& SetStatic() {
|
||||
staticFunction = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Erase any existing include file and add the specified include.
|
||||
*/
|
||||
ExpressionCodeGenerationInformation& SetIncludeFile(
|
||||
const gd::String& includeFile) {
|
||||
includeFiles.clear();
|
||||
includeFiles.push_back(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
ExpressionCodeGenerationInformation& AddIncludeFile(
|
||||
const gd::String& includeFile) {
|
||||
if (std::find(includeFiles.begin(), includeFiles.end(), includeFile) ==
|
||||
includeFiles.end())
|
||||
includeFiles.push_back(includeFile);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the files that must be included to use the instruction.
|
||||
*/
|
||||
const std::vector<gd::String>& GetIncludeFiles() const {
|
||||
return includeFiles;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Set that the function must be generated using a custom code
|
||||
* generator.
|
||||
*/
|
||||
ExpressionCodeGenerationInformation& SetCustomCodeGenerator(
|
||||
std::function<gd::String(const std::vector<gd::Expression>& parameters,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context)>
|
||||
codeGenerator) {
|
||||
hasCustomCodeGenerator = true;
|
||||
customCodeGenerator = codeGenerator;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ExpressionCodeGenerationInformation& RemoveCustomCodeGenerator() {
|
||||
hasCustomCodeGenerator = false;
|
||||
std::function<gd::String(const std::vector<gd::Expression>& parameters,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context)>
|
||||
emptyFunction;
|
||||
customCodeGenerator = emptyFunction;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool HasCustomCodeGenerator() const { return hasCustomCodeGenerator; }
|
||||
|
||||
// TODO Move these attributes to ExpressionMetadata.
|
||||
bool staticFunction;
|
||||
gd::String functionCallName;
|
||||
bool hasCustomCodeGenerator;
|
||||
@@ -107,8 +35,6 @@ class ExpressionCodeGenerationInformation {
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context)>
|
||||
customCodeGenerator;
|
||||
|
||||
private:
|
||||
std::vector<gd::String> includeFiles;
|
||||
};
|
||||
|
||||
@@ -118,7 +44,7 @@ class ExpressionCodeGenerationInformation {
|
||||
*
|
||||
* \ingroup Events
|
||||
*/
|
||||
class GD_CORE_API ExpressionMetadata {
|
||||
class GD_CORE_API ExpressionMetadata : public gd::AbstractFunctionMetadata {
|
||||
public:
|
||||
/**
|
||||
* Construct a new expression metadata.
|
||||
@@ -144,7 +70,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
/**
|
||||
* \brief Set the expression as not shown in the IDE.
|
||||
*/
|
||||
ExpressionMetadata& SetHidden();
|
||||
ExpressionMetadata& SetHidden() override;
|
||||
|
||||
/**
|
||||
* \brief Set the group of the instruction in the IDE.
|
||||
@@ -179,7 +105,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
* Set that the instruction is private - it can't be used outside of the
|
||||
* object/ behavior that it is attached too.
|
||||
*/
|
||||
ExpressionMetadata& SetPrivate() {
|
||||
ExpressionMetadata& SetPrivate() override {
|
||||
isPrivate = true;
|
||||
return *this;
|
||||
}
|
||||
@@ -216,7 +142,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in layouts or external events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForLayoutEventsOnly() {
|
||||
ExpressionMetadata &SetRelevantForLayoutEventsOnly() override {
|
||||
relevantContext = "Layout";
|
||||
return *this;
|
||||
}
|
||||
@@ -224,7 +150,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in function events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForFunctionEventsOnly() {
|
||||
ExpressionMetadata &SetRelevantForFunctionEventsOnly() override {
|
||||
relevantContext = "Function";
|
||||
return *this;
|
||||
}
|
||||
@@ -232,7 +158,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() {
|
||||
ExpressionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() override {
|
||||
relevantContext = "AsynchronousFunction";
|
||||
return *this;
|
||||
}
|
||||
@@ -240,7 +166,7 @@ class GD_CORE_API ExpressionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in custom object events.
|
||||
*/
|
||||
ExpressionMetadata &SetRelevantForCustomObjectEventsOnly() {
|
||||
ExpressionMetadata &SetRelevantForCustomObjectEventsOnly() override {
|
||||
relevantContext = "Object";
|
||||
return *this;
|
||||
}
|
||||
@@ -248,17 +174,17 @@ class GD_CORE_API ExpressionMetadata {
|
||||
/**
|
||||
* \see gd::InstructionMetadata::AddParameter
|
||||
*/
|
||||
gd::ExpressionMetadata& AddParameter(
|
||||
const gd::String& type,
|
||||
const gd::String& description,
|
||||
const gd::String& supplementaryInformation = "",
|
||||
bool parameterIsOptional = false);
|
||||
gd::ExpressionMetadata &
|
||||
AddParameter(const gd::String &type, const gd::String &label,
|
||||
const gd::String &supplementaryInformation = "",
|
||||
bool parameterIsOptional = false) override;
|
||||
|
||||
/**
|
||||
* \see gd::InstructionMetadata::AddCodeOnlyParameter
|
||||
*/
|
||||
gd::ExpressionMetadata& AddCodeOnlyParameter(
|
||||
const gd::String& type, const gd::String& supplementaryInformation);
|
||||
gd::ExpressionMetadata &
|
||||
AddCodeOnlyParameter(const gd::String &type,
|
||||
const gd::String &supplementaryInformation) override;
|
||||
|
||||
/**
|
||||
* Set the default value used in editor (or if an optional parameter is empty
|
||||
@@ -266,8 +192,9 @@ class GD_CORE_API ExpressionMetadata {
|
||||
*
|
||||
* \see AddParameter
|
||||
*/
|
||||
ExpressionMetadata& SetDefaultValue(gd::String defaultValue_) {
|
||||
if (!parameters.empty()) parameters.back().SetDefaultValue(defaultValue_);
|
||||
ExpressionMetadata &SetDefaultValue(const gd::String &defaultValue) override {
|
||||
if (!parameters.empty())
|
||||
parameters.back().SetDefaultValue(defaultValue);
|
||||
return *this;
|
||||
};
|
||||
|
||||
@@ -277,7 +204,8 @@ class GD_CORE_API ExpressionMetadata {
|
||||
*
|
||||
* \see AddParameter
|
||||
*/
|
||||
ExpressionMetadata& SetParameterLongDescription(gd::String longDescription) {
|
||||
ExpressionMetadata &
|
||||
SetParameterLongDescription(const gd::String &longDescription) override {
|
||||
if (!parameters.empty())
|
||||
parameters.back().SetLongDescription(longDescription);
|
||||
return *this;
|
||||
@@ -290,7 +218,8 @@ class GD_CORE_API ExpressionMetadata {
|
||||
*
|
||||
* \see AddParameter
|
||||
*/
|
||||
ExpressionMetadata &SetParameterExtraInfo(const gd::String &extraInfo) {
|
||||
ExpressionMetadata &SetParameterExtraInfo(
|
||||
const gd::String &extraInfo) override {
|
||||
if (!parameters.empty()) parameters.back().SetExtraInfo(extraInfo);
|
||||
return *this;
|
||||
}
|
||||
@@ -312,50 +241,6 @@ class GD_CORE_API ExpressionMetadata {
|
||||
return requiredBaseObjectCapability;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Set the function that should be called when generating the source
|
||||
* code from events.
|
||||
* \param functionName the name of the function to call
|
||||
* \note Shortcut for `codeExtraInformation.SetFunctionName`.
|
||||
*/
|
||||
ExpressionCodeGenerationInformation& SetFunctionName(
|
||||
const gd::String& functionName) {
|
||||
return codeExtraInformation.SetFunctionName(functionName);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Return the structure containing the information about code
|
||||
* generation for the expression.
|
||||
*/
|
||||
ExpressionCodeGenerationInformation& GetCodeExtraInformation() {
|
||||
return codeExtraInformation;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Erase any existing include file and add the specified include.
|
||||
*/
|
||||
ExpressionMetadata &SetIncludeFile(const gd::String &includeFile) {
|
||||
codeExtraInformation.SetIncludeFile(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
ExpressionMetadata &AddIncludeFile(const gd::String &includeFile) {
|
||||
codeExtraInformation.AddIncludeFile(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the files that must be included to use the instruction.
|
||||
*/
|
||||
const std::vector<gd::String>& GetIncludeFiles() const {
|
||||
return codeExtraInformation.GetIncludeFiles();
|
||||
}
|
||||
|
||||
ExpressionCodeGenerationInformation codeExtraInformation;
|
||||
|
||||
bool IsShown() const { return shown; }
|
||||
const gd::String& GetReturnType() const { return returnType; }
|
||||
const gd::String& GetFullName() const { return fullname; }
|
||||
@@ -375,6 +260,99 @@ class GD_CORE_API ExpressionMetadata {
|
||||
|
||||
std::vector<gd::ParameterMetadata> parameters;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Set the function name which will be used when generating the code.
|
||||
* \param functionName the name of the function to call
|
||||
*/
|
||||
ExpressionMetadata& SetFunctionName(
|
||||
const gd::String& functionName) override {
|
||||
codeExtraInformation.functionCallName = functionName;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief Return the name of the function which will be called in the generated code.
|
||||
*/
|
||||
const gd::String &GetFunctionName() {
|
||||
return codeExtraInformation.functionCallName;
|
||||
}
|
||||
/**
|
||||
* \brief Set that the function is static
|
||||
*/
|
||||
ExpressionMetadata& SetStatic() {
|
||||
codeExtraInformation.staticFunction = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Erase any existing include file and add the specified include.
|
||||
*/
|
||||
ExpressionMetadata& SetIncludeFile(
|
||||
const gd::String& includeFile) override {
|
||||
codeExtraInformation.includeFiles.clear();
|
||||
codeExtraInformation.includeFiles.push_back(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
ExpressionMetadata& AddIncludeFile(
|
||||
const gd::String& includeFile) override {
|
||||
if (std::find(codeExtraInformation.includeFiles.begin(), codeExtraInformation.includeFiles.end(), includeFile) ==
|
||||
codeExtraInformation.includeFiles.end())
|
||||
codeExtraInformation.includeFiles.push_back(includeFile);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the files that must be included to use the instruction.
|
||||
*/
|
||||
const std::vector<gd::String>& GetIncludeFiles() const override {
|
||||
return codeExtraInformation.includeFiles;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Set that the function must be generated using a custom code
|
||||
* generator.
|
||||
*/
|
||||
ExpressionMetadata& SetCustomCodeGenerator(
|
||||
std::function<gd::String(const std::vector<gd::Expression>& parameters,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context)>
|
||||
codeGenerator) {
|
||||
codeExtraInformation.hasCustomCodeGenerator = true;
|
||||
codeExtraInformation.customCodeGenerator = codeGenerator;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ExpressionMetadata& RemoveCustomCodeGenerator() {
|
||||
codeExtraInformation.hasCustomCodeGenerator = false;
|
||||
std::function<gd::String(const std::vector<gd::Expression>& parameters,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context)>
|
||||
emptyFunction;
|
||||
codeExtraInformation.customCodeGenerator = emptyFunction;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool HasCustomCodeGenerator() const { return codeExtraInformation.hasCustomCodeGenerator; }
|
||||
|
||||
/**
|
||||
* \brief Return the structure containing the information about code
|
||||
* generation for the expression.
|
||||
*
|
||||
* \deprecated
|
||||
*/
|
||||
ExpressionMetadata& GetCodeExtraInformation() {
|
||||
return *this;
|
||||
}
|
||||
|
||||
ExpressionCodeGenerationInformation codeExtraInformation;
|
||||
|
||||
private:
|
||||
gd::String returnType;
|
||||
gd::String fullname;
|
||||
@@ -391,6 +369,3 @@ class GD_CORE_API ExpressionMetadata {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif
|
||||
#endif // EXPRESSIONMETADATA_H
|
||||
|
@@ -4,8 +4,10 @@
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#ifndef INSTRUCTIONMETADATA_H
|
||||
#define INSTRUCTIONMETADATA_H
|
||||
#pragma once
|
||||
|
||||
#include "AbstractFunctionMetadata.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
@@ -33,7 +35,7 @@ namespace gd {
|
||||
*
|
||||
* \ingroup Events
|
||||
*/
|
||||
class GD_CORE_API InstructionMetadata {
|
||||
class GD_CORE_API InstructionMetadata : public gd::AbstractFunctionMetadata {
|
||||
public:
|
||||
/**
|
||||
* Construct a new instruction metadata.
|
||||
@@ -96,7 +98,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
* Set that the instruction is private - it can't be used outside of the
|
||||
* object/ behavior that it is attached too.
|
||||
*/
|
||||
InstructionMetadata &SetPrivate() {
|
||||
InstructionMetadata &SetPrivate() override {
|
||||
isPrivate = true;
|
||||
return *this;
|
||||
}
|
||||
@@ -133,7 +135,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in layouts or external events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForLayoutEventsOnly() {
|
||||
InstructionMetadata &SetRelevantForLayoutEventsOnly() override {
|
||||
relevantContext = "Layout";
|
||||
return *this;
|
||||
}
|
||||
@@ -141,7 +143,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in function events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForFunctionEventsOnly() {
|
||||
InstructionMetadata &SetRelevantForFunctionEventsOnly() override {
|
||||
relevantContext = "Function";
|
||||
return *this;
|
||||
}
|
||||
@@ -149,7 +151,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() {
|
||||
InstructionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() override {
|
||||
relevantContext = "AsynchronousFunction";
|
||||
return *this;
|
||||
}
|
||||
@@ -157,7 +159,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
/**
|
||||
* Set that the instruction can be used in custom object events.
|
||||
*/
|
||||
InstructionMetadata &SetRelevantForCustomObjectEventsOnly() {
|
||||
InstructionMetadata &SetRelevantForCustomObjectEventsOnly() override {
|
||||
relevantContext = "Object";
|
||||
return *this;
|
||||
}
|
||||
@@ -192,7 +194,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
*
|
||||
* Used mainly when an instruction is deprecated.
|
||||
*/
|
||||
InstructionMetadata &SetHidden() {
|
||||
InstructionMetadata &SetHidden() override {
|
||||
hidden = true;
|
||||
return *this;
|
||||
}
|
||||
@@ -231,7 +233,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
const gd::String &type,
|
||||
const gd::String &label,
|
||||
const gd::String &supplementaryInformation = "",
|
||||
bool parameterIsOptional = false);
|
||||
bool parameterIsOptional = false) override;
|
||||
|
||||
/**
|
||||
* \brief Add a parameter not displayed in editor.
|
||||
@@ -245,7 +247,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
* \see EventsCodeGenerator::GenerateParametersCodes
|
||||
*/
|
||||
InstructionMetadata &AddCodeOnlyParameter(
|
||||
const gd::String &type, const gd::String &supplementaryInformation);
|
||||
const gd::String &type, const gd::String &supplementaryInformation) override;
|
||||
|
||||
/**
|
||||
* \brief Set the default value used in editor (or if an optional parameter is
|
||||
@@ -253,7 +255,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
*
|
||||
* \see AddParameter
|
||||
*/
|
||||
InstructionMetadata &SetDefaultValue(const gd::String &defaultValue_) {
|
||||
InstructionMetadata &SetDefaultValue(const gd::String &defaultValue_) override {
|
||||
if (!parameters.empty()) parameters.back().SetDefaultValue(defaultValue_);
|
||||
return *this;
|
||||
};
|
||||
@@ -265,7 +267,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
* \see AddParameter
|
||||
*/
|
||||
InstructionMetadata &SetParameterLongDescription(
|
||||
const gd::String &longDescription) {
|
||||
const gd::String &longDescription) override {
|
||||
if (!parameters.empty())
|
||||
parameters.back().SetLongDescription(longDescription);
|
||||
return *this;
|
||||
@@ -278,7 +280,7 @@ class GD_CORE_API InstructionMetadata {
|
||||
*
|
||||
* \see AddParameter
|
||||
*/
|
||||
InstructionMetadata &SetParameterExtraInfo(const gd::String &extraInfo) {
|
||||
InstructionMetadata &SetParameterExtraInfo(const gd::String &extraInfo) override {
|
||||
if (!parameters.empty()) parameters.back().SetExtraInfo(extraInfo);
|
||||
return *this;
|
||||
}
|
||||
@@ -382,128 +384,13 @@ class GD_CORE_API InstructionMetadata {
|
||||
/**
|
||||
* \brief Defines information about how generate the code for an instruction
|
||||
*/
|
||||
class ExtraInformation {
|
||||
class ExtraInformation {
|
||||
public:
|
||||
enum AccessType { Reference, MutatorAndOrAccessor, Mutators };
|
||||
ExtraInformation() : accessType(Reference), hasCustomCodeGenerator(false){};
|
||||
virtual ~ExtraInformation(){};
|
||||
|
||||
/**
|
||||
* Set the name of the function which will be called in the generated code.
|
||||
* \param functionName the name of the function to call.
|
||||
*/
|
||||
ExtraInformation &SetFunctionName(const gd::String &functionName_) {
|
||||
functionCallName = functionName_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the name of the function, doing asynchronous work, which will be
|
||||
* called in the generated code. This function should return an asynchronous
|
||||
* task (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
|
||||
*
|
||||
* \param functionName the name of the function doing asynchronous work to
|
||||
* call.
|
||||
*/
|
||||
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName_) {
|
||||
asyncFunctionCallName = functionName_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Declare if the instruction being declared is somewhat manipulating in a
|
||||
* standard way.
|
||||
*/
|
||||
ExtraInformation &SetManipulatedType(const gd::String &type_) {
|
||||
type = type_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If InstructionMetadata::ExtraInformation::SetManipulatedType was called
|
||||
* with "number" or "string", this function will tell the code generator the
|
||||
* name of the getter function used to retrieve the data value.
|
||||
*
|
||||
* Usage example:
|
||||
* \code
|
||||
* obj.AddAction("String",
|
||||
* _("Change the string"),
|
||||
* _("Change the string of a text"),
|
||||
* _("the string"),
|
||||
* _("Text"),
|
||||
* "CppPlatform/Extensions/text24.png",
|
||||
* "CppPlatform/Extensions/text_black.png");
|
||||
*
|
||||
* .AddParameter("object", _("Object"), "Text", false)
|
||||
* .AddParameter("operator", _("Modification operator"), "string")
|
||||
* .AddParameter("string", _("String"))
|
||||
* .SetFunctionName("SetString").SetManipulatedType("string").SetGetter("GetString");
|
||||
*
|
||||
* DECLARE_END_OBJECT_ACTION()
|
||||
* \endcode
|
||||
*/
|
||||
ExtraInformation &SetGetter(const gd::String &getter) {
|
||||
optionalAssociatedInstruction = getter;
|
||||
accessType = MutatorAndOrAccessor;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ExtraInformation &SetMutators(
|
||||
const std::map<gd::String, gd::String> &mutators) {
|
||||
optionalMutators = mutators;
|
||||
accessType = Mutators;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Erase any existing include file and add the specified include.
|
||||
*/
|
||||
ExtraInformation &SetIncludeFile(const gd::String &includeFile) {
|
||||
includeFiles.clear();
|
||||
includeFiles.push_back(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
ExtraInformation &AddIncludeFile(const gd::String &includeFile) {
|
||||
if (std::find(includeFiles.begin(), includeFiles.end(), includeFile) ==
|
||||
includeFiles.end())
|
||||
includeFiles.push_back(includeFile);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the files that must be included to use the instruction.
|
||||
*/
|
||||
const std::vector<gd::String> &GetIncludeFiles() const {
|
||||
return includeFiles;
|
||||
};
|
||||
|
||||
ExtraInformation &SetCustomCodeGenerator(
|
||||
std::function<gd::String(Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context)>
|
||||
codeGenerator) {
|
||||
hasCustomCodeGenerator = true;
|
||||
customCodeGenerator = codeGenerator;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ExtraInformation &RemoveCustomCodeGenerator() {
|
||||
hasCustomCodeGenerator = false;
|
||||
std::function<gd::String(Instruction & instruction,
|
||||
gd::EventsCodeGenerator & codeGenerator,
|
||||
gd::EventsCodeGenerationContext & context)>
|
||||
emptyFunction;
|
||||
customCodeGenerator = emptyFunction;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool HasCustomCodeGenerator() const { return hasCustomCodeGenerator; }
|
||||
|
||||
// TODO Move these attributes to InstructionMetadata.
|
||||
gd::String functionCallName;
|
||||
gd::String asyncFunctionCallName;
|
||||
gd::String type;
|
||||
@@ -512,75 +399,156 @@ class GD_CORE_API InstructionMetadata {
|
||||
std::map<gd::String, gd::String> optionalMutators;
|
||||
bool hasCustomCodeGenerator;
|
||||
std::function<gd::String(Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context)>
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context)>
|
||||
customCodeGenerator;
|
||||
|
||||
private:
|
||||
std::vector<gd::String> includeFiles;
|
||||
};
|
||||
ExtraInformation codeExtraInformation; ///< Information about how generate
|
||||
///< code for the instruction
|
||||
|
||||
/**
|
||||
* \brief Return the structure containing the information about code
|
||||
* generation for the instruction.
|
||||
*/
|
||||
ExtraInformation &GetCodeExtraInformation() { return codeExtraInformation; }
|
||||
|
||||
/**
|
||||
* \brief Declare if the instruction being declared is somewhat manipulating
|
||||
* in a standard way. \param type "number" or "string" \note Shortcut for
|
||||
* `codeExtraInformation.SetManipulatedType(type)`.
|
||||
*/
|
||||
ExtraInformation &SetManipulatedType(const gd::String &type_) {
|
||||
return codeExtraInformation.SetManipulatedType(type_);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the name of the function which will be called in the generated code.
|
||||
* \param functionName the name of the function to call.
|
||||
* \note Shortcut for `codeExtraInformation.SetFunctionName`.
|
||||
*/
|
||||
ExtraInformation &SetFunctionName(const gd::String &functionName) {
|
||||
return codeExtraInformation.SetFunctionName(functionName);
|
||||
InstructionMetadata &SetFunctionName(const gd::String &functionName_) override {
|
||||
codeExtraInformation.functionCallName = functionName_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the name of the function, doing asynchronous work, which will be called
|
||||
* in the generated code. This function should return an asynchronous task
|
||||
* (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
|
||||
* Set the name of the function, doing asynchronous work, which will be
|
||||
* called in the generated code. This function should return an asynchronous
|
||||
* task (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
|
||||
*
|
||||
* \param functionName the name of the function doing asynchronous work to
|
||||
* call. \note Shortcut for `codeExtraInformation.SetAsyncFunctionName`.
|
||||
* call.
|
||||
*/
|
||||
ExtraInformation &SetAsyncFunctionName(const gd::String &functionName) {
|
||||
return codeExtraInformation.SetAsyncFunctionName(functionName);
|
||||
InstructionMetadata &SetAsyncFunctionName(const gd::String &functionName_) {
|
||||
codeExtraInformation.asyncFunctionCallName = functionName_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the name of the function which will be called in the generated code.
|
||||
*/
|
||||
const gd::String &GetFunctionName() {
|
||||
return codeExtraInformation.functionCallName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the name of the function, doing asynchronous work, which will be
|
||||
* called in the generated code. This function should return an asynchronous
|
||||
* task (i.e: `gdjs.AsyncTask` in the JavaScript runtime).
|
||||
*/
|
||||
const gd::String &GetAsyncFunctionName() {
|
||||
return codeExtraInformation.asyncFunctionCallName;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Declare if the instruction being declared is somewhat manipulating
|
||||
* in a standard way.
|
||||
*
|
||||
* \param type "number" or "string"
|
||||
*/
|
||||
InstructionMetadata &SetManipulatedType(const gd::String &type_) {
|
||||
codeExtraInformation.type = type_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If InstructionMetadata::ExtraInformation::SetManipulatedType was called
|
||||
* with "number" or "string", this function will tell the code generator the
|
||||
* name of the getter function used to retrieve the data value.
|
||||
*
|
||||
* Usage example:
|
||||
* \code
|
||||
* obj.AddAction("String",
|
||||
* _("Change the string"),
|
||||
* _("Change the string of a text"),
|
||||
* _("the string"),
|
||||
* _("Text"),
|
||||
* "CppPlatform/Extensions/text24.png",
|
||||
* "CppPlatform/Extensions/text_black.png");
|
||||
*
|
||||
* .AddParameter("object", _("Object"), "Text", false)
|
||||
* .AddParameter("operator", _("Modification operator"), "string")
|
||||
* .AddParameter("string", _("String"))
|
||||
* .SetFunctionName("SetString").SetManipulatedType("string").SetGetter("GetString");
|
||||
*
|
||||
* DECLARE_END_OBJECT_ACTION()
|
||||
* \endcode
|
||||
*/
|
||||
InstructionMetadata &SetGetter(const gd::String &getter) {
|
||||
codeExtraInformation.optionalAssociatedInstruction = getter;
|
||||
codeExtraInformation.accessType = codeExtraInformation.MutatorAndOrAccessor;
|
||||
return *this;
|
||||
}
|
||||
|
||||
InstructionMetadata &SetMutators(
|
||||
const std::map<gd::String, gd::String> &mutators) {
|
||||
codeExtraInformation.optionalMutators = mutators;
|
||||
codeExtraInformation.accessType = codeExtraInformation.Mutators;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Erase any existing include file and add the specified include.
|
||||
*/
|
||||
InstructionMetadata &SetIncludeFile(const gd::String &includeFile) {
|
||||
codeExtraInformation.SetIncludeFile(includeFile);
|
||||
InstructionMetadata &SetIncludeFile(const gd::String &includeFile) override {
|
||||
codeExtraInformation.includeFiles.clear();
|
||||
codeExtraInformation.includeFiles.push_back(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
InstructionMetadata &AddIncludeFile(const gd::String &includeFile) {
|
||||
codeExtraInformation.AddIncludeFile(includeFile);
|
||||
InstructionMetadata &AddIncludeFile(const gd::String &includeFile) override {
|
||||
if (std::find(codeExtraInformation.includeFiles.begin(), codeExtraInformation.includeFiles.end(), includeFile) ==
|
||||
codeExtraInformation.includeFiles.end())
|
||||
codeExtraInformation.includeFiles.push_back(includeFile);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the files that must be included to use the instruction.
|
||||
*/
|
||||
const std::vector<gd::String> &GetIncludeFiles() const {
|
||||
return codeExtraInformation.GetIncludeFiles();
|
||||
const std::vector<gd::String> &GetIncludeFiles() const override {
|
||||
return codeExtraInformation.includeFiles;
|
||||
};
|
||||
|
||||
InstructionMetadata &SetCustomCodeGenerator(
|
||||
std::function<gd::String(Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context)>
|
||||
codeGenerator) {
|
||||
codeExtraInformation.hasCustomCodeGenerator = true;
|
||||
codeExtraInformation.customCodeGenerator = codeGenerator;
|
||||
return *this;
|
||||
}
|
||||
|
||||
InstructionMetadata &RemoveCustomCodeGenerator() {
|
||||
codeExtraInformation.hasCustomCodeGenerator = false;
|
||||
std::function<gd::String(Instruction & instruction,
|
||||
gd::EventsCodeGenerator & codeGenerator,
|
||||
gd::EventsCodeGenerationContext & context)>
|
||||
emptyFunction;
|
||||
codeExtraInformation.customCodeGenerator = emptyFunction;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool HasCustomCodeGenerator() const { return codeExtraInformation.hasCustomCodeGenerator; }
|
||||
|
||||
/**
|
||||
* \brief Return the structure containing the information about code
|
||||
* generation for the instruction.
|
||||
*
|
||||
* \deprecated
|
||||
*/
|
||||
InstructionMetadata &GetCodeExtraInformation() { return *this; }
|
||||
|
||||
std::vector<ParameterMetadata> parameters;
|
||||
|
||||
private:
|
||||
@@ -604,5 +572,3 @@ class GD_CORE_API InstructionMetadata {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // INSTRUCTIONMETADATA_H
|
||||
|
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
class Behavior;
|
||||
class BehaviorsSharedData;
|
||||
class MultipleInstructionMetadata;
|
||||
class InstructionMetadata;
|
||||
class ExpressionMetadata;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Contains user-friendly information about instructions and expressions
|
||||
* (usually for a behavior or an object).
|
||||
*
|
||||
* \ingroup Events
|
||||
*/
|
||||
class GD_CORE_API InstructionOrExpressionContainerMetadata {
|
||||
public:
|
||||
InstructionOrExpressionContainerMetadata(){};
|
||||
virtual ~InstructionOrExpressionContainerMetadata(){};
|
||||
|
||||
/**
|
||||
* Declare a new condition as being part of the behavior or object.
|
||||
* \deprecated Prefer using `AddScopedCondition`, to properly namespace
|
||||
* the condition.
|
||||
*/
|
||||
virtual gd::InstructionMetadata &
|
||||
AddCondition(const gd::String &name_, const gd::String &fullname_,
|
||||
const gd::String &description_, const gd::String &sentence_,
|
||||
const gd::String &group_, const gd::String &icon_,
|
||||
const gd::String &smallicon_) = 0;
|
||||
|
||||
/**
|
||||
* Declare a new action as being part of the behavior or object.
|
||||
* \deprecated Prefer using `AddScopedAction`, to properly namespace
|
||||
* the action.
|
||||
*/
|
||||
virtual gd::InstructionMetadata &
|
||||
AddAction(const gd::String &name_, const gd::String &fullname_,
|
||||
const gd::String &description_, const gd::String &sentence_,
|
||||
const gd::String &group_, const gd::String &icon_,
|
||||
const gd::String &smallicon_) = 0;
|
||||
|
||||
/**
|
||||
* Declare a new condition as being part of the behavior or object.
|
||||
*/
|
||||
virtual gd::InstructionMetadata &
|
||||
AddScopedCondition(const gd::String &name_, const gd::String &fullname_,
|
||||
const gd::String &description_,
|
||||
const gd::String &sentence_, const gd::String &group_,
|
||||
const gd::String &icon_, const gd::String &smallicon_) = 0;
|
||||
|
||||
/**
|
||||
* Declare a new action as being part of the behavior or object.
|
||||
*/
|
||||
virtual gd::InstructionMetadata &
|
||||
AddScopedAction(const gd::String &name_, const gd::String &fullname_,
|
||||
const gd::String &description_, const gd::String &sentence_,
|
||||
const gd::String &group_, const gd::String &icon_,
|
||||
const gd::String &smallicon_) = 0;
|
||||
/**
|
||||
* Declare a new action as being part of the extension.
|
||||
*/
|
||||
virtual gd::ExpressionMetadata &
|
||||
AddExpression(const gd::String &name_, const gd::String &fullname_,
|
||||
const gd::String &description_, const gd::String &group_,
|
||||
const gd::String &smallicon_) = 0;
|
||||
|
||||
/**
|
||||
* Declare a new string expression as being part of the extension.
|
||||
*/
|
||||
virtual gd::ExpressionMetadata &
|
||||
AddStrExpression(const gd::String &name_, const gd::String &fullname_,
|
||||
const gd::String &description_, const gd::String &group_,
|
||||
const gd::String &smallicon_) = 0;
|
||||
|
||||
/**
|
||||
* \brief Declare a new expression and condition as being part of the
|
||||
* behavior.
|
||||
* \note It's recommended to use this function to avoid declaring twice a
|
||||
* similar expression/condition.
|
||||
*/
|
||||
virtual gd::MultipleInstructionMetadata AddExpressionAndCondition(
|
||||
const gd::String &type, const gd::String &name,
|
||||
const gd::String &fullname, const gd::String &description,
|
||||
const gd::String &sentenceName, const gd::String &group,
|
||||
const gd::String &icon) = 0;
|
||||
|
||||
/**
|
||||
* \brief Declare a new expression, condition and action as being part of the
|
||||
* behavior.
|
||||
* \note The action name is prefixed by "Set" (and the namespace, as the
|
||||
* condition).
|
||||
* \note It's recommended to use this function to avoid declaring 3 times a
|
||||
* similar expression/condition/action.
|
||||
*/
|
||||
virtual gd::MultipleInstructionMetadata AddExpressionAndConditionAndAction(
|
||||
const gd::String &type, const gd::String &name,
|
||||
const gd::String &fullname, const gd::String &description,
|
||||
const gd::String &sentenceName, const gd::String &group,
|
||||
const gd::String &icon) = 0;
|
||||
|
||||
/**
|
||||
* \brief Create a new action which is the duplicate of the specified one.
|
||||
*
|
||||
* Useful for handling a deprecated action that is just a "copy" of the new
|
||||
* one.
|
||||
*/
|
||||
virtual gd::InstructionMetadata &
|
||||
AddDuplicatedAction(const gd::String &newActionName,
|
||||
const gd::String &copiedActionName) = 0;
|
||||
|
||||
/**
|
||||
* \brief Create a new condition which is the duplicate of the specified one.
|
||||
*
|
||||
* Useful for handling a deprecated condition that is just a "copy" of the new
|
||||
* one.
|
||||
*/
|
||||
virtual gd::InstructionMetadata &
|
||||
AddDuplicatedCondition(const gd::String &newConditionName,
|
||||
const gd::String &copiedConditionName) = 0;
|
||||
|
||||
virtual InstructionOrExpressionContainerMetadata &
|
||||
SetFullName(const gd::String &fullname_) = 0;
|
||||
virtual InstructionOrExpressionContainerMetadata &
|
||||
SetDescription(const gd::String &description_) = 0;
|
||||
|
||||
/**
|
||||
* \brief Erase any existing include file and add the specified include.
|
||||
* \note The requirement may vary depending on the platform: Most of the time,
|
||||
* the include file contains the declaration of the behavior.
|
||||
*/
|
||||
virtual InstructionOrExpressionContainerMetadata &
|
||||
SetIncludeFile(const gd::String &includeFile) = 0;
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
virtual InstructionOrExpressionContainerMetadata &
|
||||
AddIncludeFile(const gd::String &includeFile) = 0;
|
||||
|
||||
/**
|
||||
* Get the help path of the behavior, relative to the GDevelop documentation
|
||||
* root.
|
||||
*/
|
||||
virtual const gd::String &GetHelpPath() const = 0;
|
||||
|
||||
/**
|
||||
* Set the help path of the behavior, relative to the GDevelop documentation
|
||||
* root.
|
||||
*
|
||||
* The behavior instructions will have this help path set by
|
||||
* default, unless you call SetHelpPath on them.
|
||||
*/
|
||||
virtual InstructionOrExpressionContainerMetadata &
|
||||
SetHelpPath(const gd::String &path) = 0;
|
||||
|
||||
virtual const gd::String &GetName() const = 0;
|
||||
virtual const gd::String &GetFullName() const = 0;
|
||||
virtual const gd::String &GetDescription() const = 0;
|
||||
virtual const gd::String &GetIconFilename() const = 0;
|
||||
|
||||
/**
|
||||
* \brief Return a reference to a map containing the names of the actions
|
||||
* (as keys) and the metadata associated with (as values).
|
||||
*/
|
||||
virtual std::map<gd::String, gd::InstructionMetadata> &GetAllActions() = 0;
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
virtual std::map<gd::String, gd::InstructionMetadata> &GetAllConditions() = 0;
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
virtual std::map<gd::String, gd::ExpressionMetadata> &GetAllExpressions() = 0;
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
virtual std::map<gd::String, gd::ExpressionMetadata> &
|
||||
GetAllStrExpressions() = 0;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -1,12 +0,0 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "MultipleInstructionMetadata.h"
|
||||
|
||||
#include "InstructionMetadata.h"
|
||||
|
||||
namespace gd {
|
||||
|
||||
} // namespace gd
|
@@ -3,8 +3,8 @@
|
||||
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#ifndef MULTIPLEINSTRUCTIONSMETADATA_H
|
||||
#define MULTIPLEINSTRUCTIONSMETADATA_H
|
||||
#pragma once
|
||||
|
||||
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
|
||||
#include "GDCore/String.h"
|
||||
@@ -21,7 +21,7 @@ namespace gd {
|
||||
*
|
||||
* \ingroup PlatformDefinition
|
||||
*/
|
||||
class GD_CORE_API MultipleInstructionMetadata {
|
||||
class GD_CORE_API MultipleInstructionMetadata : public AbstractFunctionMetadata {
|
||||
public:
|
||||
static MultipleInstructionMetadata WithExpressionAndCondition(
|
||||
gd::ExpressionMetadata &expression, gd::InstructionMetadata &condition) {
|
||||
@@ -45,7 +45,7 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
const gd::String &type,
|
||||
const gd::String &label,
|
||||
const gd::String &supplementaryInformation = "",
|
||||
bool parameterIsOptional = false) {
|
||||
bool parameterIsOptional = false) override {
|
||||
if (expression)
|
||||
expression->AddParameter(
|
||||
type, label, supplementaryInformation, parameterIsOptional);
|
||||
@@ -62,7 +62,7 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
* \see gd::InstructionMetadata::AddCodeOnlyParameter
|
||||
*/
|
||||
MultipleInstructionMetadata &AddCodeOnlyParameter(
|
||||
const gd::String &type, const gd::String &supplementaryInformation) {
|
||||
const gd::String &type, const gd::String &supplementaryInformation) override {
|
||||
if (expression)
|
||||
expression->AddCodeOnlyParameter(type, supplementaryInformation);
|
||||
if (condition)
|
||||
@@ -74,7 +74,7 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
/**
|
||||
* \see gd::InstructionMetadata::SetDefaultValue
|
||||
*/
|
||||
MultipleInstructionMetadata &SetDefaultValue(const gd::String &defaultValue) {
|
||||
MultipleInstructionMetadata &SetDefaultValue(const gd::String &defaultValue) override {
|
||||
if (expression) expression->SetDefaultValue(defaultValue);
|
||||
if (condition) condition->SetDefaultValue(defaultValue);
|
||||
if (action) action->SetDefaultValue(defaultValue);
|
||||
@@ -85,7 +85,7 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
* \see gd::InstructionMetadata::SetParameterExtraInfo
|
||||
*/
|
||||
MultipleInstructionMetadata &SetParameterExtraInfo(
|
||||
const gd::String &defaultValue) {
|
||||
const gd::String &defaultValue) override {
|
||||
if (expression) expression->SetParameterExtraInfo(defaultValue);
|
||||
if (condition) condition->SetParameterExtraInfo(defaultValue);
|
||||
if (action) action->SetParameterExtraInfo(defaultValue);
|
||||
@@ -96,7 +96,7 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
* \see gd::InstructionMetadata::SetParameterLongDescription
|
||||
*/
|
||||
MultipleInstructionMetadata &SetParameterLongDescription(
|
||||
const gd::String &longDescription) {
|
||||
const gd::String &longDescription) override {
|
||||
if (expression) expression->SetParameterLongDescription(longDescription);
|
||||
if (condition) condition->SetParameterLongDescription(longDescription);
|
||||
if (action) action->SetParameterLongDescription(longDescription);
|
||||
@@ -106,7 +106,7 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
/**
|
||||
* \see gd::InstructionMetadata::SetHidden
|
||||
*/
|
||||
MultipleInstructionMetadata &SetHidden() {
|
||||
MultipleInstructionMetadata &SetHidden() override {
|
||||
if (expression) expression->SetHidden();
|
||||
if (condition) condition->SetHidden();
|
||||
if (action) action->SetHidden();
|
||||
@@ -136,47 +136,47 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
return *this;
|
||||
}
|
||||
|
||||
MultipleInstructionMetadata &SetFunctionName(const gd::String &functionName) {
|
||||
MultipleInstructionMetadata &SetFunctionName(const gd::String &functionName) override {
|
||||
if (expression) expression->SetFunctionName(functionName);
|
||||
if (condition) condition->SetFunctionName(functionName);
|
||||
if (action) action->GetCodeExtraInformation().SetFunctionName(functionName);
|
||||
if (action) action->SetFunctionName(functionName);
|
||||
return *this;
|
||||
}
|
||||
|
||||
MultipleInstructionMetadata &SetGetter(const gd::String &getter) {
|
||||
if (expression) expression->SetFunctionName(getter);
|
||||
if (condition) condition->SetFunctionName(getter);
|
||||
if (action) action->GetCodeExtraInformation().SetGetter(getter);
|
||||
if (action) action->SetGetter(getter);
|
||||
return *this;
|
||||
}
|
||||
|
||||
MultipleInstructionMetadata &SetIncludeFile(const gd::String &includeFile) {
|
||||
MultipleInstructionMetadata &SetIncludeFile(const gd::String &includeFile) override {
|
||||
if (expression)
|
||||
expression->GetCodeExtraInformation().SetIncludeFile(includeFile);
|
||||
expression->SetIncludeFile(includeFile);
|
||||
if (condition)
|
||||
condition->GetCodeExtraInformation().SetIncludeFile(includeFile);
|
||||
if (action) action->GetCodeExtraInformation().SetIncludeFile(includeFile);
|
||||
condition->SetIncludeFile(includeFile);
|
||||
if (action) action->SetIncludeFile(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
MultipleInstructionMetadata &AddIncludeFile(const gd::String &includeFile) {
|
||||
MultipleInstructionMetadata &AddIncludeFile(const gd::String &includeFile) override {
|
||||
if (expression)
|
||||
expression->GetCodeExtraInformation().AddIncludeFile(includeFile);
|
||||
if (condition)
|
||||
condition->GetCodeExtraInformation().AddIncludeFile(includeFile);
|
||||
if (action) action->GetCodeExtraInformation().AddIncludeFile(includeFile);
|
||||
condition->AddIncludeFile(includeFile);
|
||||
if (action) action->AddIncludeFile(includeFile);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the files that must be included to use the instruction.
|
||||
*/
|
||||
const std::vector<gd::String> &GetIncludeFiles() const {
|
||||
const std::vector<gd::String> &GetIncludeFiles() const override {
|
||||
if (expression)
|
||||
return expression->GetCodeExtraInformation().GetIncludeFiles();
|
||||
if (condition)
|
||||
return condition->GetCodeExtraInformation().GetIncludeFiles();
|
||||
if (action) return action->GetCodeExtraInformation().GetIncludeFiles();
|
||||
return condition->GetIncludeFiles();
|
||||
if (action) return action->GetIncludeFiles();
|
||||
// It can't actually happen.
|
||||
throw std::logic_error("no instruction metadata");
|
||||
}
|
||||
@@ -184,7 +184,7 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
/**
|
||||
* \see gd::InstructionMetadata::SetPrivate
|
||||
*/
|
||||
MultipleInstructionMetadata &SetPrivate() {
|
||||
MultipleInstructionMetadata &SetPrivate() override {
|
||||
if (expression) expression->SetPrivate();
|
||||
if (condition) condition->SetPrivate();
|
||||
if (action) action->SetPrivate();
|
||||
@@ -218,6 +218,42 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in layouts or external events.
|
||||
*/
|
||||
MultipleInstructionMetadata &SetRelevantForLayoutEventsOnly() override {
|
||||
if (condition) condition->SetRelevantForLayoutEventsOnly();
|
||||
if (action) action->SetRelevantForLayoutEventsOnly();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in function events.
|
||||
*/
|
||||
MultipleInstructionMetadata &SetRelevantForFunctionEventsOnly() override {
|
||||
if (condition) condition->SetRelevantForFunctionEventsOnly();
|
||||
if (action) action->SetRelevantForFunctionEventsOnly();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in asynchronous function events.
|
||||
*/
|
||||
MultipleInstructionMetadata &SetRelevantForAsynchronousFunctionEventsOnly() override {
|
||||
if (condition) condition->SetRelevantForAsynchronousFunctionEventsOnly();
|
||||
if (action) action->SetRelevantForAsynchronousFunctionEventsOnly();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set that the instruction can be used in custom object events.
|
||||
*/
|
||||
MultipleInstructionMetadata &SetRelevantForCustomObjectEventsOnly() override {
|
||||
if (condition) condition->SetRelevantForCustomObjectEventsOnly();
|
||||
if (action) action->SetRelevantForCustomObjectEventsOnly();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Don't use, only here to fulfill Emscripten bindings requirements.
|
||||
*/
|
||||
@@ -242,5 +278,3 @@ class GD_CORE_API MultipleInstructionMetadata {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // MULTIPLEINSTRUCTIONSMETADATA_H
|
||||
|
@@ -3,8 +3,10 @@
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#ifndef OBJECTMETADATA_H
|
||||
#define OBJECTMETADATA_H
|
||||
#pragma once
|
||||
|
||||
#include "InstructionOrExpressionContainerMetadata.h"
|
||||
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <set>
|
||||
@@ -32,7 +34,7 @@ namespace gd {
|
||||
*
|
||||
* \ingroup Events
|
||||
*/
|
||||
class GD_CORE_API ObjectMetadata {
|
||||
class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetadata {
|
||||
public:
|
||||
/**
|
||||
* \brief Construct an object metadata, using a "blueprint" object that will
|
||||
@@ -79,7 +81,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* \brief Declare a new action as being part of the extension.
|
||||
@@ -92,7 +94,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* Declare a new condition as being part of the object.
|
||||
@@ -103,7 +105,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* Declare a new action as being part of the object.
|
||||
@@ -114,7 +116,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& sentence_,
|
||||
const gd::String& group_,
|
||||
const gd::String& icon_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* \brief Declare a new expression as being part of the extension.
|
||||
@@ -123,7 +125,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& fullname_,
|
||||
const gd::String& description_,
|
||||
const gd::String& group_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
/**
|
||||
* \brief Declare a new string expression as being part of the extension.
|
||||
*/
|
||||
@@ -131,7 +133,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& fullname_,
|
||||
const gd::String& description_,
|
||||
const gd::String& group_,
|
||||
const gd::String& smallicon_);
|
||||
const gd::String& smallicon_) override;
|
||||
|
||||
/**
|
||||
* \brief Declare a new expression and condition as being part of the
|
||||
@@ -146,7 +148,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& description,
|
||||
const gd::String& sentenceName,
|
||||
const gd::String& group,
|
||||
const gd::String& icon);
|
||||
const gd::String& icon) override;
|
||||
|
||||
/**
|
||||
* \brief Declare a new expression, condition and action as being part of the
|
||||
@@ -163,7 +165,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
const gd::String& description,
|
||||
const gd::String& sentenceName,
|
||||
const gd::String& group,
|
||||
const gd::String& icon);
|
||||
const gd::String& icon) override;
|
||||
|
||||
/**
|
||||
* \brief Create a new action which is the duplicate of the specified one.
|
||||
@@ -172,7 +174,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
* one.
|
||||
*/
|
||||
gd::InstructionMetadata& AddDuplicatedAction(
|
||||
const gd::String& newActionName, const gd::String& copiedActionName);
|
||||
const gd::String& newActionName, const gd::String& copiedActionName) override;
|
||||
|
||||
/**
|
||||
* \brief Create a new condition which is the duplicate of the specified one.
|
||||
@@ -182,23 +184,23 @@ class GD_CORE_API ObjectMetadata {
|
||||
*/
|
||||
gd::InstructionMetadata& AddDuplicatedCondition(
|
||||
const gd::String& newConditionName,
|
||||
const gd::String& copiedConditionName);
|
||||
const gd::String& copiedConditionName) override;
|
||||
|
||||
/**
|
||||
* \brief Set the name shown to the user.
|
||||
*/
|
||||
ObjectMetadata& SetFullName(const gd::String& fullname_);
|
||||
ObjectMetadata& SetFullName(const gd::String& fullname_) override;
|
||||
|
||||
/**
|
||||
* \brief Set the description shown to the user.
|
||||
*/
|
||||
ObjectMetadata& SetDescription(const gd::String& description_);
|
||||
ObjectMetadata& SetDescription(const gd::String& description_) override;
|
||||
|
||||
/**
|
||||
* \brief Get the help path of the object, relative to the GDevelop
|
||||
* documentation root.
|
||||
*/
|
||||
const gd::String& GetHelpPath() const { return helpPath; }
|
||||
const gd::String& GetHelpPath() const override { return helpPath; }
|
||||
|
||||
/**
|
||||
* \brief Set the help path of the object, relative to the GDevelop
|
||||
@@ -207,7 +209,7 @@ class GD_CORE_API ObjectMetadata {
|
||||
* The object instructions will have this help path set by
|
||||
* default, unless you call SetHelpPath on them.
|
||||
*/
|
||||
ObjectMetadata& SetHelpPath(const gd::String& path) {
|
||||
ObjectMetadata& SetHelpPath(const gd::String& path) override {
|
||||
helpPath = path;
|
||||
return *this;
|
||||
}
|
||||
@@ -248,12 +250,12 @@ class GD_CORE_API ObjectMetadata {
|
||||
return unsupportedBaseObjectCapabilities.find(capability) != unsupportedBaseObjectCapabilities.end();
|
||||
}
|
||||
|
||||
const gd::String& GetName() const { return name; }
|
||||
const gd::String& GetFullName() const { return fullname; }
|
||||
const gd::String& GetName() const override { return name; }
|
||||
const gd::String& GetFullName() const override { return fullname; }
|
||||
const gd::String& GetCategoryFullName() const { return categoryFullName; }
|
||||
const gd::String& GetHelpUrl() const { return helpUrl; }
|
||||
const gd::String& GetDescription() const { return description; }
|
||||
const gd::String& GetIconFilename() const { return iconFilename; }
|
||||
const gd::String& GetDescription() const override { return description; }
|
||||
const gd::String& GetIconFilename() const override { return iconFilename; }
|
||||
|
||||
/**
|
||||
* \brief Set the URL pointing to the help page about this object
|
||||
@@ -267,33 +269,33 @@ class GD_CORE_API ObjectMetadata {
|
||||
* \note The requirement may vary depending on the platform: Most of the time,
|
||||
* the include file contains the declaration of the object.
|
||||
*/
|
||||
ObjectMetadata& SetIncludeFile(const gd::String& includeFile);
|
||||
ObjectMetadata& SetIncludeFile(const gd::String& includeFile) override;
|
||||
|
||||
/**
|
||||
* \brief Add a file to the already existing include files.
|
||||
*/
|
||||
ObjectMetadata& AddIncludeFile(const gd::String& includeFile);
|
||||
ObjectMetadata& AddIncludeFile(const gd::String& includeFile) override;
|
||||
|
||||
/**
|
||||
* \brief Return a reference to a map containing the names of the actions
|
||||
* (as keys) and the metadata associated with (as values).
|
||||
*/
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllActions() { return actionsInfos; };
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllActions() override { return actionsInfos; };
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllConditions() { return conditionsInfos; };
|
||||
std::map<gd::String, gd::InstructionMetadata>& GetAllConditions() override { return conditionsInfos; };
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions() { return expressionsInfos; };
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllExpressions() override { return expressionsInfos; };
|
||||
|
||||
/**
|
||||
* \see gd::PlatformExtension::GetAllActions
|
||||
*/
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() { return strExpressionsInfos; };
|
||||
std::map<gd::String, gd::ExpressionMetadata>& GetAllStrExpressions() override { return strExpressionsInfos; };
|
||||
|
||||
/**
|
||||
* \brief Set the object to be hidden in the IDE.
|
||||
@@ -341,4 +343,3 @@ class GD_CORE_API ObjectMetadata {
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
#endif // OBJECTMETADATA_H
|
||||
|
@@ -653,7 +653,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
GetAllActions().begin();
|
||||
it != GetAllActions().end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
GetAllActions().erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -663,7 +663,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
GetAllConditions().begin();
|
||||
it != GetAllConditions().end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
GetAllConditions().erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -673,7 +673,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
GetAllExpressions().begin();
|
||||
it != GetAllExpressions().end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
GetAllExpressions().erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -683,7 +683,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
GetAllStrExpressions().begin();
|
||||
it != GetAllStrExpressions().end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
GetAllStrExpressions().erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -699,7 +699,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.actionsInfos.begin();
|
||||
it != obj.actionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.actionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -709,7 +709,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.conditionsInfos.begin();
|
||||
it != obj.conditionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.conditionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -719,7 +719,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.expressionsInfos.begin();
|
||||
it != obj.expressionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.expressionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -729,7 +729,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.strExpressionsInfos.begin();
|
||||
it != obj.strExpressionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.strExpressionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -746,7 +746,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.actionsInfos.begin();
|
||||
it != obj.actionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.actionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -756,7 +756,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.conditionsInfos.begin();
|
||||
it != obj.conditionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.conditionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -766,7 +766,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.expressionsInfos.begin();
|
||||
it != obj.expressionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.expressionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
@@ -776,7 +776,7 @@ void PlatformExtension::StripUnimplementedInstructionsAndExpressions() {
|
||||
obj.strExpressionsInfos.begin();
|
||||
it != obj.strExpressionsInfos.end();) {
|
||||
if (it->second.codeExtraInformation.functionCallName.empty() &&
|
||||
!it->second.codeExtraInformation.HasCustomCodeGenerator()) {
|
||||
!it->second.HasCustomCodeGenerator()) {
|
||||
obj.strExpressionsInfos.erase(it++);
|
||||
} else
|
||||
++it;
|
||||
|
@@ -555,6 +555,22 @@ void EventsRefactorer::RemoveObjectInEvents(const gd::Platform& platform,
|
||||
}
|
||||
}
|
||||
|
||||
gd::String ReplaceAllOccurrencesCaseInsensitive(gd::String context,
|
||||
const gd::String& from,
|
||||
const gd::String& to) {
|
||||
size_t lookHere = 0;
|
||||
size_t foundHere;
|
||||
size_t fromSize = from.size();
|
||||
size_t toSize = to.size();
|
||||
while ((foundHere = context.FindCaseInsensitive(from, lookHere)) !=
|
||||
gd::String::npos) {
|
||||
context.replace(foundHere, fromSize, to);
|
||||
lookHere = foundHere + toSize;
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
std::vector<EventsSearchResult> EventsRefactorer::ReplaceStringInEvents(
|
||||
gd::ObjectsContainer& project,
|
||||
gd::ObjectsContainer& layout,
|
||||
@@ -570,6 +586,32 @@ std::vector<EventsSearchResult> EventsRefactorer::ReplaceStringInEvents(
|
||||
|
||||
for (std::size_t i = 0; i < events.size(); ++i) {
|
||||
bool eventModified = false;
|
||||
|
||||
std::vector<gd::Expression*> allObjectExpressions =
|
||||
events[i].GetAllObjectExpressions();
|
||||
for (std::size_t j = 0; j < allObjectExpressions.size(); ++j) {
|
||||
gd::String newExpressionPlainString =
|
||||
matchCase ? allObjectExpressions[j]->GetPlainString().FindAndReplace(
|
||||
toReplace, newString, true)
|
||||
: ReplaceAllOccurrencesCaseInsensitive(
|
||||
allObjectExpressions[j]->GetPlainString(),
|
||||
toReplace,
|
||||
newString);
|
||||
|
||||
if (newExpressionPlainString !=
|
||||
allObjectExpressions[j]->GetPlainString()) {
|
||||
*allObjectExpressions[j] = gd::Expression(newExpressionPlainString);
|
||||
|
||||
if (!eventModified) {
|
||||
modifiedEvents.push_back(EventsSearchResult(
|
||||
std::weak_ptr<gd::BaseEvent>(events.GetEventSmartPtr(i)),
|
||||
&events,
|
||||
i));
|
||||
eventModified = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (inConditions) {
|
||||
vector<gd::InstructionsList*> conditionsVectors =
|
||||
events[i].GetAllConditionsVectors();
|
||||
@@ -642,22 +684,6 @@ std::vector<EventsSearchResult> EventsRefactorer::ReplaceStringInEvents(
|
||||
return modifiedEvents;
|
||||
}
|
||||
|
||||
gd::String ReplaceAllOccurrencesCaseInsensitive(gd::String context,
|
||||
gd::String from,
|
||||
const gd::String& to) {
|
||||
size_t lookHere = 0;
|
||||
size_t foundHere;
|
||||
size_t fromSize = from.size();
|
||||
size_t toSize = to.size();
|
||||
while ((foundHere = context.FindCaseInsensitive(from, lookHere)) !=
|
||||
gd::String::npos) {
|
||||
context.replace(foundHere, fromSize, to);
|
||||
lookHere = foundHere + toSize;
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
bool EventsRefactorer::ReplaceStringInActions(gd::ObjectsContainer& project,
|
||||
gd::ObjectsContainer& layout,
|
||||
gd::InstructionsList& actions,
|
||||
@@ -789,6 +815,24 @@ vector<EventsSearchResult> EventsRefactorer::SearchInEvents(
|
||||
for (std::size_t i = 0; i < events.size(); ++i) {
|
||||
bool eventAddedInResults = false;
|
||||
|
||||
std::vector<gd::Expression*> allObjectExpressions =
|
||||
events[i].GetAllObjectExpressions();
|
||||
for (std::size_t j = 0; j < allObjectExpressions.size(); ++j) {
|
||||
size_t foundPosition =
|
||||
matchCase
|
||||
? allObjectExpressions[j]->GetPlainString().find(search)
|
||||
: allObjectExpressions[j]->GetPlainString().FindCaseInsensitive(
|
||||
search);
|
||||
|
||||
if (foundPosition != gd::String::npos && !eventAddedInResults) {
|
||||
results.push_back(EventsSearchResult(
|
||||
std::weak_ptr<gd::BaseEvent>(events.GetEventSmartPtr(i)),
|
||||
&events,
|
||||
i));
|
||||
eventAddedInResults = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (inConditions) {
|
||||
vector<gd::InstructionsList*> conditionsVectors =
|
||||
events[i].GetAllConditionsVectors();
|
||||
@@ -803,6 +847,7 @@ vector<EventsSearchResult> EventsRefactorer::SearchInEvents(
|
||||
std::weak_ptr<gd::BaseEvent>(events.GetEventSmartPtr(i)),
|
||||
&events,
|
||||
i));
|
||||
eventAddedInResults = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -820,6 +865,7 @@ vector<EventsSearchResult> EventsRefactorer::SearchInEvents(
|
||||
std::weak_ptr<gd::BaseEvent>(events.GetEventSmartPtr(i)),
|
||||
&events,
|
||||
i));
|
||||
eventAddedInResults = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -77,7 +77,7 @@ class GD_CORE_API EventsBasedBehavior: public AbstractEventsBasedEntity {
|
||||
* \brief Check if the behavior is private - it can't be used outside of its
|
||||
* extension.
|
||||
*/
|
||||
bool IsPrivate() { return isPrivate; }
|
||||
bool IsPrivate() const { return isPrivate; }
|
||||
|
||||
/**
|
||||
* \brief Set that the behavior is private - it can't be used outside of its
|
||||
|
@@ -201,7 +201,7 @@ class GD_CORE_API EventsFunction {
|
||||
/**
|
||||
* \brief Returns true if the function is private.
|
||||
*/
|
||||
bool IsPrivate() { return isPrivate; }
|
||||
bool IsPrivate() const { return isPrivate; }
|
||||
|
||||
/**
|
||||
* \brief Sets the privateness of the function.
|
||||
|
@@ -207,6 +207,13 @@ class GD_CORE_API EventsFunctionsExtension : public EventsFunctionsContainer {
|
||||
return dependencies;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Returns the list of dependencies.
|
||||
*/
|
||||
const std::vector<gd::DependencyMetadata>& GetAllDependencies() const {
|
||||
return dependencies;
|
||||
};
|
||||
|
||||
///@}
|
||||
|
||||
/** \name Serialization
|
||||
|
@@ -686,6 +686,16 @@ String GD_CORE_API operator+(const char *lhs, const String &rhs)
|
||||
return str;
|
||||
}
|
||||
|
||||
const String& GD_CORE_API operator||(const String& lhs, const String &rhs)
|
||||
{
|
||||
return lhs.empty() ? rhs : lhs;
|
||||
}
|
||||
|
||||
String GD_CORE_API operator||(String lhs, const char *rhs)
|
||||
{
|
||||
return lhs.empty() ? rhs : lhs;
|
||||
}
|
||||
|
||||
bool GD_CORE_API operator==( const String &lhs, const String &rhs )
|
||||
{
|
||||
return (lhs.compare(rhs) == 0);
|
||||
|
@@ -699,6 +699,10 @@ String GD_CORE_API operator+(String lhs, const char *rhs);
|
||||
*/
|
||||
String GD_CORE_API operator+(const char *lhs, const String &rhs);
|
||||
|
||||
const String& GD_CORE_API operator||(const String &lhs, const String &rhs);
|
||||
|
||||
String GD_CORE_API operator||(String lhs, const char *rhs);
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
@@ -0,0 +1 @@
|
||||
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(Scene3D)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(Scene3D)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(Scene3D "${source_files}")
|
||||
gd_add_extension_target(Scene3D "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(Scene3D)
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(AnchorBehavior)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(AnchorBehavior)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(AnchorBehavior "${source_files}")
|
||||
gd_add_extension_target(AnchorBehavior "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(AnchorBehavior)
|
||||
|
@@ -1,28 +1,34 @@
|
||||
#This is the CMake file used to build the C++ extensions.
|
||||
#For more information, see the README.md file.
|
||||
# This is the CMake file used to build the C++ extensions.
|
||||
# For more information, see the README.md file.
|
||||
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0011 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(GD-Extensions)
|
||||
include(CMakeUtils.txt) #Functions to factor common tasks done in CMakeLists.txt of extensions
|
||||
include(CMakeUtils.txt) # Functions to factor common tasks done in CMakeLists.txt of extensions
|
||||
|
||||
#Add all the CMakeLists (for non pure JS extensions):
|
||||
ADD_SUBDIRECTORY(3D)
|
||||
ADD_SUBDIRECTORY(AnchorBehavior)
|
||||
ADD_SUBDIRECTORY(DestroyOutsideBehavior)
|
||||
ADD_SUBDIRECTORY(DraggableBehavior)
|
||||
ADD_SUBDIRECTORY(Inventory)
|
||||
ADD_SUBDIRECTORY(LinkedObjects)
|
||||
ADD_SUBDIRECTORY(ParticleSystem)
|
||||
ADD_SUBDIRECTORY(PanelSpriteObject)
|
||||
ADD_SUBDIRECTORY(PathfindingBehavior)
|
||||
ADD_SUBDIRECTORY(PhysicsBehavior)
|
||||
ADD_SUBDIRECTORY(PlatformBehavior)
|
||||
ADD_SUBDIRECTORY(PrimitiveDrawing)
|
||||
ADD_SUBDIRECTORY(Shopify)
|
||||
ADD_SUBDIRECTORY(SystemInfo)
|
||||
ADD_SUBDIRECTORY(TextEntryObject)
|
||||
ADD_SUBDIRECTORY(TextObject)
|
||||
ADD_SUBDIRECTORY(TiledSpriteObject)
|
||||
ADD_SUBDIRECTORY(TopDownMovementBehavior)
|
||||
# List of non pure JS extensions
|
||||
set(
|
||||
GD_EXTENSIONS
|
||||
3D
|
||||
AnchorBehavior
|
||||
DestroyOutsideBehavior
|
||||
DraggableBehavior
|
||||
Inventory
|
||||
LinkedObjects
|
||||
PanelSpriteObject
|
||||
ParticleSystem
|
||||
PathfindingBehavior
|
||||
PhysicsBehavior
|
||||
PlatformBehavior
|
||||
PrimitiveDrawing
|
||||
Shopify
|
||||
SystemInfo
|
||||
TextEntryObject
|
||||
TextObject
|
||||
TiledSpriteObject
|
||||
TopDownMovementBehavior)
|
||||
|
||||
# Automatically add all listed extensions
|
||||
foreach(extension ${GD_EXTENSIONS})
|
||||
add_subdirectory(${extension})
|
||||
endforeach()
|
||||
|
@@ -7,79 +7,75 @@ macro(gd_add_extension_includes)
|
||||
include_directories(${GDCORE_include_dir})
|
||||
endmacro()
|
||||
|
||||
#Add common defines for a target that will be a GD extension
|
||||
# Add common defines for a target that will be a GD extension
|
||||
function(gd_add_extension_definitions target_name)
|
||||
|
||||
#Define used in GD to check the build type
|
||||
IF(CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||
add_definitions( -DDEBUG )
|
||||
ELSE()
|
||||
add_definitions( -DRELEASE )
|
||||
ENDIF()
|
||||
# Define used in GD to check the build type
|
||||
if("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
|
||||
add_definitions(-DDEBUG)
|
||||
else()
|
||||
add_definitions(-DRELEASE)
|
||||
endif()
|
||||
|
||||
set(${target_name}_extra_definitions "${${target_name}_extra_definitions} GD_IDE_ONLY=1;" PARENT_SCOPE)
|
||||
|
||||
#Defne used in GD to identify the environment
|
||||
IF (EMSCRIPTEN)
|
||||
add_definitions( -DEMSCRIPTEN )
|
||||
ELSEIF(WIN32)
|
||||
add_definitions( -DWINDOWS )
|
||||
ELSEIF(APPLE)
|
||||
add_definitions( -DMACOS )
|
||||
ELSE()
|
||||
add_definitions( -DLINUX )
|
||||
ENDIF()
|
||||
# Define used in GD to identify the environment
|
||||
if(EMSCRIPTEN)
|
||||
add_definitions(-DEMSCRIPTEN)
|
||||
elseif(WIN32)
|
||||
add_definitions(-DWINDOWS)
|
||||
elseif(APPLE)
|
||||
add_definitions(-DMACOS)
|
||||
else()
|
||||
add_definitions(-DLINUX)
|
||||
endif()
|
||||
|
||||
IF(WIN32) #Windows specific defines
|
||||
add_definitions( "-DGD_CORE_API=__declspec(dllimport)" )
|
||||
add_definitions( "-DGD_API=__declspec(dllimport)" )
|
||||
add_definitions( "-DGD_EXTENSION_API=__declspec(dllexport)" )
|
||||
add_definitions( -D__GNUWIN32__ )
|
||||
ELSE()
|
||||
|
||||
add_definitions( -DGD_API= )
|
||||
add_definitions( -DGD_CORE_API= )
|
||||
add_definitions( -DGD_EXTENSION_API= )
|
||||
ENDIF(WIN32)
|
||||
if(WIN32) # Windows specific defines
|
||||
add_definitions("-DGD_API=__declspec(dllimport)")
|
||||
add_definitions("-DGD_CORE_API=__declspec(dllimport)")
|
||||
add_definitions("-DGD_EXTENSION_API=__declspec(dllexport)")
|
||||
add_definitions(-D__GNUWIN32__)
|
||||
else()
|
||||
add_definitions(-DGD_API=)
|
||||
add_definitions(-DGD_CORE_API=)
|
||||
add_definitions(-DGD_EXTENSION_API=)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
#Add a GD extension target, that will produce the final library file.
|
||||
# Add a GD extension target, that will produce the final library file.
|
||||
function(gd_add_extension_target target_name source_files)
|
||||
IF(target_name STREQUAL "")
|
||||
MESSAGE(ERROR "You called gd_add_extension_target without specifying a target name")
|
||||
ENDIF()
|
||||
if(target_name STREQUAL "")
|
||||
message(ERROR "You called gd_add_extension_target without specifying a target name")
|
||||
endif()
|
||||
|
||||
SET(platform_directory ${ARGV2})
|
||||
IF(NOT platform_directory)
|
||||
SET(platform_directory "CppPlatform")
|
||||
ENDIF()
|
||||
set(platform_directory ${ARGV2})
|
||||
if(NOT platform_directory)
|
||||
set(platform_directory "CppPlatform")
|
||||
endif()
|
||||
|
||||
IF(EMSCRIPTEN)
|
||||
if(EMSCRIPTEN)
|
||||
# Emscripten treats all libraries as static libraries
|
||||
add_library(${target_name} STATIC ${source_files})
|
||||
ELSE()
|
||||
else()
|
||||
add_library(${target_name} SHARED ${source_files})
|
||||
ENDIF()
|
||||
endif()
|
||||
set_target_properties(${target_name} PROPERTIES PREFIX "")
|
||||
set_target_properties(${target_name} PROPERTIES COMPILE_DEFINITIONS "${${target_name}_extra_definitions}")
|
||||
set_target_properties(${target_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/${platform_directory}/Extensions")
|
||||
set_target_properties(${target_name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/${platform_directory}/Extensions")
|
||||
set_target_properties(${target_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/${platform_directory}/Extensions")
|
||||
IF(WIN32) #GD extensions have special suffix in their filenames.
|
||||
if(WIN32) # GD extensions have special suffix in their filenames.
|
||||
set_target_properties(${target_name} PROPERTIES SUFFIX ".xgdwe")
|
||||
ELSEIF(EMSCRIPTEN)
|
||||
elseif(EMSCRIPTEN)
|
||||
set_target_properties(${target_name} PROPERTIES SUFFIX ".bc")
|
||||
ELSE()
|
||||
else()
|
||||
set_target_properties(${target_name} PROPERTIES SUFFIX ".xgde")
|
||||
ENDIF()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
#Link default libraries with a target that is a GD extension
|
||||
# Link default libraries with a target that is a GD extension
|
||||
function(gd_extension_link_libraries target_name)
|
||||
IF(EMSCRIPTEN)
|
||||
#Nothing.
|
||||
ELSE()
|
||||
if(NOT EMSCRIPTEN)
|
||||
target_link_libraries(${target_name} GDCore)
|
||||
ENDIF()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(DestroyOutsideBehavior)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(DestroyOutsideBehavior)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(DestroyOutsideBehavior "${source_files}")
|
||||
gd_add_extension_target(DestroyOutsideBehavior "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(DestroyOutsideBehavior GDCore)
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(DraggableBehavior)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(DraggableBehavior)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(DraggableBehavior "${source_files}")
|
||||
gd_add_extension_target(DraggableBehavior "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(DraggableBehavior)
|
||||
|
@@ -1,21 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(Inventory)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(Inventory)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(Inventory "${source_files}")
|
||||
|
||||
gd_add_extension_target(Inventory "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(Inventory)
|
||||
|
@@ -26,70 +26,57 @@ class InventoryJsExtension : public gd::PlatformExtension {
|
||||
DeclareInventoryExtension(*this);
|
||||
|
||||
GetAllActions()["Inventory::Add"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.add");
|
||||
GetAllActions()["Inventory::Remove"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.remove");
|
||||
GetAllActions()["Inventory::SetMaximum"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.setMaximum");
|
||||
GetAllActions()["Inventory::SetUnlimited"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.setUnlimited");
|
||||
GetAllActions()["Inventory::Equip"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.equip");
|
||||
|
||||
GetAllActions()["Inventory::SerializeToVariable"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.serializeToVariable");
|
||||
GetAllActions()["Inventory::UnserializeFromVariable"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.unserializeFromVariable");
|
||||
|
||||
GetAllConditions()["Inventory::Count"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.count");
|
||||
GetAllConditions()["Inventory::Has"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.has");
|
||||
GetAllConditions()["Inventory::IsFull"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.isFull");
|
||||
GetAllConditions()["Inventory::IsEquipped"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.isEquipped");
|
||||
|
||||
GetAllExpressions()["Inventory::Count"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.count");
|
||||
GetAllExpressions()["Inventory::Maximum"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Inventory/inventory.js")
|
||||
.AddIncludeFile("Extensions/Inventory/inventorytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.inventory.maximum");
|
||||
|
@@ -59,11 +59,17 @@ module.exports = {
|
||||
false
|
||||
)
|
||||
.addParameter('string', _('Name to register for the player'), '', false)
|
||||
.setParameterLongDescription(
|
||||
_(
|
||||
'Let this empty to let the leaderboard auto-generate a player name (e.g: "Player23464"). You can configure this in the leaderboard administration.'
|
||||
)
|
||||
)
|
||||
.setHelpPath('/all-features/leaderboards')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/Leaderboards/sha256.js')
|
||||
.addIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.savePlayerScore');
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.savePlayerScore')
|
||||
.setAsyncFunctionName('gdjs.evtTools.leaderboards.savePlayerScore');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
@@ -89,7 +95,8 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/Leaderboards/sha256.js')
|
||||
.addIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.saveConnectedPlayerScore');
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.saveConnectedPlayerScore')
|
||||
.setAsyncFunctionName('gdjs.evtTools.leaderboards.saveConnectedPlayerScore');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
@@ -154,20 +161,22 @@ module.exports = {
|
||||
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.isSaving');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'HasPlayerJustClosedLeaderboardView',
|
||||
_('Closed by player'),
|
||||
_('Check if the player has just closed the leaderboard view.'),
|
||||
_('Player has just closed the leaderboard view'),
|
||||
_('Display leaderboard'),
|
||||
'JsPlatform/Extensions/leaderboard.svg',
|
||||
'JsPlatform/Extensions/leaderboard.svg'
|
||||
)
|
||||
.setHelpPath('/all-features/leaderboards')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
|
||||
.setFunctionName('gdjs.evtTools.leaderboards.hasPlayerJustClosedLeaderboardView');
|
||||
extension
|
||||
.addCondition(
|
||||
'HasPlayerJustClosedLeaderboardView',
|
||||
_('Closed by player'),
|
||||
_('Check if the player has just closed the leaderboard view.'),
|
||||
_('Player has just closed the leaderboard view'),
|
||||
_('Display leaderboard'),
|
||||
'JsPlatform/Extensions/leaderboard.svg',
|
||||
'JsPlatform/Extensions/leaderboard.svg'
|
||||
)
|
||||
.setHelpPath('/all-features/leaderboards')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/Leaderboards/leaderboardstools.js')
|
||||
.setFunctionName(
|
||||
'gdjs.evtTools.leaderboards.hasPlayerJustClosedLeaderboardView'
|
||||
);
|
||||
|
||||
extension
|
||||
.addStrExpression(
|
||||
|
@@ -24,37 +24,47 @@ namespace gdjs {
|
||||
return shaObj.getHash('B64');
|
||||
};
|
||||
|
||||
// Score saving
|
||||
/**
|
||||
* Hold the state of the save of a score for a leaderboard.
|
||||
*/
|
||||
class ScoreSavingState {
|
||||
lastScoreSavingStartedAt: number | null;
|
||||
lastScoreSavingSucceededAt: number | null;
|
||||
currentlySavingScore: number | null;
|
||||
currentlySavingPlayerName: string | null;
|
||||
currentlySavingPlayerId: string | null;
|
||||
lastSavedScore: number | null;
|
||||
lastSavedPlayerName: string | null;
|
||||
lastSavedPlayerId: string | null;
|
||||
lastSaveError: string | null;
|
||||
isScoreSaving: boolean;
|
||||
hasScoreBeenSaved: boolean;
|
||||
hasScoreSavingErrored: boolean;
|
||||
lastScoreSavingStartedAt: number | null = null;
|
||||
lastScoreSavingSucceededAt: number | null = null;
|
||||
|
||||
constructor() {
|
||||
this.lastScoreSavingStartedAt = null;
|
||||
this.lastScoreSavingSucceededAt = null;
|
||||
this.currentlySavingScore = null;
|
||||
this.currentlySavingPlayerName = null;
|
||||
this.currentlySavingPlayerId = null;
|
||||
this.lastSavedScore = null;
|
||||
this.lastSavedPlayerName = null;
|
||||
this.lastSavedPlayerId = null;
|
||||
this.lastSaveError = null;
|
||||
this.isScoreSaving = false;
|
||||
this.hasScoreBeenSaved = false;
|
||||
this.hasScoreSavingErrored = false;
|
||||
/** The promise that will be resolved when the score saving is done (successfully or not). */
|
||||
lastSavingPromise: Promise<void> | null = null;
|
||||
|
||||
// Score that is being saved:
|
||||
private _currentlySavingScore: number | null = null;
|
||||
private _currentlySavingPlayerName: string | null = null;
|
||||
private _currentlySavingPlayerId: string | null = null;
|
||||
|
||||
// Last score saved with success:
|
||||
private _lastSavedScore: number | null = null;
|
||||
private _lastSavedPlayerName: string | null = null;
|
||||
private _lastSavedPlayerId: string | null = null;
|
||||
|
||||
/** The id of the entry in the leaderboard, for the last score saved with success. */
|
||||
lastSavedLeaderboardEntryId: string | null = null;
|
||||
|
||||
/** Last error that happened when saving the score (useful if `hasScoreSavingErrored` is true). */
|
||||
lastSaveError: string | null = null;
|
||||
|
||||
/** `true` if the last save has finished and succeeded. */
|
||||
hasScoreBeenSaved: boolean = false;
|
||||
|
||||
/** `true` if the last save has finished and failed (check `lastSaveError` then). */
|
||||
hasScoreSavingErrored: boolean = false;
|
||||
|
||||
isSaving(): boolean {
|
||||
return (
|
||||
!!this.lastSavingPromise &&
|
||||
!this.hasScoreBeenSaved &&
|
||||
!this.hasScoreSavingErrored
|
||||
);
|
||||
}
|
||||
|
||||
isSameAsLastScore({
|
||||
private _isSameAsLastScore({
|
||||
playerName,
|
||||
playerId,
|
||||
score,
|
||||
@@ -64,13 +74,13 @@ namespace gdjs {
|
||||
score: number;
|
||||
}): boolean {
|
||||
return (
|
||||
((!!playerName && this.lastSavedPlayerName === playerName) ||
|
||||
(!!playerId && this.lastSavedPlayerId === playerId)) &&
|
||||
this.lastSavedScore === score
|
||||
((!!playerName && this._lastSavedPlayerName === playerName) ||
|
||||
(!!playerId && this._lastSavedPlayerId === playerId)) &&
|
||||
this._lastSavedScore === score
|
||||
);
|
||||
}
|
||||
|
||||
isAlreadySavingThisScore({
|
||||
private _isAlreadySavingThisScore({
|
||||
playerName,
|
||||
playerId,
|
||||
score,
|
||||
@@ -79,15 +89,16 @@ namespace gdjs {
|
||||
playerId?: string;
|
||||
score: number;
|
||||
}): boolean {
|
||||
if (!this.isSaving()) return false;
|
||||
|
||||
return (
|
||||
((!!playerName && this.currentlySavingPlayerName === playerName) ||
|
||||
(!!playerId && this.currentlySavingPlayerId === playerId)) &&
|
||||
this.isScoreSaving &&
|
||||
this.currentlySavingScore === score
|
||||
((!!playerName && this._currentlySavingPlayerName === playerName) ||
|
||||
(!!playerId && this._currentlySavingPlayerId === playerId)) &&
|
||||
this._currentlySavingScore === score
|
||||
);
|
||||
}
|
||||
|
||||
isTooSoonToSaveAnotherScore(): boolean {
|
||||
private _isTooSoonToSaveAnotherScore(): boolean {
|
||||
return (
|
||||
!!this.lastScoreSavingStartedAt &&
|
||||
Date.now() - this.lastScoreSavingStartedAt < 500
|
||||
@@ -102,28 +113,91 @@ namespace gdjs {
|
||||
playerName?: string;
|
||||
playerId?: string;
|
||||
score: number;
|
||||
}): void {
|
||||
}): {
|
||||
closeSaving: (leaderboardEntryId: string | null) => void;
|
||||
closeSavingWithError(errorCode: string);
|
||||
} {
|
||||
if (this._isAlreadySavingThisScore({ playerName, playerId, score })) {
|
||||
logger.warn(
|
||||
'There is already a request to save with this player name and this score. Ignoring this one.'
|
||||
);
|
||||
throw new Error('Ignoring this saving request.');
|
||||
}
|
||||
|
||||
if (this._isSameAsLastScore({ playerName, playerId, score })) {
|
||||
logger.warn(
|
||||
'The player and score to be sent are the same as previous one. Ignoring this one.'
|
||||
);
|
||||
this._setError('SAME_AS_PREVIOUS');
|
||||
throw new Error('Ignoring this saving request.');
|
||||
}
|
||||
|
||||
if (this._isTooSoonToSaveAnotherScore()) {
|
||||
logger.warn(
|
||||
'Last entry was sent too little time ago. Ignoring this one.'
|
||||
);
|
||||
this._setError('TOO_FAST');
|
||||
|
||||
// Set the starting time to cancel all the following attempts that
|
||||
// are started too early after this one.
|
||||
this.lastScoreSavingStartedAt = Date.now();
|
||||
|
||||
throw new Error('Ignoring this saving request.');
|
||||
}
|
||||
|
||||
let resolveSavingPromise: () => void;
|
||||
const savingPromise = new Promise<void>((resolve) => {
|
||||
resolveSavingPromise = resolve;
|
||||
});
|
||||
|
||||
this.lastScoreSavingStartedAt = Date.now();
|
||||
this.isScoreSaving = true;
|
||||
this.lastSavingPromise = savingPromise;
|
||||
this.hasScoreBeenSaved = false;
|
||||
this.hasScoreSavingErrored = false;
|
||||
this.currentlySavingScore = score;
|
||||
if (playerName) this.currentlySavingPlayerName = playerName;
|
||||
if (playerId) this.currentlySavingPlayerId = playerId;
|
||||
this._currentlySavingScore = score;
|
||||
if (playerName) this._currentlySavingPlayerName = playerName;
|
||||
if (playerId) this._currentlySavingPlayerId = playerId;
|
||||
|
||||
return {
|
||||
closeSaving: (leaderboardEntryId) => {
|
||||
if (savingPromise !== this.lastSavingPromise) {
|
||||
logger.info(
|
||||
'Score saving result received, but another save was launched in the meantime - ignoring the result of this one.'
|
||||
);
|
||||
|
||||
// Still finish the promise that can be waited upon:
|
||||
resolveSavingPromise();
|
||||
return;
|
||||
}
|
||||
|
||||
this.lastScoreSavingSucceededAt = Date.now();
|
||||
this._lastSavedScore = this._currentlySavingScore;
|
||||
this._lastSavedPlayerName = this._currentlySavingPlayerName;
|
||||
this._lastSavedPlayerId = this._currentlySavingPlayerId;
|
||||
this.lastSavedLeaderboardEntryId = leaderboardEntryId;
|
||||
this.hasScoreBeenSaved = true;
|
||||
|
||||
resolveSavingPromise();
|
||||
},
|
||||
closeSavingWithError: (errorCode) => {
|
||||
if (savingPromise !== this.lastSavingPromise) {
|
||||
logger.info(
|
||||
'Score saving result received, but another save was launched in the meantime - ignoring the result of this one.'
|
||||
);
|
||||
|
||||
// Still finish the promise that can be waited upon:
|
||||
resolveSavingPromise();
|
||||
return;
|
||||
}
|
||||
|
||||
this._setError(errorCode);
|
||||
resolveSavingPromise();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
closeSaving(): void {
|
||||
this.lastScoreSavingSucceededAt = Date.now();
|
||||
this.lastSavedScore = this.currentlySavingScore;
|
||||
this.lastSavedPlayerName = this.currentlySavingPlayerName;
|
||||
this.lastSavedPlayerId = this.currentlySavingPlayerId;
|
||||
this.isScoreSaving = false;
|
||||
this.hasScoreBeenSaved = true;
|
||||
}
|
||||
|
||||
setError(errorCode: string): void {
|
||||
private _setError(errorCode: string): void {
|
||||
this.lastSaveError = errorCode;
|
||||
this.isScoreSaving = false;
|
||||
this.hasScoreBeenSaved = false;
|
||||
this.hasScoreSavingErrored = true;
|
||||
}
|
||||
@@ -172,6 +246,7 @@ namespace gdjs {
|
||||
}
|
||||
_loaderContainer.appendChild(_loader);
|
||||
|
||||
/** Get the saving state of the leaderboard who had the last update (successful or started). */
|
||||
const getLastScoreSavingState = function ({
|
||||
hasSucceeded,
|
||||
}: {
|
||||
@@ -201,19 +276,17 @@ namespace gdjs {
|
||||
return lastScoreSavingState;
|
||||
};
|
||||
|
||||
const saveScore = function ({
|
||||
const saveScore = async function ({
|
||||
leaderboardId,
|
||||
playerName,
|
||||
authenticatedPlayerData,
|
||||
score,
|
||||
scoreSavingState,
|
||||
runtimeScene,
|
||||
}: {
|
||||
leaderboardId: string;
|
||||
playerName?: string | null;
|
||||
authenticatedPlayerData?: { playerId: string; playerToken: string };
|
||||
score: number;
|
||||
scoreSavingState: ScoreSavingState;
|
||||
runtimeScene: gdjs.RuntimeScene;
|
||||
}) {
|
||||
const rootApi = runtimeScene
|
||||
@@ -242,195 +315,143 @@ namespace gdjs {
|
||||
] = `player-game-token ${authenticatedPlayerData.playerToken}`;
|
||||
leaderboardEntryCreationUrl += `?playerId=${authenticatedPlayerData.playerId}`;
|
||||
} else {
|
||||
// In case playerName is empty or undefined, the formatting will generate a random name.
|
||||
// In case playerName is empty, the backend will generate a random name.
|
||||
payloadObject['playerName'] = formatPlayerName(playerName);
|
||||
}
|
||||
const payload = JSON.stringify(payloadObject);
|
||||
headers['Digest'] = computeDigest(payload);
|
||||
|
||||
fetch(leaderboardEntryCreationUrl, {
|
||||
body: payload,
|
||||
method: 'POST',
|
||||
headers: headers,
|
||||
}).then(
|
||||
(response) => {
|
||||
if (!response.ok) {
|
||||
const errorCode = response.status.toString();
|
||||
logger.error(
|
||||
'Server responded with an error:',
|
||||
errorCode,
|
||||
response.statusText
|
||||
);
|
||||
scoreSavingState.setError(errorCode);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const response = await fetch(leaderboardEntryCreationUrl, {
|
||||
body: payload,
|
||||
method: 'POST',
|
||||
headers: headers,
|
||||
});
|
||||
|
||||
scoreSavingState.closeSaving();
|
||||
|
||||
return response.text().then(
|
||||
(text) => {},
|
||||
(error) => {
|
||||
logger.warn(
|
||||
'An error occurred when reading response but score has been saved:',
|
||||
error
|
||||
);
|
||||
}
|
||||
if (!response.ok) {
|
||||
const errorCode = response.status.toString();
|
||||
logger.error(
|
||||
'Server responded with an error:',
|
||||
errorCode,
|
||||
response.statusText
|
||||
);
|
||||
},
|
||||
(error) => {
|
||||
logger.error('Error while submitting a leaderboard score:', error);
|
||||
const errorCode = 'REQUEST_NOT_SENT';
|
||||
scoreSavingState.setError(errorCode);
|
||||
|
||||
throw errorCode;
|
||||
}
|
||||
);
|
||||
|
||||
let leaderboardEntryId: string | null = null;
|
||||
try {
|
||||
const leaderboardEntry = await response.json();
|
||||
leaderboardEntryId = leaderboardEntry.id;
|
||||
} catch (error) {
|
||||
logger.warn(
|
||||
'An error occurred when reading response but score has been saved:',
|
||||
error
|
||||
);
|
||||
}
|
||||
|
||||
return leaderboardEntryId;
|
||||
} catch (error) {
|
||||
logger.error('Error while submitting a leaderboard score:', error);
|
||||
const errorCode = 'REQUEST_NOT_SENT';
|
||||
|
||||
throw errorCode;
|
||||
}
|
||||
};
|
||||
|
||||
export const savePlayerScore = function (
|
||||
export const savePlayerScore = (
|
||||
runtimeScene: gdjs.RuntimeScene,
|
||||
leaderboardId: string,
|
||||
score: float,
|
||||
playerName: string
|
||||
) {
|
||||
let scoreSavingState: ScoreSavingState;
|
||||
if (_scoreSavingStateByLeaderboard[leaderboardId]) {
|
||||
scoreSavingState = _scoreSavingStateByLeaderboard[leaderboardId];
|
||||
let shouldStartSaving = true;
|
||||
if (
|
||||
shouldStartSaving &&
|
||||
scoreSavingState.isAlreadySavingThisScore({ playerName, score })
|
||||
) {
|
||||
logger.warn(
|
||||
'There is already a request to save with this player name and this score. Ignoring this one.'
|
||||
);
|
||||
shouldStartSaving = false;
|
||||
}
|
||||
) =>
|
||||
new gdjs.PromiseTask(
|
||||
(async () => {
|
||||
const scoreSavingState = (_scoreSavingStateByLeaderboard[
|
||||
leaderboardId
|
||||
] =
|
||||
_scoreSavingStateByLeaderboard[leaderboardId] ||
|
||||
new ScoreSavingState());
|
||||
|
||||
if (
|
||||
shouldStartSaving &&
|
||||
scoreSavingState.isSameAsLastScore({ playerName, score })
|
||||
) {
|
||||
logger.warn(
|
||||
'The player and score to be sent are the same as previous one. Ignoring this one.'
|
||||
);
|
||||
scoreSavingState.setError('SAME_AS_PREVIOUS');
|
||||
shouldStartSaving = false;
|
||||
}
|
||||
try {
|
||||
const {
|
||||
closeSaving,
|
||||
closeSavingWithError,
|
||||
} = scoreSavingState.startSaving({ playerName, score });
|
||||
|
||||
if (
|
||||
shouldStartSaving &&
|
||||
scoreSavingState.isTooSoonToSaveAnotherScore()
|
||||
) {
|
||||
logger.warn(
|
||||
'Last entry was sent too little time ago. Ignoring this one.'
|
||||
);
|
||||
scoreSavingState.setError('TOO_FAST');
|
||||
shouldStartSaving = false;
|
||||
// Set the starting time to cancel all the following attempts that
|
||||
// are started too early after this one.
|
||||
scoreSavingState.lastScoreSavingStartedAt = Date.now();
|
||||
}
|
||||
if (!shouldStartSaving) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
scoreSavingState = new ScoreSavingState();
|
||||
_scoreSavingStateByLeaderboard[leaderboardId] = scoreSavingState;
|
||||
}
|
||||
try {
|
||||
const leaderboardEntryId = await saveScore({
|
||||
leaderboardId,
|
||||
playerName,
|
||||
score,
|
||||
runtimeScene,
|
||||
});
|
||||
closeSaving(leaderboardEntryId);
|
||||
} catch (errorCode) {
|
||||
closeSavingWithError(errorCode);
|
||||
}
|
||||
} catch {
|
||||
// Do nothing: saving was rejected for a reason already logged.
|
||||
}
|
||||
})()
|
||||
);
|
||||
|
||||
scoreSavingState.startSaving({ playerName, score });
|
||||
|
||||
saveScore({
|
||||
leaderboardId,
|
||||
playerName,
|
||||
score,
|
||||
scoreSavingState,
|
||||
runtimeScene,
|
||||
});
|
||||
};
|
||||
|
||||
export const saveConnectedPlayerScore = function (
|
||||
export const saveConnectedPlayerScore = (
|
||||
runtimeScene: gdjs.RuntimeScene,
|
||||
leaderboardId: string,
|
||||
score: float
|
||||
) {
|
||||
let scoreSavingState: ScoreSavingState;
|
||||
const playerId = gdjs.playerAuthentication.getUserId();
|
||||
const playerToken = gdjs.playerAuthentication.getUserToken();
|
||||
if (!playerId || !playerToken) {
|
||||
logger.warn(
|
||||
'Cannot save a score for a connected player if the player is not connected.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (_scoreSavingStateByLeaderboard[leaderboardId]) {
|
||||
scoreSavingState = _scoreSavingStateByLeaderboard[leaderboardId];
|
||||
let shouldStartSaving = true;
|
||||
if (
|
||||
shouldStartSaving &&
|
||||
scoreSavingState.isAlreadySavingThisScore({ playerId, score })
|
||||
) {
|
||||
logger.warn(
|
||||
'There is already a request to save with this player ID and this score. Ignoring this one.'
|
||||
);
|
||||
shouldStartSaving = false;
|
||||
}
|
||||
) =>
|
||||
new gdjs.PromiseTask(
|
||||
(async () => {
|
||||
const playerId = gdjs.playerAuthentication.getUserId();
|
||||
const playerToken = gdjs.playerAuthentication.getUserToken();
|
||||
if (!playerId || !playerToken) {
|
||||
logger.warn(
|
||||
'Cannot save a score for a connected player if the player is not connected.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
shouldStartSaving &&
|
||||
scoreSavingState.isSameAsLastScore({ playerId, score })
|
||||
) {
|
||||
logger.warn(
|
||||
'The player and score to be sent are the same as previous one. Ignoring this one.'
|
||||
);
|
||||
scoreSavingState.setError('SAME_AS_PREVIOUS');
|
||||
shouldStartSaving = false;
|
||||
}
|
||||
const scoreSavingState = (_scoreSavingStateByLeaderboard[
|
||||
leaderboardId
|
||||
] =
|
||||
_scoreSavingStateByLeaderboard[leaderboardId] ||
|
||||
new ScoreSavingState());
|
||||
|
||||
if (
|
||||
shouldStartSaving &&
|
||||
scoreSavingState.isTooSoonToSaveAnotherScore()
|
||||
) {
|
||||
logger.warn(
|
||||
'Last entry was sent too little time ago. Ignoring this one.'
|
||||
);
|
||||
scoreSavingState.setError('TOO_FAST');
|
||||
shouldStartSaving = false;
|
||||
// Set the starting time to cancel all the following attempts that
|
||||
// are started too early after this one.
|
||||
scoreSavingState.lastScoreSavingStartedAt = Date.now();
|
||||
}
|
||||
if (!shouldStartSaving) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
scoreSavingState = new ScoreSavingState();
|
||||
_scoreSavingStateByLeaderboard[leaderboardId] = scoreSavingState;
|
||||
}
|
||||
try {
|
||||
const {
|
||||
closeSaving,
|
||||
closeSavingWithError,
|
||||
} = scoreSavingState.startSaving({ playerId, score });
|
||||
|
||||
scoreSavingState.startSaving({ playerId, score });
|
||||
|
||||
saveScore({
|
||||
leaderboardId,
|
||||
authenticatedPlayerData: { playerId, playerToken },
|
||||
score,
|
||||
scoreSavingState,
|
||||
runtimeScene,
|
||||
});
|
||||
};
|
||||
try {
|
||||
const leaderboardEntryId = await saveScore({
|
||||
leaderboardId,
|
||||
authenticatedPlayerData: { playerId, playerToken },
|
||||
score,
|
||||
runtimeScene,
|
||||
});
|
||||
closeSaving(leaderboardEntryId);
|
||||
} catch (errorCode) {
|
||||
closeSavingWithError(errorCode);
|
||||
}
|
||||
} catch {
|
||||
// Do nothing: saving was rejected for a reason already logged.
|
||||
}
|
||||
})()
|
||||
);
|
||||
|
||||
export const isSaving = function (leaderboardId?: string): boolean {
|
||||
if (leaderboardId) {
|
||||
return _scoreSavingStateByLeaderboard[leaderboardId]
|
||||
? _scoreSavingStateByLeaderboard[leaderboardId].isScoreSaving
|
||||
? _scoreSavingStateByLeaderboard[leaderboardId].isSaving()
|
||||
: false;
|
||||
}
|
||||
|
||||
const lastScoreSavingState = getLastScoreSavingState({
|
||||
hasSucceeded: false,
|
||||
});
|
||||
return lastScoreSavingState
|
||||
? lastScoreSavingState.isScoreSaving
|
||||
: false;
|
||||
return lastScoreSavingState ? lastScoreSavingState.isSaving() : false;
|
||||
};
|
||||
|
||||
export const hasBeenSaved = function (leaderboardId?: string): boolean {
|
||||
@@ -491,9 +512,7 @@ namespace gdjs {
|
||||
typeof rawName !== 'string' ||
|
||||
(typeof rawName === 'string' && rawName.length === 0)
|
||||
) {
|
||||
return `Player${Math.round(
|
||||
(Math.random() * 9 + 1) * 10000 // Number between 10,000 and 99,999
|
||||
)}`;
|
||||
return '';
|
||||
}
|
||||
return rawName
|
||||
.trim()
|
||||
@@ -648,7 +667,7 @@ namespace gdjs {
|
||||
return iframe;
|
||||
};
|
||||
|
||||
export const displayLeaderboard = function (
|
||||
export const displayLeaderboard = async function (
|
||||
runtimeScene: gdjs.RuntimeScene,
|
||||
leaderboardId: string,
|
||||
displayLoader: boolean
|
||||
@@ -682,81 +701,99 @@ namespace gdjs {
|
||||
});
|
||||
}
|
||||
|
||||
// If a save is being done for this leaderboard, wait for it to end so that the `lastSavedLeaderboardEntryId`
|
||||
// can be saved and then used to show the player score.
|
||||
const scoreSavingState = _scoreSavingStateByLeaderboard[leaderboardId];
|
||||
if (scoreSavingState && scoreSavingState.lastSavingPromise) {
|
||||
await scoreSavingState.lastSavingPromise;
|
||||
}
|
||||
|
||||
const lastSavedLeaderboardEntryId = scoreSavingState
|
||||
? scoreSavingState.lastSavedLeaderboardEntryId
|
||||
: null;
|
||||
|
||||
const gameId = gdjs.projectData.properties.projectUuid;
|
||||
const isDev = runtimeScene
|
||||
.getGame()
|
||||
.isUsingGDevelopDevelopmentEnvironment();
|
||||
const targetUrl = `https://gd.games/games/${gameId}/leaderboard/${leaderboardId}?inGameEmbedded=true${
|
||||
isDev ? '&dev=true' : ''
|
||||
}`;
|
||||
checkLeaderboardAvailability(targetUrl).then(
|
||||
(isAvailable) => {
|
||||
if (leaderboardId !== _requestedLeaderboardId) {
|
||||
logger.warn(
|
||||
`Received a response for leaderboard ${leaderboardId} though the last leaderboard requested is ${_requestedLeaderboardId}, ignoring this response.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (!isAvailable) {
|
||||
handleErrorDisplayingLeaderboard(
|
||||
runtimeScene,
|
||||
'Leaderboard data could not be fetched. Closing leaderboard view if there is one.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_leaderboardViewIframe) {
|
||||
resetLeaderboardDisplayErrorTimeout(runtimeScene);
|
||||
if (displayLoader) {
|
||||
displayLoaderInLeaderboardView(true, runtimeScene, {
|
||||
callOnErrorIfDomElementContainerMissing: false,
|
||||
});
|
||||
}
|
||||
_leaderboardViewIframe.src = targetUrl;
|
||||
} else {
|
||||
const domElementContainer = runtimeScene
|
||||
.getGame()
|
||||
.getRenderer()
|
||||
.getDomElementContainer();
|
||||
if (!domElementContainer) {
|
||||
handleErrorDisplayingLeaderboard(
|
||||
runtimeScene,
|
||||
"The div element covering the game couldn't be found, the leaderboard cannot be displayed."
|
||||
);
|
||||
return;
|
||||
}
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.set('inGameEmbedded', 'true');
|
||||
if (isDev) searchParams.set('dev', 'true');
|
||||
if (lastSavedLeaderboardEntryId)
|
||||
searchParams.set(
|
||||
'playerLeaderboardEntryId',
|
||||
lastSavedLeaderboardEntryId
|
||||
);
|
||||
|
||||
resetLeaderboardDisplayErrorTimeout(runtimeScene);
|
||||
const targetUrl = `https://gd.games/games/${gameId}/leaderboard/${leaderboardId}?${searchParams}`;
|
||||
|
||||
_leaderboardViewIframe = computeLeaderboardDisplayingIframe(
|
||||
targetUrl
|
||||
);
|
||||
if (typeof window !== 'undefined') {
|
||||
_leaderboardViewClosingCallback = (event: MessageEvent) => {
|
||||
receiveMessageFromLeaderboardView(
|
||||
runtimeScene,
|
||||
displayLoader,
|
||||
event
|
||||
);
|
||||
};
|
||||
(window as any).addEventListener(
|
||||
'message',
|
||||
_leaderboardViewClosingCallback,
|
||||
true
|
||||
);
|
||||
}
|
||||
domElementContainer.appendChild(_leaderboardViewIframe);
|
||||
}
|
||||
},
|
||||
(err) => {
|
||||
logger.error(err);
|
||||
handleErrorDisplayingLeaderboard(
|
||||
runtimeScene,
|
||||
'An error occurred when fetching leaderboard data. Closing leaderboard view if there is one.'
|
||||
try {
|
||||
const isAvailable = await checkLeaderboardAvailability(targetUrl);
|
||||
|
||||
if (leaderboardId !== _requestedLeaderboardId) {
|
||||
logger.warn(
|
||||
`Received a response for leaderboard ${leaderboardId} though the last leaderboard requested is ${_requestedLeaderboardId}, ignoring this response.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
);
|
||||
if (!isAvailable) {
|
||||
handleErrorDisplayingLeaderboard(
|
||||
runtimeScene,
|
||||
'Leaderboard data could not be fetched. Closing leaderboard view if there is one.'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_leaderboardViewIframe) {
|
||||
resetLeaderboardDisplayErrorTimeout(runtimeScene);
|
||||
if (displayLoader) {
|
||||
displayLoaderInLeaderboardView(true, runtimeScene, {
|
||||
callOnErrorIfDomElementContainerMissing: false,
|
||||
});
|
||||
}
|
||||
_leaderboardViewIframe.src = targetUrl;
|
||||
} else {
|
||||
const domElementContainer = runtimeScene
|
||||
.getGame()
|
||||
.getRenderer()
|
||||
.getDomElementContainer();
|
||||
if (!domElementContainer) {
|
||||
handleErrorDisplayingLeaderboard(
|
||||
runtimeScene,
|
||||
"The div element covering the game couldn't be found, the leaderboard cannot be displayed."
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
resetLeaderboardDisplayErrorTimeout(runtimeScene);
|
||||
|
||||
_leaderboardViewIframe = computeLeaderboardDisplayingIframe(
|
||||
targetUrl
|
||||
);
|
||||
if (typeof window !== 'undefined') {
|
||||
_leaderboardViewClosingCallback = (event: MessageEvent) => {
|
||||
receiveMessageFromLeaderboardView(
|
||||
runtimeScene,
|
||||
displayLoader,
|
||||
event
|
||||
);
|
||||
};
|
||||
(window as any).addEventListener(
|
||||
'message',
|
||||
_leaderboardViewClosingCallback,
|
||||
true
|
||||
);
|
||||
}
|
||||
domElementContainer.appendChild(_leaderboardViewIframe);
|
||||
}
|
||||
} catch (err) {
|
||||
logger.error(err);
|
||||
handleErrorDisplayingLeaderboard(
|
||||
runtimeScene,
|
||||
'An error occurred when fetching leaderboard data. Closing leaderboard view if there is one.'
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export const isLeaderboardViewErrored = function (): boolean {
|
||||
|
@@ -29,26 +29,14 @@ describe('Leaderboards', () => {
|
||||
});
|
||||
|
||||
it('it generates a predefined player name with a random number if input is void/wrong type/empty', () => {
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(null)).to.be('');
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(undefined)).to.be('');
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName('')).to.be('');
|
||||
|
||||
// @ts-ignore
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(null)).to.match(
|
||||
/^Player\d{5}/
|
||||
);
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(5)).to.be('');
|
||||
// @ts-ignore
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(5)).to.match(
|
||||
/^Player\d{5}/
|
||||
);
|
||||
// @ts-ignore
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(undefined)).to.match(
|
||||
/^Player\d{5}/
|
||||
);
|
||||
// @ts-ignore
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(() => {})).to.match(
|
||||
/^Player\d{5}/
|
||||
);
|
||||
// @ts-ignore
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName('')).to.match(
|
||||
/^Player\d{5}/
|
||||
);
|
||||
expect(gdjs.evtTools.leaderboards.formatPlayerName(() => {})).to.be('');
|
||||
});
|
||||
|
||||
it('it removes accents from latin letters', () => {
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(LinkedObjects)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(LinkedObjects)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(LinkedObjects "${source_files}")
|
||||
gd_add_extension_target(LinkedObjects "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
gd_extension_link_libraries(LinkedObjects)
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(LinkedObjects)
|
||||
|
@@ -26,23 +26,18 @@ class LinkedObjectsJsExtension : public gd::PlatformExtension {
|
||||
DeclareLinkedObjectsExtension(*this);
|
||||
|
||||
GetAllActions()["LinkedObjects::LinkObjects"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/LinkedObjects/linkedobjects.js")
|
||||
.SetFunctionName("gdjs.evtTools.linkedObjects.linkObjects");
|
||||
GetAllActions()["LinkedObjects::RemoveLinkBetween"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/LinkedObjects/linkedobjects.js")
|
||||
.SetFunctionName("gdjs.evtTools.linkedObjects.removeLinkBetween");
|
||||
GetAllActions()["LinkedObjects::RemoveAllLinksOf"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/LinkedObjects/linkedobjects.js")
|
||||
.SetFunctionName("gdjs.evtTools.linkedObjects.removeAllLinksOf");
|
||||
GetAllActions()["LinkedObjects::PickObjectsLinkedTo"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/LinkedObjects/linkedobjects.js")
|
||||
.SetFunctionName("gdjs.evtTools.linkedObjects.pickObjectsLinkedTo");
|
||||
GetAllConditions()["LinkedObjects::PickObjectsLinkedTo"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/LinkedObjects/linkedobjects.js")
|
||||
.SetFunctionName("gdjs.evtTools.linkedObjects.pickObjectsLinkedTo");
|
||||
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(PanelSpriteObject)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(PanelSpriteObject)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(PanelSpriteObject "${source_files}")
|
||||
gd_add_extension_target(PanelSpriteObject "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(PanelSpriteObject)
|
||||
|
@@ -1,21 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(ParticleSystem)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(ParticleSystem)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(ParticleSystem "${source_files}")
|
||||
gd_add_extension_target(ParticleSystem "${source_files}")
|
||||
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(ParticleSystem)
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(PathfindingBehavior)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(PathfindingBehavior)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(PathfindingBehavior "${source_files}")
|
||||
gd_add_extension_target(PathfindingBehavior "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(PathfindingBehavior)
|
||||
|
@@ -1,21 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(PhysicsBehavior)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(PhysicsBehavior)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(PhysicsBehavior "${source_files}")
|
||||
gd_add_extension_target(PhysicsBehavior "${source_files}")
|
||||
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(PhysicsBehavior)
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(PlatformBehavior)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(PlatformBehavior)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(PlatformBehavior "${source_files}")
|
||||
gd_add_extension_target(PlatformBehavior "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
gd_extension_link_libraries(PlatformBehavior)
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(PlatformBehavior)
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(PrimitiveDrawing)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(PrimitiveDrawing)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(PrimitiveDrawing "${source_files}")
|
||||
gd_add_extension_target(PrimitiveDrawing "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(PrimitiveDrawing)
|
||||
|
@@ -1,21 +1,26 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(Shopify)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(Shopify)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
|
||||
gd_add_extension_target(Shopify "${source_files}" "JsPlatform")
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_extension_target(
|
||||
Shopify
|
||||
"${source_files}"
|
||||
"JsPlatform")
|
||||
gd_add_clang_utils(Shopify "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(Shopify)
|
||||
|
@@ -81,12 +81,10 @@ class ShopifyJsExtension : public gd::PlatformExtension {
|
||||
DeclareShopifyExtension(*this);
|
||||
|
||||
GetAllActions()["Shopify::BuildClient"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Shopify/shopify-buy.umd.polyfilled.min.js")
|
||||
.AddIncludeFile("Extensions/Shopify/shopifytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.shopify.buildClient");
|
||||
GetAllActions()["Shopify::GetCheckoutUrlForProduct"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/Shopify/shopify-buy.umd.polyfilled.min.js")
|
||||
.AddIncludeFile("Extensions/Shopify/shopifytools.js")
|
||||
.SetFunctionName("gdjs.evtTools.shopify.getCheckoutUrlForProduct");
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,63 +0,0 @@
|
||||
namespace gdjs {
|
||||
export namespace steamworks {
|
||||
gdjs.registerFirstRuntimeSceneLoadedCallback(() => {
|
||||
if (gdjs.steamworks.steamAPI) gdjs.steamworks.steamAPI.input.init();
|
||||
});
|
||||
|
||||
export function getControllerCount(): integer {
|
||||
return gdjs.steamworks.steamAPI
|
||||
? gdjs.steamworks.steamAPI.input.getControllers().length
|
||||
: 0;
|
||||
}
|
||||
|
||||
export function activateActionSet(
|
||||
controllerIndex: number,
|
||||
actionSetName: string
|
||||
): void {
|
||||
if (!gdjs.steamworks.steamAPI) return;
|
||||
gdjs.steamworks.steamAPI.input
|
||||
.getControllers()
|
||||
[controllerIndex]?.activateActionSet(
|
||||
gdjs.steamworks.steamAPI.input.getActionSet(actionSetName)
|
||||
);
|
||||
}
|
||||
|
||||
export function isDigitalActionPressed(
|
||||
controllerIndex: number,
|
||||
actionName: string
|
||||
): boolean {
|
||||
if (!gdjs.steamworks.steamAPI) return false;
|
||||
return !!gdjs.steamworks.steamAPI.input
|
||||
.getControllers()
|
||||
[controllerIndex]?.isDigitalActionPressed(
|
||||
gdjs.steamworks.steamAPI.input.getDigitalAction(actionName)
|
||||
);
|
||||
}
|
||||
|
||||
export function getAnalogActionVectorX(
|
||||
controllerIndex: number,
|
||||
actionName: string
|
||||
): float {
|
||||
return gdjs.steamworks.steamAPI
|
||||
? gdjs.steamworks.steamAPI.input
|
||||
.getControllers()
|
||||
[controllerIndex]?.getAnalogActionVector(
|
||||
gdjs.steamworks.steamAPI.input.getAnalogAction(actionName)
|
||||
).x ?? 0
|
||||
: 0;
|
||||
}
|
||||
|
||||
export function getAnalogActionVectorY(
|
||||
controllerIndex: number,
|
||||
actionName: string
|
||||
): float {
|
||||
return gdjs.steamworks.steamAPI
|
||||
? gdjs.steamworks.steamAPI.input
|
||||
.getControllers()
|
||||
[controllerIndex]?.getAnalogActionVector(
|
||||
gdjs.steamworks.steamAPI.input.getAnalogAction(actionName)
|
||||
).y ?? 0
|
||||
: 0;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,566 +0,0 @@
|
||||
namespace gdjs {
|
||||
export namespace steamworks {
|
||||
const logger = new gdjs.Logger('Steamworks');
|
||||
export let steamAPI: import('steamworks.js').Client | null = null;
|
||||
|
||||
gdjs.registerFirstRuntimeSceneLoadedCallback((runtimeScene) => {
|
||||
const remote = runtimeScene.getGame().getRenderer().getElectronRemote();
|
||||
if (!remote) return; // Steamworks is only supported on electron
|
||||
const steamworks_js = remote.require(
|
||||
'steamworks.js'
|
||||
) as typeof import('steamworks.js');
|
||||
|
||||
// Sets the proper electron flags for the steam overlay to function properly
|
||||
steamworks_js.electronEnableSteamOverlay();
|
||||
|
||||
const unparsedAppID = runtimeScene
|
||||
.getGame()
|
||||
.getExtensionProperty('Steamworks', 'AppID');
|
||||
|
||||
if (!unparsedAppID) {
|
||||
logger.error(
|
||||
'A steam AppID needs to be configured in the game properties for steamworks features to be used!'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const appID = parseInt(unparsedAppID, 10);
|
||||
|
||||
// Restart the game through steam if it needs to be launched with steam but has not been
|
||||
if (
|
||||
runtimeScene
|
||||
.getGame()
|
||||
.getExtensionProperty('Steamworks', 'RequireSteam') &&
|
||||
!runtimeScene.getGame().isPreview() &&
|
||||
steamworks_js.restartAppIfNecessary(appID)
|
||||
) {
|
||||
remote.process.exit(1);
|
||||
return;
|
||||
}
|
||||
|
||||
steamAPI = steamworks_js.init(appID);
|
||||
});
|
||||
|
||||
// ---
|
||||
|
||||
export function claimAchievement(achievement: string): void {
|
||||
if (steamAPI) steamAPI.achievement.activate(achievement);
|
||||
else
|
||||
logger.warn(
|
||||
`Could not claim achievement ${achievement}, steamworks was not properly loaded!`
|
||||
);
|
||||
}
|
||||
|
||||
export function unclaimAchievement(achievement: string): void {
|
||||
if (steamAPI) steamAPI.achievement.clear(achievement);
|
||||
else
|
||||
logger.warn(
|
||||
`Could not unclaim achievement ${achievement}, steamworks was not properly loaded!`
|
||||
);
|
||||
}
|
||||
|
||||
export function hasAchievement(achievement: string): boolean {
|
||||
return !!steamAPI && steamAPI.achievement.isActivated(achievement);
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
export function getSteamId(): string {
|
||||
return steamAPI
|
||||
? steamAPI.localplayer.getSteamId().steamId64.toString(10)
|
||||
: '';
|
||||
}
|
||||
|
||||
export function getName(): string {
|
||||
return steamAPI ? steamAPI.localplayer.getName() : 'Unknown';
|
||||
}
|
||||
|
||||
export function getCountry(): string {
|
||||
return steamAPI ? steamAPI.localplayer.getIpCountry() : 'Unknown';
|
||||
}
|
||||
|
||||
export function getLevel(): number {
|
||||
return steamAPI ? steamAPI.localplayer.getLevel() : 0;
|
||||
}
|
||||
|
||||
export function setRichPresence(key: string, value: string): void {
|
||||
if (steamAPI) steamAPI.localplayer.setRichPresence(key, value);
|
||||
else
|
||||
logger.warn(
|
||||
`Could not set the rich presence, steamworks was not properly loaded!`
|
||||
);
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
export function isSteamworksProperlyLoaded(): boolean {
|
||||
return !!steamAPI;
|
||||
}
|
||||
|
||||
export function getAppID(): number {
|
||||
return steamAPI ? steamAPI.utils.getAppId() : 0;
|
||||
}
|
||||
|
||||
export function getServerRealTime(): number {
|
||||
return steamAPI ? steamAPI.utils.getServerRealTime() : Date.now();
|
||||
}
|
||||
|
||||
export function isOnSteamDeck(): boolean {
|
||||
return steamAPI ? steamAPI.utils.isSteamRunningOnSteamDeck() : false;
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
enum LobbyType {
|
||||
Private = 0,
|
||||
FriendsOnly = 1,
|
||||
Public = 2,
|
||||
Invisible = 3,
|
||||
}
|
||||
|
||||
const knownLobbies = new Map<
|
||||
string,
|
||||
import('steamworks.js/client').matchmaking.Lobby
|
||||
>();
|
||||
let currentLobby:
|
||||
| import('steamworks.js/client').matchmaking.Lobby
|
||||
| null = null;
|
||||
|
||||
export function getKnownLobby(lobbyId: string) {
|
||||
if (!steamAPI) {
|
||||
logger.warn(
|
||||
`Could not access lobby '${lobbyId}', steamworks was not properly loaded!`
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
const lobby = knownLobbies.get(lobbyId);
|
||||
if (!lobby) {
|
||||
logger.error(
|
||||
`Could not access lobby '${lobbyId}'! You might need to join it before trying to access it.`
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
return lobby;
|
||||
}
|
||||
|
||||
export function createLobby(
|
||||
lobbyType: 'Private' | 'FriendsOnly' | 'Public' | 'Invisible',
|
||||
maxPlayers: number,
|
||||
result: gdjs.Variable
|
||||
): gdjs.AsyncTask {
|
||||
if (steamAPI) {
|
||||
return new gdjs.PromiseTask(
|
||||
steamAPI.matchmaking
|
||||
.createLobby(
|
||||
LobbyType[lobbyType] as any /* Const enums are 😩 */,
|
||||
maxPlayers
|
||||
)
|
||||
.then((lobby) => {
|
||||
const id = lobby.id.toString(10);
|
||||
knownLobbies.set(id, lobby);
|
||||
currentLobby = lobby;
|
||||
result.setString(id);
|
||||
})
|
||||
.catch(() => {
|
||||
result.setString('failure');
|
||||
})
|
||||
);
|
||||
} else {
|
||||
logger.warn(
|
||||
`Could not create a lobby, steamworks was not properly loaded!`
|
||||
);
|
||||
return new gdjs.ResolveTask();
|
||||
}
|
||||
}
|
||||
|
||||
export function getLobbiesList(results: gdjs.Variable): gdjs.AsyncTask {
|
||||
if (steamAPI) {
|
||||
return new gdjs.PromiseTask(
|
||||
steamAPI.matchmaking
|
||||
.getLobbies()
|
||||
.then((lobbies) => {
|
||||
const allLobbiesIds = lobbies.map((lobby) => {
|
||||
const id = lobby.id.toString(10);
|
||||
knownLobbies.set(id, lobby);
|
||||
return id;
|
||||
});
|
||||
results.fromJSObject(allLobbiesIds);
|
||||
})
|
||||
.catch(() => {
|
||||
results.setString('failure');
|
||||
})
|
||||
);
|
||||
} else {
|
||||
logger.warn(
|
||||
`Could not obtain the lobbies list, steamworks was not properly loaded!`
|
||||
);
|
||||
return new gdjs.ResolveTask();
|
||||
}
|
||||
}
|
||||
|
||||
export function joinLobby(
|
||||
lobbyId: string,
|
||||
result: gdjs.Variable
|
||||
): gdjs.AsyncTask {
|
||||
if (steamAPI) {
|
||||
return new gdjs.PromiseTask(
|
||||
steamAPI.matchmaking
|
||||
.joinLobby(BigInt(lobbyId))
|
||||
.then((lobby) => {
|
||||
knownLobbies.set(lobbyId, lobby);
|
||||
currentLobby = lobby;
|
||||
result.setString(lobbyId);
|
||||
})
|
||||
.catch(() => {
|
||||
result.setString('failure');
|
||||
})
|
||||
);
|
||||
} else {
|
||||
logger.warn(
|
||||
`Could not join a lobby, steamworks was not properly loaded!`
|
||||
);
|
||||
return new gdjs.ResolveTask();
|
||||
}
|
||||
}
|
||||
|
||||
export function getCurrentLobbyId(): string {
|
||||
return currentLobby ? currentLobby.id.toString(10) : 'none';
|
||||
}
|
||||
|
||||
export function leaveCurrentLobby(): void {
|
||||
if (currentLobby) currentLobby.leave();
|
||||
}
|
||||
|
||||
export function openDialogForInvitingUsersToTheCurrentLobby(): void {
|
||||
if (currentLobby) currentLobby.openInviteDialog();
|
||||
}
|
||||
|
||||
export function getCurrentLobbyAttribute(attribute: string): string {
|
||||
if (!currentLobby) return '';
|
||||
|
||||
const data = currentLobby.getData(attribute);
|
||||
return data === null ? '' : data;
|
||||
}
|
||||
|
||||
export function getLobbyAttribute(
|
||||
lobbyId: string,
|
||||
attribute: string
|
||||
): string {
|
||||
const lobby = getKnownLobby(lobbyId);
|
||||
if (!lobby) return '';
|
||||
|
||||
const data = lobby.getData(attribute);
|
||||
return data === null ? '' : data;
|
||||
}
|
||||
|
||||
export function setCurrentLobbyAttribute(
|
||||
attribute: string,
|
||||
value: string,
|
||||
success: gdjs.Variable
|
||||
): void {
|
||||
if (currentLobby)
|
||||
success.setBoolean(currentLobby.setData(attribute, value));
|
||||
}
|
||||
|
||||
export function setCurrentLobbyJoinability(
|
||||
shouldBeJoinable: boolean,
|
||||
success: gdjs.Variable
|
||||
): void {
|
||||
if (currentLobby)
|
||||
success.setBoolean(currentLobby.setJoinable(shouldBeJoinable));
|
||||
}
|
||||
|
||||
export function getCurrentLobbyMemberCount(): number {
|
||||
return currentLobby ? Number(currentLobby.getMemberCount()) : 0;
|
||||
}
|
||||
|
||||
export function getLobbyMemberCount(lobbyId: string): number {
|
||||
const lobby = getKnownLobby(lobbyId);
|
||||
return lobby ? Number(lobby.getMemberCount()) : 0;
|
||||
}
|
||||
|
||||
export function getCurrentLobbyMemberLimit(): number {
|
||||
return currentLobby ? Number(currentLobby.getMemberLimit()) : 0;
|
||||
}
|
||||
|
||||
export function getLobbyMemberLimit(lobbyId: string): number {
|
||||
const lobby = getKnownLobby(lobbyId);
|
||||
if (!lobby) return 0;
|
||||
return lobby ? Number(lobby.getMemberLimit()) : 0;
|
||||
}
|
||||
|
||||
export function getCurrentLobbyOwner(): string {
|
||||
return currentLobby ? currentLobby.getOwner().steamId64.toString(10) : '';
|
||||
}
|
||||
|
||||
export function getLobbyOwner(lobbyId: string): string {
|
||||
const lobby = getKnownLobby(lobbyId);
|
||||
return lobby ? lobby.getOwner().steamId64.toString(10) : '';
|
||||
}
|
||||
|
||||
export function getCurrentLobbyMembersList(storeIn: gdjs.Variable): void {
|
||||
if (currentLobby) {
|
||||
storeIn.fromJSObject(
|
||||
currentLobby
|
||||
.getMembers()
|
||||
.map((steamID) => steamID.steamId64.toString(10))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function getLobbyMembersList(
|
||||
lobbyId: string,
|
||||
storeIn: gdjs.Variable
|
||||
): void {
|
||||
const lobby = getKnownLobby(lobbyId);
|
||||
if (lobby) {
|
||||
storeIn.fromJSObject(
|
||||
lobby.getMembers().map((steamID) => steamID.steamId64.toString(10))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
export function isAppOwned(appId: string): boolean {
|
||||
return !!steamAPI && steamAPI.apps.isSubscribedApp(Number(appId));
|
||||
}
|
||||
|
||||
export function isAppInstalled(appId: string): boolean {
|
||||
return !!steamAPI && steamAPI.apps.isAppInstalled(Number(appId));
|
||||
}
|
||||
|
||||
export function isDLCInstalled(dlcId: string): boolean {
|
||||
return !!steamAPI && steamAPI.apps.isDlcInstalled(Number(dlcId));
|
||||
}
|
||||
|
||||
export function getAppInstallDirectory(appId: string): string {
|
||||
return steamAPI ? steamAPI.apps.appInstallDir(Number(appId)) : '';
|
||||
}
|
||||
|
||||
export function isVacBanned(): boolean {
|
||||
return !!steamAPI && steamAPI.apps.isVacBanned();
|
||||
}
|
||||
|
||||
export function isLowViolence(): boolean {
|
||||
return !!steamAPI && steamAPI.apps.isLowViolence();
|
||||
}
|
||||
|
||||
export function userBoughtTheGame(): boolean {
|
||||
return !!steamAPI && steamAPI.apps.isSubscribed();
|
||||
}
|
||||
|
||||
export function currentGameLanguage(): string {
|
||||
return steamAPI ? steamAPI.apps.currentGameLanguage() : '';
|
||||
}
|
||||
|
||||
export function currentBetaName(): string {
|
||||
return steamAPI ? steamAPI.apps.currentBetaName() || '' : '';
|
||||
}
|
||||
|
||||
export function getBuildId(): number {
|
||||
return steamAPI ? steamAPI.apps.appBuildId() : 0;
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
export function isCloudEnabled(): boolean {
|
||||
return (
|
||||
!!steamAPI &&
|
||||
steamAPI.cloud.isEnabledForAccount() &&
|
||||
steamAPI.cloud.isEnabledForApp()
|
||||
);
|
||||
}
|
||||
|
||||
export function readFile(fileName: string): string {
|
||||
return steamAPI ? steamAPI.cloud.readFile(fileName) : '';
|
||||
}
|
||||
|
||||
export function writeFile(
|
||||
fileName: string,
|
||||
content: string,
|
||||
results: gdjs.Variable
|
||||
): void {
|
||||
if (steamAPI)
|
||||
results.setBoolean(steamAPI.cloud.writeFile(fileName, content));
|
||||
}
|
||||
|
||||
export function fileExists(fileName: string): boolean {
|
||||
return steamAPI ? steamAPI.cloud.fileExists(fileName) : false;
|
||||
}
|
||||
|
||||
export function deleteFile(fileName: string, results: gdjs.Variable): void {
|
||||
if (steamAPI) results.setBoolean(steamAPI.cloud.deleteFile(fileName));
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
export function createWorkshopItem(result: gdjs.Variable): gdjs.AsyncTask {
|
||||
if (steamAPI)
|
||||
return new gdjs.PromiseTask(
|
||||
steamAPI.workshop
|
||||
.createItem()
|
||||
.then(({ itemId }) => {
|
||||
result.setString(itemId.toString());
|
||||
})
|
||||
.catch(() => {
|
||||
result.setString('failure');
|
||||
})
|
||||
);
|
||||
else {
|
||||
result.setString('failure');
|
||||
return new gdjs.ResolveTask();
|
||||
}
|
||||
}
|
||||
|
||||
enum UgcItemVisibility {
|
||||
Public = 0,
|
||||
FriendsOnly = 1,
|
||||
Private = 2,
|
||||
Unlisted = 3,
|
||||
}
|
||||
|
||||
export function updateWorkshopItem(
|
||||
itemId: string,
|
||||
title: string,
|
||||
description: string,
|
||||
changeNote: string,
|
||||
previewPath: string,
|
||||
contentPath: string,
|
||||
tags: string,
|
||||
visibility: keyof import('steamworks.js/client').workshop.UgcItemVisibility,
|
||||
result: gdjs.Variable
|
||||
): gdjs.AsyncTask {
|
||||
if (steamAPI) {
|
||||
const changes: import('steamworks.js/client').workshop.UgcUpdate = {};
|
||||
|
||||
if (title) changes.title = title;
|
||||
if (description) changes.description = description;
|
||||
if (changeNote) changes.changeNote = changeNote;
|
||||
if (previewPath) changes.previewPath = previewPath;
|
||||
if (contentPath) changes.contentPath = contentPath;
|
||||
if (tags) changes.tags = tags.split(',');
|
||||
if (visibility)
|
||||
//@ts-ignore const enum 😩
|
||||
changes.visibility = UgcItemVisibility[visibility];
|
||||
|
||||
return new gdjs.PromiseTask(
|
||||
steamAPI.workshop
|
||||
.updateItem(BigInt(itemId), changes)
|
||||
.then(() => {
|
||||
result.setBoolean(true);
|
||||
})
|
||||
.catch(() => {
|
||||
result.setBoolean(false);
|
||||
})
|
||||
);
|
||||
} else {
|
||||
result.setBoolean(false);
|
||||
return new gdjs.ResolveTask();
|
||||
}
|
||||
}
|
||||
|
||||
export function subscribeToWorkshopItem(
|
||||
itemId: string,
|
||||
result: gdjs.Variable
|
||||
): gdjs.AsyncTask {
|
||||
if (steamAPI)
|
||||
return new gdjs.PromiseTask(
|
||||
steamAPI.workshop
|
||||
.subscribe(BigInt(itemId))
|
||||
.then(() => {
|
||||
result.setBoolean(true);
|
||||
})
|
||||
.catch(() => {
|
||||
result.setBoolean(false);
|
||||
})
|
||||
);
|
||||
else {
|
||||
result.setBoolean(false);
|
||||
return new gdjs.ResolveTask();
|
||||
}
|
||||
}
|
||||
|
||||
export function unsubscribeToWorkshopItem(
|
||||
itemId: string,
|
||||
result: gdjs.Variable
|
||||
): gdjs.AsyncTask {
|
||||
if (steamAPI)
|
||||
return new gdjs.PromiseTask(
|
||||
steamAPI.workshop
|
||||
.unsubscribe(BigInt(itemId))
|
||||
.then(() => {
|
||||
result.setBoolean(true);
|
||||
})
|
||||
.catch(() => {
|
||||
result.setBoolean(false);
|
||||
})
|
||||
);
|
||||
else {
|
||||
result.setBoolean(false);
|
||||
return new gdjs.ResolveTask();
|
||||
}
|
||||
}
|
||||
|
||||
export function startWorkshopDownload(
|
||||
itemId: string,
|
||||
highPriority: boolean
|
||||
): void {
|
||||
if (steamAPI) steamAPI.workshop.download(BigInt(itemId), highPriority);
|
||||
}
|
||||
|
||||
enum WorkshopItemStates {
|
||||
None = 0,
|
||||
Subscribed = 1,
|
||||
LegacyItem = 2,
|
||||
Installed = 4,
|
||||
NeedsUpdate = 8,
|
||||
Downloading = 16,
|
||||
DownloadPending = 32,
|
||||
}
|
||||
|
||||
export function workshopItemState(
|
||||
itemId: string,
|
||||
state: keyof WorkshopItemStates
|
||||
): boolean {
|
||||
return (
|
||||
!!steamAPI &&
|
||||
(steamAPI.workshop.state(BigInt(itemId)) &
|
||||
WorkshopItemStates[state]) !==
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
export function getWorkshopItemLocation(itemId: string): string {
|
||||
return steamAPI
|
||||
? steamAPI.workshop.installInfo(BigInt(itemId))?.folder || ''
|
||||
: '';
|
||||
}
|
||||
|
||||
export function getWorkshopItemSizeOnDisk(itemId: string): number {
|
||||
return steamAPI
|
||||
? Number(steamAPI.workshop.installInfo(BigInt(itemId))?.sizeOnDisk) || 0
|
||||
: 0;
|
||||
}
|
||||
|
||||
export function getWorkshopItemInstallTimestamp(itemId: string): number {
|
||||
return steamAPI
|
||||
? steamAPI.workshop.installInfo(BigInt(itemId))?.timestamp || 0
|
||||
: 0;
|
||||
}
|
||||
|
||||
export function getWorkshopItemDownloadProgress(itemId: string): number {
|
||||
return steamAPI
|
||||
? Number(steamAPI.workshop.downloadInfo(BigInt(itemId))?.current) || 0
|
||||
: 0;
|
||||
}
|
||||
|
||||
export function getWorkshopItemDownloadTotal(itemId: string): number {
|
||||
return steamAPI
|
||||
? Number(steamAPI.workshop.downloadInfo(BigInt(itemId))?.total) || 0
|
||||
: 0;
|
||||
}
|
||||
}
|
||||
}
|
362
Extensions/Steamworks/types.d.ts
vendored
362
Extensions/Steamworks/types.d.ts
vendored
@@ -1,362 +0,0 @@
|
||||
declare module 'steamworks.js/client' {
|
||||
export function init(appId: number): void;
|
||||
export function restartAppIfNecessary(appId: number): boolean;
|
||||
export function runCallbacks(): void;
|
||||
export interface PlayerSteamId {
|
||||
steamId64: bigint;
|
||||
steamId32: string;
|
||||
accountId: number;
|
||||
}
|
||||
export namespace achievement {
|
||||
export function activate(achievement: string): boolean;
|
||||
export function isActivated(achievement: string): boolean;
|
||||
export function clear(achievement: string): boolean;
|
||||
}
|
||||
export namespace apps {
|
||||
export function isSubscribedApp(appId: number): boolean;
|
||||
export function isAppInstalled(appId: number): boolean;
|
||||
export function isDlcInstalled(appId: number): boolean;
|
||||
export function isSubscribedFromFreeWeekend(): boolean;
|
||||
export function isVacBanned(): boolean;
|
||||
export function isCybercafe(): boolean;
|
||||
export function isLowViolence(): boolean;
|
||||
export function isSubscribed(): boolean;
|
||||
export function appBuildId(): number;
|
||||
export function appInstallDir(appId: number): string;
|
||||
export function appOwner(): PlayerSteamId;
|
||||
export function availableGameLanguages(): Array<string>;
|
||||
export function currentGameLanguage(): string;
|
||||
export function currentBetaName(): string | null;
|
||||
}
|
||||
export namespace auth {
|
||||
/** @param timeoutSeconds - The number of seconds to wait for the ticket to be validated. Default value is 10 seconds. */
|
||||
export function getSessionTicket(
|
||||
timeoutSeconds?: number | undefined | null
|
||||
): Promise<Ticket>;
|
||||
export class Ticket {
|
||||
cancel(): void;
|
||||
getBytes(): Buffer;
|
||||
}
|
||||
}
|
||||
|
||||
export const enum ChatMemberStateChange {
|
||||
/** This user has joined or is joining the lobby. */
|
||||
Entered,
|
||||
/** This user has left or is leaving the lobby. */
|
||||
Left,
|
||||
/** User disconnected without leaving the lobby first. */
|
||||
Disconnected,
|
||||
/** The user has been kicked. */
|
||||
Kicked,
|
||||
/** The user has been kicked and banned. */
|
||||
Banned,
|
||||
}
|
||||
|
||||
export interface CallbackReturns {
|
||||
[callback.SteamCallback.PersonaStateChange]: {
|
||||
steam_id: bigint;
|
||||
flags: { bits: number };
|
||||
};
|
||||
[callback.SteamCallback.SteamServersConnected]: {};
|
||||
[callback.SteamCallback.SteamServersDisconnected]: {
|
||||
reason: number;
|
||||
};
|
||||
[callback.SteamCallback.SteamServerConnectFailure]: {
|
||||
reason: number;
|
||||
still_retrying: boolean;
|
||||
};
|
||||
[callback.SteamCallback.LobbyDataUpdate]: {
|
||||
lobby: bigint;
|
||||
member: bigint;
|
||||
success: boolean;
|
||||
};
|
||||
[callback.SteamCallback.LobbyChatUpdate]: {
|
||||
lobby: bigint;
|
||||
user_changed: bigint;
|
||||
making_change: bigint;
|
||||
member_state_change: ChatMemberStateChange;
|
||||
};
|
||||
[callback.SteamCallback.P2PSessionRequest]: {
|
||||
remote: bigint;
|
||||
};
|
||||
[callback.SteamCallback.P2PSessionConnectFail]: {
|
||||
remote: bigint;
|
||||
error: number;
|
||||
};
|
||||
[callback.SteamCallback.GameLobbyJoinRequested]: {
|
||||
lobby_steam_id: bigint;
|
||||
friend_steam_id: bigint;
|
||||
};
|
||||
[callback.SteamCallback.MicroTxnAuthorizationResponse]: {
|
||||
app_id: number;
|
||||
order_id: number | bigint;
|
||||
authorized: boolean;
|
||||
};
|
||||
}
|
||||
|
||||
export namespace callback {
|
||||
export const enum SteamCallback {
|
||||
PersonaStateChange = 0,
|
||||
SteamServersConnected = 1,
|
||||
SteamServersDisconnected = 2,
|
||||
SteamServerConnectFailure = 3,
|
||||
LobbyDataUpdate = 4,
|
||||
LobbyChatUpdate = 5,
|
||||
P2PSessionRequest = 6,
|
||||
P2PSessionConnectFail = 7,
|
||||
GameLobbyJoinRequested = 8,
|
||||
MicroTxnAuthorizationResponse = 9,
|
||||
}
|
||||
export function register<C extends keyof CallbackReturns>(
|
||||
steamCallback: C,
|
||||
handler: (value: CallbackReturns[C]) => void
|
||||
): Handle;
|
||||
export class Handle {
|
||||
disconnect(): void;
|
||||
}
|
||||
}
|
||||
export namespace cloud {
|
||||
export function isEnabledForAccount(): boolean;
|
||||
export function isEnabledForApp(): boolean;
|
||||
export function readFile(name: string): string;
|
||||
export function writeFile(name: string, content: string): boolean;
|
||||
export function deleteFile(name: string): boolean;
|
||||
export function fileExists(name: string): boolean;
|
||||
}
|
||||
export namespace input {
|
||||
export interface AnalogActionVector {
|
||||
x: number;
|
||||
y: number;
|
||||
}
|
||||
export function init(): void;
|
||||
export function getControllers(): Array<Controller>;
|
||||
export function getActionSet(actionSetName: string): bigint;
|
||||
export function getDigitalAction(actionName: string): bigint;
|
||||
export function getAnalogAction(actionName: string): bigint;
|
||||
export function shutdown(): void;
|
||||
export class Controller {
|
||||
activateActionSet(actionSetHandle: bigint): void;
|
||||
isDigitalActionPressed(actionHandle: bigint): boolean;
|
||||
getAnalogActionVector(actionHandle: bigint): AnalogActionVector;
|
||||
}
|
||||
}
|
||||
export namespace localplayer {
|
||||
export function getSteamId(): PlayerSteamId;
|
||||
export function getName(): string;
|
||||
export function getLevel(): number;
|
||||
/** @returns the 2 digit ISO 3166-1-alpha-2 format country code which client is running in, e.g. "US" or "UK". */
|
||||
export function getIpCountry(): string;
|
||||
export function setRichPresence(
|
||||
key: string,
|
||||
value?: string | undefined | null
|
||||
): void;
|
||||
}
|
||||
export namespace matchmaking {
|
||||
export const enum LobbyType {
|
||||
Private = 0,
|
||||
FriendsOnly = 1,
|
||||
Public = 2,
|
||||
Invisible = 3,
|
||||
}
|
||||
export function createLobby(
|
||||
lobbyType: LobbyType,
|
||||
maxMembers: number
|
||||
): Promise<Lobby>;
|
||||
export function joinLobby(lobbyId: bigint): Promise<Lobby>;
|
||||
export function getLobbies(): Promise<Array<Lobby>>;
|
||||
export class Lobby {
|
||||
id: bigint;
|
||||
join(): Promise<Lobby>;
|
||||
leave(): void;
|
||||
openInviteDialog(): void;
|
||||
getMemberCount(): bigint;
|
||||
getMemberLimit(): bigint | null;
|
||||
getMembers(): Array<PlayerSteamId>;
|
||||
getOwner(): PlayerSteamId;
|
||||
setJoinable(joinable: boolean): boolean;
|
||||
getData(key: string): string | null;
|
||||
setData(key: string, value: string): boolean;
|
||||
deleteData(key: string): boolean;
|
||||
/** Get an object containing all the lobby data */
|
||||
getFullData(): Record<string, string>;
|
||||
/**
|
||||
* Merge current lobby data with provided data in a single batch
|
||||
* @returns true if all data was set successfully
|
||||
*/
|
||||
mergeFullData(data: Record<string, string>): boolean;
|
||||
}
|
||||
}
|
||||
export namespace networking {
|
||||
export interface P2PPacket {
|
||||
data: Buffer;
|
||||
size: number;
|
||||
steamId: PlayerSteamId;
|
||||
}
|
||||
/** The method used to send a packet */
|
||||
export const enum SendType {
|
||||
/**
|
||||
* Send the packet directly over udp.
|
||||
*
|
||||
* Can't be larger than 1200 bytes
|
||||
*/
|
||||
Unreliable = 0,
|
||||
/**
|
||||
* Like `Unreliable` but doesn't buffer packets
|
||||
* sent before the connection has started.
|
||||
*/
|
||||
UnreliableNoDelay = 1,
|
||||
/**
|
||||
* Reliable packet sending.
|
||||
*
|
||||
* Can't be larger than 1 megabyte.
|
||||
*/
|
||||
Reliable = 2,
|
||||
/**
|
||||
* Like `Reliable` but applies the nagle
|
||||
* algorithm to packets being sent
|
||||
*/
|
||||
ReliableWithBuffering = 3,
|
||||
}
|
||||
export function sendP2PPacket(
|
||||
steamId64: bigint,
|
||||
sendType: SendType,
|
||||
data: Buffer
|
||||
): boolean;
|
||||
export function isP2PPacketAvailable(): number;
|
||||
export function readP2PPacket(size: number): P2PPacket;
|
||||
export function acceptP2PSession(steamId64: bigint): void;
|
||||
}
|
||||
export namespace overlay {
|
||||
export const enum Dialog {
|
||||
Friends = 0,
|
||||
Community = 1,
|
||||
Players = 2,
|
||||
Settings = 3,
|
||||
OfficialGameGroup = 4,
|
||||
Stats = 5,
|
||||
Achievements = 6,
|
||||
}
|
||||
export const enum StoreFlag {
|
||||
None = 0,
|
||||
AddToCart = 1,
|
||||
AddToCartAndShow = 2,
|
||||
}
|
||||
export function activateDialog(dialog: Dialog): void;
|
||||
export function activateDialogToUser(
|
||||
dialog: Dialog,
|
||||
steamId64: bigint
|
||||
): void;
|
||||
export function activateInviteDialog(lobbyId: bigint): void;
|
||||
export function activateToWebPage(url: string): void;
|
||||
export function activateToStore(appId: number, flag: StoreFlag): void;
|
||||
}
|
||||
export namespace stats {
|
||||
export function getInt(name: string): number | null;
|
||||
export function setInt(name: string, value: number): boolean;
|
||||
export function store(): boolean;
|
||||
export function resetAll(achievementsToo: boolean): boolean;
|
||||
}
|
||||
export namespace utils {
|
||||
export function getAppId(): number;
|
||||
export function getServerRealTime(): number;
|
||||
export function isSteamRunningOnSteamDeck(): boolean;
|
||||
}
|
||||
export namespace workshop {
|
||||
export interface UgcResult {
|
||||
itemId: bigint;
|
||||
needsToAcceptAgreement: boolean;
|
||||
}
|
||||
export const enum UgcItemVisibility {
|
||||
Public = 0,
|
||||
FriendsOnly = 1,
|
||||
Private = 2,
|
||||
Unlisted = 3,
|
||||
}
|
||||
export interface UgcUpdate {
|
||||
title?: string;
|
||||
description?: string;
|
||||
changeNote?: string;
|
||||
previewPath?: string;
|
||||
contentPath?: string;
|
||||
tags?: Array<string>;
|
||||
visibility?: UgcItemVisibility;
|
||||
}
|
||||
export interface InstallInfo {
|
||||
folder: string;
|
||||
sizeOnDisk: bigint;
|
||||
timestamp: number;
|
||||
}
|
||||
export interface DownloadInfo {
|
||||
current: bigint;
|
||||
total: bigint;
|
||||
}
|
||||
export function createItem(
|
||||
appId?: number | undefined | null
|
||||
): Promise<UgcResult>;
|
||||
export function updateItem(
|
||||
itemId: bigint,
|
||||
updateDetails: UgcUpdate,
|
||||
appId?: number | undefined | null
|
||||
): Promise<UgcResult>;
|
||||
/**
|
||||
* Subscribe to a workshop item. It will be downloaded and installed as soon as possible.
|
||||
*
|
||||
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#SubscribeItem}
|
||||
*/
|
||||
export function subscribe(itemId: bigint): Promise<void>;
|
||||
/**
|
||||
* Unsubscribe from a workshop item. This will result in the item being removed after the game quits.
|
||||
*
|
||||
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#UnsubscribeItem}
|
||||
*/
|
||||
export function unsubscribe(itemId: bigint): Promise<void>;
|
||||
/**
|
||||
* Gets the current state of a workshop item on this client. States can be combined.
|
||||
*
|
||||
* @returns a number with the current item state, e.g. 9
|
||||
* 9 = 1 (The current user is subscribed to this item) + 8 (The item needs an update)
|
||||
*
|
||||
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#GetItemState}
|
||||
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#EItemState}
|
||||
*/
|
||||
export function state(itemId: bigint): number;
|
||||
/**
|
||||
* Gets info about currently installed content on the disc for workshop item.
|
||||
*
|
||||
* @returns an object with the the properties {folder, size_on_disk, timestamp}
|
||||
*
|
||||
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#GetItemInstallInfo}
|
||||
*/
|
||||
export function installInfo(itemId: bigint): InstallInfo | null;
|
||||
/**
|
||||
* Get info about a pending download of a workshop item.
|
||||
*
|
||||
* @returns an object with the properties {current, total}
|
||||
*
|
||||
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#GetItemDownloadInfo}
|
||||
*/
|
||||
export function downloadInfo(itemId: bigint): DownloadInfo | null;
|
||||
/**
|
||||
* Download or update a workshop item.
|
||||
*
|
||||
* @param highPriority - If high priority is true, start the download in high priority mode, pausing any existing in-progress Steam downloads and immediately begin downloading this workshop item.
|
||||
* @returns true or false
|
||||
*
|
||||
* {@link https://partner.steamgames.com/doc/api/ISteamUGC#DownloadItem}
|
||||
*/
|
||||
export function download(itemId: bigint, highPriority: boolean): boolean;
|
||||
}
|
||||
}
|
||||
|
||||
declare module 'steamworks.js' {
|
||||
export function init(appId?: number): Client;
|
||||
export function restartAppIfNecessary(appId: number): boolean;
|
||||
export function electronEnableSteamOverlay(
|
||||
disableEachFrameInvalidation?: boolean
|
||||
): void;
|
||||
export type Client = Omit<
|
||||
typeof import('steamworks.js/client'),
|
||||
'init' | 'runCallbacks'
|
||||
>;
|
||||
export const SteamCallback: typeof import('steamworks.js/client').callback.SteamCallback;
|
||||
}
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(SystemInfo)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(SystemInfo)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(SystemInfo "${source_files}")
|
||||
gd_add_extension_target(SystemInfo "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(SystemInfo)
|
||||
|
@@ -25,27 +25,21 @@ class SystemInfoJsExtension : public gd::PlatformExtension {
|
||||
DeclareSystemInfoExtension(*this);
|
||||
|
||||
GetAllConditions()["SystemInfo::IsMobile"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.isMobile");
|
||||
GetAllConditions()["SystemInfo::IsNativeMobileApp"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.isNativeMobileApp");
|
||||
GetAllConditions()["SystemInfo::IsNativeDesktopApp"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.isNativeDesktopApp");
|
||||
GetAllConditions()["SystemInfo::IsWebGLSupported"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.isWebGLSupported");
|
||||
GetAllConditions()["SystemInfo::IsPreview"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.isPreview");
|
||||
GetAllConditions()["SystemInfo::HasTouchScreen"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.hasTouchScreen");
|
||||
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(TextEntryObject)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(TextEntryObject)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(TextEntryObject "${source_files}")
|
||||
gd_add_extension_target(TextEntryObject "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(TextEntryObject)
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(TextObject)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(TextObject)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(TextObject "${source_files}")
|
||||
gd_add_extension_target(TextObject "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(TextObject)
|
||||
|
File diff suppressed because one or more lines are too long
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(TiledSpriteObject)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(TiledSpriteObject)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(TiledSpriteObject "${source_files}")
|
||||
gd_add_extension_target(TiledSpriteObject "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(TiledSpriteObject)
|
||||
|
@@ -1,20 +1,23 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(TopDownMovementBehavior)
|
||||
gd_add_extension_includes()
|
||||
|
||||
#Defines
|
||||
###
|
||||
# Defines
|
||||
#
|
||||
gd_add_extension_definitions(TopDownMovementBehavior)
|
||||
|
||||
#The targets
|
||||
###
|
||||
# The targets
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB source_files *.cpp *.h)
|
||||
file(
|
||||
GLOB
|
||||
source_files
|
||||
*.cpp
|
||||
*.h)
|
||||
gd_add_clang_utils(TopDownMovementBehavior "${source_files}")
|
||||
gd_add_extension_target(TopDownMovementBehavior "${source_files}")
|
||||
|
||||
#Linker files for the IDE extension
|
||||
###
|
||||
# Linker files for the IDE extension
|
||||
#
|
||||
gd_extension_link_libraries(TopDownMovementBehavior)
|
||||
|
@@ -1,75 +1,88 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(GDJS)
|
||||
#Dependencies on external libraries:
|
||||
###
|
||||
# Dependencies on external libraries:
|
||||
#
|
||||
include_directories(${GDCORE_include_dir})
|
||||
|
||||
#Defines
|
||||
###
|
||||
add_definitions( -DGD_IDE_ONLY )
|
||||
IF (EMSCRIPTEN)
|
||||
add_definitions( -DEMSCRIPTEN )
|
||||
ENDIF()
|
||||
IF(CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||
add_definitions( -DDEBUG )
|
||||
ELSE()
|
||||
add_definitions( -DRELEASE )
|
||||
ENDIF()
|
||||
# Defines
|
||||
#
|
||||
add_definitions(-DGD_IDE_ONLY)
|
||||
if(EMSCRIPTEN)
|
||||
add_definitions(-DEMSCRIPTEN)
|
||||
endif()
|
||||
if("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
|
||||
add_definitions(-DDEBUG)
|
||||
else()
|
||||
add_definitions(-DRELEASE)
|
||||
endif()
|
||||
|
||||
IF(WIN32)
|
||||
add_definitions( -DWINDOWS )
|
||||
add_definitions( "-DGD_API=__declspec(dllexport)" )
|
||||
add_definitions( "-DGD_CORE_API=__declspec( dllimport )" )
|
||||
add_definitions( -D__GNUWIN32__ )
|
||||
ELSE()
|
||||
IF(APPLE)
|
||||
add_definitions( -DMACOS )
|
||||
ELSE()
|
||||
add_definitions( -DLINUX )
|
||||
ENDIF()
|
||||
add_definitions( -DGD_API= )
|
||||
add_definitions( -DGD_CORE_API= )
|
||||
ENDIF(WIN32)
|
||||
if(WIN32)
|
||||
add_definitions(-DWINDOWS)
|
||||
add_definitions("-DGD_API=__declspec(dllexport)")
|
||||
add_definitions("-DGD_CORE_API=__declspec(dllimport)")
|
||||
add_definitions(-D__GNUWIN32__)
|
||||
else()
|
||||
if(APPLE)
|
||||
add_definitions(-DMACOS)
|
||||
else()
|
||||
add_definitions(-DLINUX)
|
||||
endif()
|
||||
add_definitions(-DGD_API=)
|
||||
add_definitions(-DGD_CORE_API=)
|
||||
endif()
|
||||
|
||||
#The target
|
||||
###
|
||||
# The target
|
||||
#
|
||||
include_directories(.)
|
||||
file(GLOB f1 GDJS/* GDJS/IDE/* GDJS/IDE/mongoose/*)
|
||||
file(GLOB_RECURSE f2 GDJS/Extensions/* GDJS/Events/*)
|
||||
file(
|
||||
GLOB
|
||||
f1
|
||||
GDJS/*
|
||||
GDJS/IDE/*
|
||||
GDJS/IDE/mongoose/*)
|
||||
file(
|
||||
GLOB_RECURSE
|
||||
f2
|
||||
GDJS/Extensions/*
|
||||
GDJS/Events/*)
|
||||
set(source_files ${f1} ${f2})
|
||||
IF(NOT EMSCRIPTEN)
|
||||
file(GLOB_RECURSE f3 GDJS/IDE/Dialogs/*)
|
||||
set(source_files ${source_files} ${f3})
|
||||
ENDIF()
|
||||
if(NOT EMSCRIPTEN)
|
||||
file(
|
||||
GLOB_RECURSE
|
||||
f3
|
||||
GDJS/IDE/Dialogs/*)
|
||||
set(source_files ${source_files} ${f3})
|
||||
endif()
|
||||
|
||||
file(GLOB_RECURSE formatted_source_files GDJS/Events/* GDJS/Extensions/* GDJS/IDE/*)
|
||||
file(
|
||||
GLOB_RECURSE
|
||||
formatted_source_files
|
||||
GDJS/Events/*
|
||||
GDJS/Extensions/*
|
||||
GDJS/IDE/*)
|
||||
gd_add_clang_utils(GDJS "${formatted_source_files}")
|
||||
|
||||
|
||||
IF(EMSCRIPTEN)
|
||||
if(EMSCRIPTEN)
|
||||
# Emscripten treats all libraries as static libraries
|
||||
add_library(GDJS STATIC ${source_files})
|
||||
ELSE()
|
||||
else()
|
||||
add_library(GDJS SHARED ${source_files})
|
||||
ENDIF()
|
||||
IF(EMSCRIPTEN)
|
||||
endif()
|
||||
if(EMSCRIPTEN)
|
||||
set_target_properties(GDJS PROPERTIES SUFFIX ".bc")
|
||||
ELSEIF(WIN32)
|
||||
elseif(WIN32)
|
||||
set_target_properties(GDJS PROPERTIES PREFIX "")
|
||||
ELSE()
|
||||
else()
|
||||
set_target_properties(GDJS PROPERTIES PREFIX "lib")
|
||||
ENDIF()
|
||||
endif()
|
||||
set_target_properties(GDJS PROPERTIES MACOS_RPATH "..")
|
||||
set(LIBRARY_OUTPUT_PATH ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/JsPlatform)
|
||||
set(ARCHIVE_OUTPUT_PATH ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/JsPlatform)
|
||||
set(RUNTIME_OUTPUT_PATH ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/JsPlatform)
|
||||
|
||||
#Linker files
|
||||
###
|
||||
IF(EMSCRIPTEN)
|
||||
#Nothing.
|
||||
ELSE()
|
||||
# Linker files
|
||||
#
|
||||
if(NOT EMSCRIPTEN)
|
||||
target_link_libraries(GDJS GDCore)
|
||||
ENDIF()
|
||||
endif()
|
||||
|
@@ -50,6 +50,12 @@ class JsCodeEvent : public gd::BaseEvent {
|
||||
bool IsEventsSheetExpanded() const { return eventsSheetExpanded; }
|
||||
void SetEventsSheetExpanded(bool enable) { eventsSheetExpanded = enable; };
|
||||
|
||||
std::vector<gd::Expression*> GetAllObjectExpressions() {
|
||||
std::vector<gd::Expression*> allObjectExpressions;
|
||||
allObjectExpressions.push_back(¶meterObjects);
|
||||
return allObjectExpressions;
|
||||
}
|
||||
|
||||
private:
|
||||
void Init(const JsCodeEvent& event);
|
||||
|
||||
|
1486
GDJS/GDJS/Events/CodeGeneration/MetadataDeclarationHelper.cpp
Normal file
1486
GDJS/GDJS/Events/CodeGeneration/MetadataDeclarationHelper.cpp
Normal file
File diff suppressed because it is too large
Load Diff
324
GDJS/GDJS/Events/CodeGeneration/MetadataDeclarationHelper.h
Normal file
324
GDJS/GDJS/Events/CodeGeneration/MetadataDeclarationHelper.h
Normal file
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-2023 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "GDCore/String.h"
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace gd {
|
||||
class PlatformExtension;
|
||||
class Project;
|
||||
class EventsFunctionsExtension;
|
||||
class EventsBasedBehavior;
|
||||
class BehaviorMetadata;
|
||||
class EventsBasedObject;
|
||||
class ObjectMetadata;
|
||||
class EventsFunction;
|
||||
class PropertyDescriptor;
|
||||
class EventsFunctionsContainer;
|
||||
class AbstractFunctionMetadata;
|
||||
class InstructionOrExpressionContainerMetadata;
|
||||
class AbstractEventsBasedEntity;
|
||||
class NamedPropertyDescriptor;
|
||||
class ParameterMetadata;
|
||||
class InstructionMetadata;
|
||||
class ExpressionMetadata;
|
||||
class MultipleInstructionMetadata;
|
||||
} // namespace gd
|
||||
|
||||
namespace gdjs {
|
||||
|
||||
/**
|
||||
* \brief This file contains the logic to declare extension metadata from
|
||||
* events functions or events based behaviors.
|
||||
* These are basically adapters from gd::EventsFunctionsExtension, and children,
|
||||
* to a real extension declaration (like in `JsExtension.js` or `Extension.cpp`
|
||||
* files).
|
||||
*
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class MetadataDeclarationHelper {
|
||||
public:
|
||||
MetadataDeclarationHelper(){};
|
||||
virtual ~MetadataDeclarationHelper(){};
|
||||
|
||||
gd::AbstractFunctionMetadata &GenerateFreeFunctionMetadata(
|
||||
const gd::Project &project, gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
static gd::BehaviorMetadata &GenerateBehaviorMetadata(
|
||||
const gd::Project &project, gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
std::map<gd::String, gd::String> &behaviorMethodMangledNames);
|
||||
|
||||
static gd::ObjectMetadata &GenerateObjectMetadata(
|
||||
const gd::Project &project, gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
std::map<gd::String, gd::String> &objectMethodMangledNames);
|
||||
|
||||
static gd::String GetFreeFunctionCodeName(
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Declare an extension from an events based extension.
|
||||
*/
|
||||
static void DeclareExtension(
|
||||
gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension);
|
||||
|
||||
/**
|
||||
* Check if the name of the function is the name of a lifecycle function (for
|
||||
* events-based behaviors), that will be called automatically by the game
|
||||
* engine.
|
||||
*/
|
||||
static bool IsBehaviorLifecycleEventsFunction(const gd::String &functionName);
|
||||
|
||||
/**
|
||||
* Check if the name of the function is the name of a lifecycle function (for
|
||||
* events-based objects), that will be called automatically by the game
|
||||
* engine.
|
||||
*/
|
||||
static bool IsObjectLifecycleEventsFunction(const gd::String &functionName);
|
||||
|
||||
/**
|
||||
* Check if the name of the function is the name of a lifecycle function (for
|
||||
* events-based extensions), that will be called automatically by the game
|
||||
* engine.
|
||||
*/
|
||||
static bool
|
||||
IsExtensionLifecycleEventsFunction(const gd::String &functionName);
|
||||
|
||||
static gd::String ShiftSentenceParamIndexes(const gd::String &sentence,
|
||||
const int offset);
|
||||
|
||||
private:
|
||||
static const gd::String &
|
||||
GetExtensionIconUrl(gd::PlatformExtension &extension);
|
||||
|
||||
/**
|
||||
* Declare the dependencies of an extension from an events based extension.
|
||||
*/
|
||||
static void DeclareExtensionDependencies(
|
||||
gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension);
|
||||
|
||||
static void DeclarePropertyInstructionAndExpression(
|
||||
gd::PlatformExtension &extension,
|
||||
gd::InstructionOrExpressionContainerMetadata &entityMetadata,
|
||||
const gd::AbstractEventsBasedEntity &eventsBasedEntity,
|
||||
const gd::NamedPropertyDescriptor &property,
|
||||
const gd::String &propertyLabel, const gd::String &expressionName,
|
||||
const gd::String &conditionName, const gd::String &actionName,
|
||||
const gd::String &toggleActionName, const gd::String &setterName,
|
||||
const gd::String &getterName, const gd::String &toggleFunctionName,
|
||||
const int valueParameterIndex,
|
||||
std::function<gd::AbstractFunctionMetadata &(
|
||||
gd::AbstractFunctionMetadata &instructionOrExpression)>
|
||||
addObjectAndBehaviorParameters);
|
||||
|
||||
/**
|
||||
* Declare the instructions (actions/conditions) and expressions for the
|
||||
* properties of the given events based behavior.
|
||||
* This is akin to what would happen by manually declaring a JS extension
|
||||
* (see `JsExtension.js` files of extensions).
|
||||
*/
|
||||
static void DeclareBehaviorPropertiesInstructionAndExpressions(
|
||||
gd::PlatformExtension &extension, gd::BehaviorMetadata &behaviorMetadata,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior);
|
||||
|
||||
/**
|
||||
* Declare the instructions (actions/conditions) and expressions for the
|
||||
* properties of the given events based object.
|
||||
* This is akin to what would happen by manually declaring a JS extension
|
||||
* (see `JsExtension.js` files of extensions).
|
||||
*/
|
||||
static void DeclareObjectPropertiesInstructionAndExpressions(
|
||||
gd::PlatformExtension &extension, gd::ObjectMetadata &objectMetadata,
|
||||
const gd::EventsBasedObject &eventsBasedObject);
|
||||
|
||||
/**
|
||||
* Declare the instructions (actions/conditions) and expressions for the
|
||||
* properties of the given events based object.
|
||||
* This is akin to what would happen by manually declaring a JS extension
|
||||
* (see `JsExtension.js` files of extensions).
|
||||
*/
|
||||
static void DeclareObjectInternalInstructions(
|
||||
gd::PlatformExtension &extension, gd::ObjectMetadata &objectMetadata,
|
||||
const gd::EventsBasedObject &eventsBasedObject);
|
||||
|
||||
static const gd::String defaultExtensionIconPath;
|
||||
|
||||
/**
|
||||
* Declare the behavior for the given
|
||||
* events based behavior.
|
||||
*/
|
||||
static gd::BehaviorMetadata &
|
||||
DeclareBehaviorMetadata(gd::PlatformExtension &extension,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior);
|
||||
|
||||
/**
|
||||
* Declare the object for the given
|
||||
* events based object.
|
||||
*/
|
||||
static gd::ObjectMetadata &
|
||||
DeclareObjectMetadata(gd::PlatformExtension &extension,
|
||||
const gd::EventsBasedObject &eventsBasedObject);
|
||||
|
||||
static void
|
||||
AddParameter(gd::AbstractFunctionMetadata &instructionOrExpression,
|
||||
const gd::ParameterMetadata ¶meter);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* (free) events function.
|
||||
*/
|
||||
gd::AbstractFunctionMetadata &DeclareInstructionOrExpressionMetadata(
|
||||
gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* (free) events function.
|
||||
*/
|
||||
gd::AbstractFunctionMetadata &DeclareExpressionMetadata(
|
||||
gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* (free) events function.
|
||||
*/
|
||||
static gd::InstructionMetadata &DeclareInstructionMetadata(
|
||||
gd::PlatformExtension &extension,
|
||||
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* behavior events function.
|
||||
*/
|
||||
gd::AbstractFunctionMetadata &DeclareBehaviorInstructionOrExpressionMetadata(
|
||||
gd::PlatformExtension &extension, gd::BehaviorMetadata &behaviorMetadata,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
std::map<gd::String, gd::String> &objectMethodMangledNames);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* behavior events function.
|
||||
*/
|
||||
gd::AbstractFunctionMetadata &DeclareBehaviorExpressionMetadata(
|
||||
gd::PlatformExtension &extension, gd::BehaviorMetadata &behaviorMetadata,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* behavior events function.
|
||||
*/
|
||||
static gd::InstructionMetadata &DeclareBehaviorInstructionMetadata(
|
||||
gd::PlatformExtension &extension, gd::BehaviorMetadata &behaviorMetadata,
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* object events function.
|
||||
*/
|
||||
gd::AbstractFunctionMetadata &DeclareObjectInstructionOrExpressionMetadata(
|
||||
gd::PlatformExtension &extension, gd::ObjectMetadata &objectMetadata,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
std::map<gd::String, gd::String> &objectMethodMangledNames);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* object events function.
|
||||
*/
|
||||
gd::AbstractFunctionMetadata &DeclareObjectExpressionMetadata(
|
||||
gd::PlatformExtension &extension, gd::ObjectMetadata &objectMetadata,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Declare the instruction (action/condition) or expression for the given
|
||||
* object events function.
|
||||
*/
|
||||
static gd::InstructionMetadata &DeclareObjectInstructionMetadata(
|
||||
gd::PlatformExtension &extension, gd::ObjectMetadata &objectMetadata,
|
||||
const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::EventsFunction &eventsFunction);
|
||||
|
||||
/**
|
||||
* Add to the instruction (action/condition) or expression the parameters
|
||||
* expected by the events function.
|
||||
*/
|
||||
static void DeclareEventsFunctionParameters(
|
||||
const gd::EventsFunctionsContainer &eventsFunctionsContainer,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::ExpressionMetadata &expression,
|
||||
const int userDefinedFirstParameterIndex);
|
||||
|
||||
/**
|
||||
* Add to the instruction (action/condition) or expression the parameters
|
||||
* expected by the events function.
|
||||
*/
|
||||
static void DeclareEventsFunctionParameters(
|
||||
const gd::EventsFunctionsContainer &eventsFunctionsContainer,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::InstructionMetadata &instruction,
|
||||
const int userDefinedFirstParameterIndex);
|
||||
|
||||
/**
|
||||
* Add to the instruction (action/condition) or expression the parameters
|
||||
* expected by the events function.
|
||||
*/
|
||||
static void DeclareEventsFunctionParameters(
|
||||
const gd::EventsFunctionsContainer &eventsFunctionsContainer,
|
||||
const gd::EventsFunction &eventsFunction,
|
||||
gd::MultipleInstructionMetadata &multipleInstructionMetadata,
|
||||
const int userDefinedFirstParameterIndex);
|
||||
|
||||
static gd::String GetExtensionCodeNamespacePrefix(
|
||||
const gd::EventsFunctionsExtension eventsFunctionsExtension);
|
||||
|
||||
/** Generate the namespace for a free function. */
|
||||
static gd::String
|
||||
GetFreeFunctionCodeNamespace(const gd::EventsFunction &eventsFunction,
|
||||
const gd::String &codeNamespacePrefix);
|
||||
|
||||
/** Generate the namespace for a behavior function. */
|
||||
static gd::String GetBehaviorFunctionCodeNamespace(
|
||||
const gd::EventsBasedBehavior &eventsBasedBehavior,
|
||||
const gd::String &codeNamespacePrefix);
|
||||
|
||||
/** Generate the namespace for an object function. */
|
||||
static gd::String
|
||||
GetObjectFunctionCodeNamespace(const gd::EventsBasedObject &eventsBasedObject,
|
||||
const gd::String &codeNamespacePrefix);
|
||||
|
||||
static gd::String RemoveTrailingDot(const gd::String &description);
|
||||
|
||||
static gd::String
|
||||
GetStringifiedExtraInfo(const gd::PropertyDescriptor &property);
|
||||
|
||||
static gd::String CapitalizeFirstLetter(const gd::String &string);
|
||||
static gd::String UncapitalizeFirstLetter(const gd::String &string);
|
||||
|
||||
std::vector<gd::MultipleInstructionMetadata> expressionAndConditions;
|
||||
};
|
||||
|
||||
} // namespace gdjs
|
@@ -18,7 +18,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
gd::BuiltinExtensionsImplementer::ImplementsAdvancedExtension(*this);
|
||||
|
||||
GetAllActions()["SetReturnNumber"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -35,7 +34,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
});
|
||||
|
||||
GetAllActions()["SetReturnString"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -52,7 +50,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
});
|
||||
|
||||
GetAllActions()["SetReturnBoolean"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -67,7 +64,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
});
|
||||
|
||||
GetAllActions()["CopyArgumentToVariable"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context) {
|
||||
@@ -86,7 +82,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
});
|
||||
|
||||
GetAllActions()["CopyVariableToArgument"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context) {
|
||||
@@ -105,7 +100,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
});
|
||||
|
||||
GetAllConditions()["GetArgumentAsBoolean"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -161,7 +155,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
});
|
||||
|
||||
GetAllConditions()["CompareArgumentAsNumber"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context) {
|
||||
@@ -188,7 +181,6 @@ AdvancedExtension::AdvancedExtension() {
|
||||
});
|
||||
|
||||
GetAllConditions()["CompareArgumentAsString"]
|
||||
.GetCodeExtraInformation()
|
||||
.SetCustomCodeGenerator([](gd::Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context) {
|
||||
|
@@ -138,12 +138,10 @@ BaseObjectExtension::BaseObjectExtension() {
|
||||
objectActions["SeparateFromObjects"]
|
||||
.SetFunctionName("separateFromObjectsList")
|
||||
.SetIncludeFile("runtimeobject.js");
|
||||
objectActions["Ecarter"]
|
||||
.codeExtraInformation // Deprecated
|
||||
objectActions["Ecarter"] // Deprecated
|
||||
.SetFunctionName("separateObjectsWithoutForces")
|
||||
.SetIncludeFile("runtimeobject.js");
|
||||
objectActions["Rebondir"]
|
||||
.codeExtraInformation // Deprecated
|
||||
objectActions["Rebondir"] // Deprecated
|
||||
.SetFunctionName("separateObjectsWithForces")
|
||||
.SetIncludeFile("runtimeobject.js");
|
||||
objectConditions["BehaviorActivated"]
|
||||
@@ -354,7 +352,7 @@ BaseObjectExtension::BaseObjectExtension() {
|
||||
.SetFunctionName("getVariableChildCount")
|
||||
.SetIncludeFile("runtimeobject.js");
|
||||
|
||||
GetAllActions()["MoveObjects"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
GetAllActions()["MoveObjects"].SetCustomCodeGenerator(
|
||||
[](gd::Instruction &,
|
||||
gd::EventsCodeGenerator &,
|
||||
gd::EventsCodeGenerationContext &) {
|
||||
@@ -365,7 +363,7 @@ BaseObjectExtension::BaseObjectExtension() {
|
||||
return op == "/" || op == "*" || op == "-" || op == "+";
|
||||
};
|
||||
|
||||
objectActions["MettreXY"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
objectActions["MettreXY"].SetCustomCodeGenerator(
|
||||
[&](gd::Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context) -> gd::String {
|
||||
@@ -397,16 +395,16 @@ BaseObjectExtension::BaseObjectExtension() {
|
||||
instruction.GetParameter(0).GetPlainString());
|
||||
|
||||
gd::String op1 = instruction.GetParameter(1).GetPlainString();
|
||||
gd::String newX =
|
||||
isNotAssignmentOperator(op1)
|
||||
? (objectListName + "[i].getX() " + op1 + expression1Code)
|
||||
: expression1Code;
|
||||
gd::String newX = isNotAssignmentOperator(op1)
|
||||
? (objectListName + "[i].getX() " + op1 + "(" +
|
||||
expression1Code + ")")
|
||||
: expression1Code;
|
||||
|
||||
gd::String op2 = instruction.GetParameter(3).GetPlainString();
|
||||
gd::String newY =
|
||||
isNotAssignmentOperator(op2)
|
||||
? (objectListName + "[i].getY() " + op2 + expression2Code)
|
||||
: expression2Code;
|
||||
gd::String newY = isNotAssignmentOperator(op2)
|
||||
? (objectListName + "[i].getY() " + op2 + "(" +
|
||||
expression2Code + ")")
|
||||
: expression2Code;
|
||||
|
||||
gd::String call =
|
||||
objectListName + "[i].setPosition(" + newX + "," + newY + ")";
|
||||
@@ -422,7 +420,7 @@ BaseObjectExtension::BaseObjectExtension() {
|
||||
return outputCode;
|
||||
});
|
||||
|
||||
objectActions["SetCenter"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
objectActions["SetCenter"].SetCustomCodeGenerator(
|
||||
[&](gd::Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &context) -> gd::String {
|
||||
|
@@ -46,7 +46,7 @@ CommonInstructionsExtension::CommonInstructionsExtension() {
|
||||
GetAllConditions()["BuiltinCommonInstructions::Always"].SetFunctionName(
|
||||
"gdjs.evtTools.common.logicalNegation");
|
||||
|
||||
GetAllConditions()["Egal"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
GetAllConditions()["Egal"].SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -76,7 +76,7 @@ CommonInstructionsExtension::CommonInstructionsExtension() {
|
||||
GetAllConditions()["BuiltinCommonInstructions::CompareNumbers"]
|
||||
.codeExtraInformation = GetAllConditions()["Egal"].codeExtraInformation;
|
||||
|
||||
GetAllConditions()["StrEqual"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
GetAllConditions()["StrEqual"].SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -176,7 +176,7 @@ CommonInstructionsExtension::CommonInstructionsExtension() {
|
||||
});
|
||||
|
||||
GetAllConditions()["BuiltinCommonInstructions::Or"]
|
||||
.codeExtraInformation.SetCustomCodeGenerator(
|
||||
.SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& parentContext) {
|
||||
@@ -307,7 +307,7 @@ CommonInstructionsExtension::CommonInstructionsExtension() {
|
||||
});
|
||||
|
||||
GetAllConditions()["BuiltinCommonInstructions::And"]
|
||||
.codeExtraInformation.SetCustomCodeGenerator(
|
||||
.SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& parentContext) {
|
||||
@@ -327,7 +327,7 @@ CommonInstructionsExtension::CommonInstructionsExtension() {
|
||||
});
|
||||
|
||||
GetAllConditions()["BuiltinCommonInstructions::Not"]
|
||||
.codeExtraInformation.SetCustomCodeGenerator(
|
||||
.SetCustomCodeGenerator(
|
||||
[](gd::Instruction &instruction,
|
||||
gd::EventsCodeGenerator &codeGenerator,
|
||||
gd::EventsCodeGenerationContext &parentContext) {
|
||||
@@ -348,7 +348,7 @@ CommonInstructionsExtension::CommonInstructionsExtension() {
|
||||
});
|
||||
|
||||
GetAllConditions()["BuiltinCommonInstructions::Once"]
|
||||
.codeExtraInformation.SetCustomCodeGenerator(
|
||||
.SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
|
@@ -118,7 +118,7 @@ VariablesExtension::VariablesExtension() {
|
||||
GetAllActions()["GlobalVariableRemoveAt"].SetFunctionName(
|
||||
"gdjs.evtTools.variable.variableRemoveAt");
|
||||
|
||||
GetAllActions()["ModVarScene"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
GetAllActions()["ModVarScene"].SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -150,7 +150,7 @@ VariablesExtension::VariablesExtension() {
|
||||
return gd::String("");
|
||||
});
|
||||
|
||||
GetAllActions()["ModVarSceneTxt"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
GetAllActions()["ModVarSceneTxt"].SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -176,7 +176,7 @@ VariablesExtension::VariablesExtension() {
|
||||
return gd::String("");
|
||||
});
|
||||
|
||||
GetAllActions()["ModVarGlobal"].codeExtraInformation.SetCustomCodeGenerator(
|
||||
GetAllActions()["ModVarGlobal"].SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
@@ -209,7 +209,7 @@ VariablesExtension::VariablesExtension() {
|
||||
});
|
||||
|
||||
GetAllActions()["ModVarGlobalTxt"]
|
||||
.codeExtraInformation.SetCustomCodeGenerator(
|
||||
.SetCustomCodeGenerator(
|
||||
[](gd::Instruction& instruction,
|
||||
gd::EventsCodeGenerator& codeGenerator,
|
||||
gd::EventsCodeGenerationContext& context) {
|
||||
|
2559
GDJS/package-lock.json
generated
2559
GDJS/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -11,7 +11,6 @@
|
||||
"@types/node": "^14.11.1",
|
||||
"@types/sinon": "^10.0.13",
|
||||
"@types/three": "0.152.0",
|
||||
"better-docs": "^2.3.2",
|
||||
"esbuild": "^0.13.12",
|
||||
"lebab": "^3.1.0",
|
||||
"minimist": "^1.2.5",
|
||||
|
@@ -1268,27 +1268,6 @@ interface InstructionSentenceFormatter {
|
||||
[Value] VectorPairStringTextFormatting GetAsFormattedText([Const, Ref] Instruction instr, [Const, Ref] InstructionMetadata metadata);
|
||||
};
|
||||
|
||||
//TODO: This should be renamed to InstructionCodeGenerationInformation
|
||||
[Prefix="gd::InstructionMetadata::"]
|
||||
interface ExtraInformation {
|
||||
[Ref] ExtraInformation SetFunctionName([Const] DOMString functionName_);
|
||||
[Ref] ExtraInformation SetAsyncFunctionName([Const] DOMString functionName_);
|
||||
[Ref] ExtraInformation SetManipulatedType([Const] DOMString type_);
|
||||
[Ref] ExtraInformation SetGetter([Const] DOMString getter);
|
||||
[Ref] ExtraInformation SetMutators([Const, Ref] MapStringString mutators);
|
||||
[Ref] ExtraInformation SetIncludeFile([Const] DOMString includeFile);
|
||||
[Ref] ExtraInformation AddIncludeFile([Const] DOMString includeFile);
|
||||
[Const, Ref] VectorString GetIncludeFiles();
|
||||
};
|
||||
|
||||
interface ExpressionCodeGenerationInformation {
|
||||
[Ref] ExpressionCodeGenerationInformation SetFunctionName([Const] DOMString functionName);
|
||||
[Ref] ExpressionCodeGenerationInformation SetStatic();
|
||||
[Ref] ExpressionCodeGenerationInformation SetIncludeFile([Const] DOMString includeFile);
|
||||
[Ref] ExpressionCodeGenerationInformation AddIncludeFile([Const] DOMString includeFile);
|
||||
[Const, Ref] VectorString GetIncludeFiles();
|
||||
};
|
||||
|
||||
interface ParameterOptions {
|
||||
[Ref] ParameterOptions SetDescription([Const] DOMString description);
|
||||
[Ref] ParameterOptions SetTypeExtraInfo([Const] DOMString typeExtraInfo);
|
||||
@@ -1296,6 +1275,26 @@ interface ParameterOptions {
|
||||
[Value] ParameterOptions STATIC_MakeNewOptions();
|
||||
};
|
||||
|
||||
interface AbstractFunctionMetadata {
|
||||
[Ref] AbstractFunctionMetadata AddParameter([Const] DOMString type,
|
||||
[Const] DOMString description,
|
||||
[Const] DOMString optionalObjectType,
|
||||
boolean parameterIsOptional);
|
||||
[Ref] AbstractFunctionMetadata AddCodeOnlyParameter(
|
||||
[Const] DOMString type, [Const] DOMString supplementaryInformation);
|
||||
[Ref] AbstractFunctionMetadata SetDefaultValue([Const] DOMString defaultValue);
|
||||
[Ref] AbstractFunctionMetadata SetParameterLongDescription([Const] DOMString longDescription);
|
||||
[Ref] AbstractFunctionMetadata SetParameterExtraInfo([Const] DOMString extraInfo);
|
||||
|
||||
[Ref] AbstractFunctionMetadata SetHidden();
|
||||
[Ref] AbstractFunctionMetadata SetPrivate();
|
||||
|
||||
[Ref] AbstractFunctionMetadata SetFunctionName([Const] DOMString functionName);
|
||||
[Ref] AbstractFunctionMetadata SetIncludeFile([Const] DOMString includeFile);
|
||||
[Ref] AbstractFunctionMetadata AddIncludeFile([Const] DOMString includeFile);
|
||||
[Const, Ref] VectorString GetIncludeFiles();
|
||||
};
|
||||
|
||||
interface InstructionMetadata {
|
||||
void InstructionMetadata(); // For tests only.
|
||||
|
||||
@@ -1348,15 +1347,20 @@ interface InstructionMetadata {
|
||||
[Ref] InstructionMetadata MarkAsAdvanced();
|
||||
[Ref] InstructionMetadata MarkAsComplex();
|
||||
|
||||
[Ref] ExtraInformation GetCodeExtraInformation();
|
||||
|
||||
[Ref] ExtraInformation SetFunctionName([Const] DOMString functionName);
|
||||
[Ref] ExtraInformation SetAsyncFunctionName([Const] DOMString functionName);
|
||||
|
||||
[Ref] InstructionMetadata GetCodeExtraInformation();
|
||||
|
||||
[Ref] InstructionMetadata SetFunctionName([Const] DOMString functionName_);
|
||||
[Ref] InstructionMetadata SetAsyncFunctionName([Const] DOMString functionName_);
|
||||
[Const, Ref] DOMString GetFunctionName();
|
||||
[Const, Ref] DOMString GetAsyncFunctionName();
|
||||
[Ref] InstructionMetadata SetManipulatedType([Const] DOMString type_);
|
||||
[Ref] InstructionMetadata SetGetter([Const] DOMString getter);
|
||||
[Ref] InstructionMetadata SetMutators([Const, Ref] MapStringString mutators);
|
||||
[Ref] InstructionMetadata SetIncludeFile([Const] DOMString includeFile);
|
||||
[Ref] InstructionMetadata AddIncludeFile([Const] DOMString includeFile);
|
||||
[Const, Ref] VectorString GetIncludeFiles();
|
||||
};
|
||||
InstructionMetadata implements AbstractFunctionMetadata;
|
||||
|
||||
interface ExpressionMetadata {
|
||||
void ExpressionMetadata(
|
||||
@@ -1404,14 +1408,16 @@ interface ExpressionMetadata {
|
||||
[Ref] ExpressionMetadata SetRequiresBaseObjectCapability([Const] DOMString capability);
|
||||
[Const, Ref] DOMString GetRequiredBaseObjectCapability();
|
||||
|
||||
[Ref] ExpressionCodeGenerationInformation GetCodeExtraInformation();
|
||||
|
||||
[Ref] ExpressionCodeGenerationInformation SetFunctionName([Const] DOMString functionName);
|
||||
|
||||
[Ref] ExpressionMetadata GetCodeExtraInformation();
|
||||
|
||||
[Ref] ExpressionMetadata SetFunctionName([Const] DOMString functionName);
|
||||
[Const, Ref] DOMString GetFunctionName();
|
||||
[Ref] ExpressionMetadata SetStatic();
|
||||
[Ref] ExpressionMetadata SetIncludeFile([Const] DOMString includeFile);
|
||||
[Ref] ExpressionMetadata AddIncludeFile([Const] DOMString includeFile);
|
||||
[Const, Ref] VectorString GetIncludeFiles();
|
||||
};
|
||||
ExpressionMetadata implements AbstractFunctionMetadata;
|
||||
|
||||
interface MultipleInstructionMetadata {
|
||||
[Ref] MultipleInstructionMetadata AddParameter([Const] DOMString type,
|
||||
@@ -1440,6 +1446,7 @@ interface MultipleInstructionMetadata {
|
||||
[Ref] MultipleInstructionMetadata MarkAsComplex();
|
||||
[Ref] MultipleInstructionMetadata SetPrivate();
|
||||
};
|
||||
MultipleInstructionMetadata implements AbstractFunctionMetadata;
|
||||
|
||||
interface DependencyMetadata {
|
||||
void DependencyMetadata();
|
||||
@@ -1528,6 +1535,7 @@ interface VectorParameterMetadata {
|
||||
[Ref] ParameterMetadata at(unsigned long index);
|
||||
void WRAPPED_set(unsigned long index, [Const, Ref] ParameterMetadata parameterMetadata);
|
||||
void FREE_removeFromVectorParameterMetadata(unsigned long index);
|
||||
void FREE_insertIntoVectorParameterMetadata(unsigned long index, [Const, Ref] ParameterMetadata parameterMetadata);
|
||||
void FREE_swapInVectorParameterMetadata(unsigned long oldIndex, unsigned long newIndex);
|
||||
void clear();
|
||||
};
|
||||
@@ -1907,6 +1915,8 @@ interface PlatformExtension {
|
||||
[Ref] VectorDependencyMetadata GetAllDependencies();
|
||||
|
||||
[Const, Value] DOMString STATIC_GetNamespaceSeparator();
|
||||
[Const, Value] DOMString STATIC_GetBehaviorFullType(
|
||||
[Const] DOMString extensionName, [Const] DOMString behaviorName);
|
||||
};
|
||||
|
||||
interface EventsList {
|
||||
@@ -2958,8 +2968,8 @@ interface Sprite {
|
||||
[Ref] Point GetPoint([Const] DOMString name);
|
||||
boolean HasPoint([Const] DOMString name);
|
||||
|
||||
boolean IsCollisionMaskAutomatic();
|
||||
void SetCollisionMaskAutomatic(boolean enabled);
|
||||
boolean IsFullImageCollisionMask();
|
||||
void SetFullImageCollisionMask(boolean enabled);
|
||||
|
||||
[Ref] VectorPolygon2d GetCustomCollisionMask();
|
||||
void SetCustomCollisionMask([Const, Ref] VectorPolygon2d collisionMask);
|
||||
@@ -3016,6 +3026,9 @@ interface SpriteObject {
|
||||
|
||||
void SetUpdateIfNotVisible(boolean updateIfNotVisible);
|
||||
boolean GetUpdateIfNotVisible();
|
||||
|
||||
boolean AdaptCollisionMaskAutomatically();
|
||||
void SetAdaptCollisionMaskAutomatically(boolean adaptCollisionMaskAutomatically);
|
||||
};
|
||||
SpriteObject implements ObjectConfiguration;
|
||||
|
||||
@@ -3368,3 +3381,41 @@ interface JsCodeEvent {
|
||||
void SerializeTo([Ref] SerializerElement element);
|
||||
void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element);
|
||||
};
|
||||
|
||||
[Prefix="gdjs::"]
|
||||
interface MetadataDeclarationHelper {
|
||||
void MetadataDeclarationHelper();
|
||||
|
||||
void STATIC_DeclareExtension(
|
||||
[Ref] PlatformExtension extension,
|
||||
[Const, Ref] EventsFunctionsExtension eventsFunctionsExtension);
|
||||
|
||||
[Ref] AbstractFunctionMetadata GenerateFreeFunctionMetadata(
|
||||
[Const, Ref] Project project,
|
||||
[Ref] PlatformExtension extension,
|
||||
[Const, Ref] EventsFunctionsExtension eventsFunctionsExtension,
|
||||
[Const, Ref] EventsFunction eventsFunction);
|
||||
|
||||
[Ref] BehaviorMetadata STATIC_GenerateBehaviorMetadata(
|
||||
[Const, Ref] Project project,
|
||||
[Ref] PlatformExtension extension,
|
||||
[Const, Ref] EventsFunctionsExtension eventsFunctionsExtension,
|
||||
[Const, Ref] EventsBasedBehavior eventsBasedBehavior,
|
||||
[Ref] MapStringString behaviorMethodMangledNames);
|
||||
|
||||
[Ref] ObjectMetadata STATIC_GenerateObjectMetadata(
|
||||
[Const, Ref] Project project,
|
||||
[Ref] PlatformExtension extension,
|
||||
[Const, Ref] EventsFunctionsExtension eventsFunctionsExtension,
|
||||
[Const, Ref] EventsBasedObject eventsBasedObject,
|
||||
[Ref] MapStringString objectMethodMangledNames);
|
||||
|
||||
[Const, Value] DOMString STATIC_GetFreeFunctionCodeName(
|
||||
[Const, Ref] EventsFunctionsExtension eventsFunctionsExtension,
|
||||
[Const, Ref] EventsFunction eventsFunction);
|
||||
|
||||
boolean STATIC_IsBehaviorLifecycleEventsFunction([Const] DOMString functionName);
|
||||
boolean STATIC_IsObjectLifecycleEventsFunction([Const] DOMString functionName);
|
||||
boolean STATIC_IsExtensionLifecycleEventsFunction([Const] DOMString functionName);
|
||||
[Const, Value] DOMString STATIC_ShiftSentenceParamIndexes([Const] DOMString sentence, long offset);
|
||||
};
|
||||
|
@@ -17,6 +17,7 @@
|
||||
#include <GDCore/Extensions/Metadata/EffectMetadata.h>
|
||||
#include <GDCore/Extensions/Metadata/MetadataProvider.h>
|
||||
#include <GDCore/Extensions/Metadata/MultipleInstructionMetadata.h>
|
||||
#include <GDCore/Extensions/Metadata/AbstractFunctionMetadata.h>
|
||||
#include <GDCore/Extensions/Metadata/ParameterOptions.h>
|
||||
#include <GDCore/Extensions/Metadata/ParameterMetadataTools.h>
|
||||
#include <GDCore/Extensions/Platform.h>
|
||||
@@ -84,6 +85,7 @@
|
||||
#include <GDJS/Events/CodeGeneration/ObjectCodeGenerator.h>
|
||||
#include <GDJS/Events/CodeGeneration/EventsFunctionsExtensionCodeGenerator.h>
|
||||
#include <GDJS/Events/CodeGeneration/LayoutCodeGenerator.h>
|
||||
#include <GDJS/Events/CodeGeneration/MetadataDeclarationHelper.h>
|
||||
#include <GDJS/IDE/Exporter.h>
|
||||
#include <GDJS/IDE/ExporterHelper.h>
|
||||
#include <emscripten.h>
|
||||
@@ -375,6 +377,12 @@ void removeFromVectorParameterMetadata(std::vector<gd::ParameterMetadata> &vec,
|
||||
vec.erase(vec.begin() + pos);
|
||||
}
|
||||
|
||||
void insertIntoVectorParameterMetadata(std::vector<gd::ParameterMetadata> &vec,
|
||||
size_t pos,
|
||||
const ParameterMetadata& parameterMetadata) {
|
||||
vec.insert(vec.begin() + pos, parameterMetadata);
|
||||
}
|
||||
|
||||
void swapInVectorParameterMetadata(std::vector<gd::ParameterMetadata> &vec,
|
||||
size_t oldIndex,
|
||||
size_t newIndex) {
|
||||
@@ -639,6 +647,7 @@ typedef ExtensionAndMetadata<ExpressionMetadata> ExtensionAndExpressionMetadata;
|
||||
#define STATIC_GetObjectParameterIndexFor GetObjectParameterIndexFor
|
||||
|
||||
#define STATIC_GetNamespaceSeparator GetNamespaceSeparator
|
||||
#define STATIC_GetBehaviorFullType GetBehaviorFullType
|
||||
#define STATIC_RenameEventsFunctionsExtension RenameEventsFunctionsExtension
|
||||
#define STATIC_UpdateExtensionNameInEventsBasedBehavior UpdateExtensionNameInEventsBasedBehavior
|
||||
#define STATIC_RenameEventsFunction RenameEventsFunction
|
||||
@@ -681,6 +690,15 @@ typedef ExtensionAndMetadata<ExpressionMetadata> ExtensionAndExpressionMetadata;
|
||||
#define STATIC_GetSharedPropertyExpressionName GetSharedPropertyExpressionName
|
||||
#define STATIC_GetSharedPropertyToggleActionName GetSharedPropertyToggleActionName
|
||||
|
||||
#define STATIC_DeclareExtension DeclareExtension
|
||||
#define STATIC_GenerateBehaviorMetadata GenerateBehaviorMetadata
|
||||
#define STATIC_GenerateObjectMetadata GenerateObjectMetadata
|
||||
#define STATIC_GetFreeFunctionCodeName GetFreeFunctionCodeName
|
||||
#define STATIC_IsBehaviorLifecycleEventsFunction IsBehaviorLifecycleEventsFunction
|
||||
#define STATIC_IsObjectLifecycleEventsFunction IsObjectLifecycleEventsFunction
|
||||
#define STATIC_IsExtensionLifecycleEventsFunction IsExtensionLifecycleEventsFunction
|
||||
#define STATIC_ShiftSentenceParamIndexes ShiftSentenceParamIndexes
|
||||
|
||||
#define STATIC_CopyAllResourcesTo CopyAllResourcesTo
|
||||
|
||||
#define STATIC_IsExtensionLifecycleEventsFunction \
|
||||
|
@@ -1,73 +1,71 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(SET CMP0015 NEW)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(libGD.js)
|
||||
|
||||
#Sanity checks
|
||||
IF ("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
message( "CMAKE_BUILD_TYPE is empty, assuming build type is Release" )
|
||||
# Sanity checks
|
||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
message(STATUS "CMAKE_BUILD_TYPE is empty, assuming build type is Release")
|
||||
set(CMAKE_BUILD_TYPE Release)
|
||||
ENDIF()
|
||||
endif()
|
||||
if(NOT EMSCRIPTEN)
|
||||
error("You're trying to compile libGD.js without emscripten.")
|
||||
message(FATAL_ERROR "You're trying to compile libGD.js without emscripten.")
|
||||
endif()
|
||||
|
||||
# Compilation flags (https://emscripten.org/docs/tools_reference/emcc.html):
|
||||
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") # Optimizations during compilation
|
||||
# SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g --profiling") # Uncomment for debugging + profiling support
|
||||
# SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --profiling") # Uncomment for profiling support
|
||||
add_compile_options(-O2) # Optimizations during compilation
|
||||
# add_compile_options(-g --profiling) # Uncomment for debugging + profiling support
|
||||
# add_compile_options(--profiling) # Uncomment for profiling support
|
||||
|
||||
#Common directories:
|
||||
###
|
||||
# Common directories:
|
||||
#
|
||||
set(GDJS_include_dir ${GD_base_dir}/GDJS)
|
||||
set(GDJS_lib_dir ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/JsPlatform)
|
||||
|
||||
#Dependencies on external libraries:
|
||||
###
|
||||
# Dependencies on external libraries:
|
||||
#
|
||||
include_directories(${GDCORE_include_dir})
|
||||
include_directories(${GDJS_include_dir})
|
||||
|
||||
#Defines
|
||||
###
|
||||
add_definitions( -DGD_IDE_ONLY )
|
||||
IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
|
||||
add_definitions( -DDEBUG )
|
||||
IF(WIN32)
|
||||
add_definitions( __WXDEBUG__ )
|
||||
ENDIF(WIN32)
|
||||
ELSEIF ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
|
||||
add_definitions( -DRELEASE )
|
||||
add_definitions( -DBOOST_DISABLE_ASSERTS )
|
||||
ELSE()
|
||||
add_definitions( -DDEV )
|
||||
add_definitions( -DBOOST_DISABLE_ASSERTS )
|
||||
ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG)
|
||||
# Defines
|
||||
#
|
||||
add_definitions(-DGD_IDE_ONLY)
|
||||
if("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
|
||||
add_definitions(-DDEBUG)
|
||||
if(WIN32)
|
||||
add_definitions(__WXDEBUG__)
|
||||
endif()
|
||||
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
|
||||
add_definitions(-DRELEASE)
|
||||
add_definitions(-DBOOST_DISABLE_ASSERTS)
|
||||
else()
|
||||
add_definitions(-DDEV)
|
||||
add_definitions(-DBOOST_DISABLE_ASSERTS)
|
||||
endif()
|
||||
|
||||
add_definitions( -Dlinux )
|
||||
add_definitions( -DLINUX )
|
||||
add_definitions( -DGD_API= )
|
||||
add_definitions( -DGD_CORE_API= )
|
||||
add_definitions( -DGD_EXTENSION_API= )
|
||||
add_definitions(-Dlinux)
|
||||
add_definitions(-DLINUX)
|
||||
add_definitions(-DGD_API=)
|
||||
add_definitions(-DGD_CORE_API=)
|
||||
add_definitions(-DGD_EXTENSION_API=)
|
||||
|
||||
#The target
|
||||
###
|
||||
# The target
|
||||
#
|
||||
include_directories(.)
|
||||
|
||||
add_executable(
|
||||
GD
|
||||
"Bindings/Wrapper.cpp"
|
||||
"Bindings/BehaviorJsImplementation.cpp"
|
||||
"Bindings/ObjectJsImplementation.cpp"
|
||||
"Bindings/BehaviorSharedDataJsImplementation.cpp"
|
||||
)
|
||||
"Bindings/ObjectJsImplementation.cpp"
|
||||
"Bindings/Wrapper.cpp")
|
||||
|
||||
IF(DISABLE_EMSCRIPTEN_LINK_OPTIMIZATIONS)
|
||||
if(DISABLE_EMSCRIPTEN_LINK_OPTIMIZATIONS)
|
||||
# Disable optimizations at linking time for much faster builds.
|
||||
MESSAGE(STATUS "Disabling optimization at link time for (slightly) faster build")
|
||||
message(STATUS "Disabling optimization at link time for (slightly) faster build")
|
||||
target_link_libraries(GD "-O0")
|
||||
ELSE()
|
||||
else()
|
||||
target_link_libraries(GD "-O2")
|
||||
ENDIF()
|
||||
endif()
|
||||
target_link_libraries(GD "--post-js ${GD_base_dir}/GDevelop.js/Bindings/glue.js")
|
||||
target_link_libraries(GD "--post-js ${GD_base_dir}/GDevelop.js/Bindings/postjs.js")
|
||||
target_link_libraries(GD "-s MODULARIZE=1")
|
||||
@@ -80,9 +78,8 @@ target_link_libraries(GD "-s \"EXTRA_EXPORTED_RUNTIME_METHODS=['addOnPreMain', '
|
||||
# Even if we're building an "executable", prefix it by lib as it's used as a library.
|
||||
set_target_properties(GD PROPERTIES PREFIX "lib")
|
||||
|
||||
#Linker files
|
||||
###
|
||||
|
||||
# Linker files
|
||||
#
|
||||
target_link_libraries(GD GDCore)
|
||||
target_link_libraries(GD GDJS)
|
||||
target_link_libraries(GD PlatformBehavior)
|
||||
|
1589
GDevelop.js/__tests__/MetadataDeclarationHelper.js
Normal file
1589
GDevelop.js/__tests__/MetadataDeclarationHelper.js
Normal file
File diff suppressed because it is too large
Load Diff
10270
GDevelop.js/package-lock.json
generated
10270
GDevelop.js/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
16
GDevelop.js/types/gdabstractfunctionmetadata.js
Normal file
16
GDevelop.js/types/gdabstractfunctionmetadata.js
Normal file
@@ -0,0 +1,16 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdAbstractFunctionMetadata {
|
||||
addParameter(type: string, description: string, optionalObjectType: string, parameterIsOptional: boolean): gdAbstractFunctionMetadata;
|
||||
addCodeOnlyParameter(type: string, supplementaryInformation: string): gdAbstractFunctionMetadata;
|
||||
setDefaultValue(defaultValue: string): gdAbstractFunctionMetadata;
|
||||
setParameterLongDescription(longDescription: string): gdAbstractFunctionMetadata;
|
||||
setParameterExtraInfo(extraInfo: string): gdAbstractFunctionMetadata;
|
||||
setHidden(): gdAbstractFunctionMetadata;
|
||||
setPrivate(): gdAbstractFunctionMetadata;
|
||||
setFunctionName(functionName: string): gdAbstractFunctionMetadata;
|
||||
setIncludeFile(includeFile: string): gdAbstractFunctionMetadata;
|
||||
addIncludeFile(includeFile: string): gdAbstractFunctionMetadata;
|
||||
getIncludeFiles(): gdVectorString;
|
||||
delete(): void;
|
||||
ptr: number;
|
||||
};
|
@@ -1,10 +0,0 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdExpressionCodeGenerationInformation {
|
||||
setFunctionName(functionName: string): gdExpressionCodeGenerationInformation;
|
||||
setStatic(): gdExpressionCodeGenerationInformation;
|
||||
setIncludeFile(includeFile: string): gdExpressionCodeGenerationInformation;
|
||||
addIncludeFile(includeFile: string): gdExpressionCodeGenerationInformation;
|
||||
getIncludeFiles(): gdVectorString;
|
||||
delete(): void;
|
||||
ptr: number;
|
||||
};
|
@@ -1,5 +1,5 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdExpressionMetadata {
|
||||
declare class gdExpressionMetadata extends gdAbstractFunctionMetadata {
|
||||
constructor(returnType: string, extensionNamespace: string, name: string, fullname: string, description: string, group: string, smallicon: string): void;
|
||||
getReturnType(): string;
|
||||
getFullName(): string;
|
||||
@@ -29,8 +29,10 @@ declare class gdExpressionMetadata {
|
||||
setParameterExtraInfo(extraInfo: string): gdExpressionMetadata;
|
||||
setRequiresBaseObjectCapability(capability: string): gdExpressionMetadata;
|
||||
getRequiredBaseObjectCapability(): string;
|
||||
getCodeExtraInformation(): gdExpressionCodeGenerationInformation;
|
||||
setFunctionName(functionName: string): gdExpressionCodeGenerationInformation;
|
||||
getCodeExtraInformation(): gdExpressionMetadata;
|
||||
setFunctionName(functionName: string): gdExpressionMetadata;
|
||||
getFunctionName(): string;
|
||||
setStatic(): gdExpressionMetadata;
|
||||
setIncludeFile(includeFile: string): gdExpressionMetadata;
|
||||
addIncludeFile(includeFile: string): gdExpressionMetadata;
|
||||
getIncludeFiles(): gdVectorString;
|
||||
|
@@ -1,13 +0,0 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdExtraInformation {
|
||||
setFunctionName(functionName_: string): gdExtraInformation;
|
||||
setAsyncFunctionName(functionName_: string): gdExtraInformation;
|
||||
setManipulatedType(type_: string): gdExtraInformation;
|
||||
setGetter(getter: string): gdExtraInformation;
|
||||
setMutators(mutators: gdMapStringString): gdExtraInformation;
|
||||
setIncludeFile(includeFile: string): gdExtraInformation;
|
||||
addIncludeFile(includeFile: string): gdExtraInformation;
|
||||
getIncludeFiles(): gdVectorString;
|
||||
delete(): void;
|
||||
ptr: number;
|
||||
};
|
@@ -1,5 +1,5 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdInstructionMetadata {
|
||||
declare class gdInstructionMetadata extends gdAbstractFunctionMetadata {
|
||||
constructor(): void;
|
||||
getFullName(): string;
|
||||
getDescription(): string;
|
||||
@@ -41,9 +41,14 @@ declare class gdInstructionMetadata {
|
||||
markAsSimple(): gdInstructionMetadata;
|
||||
markAsAdvanced(): gdInstructionMetadata;
|
||||
markAsComplex(): gdInstructionMetadata;
|
||||
getCodeExtraInformation(): gdExtraInformation;
|
||||
setFunctionName(functionName: string): gdExtraInformation;
|
||||
setAsyncFunctionName(functionName: string): gdExtraInformation;
|
||||
getCodeExtraInformation(): gdInstructionMetadata;
|
||||
setFunctionName(functionName_: string): gdInstructionMetadata;
|
||||
setAsyncFunctionName(functionName_: string): gdInstructionMetadata;
|
||||
getFunctionName(): string;
|
||||
getAsyncFunctionName(): string;
|
||||
setManipulatedType(type_: string): gdInstructionMetadata;
|
||||
setGetter(getter: string): gdInstructionMetadata;
|
||||
setMutators(mutators: gdMapStringString): gdInstructionMetadata;
|
||||
setIncludeFile(includeFile: string): gdInstructionMetadata;
|
||||
addIncludeFile(includeFile: string): gdInstructionMetadata;
|
||||
getIncludeFiles(): gdVectorString;
|
||||
|
15
GDevelop.js/types/gdmetadatadeclarationhelper.js
Normal file
15
GDevelop.js/types/gdmetadatadeclarationhelper.js
Normal file
@@ -0,0 +1,15 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdMetadataDeclarationHelper {
|
||||
constructor(): void;
|
||||
static declareExtension(extension: gdPlatformExtension, eventsFunctionsExtension: gdEventsFunctionsExtension): void;
|
||||
generateFreeFunctionMetadata(project: gdProject, extension: gdPlatformExtension, eventsFunctionsExtension: gdEventsFunctionsExtension, eventsFunction: gdEventsFunction): gdAbstractFunctionMetadata;
|
||||
static generateBehaviorMetadata(project: gdProject, extension: gdPlatformExtension, eventsFunctionsExtension: gdEventsFunctionsExtension, eventsBasedBehavior: gdEventsBasedBehavior, behaviorMethodMangledNames: gdMapStringString): gdBehaviorMetadata;
|
||||
static generateObjectMetadata(project: gdProject, extension: gdPlatformExtension, eventsFunctionsExtension: gdEventsFunctionsExtension, eventsBasedObject: gdEventsBasedObject, objectMethodMangledNames: gdMapStringString): gdObjectMetadata;
|
||||
static getFreeFunctionCodeName(eventsFunctionsExtension: gdEventsFunctionsExtension, eventsFunction: gdEventsFunction): string;
|
||||
static isBehaviorLifecycleEventsFunction(functionName: string): boolean;
|
||||
static isObjectLifecycleEventsFunction(functionName: string): boolean;
|
||||
static isExtensionLifecycleEventsFunction(functionName: string): boolean;
|
||||
static shiftSentenceParamIndexes(sentence: string, offset: number): string;
|
||||
delete(): void;
|
||||
ptr: number;
|
||||
};
|
@@ -1,5 +1,5 @@
|
||||
// Automatically generated by GDevelop.js/scripts/generate-types.js
|
||||
declare class gdMultipleInstructionMetadata {
|
||||
declare class gdMultipleInstructionMetadata extends gdAbstractFunctionMetadata {
|
||||
addParameter(type: string, description: string, optionalObjectType?: string, parameterIsOptional?: boolean): gdMultipleInstructionMetadata;
|
||||
addCodeOnlyParameter(type: string, supplementaryInformation: string): gdMultipleInstructionMetadata;
|
||||
setDefaultValue(defaultValue: string): gdMultipleInstructionMetadata;
|
||||
|
@@ -56,6 +56,7 @@ declare class gdPlatformExtension {
|
||||
getAllProperties(): gdMapStringPropertyDescriptor;
|
||||
getAllDependencies(): gdVectorDependencyMetadata;
|
||||
static getNamespaceSeparator(): string;
|
||||
static getBehaviorFullType(extensionName: string, behaviorName: string): string;
|
||||
delete(): void;
|
||||
ptr: number;
|
||||
};
|
@@ -12,8 +12,8 @@ declare class gdSprite {
|
||||
delPoint(name: string): void;
|
||||
getPoint(name: string): gdPoint;
|
||||
hasPoint(name: string): boolean;
|
||||
isCollisionMaskAutomatic(): boolean;
|
||||
setCollisionMaskAutomatic(enabled: boolean): void;
|
||||
isFullImageCollisionMask(): boolean;
|
||||
setFullImageCollisionMask(enabled: boolean): void;
|
||||
getCustomCollisionMask(): gdVectorPolygon2d;
|
||||
setCustomCollisionMask(collisionMask: gdVectorPolygon2d): void;
|
||||
delete(): void;
|
||||
|
@@ -11,6 +11,8 @@ declare class gdSpriteObject extends gdObjectConfiguration {
|
||||
moveAnimation(oldIndex: number, newIndex: number): void;
|
||||
setUpdateIfNotVisible(updateIfNotVisible: boolean): void;
|
||||
getUpdateIfNotVisible(): boolean;
|
||||
adaptCollisionMaskAutomatically(): boolean;
|
||||
setAdaptCollisionMaskAutomatically(adaptCollisionMaskAutomatically: boolean): void;
|
||||
delete(): void;
|
||||
ptr: number;
|
||||
};
|
@@ -6,6 +6,7 @@ declare class gdVectorParameterMetadata {
|
||||
at(index: number): gdParameterMetadata;
|
||||
set(index: number, parameterMetadata: gdParameterMetadata): void;
|
||||
removeFromVectorParameterMetadata(index: number): void;
|
||||
insertIntoVectorParameterMetadata(index: number, parameterMetadata: gdParameterMetadata): void;
|
||||
swapInVectorParameterMetadata(oldIndex: number, newIndex: number): void;
|
||||
clear(): void;
|
||||
delete(): void;
|
||||
|
@@ -120,9 +120,8 @@ declare class libGDevelop {
|
||||
VectorPairStringTextFormatting: Class<gdVectorPairStringTextFormatting>;
|
||||
TextFormatting: Class<gdTextFormatting>;
|
||||
InstructionSentenceFormatter: Class<gdInstructionSentenceFormatter>;
|
||||
ExtraInformation: Class<gdExtraInformation>;
|
||||
ExpressionCodeGenerationInformation: Class<gdExpressionCodeGenerationInformation>;
|
||||
ParameterOptions: Class<gdParameterOptions>;
|
||||
AbstractFunctionMetadata: Class<gdAbstractFunctionMetadata>;
|
||||
InstructionMetadata: Class<gdInstructionMetadata>;
|
||||
ExpressionMetadata: Class<gdExpressionMetadata>;
|
||||
MultipleInstructionMetadata: Class<gdMultipleInstructionMetadata>;
|
||||
@@ -235,4 +234,5 @@ declare class libGDevelop {
|
||||
ExportOptions: Class<gdExportOptions>;
|
||||
Exporter: Class<gdExporter>;
|
||||
JsCodeEvent: Class<gdJsCodeEvent>;
|
||||
MetadataDeclarationHelper: Class<gdMetadataDeclarationHelper>;
|
||||
};
|
68
appveyor.yml
68
appveyor.yml
@@ -13,68 +13,68 @@ branches:
|
||||
- master
|
||||
- /experimental-build.*/
|
||||
init:
|
||||
- ps: ''
|
||||
- ps: Install-Product node 16
|
||||
- cmd: set NODE_OPTIONS=--max-old-space-size=8192
|
||||
install:
|
||||
- ps: Install-Product node 16
|
||||
# Build GDevelop.js (and run tests to ensure it works).
|
||||
# (in a subshell to avoid Emscripten polluting the Node.js and npm version for the rest of the build)
|
||||
- cmd: >-
|
||||
cd GDevelop.js
|
||||
# Build GDevelop.js (and run tests to ensure it works).
|
||||
# (in a subshell to avoid Emscripten polluting the Node.js and npm version for the rest of the build)
|
||||
- cmd: >-
|
||||
cd GDevelop.js
|
||||
|
||||
npm -v && npm install
|
||||
npm -v && npm install
|
||||
|
||||
git clone https://github.com/juj/emsdk.git
|
||||
git clone https://github.com/juj/emsdk.git
|
||||
|
||||
cd emsdk
|
||||
cd emsdk
|
||||
|
||||
emsdk install 1.39.6
|
||||
emsdk install 1.39.6
|
||||
|
||||
CMD /C "emsdk activate 1.39.6 && cd .. && npm run build"
|
||||
CMD /C "emsdk activate 1.39.6 && cd .. && npm run build"
|
||||
|
||||
cd ..\..
|
||||
cd ..\..
|
||||
|
||||
# Build GDevelop IDE
|
||||
- cmd: >-
|
||||
cd newIDE\app
|
||||
# Build GDevelop IDE
|
||||
- cmd: >-
|
||||
cd newIDE\app
|
||||
|
||||
npm -v && npm install
|
||||
npm -v && npm install
|
||||
|
||||
cd ..\electron-app
|
||||
cd ..\electron-app
|
||||
|
||||
npm -v && npm install
|
||||
npm -v && npm install
|
||||
|
||||
cd ..\..
|
||||
cd ..\..
|
||||
|
||||
# Package the app for Windows (and sign it with the certificate set in environment variables).
|
||||
# Don't sign the appx (it will be signed by the Microsoft Store).
|
||||
build_script:
|
||||
- ps: >-
|
||||
cd newIDE\electron-app
|
||||
- ps: >-
|
||||
cd newIDE\electron-app
|
||||
|
||||
node --max-old-space-size=3072 scripts/build.js --win nsis --publish=never
|
||||
node scripts/build.js --win nsis --publish=never
|
||||
|
||||
Remove-Item -Path Env:CSC_LINK ; Remove-Item -Path Env:CSC_KEY_PASSWORD ; node scripts/build.js --skip-app-build --win appx --publish=never
|
||||
Remove-Item -Path Env:CSC_LINK ; Remove-Item -Path Env:CSC_KEY_PASSWORD ; node scripts/build.js --skip-app-build --win appx --publish=never
|
||||
|
||||
cd ..\..
|
||||
cd ..\..
|
||||
|
||||
# Clean dist folder to keep only installers/binaries.
|
||||
- cmd: >-
|
||||
DEL /F/Q/S newIDE\electron-app\dist\win-unpacked
|
||||
# Clean dist folder to keep only installers/binaries.
|
||||
- cmd: >-
|
||||
DEL /F/Q/S newIDE\electron-app\dist\win-unpacked
|
||||
|
||||
# Run a few tests on Windows.
|
||||
test_script:
|
||||
- cmd: >-
|
||||
cd GDevelop.js
|
||||
- cmd: >-
|
||||
cd GDevelop.js
|
||||
|
||||
npm test
|
||||
npm test
|
||||
|
||||
cd ..
|
||||
cd ..
|
||||
|
||||
cd newIDE\app
|
||||
cd newIDE\app
|
||||
|
||||
npm test
|
||||
npm test
|
||||
|
||||
cd ..\..
|
||||
cd ..\..
|
||||
|
||||
artifacts:
|
||||
- path: newIDE\electron-app\dist
|
||||
|
@@ -105,7 +105,7 @@ Use [`addAction`](https://docs.gdevelop.io/GDCore%20Documentation/classgd_1_1_pl
|
||||
- Call `getCodeExtraInformation()` and then functions like [`setFunctionName` and `setIncludeFile`](https://docs.gdevelop.io/GDCore%20Documentation/classgd_1_1_instruction_metadata_1_1_extra_information.html) to declare the JavaScript function to be called and the file to be included.
|
||||
- If your function is asynchronous, call `setAsyncFunctionName` instead to tell GDevelop to wait for the returned `Task` to resolve before executing subsequent actions and subevents.
|
||||
- If you want to be able to toggle the awaiting on and off, make one implementation of the function that returns a `Task` and one that doesn't, and use both `setFunctionName` and `setAsyncFunctionName` respectively to declare both to GDevelop, making the action optionally async.
|
||||
- If you just want to return a promise to be awaited, you do not need to create your own task. Simply return `new gd.PromiseTask(yourPromise)`.
|
||||
- If you just want to return a promise to be awaited, you do not need to create your own task. Simply return `new gdjs.PromiseTask(yourPromise)`.
|
||||
- Note that, as of now, _only actions can be asynchronous_. Giving other functions an async function name will not have any effect.
|
||||
|
||||
> You can call these functions on the `extension` object, or on the objects returned by `extension.addObject` (for objects) or `extension.addBehavior` (for behaviors). See below.
|
||||
|
@@ -2,6 +2,7 @@
|
||||
<PROJECT_ROOT>/resources/.*
|
||||
<PROJECT_ROOT>/node_modules/protobufjs/src/bower.json
|
||||
<PROJECT_ROOT>/node_modules/resolve/test/resolver/malformed_package_json/.*
|
||||
<PROJECT_ROOT>/node_modules/eslint-plugin-react/node_modules/resolve/test/resolver/malformed_package_json/.*
|
||||
<PROJECT_ROOT>/node_modules/.cache/.*
|
||||
# Don't type check the GDJS runtime and extensions copied into node_modules (only used for the web-app),
|
||||
# as this would be redundant for JsExtension.js files (see [include] section) of Extensions, and the
|
||||
|
@@ -1,45 +0,0 @@
|
||||
// flow-typed signature: f5182962fc09f09ae79392a2021e40cf
|
||||
// flow-typed version: <<STUB>>/follow-redirects_v^1.2.3/flow_v0.78.0
|
||||
|
||||
/**
|
||||
* This is an autogenerated libdef stub for:
|
||||
*
|
||||
* 'follow-redirects'
|
||||
*
|
||||
* Fill this stub out by replacing all the `any` types.
|
||||
*
|
||||
* Once filled out, we encourage you to share your work with the
|
||||
* community by sending a pull request to:
|
||||
* https://github.com/flowtype/flow-typed
|
||||
*/
|
||||
|
||||
declare module 'follow-redirects' {
|
||||
declare module.exports: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* We include stubs for each file inside this npm package in case you need to
|
||||
* require those files directly. Feel free to delete any files that aren't
|
||||
* needed.
|
||||
*/
|
||||
declare module 'follow-redirects/http' {
|
||||
declare module.exports: any;
|
||||
}
|
||||
|
||||
declare module 'follow-redirects/https' {
|
||||
declare module.exports: any;
|
||||
}
|
||||
|
||||
// Filename aliases
|
||||
declare module 'follow-redirects/http.js' {
|
||||
declare module.exports: $Exports<'follow-redirects/http'>;
|
||||
}
|
||||
declare module 'follow-redirects/https.js' {
|
||||
declare module.exports: $Exports<'follow-redirects/https'>;
|
||||
}
|
||||
declare module 'follow-redirects/index' {
|
||||
declare module.exports: $Exports<'follow-redirects'>;
|
||||
}
|
||||
declare module 'follow-redirects/index.js' {
|
||||
declare module.exports: $Exports<'follow-redirects'>;
|
||||
}
|
39
newIDE/app/flow-typed/npm/wait-promise_vx.x.x.js
vendored
39
newIDE/app/flow-typed/npm/wait-promise_vx.x.x.js
vendored
@@ -1,39 +0,0 @@
|
||||
// flow-typed signature: 0e22f9916410ac6f4ba02775ed837a40
|
||||
// flow-typed version: <<STUB>>/wait-promise_v0.4.1/flow_v0.78.0
|
||||
|
||||
/**
|
||||
* This is an autogenerated libdef stub for:
|
||||
*
|
||||
* 'wait-promise'
|
||||
*
|
||||
* Fill this stub out by replacing all the `any` types.
|
||||
*
|
||||
* Once filled out, we encourage you to share your work with the
|
||||
* community by sending a pull request to:
|
||||
* https://github.com/flowtype/flow-typed
|
||||
*/
|
||||
|
||||
declare module 'wait-promise' {
|
||||
declare module.exports: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* We include stubs for each file inside this npm package in case you need to
|
||||
* require those files directly. Feel free to delete any files that aren't
|
||||
* needed.
|
||||
*/
|
||||
declare module 'wait-promise/src/wait-promise' {
|
||||
declare module.exports: any;
|
||||
}
|
||||
|
||||
declare module 'wait-promise/test/spec' {
|
||||
declare module.exports: any;
|
||||
}
|
||||
|
||||
// Filename aliases
|
||||
declare module 'wait-promise/src/wait-promise.js' {
|
||||
declare module.exports: $Exports<'wait-promise/src/wait-promise'>;
|
||||
}
|
||||
declare module 'wait-promise/test/spec.js' {
|
||||
declare module.exports: $Exports<'wait-promise/test/spec'>;
|
||||
}
|
44320
newIDE/app/package-lock.json
generated
44320
newIDE/app/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,26 +9,24 @@
|
||||
"@lingui/macro": "^2.7.3",
|
||||
"@storybook/addon-essentials": "6.3.12",
|
||||
"@storybook/react": "6.5.16",
|
||||
"adm-zip": "^0.5.10",
|
||||
"axios-mock-adapter": "^1.21.3",
|
||||
"babel-core": "^7.0.0-bridge.0",
|
||||
"babel-loader": "8.1.0",
|
||||
"flow-bin": "0.131.0",
|
||||
"flow-coverage-report": "^0.4.0",
|
||||
"folder-hash": "^3.0.0",
|
||||
"follow-redirects": "^1.2.3",
|
||||
"iso-639-1": "^2.0.3",
|
||||
"minimist": "1.2.5",
|
||||
"patch-package": "^6.4.7",
|
||||
"prettier": "1.15.3",
|
||||
"react-error-overlay": "^6.0.9",
|
||||
"react-scripts": "4.0.3",
|
||||
"react-scripts": "5.0.1",
|
||||
"recursive-copy": "^2.0.14",
|
||||
"recursive-readdir": "^2.2.2",
|
||||
"shelljs": "0.8.4",
|
||||
"storybook-addon-mock": "^1.7.0",
|
||||
"style-dictionary": "^2.10.2",
|
||||
"typescript": "^4.1.3",
|
||||
"unzipper": "^0.9.11",
|
||||
"webpack": "4.44.2",
|
||||
"workbox-build": "^4.3.1"
|
||||
},
|
||||
@@ -45,7 +43,6 @@
|
||||
"blueimp-md5": "^2.10.0",
|
||||
"classnames": "2.2.5",
|
||||
"date-fns": "2.16.1",
|
||||
"downshift": "^3.2.12",
|
||||
"element-closest": "2.0.2",
|
||||
"firebase": "9.0.0-beta.2",
|
||||
"fontfaceobserver": "2.0.13",
|
||||
@@ -55,6 +52,7 @@
|
||||
"lodash": "4.17.4",
|
||||
"node-require-function": "^1.2.0",
|
||||
"pixi-simple-gesture": "github:4ian/pixi-simple-gesture#v0.3.3",
|
||||
"path-browserify": "^1.0.1",
|
||||
"pixi.js-legacy": "6.1.2",
|
||||
"posthog-js": "^1.57.2",
|
||||
"prop-types": "^15.5.10",
|
||||
@@ -86,7 +84,6 @@
|
||||
"source-map-explorer": "^2.0.1",
|
||||
"three": "0.152.0",
|
||||
"url-search-params": "^1.0.2",
|
||||
"wait-promise": "0.4.1",
|
||||
"xxhashjs": "^0.2.2"
|
||||
},
|
||||
"scripts": {
|
||||
@@ -170,7 +167,7 @@
|
||||
],
|
||||
"jest": {
|
||||
"transformIgnorePatterns": [
|
||||
"<rootDir>/node_modules/(?!react-markdown|unified|remark-parse|mdast-util-from-markdown|micromark|decode-named-character-reference|remark-rehype|trim-lines|hast-util-whitespace|remark-gfm|mdast-util-gfm|mdast-util-find-and-replace|mdast-util-to-markdown|markdown-table)"
|
||||
"<rootDir>/node_modules/(?!react-markdown|unified|remark-parse|mdast-util-from-markdown|micromark|decode-named-character-reference|remark-rehype|trim-lines|hast-util-whitespace|remark-gfm|mdast-util-gfm|mdast-util-find-and-replace|mdast-util-to-markdown|markdown-table|is-plain-obj)"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -14,11 +14,6 @@ GDevelop relies on some dependencies that can have special requirements.
|
||||
- `babel-loader` is specified to be the exact version required by `react-scripts` (because `react-scripts` wants the exact version and will complain if forced to use the `babel-loader` of Storybook).
|
||||
- **Try removing these extra `devDependencies`** if you upgrade Storybook or Create React App.
|
||||
|
||||
## Create React App
|
||||
|
||||
We need `"react-error-overlay": "6.0.9"` because of <https://github.com/facebook/create-react-app/issues/11773>.
|
||||
Can be removed if upgrading create-react-app to v5.
|
||||
|
||||
## LinguiJS
|
||||
|
||||
- `"babel-core": "^7.0.0-bridge.0"` is needed for js-lingui `lingui extract` command (who runs Babel on source files).
|
||||
|
@@ -1,8 +1,8 @@
|
||||
diff --git a/node_modules/react-scripts/config/webpack.config.js b/node_modules/react-scripts/config/webpack.config.js
|
||||
index 26c2a65..ca5ccd8 100644
|
||||
index e465d8e..a66e4e4 100644
|
||||
--- a/node_modules/react-scripts/config/webpack.config.js
|
||||
+++ b/node_modules/react-scripts/config/webpack.config.js
|
||||
@@ -403,6 +403,8 @@ module.exports = function (webpackEnv) {
|
||||
@@ -415,6 +415,8 @@ module.exports = function (webpackEnv) {
|
||||
// The preset includes JSX, Flow, TypeScript, and some ESnext features.
|
||||
{
|
||||
test: /\.(js|mjs|jsx|ts|tsx)$/,
|
||||
@@ -11,7 +11,7 @@ index 26c2a65..ca5ccd8 100644
|
||||
include: paths.appSrc,
|
||||
loader: require.resolve('babel-loader'),
|
||||
options: {
|
||||
@@ -466,7 +468,10 @@ module.exports = function (webpackEnv) {
|
||||
@@ -467,7 +469,10 @@ module.exports = function (webpackEnv) {
|
||||
// Unlike the application JS, we only compile the standard ES features.
|
||||
{
|
||||
test: /\.(js|mjs)$/,
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user