Hi, This update for Godot updates the bundled GodotSteam to the latest version 3.20. There is a bit of churn with matching the API to goldberg_emulator, but no fundamental change. Upstream has also changed its versioning of GodotSteam releases FYI.
Changelog is here: https://godotsteam.com/changelog/godot3/ I've tested this with a couple of use cases, including the Godot games Brotato, Cruelty Squad, and SokoSolitaire without any new issues. ok? Index: Makefile =================================================================== RCS file: /cvs/ports/games/godot/Makefile,v retrieving revision 1.46 diff -u -p -r1.46 Makefile --- Makefile 2 Aug 2023 22:01:51 -0000 1.46 +++ Makefile 10 Aug 2023 21:34:39 -0000 @@ -4,10 +4,10 @@ COMMENT-main = 2D and 3D game engine COMMENT-tools= 2D and 3D game engine (with tools) V = 3.5.2 -GODOTSTEAM_V = g352-s157-gs3193 +GODOTSTEAM_V = v3.20 DISTNAME = godot-${V}-stable PKGNAME = godot-${V} -REVISION = 2 +REVISION = 3 CATEGORIES = games @@ -122,7 +122,7 @@ post-extract: cp -R ${FILESDIR}/sndio ${WRKDIST}/drivers cp ${FILESDIR}/ujoy/joypad_openbsd.{cpp,h} \ ${WRKDIST}/platform/x11/ - cp -R ${WRKDIR}/GodotSteam-${GODOTSTEAM_V} ${WRKSRC}/godotsteam + mv ${WRKDIR}/GodotSteam-${GODOTSTEAM_V:S/v//} ${WRKSRC}/godotsteam pre-configure: ${SUBST_CMD} ${WRKSRC}/misc/dist/linux/*.desktop Index: distinfo =================================================================== RCS file: /cvs/ports/games/godot/distinfo,v retrieving revision 1.19 diff -u -p -r1.19 distinfo --- distinfo 30 Jul 2023 19:57:20 -0000 1.19 +++ distinfo 10 Aug 2023 21:34:39 -0000 @@ -1,4 +1,4 @@ -SHA256 (godot-3.5.2/g352-s157-gs3193.tar.gz) = fkEgw4Z1qS5NbmdXJpB/yOVUOMRiPCo0ZQCvcKfLDHk= SHA256 (godot-3.5.2/godot-3.5.2-stable.tar.xz) = tDodaynqJby6+86/e6CEMmGqEjfic5SUU4oiANjHvmI= -SIZE (godot-3.5.2/g352-s157-gs3193.tar.gz) = 185341 +SHA256 (godot-3.5.2/v3.20.tar.gz) = FoAl3iZ+1CWwIPXwJZ9S7q3QMn//RslYT06tXkc38QU= SIZE (godot-3.5.2/godot-3.5.2-stable.tar.xz) = 24047432 +SIZE (godot-3.5.2/v3.20.tar.gz) = 253832 Index: patches/patch-godotsteam_godotsteam_cpp =================================================================== RCS file: /cvs/ports/games/godot/patches/patch-godotsteam_godotsteam_cpp,v retrieving revision 1.1 diff -u -p -r1.1 patch-godotsteam_godotsteam_cpp --- patches/patch-godotsteam_godotsteam_cpp 30 Jul 2023 19:57:20 -0000 1.1 +++ patches/patch-godotsteam_godotsteam_cpp 10 Aug 2023 21:34:39 -0000 @@ -2,13 +2,12 @@ stub Steam::inputActionEventCallback stub setDualSenseTriggerEffect remove deprecated/incompatible namespaces ISteamHTMLSurface InitiateGameConnection_DEPRECATED => InitiateGameConnection -fix DEFVAL(NULL) ambiguous conversion -> back port cherry-picked from -commit 5f38ffca92fc348aa103903196f8bcec2cbbd38b +fix/remove dualsense/SCE namespace Index: godotsteam/godotsteam.cpp --- godotsteam/godotsteam.cpp.orig +++ godotsteam/godotsteam.cpp -@@ -1866,7 +1866,7 @@ void Steam::keyChar(uint32 unicode_char, int key_modif +@@ -1885,7 +1885,7 @@ void Steam::keyChar(uint32 unicode_char, int key_modif if(this_handle == 0){ this_handle = browser_handle; } @@ -17,7 +16,7 @@ Index: godotsteam/godotsteam.cpp } } -@@ -1877,7 +1877,7 @@ void Steam::keyDown(uint32 native_key_code, int key_mo +@@ -1896,7 +1896,7 @@ void Steam::keyDown(uint32 native_key_code, int key_mo if(this_handle == 0){ this_handle = browser_handle; } @@ -26,7 +25,7 @@ Index: godotsteam/godotsteam.cpp } } -@@ -1888,7 +1888,7 @@ void Steam::keyUp(uint32 native_key_code, int key_modi +@@ -1907,7 +1907,7 @@ void Steam::keyUp(uint32 native_key_code, int key_modi if(this_handle == 0){ this_handle = browser_handle; } @@ -35,7 +34,7 @@ Index: godotsteam/godotsteam.cpp } } -@@ -1910,7 +1910,7 @@ void Steam::mouseDoubleClick(HTMLMouseButton mouse_but +@@ -1929,7 +1929,7 @@ void Steam::mouseDoubleClick(HTMLMouseButton mouse_but if(this_handle == 0){ this_handle = browser_handle; } @@ -44,7 +43,7 @@ Index: godotsteam/godotsteam.cpp } } -@@ -1921,7 +1921,7 @@ void Steam::mouseDown(HTMLMouseButton mouse_button, ui +@@ -1940,7 +1940,7 @@ void Steam::mouseDown(HTMLMouseButton mouse_button, ui if(this_handle == 0){ this_handle = browser_handle; } @@ -53,7 +52,7 @@ Index: godotsteam/godotsteam.cpp } } -@@ -1943,7 +1943,7 @@ void Steam::mouseUp(HTMLMouseButton mouse_button, uint +@@ -1962,7 +1962,7 @@ void Steam::mouseUp(HTMLMouseButton mouse_button, uint if(this_handle == 0){ this_handle = browser_handle; } @@ -62,16 +61,18 @@ Index: godotsteam/godotsteam.cpp } } -@@ -2689,6 +2689,8 @@ bool Steam::setInputActionManifestFilePath(const Strin +@@ -2710,7 +2710,9 @@ bool Steam::setInputActionManifestFilePath(const Strin + } // Set the trigger effect for a DualSense controller - void Steam::setDualSenseTriggerEffect(uint64_t input_handle, int parameter_index, int trigger_mask, SCEPadTriggerEffectMode effect_mode, int position, int amplitude, int frequency){ +-void Steam::setDualSenseTriggerEffect(uint64_t input_handle, int parameter_index, int trigger_mask, SCEPadTriggerEffectMode effect_mode, int position, int amplitude, int frequency){ ++void Steam::setDualSenseTriggerEffect(uint64_t input_handle, int parameter_index, int trigger_mask, int effect_mode, int position, int amplitude, int frequency){ + return; + /* if(SteamInput() != NULL){ ScePadTriggerEffectParam these_parameters; memset(&these_parameters, 0, sizeof(these_parameters)); -@@ -2719,6 +2721,7 @@ void Steam::setDualSenseTriggerEffect(uint64_t input_h +@@ -2741,6 +2743,7 @@ void Steam::setDualSenseTriggerEffect(uint64_t input_h these_parameters.command[parameter_index].commandData.vibrationParam.frequency = frequency; SteamInput()->SetDualSenseTriggerEffect((InputHandle_t)input_handle, &these_parameters); } @@ -79,7 +80,7 @@ Index: godotsteam/godotsteam.cpp } //! Waits on an IPC event from Steam sent when there is new data to be fetched from the data drop. Returns true when data was recievied before the timeout expires. Useful for games with a dedicated input thread. -@@ -7892,7 +7895,7 @@ Dictionary Steam::initiateGameConnection(uint64_t serv +@@ -7927,7 +7930,7 @@ Dictionary Steam::initiateGameConnection(uint64_t serv int authSize = 2048; auth.resize(authSize); CSteamID server = (uint64)server_id; @@ -88,7 +89,7 @@ Index: godotsteam/godotsteam.cpp connection["auth_blob"] = auth; connection["server_id"] = server_id; connection["server_ip"] = server_ip; -@@ -7991,7 +7994,7 @@ void Steam::stopVoiceRecording(){ +@@ -8026,7 +8029,7 @@ void Steam::stopVoiceRecording(){ //! Notify the game server that we are disconnecting. NOTE: This is part of the old user authentication API and should not be mixed with the new API. void Steam::terminateGameConnection(uint32 server_ip, uint16 server_port){ if(SteamUser() != NULL){ @@ -97,7 +98,7 @@ Index: godotsteam/godotsteam.cpp } } -@@ -9487,27 +9490,28 @@ void Steam::http_request_headers_received(HTTPRequestH +@@ -9502,27 +9505,28 @@ void Steam::http_request_headers_received(HTTPRequestH // // Purpose: when callbacks are enabled this fires each time a controller action state changes void Steam::inputActionEventCallback(SteamInputActionEvent_t* call_data){ @@ -144,14 +145,24 @@ Index: godotsteam/godotsteam.cpp } //! Purpose: called when a new controller has been connected, will fire once per controller if multiple new controllers connect in the same frame -@@ -11682,8 +11686,8 @@ void Steam::_bind_methods(){ - ClassDB::bind_method(D_METHOD("cancelAuthTicket", "auth_ticket"), &Steam::cancelAuthTicket); - ClassDB::bind_method(D_METHOD("decompressVoice", "voice", "voice_size", "sample_rate"), &Steam::decompressVoice); - ClassDB::bind_method(D_METHOD("endAuthSession", "steam_id"), &Steam::endAuthSession); -- ClassDB::bind_method(D_METHOD("getAuthSessionTicket", "identity_reference"), &Steam::getAuthSessionTicket, DEFVAL(NULL)); -- ClassDB::bind_method(D_METHOD("getAuthTicketForWebApi", "identity_reference"), &Steam::getAuthTicketForWebApi, DEFVAL(NULL)); -+ ClassDB::bind_method(D_METHOD("getAuthSessionTicket", "identity_reference"), &Steam::getAuthSessionTicket, DEFVAL("")); -+ ClassDB::bind_method(D_METHOD("getAuthTicketForWebApi", "identity_reference"), &Steam::getAuthTicketForWebApi, DEFVAL("")); - ClassDB::bind_method("getAvailableVoice", &Steam::getAvailableVoice); - ClassDB::bind_method("getDurationControl", &Steam::getDurationControl); - ClassDB::bind_method("getEncryptedAppTicket", &Steam::getEncryptedAppTicket); +@@ -13610,13 +13614,13 @@ void Steam::_bind_methods(){ + BIND_ENUM_CONSTANT(RESULT_PHONE_NUMBER_IS_VOIP); + + // SCEPadTriggerEffectMode Enums +- BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_OFF); +- BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_FEEDBACK); +- BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_WEAPON); +- BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_VIBRATION); +- BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_FEEDBACK); +- BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_SLOPE_FEEDBACK); +- BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_VIBRATION); ++ //BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_OFF); ++ //BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_FEEDBACK); ++ //BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_WEAPON); ++ //BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_VIBRATION); ++ //BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_FEEDBACK); ++ //BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_SLOPE_FEEDBACK); ++ //BIND_ENUM_CONSTANT(PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_VIBRATION); + + // SocketConnectionType Enums + BIND_ENUM_CONSTANT(NET_SOCKET_CONNECTION_TYPE_NOT_CONNECTED); Index: patches/patch-godotsteam_godotsteam_h =================================================================== RCS file: /cvs/ports/games/godot/patches/patch-godotsteam_godotsteam_h,v retrieving revision 1.1 diff -u -p -r1.1 patch-godotsteam_godotsteam_h --- patches/patch-godotsteam_godotsteam_h 30 Jul 2023 19:57:20 -0000 1.1 +++ patches/patch-godotsteam_godotsteam_h 10 Aug 2023 21:34:39 -0000 @@ -1,4 +1,7 @@ don't use isteamdualsense.h API while not part of games/goldberg_emulator +fix namespace - need to remove ISteamHTMLSurface:: to build +disable SCE_* namespace, which is from isteamdualsense which we don't have +(yet) Index: godotsteam/godotsteam.h --- godotsteam/godotsteam.h.orig @@ -11,3 +14,165 @@ Index: godotsteam/godotsteam.h // Include Godot headers #include "core/object.h" +@@ -482,59 +481,59 @@ class Steam: public Object { + + // HTMLSurface enums + enum HTMLKeyModifiers { +- HTML_KEY_MODIFIER_NONE = ISteamHTMLSurface::k_eHTMLKeyModifier_None, +- HTML_KEY_MODIFIER_ALT_DOWN = ISteamHTMLSurface::k_eHTMLKeyModifier_AltDown, +- HTML_KEY_MODIFIER_CTRL_DOWN = ISteamHTMLSurface::k_eHTMLKeyModifier_CtrlDown, +- HTML_KEY_MODIFIER_SHIFT_DOWN = ISteamHTMLSurface::k_eHTMLKeyModifier_ShiftDown ++ HTML_KEY_MODIFIER_NONE = k_eHTMLKeyModifier_None, ++ HTML_KEY_MODIFIER_ALT_DOWN = k_eHTMLKeyModifier_AltDown, ++ HTML_KEY_MODIFIER_CTRL_DOWN = k_eHTMLKeyModifier_CtrlDown, ++ HTML_KEY_MODIFIER_SHIFT_DOWN = k_eHTMLKeyModifier_ShiftDown + }; + enum HTMLMouseButton { +- HTML_MOUSE_BUTTON_LEFT = ISteamHTMLSurface::eHTMLMouseButton_Left, +- HTML_MOUSE_BUTTON_RIGHT = ISteamHTMLSurface::eHTMLMouseButton_Right, +- HTML_MOUSE_BUTTON_MIDDLE = ISteamHTMLSurface::eHTMLMouseButton_Middle ++ HTML_MOUSE_BUTTON_LEFT = eHTMLMouseButton_Left, ++ HTML_MOUSE_BUTTON_RIGHT = eHTMLMouseButton_Right, ++ HTML_MOUSE_BUTTON_MIDDLE = eHTMLMouseButton_Middle + }; + enum MouseCursor { +- DC_USER = ISteamHTMLSurface::dc_user, +- DC_NONE = ISteamHTMLSurface::dc_none, +- DC_ARROW = ISteamHTMLSurface::dc_arrow, +- DC_IBEAM = ISteamHTMLSurface::dc_ibeam, +- DC_HOUR_GLASS = ISteamHTMLSurface::dc_hourglass, +- DC_WAIT_ARROW = ISteamHTMLSurface::dc_waitarrow, +- DC_CROSSHAIR = ISteamHTMLSurface::dc_crosshair, +- DC_UP = ISteamHTMLSurface::dc_up, +- DC_SIZE_NW = ISteamHTMLSurface::dc_sizenw, +- DC_SIZE_SE = ISteamHTMLSurface::dc_sizese, +- DC_SIZE_NE = ISteamHTMLSurface::dc_sizene, +- DC_SIZE_SW = ISteamHTMLSurface::dc_sizesw, +- DC_SIZE_W = ISteamHTMLSurface::dc_sizew, +- DC_SIZE_E = ISteamHTMLSurface::dc_sizee, +- DC_SIZE_N = ISteamHTMLSurface::dc_sizen, +- DC_SIZE_S = ISteamHTMLSurface::dc_sizes, +- DC_SIZE_WE = ISteamHTMLSurface::dc_sizewe, +- DC_SIZE_NS = ISteamHTMLSurface::dc_sizens, +- DC_SIZE_ALL = ISteamHTMLSurface::dc_sizeall, +- DC_NO = ISteamHTMLSurface::dc_no, +- DC_HAND = ISteamHTMLSurface::dc_hand, +- DC_BLANK = ISteamHTMLSurface::dc_blank, +- DC_MIDDLE_PAN = ISteamHTMLSurface::dc_middle_pan, +- DC_NORTH_PAN = ISteamHTMLSurface::dc_north_pan, +- DC_NORTH_EAST_PAN = ISteamHTMLSurface::dc_north_east_pan, +- DC_EAST_PAN = ISteamHTMLSurface::dc_east_pan, +- DC_SOUTH_EAST_PAN = ISteamHTMLSurface::dc_south_east_pan, +- DC_SOUTH_PAN = ISteamHTMLSurface::dc_south_pan, +- DC_SOUTH_WEST_PAN = ISteamHTMLSurface::dc_south_west_pan, +- DC_WEST_PAN = ISteamHTMLSurface::dc_west_pan, +- DC_NORTH_WEST_PAN = ISteamHTMLSurface::dc_north_west_pan, +- DC_ALIAS = ISteamHTMLSurface::dc_alias, +- DC_CELL = ISteamHTMLSurface::dc_cell, +- DC_COL_RESIZE = ISteamHTMLSurface::dc_colresize, +- DC_COPY_CUR = ISteamHTMLSurface::dc_copycur, +- DC_VERTICAL_TEXT = ISteamHTMLSurface::dc_verticaltext, +- DC_ROW_RESIZE = ISteamHTMLSurface::dc_rowresize, +- DC_ZOOM_IN = ISteamHTMLSurface::dc_zoomin, +- DC_ZOOM_OUT = ISteamHTMLSurface::dc_zoomout, +- DC_HELP = ISteamHTMLSurface::dc_help, +- DC_CUSTOM = ISteamHTMLSurface::dc_custom, +- DC_LAST = ISteamHTMLSurface::dc_last ++ DC_USER = dc_user, ++ DC_NONE = dc_none, ++ DC_ARROW = dc_arrow, ++ DC_IBEAM = dc_ibeam, ++ DC_HOUR_GLASS = dc_hourglass, ++ DC_WAIT_ARROW = dc_waitarrow, ++ DC_CROSSHAIR = dc_crosshair, ++ DC_UP = dc_up, ++ DC_SIZE_NW = dc_sizenw, ++ DC_SIZE_SE = dc_sizese, ++ DC_SIZE_NE = dc_sizene, ++ DC_SIZE_SW = dc_sizesw, ++ DC_SIZE_W = dc_sizew, ++ DC_SIZE_E = dc_sizee, ++ DC_SIZE_N = dc_sizen, ++ DC_SIZE_S = dc_sizes, ++ DC_SIZE_WE = dc_sizewe, ++ DC_SIZE_NS = dc_sizens, ++ DC_SIZE_ALL = dc_sizeall, ++ DC_NO = dc_no, ++ DC_HAND = dc_hand, ++ DC_BLANK = dc_blank, ++ DC_MIDDLE_PAN = dc_middle_pan, ++ DC_NORTH_PAN = dc_north_pan, ++ DC_NORTH_EAST_PAN = dc_north_east_pan, ++ DC_EAST_PAN = dc_east_pan, ++ DC_SOUTH_EAST_PAN = dc_south_east_pan, ++ DC_SOUTH_PAN = dc_south_pan, ++ DC_SOUTH_WEST_PAN = dc_south_west_pan, ++ DC_WEST_PAN = dc_west_pan, ++ DC_NORTH_WEST_PAN = dc_north_west_pan, ++ DC_ALIAS = dc_alias, ++ DC_CELL = dc_cell, ++ DC_COL_RESIZE = dc_colresize, ++ DC_COPY_CUR = dc_copycur, ++ DC_VERTICAL_TEXT = dc_verticaltext, ++ DC_ROW_RESIZE = dc_rowresize, ++ DC_ZOOM_IN = dc_zoomin, ++ DC_ZOOM_OUT = dc_zoomout, ++ DC_HELP = dc_help, ++ DC_CUSTOM = dc_custom, ++ DC_LAST = dc_last + }; + + // HTTP enums +@@ -1088,6 +1087,7 @@ class Steam: public Object { + INPUT_TYPE_COUNT = k_ESteamInputType_Count, + INPUT_TYPE_MAXIMUM_POSSIBLE_VALUE = k_ESteamInputType_MaximumPossibleValue + }; ++ /* + enum SCEPadTriggerEffectMode { + PAD_TRIGGER_EFFECT_MODE_OFF = SCE_PAD_TRIGGER_EFFECT_MODE_OFF, + PAD_TRIGGER_EFFECT_MODE_FEEDBACK = SCE_PAD_TRIGGER_EFFECT_MODE_FEEDBACK, +@@ -1097,6 +1097,7 @@ class Steam: public Object { + PAD_TRIGGER_EFFECT_MODE_SLOPE_FEEDBACK = SCE_PAD_TRIGGER_EFFECT_MODE_SLOPE_FEEDBACK, + PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_VIBRATION = SCE_PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_VIBRATION + }; ++ */ + enum XboxOrigin { + XBOX_ORIGIN_A = k_EXboxOrigin_A, + XBOX_ORIGIN_B = k_EXboxOrigin_B, +@@ -1191,9 +1192,9 @@ class Steam: public Object { + }; + enum P2PSessionError { + P2P_SESSION_ERROR_NONE = k_EP2PSessionErrorNone, +- P2P_SESSION_ERROR_NOT_RUNNING_APP = k_EP2PSessionErrorNotRunningApp_DELETED, ++ P2P_SESSION_ERROR_NOT_RUNNING_APP = k_EP2PSessionErrorNotRunningApp, + P2P_SESSION_ERROR_NO_RIGHTS_TO_APP = k_EP2PSessionErrorNoRightsToApp, +- P2P_SESSION_ERROR_DESTINATION_NOT_LOGGED_ON = k_EP2PSessionErrorDestinationNotLoggedIn_DELETED, ++ P2P_SESSION_ERROR_DESTINATION_NOT_LOGGED_ON = k_EP2PSessionErrorDestinationNotLoggedIn, + P2P_SESSION_ERROR_TIMEOUT = k_EP2PSessionErrorTimeout, + P2P_SESSION_ERROR_MAX = k_EP2PSessionErrorMax + }; +@@ -1990,7 +1991,7 @@ class Steam: public Object { + void triggerVibration(uint64_t input_handle, uint16_t left_speed, uint16_t right_speed); + void triggerVibrationExtended(uint64_t input_handle, uint16_t left_speed, uint16_t right_speed, uint16_t left_trigger_speed, uint16_t right_trigger_speed); + bool setInputActionManifestFilePath(const String& manifest_path); +- void setDualSenseTriggerEffect(uint64_t input_handle, int parameter_index, int trigger_mask, SCEPadTriggerEffectMode effect_mode, int position, int amplitude, int frequency); ++ void setDualSenseTriggerEffect(uint64_t input_handle, int parameter_index, int trigger_mask, int effect_mode, int position, int amplitude, int frequency); + bool waitForData(bool wait_forever, uint32 timeout); + + // Inventory //////////////////////////// +@@ -3013,7 +3014,7 @@ VARIANT_ENUM_CAST(Steam::RemoteStoragePlatform); + VARIANT_ENUM_CAST(Steam::RemoteStoragePublishedFileVisibility); + VARIANT_ENUM_CAST(Steam::Result); + +-VARIANT_ENUM_CAST(Steam::SCEPadTriggerEffectMode); ++//VARIANT_ENUM_CAST(Steam::SCEPadTriggerEffectMode); + VARIANT_ENUM_CAST(Steam::SocketConnectionType); + VARIANT_ENUM_CAST(Steam::SocketState); + +@@ -3040,4 +3041,4 @@ VARIANT_ENUM_CAST(Steam::WorkshopVote); + + VARIANT_ENUM_CAST(Steam::XboxOrigin); + +-#endif // GODOTSTEAM_H +\ No newline at end of file ++#endif // GODOTSTEAM_H