generated from krampus/template-godot4
107 lines
2.5 KiB
GDScript
107 lines
2.5 KiB
GDScript
class_name WorldPlayer extends Resource
|
|
## Container for the state of the player within the world.
|
|
|
|
signal on_life_changed(new_value: float)
|
|
signal on_balls_changed(type: GameBall.Type, new_value: int)
|
|
signal on_death(player: WorldPlayer)
|
|
|
|
@export_range(0, 100) var life: float = 100.0:
|
|
set(value):
|
|
if value != life:
|
|
life = value
|
|
on_life_changed.emit(value)
|
|
|
|
@export_category("Profile")
|
|
# TODO character select
|
|
@export var name: String = "Gfolfer"
|
|
@export var color: Color = Color("ff7070")
|
|
|
|
@export_category("Equipment")
|
|
@export var driver: Club
|
|
@export var iron: Club
|
|
@export var wedge: Club
|
|
@export var putter: Club
|
|
@export var special: Club
|
|
|
|
## Count of each type of ball the player possesses.
|
|
## A count of less than zero indicates unlimited quantity.
|
|
@export var _balls := {
|
|
GameBall.Type.BASIC: -1,
|
|
GameBall.Type.PLASMA: -1,
|
|
}
|
|
|
|
# TODO balls, pickups, etc
|
|
|
|
var shot_setup: ShotSetup:
|
|
get:
|
|
if not shot_setup:
|
|
shot_setup = ShotSetup.create(self)
|
|
return shot_setup
|
|
|
|
|
|
## Get the club equipped in the given slot.
|
|
##
|
|
## Returns `null` if the player has no club equipped in the given slot
|
|
func get_club(type: Club.Type) -> Club:
|
|
match type:
|
|
Club.Type.DRIVER:
|
|
return driver
|
|
Club.Type.IRON:
|
|
return iron
|
|
Club.Type.WEDGE:
|
|
return wedge
|
|
Club.Type.PUTTER:
|
|
return putter
|
|
Club.Type.SPECIAL:
|
|
return special
|
|
return null
|
|
|
|
|
|
## Get the quantity of a ball type
|
|
func get_balls(type: GameBall.Type) -> int:
|
|
return _balls.get(type, 0)
|
|
|
|
|
|
## Set the quantity of a ball type
|
|
func set_balls(type: GameBall.Type, value: int) -> void:
|
|
_balls[type] = value
|
|
on_balls_changed.emit(type, value)
|
|
|
|
|
|
## Change the quantity of a ball type
|
|
func mutate_balls(type: GameBall.Type, delta: int) -> void:
|
|
if _balls.get(type, 0) >= 0:
|
|
_balls[type] = _balls.get(type, 0) + delta
|
|
on_balls_changed.emit(type, _balls[type])
|
|
|
|
|
|
## Get next slotted ball type
|
|
func next_ball(type: GameBall.Type) -> GameBall.Type:
|
|
var keys := _balls.keys()
|
|
var i := keys.find(type)
|
|
var j := (i + 1) % len(keys) if i >= 0 else 0
|
|
return keys[j]
|
|
|
|
|
|
## Get previous slotted ball type
|
|
func prev_ball(type: GameBall.Type) -> GameBall.Type:
|
|
var keys := _balls.keys()
|
|
var i := keys.find(type)
|
|
var j := (i - 1) % len(keys) if i >= 0 else 0
|
|
return keys[j]
|
|
|
|
|
|
func die() -> void:
|
|
on_death.emit(self)
|
|
|
|
|
|
## Create a debug player instance
|
|
static func create_debug() -> WorldPlayer:
|
|
var instance := WorldPlayer.new()
|
|
instance.driver = Club.catalog.debug_driver
|
|
instance.iron = Club.catalog.debug_iron
|
|
instance.wedge = Club.catalog.debug_wedge
|
|
instance.putter = Club.catalog.debug_wedge
|
|
|
|
return instance
|