gfolf2/src/player/world_player.gd

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