1
0
Fork 0
space-capture/scripts/game_logic.gd
2024-08-15 21:45:07 +02:00

107 lines
3.1 KiB
GDScript

class_name GameLogic
extends Node
const LOGIC_TICKS_PER_SECOND := 20.
const LOGIC_SECONDS_PER_TICK := 1. / LOGIC_TICKS_PER_SECOND
## Container for planets.
@export var planets_container: Node2D
## Container for trails.
@export var trails_container: Node2D
## Container for fleets.
@export var fleets_container: Node2D
## UI to interact with planets.
@export var planets_ui: PlanetsUI
## Game players.
@export var players: Array[Player]
## Game planets.
@export var planets: Array[Planet]
var _game: GameState
var _planet_controls: Array[ControlPlanet]
var _extra_time: float
func _ready() -> void:
# New game.
_game = GameState.new()
# Add players.
for i in range(players.size()):
_game.add_player()
# Add planets.
for i in range(planets.size()):
# Data.
var data := GameState.PlanetData.new()
data.position = Vector2i(planets[i].location)
data.grow_every_ticks = 10
data.player_id = (i + 1) if (i < players.size() - 1) else 0
data.population = 0
_game.add_planet(data)
# UI control.
var control: ControlPlanet = SceneTemplates.scenes.control_planet.instantiate()
control.position = planets[i].location
control.player = players[data.player_id]
control.population = data.population
_planet_controls.push_back(control)
planets_container.add_child(control)
planets_ui.register_planet(control)
# Register UI signals.
_game.planet_player_changed.connect(_set_planet_player)
_game.planet_population_changed.connect(_set_planet_population)
_game.fleet_dispatched.connect(_show_dispatched_fleet)
planets_ui.fleet_dispatched.connect(_dispatch_fleet)
func _process(delta: float) -> void:
_extra_time += delta
while _extra_time > LOGIC_SECONDS_PER_TICK:
_extra_time -= LOGIC_SECONDS_PER_TICK
_game.tick()
#region Graphics
func _set_planet_player(planet_id: int, player_id: int) -> void:
_planet_controls[planet_id].player = players[player_id]
func _set_planet_population(planet_id: int, population: int) -> void:
_planet_controls[planet_id].population = population
func _show_dispatched_fleet(from_planet_id: int, to_planet_id: int, count: int, player_id: int, departed_at_tick: int, arrives_at_tick: int) -> void:
var trail: Trail = SceneTemplates.scenes.trail.instantiate()
trail.start_position = planets[from_planet_id].location
trail.end_position = planets[to_planet_id].location
trail.color = players[player_id].color
trail.auto_free = true
trails_container.add_child(trail)
var fleet: ShipsFleet = SceneTemplates.scenes.ships_fleet.instantiate()
fleet.departed_at = departed_at_tick
fleet.arrives_at = arrives_at_tick
fleet.from = planets[from_planet_id].location
fleet.to = planets[to_planet_id].location
fleet.player = players[player_id]
fleet.count = count
fleet.trail = trail
fleets_container.add_child(fleet)
fleet.register_game(_game)
#endregion
#region Commands
func _dispatch_fleet(from: ControlPlanet, to: ControlPlanet) -> void:
var player_id := players.find(from.player)
var from_planet_id := _planet_controls.find(from)
var to_planet_id := _planet_controls.find(to)
var max_count: int = ceil(from.population / 2.)
_game.dispatch_fleet(player_id, from_planet_id, to_planet_id, max_count)
#endregion