extends CraftyGame
const ROUND_SECONDS := 120.0
const MOVE_SPEED := 7.0
const GRAVITY := 20.0
const SCORE_GOAL_Z := 20.0
const SCORE_TO_WIN := 5
const RESPAWN_AFTER_SCORE := Vector3(0, 1, -10)
func get_prediction_params() -> Dictionary:
return {"move_speed": MOVE_SPEED, "gravity": GRAVITY}
func _game_init() -> void:
var spawn_root := get_node_or_null("SpawnPoints")
if spawn_root:
for child in spawn_root.get_children():
if child is Node3D:
spawn_points.append(child.global_position)
if spawn_points.is_empty():
spawn_points = [
Vector3(-8, 1, -8),
Vector3(8, 1, -8),
Vector3(-8, 1, 8),
Vector3(8, 1, 8)
]
func _game_start() -> void:
Crafty.set_time_limit(ROUND_SECONDS)
Crafty.send_announcement("Reach z >= 20 to score")
func _game_end() -> void:
var leaderboard := Crafty.score.get_leaderboard()
if not leaderboard.is_empty():
var winner := leaderboard[0].player as CraftyPlayer
var points := int(leaderboard[0].score)
Crafty.send_announcement("%s wins with %d points" % [winner.display_name, points])
else:
Crafty.send_announcement("Game over")
func _player_joined(player: CraftyPlayer) -> void:
player.respawn(get_random_spawn_point())
Crafty.score.set_score(player, 0)
player.set_synced("score", 0)
func _player_left(_player: CraftyPlayer) -> void:
pass
func _process(delta: float) -> void:
super._process(delta)
if not Crafty.is_server():
return
for p in get_players():
apply_default_movement(p, delta, MOVE_SPEED, GRAVITY)
_check_goal_score(p)
func _check_goal_score(player: CraftyPlayer) -> void:
if player.position.z < SCORE_GOAL_Z:
return
Crafty.score.add(player, 1)
var score := Crafty.score.get_score(player)
player.set_synced("score", score)
player.teleport(RESPAWN_AFTER_SCORE)
Crafty.send_announcement("%s scored (%d/%d)" % [player.display_name, score, SCORE_TO_WIN])
if score >= SCORE_TO_WIN:
end_game(false)