generated from krampus/template-godot4
Initial commit
This commit is contained in:
commit
2337b28620
|
@ -0,0 +1,49 @@
|
|||
class-definitions-order:
|
||||
- tools
|
||||
- classnames
|
||||
- extends
|
||||
- docstrings
|
||||
- signals
|
||||
- enums
|
||||
- consts
|
||||
- exports
|
||||
- pubvars
|
||||
- prvvars
|
||||
- onreadypubvars
|
||||
- onreadyprvvars
|
||||
- staticvars
|
||||
- others
|
||||
class-load-variable-name: (([A-Z][a-z0-9]*)+|_?[a-z][a-z0-9]*(_[a-z0-9]+)*)
|
||||
class-name: ([A-Z][a-z0-9]*)+
|
||||
class-variable-name: _?[a-z][a-z0-9]*(_[a-z0-9]+)*
|
||||
comparison-with-itself: null
|
||||
constant-name: _?[A-Z][A-Z0-9]*(_[A-Z0-9]+)*
|
||||
disable: []
|
||||
duplicated-load: null
|
||||
enum-element-name: '[A-Z][A-Z0-9]*(_[A-Z0-9]+)*'
|
||||
enum-name: ([A-Z][a-z0-9]*)+
|
||||
excluded_directories: !!set
|
||||
.git: null
|
||||
addons: null
|
||||
expression-not-assigned: null
|
||||
function-argument-name: _?[a-z][a-z0-9]*(_[a-z0-9]+)*
|
||||
function-arguments-number: 10
|
||||
function-name: (_on_([A-Z][a-z0-9]*)+(_[a-z0-9]+)*|_?[a-z][a-z0-9]*(_[a-z0-9]+)*)
|
||||
function-preload-variable-name: ([A-Z][a-z0-9]*)+
|
||||
function-variable-name: '[a-z][a-z0-9]*(_[a-z0-9]+)*'
|
||||
load-constant-name: (([A-Z][a-z0-9]*)+|_?[A-Z][A-Z0-9]*(_[A-Z0-9]+)*)
|
||||
loop-variable-name: _?[a-z][a-z0-9]*(_[a-z0-9]+)*
|
||||
max-file-lines: 1000
|
||||
max-line-length: 100
|
||||
max-public-methods: 20
|
||||
max-returns: 6
|
||||
mixed-tabs-and-spaces: null
|
||||
no-elif-return: null
|
||||
no-else-return: null
|
||||
private-method-call: null
|
||||
signal-name: '[a-z][a-z0-9]*(_[a-z0-9]+)*'
|
||||
sub-class-name: _?([A-Z][a-z0-9]*)+
|
||||
tab-characters: 1
|
||||
trailing-whitespace: null
|
||||
unnecessary-pass: null
|
||||
unused-argument: null
|
|
@ -0,0 +1,4 @@
|
|||
# Normalize EOL for all files that Git considers text files.
|
||||
* text=auto eol=lf
|
||||
*.svg filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
|
@ -0,0 +1,31 @@
|
|||
#!/bin/sh
|
||||
|
||||
GDFORMAT=gdformat
|
||||
GDLINT=gdlint
|
||||
VENV=.venv
|
||||
PYTHON=python3
|
||||
PIP=$VENV/bin/pip
|
||||
|
||||
if ! which $GDFORMAT &> /dev/null; then
|
||||
if ! test -f $VENV/bin/$GDFORMAT; then
|
||||
if ! which $PYTHON &> /dev/null; then
|
||||
echo "Please install Python 3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "gdscript-toolkit will be installed locally under $VENV."
|
||||
echo "this only needs to be performed once."
|
||||
echo "creating venv..."
|
||||
$PYTHON -m venv $VENV
|
||||
echo "installing gdscript-toolkit..."
|
||||
$PIP install -r requirements.txt
|
||||
fi
|
||||
|
||||
GDFORMAT=$VENV/bin/$GDFORMAT
|
||||
GDLINT=$VENV/bin/$GDLINT
|
||||
fi
|
||||
|
||||
set -x
|
||||
|
||||
$GDFORMAT --check .
|
||||
$GDLINT .
|
|
@ -0,0 +1,21 @@
|
|||
# Godot 4+ specific ignores
|
||||
.godot/
|
||||
|
||||
# Godot-specific ignores
|
||||
.import/
|
||||
export.cfg
|
||||
export_presets.cfg
|
||||
|
||||
# Imported translations (automatically generated from CSV files)
|
||||
*.translation
|
||||
|
||||
# Mono-specific ignores
|
||||
.mono/
|
||||
data_*/
|
||||
mono_crash.*.json
|
||||
|
||||
# Python venv
|
||||
.venv
|
||||
|
||||
# Project demos
|
||||
/demos/
|
|
@ -0,0 +1,160 @@
|
|||
# DEVELOPMENT.md
|
||||
|
||||
This is a set of general guidelines for developers.
|
||||
|
||||
## Dev Tools
|
||||
|
||||
This project uses `gdlint` and `gdformat` from
|
||||
[Scony/godot-gdscript-toolkit](https://github.com/Scony/godot-gdscript-toolkit)
|
||||
for linting & formatting, respectively.
|
||||
|
||||
These tools are integrated into our development workflow using Godot
|
||||
plugins:
|
||||
[ryan-haskell/gdformat-on-save](https://github.com/ryan-haskell/gdformat-on-save)
|
||||
and
|
||||
[krampus/gdlint-plugin](https://git.of.the.spectacle.lol/krampus/gdlint-plugin)
|
||||
respectively.
|
||||
|
||||
When a script is saved in the Godot editor, it is automatically
|
||||
formatted and checked for linting errors which are shown as warnings.
|
||||
|
||||
### Setup on Linux Environment
|
||||
|
||||
`gdlint` and `gdformat` require Python >=3.8. On Ubuntu:
|
||||
|
||||
```bash
|
||||
$ sudo apt update
|
||||
$ sudo apt install python3 python3-venv
|
||||
```
|
||||
|
||||
Next, install `gdscript-toolkit` through `pip`:
|
||||
|
||||
```bash
|
||||
$ pip install --user -r requirements.txt
|
||||
```
|
||||
|
||||
Then run `godot`. The plugins should be configured automatically.
|
||||
|
||||
(If you prefer to install `gdscript-toolkit` in a venv, just make sure
|
||||
the plugins can find their required binaries.)
|
||||
|
||||
### Setup on Windows Environment
|
||||
|
||||
Download and run the appropriate installer from the [Python website](https://www.python.org/downloads/windows/)
|
||||
|
||||
During installation, select the "Add python.exe to PATH" checkbox when prompted.
|
||||
|
||||
Open "Windows PowerShell" and run the following command to make sure pip is installed:
|
||||
```
|
||||
pip --version
|
||||
```
|
||||
|
||||
Assuming pip is installed you should see a message like:
|
||||
```
|
||||
pip 24.0 from C:\Users\dummy\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip (python 3.12)
|
||||
```
|
||||
|
||||
If pip is installed, run the following command to install the toolkit for the linter and formatter:
|
||||
```
|
||||
install gdtoolkit==4.2.2
|
||||
```
|
||||
|
||||
Then run the following command to finish the installation process:
|
||||
```
|
||||
pip install setuptools==69.5.1
|
||||
```
|
||||
|
||||
Check that everything installed by running "gdlint -h" and you should see something like:
|
||||
|
||||
```
|
||||
GDScript linter
|
||||
|
||||
A tool for diagnosing typical GDScript code problems.
|
||||
On success and the exitcode is 0.
|
||||
On failure, python exception or list of problems is shown and exitcode is non-zero.
|
||||
...
|
||||
```
|
||||
Also run "gdformat -h" and you should see something like:
|
||||
|
||||
```
|
||||
GDScript formatter
|
||||
|
||||
Uncompromising GDScript code formatter. The only configurable thing is
|
||||
max line length allowed and tabs/spaces indent. The rest will be taken
|
||||
care of by gdformat in a one, consistent way.
|
||||
...
|
||||
```
|
||||
|
||||
### Git Hooks
|
||||
|
||||
If you like, you can use the included githooks to automatically check formatting & linting before making a commit.
|
||||
|
||||
You can enable our githooks like this:
|
||||
|
||||
```bash
|
||||
$ git config core.hooksPath .githooks
|
||||
```
|
||||
|
||||
## Standards & Practices
|
||||
|
||||
### Style
|
||||
|
||||
Code should generally conform to the [GDScript style
|
||||
guide](https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_styleguide.html)
|
||||
where possible. Use the provided [linter and formatter](#dev-tools) to
|
||||
apply most style guidelines automatically.
|
||||
|
||||
### Type Annotations
|
||||
|
||||
Use explicit type annotations wherever possible. Don't fret about it
|
||||
too much, this is GDScript and there are a lot of situations where you
|
||||
gotta do some freaky duck typing, but try to do as much explicit type
|
||||
annotation as you can.
|
||||
|
||||
### Organization
|
||||
|
||||
_NOTE update this section as we build out the project more_
|
||||
|
||||
- All non-code assets go under `assets`
|
||||
- Graphical assets go under `assets/images`
|
||||
- Sprites go under `assets/images/sprites`
|
||||
- Audio assets go under `assets/audio`
|
||||
- Music goes under `assets/audio/music`
|
||||
- SFX assets go under `assets/audio/sfx`
|
||||
- Video assets go under `assets/video`
|
||||
- Scenes and GDScript source files go under `src`
|
||||
- Godot plugins go under `addons`
|
||||
|
||||
## Git Workflow
|
||||
|
||||
We use a standard branching workflow. Here's the full process of getting something merged in:
|
||||
|
||||
1. [Create an issue](../../../issues/new) for the feature you want to
|
||||
implement or the bug you want to fix, and assign it to
|
||||
yourself. Alternately, pick an existing issue you want to work on
|
||||
from the [issue tracker](../../../issues).
|
||||
2. In your local repo, create a new branch off of `main`. Your feature
|
||||
branch's name should include the issue number and a brief
|
||||
descriptive title, e.g. `37-immanentize-eschaton` or similar.
|
||||
3. Build the feature or fix the bug or whatever it is you're
|
||||
doing. Frequent, small commits are preferred, and it's a good idea
|
||||
to merge new changes from `main` often.
|
||||
4. Push your changes to the server and
|
||||
[create a pull request](../../../compare/main...main) to merge your
|
||||
feature branch into `main`. Your PR description should include the
|
||||
changes you made. If you include the phrase _"closes #[issue
|
||||
number]"_ in your PR description, the issue will automatically be
|
||||
closed when your PR is merged, which is nice.
|
||||
5. Request review from `intrusive/Owners`. If your patch touches
|
||||
something you think a specific dev needs to see, tag them for
|
||||
review explicitly.
|
||||
6. Once your PR gets approval from either 1 member of
|
||||
`intrusive/Owners` or from the specific developer who needs to see
|
||||
it, merge it into `main` yourself. There should be a button on the
|
||||
PR page to do this. If it says you can't merge automatically, you
|
||||
probably need to merge new changes from `main`
|
||||
7. If it wasn't done automatically, close the issue and delete the
|
||||
feature branch.
|
||||
|
||||
Try to stick to the above workflow as much as you can, but occasional
|
||||
shortcuts for hotfixes etc aren't the end of the world.
|
|
@ -0,0 +1,7 @@
|
|||
# Gfolf2
|
||||
|
||||
GFOLF: Combat Golf Action
|
||||
|
||||
## Development
|
||||
|
||||
see [[DEVELOPMENT.md]]
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2023 Ryan Haskell-Glatz
|
||||
|
||||
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.
|
|
@ -0,0 +1,70 @@
|
|||
@tool
|
||||
class_name FormatOnSave extends EditorPlugin
|
||||
|
||||
const SUCCESS: int = 0
|
||||
const AUTO_RELOAD_SETTING: String = "text_editor/behavior/files/auto_reload_scripts_on_external_change"
|
||||
var original_auto_reload_setting: bool
|
||||
|
||||
|
||||
# LIFECYCLE EVENTS
|
||||
func _enter_tree():
|
||||
activate_auto_reload_setting()
|
||||
resource_saved.connect(on_resource_saved)
|
||||
|
||||
|
||||
func _exit_tree():
|
||||
resource_saved.disconnect(on_resource_saved)
|
||||
restore_original_auto_reload_setting()
|
||||
|
||||
|
||||
# CALLED WHEN A SCRIPT IS SAVED
|
||||
func on_resource_saved(resource: Resource):
|
||||
if resource is Script:
|
||||
var script: Script = resource
|
||||
var current_script = get_editor_interface().get_script_editor().get_current_script()
|
||||
var text_edit: CodeEdit = (
|
||||
get_editor_interface().get_script_editor().get_current_editor().get_base_editor()
|
||||
)
|
||||
|
||||
# Prevents other unsaved scripts from overwriting the active one
|
||||
if current_script == script:
|
||||
var filepath: String = ProjectSettings.globalize_path(resource.resource_path)
|
||||
|
||||
# Run gdformat
|
||||
var exit_code = OS.execute("gdformat", [filepath])
|
||||
|
||||
# Replace source_code with formatted source_code
|
||||
if exit_code == SUCCESS:
|
||||
var formatted_source = FileAccess.get_file_as_string(resource.resource_path)
|
||||
FormatOnSave.reload_script(text_edit, formatted_source)
|
||||
|
||||
|
||||
# Workaround until this PR is merged:
|
||||
# https://github.com/godotengine/godot/pull/83267
|
||||
# Thanks, @KANAjetzt 💖
|
||||
static func reload_script(text_edit: TextEdit, source_code: String) -> void:
|
||||
var column := text_edit.get_caret_column()
|
||||
var row := text_edit.get_caret_line()
|
||||
var scroll_position_h := text_edit.get_h_scroll_bar().value
|
||||
var scroll_position_v := text_edit.get_v_scroll_bar().value
|
||||
|
||||
text_edit.text = source_code
|
||||
text_edit.set_caret_column(column)
|
||||
text_edit.set_caret_line(row)
|
||||
text_edit.scroll_horizontal = scroll_position_h
|
||||
text_edit.scroll_vertical = scroll_position_v
|
||||
|
||||
text_edit.tag_saved_version()
|
||||
|
||||
|
||||
# For this workaround to work, we need to disable the "Reload/Resave" pop-up
|
||||
func activate_auto_reload_setting():
|
||||
var settings := get_editor_interface().get_editor_settings()
|
||||
original_auto_reload_setting = settings.get(AUTO_RELOAD_SETTING)
|
||||
settings.set(AUTO_RELOAD_SETTING, true)
|
||||
|
||||
|
||||
# If the plugin is disabled, let's attempt to restore the original editor setting
|
||||
func restore_original_auto_reload_setting():
|
||||
var settings := get_editor_interface().get_editor_settings()
|
||||
settings.set(AUTO_RELOAD_SETTING, original_auto_reload_setting)
|
|
@ -0,0 +1,6 @@
|
|||
[plugin]
|
||||
name="Format on Save"
|
||||
description="Runs `gdformat` on save to automatically format your GD script as you code."
|
||||
author="Ryan Haskell-Glatz"
|
||||
version="1.2.0"
|
||||
script="format_on_save.gd"
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2024 Rob Kelly <contact@robkel.ly>
|
||||
|
||||
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.
|
|
@ -0,0 +1,6 @@
|
|||
[plugin]
|
||||
name="gdLint Plugin"
|
||||
description="Static code analysis with `gdlint`"
|
||||
author="Rob Kelly"
|
||||
version="1.0.0"
|
||||
script="run_linter.gd"
|
|
@ -0,0 +1,33 @@
|
|||
@tool
|
||||
class_name GDLintPlugin extends EditorPlugin
|
||||
|
||||
# If you've installed gdlint in a venv, you may want to overwrite this
|
||||
const GDLINT: String = "gdlint"
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
assert(not OS.execute(GDLINT, ["-h"]), "Could not find gdLint binary at {0}".format([GDLINT]))
|
||||
resource_saved.connect(on_save)
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
resource_saved.disconnect(on_save)
|
||||
|
||||
|
||||
func on_save(resource: Resource) -> void:
|
||||
# Run linting when a script resource is saved
|
||||
if resource is Script:
|
||||
var script: Script = resource
|
||||
var filepath: String = ProjectSettings.globalize_path(resource.resource_path)
|
||||
|
||||
var script_editor = EditorInterface.get_script_editor()
|
||||
var code_editor: CodeEdit = (
|
||||
script_editor.get_current_editor().get_base_editor()
|
||||
if script_editor.get_current_script() == script
|
||||
else null
|
||||
)
|
||||
|
||||
var gdlint_output: Array[String] = []
|
||||
var error: int = OS.execute(GDLINT, [filepath], gdlint_output, true)
|
||||
if error:
|
||||
push_warning("gdLint:\n" + gdlint_output[0])
|
|
@ -0,0 +1,40 @@
|
|||
; Engine configuration file.
|
||||
; It's best edited using the editor UI and not directly,
|
||||
; since the parameters that go here are not all obvious.
|
||||
;
|
||||
; Format:
|
||||
; [section] ; section goes between []
|
||||
; param=value ; assign values to parameters
|
||||
|
||||
config_version=5
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Gfolf2"
|
||||
config/features=PackedStringArray("4.2", "Forward Plus")
|
||||
run/max_fps=60
|
||||
config/icon="res://icon.svg"
|
||||
|
||||
[debug]
|
||||
|
||||
gdscript/warnings/untyped_declaration=2
|
||||
gdscript/warnings/unsafe_property_access=2
|
||||
gdscript/warnings/unsafe_method_access=2
|
||||
gdscript/warnings/unsafe_cast=1
|
||||
gdscript/warnings/unsafe_call_argument=2
|
||||
|
||||
[display]
|
||||
|
||||
window/stretch/mode="canvas_items"
|
||||
|
||||
[dotnet]
|
||||
|
||||
project/assembly_name="Gfolf2"
|
||||
|
||||
[editor]
|
||||
|
||||
movie_writer/movie_file="demos/demo.avi"
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PackedStringArray("res://addons/format_on_save/plugin.cfg", "res://addons/gdlint_plugin/plugin.cfg")
|
|
@ -0,0 +1,2 @@
|
|||
gdtoolkit>=4.2.2,<4.3
|
||||
setuptools>=69.5.1,<69.6
|
Loading…
Reference in New Issue