diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml deleted file mode 100644 index 3f5dce8..0000000 --- a/.github/workflows/web.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Publish Web - -on: - workflow_dispatch: {} - -jobs: - publish-web: - name: Publish Web - runs-on: ubuntu-latest - container: - image: barichello/godot-ci:4.0.3 - steps: - - uses: actions/checkout@v3 - with: - lfs: true - submodules: true - - run: ./scripts/ci/prepare-templates.sh - - run: ./scripts/ci/build-channel.sh web - - run: apt-get update && apt-get install -y rsync - - uses: JamesIves/github-pages-deploy-action@v4.2.5 - with: - BRANCH: gh-pages - FOLDER: build/web diff --git a/godot/.gutconfig.json b/godot/.gutconfig.json index 72374c4..33e884c 100644 --- a/godot/.gutconfig.json +++ b/godot/.gutconfig.json @@ -10,7 +10,7 @@ "selected": "", "should_exit": true, "should_maximize": true, - "suffix": "Test.gd", + "suffix": "_test.gd", "tests": [], "unit_test_name": "" } diff --git a/godot/addons/base-system/save/README.md b/godot/addons/base-system/save/README.md deleted file mode 100644 index 6723b63..0000000 --- a/godot/addons/base-system/save/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Save System - -- `CacheManager`: save data for all `Persist` groups within the scene. Scene names has to be unique -- `SaveManager`: saves data to a file, accessed by a slot number - -- `CacheProperies`: define properties to be saved by `CacheManager` for a node diff --git a/godot/project.godot b/godot/project.godot index 12901b2..be2d560 100644 --- a/godot/project.godot +++ b/godot/project.godot @@ -18,7 +18,7 @@ config/icon="res://icon.svg" [autoload] -Env="*res://addons/debug/Env.gd" +Env="*res://src/env/Env.gd" SceneManager="*res://addons/scene-manager/SceneManager.tscn" [debug] diff --git a/godot/shared/effect/Effect.gd b/godot/shared/effect/Effect.gd deleted file mode 100644 index 7d678e2..0000000 --- a/godot/shared/effect/Effect.gd +++ /dev/null @@ -1,85 +0,0 @@ -class_name Effect -extends Node - -signal finished() - -@export var delay = 0.0 -@export var duration = 0.5 -@export var reverse = false -@export var loop = false -@export var autostart = true - -@export var transition = Tween.TRANS_LINEAR -@export var ease_type = Tween.EASE_IN_OUT - -@export var property: String - -@onready var node = get_parent() if obj == null else obj - -var obj -var tween: Tween -var start_value = null -var end_value = null - - -func _ready(): - if start_value == null: - start_value = node.get(property) - - if autostart: - start() - -func setup_props(prop: String, start_v, end_v): - property = prop - start_value = start_v - end_value = end_v - -# deprecated: directly set the fields -func setup(): - _interpolate_node() - - -# deprecated: directly set the fields -func _interpolate(prop: String, end_v, start_v = prop): - setup_props(prop, start_v, end_v) - _interpolate_node() - -func _interpolate_node(): - var init_start = node.get(start_value) if start_value is String else start_value - var init_end = node.get(end_value) if end_value is String else end_value - - var s = init_end if reverse else init_start - var e = init_start if reverse else init_end - - tween.tween_property(node, property, e, duration) \ - .from(s) \ - .set_delay(delay) \ - .set_ease(ease_type) \ - .set_trans(transition) - - node.set(property, s) - - -func finish(): - tween.pause() - tween.custom_step(delay + duration) - - -func start(): - _create_tween() - -func _create_tween(): - if tween: - tween.kill() - tween = get_tree().create_tween() - setup() - tween.play() - tween.finished.connect(_on_tween_completed) - -func _on_tween_completed(): - if loop: - reverse = not reverse - _create_tween() - else: - finished.emit() - queue_free() diff --git a/godot/shared/effect/FadeEffect.gd b/godot/shared/effect/FadeEffect.gd deleted file mode 100644 index 0ee1c5c..0000000 --- a/godot/shared/effect/FadeEffect.gd +++ /dev/null @@ -1,6 +0,0 @@ -class_name FadeEffect -extends Effect - - -func setup(): - _interpolate("modulate", Color.TRANSPARENT) diff --git a/godot/shared/effect/PositionEffect.gd b/godot/shared/effect/PositionEffect.gd deleted file mode 100644 index d302ba1..0000000 --- a/godot/shared/effect/PositionEffect.gd +++ /dev/null @@ -1,10 +0,0 @@ -class_name PositionEffect -extends Effect - -@export var dir := Vector2.UP -@export var amount := 5 - -@onready var start_pos = get_parent().position - -func setup(): - _interpolate("position", start_pos, start_pos + dir * amount) diff --git a/godot/shared/CameraShake.gd b/godot/src/base-system/CameraShake.gd similarity index 100% rename from godot/shared/CameraShake.gd rename to godot/src/base-system/CameraShake.gd diff --git a/godot/shared/DebounceAudio.gd b/godot/src/base-system/DebounceAudio.gd similarity index 100% rename from godot/shared/DebounceAudio.gd rename to godot/src/base-system/DebounceAudio.gd diff --git a/godot/shared/FrameFreeze.gd b/godot/src/base-system/FrameFreeze.gd similarity index 57% rename from godot/shared/FrameFreeze.gd rename to godot/src/base-system/FrameFreeze.gd index 2ae5575..0d7ea48 100644 --- a/godot/shared/FrameFreeze.gd +++ b/godot/src/base-system/FrameFreeze.gd @@ -1,6 +1,10 @@ +class_name FrameFreeze extends Node -func freeze(time_scale: float, duration: float): +@export var time_scale := 0.05 +@export var duration := 0.5 + +func freeze(): Engine.time_scale = time_scale await get_tree().create_timer(duration * time_scale).timeout Engine.time_scale = 1 diff --git a/godot/src/base-system/FreeOnEnterArea2D.gd b/godot/src/base-system/FreeOnEnterArea2D.gd new file mode 100644 index 0000000..12b3328 --- /dev/null +++ b/godot/src/base-system/FreeOnEnterArea2D.gd @@ -0,0 +1,7 @@ +extends Area2D + +@export var node: Node + +func _ready(): + area_entered.connect(func(_a): node.queue_free()) + body_entered.connect(func(_a): node.queue_free()) diff --git a/godot/src/base-system/FreeOnExit.gd b/godot/src/base-system/FreeOnExit.gd new file mode 100644 index 0000000..fbb6455 --- /dev/null +++ b/godot/src/base-system/FreeOnExit.gd @@ -0,0 +1,8 @@ +class_name FreeOnExit +extends VisibleOnScreenNotifier2D + +@export var node: Node + +func _ready(): + if node: + screen_exited.connect(func(): node.queue_free()) diff --git a/godot/src/base-system/FreeOnFinish.gd b/godot/src/base-system/FreeOnFinish.gd new file mode 100644 index 0000000..ba964bf --- /dev/null +++ b/godot/src/base-system/FreeOnFinish.gd @@ -0,0 +1,5 @@ +class_name FreeOnFinish +extends AnimatedSprite2D + +func _ready(): + animation_finished.connect(func(): queue_free()) diff --git a/godot/addons/debug/Logger.gd b/godot/src/base-system/Logger.gd similarity index 100% rename from godot/addons/debug/Logger.gd rename to godot/src/base-system/Logger.gd diff --git a/godot/src/base-system/OneShotParticles2D.gd b/godot/src/base-system/OneShotParticles2D.gd new file mode 100644 index 0000000..fec232e --- /dev/null +++ b/godot/src/base-system/OneShotParticles2D.gd @@ -0,0 +1,14 @@ +class_name OneShotParticles +extends GPUParticles2D + +signal finished() + +@export var wait_time := -1.0 +@onready var time := lifetime if wait_time < 0 else wait_time + +func _ready(): + emitting = true + get_tree().create_timer(time).timeout.connect(func(): + finished.emit() + queue_free() + ) diff --git a/godot/addons/base-system/README.md b/godot/src/base-system/README.md similarity index 100% rename from godot/addons/base-system/README.md rename to godot/src/base-system/README.md diff --git a/godot/shared/TweenCreator.gd b/godot/src/base-system/TweenCreator.gd similarity index 100% rename from godot/shared/TweenCreator.gd rename to godot/src/base-system/TweenCreator.gd diff --git a/godot/addons/base-system/input/DeviceSwitcher.gd b/godot/src/base-system/input/DeviceSwitcher.gd similarity index 100% rename from godot/addons/base-system/input/DeviceSwitcher.gd rename to godot/src/base-system/input/DeviceSwitcher.gd diff --git a/godot/addons/base-system/input/InputReader.gd b/godot/src/base-system/input/InputReader.gd similarity index 100% rename from godot/addons/base-system/input/InputReader.gd rename to godot/src/base-system/input/InputReader.gd diff --git a/godot/addons/base-system/input/InputType.gd b/godot/src/base-system/input/InputType.gd similarity index 100% rename from godot/addons/base-system/input/InputType.gd rename to godot/src/base-system/input/InputType.gd diff --git a/godot/addons/base-system/input/PlayerInput.gd b/godot/src/base-system/input/PlayerInput.gd similarity index 100% rename from godot/addons/base-system/input/PlayerInput.gd rename to godot/src/base-system/input/PlayerInput.gd diff --git a/godot/addons/base-system/input/TouchReader.gd b/godot/src/base-system/input/TouchReader.gd similarity index 100% rename from godot/addons/base-system/input/TouchReader.gd rename to godot/src/base-system/input/TouchReader.gd diff --git a/godot/shared/items/Hand.gd b/godot/src/base-system/items/Hand.gd similarity index 100% rename from godot/shared/items/Hand.gd rename to godot/src/base-system/items/Hand.gd diff --git a/godot/shared/items/Interactable.gd b/godot/src/base-system/items/Interactable.gd similarity index 100% rename from godot/shared/items/Interactable.gd rename to godot/src/base-system/items/Interactable.gd diff --git a/godot/shared/items/sprite_outline.tres b/godot/src/base-system/items/sprite_outline.tres similarity index 100% rename from godot/shared/items/sprite_outline.tres rename to godot/src/base-system/items/sprite_outline.tres diff --git a/godot/addons/base-system/menu/AudioSettings.gd b/godot/src/base-system/menu/AudioSettings.gd similarity index 100% rename from godot/addons/base-system/menu/AudioSettings.gd rename to godot/src/base-system/menu/AudioSettings.gd diff --git a/godot/addons/base-system/menu/AudioSlider.gd b/godot/src/base-system/menu/AudioSlider.gd similarity index 100% rename from godot/addons/base-system/menu/AudioSlider.gd rename to godot/src/base-system/menu/AudioSlider.gd diff --git a/godot/addons/base-system/menu/Menu.gd b/godot/src/base-system/menu/Menu.gd similarity index 100% rename from godot/addons/base-system/menu/Menu.gd rename to godot/src/base-system/menu/Menu.gd diff --git a/godot/addons/base-system/menu/RemapButton.gd b/godot/src/base-system/menu/RemapButton.gd similarity index 100% rename from godot/addons/base-system/menu/RemapButton.gd rename to godot/src/base-system/menu/RemapButton.gd diff --git a/godot/addons/base-system/menu/RemapButton.tscn b/godot/src/base-system/menu/RemapButton.tscn similarity index 67% rename from godot/addons/base-system/menu/RemapButton.tscn rename to godot/src/base-system/menu/RemapButton.tscn index 66c083e..df313b7 100644 --- a/godot/addons/base-system/menu/RemapButton.tscn +++ b/godot/src/base-system/menu/RemapButton.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://blurtq1v44gav"] -[ext_resource type="Script" path="res://addons/base-system/menu/RemapButton.gd" id="1"] +[ext_resource type="Script" path="res://src/base-system/menu/RemapButton.gd" id="1"] [node name="RemapButton" type="Button"] anchors_preset = 15 diff --git a/godot/addons/base-system/menu/Settings.gd b/godot/src/base-system/menu/Settings.gd similarity index 100% rename from godot/addons/base-system/menu/Settings.gd rename to godot/src/base-system/menu/Settings.gd diff --git a/godot/src/base-system/move/BulletController.gd b/godot/src/base-system/move/BulletController.gd new file mode 100644 index 0000000..8359a44 --- /dev/null +++ b/godot/src/base-system/move/BulletController.gd @@ -0,0 +1,7 @@ +class_name BulletController +extends CharacterController + +@export var dir := Vector2.RIGHT + +func get_motion(): + return dir diff --git a/godot/src/base-system/move/CharacterController.gd b/godot/src/base-system/move/CharacterController.gd new file mode 100644 index 0000000..0e4f513 --- /dev/null +++ b/godot/src/base-system/move/CharacterController.gd @@ -0,0 +1,5 @@ +class_name CharacterController +extends Node2D + +func get_motion(): + return Vector2.ZERO diff --git a/godot/src/base-system/move/TargetController.gd b/godot/src/base-system/move/TargetController.gd new file mode 100644 index 0000000..5d763d2 --- /dev/null +++ b/godot/src/base-system/move/TargetController.gd @@ -0,0 +1,7 @@ +class_name TargetController +extends CharacterController + +@export var node: Node2D + +func get_motion(): + return global_position.direction_to(node.global_position) diff --git a/godot/src/base-system/move/TopDownMove2D.gd b/godot/src/base-system/move/TopDownMove2D.gd new file mode 100644 index 0000000..adaf049 --- /dev/null +++ b/godot/src/base-system/move/TopDownMove2D.gd @@ -0,0 +1,24 @@ +extends Node + +@export var ctrl: CharacterController +@export var speed_value: ValueProvider +@export var speed := 300 +@export var accel := 900 + +@export var debug := false + +var _logger := Logger.new("TopDownMove2D") + +func move(velocity: Vector2, delta: float): + var motion = Vector2.ZERO + if ctrl: + motion = ctrl.get_motion() + + if debug: + _logger.debug("Moving to %s" % motion) + + var s = _get_speed() + return velocity.move_toward(motion * s, accel * delta) + +func _get_speed(): + return speed_value.get_value() if speed_value else speed \ No newline at end of file diff --git a/godot/src/base-system/move/TopDownPlayerController.gd b/godot/src/base-system/move/TopDownPlayerController.gd new file mode 100644 index 0000000..b219e2b --- /dev/null +++ b/godot/src/base-system/move/TopDownPlayerController.gd @@ -0,0 +1,9 @@ +class_name TopDownPlayerController +extends CharacterController + +@export var input: PlayerInput + +func get_motion(): + var motion_x = input.get_action_strength("move_right") - input.get_action_strength("move_left") + var motion_y = input.get_action_strength("move_down") - input.get_action_strength("move_up") + return Vector2(motion_x, motion_y) diff --git a/godot/src/base-system/rpg/DelayedDamage.gd b/godot/src/base-system/rpg/DelayedDamage.gd new file mode 100644 index 0000000..b8cdf71 --- /dev/null +++ b/godot/src/base-system/rpg/DelayedDamage.gd @@ -0,0 +1,11 @@ +class_name DelayedDamage +extends Timer + +@export var health: Health +@export var damage := 1 + +func _ready(): + timeout.connect(func(): + if health: + health.hurt(damage) + ) diff --git a/godot/src/base-system/rpg/HitBox.gd b/godot/src/base-system/rpg/HitBox.gd new file mode 100644 index 0000000..de8750e --- /dev/null +++ b/godot/src/base-system/rpg/HitBox.gd @@ -0,0 +1,17 @@ +class_name HitBox +extends Area2D + +@export var damage := 1 +@export var damage_value: NumberValue +@export var knockback_force := 0 + +func _ready(): + area_entered.connect(func(area): + if area is HurtBox: + _do_damage(area) + ) + +func _do_damage(area: HurtBox): + var dmg = damage_value.get_value() if damage_value else damage + var knockback_dir = global_position.direction_to(area.global_position) + return area.damage(dmg, knockback_dir * knockback_force) diff --git a/godot/src/base-system/rpg/HitFlash2D.gd b/godot/src/base-system/rpg/HitFlash2D.gd new file mode 100644 index 0000000..52e3787 --- /dev/null +++ b/godot/src/base-system/rpg/HitFlash2D.gd @@ -0,0 +1,19 @@ +class_name HitFlash2D +extends Node + +@export var time := 0.1 +@export var node: Node2D + +func flash(): + if node and node.material: + var mat = node.material as ShaderMaterial + _set_hit_flash(mat, true) + await get_tree().create_timer(time).timeout + _set_hit_flash(mat, false) + +func reset(): + if node: + _set_hit_flash(node.material, false) + +func _set_hit_flash(mat: ShaderMaterial, enable: bool): + pass diff --git a/godot/src/base-system/rpg/Hurtbox.gd b/godot/src/base-system/rpg/Hurtbox.gd new file mode 100644 index 0000000..74291af --- /dev/null +++ b/godot/src/base-system/rpg/Hurtbox.gd @@ -0,0 +1,34 @@ +class_name HurtBox +extends Area2D + +@export var health: Health +@export var hit_sound: AudioStreamPlayer +@export var frame_freeze: FrameFreeze +@export var hit_flash: HitFlash2D + +@export var invincible_time := 0.0 + +signal hit(dmg) +signal knockback(dir) + +var invincible := false + +func damage(dmg: int, knockback_force: Vector2): + if invincible: + return false + + invincible = true + hit.emit(dmg) + if knockback_force: + knockback.emit(knockback_force) + + if health: + health.hurt(dmg) + if hit_sound: + hit_sound.play() + if hit_flash: + hit_flash.flash() + if frame_freeze and not health.is_dead(): + frame_freeze.freeze() + + get_tree().create_timer(invincible_time).timeout.connect(func(): invincible = false) diff --git a/godot/shared/SoftCollision.gd b/godot/src/base-system/rpg/SoftCollision.gd similarity index 100% rename from godot/shared/SoftCollision.gd rename to godot/src/base-system/rpg/SoftCollision.gd diff --git a/godot/src/base-system/rpg/health.gd b/godot/src/base-system/rpg/health.gd new file mode 100644 index 0000000..0792738 --- /dev/null +++ b/godot/src/base-system/rpg/health.gd @@ -0,0 +1,34 @@ +class_name Health +extends Node + +signal health_changed(hp) +signal zero_health() + +@export var max_health_value: ValueProvider +@export var max_health := 1 +@onready var health := max_health : set = _set_health + +func hurt(dmg: int): + self.health -= dmg + +func heal(amount: int): + self.health += amount + +func _get_max_health(): + return max_health_value.get_value() if max_health_value else max_health + +func _set_health(v: int): + health = clamp(v, 0, max_health) + health_changed.emit(health) + + if is_dead(): + zero_health.emit() + +func is_full_health(): + return health == max_health + +func is_dead(): + return health <= 0 + +func get_health_percent(): + return float(health) / float(max_health) diff --git a/godot/src/base-system/rpg/rate_limiter.gd b/godot/src/base-system/rpg/rate_limiter.gd new file mode 100644 index 0000000..e5fdab1 --- /dev/null +++ b/godot/src/base-system/rpg/rate_limiter.gd @@ -0,0 +1,20 @@ +class_name RateLimiter +extends Timer + +@export var value: ValueProvider +@export var continuous := false + +func _ready(): + if value: + wait_time = value.get_value() + + one_shot = true + if continuous: + timeout.connect(func(): run()) + +func should_wait(): + return not is_stopped() + +func run(): + var v = wait_time if value == null else value.get_value() + start(v) diff --git a/godot/addons/base-system/save/CacheManager.gd b/godot/src/base-system/save/CacheManager.gd similarity index 100% rename from godot/addons/base-system/save/CacheManager.gd rename to godot/src/base-system/save/CacheManager.gd diff --git a/godot/addons/base-system/save/CacheProperties.gd b/godot/src/base-system/save/CacheProperties.gd similarity index 100% rename from godot/addons/base-system/save/CacheProperties.gd rename to godot/src/base-system/save/CacheProperties.gd diff --git a/godot/addons/base-system/save/SaveManager.gd b/godot/src/base-system/save/SaveManager.gd similarity index 100% rename from godot/addons/base-system/save/SaveManager.gd rename to godot/src/base-system/save/SaveManager.gd diff --git a/godot/shared/shaders/blur.gdshader b/godot/src/base-system/shaders/blur.gdshader similarity index 100% rename from godot/shared/shaders/blur.gdshader rename to godot/src/base-system/shaders/blur.gdshader diff --git a/godot/shared/shaders/hit.gdshader b/godot/src/base-system/shaders/hit.gdshader similarity index 100% rename from godot/shared/shaders/hit.gdshader rename to godot/src/base-system/shaders/hit.gdshader diff --git a/godot/shared/shaders/outline.gdshader b/godot/src/base-system/shaders/outline.gdshader similarity index 100% rename from godot/shared/shaders/outline.gdshader rename to godot/src/base-system/shaders/outline.gdshader diff --git a/godot/src/base-system/spawner/AreaSpawner2D.gd b/godot/src/base-system/spawner/AreaSpawner2D.gd new file mode 100644 index 0000000..1d6d4b9 --- /dev/null +++ b/godot/src/base-system/spawner/AreaSpawner2D.gd @@ -0,0 +1,14 @@ +class_name AreaSpawner2D +extends Spawner2D + +@export var center_offset := 10 +@export var count := 6 +@export_range(0, 360, 1) var spread := 360 + +func spawn(): + var dir = Vector2.RIGHT.rotated(global_rotation) + var spread = PI + for i in count: + var start = dir.rotated(-spread/2) + var d = start.rotated(i * spread/count) + _create(d * center_offset) diff --git a/godot/src/base-system/spawner/DeathSpawner2D.gd b/godot/src/base-system/spawner/DeathSpawner2D.gd new file mode 100644 index 0000000..3665d93 --- /dev/null +++ b/godot/src/base-system/spawner/DeathSpawner2D.gd @@ -0,0 +1,26 @@ +class_name DeathSpawner2D +extends Node2D + +@export var spawn_chance_value: ValueProvider +@export var spawn_chance := 1.0 +@export var health: Health +@export var scene: PackedScene + +func _ready(): + if health: + health.zero_health.connect(func(): _create()) + +func _should_spawn(): + return randf() <= _get_spawn_chance() + +func _get_spawn_chance(): + return spawn_chance_value.get_value() if spawn_chance_value else spawn_chance + +func _create(): + if not _should_spawn(): + return + + var x = scene.instantiate() + x.global_position = global_position + x.global_rotation = global_rotation + get_tree().current_scene.call_deferred("add_child", x) diff --git a/godot/src/base-system/spawner/RateLimitedSpawner2D.gd b/godot/src/base-system/spawner/RateLimitedSpawner2D.gd new file mode 100644 index 0000000..7d7410e --- /dev/null +++ b/godot/src/base-system/spawner/RateLimitedSpawner2D.gd @@ -0,0 +1,12 @@ +class_name RateLimitedSpawner2D +extends Spawner2D + +@export var limiter: RateLimiter + +func spawn(): + if limiter: + if limiter.should_wait(): return + + limiter.run() + + return _create() diff --git a/godot/src/base-system/spawner/Spawner2D.gd b/godot/src/base-system/spawner/Spawner2D.gd new file mode 100644 index 0000000..9f564fe --- /dev/null +++ b/godot/src/base-system/spawner/Spawner2D.gd @@ -0,0 +1,20 @@ +class_name Spawner2D +extends Node2D + +@export var autostart := false +@export var scene: PackedScene +@export var offset := 0 + +func _ready(): + if autostart: + spawn() + +func spawn(): + return _create() + +func _create(offset_dir = offset * Vector2.RIGHT.rotated(global_rotation)): + var eff = scene.instantiate() + eff.global_position = global_position + offset_dir + eff.global_rotation = global_rotation + get_tree().current_scene.add_child(eff) + return eff diff --git a/godot/src/base-system/value/number_value.gd b/godot/src/base-system/value/number_value.gd new file mode 100644 index 0000000..5ac4c0a --- /dev/null +++ b/godot/src/base-system/value/number_value.gd @@ -0,0 +1,7 @@ +class_name NumberValue +extends ValueProvider + +@export var value := 0.0 + +func get_value(): + return value diff --git a/godot/src/base-system/value/random_value.gd b/godot/src/base-system/value/random_value.gd new file mode 100644 index 0000000..87acd1b --- /dev/null +++ b/godot/src/base-system/value/random_value.gd @@ -0,0 +1,8 @@ +class_name RandomValue +extends ValueProvider + +@export var start := 0.0 +@export var end := 1.0 + +func get_value(): + return randf_range(start, end) diff --git a/godot/src/base-system/value/range_value.gd b/godot/src/base-system/value/range_value.gd new file mode 100644 index 0000000..425cbe6 --- /dev/null +++ b/godot/src/base-system/value/range_value.gd @@ -0,0 +1,10 @@ +class_name RangeValue +extends ValueProvider + +@export var start := 0.0 +@export var end := 1.0 +@export var value := 0.5 + +func get_value(): + var diff = end - start + return start + value * diff diff --git a/godot/src/base-system/value/value_provider.gd b/godot/src/base-system/value/value_provider.gd new file mode 100644 index 0000000..2acba0a --- /dev/null +++ b/godot/src/base-system/value/value_provider.gd @@ -0,0 +1,5 @@ +class_name ValueProvider +extends Node + +func get_value(): + return null diff --git a/godot/addons/debug/Build.gd b/godot/src/env/Build.gd similarity index 100% rename from godot/addons/debug/Build.gd rename to godot/src/env/Build.gd diff --git a/godot/addons/debug/Env.gd b/godot/src/env/Env.gd similarity index 100% rename from godot/addons/debug/Env.gd rename to godot/src/env/Env.gd diff --git a/godot/tests/input/BaseInputTest.gd b/godot/tests/input/base_input_test.gd similarity index 100% rename from godot/tests/input/BaseInputTest.gd rename to godot/tests/input/base_input_test.gd diff --git a/godot/tests/input/InputReaderTest.gd b/godot/tests/input/input_reader_test.gd similarity index 100% rename from godot/tests/input/InputReaderTest.gd rename to godot/tests/input/input_reader_test.gd diff --git a/godot/tests/input/PlayerInputTest.gd b/godot/tests/input/player_input_test.gd similarity index 100% rename from godot/tests/input/PlayerInputTest.gd rename to godot/tests/input/player_input_test.gd diff --git a/godot/tests/input/TouchReaderTest.gd b/godot/tests/input/touch_reader_test.gd similarity index 59% rename from godot/tests/input/TouchReaderTest.gd rename to godot/tests/input/touch_reader_test.gd index 9f88a3d..23121b9 100644 --- a/godot/tests/input/TouchReaderTest.gd +++ b/godot/tests/input/touch_reader_test.gd @@ -11,15 +11,15 @@ func before_each(): # gdlint:disable = private-method-call func test_mouse_swipe_right(): - input._input(mouse_button_event(BUTTON_LEFT, Vector2(0, 0))) - input._input(mouse_button_event(BUTTON_LEFT, Vector2(20, 0), false)) + input._input(mouse_button_event(MOUSE_BUTTON_LEFT, Vector2(0, 0))) + input._input(mouse_button_event(MOUSE_BUTTON_LEFT, Vector2(20, 0), false)) assert_signal_emitted_with_parameters(input, "swipe", [false]) func test_mouse_swipe_left(): - input._input(mouse_button_event(BUTTON_LEFT, Vector2(0, 0))) - input._input(mouse_button_event(BUTTON_LEFT, Vector2(-20, 0), false)) + input._input(mouse_button_event(MOUSE_BUTTON_LEFT, Vector2(0, 0))) + input._input(mouse_button_event(MOUSE_BUTTON_LEFT, Vector2(-20, 0), false)) assert_signal_emitted_with_parameters(input, "swipe", [true]) diff --git a/godot/tests/rpg/health_test.gd b/godot/tests/rpg/health_test.gd new file mode 100644 index 0000000..025cbf9 --- /dev/null +++ b/godot/tests/rpg/health_test.gd @@ -0,0 +1,47 @@ +extends UnitTest + +const MAX_HP = 10 + +var hp: Health + +func before_each(): + hp = Health.new() + hp.max_health = MAX_HP + add_child_autofree(hp) + watch_signals(hp) + +func test_start_with_health(): + assert_eq(hp.health, MAX_HP) + +func test_deal_damage(): + hp.hurt(2) + assert_eq(hp.health, 8) + assert_signal_emitted_with_parameters(hp, 'health_changed', [8]) + +func test_deal_damage_not_below_zero(): + hp.hurt(100) + assert_eq(hp.health, 0) + +func test_emit_on_zero_health(): + assert_false(hp.is_dead()) + hp.hurt(100) + assert_true(hp.is_dead()) + assert_signal_emitted(hp, 'zero_health') + +func test_heal(): + hp.hurt(5) + hp.heal(2) + assert_eq(hp.health, 7) + assert_signal_emitted_with_parameters(hp, 'health_changed', [7]) + +func test_not_heal_past_max_health(): + hp.hurt(5) + assert_false(hp.is_full_health()) + + hp.heal(100) + assert_true(hp.is_full_health()) + assert_eq(hp.health, MAX_HP) + +func test_get_health_percent(): + hp.hurt(2) + assert_eq(hp.get_health_percent(), 0.8) \ No newline at end of file diff --git a/godot/theme/theme.scss b/godot/theme/theme.scss index 39eb3e5..f22c1ae 100644 --- a/godot/theme/theme.scss +++ b/godot/theme/theme.scss @@ -2,7 +2,7 @@ $text-color: Color(0.9, 0.75, 1, 0.7); $hover-color: Color(1, 1, 1, 1); body { - font-family: url(jackeyfont.ttf); + // font-family: url(jackeyfont.ttf); font-size: 8; } diff --git a/scripts/init-template.sh b/scripts/init-template.sh index 40f21aa..fe55ce6 100755 --- a/scripts/init-template.sh +++ b/scripts/init-template.sh @@ -11,4 +11,5 @@ sed -e "/GAME=/ s/\".*\"/\"$GAME_NAME\"/" -i scripts/publish.sh sed -i "s/##VAR_GAME_NAME/$GAME_NAME/g" .github/workflows/release.yml sed -i "s/##VAR_GAME_NAME/$GAME_NAME/g" package.json -echo "#$GAME_NAME" > README.md \ No newline at end of file +echo "# $GAME_NAME" > README.md +git update-index --assume-unchanged src/env/Build.gd diff --git a/scripts/prepare-build.sh b/scripts/prepare-build.sh index 1021228..bcdae00 100755 --- a/scripts/prepare-build.sh +++ b/scripts/prepare-build.sh @@ -14,7 +14,7 @@ if [ -z "$CLIENT_VERSION" ]; then fi fi -cat << EOF > godot/addons/debug/Build.gd +cat << EOF > godot/src/env/Build.gd class_name Build const VERSION = '$CLIENT_VERSION'