diff --git a/.gitignore b/.gitignore index b8680775..3f82628a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,16 @@ # When configure fails, SCons outputs these config.log .sconf_temp +.config + +# build artefacts +.cache/ +*.o +compile_commands.json engine/.github project/.godot -build/PROJECT.pck -build/PROJECT.x86_64 -build/PROJECT.exe +build/authority.pck +build/authority.x86_64 +build/authority.exe build.zip diff --git a/.gitmodules b/.gitmodules index e69de29b..1b15f551 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "engine"] + path = engine + url = https://github.com/godotengine/godot.git diff --git a/engine b/engine new file mode 160000 index 00000000..e531f3eb --- /dev/null +++ b/engine @@ -0,0 +1 @@ +Subproject commit e531f3eb7b13a9adaaf5b15ac9b3aebc4c2030cd diff --git a/justfile b/justfile index f13b11e1..48c61a88 100644 --- a/justfile +++ b/justfile @@ -1,34 +1,46 @@ set export -BUILD_NAME := "change_me" - -release_template_path_linux := `realpath engine/bin/godot.linuxbsd.template_release.x86_64.llvm` -release_template_path_windows := `realpath engine/bin/godot.windows.template_release.x86_64.llvm` +BUILD_NAME := "authority" -build: - cd engine/ && scons target=editor symbols=yes optimization=debug dev_build=yes linker=mold use_llvm=yes compiledb=yes +build: format + # Compiling Editor + cd engine/ && scons target=editor symbols=yes optimization=debug dev_build=yes linker=mold use_llvm=yes compiledb=yes custom_modules="../modules" run: build + # Running Editor engine/bin/godot.linuxbsd.editor.dev.x86_64.llvm --editor --path project release-linux: build + # Compiling Linux Release cd engine/ && scons platform=linuxbsd target=template_release arch=x86_64 linker=mold use_llvm=yes compiledb=yes custom_modules="../modules" - sed -i "s!{path}!{{release_template_path_linux}}!" project/export_presets.cfg + # Preparing Build Environment + sed -i "s!templatepath!{{`realpath engine/bin/godot.linuxbsd.template_release.x86_64.llvm`}}!" project/export_presets.cfg rm -rf build && mkdir build engine/bin/godot.*.editor.dev.*.llvm --headless --export-release "Linux" project/project.godot && zip build.zip build/* + # Resetting Build Environment touch build/.gitkeep - sed -i "s!{{release_template_path_linux}}!{path}!" project/export_presets.cfg + sed -i "s!{{`realpath engine/bin/godot.linuxbsd.template_release.x86_64.llvm`}}!templatepath!" project/export_presets.cfg + # Completed Linux Release Build release-windows: build + # Compiling Windows Release cd engine/ && scons platform=windows target=template_release arch=x86_64 linker=mold use_llvm=yes compiledb=yes custom_modules="../modules" - sed -i "s!{path}!{{release_template_path_windows}}!" project/export_presets.cfg + # Preparing Build Environment + sed -i "s!templatepath!{{`realpath engine/bin/godot.windows.template_release.x86_64.llvm`}}!" project/export_presets.cfg rm -rf build && mkdir build engine/bin/godot.*.editor.dev.*.llvm --headless --export-release "Windows" project/project.godot && zip build.zip build/* - touch build/.gitkeep - sed -i "s!{{release_template_path_windows}}!{path}!" project/export_presets.cfg + # Resetting Build Environment + touch build/.gitkeep + sed -i "s!{{`realpath engine/bin/godot.windows.template_release.x86_64.llvm`}}!templatepath!" project/export_presets.cfg + # Completed Windows Release Build initialize-template projectname: + # Initializing Template {{projectname}} sed -i -e "s/PROJECT/{{projectname}}/g" ./modules/PROJECT/register_types.h ./modules/PROJECT/register_types.cpp ./project/project.godot ./project/export_presets.cfg .gitignore sed "s/change_me/{{projectname}}/" ./justfile mv ./modules/PROJECT ./modules/{{projectname}} + # Done Initializing, you will still have to update BUILD_NAME in your justfile +format: + # Formatting Custom Modules + clang-format -i $(find modules/ -iname '*.h' -o -iname '*.c' -o -iname '*.hpp' -o -iname '*.cpp' -o -iname '*.hxx' -o -iname '*.cxx') diff --git a/modules/.clang-format b/modules/.clang-format new file mode 100644 index 00000000..6a547cf6 --- /dev/null +++ b/modules/.clang-format @@ -0,0 +1,238 @@ +# Commented out parameters are those with the same value as base LLVM style. +# We can uncomment them if we want to change their value, or enforce the +# chosen value in case the base style changes (last sync: Clang 17.0.6). +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +# AlignArrayOfStructures: None +# AlignConsecutiveAssignments: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: true +# AlignConsecutiveBitFields: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: false +# AlignConsecutiveDeclarations: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: false +# AlignConsecutiveMacros: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCompound: false +# PadOperators: false +# AlignConsecutiveShortCaseStatements: +# Enabled: false +# AcrossEmptyLines: false +# AcrossComments: false +# AlignCaseColons: false +# AlignEscapedNewlines: Right +AlignOperands: DontAlign +AlignTrailingComments: + Kind: Never + OverEmptyLines: 0 +# AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: false +# AllowShortBlocksOnASingleLine: Never +# AllowShortCaseLabelsOnASingleLine: false +# AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +# AllowShortIfStatementsOnASingleLine: Never +# AllowShortLambdasOnASingleLine: All +# AllowShortLoopsOnASingleLine: false +# AlwaysBreakAfterDefinitionReturnType: None +# AlwaysBreakAfterReturnType: None +# AlwaysBreakBeforeMultilineStrings: false +# AlwaysBreakTemplateDeclarations: MultiLine +# AttributeMacros: +# - __capability +# BinPackArguments: true +# BinPackParameters: true +# BitFieldColonSpacing: Both +# BraceWrapping: +# AfterCaseLabel: false +# AfterClass: false +# AfterControlStatement: Never +# AfterEnum: false +# AfterFunction: false +# AfterNamespace: false +# AfterObjCDeclaration: false +# AfterStruct: false +# AfterUnion: false +# AfterExternBlock: false +# BeforeCatch: false +# BeforeElse: false +# BeforeLambdaBody: false +# BeforeWhile: false +# IndentBraces: false +# SplitEmptyFunction: true +# SplitEmptyRecord: true +# SplitEmptyNamespace: true +# BreakAfterAttributes: Never +# BreakAfterJavaFieldAnnotations: false +# BreakArrays: true +# BreakBeforeBinaryOperators: None +# BreakBeforeBraces: Attach +# BreakBeforeConceptDeclarations: Always +# BreakBeforeInlineASMColon: OnlyMultiline +# BreakBeforeTernaryOperators: true +BreakConstructorInitializers: AfterColon +# BreakInheritanceList: BeforeColon +# BreakStringLiterals: true +ColumnLimit: 0 +# CommentPragmas: "^ IWYU pragma:" +# CompactNamespaces: false +ConstructorInitializerIndentWidth: 8 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +# DerivePointerAlignment: false +# DisableFormat: false +# EmptyLineAfterAccessModifier: Never +# EmptyLineBeforeAccessModifier: LogicalBlock +# ExperimentalAutoDetectBinPacking: false +# FixNamespaceComments: true +# ForEachMacros: +# - foreach +# - Q_FOREACH +# - BOOST_FOREACH +# IfMacros: +# - KJ_IF_MAYBE +# IncludeBlocks: Preserve +IncludeCategories: + - Regex: ^".*"$ + Priority: 1 + - Regex: ^<.*\.h>$ + Priority: 2 + - Regex: ^<.*>$ + Priority: 3 +# IncludeIsMainRegex: (Test)?$ +# IncludeIsMainSourceRegex: "" +# IndentAccessModifiers: false +# IndentCaseBlocks: false +IndentCaseLabels: true +# IndentExternBlock: AfterExternBlock +# IndentGotoLabels: true +# IndentPPDirectives: None +# IndentRequiresClause: true +IndentWidth: 4 +# IndentWrappedFunctionNames: false +InsertBraces: true +# InsertNewlineAtEOF: false +# InsertTrailingCommas: None +# IntegerLiteralSeparator: +# Binary: 0 +# BinaryMinDigits: 0 +# Decimal: 0 +# DecimalMinDigits: 0 +# Hex: 0 +# HexMinDigits: 0 +JavaImportGroups: + - org.godotengine + - android + - androidx + - com.android + - com.google + - java + - javax +# JavaScriptQuotes: Leave +# JavaScriptWrapImports: true +# KeepEmptyLinesAtEOF: false +KeepEmptyLinesAtTheStartOfBlocks: false +# LambdaBodyIndentation: Signature +# Language: Cpp +# LineEnding: DeriveLF +# MacroBlockBegin: "" +# MacroBlockEnd: "" +# MaxEmptyLinesToKeep: 1 +# NamespaceIndentation: None +# ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +# ObjCBreakBeforeNestedBlockParam: true +# ObjCSpaceAfterProperty: false +# ObjCSpaceBeforeProtocolList: true +# PPIndentWidth: -1 +PackConstructorInitializers: NextLine +# PenaltyBreakAssignment: 2 +# PenaltyBreakBeforeFirstCallParameter: 19 +# PenaltyBreakComment: 300 +# PenaltyBreakFirstLessLess: 120 +# PenaltyBreakOpenParenthesis: 0 +# PenaltyBreakString: 1000 +# PenaltyBreakTemplateDeclaration: 10 +# PenaltyExcessCharacter: 1000000 +# PenaltyIndentedWhitespace: 0 +# PenaltyReturnTypeOnItsOwnLine: 60 +# PointerAlignment: Right +# QualifierAlignment: Leave +# ReferenceAlignment: Pointer +# ReflowComments: true +# RemoveBracesLLVM: false +# RemoveParentheses: Leave +RemoveSemicolon: true +# RequiresClausePosition: OwnLine +# RequiresExpressionIndentation: OuterScope +# SeparateDefinitionBlocks: Leave +# ShortNamespaceLines: 1 +# SortIncludes: CaseSensitive +# SortJavaStaticImport: Before +# SortUsingDeclarations: LexicographicNumeric +# SpaceAfterCStyleCast: false +# SpaceAfterLogicalNot: false +# SpaceAfterTemplateKeyword: true +# SpaceAroundPointerQualifiers: Default +# SpaceBeforeAssignmentOperators: true +# SpaceBeforeCaseColon: false +# SpaceBeforeCpp11BracedList: false +# SpaceBeforeCtorInitializerColon: true +# SpaceBeforeInheritanceColon: true +# SpaceBeforeJsonColon: false +# SpaceBeforeParens: ControlStatements +# SpaceBeforeParensOptions: +# AfterControlStatements: true +# AfterForeachMacros: true +# AfterFunctionDeclarationName: false +# AfterFunctionDefinitionName: false +# AfterIfMacros: true +# AfterOverloadedOperator: false +# AfterRequiresInClause: false +# AfterRequiresInExpression: false +# BeforeNonEmptyParentheses: false +# SpaceBeforeRangeBasedForLoopColon: true +# SpaceBeforeSquareBrackets: false +# SpaceInEmptyBlock: false +# SpacesBeforeTrailingComments: 1 +# SpacesInAngles: Never +# SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 0 # We want a minimum of 1 for comments, but allow 0 for disabled code. + Maximum: -1 +# SpacesInParens: Never +# SpacesInParensOptions: +# InConditionalStatements: false +# InCStyleCasts: false +# InEmptyParentheses: false +# Other: false +# SpacesInSquareBrackets: false +Standard: c++20 +# StatementAttributeLikeMacros: +# - Q_EMIT +# StatementMacros: +# - Q_UNUSED +# - QT_REQUIRE_VERSION +TabWidth: 4 +UseTab: Always +# VerilogBreakBetweenInstancePorts: true +# WhitespaceSensitiveMacros: +# - BOOST_PP_STRINGIZE +# - CF_SWIFT_NAME +# - NS_SWIFT_NAME +# - PP_STRINGIZE +# - STRINGIZE diff --git a/modules/PROJECT/macros.h b/modules/PROJECT/macros.h deleted file mode 100644 index c1c26d61..00000000 --- a/modules/PROJECT/macros.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef GODOT_EXTRA_MACROS_H -#define GODOT_EXTRA_MACROS_H - -#define BIND_GET_SET(m_property)\ -ClassDB::bind_method(D_METHOD("set_" #m_property, #m_property), &self_type::set_##m_property);\ -ClassDB::bind_method(D_METHOD("get_" #m_property), &self_type::get_##m_property) - -#define BIND_HPROPERTY(m_type, m_property, ...)\ -BIND_GET_SET(m_property);\ -ADD_PROPERTY(PropertyInfo(m_type, #m_property, __VA_ARGS__), "set_" #m_property, "get_" #m_property) - -#define BIND_PROPERTY(m_type, m_property)\ -BIND_GET_SET(m_property);\ -ADD_PROPERTY(PropertyInfo(m_type, #m_property), "set_" #m_property, "get_" #m_property) - -#endif // !GODOT_EXTRA_MACROS_H diff --git a/modules/PROJECT/register_types.cpp b/modules/PROJECT/register_types.cpp deleted file mode 100644 index a367b16d..00000000 --- a/modules/PROJECT/register_types.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "register_types.h" - -#include "core/object/class_db.h" - -void initialize_PROJECT_module(ModuleInitializationLevel p_level) { - if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { - return; - } -} - -void uninitialize_PROJECT_module(ModuleInitializationLevel p_level) { - if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { - return; - } -} diff --git a/modules/PROJECT/register_types.h b/modules/PROJECT/register_types.h deleted file mode 100644 index 2a1d0257..00000000 --- a/modules/PROJECT/register_types.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef PROJECT_REGISTER_TYPES_H -#define PROJECT_REGISTER_TYPES_H - -#include "modules/register_module_types.h" - -void initialize_PROJECT_module(ModuleInitializationLevel p_level); -void uninitialize_PROJECT_module(ModuleInitializationLevel p_level); - -#endif // !PROJECT_REGISTER_TYPES_H diff --git a/modules/PROJECT/SCsub b/modules/authority/SCsub similarity index 100% rename from modules/PROJECT/SCsub rename to modules/authority/SCsub diff --git a/modules/authority/__pycache__/config.cpython-313.pyc b/modules/authority/__pycache__/config.cpython-313.pyc new file mode 100644 index 00000000..8d3597ed Binary files /dev/null and b/modules/authority/__pycache__/config.cpython-313.pyc differ diff --git a/modules/PROJECT/config.py b/modules/authority/config.py similarity index 100% rename from modules/PROJECT/config.py rename to modules/authority/config.py diff --git a/modules/authority/game_state.cpp b/modules/authority/game_state.cpp new file mode 100644 index 00000000..8f0a1c5c --- /dev/null +++ b/modules/authority/game_state.cpp @@ -0,0 +1,24 @@ +#include "game_state.h" +#include "macros.h" + +void GameState::_bind_methods() { + BIND_PROPERTY(Variant::STRING, locale_uid); + BIND_PROPERTY(Variant::STRING, locale_entrance_path); +} + +void GameState::set_locale_uid(String const &value) { + this->locale_uid = value; +} + +String GameState::get_locale_uid() const { + return this->locale_uid; +} + +void GameState::set_locale_entrance_path(String const &value) { + this->locale_uid = value; +} + +String GameState::get_locale_entrance_path() const { + return this->locale_uid; +} + diff --git a/modules/authority/game_state.h b/modules/authority/game_state.h new file mode 100644 index 00000000..f1bac503 --- /dev/null +++ b/modules/authority/game_state.h @@ -0,0 +1,21 @@ +#ifndef GAME_STATE_H +#define GAME_STATE_H + +#include "core/object/object.h" +#include "core/object/class_db.h" + +class GameState : public Object { + GDCLASS(GameState, Object); + static void _bind_methods(); +public: + static GameState *get_singleton(); + void set_locale_uid(String const &value); + String get_locale_uid() const; + void set_locale_entrance_path(String const &value); + String get_locale_entrance_path() const; +private: + String locale_uid{""}; + String locale_entrance_path{""}; +}; + +#endif // !GAME_STATE_H diff --git a/modules/authority/locale_marker.cpp b/modules/authority/locale_marker.cpp new file mode 100644 index 00000000..9cd169b8 --- /dev/null +++ b/modules/authority/locale_marker.cpp @@ -0,0 +1,49 @@ +#include "locale_marker.h" +#include "authority/game_state.h" +#include "core/config/engine.h" +#include "core/input/input_enums.h" +#include "macros.h" + +void LocaleMarker::_bind_methods() { + BIND_HPROPERTY(Variant::STRING, locale_scene, PROPERTY_HINT_FILE, "*.tscn,*.scn"); +} + +void LocaleMarker::_notification(int what) { + if(Engine::get_singleton()->is_editor_hint()) { + return; + } + switch(what) { + default: return; + case NOTIFICATION_READY: + this->ready(); + return; + } +} + +void LocaleMarker::ready() { + this->connect(this->sig_input_event, callable_mp(this, &self_type::on_input_event)); +} + +void LocaleMarker::on_input_event(Node *camera, Ref event, Vector3 position, Vector3 normal, int shape_ind) { + Ref clicked{event}; + if(clicked.is_valid() && clicked->get_button_index() == MouseButton::LEFT) { + GameState::get_singleton()->set_locale_entrance_path(this->entrance_path); + GameState::get_singleton()->set_locale_uid(locale_scene); + } +} + +void LocaleMarker::set_locale_scene(String const &path) { + this->locale_scene = path; +} + +String LocaleMarker::get_locale_scene() const { + return this->locale_scene; +} + +void LocaleMarker::set_entrance_path(String const &node_path) { + this->entrance_path = node_path; +} + +String LocaleMarker::get_entrance_path() const { + return this->entrance_path; +} diff --git a/modules/authority/locale_marker.h b/modules/authority/locale_marker.h new file mode 100644 index 00000000..1020df96 --- /dev/null +++ b/modules/authority/locale_marker.h @@ -0,0 +1,25 @@ +#ifndef LOCALE_MARKER_H +#define LOCALE_MARKER_H + +#include "core/input/input_event.h" +#include "scene/3d/physics/area_3d.h" +#include "scene/main/node.h" + +class LocaleMarker : public Area3D { + GDCLASS(LocaleMarker, Area3D); + static void _bind_methods(); + void _notification(int what); + void ready(); + void on_input_event(Node *camera, Ref event, Vector3 position, Vector3 normal, int shape_ind); +public: + void set_locale_scene(String const &value); + String get_locale_scene() const; + void set_entrance_path(String const &value); + String get_entrance_path() const; +private: + String locale_scene{"res://"}; + String entrance_path{"%"}; + String const sig_input_event{"input_event"}; +}; + +#endif // !LOCALE_MARKER_H diff --git a/modules/authority/macros.h b/modules/authority/macros.h new file mode 100644 index 00000000..53be3185 --- /dev/null +++ b/modules/authority/macros.h @@ -0,0 +1,20 @@ +#ifndef GODOT_EXTRA_MACROS_H +#define GODOT_EXTRA_MACROS_H + +#define BIND_GET_SET(m_property) \ + ClassDB::bind_method(D_METHOD("set_" #m_property, #m_property), \ + &self_type::set_##m_property); \ + ClassDB::bind_method(D_METHOD("get_" #m_property), \ + &self_type::get_##m_property) + +#define BIND_HPROPERTY(m_type, m_property, ...) \ + BIND_GET_SET(m_property); \ + ADD_PROPERTY(PropertyInfo(m_type, #m_property, __VA_ARGS__), \ + "set_" #m_property, "get_" #m_property) + +#define BIND_PROPERTY(m_type, m_property) \ + BIND_GET_SET(m_property); \ + ADD_PROPERTY(PropertyInfo(m_type, #m_property), "set_" #m_property, \ + "get_" #m_property) + +#endif // !GODOT_EXTRA_MACROS_H diff --git a/modules/authority/register_types.cpp b/modules/authority/register_types.cpp new file mode 100644 index 00000000..4a3fe411 --- /dev/null +++ b/modules/authority/register_types.cpp @@ -0,0 +1,26 @@ +#include "register_types.h" + +#include "authority/game_state.h" +#include "core/config/engine.h" +#include "core/object/class_db.h" + +GameState *game_state{nullptr}; + +void initialize_authority_module(ModuleInitializationLevel p_level) { + if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { + return; + } + GDREGISTER_CLASS(GameState); + + game_state = memnew(GameState); + Engine::get_singleton()->add_singleton(Engine::Singleton("GameState", GameState::get_singleton())); +} + +void uninitialize_authority_module(ModuleInitializationLevel p_level) { + if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { + return; + } + if(game_state) { + memdelete(game_state); + } +} diff --git a/modules/authority/register_types.h b/modules/authority/register_types.h new file mode 100644 index 00000000..d55a194f --- /dev/null +++ b/modules/authority/register_types.h @@ -0,0 +1,9 @@ +#ifndef authority_REGISTER_TYPES_H +#define authority_REGISTER_TYPES_H + +#include "modules/register_module_types.h" + +void initialize_authority_module(ModuleInitializationLevel p_level); +void uninitialize_authority_module(ModuleInitializationLevel p_level); + +#endif // !authority_REGISTER_TYPES_H diff --git a/project/export_presets.cfg b/project/export_presets.cfg index c7ac7659..fae5030f 100644 --- a/project/export_presets.cfg +++ b/project/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="../build/PROJECT.x86_64" +export_path="../build/authority.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -21,7 +21,7 @@ script_export_mode=2 [preset.0.options] custom_template/debug="" -custom_template/release="{path}" +custom_template/release="templatepath" debug/export_console_wrapper=1 binary_format/embed_pck=false texture_format/s3tc_bptc=true @@ -45,13 +45,13 @@ rm -rf \"{temp_dir}\"" name="Windows" platform="Windows Desktop" runnable=true -advanced_options=false +advanced_options=true dedicated_server=false custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="../build/PROJECT.exe" +export_path="../build/authority.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -63,7 +63,7 @@ script_export_mode=2 [preset.1.options] custom_template/debug="" -custom_template/release="{path}" +custom_template/release="templatepath" debug/export_console_wrapper=1 binary_format/embed_pck=false texture_format/s3tc_bptc=true diff --git a/project/project.godot b/project/project.godot index bd5ab3b0..8cd51d29 100644 --- a/project/project.godot +++ b/project/project.godot @@ -10,6 +10,6 @@ config_version=5 [application] -config/name="PROJECT" +config/name="authority" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg"