diff --git a/addons/godot-rapier2d/Fluid2D.svg b/addons/godot-rapier2d/Fluid2D.svg new file mode 100644 index 0000000..e55507f --- /dev/null +++ b/addons/godot-rapier2d/Fluid2D.svg @@ -0,0 +1,3 @@ + + + diff --git a/addons/godot-rapier2d/Fluid2D.svg.import b/addons/godot-rapier2d/Fluid2D.svg.import new file mode 100644 index 0000000..4a1f6c6 --- /dev/null +++ b/addons/godot-rapier2d/Fluid2D.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cv17s0qjrqj16" +path="res://.godot/imported/Fluid2D.svg-947567c51a8b586a0e695be7cba2d975.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/godot-rapier2d/Fluid2D.svg" +dest_files=["res://.godot/imported/Fluid2D.svg-947567c51a8b586a0e695be7cba2d975.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/godot-rapier2d/LICENSE b/addons/godot-rapier2d/LICENSE new file mode 100644 index 0000000..556baa8 --- /dev/null +++ b/addons/godot-rapier2d/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Fabrice Cipolla, Sp3ctralCat and Dragos Daian + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/godot-rapier2d/Radial2D.svg b/addons/godot-rapier2d/Radial2D.svg new file mode 100644 index 0000000..e7f0c49 --- /dev/null +++ b/addons/godot-rapier2d/Radial2D.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/addons/godot-rapier2d/Radial2D.svg.import b/addons/godot-rapier2d/Radial2D.svg.import new file mode 100644 index 0000000..317d9d1 --- /dev/null +++ b/addons/godot-rapier2d/Radial2D.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cho3shol3rky2" +path="res://.godot/imported/Radial2D.svg-4380d9841bddc115105cff2016be7c6a.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/godot-rapier2d/Radial2D.svg" +dest_files=["res://.godot/imported/Radial2D.svg-4380d9841bddc115105cff2016be7c6a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/godot-rapier2d/THIRDPARTY.txt b/addons/godot-rapier2d/THIRDPARTY.txt new file mode 100644 index 0000000..d115c87 --- /dev/null +++ b/addons/godot-rapier2d/THIRDPARTY.txt @@ -0,0 +1,288 @@ +Godot Rapier incorporates third-party material from the projects listed below. + +Godot Engine (https://github.com/godotengine/godot) + + Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). + Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + +godot-cpp (https://github.com/godotengine/godot-cpp) + + Copyright (c) 2017-present Godot Engine contributors. + Copyright (c) 2022-present Mikael Hermansson. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + +rapier (https://github.com/dimforge/rapier) + + Copyright 2020 Sébastien Crozet + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Godot Jolt (https://github.com/godot-jolt/godot-jolt) + + Copyright (c) Mikael Hermansson and Godot Jolt contributors. + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +salva (https://github.com/dimforge/salva) + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020 Sébastien Crozet + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/addons/godot-rapier2d/bin/godot_rapier.wasm b/addons/godot-rapier2d/bin/godot_rapier.wasm new file mode 100644 index 0000000..a2c8c6d Binary files /dev/null and b/addons/godot-rapier2d/bin/godot_rapier.wasm differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.android.aarch64-linux-android.so b/addons/godot-rapier2d/bin/libgodot_rapier.android.aarch64-linux-android.so new file mode 100644 index 0000000..38fb157 Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.android.aarch64-linux-android.so differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.android.i686-linux-android.so b/addons/godot-rapier2d/bin/libgodot_rapier.android.i686-linux-android.so new file mode 100644 index 0000000..b7e8859 Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.android.i686-linux-android.so differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.android.x86_64-linux-android.so b/addons/godot-rapier2d/bin/libgodot_rapier.android.x86_64-linux-android.so new file mode 100644 index 0000000..aea50f0 Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.android.x86_64-linux-android.so differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.ios.framework/Info.plist b/addons/godot-rapier2d/bin/libgodot_rapier.ios.framework/Info.plist new file mode 100644 index 0000000..56c6af5 --- /dev/null +++ b/addons/godot-rapier2d/bin/libgodot_rapier.ios.framework/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleDevelopmentRegion + en + CFBundleExecutable + libgodot_rapier.ios + CFBundleName + Godot Rapier2D + CFBundleDisplayName + Godot Rapier2D + CFBundleIdentifier + org.godot-rapier2d.godot-rapier2d + NSHumanReadableCopyright + Copyright (c) 2023-present Fabrice Cipolla, Sp3ctralCat and Dragos Daian. + CFBundleVersion + 0.12.0 + CFBundleShortVersionString + 0.12.0 + CFBundlePackageType + FMWK + CSResourcesFileMapped + + DTPlatformName + iphoneos + MinimumOSVersion + 12.0 + + diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.ios.framework/libgodot_rapier.ios b/addons/godot-rapier2d/bin/libgodot_rapier.ios.framework/libgodot_rapier.ios new file mode 100644 index 0000000..02effc9 Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.ios.framework/libgodot_rapier.ios differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.linux.x86_64-unknown-linux-gnu.so b/addons/godot-rapier2d/bin/libgodot_rapier.linux.x86_64-unknown-linux-gnu.so new file mode 100644 index 0000000..4128396 Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.linux.x86_64-unknown-linux-gnu.so differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/Resources/Info.plist b/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/Resources/Info.plist new file mode 100644 index 0000000..bde2089 --- /dev/null +++ b/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/Resources/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleExecutable + libgodot_rapier.macos.dylib + CFBundleIdentifier + org.godot-rapier2d.godot-rapier2d + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Godot Rapier2D + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSupportedPlatforms + + MacOSX + + NSHumanReadableCopyright + Copyright (c) 2023-present Fabrice Cipolla, Sp3ctralCat and Dragos Daian. + CFBundleVersion + 1.0.0 + LSMinimumSystemVersion + 10.12 + + diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/_CodeSignature/CodeResources b/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..1eaabd7 --- /dev/null +++ b/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/_CodeSignature/CodeResources @@ -0,0 +1,128 @@ + + + + + files + + Resources/Info.plist + + FZy7+eYDJuYSbntBY+mwtyopSvE= + + + files2 + + Resources/Info.plist + + hash2 + + MMDYIVdI76poLGbcF02jJpJ+oHcs7q1NjyfgsaN1jus= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/libgodot_rapier.macos.dylib b/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/libgodot_rapier.macos.dylib new file mode 100644 index 0000000..f710e7b Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.macos.framework/libgodot_rapier.macos.dylib differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.windows.aarch64-pc-windows-msvc.dll b/addons/godot-rapier2d/bin/libgodot_rapier.windows.aarch64-pc-windows-msvc.dll new file mode 100644 index 0000000..971cae5 Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.windows.aarch64-pc-windows-msvc.dll differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.windows.i686-pc-windows-msvc.dll b/addons/godot-rapier2d/bin/libgodot_rapier.windows.i686-pc-windows-msvc.dll new file mode 100644 index 0000000..524761b Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.windows.i686-pc-windows-msvc.dll differ diff --git a/addons/godot-rapier2d/bin/libgodot_rapier.windows.x86_64-pc-windows-msvc.dll b/addons/godot-rapier2d/bin/libgodot_rapier.windows.x86_64-pc-windows-msvc.dll new file mode 100644 index 0000000..9847e37 Binary files /dev/null and b/addons/godot-rapier2d/bin/libgodot_rapier.windows.x86_64-pc-windows-msvc.dll differ diff --git a/addons/godot-rapier2d/bin/wasm-nothreads/godot_rapier.wasm b/addons/godot-rapier2d/bin/wasm-nothreads/godot_rapier.wasm new file mode 100644 index 0000000..2a9fdf3 Binary files /dev/null and b/addons/godot-rapier2d/bin/wasm-nothreads/godot_rapier.wasm differ diff --git a/addons/godot-rapier2d/bin/~libgodot_rapier.windows.x86_64-pc-windows-msvc.dll b/addons/godot-rapier2d/bin/~libgodot_rapier.windows.x86_64-pc-windows-msvc.dll new file mode 100644 index 0000000..9847e37 Binary files /dev/null and b/addons/godot-rapier2d/bin/~libgodot_rapier.windows.x86_64-pc-windows-msvc.dll differ diff --git a/addons/godot-rapier2d/circle_mesh.tres b/addons/godot-rapier2d/circle_mesh.tres new file mode 100644 index 0000000..630e7ea --- /dev/null +++ b/addons/godot-rapier2d/circle_mesh.tres @@ -0,0 +1,15 @@ +[gd_resource type="ArrayMesh" format=3 uid="uid://dahp28qij58i1"] + +[resource] +_surfaces = [{ +"2d": true, +"aabb": AABB(-16, -16, 0, 32, 32, 0), +"attribute_data": PackedByteArray(0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63), +"format": 34393296913, +"index_count": 6, +"index_data": PackedByteArray(3, 0, 0, 0, 1, 0, 1, 0, 2, 0, 3, 0), +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 4, +"vertex_data": PackedByteArray(0, 0, 128, 193, 0, 0, 128, 65, 0, 0, 128, 193, 0, 0, 128, 193, 0, 0, 128, 65, 0, 0, 128, 193, 0, 0, 128, 65, 0, 0, 128, 65) +}] diff --git a/addons/godot-rapier2d/faucet_2d.gd b/addons/godot-rapier2d/faucet_2d.gd new file mode 100644 index 0000000..6fd8653 --- /dev/null +++ b/addons/godot-rapier2d/faucet_2d.gd @@ -0,0 +1,27 @@ +class_name Faucet2D +extends Fluid2D + +@export var interval := 0.06 +@export var max_particles: int = 1000 +@export var width: int = 4 +@export var height: int = 2 + +var points_new: PackedVector2Array +var velocities_new: PackedVector2Array + + +func _ready(): + points_new = create_rectangle_points(width, height) + velocities_new.resize(points_new.size()) + var gravity_value = ProjectSettings.get("physics/2d/default_gravity") + var gravity_dir = ProjectSettings.get("physics/2d/default_gravity_vector") + var dir = global_transform.basis_xform(gravity_dir * gravity_value) + velocities_new.fill(dir) + get_tree().create_timer(interval).timeout.connect(_on_timer_timeout) + + +func _on_timer_timeout(): + get_tree().create_timer(interval).timeout.connect(_on_timer_timeout) + if len(points) > max_particles: + return + add_points_and_velocities(points_new, velocities_new) diff --git a/addons/godot-rapier2d/fluid_2d_circle.gd b/addons/godot-rapier2d/fluid_2d_circle.gd new file mode 100644 index 0000000..5c93e74 --- /dev/null +++ b/addons/godot-rapier2d/fluid_2d_circle.gd @@ -0,0 +1,10 @@ +@tool +extends Fluid2D + +@export var circle_radius := 10: + set(value): + if circle_radius != value: + circle_radius = value + points = create_circle_points(circle_radius) + get: + return circle_radius diff --git a/addons/godot-rapier2d/fluid_2d_rectangle.gd b/addons/godot-rapier2d/fluid_2d_rectangle.gd new file mode 100644 index 0000000..d1eb6a2 --- /dev/null +++ b/addons/godot-rapier2d/fluid_2d_rectangle.gd @@ -0,0 +1,17 @@ +@tool +extends Fluid2D + +@export var height := 10: + set(value): + if height != value: + height = value + points = create_rectangle_points(width, height) + get: + return height +@export var width := 10: + set(value): + if width != value: + width = value + points = create_rectangle_points(width, height) + get: + return width diff --git a/addons/godot-rapier2d/fluid_2d_renderer.gd b/addons/godot-rapier2d/fluid_2d_renderer.gd new file mode 100644 index 0000000..dca76dd --- /dev/null +++ b/addons/godot-rapier2d/fluid_2d_renderer.gd @@ -0,0 +1,31 @@ +@tool +class_name Fluid2DRenderer +extends MultiMeshInstance2D + +@export var fluid: Fluid2D +@export var color: Color = Color(0.8, 0.8, 0.8, 0.3) +@export var mesh_scale: Vector2 = Vector2(5, 5) + + +func _ready(): + if multimesh == null: + multimesh = MultiMesh.new() + multimesh.mesh = load("res://addons/godot-rapier2d/circle_mesh.tres").duplicate() + multimesh.use_colors = true + if texture == null: + texture = load("res://addons/godot-rapier2d/Radial2D.svg") + + +func _process(_delta): + if fluid == null: + return + global_transform = fluid.global_transform + var index = 0 + multimesh.instance_count = fluid.points.size() + var points = fluid.points + for i in points.size(): + var point = points[i] + var new_transform: Transform2D = Transform2D(0, mesh_scale, 0, point) + multimesh.set_instance_transform_2d(index, new_transform) + multimesh.set_instance_color(index, color) + index += 1 diff --git a/addons/godot-rapier2d/fluid_2d_shader_renderer.gd b/addons/godot-rapier2d/fluid_2d_shader_renderer.gd new file mode 100644 index 0000000..f2a4c0c --- /dev/null +++ b/addons/godot-rapier2d/fluid_2d_shader_renderer.gd @@ -0,0 +1,87 @@ +@tool +class_name Fluid2DShaderRenderer +extends CanvasLayer + +@export var fluid: Fluid2D: + set(value): + fluid = value + update_configuration_warnings() +@export var camera: Camera2D +@export var water_material: Material = load("res://addons/godot-rapier2d/water_shader.tres") +@export var mesh_scale: Vector2 = Vector2(5, 5) +var fluid_renderer: Fluid2DRenderer +var inside_camera: Camera2D: + set(value): + inside_camera = value + update_configuration_warnings() +var sub_viewport_container: SubViewportContainer +var sub_viewport: SubViewport + + +func _get_configuration_warnings(): + var warnings = [] + if camera == null: + warnings += ["Camera property is empty."] + if fluid == null: + warnings += ["Fluid property is empty."] + return warnings + + +func _create_subviewport_container(): + sub_viewport_container = SubViewportContainer.new() + sub_viewport_container.name = "SubViewportContainer" + add_child(sub_viewport_container) + sub_viewport_container.material = water_material + sub_viewport_container.size = Vector2( + ProjectSettings.get("display/window/size/viewport_width"), + ProjectSettings.get("display/window/size/viewport_height") + ) + + +func _create_subviewport(): + sub_viewport = SubViewport.new() + sub_viewport.name = "SubViewport" + sub_viewport_container.add_child(sub_viewport) + sub_viewport.transparent_bg = true + sub_viewport.size = sub_viewport_container.size + + +func _create_fluid_renderer(): + fluid_renderer = Fluid2DRenderer.new() + fluid_renderer.name = "Fluid2DRenderer" + fluid_renderer.color = Color(255, 0, 255) + fluid_renderer.mesh_scale = mesh_scale + fluid_renderer.fluid = fluid + sub_viewport.add_child(fluid_renderer) + + +func _create_inside_camera(): + inside_camera = Camera2D.new() + inside_camera.name = "Camera2D" + inside_camera.material = water_material + sub_viewport.add_child(inside_camera) + + +func _ready() -> void: + _create_subviewport_container() + _create_subviewport() + _create_fluid_renderer() + _create_inside_camera() + if fluid: + fluid.debug_draw = false + + +func _process(_delta: float) -> void: + if camera != null: + inside_camera.offset = camera.offset + inside_camera.zoom = camera.zoom + inside_camera.transform = camera.transform + sub_viewport_container.scale = Vector2(1.0 / camera.zoom.x, 1.0 / camera.zoom.y) + sub_viewport_container.position = camera.global_position + sub_viewport.size = sub_viewport_container.size + if camera.anchor_mode == Camera2D.AnchorMode.ANCHOR_MODE_FIXED_TOP_LEFT: + sub_viewport_container.position -= sub_viewport_container.size / 2 + if !camera.ignore_rotation: + sub_viewport_container.rotation = camera.global_rotation + else: + sub_viewport_container.rotation = 0 diff --git a/addons/godot-rapier2d/godot-rapier2d.gdextension b/addons/godot-rapier2d/godot-rapier2d.gdextension new file mode 100644 index 0000000..de8926f --- /dev/null +++ b/addons/godot-rapier2d/godot-rapier2d.gdextension @@ -0,0 +1,34 @@ +[configuration] + +entry_symbol = "gdext_rust_init" +compatibility_minimum = 4.3 + + +[libraries] + +macos.debug = "bin/libgodot_rapier.macos.framework" +macos.release = "bin/libgodot_rapier.macos.framework" +windows.debug.x86_64 = "bin/libgodot_rapier.windows.x86_64-pc-windows-msvc.dll" +windows.release.x86_64 = "bin/libgodot_rapier.windows.x86_64-pc-windows-msvc.dll" +windows.debug.x86_32 = "bin/libgodot_rapier.windows.i686-pc-windows-msvc.dll" +windows.release.x86_32 = "bin/libgodot_rapier.windows.i686-pc-windows-msvc.dll" +windows.debug.arm64 = "bin/libgodot_rapier.windows.aarch64-pc-windows-msvc.dll" +windows.release.arm64 = "bin/libgodot_rapier.windows.aarch64-pc-windows-msvc.dll" +linux.debug.x86_64 = "bin/libgodot_rapier.linux.x86_64-unknown-linux-gnu.so" +linux.release.x86_64 = "bin/libgodot_rapier.linux.x86_64-unknown-linux-gnu.so" +android.debug.x86_64 = "bin/libgodot_rapier.android.x86_64-linux-android.so" +android.release.x86_64 = "bin/libgodot_rapier.android.x86_64-linux-android.so" +android.debug.x86_32 = "bin/libgodot_rapier.android.i686-linux-android.so" +android.release.x86_32 = "bin/libgodot_rapier.android.i686-linux-android.so" +android.debug.arm64 = "bin/libgodot_rapier.android.aarch64-linux-android.so" +android.release.arm64 = "bin/libgodot_rapier.android.aarch64-linux-android.so" +ios.debug = "bin/libgodot_rapier.ios.framework" +ios.release = "bin/libgodot_rapier.ios.framework" +web.debug.threads.wasm32 = "bin/godot_rapier.wasm" +web.release.threads.wasm32 = "bin/godot_rapier.wasm" +web.debug.wasm32 = "bin/wasm-nothreads/godot_rapier.wasm" +web.release.wasm32 = "bin/wasm-nothreads/godot_rapier.wasm" + +[icons] + +Fluid2D = "Fluid2D.svg" diff --git a/addons/godot-rapier2d/logo_square_2d.png b/addons/godot-rapier2d/logo_square_2d.png new file mode 100644 index 0000000..3a0eb7f Binary files /dev/null and b/addons/godot-rapier2d/logo_square_2d.png differ diff --git a/addons/godot-rapier2d/logo_square_2d.png.import b/addons/godot-rapier2d/logo_square_2d.png.import new file mode 100644 index 0000000..35dc183 --- /dev/null +++ b/addons/godot-rapier2d/logo_square_2d.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1iwpd5epp8u6" +path="res://.godot/imported/logo_square_2d.png-ee7cb55fd9c4d1815ce7e83cd5401198.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/godot-rapier2d/logo_square_2d.png" +dest_files=["res://.godot/imported/logo_square_2d.png-ee7cb55fd9c4d1815ce7e83cd5401198.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/godot-rapier2d/plugin.info.cfg b/addons/godot-rapier2d/plugin.info.cfg new file mode 100644 index 0000000..363abc1 --- /dev/null +++ b/addons/godot-rapier2d/plugin.info.cfg @@ -0,0 +1,8 @@ +[plugin] + +name="Godot Rapier 2D" +description="A 2D and 3D drop-in replacement for the Godot engine that adds stability and fluids." +author="appsinacup" +version="0.8.8" +flavour="godot-rapier-2d-single-simd-parallel" +script="" diff --git a/addons/godot-rapier2d/rapier_state_2d.gd b/addons/godot-rapier2d/rapier_state_2d.gd new file mode 100644 index 0000000..ee5a98f --- /dev/null +++ b/addons/godot-rapier2d/rapier_state_2d.gd @@ -0,0 +1,105 @@ +### Supports [CollisionObject2D], [Joint2D] and [CollisionShape2D]. +@icon("res://addons/godot-rapier2d/logo_square_2d.png") +class_name Rapier2DState +extends Node + +var state: Dictionary = {} + + +func _is_physics_object(node: Node) -> bool: + return node is CollisionObject2D or node is Joint2D + + +func _get_all_physics_nodes(p_node: Node, path: String = "/root/") -> Array[String]: + var results: Array[String] = [] + if path == "/root/" && _is_physics_object(p_node): + results.append(path + p_node.name) + path += p_node.name + "/" + for node in p_node.get_children(): + if _is_physics_object(node): + results.append(path + node.name) + if node.get_child_count() > 0: + results.append_array(_get_all_physics_nodes(node, path)) + return results + + +## Save a node's physics state +func save_node(rid: RID, save_json: bool): + if save_json: + return JSON.parse_string(RapierPhysicsServer2D.export_json(rid)) + return RapierPhysicsServer2D.export_binary(rid) + + +## Load a node's physics state +func load_node(rid: RID, data: PackedByteArray): + RapierPhysicsServer2D.import_binary(rid, data) + + +## Save the state of whole world (single space) +func save_state(save_json: bool = false) -> int: + var physics_nodes := _get_all_physics_nodes(get_tree().current_scene) + for node_path in physics_nodes: + var node := get_node(node_path) + var rid: RID + if node is CollisionObject2D: + rid = node.get_rid() + for owner_id in node.get_shape_owners(): + for owner_shape_id in node.shape_owner_get_shape_count(owner_id): + var shape_rid = node.shape_owner_get_shape(owner_id, owner_shape_id).get_rid() + state[node_path + "/" + str(owner_id) + "/" + str(owner_shape_id)] = save_node( + shape_rid, save_json + ) + if node is Joint2D: + rid = node.get_rid() + state[node_path] = save_node(rid, save_json) + var space_rid = get_viewport().world_2d.space + state["space"] = save_node(space_rid, save_json) + state["id"] = RapierPhysicsServer2D.get_global_id() + return hash(JSON.stringify(state)) + + +## Load the state of whole world (single space) +func load_state() -> int: + var physics_nodes := _get_all_physics_nodes(get_tree().current_scene) + for node_path in physics_nodes: + var node := get_node(node_path) + var rid: RID + if node is CollisionObject2D: + rid = node.get_rid() + for owner_id in node.get_shape_owners(): + for owner_shape_id in node.shape_owner_get_shape_count(owner_id): + var shape_rid = node.shape_owner_get_shape(owner_id, owner_shape_id).get_rid() + var shape_state = state[ + node_path + "/" + str(owner_id) + "/" + str(owner_shape_id) + ] + load_node(shape_rid, JSON.parse_string(shape_state)) + if node is Joint2D: + rid = node.get_rid() + var node_state = state[node_path] + load_node(rid, JSON.parse_string(node_state)) + var space_rid = get_viewport().world_2d.space + load_node(space_rid, JSON.parse_string(state["space"])) + RapierPhysicsServer2D.set_global_id(int(state["id"])) + return hash(JSON.stringify(state)) + + +## Export the state to file +func export_state(file_name: String = "user://state.json"): + save_state(false) + FileAccess.open(file_name, FileAccess.WRITE).store_string(JSON.stringify(state, " ")) + + +## Import the state from file +func import_state(file_name: String = "user://state.json"): + state = JSON.parse_string(FileAccess.open(file_name, FileAccess.READ).get_as_text()) + load_state() + + +func _notification(what: int) -> void: + if what == NOTIFICATION_ENTER_TREE: + print("enter tree") + if what == NOTIFICATION_EXIT_TREE: + save_state(false) + FileAccess.open("user://save.json", FileAccess.WRITE).store_string( + JSON.stringify(state, " ") + ) diff --git a/addons/godot-rapier2d/water_shader.gdshader b/addons/godot-rapier2d/water_shader.gdshader new file mode 100644 index 0000000..ce31fd6 --- /dev/null +++ b/addons/godot-rapier2d/water_shader.gdshader @@ -0,0 +1,22 @@ +shader_type canvas_item; + +uniform float threshold = 0.8; +uniform vec4 water_color: source_color = vec4(0.12,0.24,0.45,0.65); +uniform vec4 test_color: source_color = vec4(1,0,1,1); + +uniform float speed = 0.1; // Speed of movement +uniform float amplitude = 0.1; // Amplitude of movement + +uniform sampler2D water_texture; + +void fragment(){ + float displacement = sin(TIME * speed) * amplitude; + vec4 screen_tex = texture(TEXTURE, SCREEN_UV).rgba; + + float color_distance = screen_tex.r; + if (color_distance > threshold) { + COLOR = texture(water_texture, SCREEN_UV + displacement).rgba * water_color; + } else { + COLOR = vec4(0.0); + } +} \ No newline at end of file diff --git a/addons/godot-rapier2d/water_shader.tres b/addons/godot-rapier2d/water_shader.tres new file mode 100644 index 0000000..1566b3c --- /dev/null +++ b/addons/godot-rapier2d/water_shader.tres @@ -0,0 +1,11 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://cysnk7s2ll173"] + +[ext_resource type="Shader" path="res://addons/godot-rapier2d/water_shader.gdshader" id="1_wgm3x"] + +[resource] +shader = ExtResource("1_wgm3x") +shader_parameter/threshold = 0.8 +shader_parameter/water_color = Color(0.12, 0.24, 0.45, 0.65) +shader_parameter/test_color = Color(1, 0, 1, 1) +shader_parameter/speed = 0.1 +shader_parameter/amplitude = 0.1 diff --git a/objects/brick.tscn b/objects/brick.tscn index 31799dd..792c036 100644 --- a/objects/brick.tscn +++ b/objects/brick.tscn @@ -9,7 +9,7 @@ size = Vector2(16, 10) [node name="Brick" type="Area2D"] collision_layer = 16 -collision_mask = 11 +collision_mask = 9 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("RectangleShape2D_ar0xf") diff --git a/objects/bullet.tscn b/objects/bullet.tscn index 9ac0b81..e055fd2 100644 --- a/objects/bullet.tscn +++ b/objects/bullet.tscn @@ -32,7 +32,7 @@ area2d = NodePath("..") [node name="BulletComponent" type="Node2D" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")] script = ExtResource("3_keogl") root = NodePath("..") -speed = 100.0 +speed = 80.0 area2d = NodePath("..") visibility_notifier = NodePath("../VisibleOnScreenNotifier2D") timer = NodePath("../Timer") diff --git a/objects/enemy.tscn b/objects/enemy.tscn index a9282f9..8a1a926 100644 --- a/objects/enemy.tscn +++ b/objects/enemy.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=8 format=3 uid="uid://bwdlmualj6xbw"] +[gd_scene load_steps=9 format=3 uid="uid://bwdlmualj6xbw"] [ext_resource type="Texture2D" uid="uid://xes6mt2dd5gu" path="res://sprites/robot_cutout.png" id="1_uh38l"] [ext_resource type="Script" path="res://scripts/components/health.gd" id="2_o170m"] [ext_resource type="Script" path="res://scripts/components/damage.gd" id="3_8jl3u"] [ext_resource type="Script" path="res://scripts/components/side_to_side_movement.gd" id="4_gbsq8"] [ext_resource type="Script" path="res://scripts/components/periodic_shooting.gd" id="5_m03v0"] +[ext_resource type="Script" path="res://scripts/components/enemy_death.gd" id="6_6p3gr"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_pwwji"] size = Vector2(18, 27) @@ -43,6 +44,13 @@ script = ExtResource("5_m03v0") side_to_side_movement = NodePath("../SideToSideMovement") root = NodePath("..") +[node name="EnemyDeathComponent" type="Node" parent="." node_paths=PackedStringArray("root", "collision_shape_2d", "health_component")] +script = ExtResource("6_6p3gr") +root = NodePath("..") +tween_duration = 0.1 +collision_shape_2d = NodePath("../Hitbox/CollisionShape2D") +health_component = NodePath("../HealthComponent") + [node name="Hitbox" type="Area2D" parent="."] collision_layer = 8 collision_mask = 20 diff --git a/project.godot b/project.godot index c54dc53..c01f81c 100644 --- a/project.godot +++ b/project.godot @@ -84,6 +84,10 @@ attack={ 2d_physics/layer_4="Enemy" 2d_physics/layer_5="player projectiles" +[physics] + +2d/physics_engine="GodotPhysics2D" + [rendering] textures/canvas_textures/default_texture_filter=0 diff --git a/scenes/test.tscn b/scenes/test.tscn index f3cde41..1cf2cc6 100644 --- a/scenes/test.tscn +++ b/scenes/test.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=19 format=4 uid="uid://h60obxmju6mo"] +[gd_scene load_steps=20 format=4 uid="uid://h60obxmju6mo"] [ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_5lb42"] [ext_resource type="TileSet" uid="uid://cl4bn8lofqvky" path="res://tileset/village/tileset_village.tres" id="1_d680t"] @@ -7,6 +7,7 @@ [ext_resource type="PackedScene" uid="uid://bqi5s710xb1ju" path="res://objects/brick_player.tscn" id="4_hetw8"] [ext_resource type="PackedScene" uid="uid://ct8fim6mduyl3" path="res://objects/collapsing_bridge.tscn" id="6_84ckv"] [ext_resource type="PackedScene" uid="uid://bwdlmualj6xbw" path="res://objects/enemy.tscn" id="7_qgddg"] +[ext_resource type="PackedScene" uid="uid://bhc7y4xugu4q7" path="res://objects/bullet.tscn" id="8_c68mx"] [sub_resource type="Gradient" id="Gradient_anvhr"] offsets = PackedFloat32Array(1) @@ -422,3 +423,12 @@ position = Vector2(484, -112) [node name="Enemy2" parent="." instance=ExtResource("7_qgddg")] position = Vector2(-14, -34) + +[node name="Bullet" parent="." instance=ExtResource("8_c68mx")] +position = Vector2(68, -89) + +[node name="Bullet2" parent="." instance=ExtResource("8_c68mx")] +position = Vector2(85, -89) + +[node name="Bullet3" parent="." instance=ExtResource("8_c68mx")] +position = Vector2(307, 0) diff --git a/scripts/components/brick_throw.gd b/scripts/components/brick_throw.gd index 11311cb..3b396e1 100644 --- a/scripts/components/brick_throw.gd +++ b/scripts/components/brick_throw.gd @@ -32,7 +32,7 @@ func throw_brick() -> void: var brick_instance: Node2D = brick_scene.instantiate() var brick: BulletComponent = brick_instance.get_node("BulletComponent") brick_instance.position = player_controller.position - brick.direction = Vector2.RIGHT if player_controller.velocity.x >= 0.0 else Vector2.LEFT + brick.direction = player_controller.last_direction get_tree().current_scene.add_child(brick_instance) can_throw = false diff --git a/scripts/components/bullet.gd b/scripts/components/bullet.gd index ea8baa4..cab74db 100644 --- a/scripts/components/bullet.gd +++ b/scripts/components/bullet.gd @@ -14,6 +14,7 @@ func _ready() -> void: root = get_parent() visibility_notifier.screen_exited.connect(_on_screen_exited) area2d.body_entered.connect(on_area2d_body_entered) + area2d.area_entered.connect(on_area2d_area_entered) timer.wait_time = life_time timer.timeout.connect(on_timer_timeout) @@ -31,5 +32,9 @@ func on_area2d_body_entered(_body: Node2D) -> void: root.queue_free() +func on_area2d_area_entered(_area: Area2D) -> void: + root.queue_free() + + func on_timer_timeout() -> void: root.queue_free() \ No newline at end of file diff --git a/scripts/components/enemy_death.gd b/scripts/components/enemy_death.gd new file mode 100644 index 0000000..6a460a7 --- /dev/null +++ b/scripts/components/enemy_death.gd @@ -0,0 +1,28 @@ +class_name EnemyDeathComponent +extends Node + +@export var root: Node2D +@export var tween_duration: float = 0.5 +@export var collision_shape_2d: CollisionShape2D +@export var health_component: HealthComponent + +func _ready() -> void: + if not collision_shape_2d: + printerr("No CollisionShape2D assigned!") + return + if not health_component: + printerr("No HealthComponent assigned!") + return + + health_component.on_death.connect(_on_health_component_on_death) + +func _on_health_component_on_death() -> void: + call_deferred("die") + + +func die() -> void: + collision_shape_2d.disabled = true + var tween := create_tween() + tween.tween_property(root, "scale", Vector2(0, 0), tween_duration) + await (tween.finished) + root.queue_free() \ No newline at end of file diff --git a/scripts/components/flip_player.gd b/scripts/components/flip_player.gd index c2491ce..d578475 100644 --- a/scripts/components/flip_player.gd +++ b/scripts/components/flip_player.gd @@ -6,7 +6,7 @@ extends Node2D @export var player_controller: PlayerController func _process(_delta: float) -> void: - var velocity = player_controller.velocity + var velocity := player_controller.last_direction if velocity.x < 0: eye_left.frame = 1 eye_right.frame = 1 diff --git a/scripts/player.gd b/scripts/player.gd index 6db4d12..35d3e1b 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -4,6 +4,7 @@ extends CharacterBody2D @export var speed: float = 300.0 var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") +var last_direction: Vector2 = Vector2.RIGHT @onready var root = $Root @onready var coyote_timer: Timer = $CoyoteTimer @@ -52,7 +53,10 @@ func _physics_process(delta): if Input.is_action_just_pressed("down"): position.y += 1 - var direction = Input.get_axis("left", "right") + var direction := Input.get_axis("left", "right") + if direction != 0: + last_direction = handle_direction(direction) + if direction: velocity.x = direction * speed else: @@ -69,3 +73,11 @@ func calculate_gravity() -> float: func on_coyote_timer_timeout(): coyote_mode = false + + +func handle_direction(input_dir: float) -> Vector2: + if input_dir > 0: + return Vector2.RIGHT + elif input_dir < 0: + return Vector2.LEFT + return last_direction \ No newline at end of file