From 44523b0bf2c70b4fde2b817055024db533480278 Mon Sep 17 00:00:00 2001 From: cyberarm Date: Wed, 29 Sep 2021 12:41:56 -0500 Subject: [PATCH] Imported FTC Clock --- .gitignore | 8 +- Gemfile.lock | 28 + lib/game_clock/clock.rb | 70 + lib/game_clock/clock_controller.rb | 136 + lib/game_clock/clock_proxy.rb | 100 + lib/game_clock/event_handlers.rb | 89 + lib/game_clock/jukebox.rb | 144 + lib/game_clock/logger.rb | 28 + lib/game_clock/net/client.rb | 162 + lib/game_clock/net/connection.rb | 97 + lib/game_clock/net/packet.rb | 109 + lib/game_clock/net/packet_handler.rb | 304 + lib/game_clock/net/server.rb | 146 + lib/game_clock/particle_emitter.rb | 135 + lib/game_clock/randomizer.rb | 127 + lib/game_clock/remote_control.rb | 270 + lib/game_clock/remote_proxy.rb | 64 + lib/game_clock/theme.rb | 73 + lib/game_clock/view.rb | 283 + lib/pages/drive_team_rotation_generator.rb | 8 +- lib/pages/game_clock.rb | 37 +- lib/states/editor.rb | 6 +- media/background.png | Bin 0 -> 154876 bytes media/background.svg | 6240 ++++++++++++++++++++ media/music/.gitkeep | 0 media/particles/.gitkeep | 0 media/sounds/.gitkeep | 0 timecrafters_configuration_tool.rb | 18 + 28 files changed, 8671 insertions(+), 11 deletions(-) create mode 100644 Gemfile.lock create mode 100644 lib/game_clock/clock.rb create mode 100644 lib/game_clock/clock_controller.rb create mode 100644 lib/game_clock/clock_proxy.rb create mode 100644 lib/game_clock/event_handlers.rb create mode 100644 lib/game_clock/jukebox.rb create mode 100644 lib/game_clock/logger.rb create mode 100644 lib/game_clock/net/client.rb create mode 100644 lib/game_clock/net/connection.rb create mode 100644 lib/game_clock/net/packet.rb create mode 100644 lib/game_clock/net/packet_handler.rb create mode 100644 lib/game_clock/net/server.rb create mode 100644 lib/game_clock/particle_emitter.rb create mode 100644 lib/game_clock/randomizer.rb create mode 100644 lib/game_clock/remote_control.rb create mode 100644 lib/game_clock/remote_proxy.rb create mode 100644 lib/game_clock/theme.rb create mode 100644 lib/game_clock/view.rb create mode 100644 media/background.png create mode 100644 media/background.svg create mode 100644 media/music/.gitkeep create mode 100644 media/particles/.gitkeep create mode 100644 media/sounds/.gitkeep diff --git a/.gitignore b/.gitignore index db869a5..1776656 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,10 @@ pkg/* data/**/*.json data/settings.json data/simulator.rb -data/*.csv \ No newline at end of file +data/*.csv +media/sounds/* +!media/sounds/.gitkeep +media/particles/* +!media/particles/.gitkeep +media/music/* +!media/music/.gitkeep \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..ee86e6a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,28 @@ +GEM + remote: https://rubygems.org/ + specs: + clipboard (1.3.6) + cyberarm_engine (0.19.1) + clipboard (~> 1.3.5) + excon (~> 0.78.0) + gosu (~> 1.1) + gosu_more_drawables (~> 0.3) + excon (0.78.1) + ffi (1.15.4) + gosu (1.2.0) + gosu_more_drawables (0.3.1) + gosu_notifications (0.1.0) + ocra (1.3.11) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + clipboard + cyberarm_engine + ffi + gosu_notifications + ocra + +BUNDLED WITH + 2.2.19 diff --git a/lib/game_clock/clock.rb b/lib/game_clock/clock.rb new file mode 100644 index 0000000..507d699 --- /dev/null +++ b/lib/game_clock/clock.rb @@ -0,0 +1,70 @@ +module TAC + class PracticeGameClock + class Clock + CLOCK_SIZE = Gosu.screen_height + TITLE_SIZE = 128 + + attr_reader :title + + def initialize + @title = CyberarmEngine::Text.new("FIRST TECH CHALLENGE", size: TITLE_SIZE, text_shadow: true, y: 10, color: Gosu::Color::GRAY) + @title.x = $window.width / 2 - @title.width / 2 + + @text = CyberarmEngine::Text.new(":1234567890", size: CLOCK_SIZE, text_shadow: true, shadow_size: 2, shadow_color: Gosu::Color::GRAY) + @text.width # trigger font-eager loading + + @title.z, @text.z = -1, -1 + + @controller = nil + end + + def controller=(controller) + @controller = controller + end + + def draw + @title.draw + @text.draw + end + + def update + @title.x = $window.width / 2 - @title.width / 2 + + if @controller + @text.color = @controller.display_color + @text.text = clock_time(@controller.time_left) + else + @text.color = Gosu::Color::WHITE + @text.text = "0:00" + end + + @text.x = $window.width / 2 - @text.textobject.text_width("0:00") / 2 + @text.y = $window.height / 2 - @text.height / 2 + + @controller&.update + end + + def active? + if @controller + @controller.clock? || @controller.countdown? + else + false + end + end + + def value + @text.text + end + + def clock_time(time_left) + minutes = ((time_left + 0.5) / 60.0).floor + + seconds = time_left.round % 60 + seconds = "0#{seconds}" if seconds < 10 + + return "#{minutes}:#{seconds}" if time_left.round.even? + return "#{minutes}:#{seconds}" if time_left.round.odd? + end + end + end +end diff --git a/lib/game_clock/clock_controller.rb b/lib/game_clock/clock_controller.rb new file mode 100644 index 0000000..2e87cdc --- /dev/null +++ b/lib/game_clock/clock_controller.rb @@ -0,0 +1,136 @@ +module TAC + class PracticeGameClock + class ClockController + Event = Struct.new(:event, :trigger_after, :arguments) + + include EventHandlers + + def self.create_event(event, trigger_after, arguments = nil) + arguments = [arguments] unless arguments.is_a?(Array) || arguments == nil + + Event.new(event, trigger_after, arguments) + end + + AUTONOMOUS = [ + create_event(:change_clock, 0.0, "2:30"), + create_event(:change_countdown, 0.0, "0:03"), + create_event(:change_color, 0.0, :red), + create_event(:change_display, 0.0, :countdown), + create_event(:start_countdown, 0.0), + create_event(:play_sound, 0.0, :autonomous_countdown), + create_event(:change_color, 3.0, :white), + create_event(:change_display, 3.0, :clock), + create_event(:play_sound, 3.0, :autonomous_start), + create_event(:change_display, 3.0, :clock), + create_event(:stop_countdown, 3.0), + create_event(:start_clock, 3.0), + create_event(:play_sound, 33.0, :autonomous_ended), + create_event(:stop_clock, 33.0), + ].freeze + + PRE_TELEOP = [ + create_event(:change_color, 33.0, :orange), + create_event(:change_countdown, 33.0, "0:08"), + create_event(:change_display, 33.0, :countdown), + create_event(:start_countdown, 33.0), + create_event(:play_sound, 34.5, :teleop_pickup_controllers), + create_event(:change_color, 37.0, :red), + create_event(:play_sound, 38.0, :teleop_countdown), + create_event(:stop_countdown, 41.0), + ].freeze + + TELEOP_ENDGAME = [ + create_event(:change_color, 131.0, :white), + create_event(:change_clock, 131.0, "0:30"), + create_event(:start_clock, 131.0), + create_event(:play_sound, 131.0, :end_game), + create_event(:play_sound, 158.0, :autonomous_countdown), + create_event(:play_sound, 161.0, :end_match), + create_event(:stop_clock, 161.0), + ].freeze + + TELEOP = [ + create_event(:change_color, 41.0, :white), + create_event(:change_clock, 41.0, "2:00"), + create_event(:play_sound, 41.0, :teleop_started), + create_event(:change_display, 41.0, :clock), + create_event(:start_clock, 41.0), + TELEOP_ENDGAME + ].flatten.freeze + + FULL_TELEOP = [ + PRE_TELEOP, + TELEOP, + TELEOP_ENDGAME, + ].flatten.freeze + + FULL_MATCH = [ + # Autonomous + AUTONOMOUS, + FULL_TELEOP + ].flatten.freeze + + attr_reader :display_color + def initialize(elapsed_time = 0, events = []) + @events = events.dup + @last_update = Gosu.milliseconds + + @elapsed_time = elapsed_time + @display = :clock + + @clock_time = 0.0 + @countdown_time = 0.0 + + @clock_running = false + @countdown_running = false + + @display_color = Gosu::Color::WHITE + end + + def update + dt = (Gosu.milliseconds - @last_update) / 1000.0 + update_active_timer(dt) + + @events.select { |event| event.trigger_after <= @elapsed_time }.each do |event| + @events.delete(event) + + if event.arguments + self.send(event.event, *event.arguments) + else + self.send(event.event) + end + end + + @last_update = Gosu.milliseconds + end + + def update_active_timer(dt) + if @clock_running + @clock_time -= dt + elsif @countdown_running + @countdown_time -= dt + end + + @elapsed_time += dt + end + + def clock? + @clock_running + end + + def countdown? + @countdown_running + end + + def time_left + if @clock_running + return @clock_time + elsif @countdown_running + return @countdown_time + else + return 60 * 2 + 30 + end + end + end + end +end diff --git a/lib/game_clock/clock_proxy.rb b/lib/game_clock/clock_proxy.rb new file mode 100644 index 0000000..684890f --- /dev/null +++ b/lib/game_clock/clock_proxy.rb @@ -0,0 +1,100 @@ +module TAC + class PracticeGameClock + class ClockProxy + def initialize(clock, jukebox) + @clock = clock + @jukebox = jukebox + + @callbacks = {} + end + + def register(callback, method) + @callbacks[callback] = method + end + + def start_clock(mode) + return if @clock.active? || $window.current_state.is_a?(Randomizer) + + @clock.controller = case mode + when :full_match + ClockController.new(0, ClockController::FULL_MATCH) + when :autonomous + ClockController.new(0, ClockController::AUTONOMOUS) + when :full_teleop + ClockController.new(33.0, ClockController::FULL_TELEOP) + when :teleop_only + ClockController.new(41.0, ClockController::TELEOP) + when :endgame_only + ClockController.new(131.0, ClockController::TELEOP_ENDGAME) + else + nil + end + end + + def abort_clock + $window.current_state&.get_sample("media/fogblast.wav")&.play if @clock.active? + @clock.controller = nil + end + + def set_clock_title(string) + @clock.title.text = string.to_s + @clock.title.x = $window.width / 2 - @clock.title.width / 2 + end + + def get_clock_title(string) + @clock.title + end + + def jukebox_previous_track + @jukebox.previous_track + end + + def jukebox_next_track + @jukebox.next_track + end + + def jukebox_stop + @jukebox.stop + end + + def jukebox_play + @jukebox.play + end + + def jukebox_pause + @jukebox.pause + end + + def jukebox_set_volume(float) + @jukebox.set_volume(float) + end + + def jukebox_volume + @jukebox.volume + end + + def jukebox_current_track + @jukebox.now_playing + end + + def jukebox_set_sound_effects(boolean) + @jukebox.set_sfx(boolean) + end + + def jukebox_volume_changed(float) + @callbacks[:volume_changed]&.call(float) + end + + def jukebox_track_changed(name) + @callbacks[:track_changed]&.call(name) + end + + def randomizer_changed(boolean) + @callbacks[:randomizer_changed]&.call(boolean) + end + + def shutdown! + end + end + end +end diff --git a/lib/game_clock/event_handlers.rb b/lib/game_clock/event_handlers.rb new file mode 100644 index 0000000..b153ecd --- /dev/null +++ b/lib/game_clock/event_handlers.rb @@ -0,0 +1,89 @@ +module TAC + class PracticeGameClock + module EventHandlers + ### Clock ### + def start_clock + @clock_running = true + end + + def stop_clock + @clock_running = false + end + + def change_clock(value) + @clock_time = time_from_string(value) + end + + ### Countdown ### + def start_countdown + @countdown_running = true + end + + def stop_countdown + @countdown_running = false + end + + + def change_countdown(value) + @countdown_time = time_from_string(value) + end + + def change_display(display) + end + + def change_color(color) + out = case color + when :white + Gosu::Color::WHITE + when :orange + Gosu::Color.rgb(150, 75, 0) + when :red + Gosu::Color.rgb(150, 0, 0) + end + + @display_color = out + end + + private def time_from_string(string) + split = string.split(":") + minutes = (split.first.to_i) * 60 + seconds = (split.last.to_i) + + return minutes + seconds + end + + def play_sound(sound) + path = nil + case sound + when :autonomous_countdown + path = "media/sounds/3-2-1.wav" + when :autonomous_start + path = "media/sounds/charge.wav" + when :autonomous_ended + path = "media/sounds/endauto.wav" + when :teleop_pickup_controllers + path = "media/sounds/Pick_Up_Controllers.wav" + when :abort_match + path = "media/sounds/fogblast.wav" + when :teleop_countdown + path = "media/sounds/3-2-1.wav" + when :teleop_started + path = "media/sounds/firebell.wav" + when :end_game + path = "media/sounds/factwhistle.wav" + when :end_match + path = "media/sounds/endmatch.wav" + end + + path = "#{ROOT_PATH}/#{path}" + + if path && File.exist?(path) && !File.directory?(path) + Jukebox::SAMPLES[path] = Gosu::Sample.new(path) unless Jukebox::SAMPLES[path].is_a?(Gosu::Sample) + Jukebox::SAMPLES[path].play + else + warn "WARNING: Sample for #{sound.inspect} could not be found at '#{path}'" + end + end + end + end +end diff --git a/lib/game_clock/jukebox.rb b/lib/game_clock/jukebox.rb new file mode 100644 index 0000000..8477503 --- /dev/null +++ b/lib/game_clock/jukebox.rb @@ -0,0 +1,144 @@ +module TAC + class PracticeGameClock + class Jukebox + MUSIC = Dir.glob(ROOT_PATH + "/media/music/*.*").freeze + SAMPLES = {} + + if File.exist?(ROOT_PATH + "/media/sounds/skystone") + BEEPS_AND_BOOPS = Dir.glob(ROOT_PATH + "/media/sounds/skystone/*.*").freeze + end + + attr_reader :volume, :now_playing + + def initialize(clock) + @clock = clock + + @order = MUSIC.shuffle + @now_playing = "" + @playing = false + @song = nil + @volume = 1.0 + @last_check_time = Gosu.milliseconds + + @last_sfx_time = Gosu.milliseconds + @sfx_random_interval = generate_sfx_period + @play_sfx = true + + if defined?(BEEPS_AND_BOOPS) + BEEPS_AND_BOOPS.each do |beep| + SAMPLES[beep] = Gosu::Sample.new(beep) + end + end + end + + def update + return unless Gosu.milliseconds - @last_check_time >= 2000.0 + + @last_check_time = Gosu.milliseconds + + if @song && !@song.playing? && !@song.paused? + next_track if @playing + end + + if @play_sfx && defined?(BEEPS_AND_BOOPS) + play_sfx + end + end + + def play_sfx + if Gosu.milliseconds - @last_sfx_time >= @sfx_random_interval + @last_sfx_time = Gosu.milliseconds + @sfx_random_interval = generate_sfx_period + + pan = rand(0.49999..0.50001) + volume = rand(0.75..1.0) + speed = rand(0.5..1.25) + SAMPLES[BEEPS_AND_BOOPS.sample].play_pan(pan, volume, speed) unless @clock.active? + end + end + + def generate_sfx_period + # rand(15..120) * 1000.0 + rand(5..10) * 1000.0 + end + + def set_sfx(boolean) + @play_sfx = boolean + end + + def play_sfx? + @play_sfx + end + + def play + if @song && @song.paused? + @song.play + else + return false unless @order.size > 0 + + @current_song = @order.first + @song = Gosu::Song.new(@current_song) + @song.volume = @volume + @song.play + @now_playing = File.basename(@current_song) + @order.rotate!(1) + end + + @playing = true + end + + def pause + @playing = false + @song.pause if @song + end + + def song + @song + end + + def stop + @song.stop if @song + @playing = false + @now_playing = "" + end + + def previous_track + return false unless @order.size > 0 + + @song.stop if @song + @order.rotate!(-1) + @current_song = @order.first + @song = Gosu::Song.new(@current_song) + @song.volume = @volume + @song.play + + @playing = true + @now_playing = File.basename(@current_song) + end + + def next_track + return false unless @order.size > 0 + + @song.stop if @song + @current_song = @order.first + @song = Gosu::Song.new(@current_song) + @song.volume = @volume + @song.play + @order.rotate!(1) + + @playing = true + @now_playing = File.basename(@current_song) + end + + def current_track + @current_song + end + + def set_volume(float) + @volume = float + @volume = @volume.clamp(0.1, 1.0) + @song.volume = @volume if @song + end + end + end +end diff --git a/lib/game_clock/logger.rb b/lib/game_clock/logger.rb new file mode 100644 index 0000000..bdcca32 --- /dev/null +++ b/lib/game_clock/logger.rb @@ -0,0 +1,28 @@ +module TAC + class PracticeGameClock + class ClockNet + class Logger + def printer(message) + # return + puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S %Z")} #{message}" + end + + def i(tag, message) + printer("INFO #{tag}: #{message}") + end + + def d(tag, message) + printer("DEBUG #{tag}: #{message}") + end + + def e(tag, message) + printer("ERROR #{tag}: #{message}") + end + end + end + + def log + @logger ||= ClockNet::Logger.new + end + end +end diff --git a/lib/game_clock/net/client.rb b/lib/game_clock/net/client.rb new file mode 100644 index 0000000..e4d9dcf --- /dev/null +++ b/lib/game_clock/net/client.rb @@ -0,0 +1,162 @@ +require "securerandom" + +module TAC + class PracticeGameClock + class ClockNet + class Client + TAG = "ClockNet|Client" + CHUNK_SIZE = 4096 + PACKET_TAIL = "\r\n\n" + + attr_reader :uuid, :read_queue, :write_queue, :socket, + :packets_sent, :packets_received, + :data_sent, :data_received + attr_accessor :sync_interval, :last_socket_error, :socket_error + def initialize + @uuid = SecureRandom.uuid + @read_queue = [] + @write_queue = [] + + @sync_interval = 100 + + @last_socket_error = nil + @socket_error = false + @bound = false + + @packets_sent, @packets_received = 0, 0 + @data_sent, @data_received = 0, 0 + end + + def uuid=(id) + @uuid = id + end + + def socket=(socket) + @socket = socket + @bound = true + + listen + end + + def listen + Thread.new do + while connected? + # Read from socket + while message_in = read + if message_in.empty? + break + else + log.i(TAG, "Read: " + message_in) + + @read_queue << message_in + + @packets_received += 1 + @data_received += message_in.length + end + end + + sleep @sync_interval / 1000.0 + end + end + + Thread.new do + while connected? + # Write to socket + while message_out = @write_queue.shift + write(message_out) + + @packets_sent += 1 + @data_sent += message_out.to_s.length + log.i(TAG, "Write: " + message_out.to_s) + end + + sleep @sync_interval / 1000.0 + end + end + end + + def sync(block) + block.call + end + + def handle_read_queue + message = gets + + while message + puts(message) + + log.i(TAG, "Writing to Queue: " + message) + + message = gets + end + end + + def socket_error? + @socket_error + end + + def connected? + if closed? == true || closed? == nil + false + else + true + end + end + + def closed? + @socket.closed? if @socket + end + + def write(message) + begin + @socket.puts("#{message}#{PACKET_TAIL}") + rescue => error + @last_socket_error = error + @socket_error = true + log.e(TAG, error.message) + close + end + end + + def read + begin + message = @socket.gets + rescue => error + @last_socket_error = error + @socket_error = true + + message = "" + end + + + return message.strip + end + + def puts(message) + @write_queue << message + end + + def gets + @read_queue.shift + end + + def encode(message) + return message + end + + def decode(blob) + return blob + end + + def flush + @socket.flush if socket + end + + def close(reason = nil) + write(reason) if reason + @socket.close if @socket + end + end + end + end +end \ No newline at end of file diff --git a/lib/game_clock/net/connection.rb b/lib/game_clock/net/connection.rb new file mode 100644 index 0000000..80266d3 --- /dev/null +++ b/lib/game_clock/net/connection.rb @@ -0,0 +1,97 @@ +module TAC + class PracticeGameClock + class ClockNet + class Connection + TAG = "ClockNet|Connection" + attr_reader :hostname, :port, :client, :proxy_object + + def initialize(hostname: "localhost", port: 4567, proxy_object:) + @hostname = hostname + @port = port + @proxy_object = proxy_object + + @client = nil + + @last_sync_time = Gosu.milliseconds + @sync_interval = SYNC_INTERVAL + + @last_heartbeat_sent = Gosu.milliseconds + @heartbeat_interval = HEARTBEAT_INTERVAL + + @connection_handler = proc do + handle_connection + end + + @packet_handler = PacketHandler.new(host_is_a_connection: true, proxy_object: @proxy_object) + end + + def connect + return if @client + + @client = Client.new + + Thread.new do + begin + @client.socket = Socket.tcp(@hostname, @port, connect_timeout: 5) + @client.socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) + log.i(TAG, "Connected to: #{@hostname}:#{@port}") + + while @client && @client.connected? + if Gosu.milliseconds > @last_sync_time + @sync_interval + @last_sync_time = Gosu.milliseconds + + @client.sync(@connection_handler) + end + end + + rescue => error + log.e(TAG, error) + + if @client + @client.close + @client.last_socket_error = error + @client.socket_error = true + end + end + end + end + + def handle_connection + if @client && @client.connected? + message = @client.gets + + @packet_handler.handle(message) if message + + if Gosu.milliseconds > @last_heartbeat_sent + @heartbeat_interval + @last_heartbeat_sent = Gosu.milliseconds + + @client.puts(PacketHandler.packet_heartbeat) + end + + sleep @sync_interval / 1000.0 + end + end + + def puts(packet) + @client.puts(packet) + end + + def gets + @client.gets + end + + def connected? + @client.connected? if @client + end + + def closed? + @client.closed? if @client + end + + def close + @client.close if @client + end + end + end + end +end diff --git a/lib/game_clock/net/packet.rb b/lib/game_clock/net/packet.rb new file mode 100644 index 0000000..f05d710 --- /dev/null +++ b/lib/game_clock/net/packet.rb @@ -0,0 +1,109 @@ +module TAC + class PracticeGameClock + class ClockNet + SYNC_INTERVAL = 250 + HEARTBEAT_INTERVAL = 1_500 + + class Packet + PROTOCOL_VERSION = 1 + PROTOCOL_SEPERATOR = "|" + PROTOCOL_HEARTBEAT = "heartbeat" + + PACKET_TYPES = { + handshake: 0, + heartbeat: 1, + error: 2, + shutdown: 3, + + start_clock: 10, + abort_clock: 11, + + set_clock_title: 20, + get_clock_title: 21, + clock_title: 22, + clock_time: 23, + + randomizer_visible: 27, + + jukebox_previous_track: 30, + jukebox_next_track: 31, + jukebox_stop: 32, + jukebox_play: 33, + jukebox_pause: 34, + jukebox_set_volume: 35, + jukebox_get_volume: 36, + jukebox_volume: 37, + jukebox_get_current_track: 38, + jukebox_current_track: 39, + jukebox_get_sound_effects: 40, + jukebox_set_sound_effects: 41, + jukebox_sound_effects: 42, + } + + def self.from_stream(message) + slice = message.split("|", 4) + + if slice.size < 4 + warn "Failed to split packet along first 4 " + PROTOCOL_SEPERATOR + ". Raw return: " + slice.to_s + return nil + end + + if slice.first != PROTOCOL_VERSION.to_s + warn "Incompatible protocol version received, expected: " + PROTOCOL_VERSION.to_s + " got: " + slice.first + return nil + end + + unless valid_packet_type?(Integer(slice[1])) + warn "Unknown packet type detected: #{slice[1]}" + return nil + end + + protocol_version = Integer(slice[0]) + type = PACKET_TYPES.key(Integer(slice[1])) + content_length = Integer(slice[2]) + body = slice[3] + + raise "Type is #{type.inspect} [#{type.class}]" unless type.is_a?(Symbol) + + return Packet.new(protocol_version, type, content_length, body) + end + + def self.create(packet_type, body) + Packet.new(PROTOCOL_VERSION, PACKET_TYPES.key(packet_type), body.length, body) + end + + def self.valid_packet_type?(packet_type) + PACKET_TYPES.values.find { |t| t == packet_type } + end + + attr_reader :protocol_version, :type, :content_length, :body + def initialize(protocol_version, type, content_length, body) + @protocol_version = protocol_version + @type = type + @content_length = content_length + @body = body + end + + def encode_header + string = "" + string += protocol_version.to_s + string += PROTOCOL_SEPERATOR + string += PACKET_TYPES[type].to_s + string += PROTOCOL_SEPERATOR + string += content_length.to_s + string += PROTOCOL_SEPERATOR + + return string + end + + def valid? + true + end + + def to_s + "#{encode_header}#{body}" + end + end + end + end +end diff --git a/lib/game_clock/net/packet_handler.rb b/lib/game_clock/net/packet_handler.rb new file mode 100644 index 0000000..1f3e628 --- /dev/null +++ b/lib/game_clock/net/packet_handler.rb @@ -0,0 +1,304 @@ +module TAC + class PracticeGameClock + class ClockNet + class PacketHandler + TAG = "ClockNet|PacketHandler" + def initialize(host_is_a_connection: false, proxy_object:) + @host_is_a_connection = host_is_a_connection + @proxy_object = proxy_object + end + + def handle(message) + packet = Packet.from_stream(message) + + if packet + log.i(TAG, "Received packet of type: #{packet.type}") + hand_off(packet) + else + log.d(TAG, "Rejected raw packet: #{message}") + end + end + + def hand_off(packet) + case packet.type + when :handshake + handle_handshake(packet) + when :heartbeat + handle_heartbeat(packet) + when :error + handle_error(packet) + + when :start_clock + handle_start_clock(packet) + when :abort_clock + handle_abort_clock(packet) + when :get_clock_title + handle_get_clock_title(packet) + when :set_clock_title + handle_set_clock_title(packet) + when :clock_title + handle_clock_title(packet) + when :jukebox_previous_track + handle_jukebox_previous_track(packet) + when :jukebox_next_track + handle_jukebox_next_track(packet) + when :jukebox_play + handle_jukebox_play(packet) + when :jukebox_pause + handle_jukebox_pause(packet) + when :jukebox_stop + handle_jukebox_stop(packet) + when :jukebox_set_volume + handle_jukebox_set_volume(packet) + when :jukebox_volume + handle_jukebox_volume(packet) + when :jukebox_set_sound_effects + handle_jukebox_set_sound_effects(packet) + when :jukebox_current_track + handle_jukebox_current_track(packet) + when :clock_time + handle_clock_time(packet) + when :randomizer_visible + handle_randomizer_visible(packet) + when :shutdown + handle_shutdown(packet) + else + log.d(TAG, "No hand off available for packet type: #{packet.type}") + end + end + + def handle_handshake(packet) + if @host_is_a_connection + end + end + + # TODO: Reset socket timeout + def handle_heartbeat(packet) + end + + # TODO: Handle errors + def handle_error(packet) + title, message = packet.body.split(Packet::PROTOCOL_SEPERATOR, 2) + log.e(TAG, "Remote error: #{title}: #{message}") + end + + def handle_start_clock(packet) + unless @host_is_a_connection + @proxy_object.start_clock(packet.body.to_sym) + end + end + + def handle_abort_clock(packet) + unless @host_is_a_connection + @proxy_object.abort_clock + end + end + + def handle_set_clock_title(packet) + unless @host_is_a_connection + title = packet.body + @proxy_object.set_clock_title(title) + end + end + + def handle_get_clock_title(packet) + unless @host_is_a_connection + $RemoteControl.server.active_client.puts(Packet.clock_title(@proxy_object.clock.title)) + end + end + + def handle_jukebox_previous_track(packet) + unless @host_is_a_connection + @proxy_object.jukebox_previous_track + + $RemoteControl.server.active_client.puts(PacketHandler.packet_jukebox_current_track(@proxy_object.jukebox_current_track)) + end + end + + def handle_jukebox_next_track(packet) + unless @host_is_a_connection + @proxy_object.jukebox_next_track + + $RemoteControl.server.active_client.puts(PacketHandler.packet_jukebox_current_track(@proxy_object.jukebox_current_track)) + end + end + + def handle_jukebox_play(packet) + unless @host_is_a_connection + @proxy_object.jukebox_play + + $RemoteControl.server.active_client.puts(PacketHandler.packet_jukebox_current_track(@proxy_object.jukebox_current_track)) + end + end + + def handle_jukebox_pause(packet) + unless @host_is_a_connection + @proxy_object.jukebox_pause + + $RemoteControl.server.active_client.puts(PacketHandler.packet_jukebox_current_track(@proxy_object.jukebox_current_track)) + end + end + + def handle_jukebox_stop(packet) + unless @host_is_a_connection + @proxy_object.jukebox_stop + + $RemoteControl.server.active_client.puts(PacketHandler.packet_jukebox_current_track(@proxy_object.jukebox_current_track)) + end + end + + def handle_jukebox_set_volume(packet) + unless @host_is_a_connection + float = packet.body.to_f + float = float.clamp(0.0, 1.0) + + @proxy_object.jukebox_set_volume(float) + + float = @proxy_object.jukebox_volume + $RemoteControl.server.active_client.puts(PacketHandler.packet_jukebox_volume(float)) + end + end + + def handle_jukebox_get_volume(packet) + unless @host_is_a_connection + float = @proxy_object.jukebox_volume + + $RemoteControl.server.active_client.puts(PacketHandler.packet_jukebox_volume(float)) + end + end + + def handle_jukebox_volume(packet) + if @host_is_a_connection + float = packet.body.to_f + + @proxy_object.volume_changed(float) + end + end + + def handle_jukebox_set_sound_effects(packet) + unless @host_is_a_connection + boolean = packet.body == "true" + + @proxy_object.jukebox_set_sound_effects(boolean) + end + end + + def handle_jukebox_current_track(packet) + if @host_is_a_connection + @proxy_object.track_changed(packet.body) + end + end + + def handle_clock_time(packet) + if @host_is_a_connection + @proxy_object.clock_changed(packet.body) + end + end + + def handle_randomizer_visible(packet) + boolean = packet.body == "true" + + @proxy_object.randomizer_changed(boolean) + + unless @host_is_a_connection + # Send confirmation to client + $RemoteControl.server.active_client.puts(PacketHandler.packet_randomizer_visible(boolean)) + end + end + + def handle_shutdown(packet) + unless @host_is_a_connection + # $RemoteControl.server.close + # $window.close + Gosu::Song.current_song&.stop + exit + end + end + + def self.packet_handshake(client_uuid) + Packet.create(Packet::PACKET_TYPES[:handshake], client_uuid) + end + + def self.packet_heartbeat + Packet.create(Packet::PACKET_TYPES[:heartbeat], Packet::PROTOCOL_HEARTBEAT) + end + + def self.packet_error(error_code, message) + Packet.create(Packet::PACKET_TYPES[:error], error_code.to_s, message.to_s) + end + + def self.packet_start_clock(mode) + Packet.create(Packet::PACKET_TYPES[:start_clock], mode.to_s) + end + + def self.packet_abort_clock + Packet.create(Packet::PACKET_TYPES[:abort_clock], "") + end + + def self.packet_set_clock_title(string) + Packet.create(Packet::PACKET_TYPES[:set_clock_title], string.to_s) + end + + def self.packet_get_clock_title + Packet.create(Packet::PACKET_TYPES[:get_clock_title], "") + end + + def self.packet_clock_title(string) + Packet.create(Packet::PACKET_TYPES[:clock_title], string.to_s) + end + + def self.packet_jukebox_previous_track + Packet.create(Packet::PACKET_TYPES[:jukebox_previous_track], "") + end + + def self.packet_jukebox_next_track + Packet.create(Packet::PACKET_TYPES[:jukebox_next_track], "") + end + + def self.packet_jukebox_play + Packet.create(Packet::PACKET_TYPES[:jukebox_play], "") + end + + def self.packet_jukebox_pause + Packet.create(Packet::PACKET_TYPES[:jukebox_pause], "") + end + + def self.packet_jukebox_stop + Packet.create(Packet::PACKET_TYPES[:jukebox_stop], "") + end + + def self.packet_jukebox_set_volume(float) + Packet.create(Packet::PACKET_TYPES[:jukebox_set_volume], float.to_s) + end + + def self.packet_jukebox_get_volume + Packet.create(Packet::PACKET_TYPES[:jukebox_get_volume], "") + end + + def self.packet_jukebox_volume(float) + Packet.create(Packet::PACKET_TYPES[:jukebox_volume], float.to_s) + end + + def self.packet_jukebox_set_sound_effects(boolean) + Packet.create(Packet::PACKET_TYPES[:jukebox_set_sound_effects], boolean.to_s) + end + + def self.packet_jukebox_current_track(name) + Packet.create(Packet::PACKET_TYPES[:jukebox_current_track], name) + end + + def self.packet_clock_time(string) + Packet.create(Packet::PACKET_TYPES[:clock_time], string) + end + + def self.packet_randomizer_visible(boolean) + Packet.create(Packet::PACKET_TYPES[:randomizer_visible], boolean.to_s) + end + + def self.packet_shutdown + Packet.create(Packet::PACKET_TYPES[:shutdown], "") + end + end + end + end +end diff --git a/lib/game_clock/net/server.rb b/lib/game_clock/net/server.rb new file mode 100644 index 0000000..dff8afb --- /dev/null +++ b/lib/game_clock/net/server.rb @@ -0,0 +1,146 @@ +module TAC + class PracticeGameClock + class ClockNet + class Server + TAG = "ClockNet|Server" + attr_reader :active_client, + :packets_sent, :packets_received, :data_sent, :data_received, + :client_last_packets_sent, :client_last_packets_received, :client_last_data_sent, :client_last_data_received + def initialize(hostname: "localhost", port: 4567, proxy_object: ) + $server = self + + @hostname = hostname + @port = port + @proxy_object = proxy_object + + @socket = nil + @active_client = nil + @connection_attempts = 0 + @max_connection_attempts = 10 + + @packets_sent, @packets_received, @client_last_packets_sent, @client_last_packets_received = 0, 0, 0, 0 + @data_sent, @data_received, @client_last_data_sent, @client_last_data_received = 0, 0, 0, 0 + + @last_sync_time = Gosu.milliseconds + @sync_interval = SYNC_INTERVAL + + @last_heartbeat_sent = Gosu.milliseconds + @heartbeat_interval = HEARTBEAT_INTERVAL + + @client_handler_proc = proc do + handle_client + end + + @packet_handler = PacketHandler.new(proxy_object: @proxy_object) + end + + def start(run_on_main_thread: false) + thread = Thread.new do + while (!@socket && @connection_attempts < @max_connection_attempts) + begin + log.i(TAG, "Starting server...") + @socket = TCPServer.new(@port) + @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) + rescue IOError => error + log.e(TAG, error) + + @connection_attempts += 1 + retry if @connection_attempts < @max_connection_attempts + end + end + + while @socket && !@socket.closed? + begin + run_server + rescue IOError => error + log.e(TAG, error) + @socket.close if @socket + end + end + end + + thread.join if run_on_main_thread + end + + def run_server + while !@socket.closed? + client = Client.new + client.sync_interval = @sync_interval + client.socket = @socket.accept + + if @active_client && @active_client.connected? + log.i(TAG, "Too many clients, already have one connected!") + client.close("Too many clients!") + else + @active_client = client + # TODO: Backup local config + # SEND CONFIG + + @active_client.puts(PacketHandler.packet_handshake(@active_client.uuid)) + + log.i(TAG, "Client connected!") + + Thread.new do + while @active_client && @active_client.connected? + if Gosu.milliseconds > @last_sync_time + @sync_interval + @last_sync_time = Gosu.milliseconds + + @active_client.sync(@client_handler_proc) + update_stats + end + end + + update_stats + @active_client = nil + + @client_last_packets_sent = 0 + @client_last_packets_received = 0 + @client_last_data_sent = 0 + @client_last_data_received = 0 + end + end + end + end + + def handle_client + if @active_client && @active_client.connected? + message = @active_client.gets + + if message && !message.empty? + @packet_handler.handle(message) + end + + if Gosu.milliseconds > @last_heartbeat_sent + @heartbeat_interval + @last_heartbeat_sent = Gosu.milliseconds + + @active_client.puts(PacketHandler.packet_heartbeat) + end + + sleep @sync_interval / 1000.0 + end + end + + def close + @socket.close + end + + private def update_stats + if @active_client + # NOTE: Sent and Received are reversed for Server stats + + @packets_sent += @active_client.packets_received - @client_last_packets_received + @packets_received += @active_client.packets_sent - @client_last_packets_sent + + @data_sent += @active_client.data_received - @client_last_data_received + @data_received += @active_client.data_sent - @client_last_data_sent + + @client_last_packets_sent = @active_client.packets_sent + @client_last_packets_received = @active_client.packets_received + @client_last_data_sent = @active_client.data_sent + @client_last_data_received = @active_client.data_received + end + end + end + end + end +end diff --git a/lib/game_clock/particle_emitter.rb b/lib/game_clock/particle_emitter.rb new file mode 100644 index 0000000..0c776e7 --- /dev/null +++ b/lib/game_clock/particle_emitter.rb @@ -0,0 +1,135 @@ +module TAC + class PracticeGameClock + class ParticleEmitter + def initialize(max_particles: 50, time_to_live: 30_000, interval: 1_500, z: -2) + @max_particles = max_particles + @time_to_live = time_to_live + @interval = interval + @z = -2 + + @particles = [] + @image_options = Dir.glob("#{ROOT_PATH}/media/particles/*.*") + @last_spawned = 0 + @clock_active = false + end + + def draw + @particles.each(&:draw) + end + + def update + @particles.each { |part| part.update($window.dt) } + @particles.delete_if { |part| part.die? } + + spawn_particles + end + + def spawn_particles + # !clock_active? && + if @particles.count < @max_particles && Gosu.milliseconds - @last_spawned >= @interval + screen_midpoint = CyberarmEngine::Vector.new($window.width / 2, $window.height / 2) + scale = rand(0.25..1.0) + image_name = @image_options.sample + + return unless image_name + + image = $window.current_state.get_image(image_name) + position = CyberarmEngine::Vector.new(0, 0) + + r = rand + if r < 0.25 # LEFT + position.x = -image.width * scale + position.y = rand(0..($window.height - image.height * scale)) + elsif r < 0.5 # RIGHT + position.x = $window.width + (image.width * scale) + position.y = rand(0..($window.height - image.height * scale)) + elsif r < 0.75 # TOP + position.x = rand(0..($window.width - image.width * scale)) + position.y = -image.height * scale + else #BOTTOM + position.x = rand(0..($window.width - image.width * scale)) + position.y = $window.height + image.height * scale + end + + position.x ||= 0 + position.y ||= 0 + + velocity = (screen_midpoint - position) + + @particles << Particle.new( + image: image, + position: position, + velocity: velocity, + time_to_live: @time_to_live, + speed: rand(24..128), + scale: scale, + clock_active: @clock_active, + z: @z + ) + + @last_spawned = Gosu.milliseconds + end + end + + def clock_active! + @clock_active = true + @particles.each(&:clock_active!) + end + + def clock_inactive! + @clock_active = false + @particles.each(&:clock_inactive!) + end + + def clock_active? + @clock_active + end + + class Particle + def initialize(image:, position:, velocity:, time_to_live:, speed:, z:, scale: 1.0, clock_active: false) + @image = image + @position = position + @velocity = velocity.normalized + @time_to_live = time_to_live + @speed = speed + @z = z + @scale = scale + + @born_at = Gosu.milliseconds + @born_time_to_live = time_to_live + @color = Gosu::Color.new(0xff_ffffff) + @clock_active = clock_active + end + + def draw + @image.draw(@position.x, @position.y, @z, @scale, @scale, @color) + end + + def update(dt) + @position += @velocity * @speed * dt + + @color.alpha = (255.0 * ratio).to_i.clamp(0, 255) + end + + def ratio + r = 1.0 - ((Gosu.milliseconds - @born_at) / @time_to_live.to_f) + @clock_active ? r.clamp(0.0, 0.5) : r + end + + def die? + ratio <= 0 + end + + def clock_active! + @clock_active = true + # @time_to_live = (Gosu.milliseconds - @born_at) + 1_000 + end + + def clock_inactive! + @clock_active = false + # @time_to_live = @born_time_to_live unless Gosu.milliseconds - @born_at < @time_to_live + end + end + end + end +end diff --git a/lib/game_clock/randomizer.rb b/lib/game_clock/randomizer.rb new file mode 100644 index 0000000..3eb428b --- /dev/null +++ b/lib/game_clock/randomizer.rb @@ -0,0 +1,127 @@ +require "securerandom" + +module TAC + class PracticeGameClock + class Randomizer < CyberarmEngine::GameState + def setup + @roll = SecureRandom.random_number(1..6) + + @position = CyberarmEngine::Vector.new + + @dimple_color = 0xff_008000 + @dimple_res = 36 + + @size = [window.width, window.height].min / 2.0 + + @rings = [] + + case @roll + when 1, 4 + when 2, 5 + @rings << Ring.new(position: CyberarmEngine::Vector.new(-@size, window.height * 0.9), speed: 512) + when 3, 6 + @rings << Ring.new(position: CyberarmEngine::Vector.new(-@size, window.height * 0.9), speed: 512) + @rings << Ring.new(position: CyberarmEngine::Vector.new(-@size * 1.25, window.height * 0.8), speed: 512) + @rings << Ring.new(position: CyberarmEngine::Vector.new(-@size * 1.50, window.height * 0.7), speed: 512) + @rings << Ring.new(position: CyberarmEngine::Vector.new(-@size * 1.75, window.height * 0.6), speed: 512) + end + end + + def draw + window.previous_state.draw + + Gosu.flush + + fill(0xdd_202020) + + Gosu.translate(window.width * 0.5 - @size * 0.5, 24) do + Gosu.draw_rect(0, 0, @size, @size, Gosu::Color::BLACK) + Gosu.draw_rect(12, 12, @size - 24, @size - 24, Gosu::Color::GRAY) + + self.send(:"dice_#{@roll}", @size) + end + + @rings.each { |r| r.draw(@size) } + end + + def dice_1(size) + Gosu.draw_circle(size / 2, size / 2, dimple(size), @dimple_res, @dimple_color) + end + + def dice_2(size) + Gosu.draw_circle(size * 0.25, size * 0.25, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.75, dimple(size), @dimple_res, @dimple_color) + end + + def dice_3(size) + Gosu.draw_circle(size * 0.25, size * 0.25, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.50, size * 0.50, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.75, dimple(size), @dimple_res, @dimple_color) + end + + def dice_4(size) + Gosu.draw_circle(size * 0.25, size * 0.25, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.25, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.25, size * 0.75, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.75, dimple(size), @dimple_res, @dimple_color) + end + + def dice_5(size) + Gosu.draw_circle(size * 0.50, size * 0.50, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.25, size * 0.25, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.25, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.25, size * 0.75, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.75, dimple(size), @dimple_res, @dimple_color) + end + + def dice_6(size) + Gosu.draw_circle(size * 0.25, size * 0.20, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.20, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.25, size * 0.50, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.50, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.25, size * 0.80, dimple(size), @dimple_res, @dimple_color) + Gosu.draw_circle(size * 0.75, size * 0.80, dimple(size), @dimple_res, @dimple_color) + end + + def dimple(size) + size / 9.0 + end + + def update + window.previous_state&.update_non_gui + + @rings.each { |r| r.update(window, @size) } + + @size = [window.width, window.height].min / 2.0 + end + + def button_down(id) + case id + when Gosu::MS_LEFT, Gosu::KB_ESCAPE, Gosu::KB_SPACE + pop_state + end + end + + class Ring + def initialize(position:, speed: 1) + @position = position + @speed = speed + @color = 0xff_ffaa00 + end + + def draw(size) + Gosu.translate(@position.x, @position.y) do + Gosu.draw_rect(0, 0, size, size * 0.10, @color) + end + end + + def update(window, size) + center = window.width * 0.5 - size * 0.5 + + @position.x += @speed * window.dt + @position.x = center if @position.x > center + end + end + end + end +end diff --git a/lib/game_clock/remote_control.rb b/lib/game_clock/remote_control.rb new file mode 100644 index 0000000..39c7284 --- /dev/null +++ b/lib/game_clock/remote_control.rb @@ -0,0 +1,270 @@ +module TAC + class PracticeGameClock + class RemoteControl + @@connection = nil + @@server = nil + + def self.connection + @@connection + end + + def self.connection=(connection) + @@connection = connection + end + + def self.server + @@server + end + + def self.server=(server) + @@server = server + end + + class NetConnect < CyberarmEngine::GuiState + def setup + theme(THEME) + + background Palette::TACNET_NOT_CONNECTED + + banner "ClockNet Remote Control", text_align: :center, width: 1.0 + flow(width: 1.0) do + stack(width: 0.25) {} + stack(width: 0.5) do + title "Hostname" + @hostname = edit_line "localhost", width: 1.0 + title "Port" + @port = edit_line "4567", width: 1.0 + + flow(width: 1.0, margin_top: 20) do + @back_button = button "Back", width: 0.5 do + window.pop_state + end + + @connect_button = button "Connect", width: 0.5 do + begin + @connect_button.enabled = false + @back_button.enabled = false + + @connection = ClockNet::Connection.new(hostname: @hostname.value, port: Integer(@port.value), proxy_object: RemoteProxy.new(window)) + + @connection.connect + RemoteControl.connection = @connection + end + end + end + end + end + end + + def update + super + + if RemoteControl.connection + push_state(Controller) if RemoteControl.connection.connected? + + RemoteControl.connection = nil if RemoteControl.connection.client.socket_error? + else + @back_button.enabled = true + @connect_button.enabled = true + end + end + end + + class Controller < CyberarmEngine::GuiState + def setup + theme(THEME) + + at_exit do + @connection&.close + end + + @jukebox_volume = 1.0 + @jukebox_sound_effects = true + @randomizer_visible = false + + RemoteControl.connection.proxy_object.register(:track_changed, method(:track_changed)) + RemoteControl.connection.proxy_object.register(:volume_changed, method(:volume_changed)) + RemoteControl.connection.proxy_object.register(:clock_changed, method(:clock_changed)) + RemoteControl.connection.proxy_object.register(:randomizer_changed, method(:randomizer_changed)) + + background Palette::TACNET_NOT_CONNECTED + + banner "ClockNet Remote Control", text_align: :center, width: 1.0 + + flow width: 1.0, height: 1.0 do + stack width: 0.5 do + title "Match", width: 1.0, text_align: :center + button "Start Match", width: 1.0, text_size: 48, margin_bottom: 50 do + start_clock(:full_match) + end + + title "Practice", width: 1.0, text_align: :center + button "Autonomous", width: 1.0 do + start_clock(:autonomous) + end + button "TeleOp with Countdown", width: 1.0 do + start_clock(:full_teleop) + end + button "TeleOp", width: 1.0 do + start_clock(:teleop_only) + end + button "TeleOp Endgame", width: 1.0, margin_bottom: 50 do + start_clock(:endgame_only) + end + + button "Abort Clock", width: 1.0 do + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_abort_clock) + end + + button "Shutdown", width: 1.0, **DANGEROUS_BUTTON do + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_shutdown) + sleep 1 # let packet escape before closing + exit + end + end + + stack width: 0.495 do + title "Clock Title", width: 1.0, text_align: :center + + stack width: 0.9, margin_left: 50 do + @title = edit_line "FIRST TECH CHALLENGE", width: 1.0 + + button "Update", width: 1.0, margin_bottom: 50 do + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_set_clock_title(@title.value.strip)) + end + end + + title "JukeBox", width: 1.0, text_align: :center + stack width: 0.9, margin_left: 50 do + flow width: 1.0 do + tagline "Now Playing: " + @track_name = tagline "" + end + + flow width: 1.0 do + tagline "Volume: " + @volume = tagline "100%" + end + + flow width: 1.0 do + button get_image("#{ROOT_PATH}/media/icons/previous.png") do + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_previous_track) + end + + button get_image("#{ROOT_PATH}/media/icons/right.png") do |button| + if @jukebox_playing + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_pause) + button.value = get_image("#{ROOT_PATH}/media/icons/right.png") + @jukebox_playing = false + else + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_play) + button.value = get_image("#{ROOT_PATH}/media/icons/pause.png") + @jukebox_playing = true + end + end + + button get_image("#{ROOT_PATH}/media/icons/stop.png") do + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_stop) + end + + button get_image("#{ROOT_PATH}/media/icons/next.png") do + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_next_track) + end + + button get_image("#{ROOT_PATH}/media/icons/minus.png"), margin_left: 20 do + @jukebox_volume -= 0.1 + @jukebox_volume = 0.1 if @jukebox_volume < 0.1 + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_set_volume(@jukebox_volume)) + end + + button get_image("#{ROOT_PATH}/media/icons/plus.png") do + @jukebox_volume += 0.1 + @jukebox_volume = 0.1 if @jukebox_volume < 0.1 + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_set_volume(@jukebox_volume)) + end + + button get_image("#{ROOT_PATH}/media/icons/musicOn.png"), margin_left: 20, tip: "Toggle Sound Effects" do |button| + if @jukebox_sound_effects + button.value = get_image("#{ROOT_PATH}/media/icons/musicOff.png") + @jukebox_sound_effects = false + else + button.value = get_image("#{ROOT_PATH}/media/icons/musicOn.png") + @jukebox_sound_effects = true + end + + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_set_sound_effects(@jukebox_sound_effects)) + end + end + + button "Open Music Library", width: 1.0 do + path = "#{ROOT_PATH}/media/music" + + if RUBY_PLATFORM.match(/ming|msys|cygwin/) + system("explorer \"#{path.gsub("/", "\\")}\"") + elsif RUBY_PLATFORM.match(/linux/) + system("xdg-open \"#{ROOT_PATH}/media/music\"") + else + # TODO. + end + end + end + + stack width: 0.9, margin_left: 50, margin_top: 20 do + flow width: 1.0 do + title "Clock: " + @clock_label = title "0:123456789" + @clock_label.width + @clock_label.value = "0:00" + end + + flow width: 1.0 do + title "Randomizer: " + @randomizer_label = title "Not Visible" + end + + button "Randomizer", width: 1.0, **DANGEROUS_BUTTON do + @randomizer_visible = !@randomizer_visible + + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_randomizer_visible(@randomizer_visible)) + end + end + end + end + end + + def update + super + + return if RemoteControl.connection.connected? + + # We've lost connection, unset window's connection object + # and send user back to connect screen to to attempt to + # reconnect + RemoteControl.connection = nil + pop_state + end + + def start_clock(mode) + RemoteControl.connection.puts(ClockNet::PacketHandler.packet_start_clock(mode.to_s)) + end + + def track_changed(name) + @track_name.value = name + end + + def volume_changed(float) + @volume.value = "#{float.round(1) * 100.0}%" + end + + def clock_changed(string) + @clock_label.value = string + end + + def randomizer_changed(boolean) + @randomizer_label.value = "Visible" if boolean + @randomizer_label.value = "Not Visible" unless boolean + end + end + end + end +end diff --git a/lib/game_clock/remote_proxy.rb b/lib/game_clock/remote_proxy.rb new file mode 100644 index 0000000..4b1d0f5 --- /dev/null +++ b/lib/game_clock/remote_proxy.rb @@ -0,0 +1,64 @@ +module TAC + class PracticeGameClock + class RemoteProxy + def initialize(window) + @window = window + + @callbacks = {} + end + + def register(callback, method) + @callbacks[callback] = method + end + + def start_clock(mode) + end + + def abort_clock + end + + def set_clock_title(string) + end + + def get_clock_title(string) + end + + def jukebox_previous_track + end + + def jukebox_next_track + end + + def jukebox_stop + end + + def jukebox_play + end + + def jukebox_pause + end + + def jukebox_sound_effects(boolean) + end + + def volume_changed(float) + @callbacks[:volume_changed]&.call(float) + end + + def track_changed(name) + @callbacks[:track_changed]&.call(name) + end + + def clock_changed(string) + @callbacks[:clock_changed]&.call(string) + end + + def randomizer_changed(boolean) + @callbacks[:randomizer_changed]&.call(boolean) + end + + def shutdown! + end + end + end +end diff --git a/lib/game_clock/theme.rb b/lib/game_clock/theme.rb new file mode 100644 index 0000000..e436cf5 --- /dev/null +++ b/lib/game_clock/theme.rb @@ -0,0 +1,73 @@ +module TAC + class PracticeGameClock + module Palette + TACNET_CONNECTED = Gosu::Color.new(0xff_008000) + TACNET_CONNECTING = Gosu::Color.new(0xff_ff8800) + TACNET_CONNECTION_ERROR = Gosu::Color.new(0xff_800000) + TACNET_NOT_CONNECTED = Gosu::Color.new(0xff_222222) + + TIMECRAFTERS_PRIMARY = Gosu::Color.new(0xff_008000) + TIMECRAFTERS_SECONDARY = Gosu::Color.new(0xff_006000) + TIMECRAFTERS_TERTIARY = Gosu::Color.new(0xff_00d000) + + BLUE_ALLIANCE = Gosu::Color.new(0xff_000080) + RED_ALLIANCE = Gosu::Color.new(0xff_800000) + + TACNET_PRIMARY = Gosu::Color.new(0xff000080) + TACNET_SECONDARY = Gosu::Color.new(0xff000060) + + GROUPS_PRIMARY = Gosu::Color.new(0xff_444444) + GROUPS_SECONDARY = Gosu::Color.new(0xff_444444) + + ACTIONS_PRIMARY = Gosu::Color.new(0xff_4444aa) + ACTIONS_SECONDARY = Gosu::Color.new(0xff_040404) + + VARIABLES_PRIMARY = Gosu::Color.new(0xff_660066) + VARIABLES_SECONDARY = Gosu::Color.new(0xff_440044) + + EDITOR_PRIMARY = Gosu::Color.new(0xff_446688) + EDITOR_SECONDARY = Gosu::Color.new(0xff_224466) + + ALERT = TACNET_CONNECTING + end + + THEME = { + TextBlock: { + font: "Canterell", + color: Gosu::Color.new(0xee_ffffff) + }, + Button: { + image_width: 40, + text_size: 40, + background: Palette::TIMECRAFTERS_PRIMARY, + border_thickness: 1, + border_color: Gosu::Color.new(0xff_111111), + hover: { + background: Palette::TIMECRAFTERS_SECONDARY, + }, + active: { + background: Palette::TIMECRAFTERS_TERTIARY, + } + }, + EditLine: { + caret_color: Gosu::Color.new(0xff_88ef90), + }, + ToggleButton: { + width: 18, + checkmark_image: "#{File.expand_path("..", __dir__)}/media/icons/checkmark.png", + }, + } + + DANGEROUS_BUTTON = { + background: 0xff_800000, + border_thickness: 1, + border_color: Gosu::Color.new(0xff_111111), + hover: { + background: 0xff_600000, + }, + active: { + background: 0xff_f00000, + } + } + end +end diff --git a/lib/game_clock/view.rb b/lib/game_clock/view.rb new file mode 100644 index 0000000..422325e --- /dev/null +++ b/lib/game_clock/view.rb @@ -0,0 +1,283 @@ +module TAC + class PracticeGameClock + class View < CyberarmEngine::GuiState + + attr_reader :clock + + def setup + window.show_cursor = true + + @remote_control_mode = @options[:remote_control_mode] + @escape_counter = 0 + + @background_image = get_image("#{ROOT_PATH}/media/background.png") + @mouse = Mouse.new(window) + @clock = Clock.new + @clock.controller = nil + @last_clock_display_value = @clock.value + + @particle_emitters = [ + PracticeGameClock::ParticleEmitter.new + ] + + @last_clock_state = @clock.active? + + theme(THEME) + + @menu_container = flow width: 1.0 do + stack(width: 0.35, padding: 5) do + background 0x55004159 + + title "Match", width: 1.0, text_align: :center + button "Start Match", width: 1.0, margin_bottom: 50 do + @clock_proxy.start_clock(:full_match) + end + + title "Practice", width: 1.0, text_align: :center + button "Autonomous", width: 1.0 do + @clock_proxy.start_clock(:autonomous) + end + + button "TeleOp with Countdown", width: 1.0 do + @clock_proxy.start_clock(:full_teleop) + end + + button "TeleOp", width: 1.0 do + @clock_proxy.start_clock(:teleop_only) + end + + button "TeleOp Endgame", width: 1.0 do + @clock_proxy.start_clock(:endgame_only) + end + + button "Abort Clock", width: 1.0, margin_top: 50 do + @clock_proxy.abort_clock + end + + button "Close", width: 1.0, **DANGEROUS_BUTTON do + if window.instance_variable_get(:"@states").size == 1 + window.close + else + @server&.close + + window.fullscreen = false + window.pop_state + end + end + end + + stack width: 0.4, padding_left: 50 do + background 0x55004159 + + flow do + label "♫ Now playing:" + @current_song_label = label "♫ ♫ ♫" + end + + flow do + label "Volume:" + @current_volume_label = label "100%" + end + + flow do + button get_image("#{ROOT_PATH}/media/icons/previous.png") do + @jukebox.previous_track + end + + button get_image("#{ROOT_PATH}/media/icons/pause.png") do |button| + if @jukebox.song && @jukebox.song.paused? + button.value = get_image("#{ROOT_PATH}/media/icons/right.png") + @jukebox.play + elsif !@jukebox.song + button.value = get_image("#{ROOT_PATH}/media/icons/right.png") + @jukebox.play + else + button.value = get_image("#{ROOT_PATH}/media/icons/pause.png") + @jukebox.pause + end + end + + button get_image("#{ROOT_PATH}/media/icons/stop.png") do + @jukebox.stop + end + + button get_image("#{ROOT_PATH}/media/icons/next.png") do + @jukebox.next_track + end + + button get_image("#{ROOT_PATH}/media/icons/minus.png"), margin_left: 20 do + @jukebox.set_volume(@jukebox.volume - 0.1) + end + + button get_image("#{ROOT_PATH}/media/icons/plus.png") do + @jukebox.set_volume(@jukebox.volume + 0.1) + end + + button "Open Music Library", margin_left: 50 do + if RUBY_PLATFORM.match(/ming|msys|cygwin/) + system("explorer #{ROOT_PATH}/media/music") + elsif RUBY_PLATFORM.match(/linux/) + system("xdg-open #{ROOT_PATH}/media/music") + else + # TODO. + end + end + + button get_image("#{ROOT_PATH}/media/icons/musicOn.png"), margin_left: 50, tip: "Toggle Sound Effects" do |button| + boolean = @jukebox.set_sfx(!@jukebox.play_sfx?) + + if boolean + button.value = get_image("#{ROOT_PATH}/media/icons/musicOn.png") + else + button.value = get_image("#{ROOT_PATH}/media/icons/musicOff.png") + end + end + end + + stack width: 1.0 do + button "Randomizer", width: 1.0, **DANGEROUS_BUTTON do + unless @clock.active? + push_state(Randomizer) + end + end + end + end + end + + @jukebox = Jukebox.new(@clock) + + @clock_proxy = ClockProxy.new(@clock, @jukebox) + + if @remote_control_mode + @server = ClockNet::Server.new(proxy_object: @clock_proxy) + @server.start + RemoteControl.server = @server + + @clock_proxy.register(:randomizer_changed, method(:randomizer_changed)) + end + end + + def draw + @background_image.draw(0, 0, -3) + @particle_emitters.each(&:draw) + @clock.draw + + super + end + + def update + super + @clock.update + @mouse.update + @jukebox.update + @particle_emitters.each(&:update) + + if @last_clock_state != @clock.active? + @particle_emitters.each { |emitter| @clock.active? ? emitter.clock_active! : emitter.clock_inactive! } + end + + if @remote_control_mode + @menu_container.hide + else + if @mouse.last_moved < 1.5 + @menu_container.show unless @menu_container.visible? + window.show_cursor = true + else + @menu_container.hide if @menu_container.visible? + window.show_cursor = false + end + end + + if @clock.value != @last_clock_display_value + @last_clock_display_value = @clock.value + + if @remote_control_mode && @server.active_client + @server.active_client.puts(ClockNet::PacketHandler.packet_clock_time(@last_clock_display_value)) + end + end + + if @last_track_name != @jukebox.current_track + track_changed(@jukebox.current_track) + end + + if @last_volume != @jukebox.volume + volume_changed(@jukebox.volume) + end + + @last_track_name = @jukebox.current_track + @last_volume = @jukebox.volume + @last_clock_state = @clock.active? + end + + def update_non_gui + @particle_emitters.each(&:update) + @jukebox.update + end + + def button_down(id) + super + + @mouse.button_down(id) + + case id + when Gosu::KB_ESCAPE + @escape_counter += 1 + + if @escape_counter >= 3 + @server&.close + + window.fullscreen = false + window.pop_state + end + else + @escape_counter = 0 + end + end + + def track_changed(name) + @current_song_label.value = File.basename(name) + end + + def volume_changed(float) + @current_volume_label.value = "#{(float.round(1) * 100.0).round}%" + end + + def randomizer_changed(boolean) + if boolean + push_state(Randomizer) + else + pop_state if current_state.is_a?(Randomizer) + end + end + + class Mouse + def initialize(window) + @window = window + @last_moved = 0 + + @last_position = CyberarmEngine::Vector.new(@window.mouse_x, @window.mouse_y) + end + + def update + position = CyberarmEngine::Vector.new(@window.mouse_x, @window.mouse_y) + + if @last_position != position + @last_position = position + @last_moved = Gosu.milliseconds + end + end + + def button_down(id) + case id + when Gosu::MS_LEFT, Gosu::MS_MIDDLE, Gosu::MS_RIGHT + @last_moved = Gosu.milliseconds + end + end + + def last_moved + (Gosu.milliseconds - @last_moved) / 1000.0 + end + end + end + end +end diff --git a/lib/pages/drive_team_rotation_generator.rb b/lib/pages/drive_team_rotation_generator.rb index 0a59859..bac8bf6 100644 --- a/lib/pages/drive_team_rotation_generator.rb +++ b/lib/pages/drive_team_rotation_generator.rb @@ -42,7 +42,7 @@ module TAC flow(width: 1.0, margin_bottom: 20) do @role_name = edit_line "", placeholder: "Add role", width: 0.9 - button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_width: 0.1 do + button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_width: 0.1, tip: "Add role" do if @role_name.value.strip.length.positive? @roles.push(@role_name.value.strip) @role_name.value = "" @@ -61,7 +61,7 @@ module TAC flow(width: 1.0, margin_bottom: 20) do @roster_name = edit_line "", placeholder: "Add name", width: 0.9 - button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_width: 0.1 do + button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_width: 0.1, tip: "Add name" do if @roster_name.value.strip.length.positive? @roster.push(@roster_name.value.strip) @roster_name.value = "" @@ -96,7 +96,7 @@ module TAC background i.even? ? 0xff_007000 : 0xff_006000 tagline name, width: 0.9 - button "X", width: 0.1, text_size: 18, **THEME_DANGER_BUTTON do + button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: 0.1, tip: "Remove role", **THEME_DANGER_BUTTON do @roles.delete(name) populate_roles end @@ -112,7 +112,7 @@ module TAC background i.even? ? 0xff_007000 : 0xff_006000 tagline name, width: 0.9 - button "X", width: 0.1, text_size: 18, **THEME_DANGER_BUTTON do + button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: 0.1, tip: "Remove name", **THEME_DANGER_BUTTON do @roster.delete(name) populate_roster end diff --git a/lib/pages/game_clock.rb b/lib/pages/game_clock.rb index a09e79c..0df68fe 100644 --- a/lib/pages/game_clock.rb +++ b/lib/pages/game_clock.rb @@ -2,14 +2,41 @@ module TAC class Pages class GameClock < Page def setup - header_bar("Practice Game Clock") + header_bar("Game Clock") body.clear do - stack(width: 1.0, height: 1.0) do - label TAC::NAME, width: 1.0, text_size: 48, text_align: :center + flow(width: 1.0, height: 1.0) do + @command_options = flow(width: 1.0) do + stack(width: 0.3) do + end - stack(width: 1.0, height: 8) do - background 0xff_006000 + stack(width: 0.4) do + banner "Choose Mode", width: 1.0, text_align: :center + title "Local", width: 1.0, text_align: :center + + button "Game Clock", width: 1.0 do + push_state(PracticeGameClock::View) + + window.fullscreen = true + end + + button "Dual Screen Game Clock", width: 1.0, enabled: false do + end + + title "Remote", width: 1.0, text_align: :center, margin_top: 32 + button "Game Clock Display", width: 1.0 do + push_state(PracticeGameClock::View, remote_control_mode: true) + + window.fullscreen = true + end + + button "Game Clock Remote Control", width: 1.0 do + push_state(PracticeGameClock::RemoteControl::NetConnect) + end + end + + stack(width: 0.3) do + end end end end diff --git a/lib/states/editor.rb b/lib/states/editor.rb index ee1250c..71a8df2 100644 --- a/lib/states/editor.rb +++ b/lib/states/editor.rb @@ -94,9 +94,13 @@ class Editor < CyberarmEngine::GuiState page(TAC::Pages::DriveTeamRotationGenerator) end - button get_image("#{TAC::ROOT_PATH}/media/icons/trophy.png"), margin: 4, tip: "Practice Game Clock", image_width: 1.0 do + button get_image("#{TAC::ROOT_PATH}/media/icons/trophy.png"), margin: 4, tip: "Game Clock", image_width: 1.0 do page(TAC::Pages::GameClock) end + + button get_image("#{TAC::ROOT_PATH}/media/icons/power.png"), margin: 4, tip: "Exit", image_width: 1.0, **TAC::THEME_DANGER_BUTTON do + window.close + end end @content = stack(width: window.width - @navigation.style.width, height: 1.0) do diff --git a/media/background.png b/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..30e289bbc1ac671935521d2ce0896acc4d600774 GIT binary patch literal 154876 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 iXsbbc4V<~>`Tqe;H{ptPG*RFH0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/music/.gitkeep b/media/music/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/media/particles/.gitkeep b/media/particles/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/media/sounds/.gitkeep b/media/sounds/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/timecrafters_configuration_tool.rb b/timecrafters_configuration_tool.rb index a886bb0..39da3a9 100644 --- a/timecrafters_configuration_tool.rb +++ b/timecrafters_configuration_tool.rb @@ -51,6 +51,24 @@ require_relative "lib/tacnet/client" require_relative "lib/tacnet/connection" require_relative "lib/tacnet/server" +require_relative "lib/game_clock/view" +require_relative "lib/game_clock/clock" +require_relative "lib/game_clock/event_handlers" +require_relative "lib/game_clock/clock_controller" +require_relative "lib/game_clock/jukebox" +require_relative "lib/game_clock/theme" +require_relative "lib/game_clock/clock_proxy" +require_relative "lib/game_clock/logger" +require_relative "lib/game_clock/particle_emitter" +require_relative "lib/game_clock/randomizer" +require_relative "lib/game_clock/remote_control" +require_relative "lib/game_clock/remote_proxy" +require_relative "lib/game_clock/net/client" +require_relative "lib/game_clock/net/server" +require_relative "lib/game_clock/net/connection" +require_relative "lib/game_clock/net/packet_handler" +require_relative "lib/game_clock/net/packet" + # Thread.abort_on_exception = true USE_REDESIGN = ARGV.include?("--redesign")