Skip to content

Instantly share code, notes, and snippets.

@levidavidmurray
Last active September 9, 2024 06:44
Show Gist options
  • Save levidavidmurray/90f9a06dd3f38dbd5ad3f2758a755474 to your computer and use it in GitHub Desktop.
Save levidavidmurray/90f9a06dd3f38dbd5ad3f2758a755474 to your computer and use it in GitHub Desktop.
GDScript Level Up Menu Example
class_name LevelUpMenu
extends Control
@onready var health_row: LevelUpMenuRow = %HealthRow
@onready var damage_row: LevelUpMenuRow = %DamageRow
@onready var luck_row: LevelUpMenuRow = %LuckRow
var new_points: int = 5
var player_stats: Dictionary
var player_start_points: int
var player_max_points: int
var points_remaining: int:
get:
player_max_points - _sum_stats(player_stats)
func _ready():
var player = Global.player
player_stats = player._stats.duplicate()
player_start_points = _sum_stats(player_stats)
player_max_points = player_start_points + new_points
_setup_row(health_row, Player.StatType.HEALTH)
_setup_row(damage_row, Player.StatType.DAMAGE)
_setup_row(luck_row, Player.StatType.LUCK)
func _setup_row(row: LevelUpMenuRow, stat_type: Player.StatType):
row.stat_type = stat_type
row.stat_increased.connect(_on_row_stat_increased.bind(row))
row.stat_decreased.connect(_on_row_stat_decreased.bind(row))
func _on_row_stat_increased(row: LevelUpMenuRow):
player_stats[row.stat_type] += 1
_update_rows()
func _on_row_stat_decreased(row: LevelUpMenuRow):
player_stats[row.stat_type] -= 1
_update_rows()
func _update_rows():
health_row.stat_value_label.text = str(player_stats[Player.StatType.HEALTH])
damage_row.stat_value_label.text = str(player_stats[Player.StatType.DAMAGE])
luck_row.stat_value_label.text = str(player_stats[Player.StatType.LUCK])
var is_disabled = points_remaining <= 0
health_row.disabled = is_disabled
damage_row.disabled = is_disabled
luck_row.disabled = is_disabled
func _sum_stats(stats_dict: Dictionary) -> int:
var sum = 0
for key in stats_dict:
sum += stats_dict[key]
return sum
class_name LevelUpMenuRow
extends HBoxContainer
signal stat_increased
signal stat_decreased
@onready var stat_value_label: Label = %StatValueLabel
@onready var increase_button: Button = %IncreaseButton
@onready var decrease_button: Button = %DecreaseButton
var disabled: bool:
set(value):
disabled = value
increase_button.disabled = disabled
decrease_button.disabled = disabled
var stat_type: Player.StatType
func _ready():
increase_button.pressed.connect(_on_increase_button_pressed)
decrease_button.pressed.connect(_on_decrease_button_pressed)
func _on_increase_button_pressed():
stat_increased.emit()
func _on_decrease_button_pressed():
stat_decreased.emit()
class_name Player
extends Node2D
enum StatType { HEALTH, DAMAGE, LUCK }
var _stats: Dictionary = {
StatType.HEALTH: 10,
StatType.DAMAGE: 1,
StatType.LUCK: 1,
}
var health:
get: return _stats[StatType.HEALTH]
var damage:
get: return _stats[StatType.DAMAGE]
var luck: int:
get: return _stats[StatType.LUCK]
func set_stats(stats_dict: Dictionary):
_stats = stats_dict
func set_stat(stat_type: StatType, points: int):
_stats[stat_type] = points
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment