extends Node # This is where the racing logic is handled (player car input and movement, # ensuring valid path, ...) # We keep informations on player progress here. signal player_moved(track_offset) signal wrong_way(coords) # TODO : # - Keyboard controls !! var laps # This is duplicated here becayse of the track offset logic var current_cell var next_cell var track = null onready var map = $TileMap func _ready(): TrackSelection.connect("track_changed", self, "_reset_state") _reset_state() func _input(event): match Global.settings.input_mode: Global.InputMode.MOUSE: _handle_mouse_input(event) Global.InputMode.KEYBOARD: _handle_keyboard_input(event) func _handle_keyboard_input(event): if event is InputEventKey: print_debug("Input Ignored: KEYBOARD MODE") func _handle_mouse_input(event): # Check if the mouse if following the tiles track if event is InputEventMouseMotion: var hover_cell = map.world_to_map(event.position) if hover_cell != current_cell: # The mouse moved to a new cell var cell_idx = track.find(hover_cell) # Check the tile is on path if cell_idx != -1: # Check we are following the path if hover_cell == next_cell: # Check if lap is completed. This is required # because the input can be way ahead player car sprite if next_cell == track[0]: laps += 1 # We use the loop property of PathFollow2D to embed # laps count inside the offset. emit_signal("player_moved", laps + get_track_offset(hover_cell)) emit_signal("wrong_way", Vector2(-1, -1)) current_cell = next_cell var next_idx = cell_idx + 1 if cell_idx < track.size() - 1 else 0 next_cell = track[next_idx] else: emit_signal("wrong_way", map.map_to_world(hover_cell)) func get_track_offset(coords): # Returns the offset in Path2D of a track cell. var offset = float(track.find(coords)) / float(len(track)) return offset func _reset_state(): track = TrackSelection.get_current_track() laps = 0 current_cell = track[0] next_cell = track[1]