10 Commits

32 changed files with 393 additions and 164 deletions

View File

@@ -6,12 +6,12 @@ GEM
excon (~> 0.88)
gosu (~> 1.1)
gosu_more_drawables (~> 0.3)
excon (0.98.0)
gosu (1.4.5)
excon (0.104.0)
gosu (1.4.6)
gosu_more_drawables (0.3.1)
gosu_notifications (0.1.0)
ocra (1.3.11)
rake (13.0.6)
rake (13.1.0)
releasy (0.2.3)
bundler (>= 1.2.1)
cri (~> 2.1.0)

View File

@@ -2,6 +2,8 @@ module TAC
class Backend
attr_reader :config, :settings, :tacnet
def initialize
create_directories
load_settings
load_config(@settings.config) if @settings.config && File.exist?("#{TAC::CONFIGS_PATH}/#{@settings.config}.json")
@tacnet = TACNET.new
@@ -113,6 +115,12 @@ module TAC
@settings_changed
end
def create_directories
FileUtils.mkdir_p(TAC::ROOT_PATH) unless File.exist?(TAC::ROOT_PATH)
FileUtils.mkdir_p(TAC::CONFIGS_PATH) unless File.exist?(TAC::CONFIGS_PATH)
# FileUtils.mkdir_p(TAC::SETTINGS_PATH) unless File.exist?(TAC::SETTINGS_PATH)
end
def load_settings
if File.exist?(TAC::SETTINGS_PATH)
@settings = TAC::Settings.new

View File

@@ -13,7 +13,7 @@ module TAC
label @title, text_size: THEME_SUBHEADING_TEXT_SIZE, font: TAC::THEME_BOLD_FONT, fill: true, text_align: :center, text_border: true, text_border_color: 0xaa_222222, text_border_size: 1
button get_image("#{TAC::ROOT_PATH}/media/icons/cross.png"), image_height: 1.0, **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/cross.png"), image_height: 1.0, **THEME_DANGER_BUTTON do
close
end
end

View File

@@ -8,7 +8,7 @@ module TAC
background Gosu::Color::GRAY
label @options[:message], width: 1.0
@sound = Gosu::Sample.new("#{TAC::ROOT_PATH}/media/error_alarm.ogg").play(1, 1, true)
@sound = Gosu::Sample.new("#{TAC::MEDIA_PATH}/error_alarm.ogg").play(1, 1, true)
button "Close", width: 1.0, margin_top: THEME_DIALOG_BUTTON_PADDING do
try_commit

View File

@@ -57,13 +57,12 @@ module TAC
end
def clock_time(time_left)
minutes = ((time_left + 0.5) / 60.0).floor
minutes = ((time_left + 1.0) / 60.0).floor
seconds = time_left.round % 60
seconds = "0#{seconds}" if seconds < 10
seconds = format("%02d", time_left.ceil % 60)
return "#{minutes}:#{seconds}" if time_left.round.even?
return "#{minutes}<c=999999>:</c>#{seconds}" if time_left.round.odd?
return "#{minutes}:#{seconds}" if time_left.ceil.even?
return "#{minutes}<c=999999>:</c>#{seconds}" if time_left.ceil.odd?
end
end
end

View File

@@ -33,8 +33,8 @@ module TAC
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, 35.0, :teleop_pickup_controllers),
create_event(:change_color, 38.0, :red),
create_event(:play_sound, 38.0, :teleop_countdown),
create_event(:stop_countdown, 41.0),
].freeze
@@ -44,7 +44,7 @@ module TAC
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, 158.0, :autonomous_countdown), # Not played here anymore
create_event(:play_sound, 161.0, :end_match),
create_event(:stop_clock, 161.0),
].freeze
@@ -128,7 +128,7 @@ module TAC
elsif @countdown_running
return @countdown_time
else
return 60 * 2 + 30
return 0 # Clock defaults to showing "0:00" if there is no clock or countdown
end
end
end

View File

@@ -41,6 +41,12 @@ module TAC
Gosu::Color.rgb(150, 0, 0)
end
### --- ###
# OVERRIDE: offical CenterStage game clock no longer has colors
### --- ###
out = Gosu::Color::WHITE
@display_color = out
end
@@ -56,26 +62,26 @@ module TAC
path = nil
case sound
when :autonomous_countdown
path = "media/sounds/3-2-1.wav"
path = "sounds/3-2-1.wav"
when :autonomous_start
path = "media/sounds/charge.wav"
path = "sounds/charge.wav"
when :autonomous_ended
path = "media/sounds/endauto.wav"
path = "sounds/endauto.wav"
when :teleop_pickup_controllers
path = "media/sounds/Pick_Up_Controllers.wav"
path = "sounds/Pick_Up_Controllers.wav"
when :abort_match
path = "media/sounds/fogblast.wav"
path = "sounds/fogblast.wav"
when :teleop_countdown
path = "media/sounds/3-2-1.wav"
path = "sounds/3-2-1.wav"
when :teleop_started
path = "media/sounds/firebell.wav"
path = "sounds/firebell.wav"
when :end_game
path = "media/sounds/factwhistle.wav"
path = "sounds/factwhistle.wav"
when :end_match
path = "media/sounds/endmatch.wav"
path = "sounds/endmatch.wav"
end
path = "#{ROOT_PATH}/#{path}"
path = "#{MEDIA_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)

View File

@@ -1,11 +1,11 @@
module TAC
class PracticeGameClock
class Jukebox
MUSIC = Dir.glob(ROOT_PATH + "/media/music/*.*").freeze
MUSIC = Dir.glob(MEDIA_PATH + "/music/*.*").freeze
SAMPLES = {}
if File.exist?(ROOT_PATH + "/media/sounds/skystone")
BEEPS_AND_BOOPS = Dir.glob(ROOT_PATH + "/media/sounds/skystone/*.*").freeze
if File.exist?(MEDIA_PATH + "/sounds/skystone")
BEEPS_AND_BOOPS = Dir.glob(MEDIA_PATH + "/sounds/skystone/*.*").freeze
end
attr_reader :volume, :now_playing

View File

@@ -129,7 +129,7 @@ module TAC
end
return message.strip
return message.to_s.strip
end
def puts(message)

View File

@@ -8,7 +8,7 @@ module TAC
@z = -2
@particles = []
@image_options = Dir.glob("#{ROOT_PATH}/media/particles/*.*")
@image_options = Dir.glob("#{MEDIA_PATH}/particles/*.*")
@last_spawned = 0
@clock_active = false
end

View File

@@ -15,30 +15,20 @@ module TAC
case @roll
when 1, 4
# Blue: Right
# Red: Left
#Blue and Red: Left
@ducks << Ducky.new(window: window, alliance: :blue, slot: 3, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :red, slot: 1, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :blue, slot: 1, speed: 1010, die_size: @size, label: "Left")
@ducks << Ducky.new(window: window, alliance: :red, slot: 1, speed: 1010, die_size: @size, label: "Left")
when 2, 5
#Blue and Red: Center
@ducks << Ducky.new(window: window, alliance: :blue, slot: 1, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :blue, slot: 3, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :red, slot: 3, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :red, slot: 1, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :blue, slot: 2, speed: 1010, die_size: @size, label: "Center")
@ducks << Ducky.new(window: window, alliance: :red, slot: 2, speed: 1010, die_size: @size, label: "Center")
when 3, 6
# Blue: Left
# Red: Right
#Blue and Red: Right
@ducks << Ducky.new(window: window, alliance: :blue, slot: 1, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :blue, slot: 2, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :blue, slot: 3, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :red, slot: 3, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :red, slot: 2, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :red, slot: 1, speed: 512, die_size: @size)
@ducks << Ducky.new(window: window, alliance: :blue, slot: 3, speed: 1010, die_size: @size, label: "Right")
@ducks << Ducky.new(window: window, alliance: :red, slot: 3, speed: 1010, die_size: @size, label: "Right")
end
end
@@ -121,14 +111,17 @@ module TAC
SIZE = 0.20
HALF_SIZE = SIZE * 0.5
def initialize(window:, alliance:, slot:, speed:, die_size:)
def initialize(window:, alliance:, slot:, speed:, die_size:, label:)
@window = window
@alliance = alliance
@slot = slot
@speed = speed
@die_size = die_size
@label = label
@image = @window.get_image("#{ROOT_PATH}/media/openclipart_ducky.png")
@image = @window.get_image("#{MEDIA_PATH}/openclipart_ducky.png")
@debug_text = Gosu::Font.new(28)
@label_text = CyberarmEngine::Text.new(@label, static: true, size: 28, alignment: :center)
if @alliance == :blue
@position = CyberarmEngine::Vector.new(@window.width, die_size)
@@ -146,6 +139,10 @@ module TAC
duck_scale = (size * (SIZE + HALF_SIZE)) / @image.width
duck_scale_x = @alliance == :blue ? -duck_scale : duck_scale
@image.draw_rot(slot_position(size), size * SIZE + float_y(size), 1, 0, 0.5, 0.5, duck_scale_x, duck_scale)
@label_text.x = slot_position(size) + (@alliance == :blue ? -170 : 110)
@label_text.y = float_y(size) + 52
@label_text.draw
end
end

View File

@@ -80,7 +80,10 @@ module TAC
@jukebox_volume = 1.0
@jukebox_sound_effects = true
@locked_buttons_randomizer_visible = []
@locked_buttons_clock_active = []
@randomizer_visible = false
@clock_updated_at = -1000
RemoteControl.connection.proxy_object.register(:track_changed, method(:track_changed))
RemoteControl.connection.proxy_object.register(:volume_changed, method(:volume_changed))
@@ -94,25 +97,25 @@ module TAC
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_match_btn = 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
@autonomous_btn = button "Autonomous", width: 1.0 do
start_clock(:autonomous)
end
button "TeleOp with Countdown", width: 1.0 do
@teleop_with_countdown_btn = button "TeleOp with Countdown", width: 1.0 do
start_clock(:full_teleop)
end
button "TeleOp", width: 1.0 do
@teleop_btn = button "TeleOp", width: 1.0 do
start_clock(:teleop_only)
end
button "TeleOp Endgame", width: 1.0, margin_bottom: 50 do
@teleop_endgame_btn = button "TeleOp Endgame", width: 1.0, margin_bottom: 50 do
start_clock(:endgame_only)
end
button "Abort Match", width: 1.0 do
@abort_match_btn = button "Abort Match", width: 1.0 do
RemoteControl.connection.puts(ClockNet::PacketHandler.packet_abort_clock)
end
@@ -146,48 +149,48 @@ module TAC
end
flow width: 1.0 do
button get_image("#{ROOT_PATH}/media/icons/previous.png") do
button get_image("#{MEDIA_PATH}/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|
button get_image("#{MEDIA_PATH}/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")
button.value = get_image("#{MEDIA_PATH}/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")
button.value = get_image("#{MEDIA_PATH}/icons/pause.png")
@jukebox_playing = true
end
end
button get_image("#{ROOT_PATH}/media/icons/stop.png") do
button get_image("#{MEDIA_PATH}/icons/stop.png") do
RemoteControl.connection.puts(ClockNet::PacketHandler.packet_jukebox_stop)
end
button get_image("#{ROOT_PATH}/media/icons/next.png") do
button get_image("#{MEDIA_PATH}/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
button get_image("#{MEDIA_PATH}/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
button get_image("#{MEDIA_PATH}/icons/plus.png") do
@jukebox_volume += 0.1
@jukebox_volume = 1.0 if @jukebox_volume > 1.0
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|
button get_image("#{MEDIA_PATH}/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")
button.value = get_image("#{MEDIA_PATH}/icons/musicOff.png")
@jukebox_sound_effects = false
else
button.value = get_image("#{ROOT_PATH}/media/icons/musicOn.png")
button.value = get_image("#{MEDIA_PATH}/icons/musicOn.png")
@jukebox_sound_effects = true
end
@@ -196,12 +199,12 @@ module TAC
end
button "Open Music Library", width: 1.0 do
path = "#{ROOT_PATH}/media/music"
path = "#{MEDIA_PATH}/music"
if RUBY_PLATFORM.match(/ming|msys|cygwin/)
system("explorer \"#{path.gsub("/", "\\")}\"")
elsif RUBY_PLATFORM.match(/linux/)
system("xdg-open \"#{ROOT_PATH}/media/music\"")
system("xdg-open \"#{MEDIA_PATH}/music\"")
else
# TODO.
end
@@ -219,7 +222,7 @@ module TAC
@randomizer_label = title "Not Visible"
end
button "Randomizer", width: 1.0, **TAC::THEME_DANGER_BUTTON do
@randomizer_btn = button "Randomizer", width: 1.0, **TAC::THEME_DANGER_BUTTON do
@randomizer_visible = !@randomizer_visible
RemoteControl.connection.puts(ClockNet::PacketHandler.packet_randomizer_visible(@randomizer_visible))
@@ -227,6 +230,24 @@ module TAC
end
end
end
@locked_buttons_clock_active.push(
@start_match_btn,
@autonomous_btn,
@teleop_with_countdown_btn,
@teleop_btn,
@teleop_endgame_btn,
@randomizer_btn
)
@locked_buttons_randomizer_visible.push(
@start_match_btn,
@autonomous_btn,
@teleop_with_countdown_btn,
@teleop_btn,
@teleop_endgame_btn,
@abort_match_btn
)
end
def update
@@ -236,6 +257,8 @@ module TAC
o.call
end
manage_button_enablement
return if RemoteControl.connection.connected?
# We've lost connection, unset window's connection object
@@ -258,6 +281,8 @@ module TAC
end
def clock_changed(string)
@clock_updated_at = Gosu.milliseconds if @clock_label.value != string
@clock_label.value = string
end
@@ -265,6 +290,22 @@ module TAC
@randomizer_label.value = "Visible" if boolean
@randomizer_label.value = "Not Visible" unless boolean
end
def manage_button_enablement
if @randomizer_visible
@locked_buttons_randomizer_visible.each do |btn|
btn.enabled = false
end
elsif Gosu.milliseconds - @clock_updated_at <= 1_250
@locked_buttons_clock_active.each do |btn|
btn.enabled = false
end
else
(@locked_buttons_clock_active + @locked_buttons_randomizer_visible).uniq.each do |btn|
btn.enabled = true
end
end
end
end
end
end

View File

@@ -2,7 +2,7 @@ module TAC
class PracticeGameClock
THEME = {
TextBlock: {
font: "Canterell",
font: "NotoSans-Bold",
color: Gosu::Color.new(0xee_ffffff)
},
Button: {
@@ -23,7 +23,7 @@ module TAC
},
ToggleButton: {
width: 18,
checkmark_image: "#{File.expand_path("..", __dir__)}/media/icons/checkmark.png",
checkmark_image: "#{MEDIA_PATH}/icons/checkmark.png",
}
}
end

View File

@@ -9,9 +9,9 @@ module TAC
window.show_cursor = !@remote_control_mode
@escape_counter = 0
@background_image = get_image("#{ROOT_PATH}/media/background.png")
# Preload duck image since Gosu and windows threads don't get along with OpenGL (image is blank if loaded in a threaded context)
get_image("#{ROOT_PATH}/media/openclipart_ducky.png")
@background_image = get_image("#{MEDIA_PATH}/background.png")
# Preload duck image since Gosu and Windows threads don't get along with OpenGL (image is blank if loaded in a threaded context)
get_image("#{MEDIA_PATH}/openclipart_ducky.png")
@menu_background = 0xaa004000
@mouse = Mouse.new(window)
@clock = Clock.new
@@ -25,6 +25,10 @@ module TAC
@last_clock_state = @clock.active?
@locked_buttons_randomizer_visible = []
@locked_buttons_clock_active = []
@randomizer_visible = false
theme(THEME)
@menu_container = flow width: 1.0 do
@@ -32,28 +36,45 @@ module TAC
background @menu_background
title "Match", width: 1.0, text_align: :center
button "Start Match", width: 1.0, margin_bottom: 50 do
@start_match_btn = button "Start Match", width: 1.0, margin_bottom: 50 do |btn|
@locked_buttons_clock_active << btn
@locked_buttons_randomizer_visible << btn
@clock_proxy.start_clock(:full_match)
end
title "Practice", width: 1.0, text_align: :center
button "Autonomous", width: 1.0 do
@autonomous_btn = button "Autonomous", width: 1.0 do |btn|
@locked_buttons_clock_active << btn
@locked_buttons_randomizer_visible << btn
@clock_proxy.start_clock(:autonomous)
end
button "TeleOp with Countdown", width: 1.0 do
@teleop_with_countdown_btn = button "TeleOp with Countdown", width: 1.0 do |btn|
@locked_buttons_clock_active << btn
@locked_buttons_randomizer_visible << btn
@clock_proxy.start_clock(:full_teleop)
end
button "TeleOp", width: 1.0 do
@teleop_btn = button "TeleOp", width: 1.0 do |btn|
@locked_buttons_clock_active << btn
@locked_buttons_randomizer_visible << btn
@clock_proxy.start_clock(:teleop_only)
end
button "TeleOp Endgame", width: 1.0 do
@teleop_endgame_btn = button "TeleOp Endgame", width: 1.0 do |btn|
@locked_buttons_clock_active << btn
@locked_buttons_randomizer_visible << btn
@clock_proxy.start_clock(:endgame_only)
end
button "Abort Match", width: 1.0, margin_top: 50 do
@abort_match_btn = button "Abort Match", width: 1.0, margin_top: 50 do |btn|
@locked_buttons_randomizer_visible << btn
@clock_proxy.abort_clock
end
@@ -84,62 +105,62 @@ module TAC
end
flow(width: 1.0) do
button get_image("#{ROOT_PATH}/media/icons/previous.png") do
button get_image("#{MEDIA_PATH}/icons/previous.png") do
@jukebox.previous_track
end
button get_image("#{ROOT_PATH}/media/icons/pause.png") do |button|
button get_image("#{MEDIA_PATH}/icons/pause.png") do |button|
if @jukebox.song && @jukebox.song.paused?
button.value = get_image("#{ROOT_PATH}/media/icons/right.png")
button.value = get_image("#{MEDIA_PATH}/icons/right.png")
@jukebox.play
elsif !@jukebox.song
button.value = get_image("#{ROOT_PATH}/media/icons/right.png")
button.value = get_image("#{MEDIA_PATH}/icons/right.png")
@jukebox.play
else
button.value = get_image("#{ROOT_PATH}/media/icons/pause.png")
button.value = get_image("#{MEDIA_PATH}/icons/pause.png")
@jukebox.pause
end
end
button get_image("#{ROOT_PATH}/media/icons/stop.png") do
button get_image("#{MEDIA_PATH}/icons/stop.png") do
@jukebox.stop
end
button get_image("#{ROOT_PATH}/media/icons/next.png") do
button get_image("#{MEDIA_PATH}/icons/next.png") do
@jukebox.next_track
end
button get_image("#{ROOT_PATH}/media/icons/minus.png"), margin_left: 20 do
button get_image("#{MEDIA_PATH}/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
button get_image("#{MEDIA_PATH}/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")
system("explorer #{MEDIA_PATH}/music")
elsif RUBY_PLATFORM.match(/linux/)
system("xdg-open #{ROOT_PATH}/media/music")
system("xdg-open #{MEDIA_PATH}/music")
else
# TODO.
end
end
button get_image("#{ROOT_PATH}/media/icons/musicOn.png"), margin_left: 50, tip: "Toggle Sound Effects" do |button|
button get_image("#{MEDIA_PATH}/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")
button.value = get_image("#{MEDIA_PATH}/icons/musicOn.png")
else
button.value = get_image("#{ROOT_PATH}/media/icons/musicOff.png")
button.value = get_image("#{MEDIA_PATH}/icons/musicOff.png")
end
end
end
stack(width: 1.0) do
button "Randomizer", width: 1.0, **TAC::THEME_DANGER_BUTTON do
@randomizer_btn = button "Randomizer", width: 1.0, **TAC::THEME_DANGER_BUTTON do |btn|
unless @clock.active?
push_state(Randomizer)
end
@@ -148,6 +169,24 @@ module TAC
end
end
@locked_buttons_clock_active.push(
@start_match_btn,
@autonomous_btn,
@teleop_with_countdown_btn,
@teleop_btn,
@teleop_endgame_btn,
@randomizer_btn
)
@locked_buttons_randomizer_visible.push(
@start_match_btn,
@autonomous_btn,
@teleop_with_countdown_btn,
@teleop_btn,
@teleop_endgame_btn,
@abort_match_btn
)
@jukebox = Jukebox.new(@clock)
@clock_proxy = ClockProxy.new(@clock, @jukebox)
@@ -191,6 +230,8 @@ module TAC
@menu_container.hide if @menu_container.visible?
window.show_cursor = false
end
manage_button_enablement
end
if @clock.value != @last_clock_display_value
@@ -222,9 +263,9 @@ module TAC
@last_clock_state = @clock.active?
end
def request_repaint
def needs_repaint?
if @particle_emitters && @particle_emitters.map(&:particle_count).sum.positive?
true
@needs_repaint = true
else
super
end
@@ -241,6 +282,22 @@ module TAC
@jukebox.update
end
def manage_button_enablement
if @randomizer_visible
@locked_buttons_randomizer_visible.each do |btn|
btn.enabled = false
end
elsif @clock.active?
@locked_buttons_clock_active.each do |btn|
btn.enabled = false
end
else
(@locked_buttons_clock_active + @locked_buttons_randomizer_visible).uniq.each do |btn|
btn.enabled = true
end
end
end
def button_down(id)
super
@@ -274,6 +331,8 @@ module TAC
end
def randomizer_changed(boolean)
@randomizer_visible = boolean
if boolean
push_state(Randomizer) unless @clock.active?
else

View File

@@ -5,7 +5,7 @@ module TAC
header_bar("Manage Configurations")
menu_bar.clear do
button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_height: 1.0, tip: "Add configuration" do
button get_image("#{TAC::MEDIA_PATH}/icons/plus.png"), image_height: 1.0, tip: "Add configuration" do
push_state(Dialog::NamePromptDialog, title: "Config Name", callback_method: proc { |name|
window.backend.write_new_config(name)
@@ -16,7 +16,7 @@ module TAC
button "Open Folder", tip: "Open folder containing configurations", height: 1.0 do
if RUBY_PLATFORM =~ /mingw/
system("start \"#{TAC::CONFIGS_PATH}\"")
system("explorer \"#{TAC::CONFIGS_PATH.gsub("/", "\\")}\"")
elsif RUBY_PLATFORM =~ /darwin/
system("open \"#{TAC::CONFIGS_PATH}\"")
else
@@ -60,7 +60,7 @@ module TAC
end
end
button get_image("#{TAC::ROOT_PATH}/media/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Rename configuration" do
button get_image("#{TAC::MEDIA_PATH}/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Rename configuration" do
push_state(Dialog::NamePromptDialog, title: "Rename Config", renaming: @config_files_list.find { |c| c.name == name }, list: @config_files_list, accept_label: "Update", callback_method: proc { |old_name, new_name|
if not File.exist?("#{TAC::CONFIGS_PATH}/#{new_name}.json")
FileUtils.mv(
@@ -79,7 +79,7 @@ module TAC
})
end
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: THEME_ICON_SIZE, **THEME_DANGER_BUTTON, tip: "Delete configuration" do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_width: THEME_ICON_SIZE, **THEME_DANGER_BUTTON, tip: "Delete configuration" do
push_state(Dialog::ConfirmDialog, title: "Delete Config?", dangerous: true, callback_method: proc {
File.delete("#{TAC::CONFIGS_PATH}/#{name}.json")

View File

@@ -9,11 +9,12 @@ module TAC
@roster ||= [
"Aubrey",
"Cayden",
"Connor",
"Ben",
"Dan",
"Gabe",
"Spencer",
"Sodi",
"Trent"
"Sodi"
]
@roles ||= [
@@ -24,7 +25,7 @@ module TAC
]
menu_bar.clear do
button get_image("#{TAC::ROOT_PATH}/media/icons/save.png"), image_height: 1.0, tip: "Export rotation as Comma-Seperated Values" do
button get_image("#{TAC::MEDIA_PATH}/icons/save.png"), image_height: 1.0, tip: "Export rotation as Comma-Seperated Values" do
export_rotation
@status_bar.clear do
@@ -44,7 +45,7 @@ module TAC
flow(width: 1.0, height: 32, margin_bottom: 20) do
@role_name = edit_line "", placeholder: "Add role", fill: true, height: 1.0
button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_height: 1.0, tip: "Add role" do
button get_image("#{TAC::MEDIA_PATH}/icons/plus.png"), image_height: 1.0, tip: "Add role" do
if @role_name.value.strip.length.positive?
@roles.push(@role_name.value.strip)
@role_name.value = ""
@@ -63,7 +64,7 @@ module TAC
flow(width: 1.0, height: 32, margin_bottom: 20) do
@roster_name = edit_line "", placeholder: "Add name", height: 1.0, fill: true
button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_height: 1.0, tip: "Add name" do
button get_image("#{TAC::MEDIA_PATH}/icons/plus.png"), image_height: 1.0, tip: "Add name" do
if @roster_name.value.strip.length.positive?
@roster.push(@roster_name.value.strip)
@roster_name.value = ""
@@ -98,7 +99,7 @@ module TAC
background i.even? ? 0xff_007000 : 0xff_006000
tagline name, fill: true
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_height: 1.0, tip: "Remove role", **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_height: 1.0, tip: "Remove role", **THEME_DANGER_BUTTON do
@roles.delete(name)
populate_roles
end
@@ -114,7 +115,7 @@ module TAC
background i.even? ? 0xff_007000 : 0xff_006000
tagline name, fill: true
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_height: 1.0, tip: "Remove name", **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_height: 1.0, tip: "Remove name", **THEME_DANGER_BUTTON do
@roster.delete(name)
populate_roster
end

View File

@@ -46,11 +46,11 @@ module TAC
@groups_menu = flow(width: 1.0, height: 36) do
label "Groups", text_size: THEME_SUBHEADING_TEXT_SIZE, fill: true, text_align: :center
button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_width: THEME_ICON_SIZE, tip: "Add group" do
button get_image("#{TAC::MEDIA_PATH}/icons/plus.png"), image_width: THEME_ICON_SIZE, tip: "Add group" do
push_state(TAC::Dialog::NamePromptDialog, title: "Create Group", list: window.backend.config.groups, callback_method: method(:create_group))
end
button get_image("#{TAC::ROOT_PATH}/media/icons/button2.png"), image_width: THEME_ICON_SIZE, tip: "Clone currently selected group" do
button get_image("#{TAC::MEDIA_PATH}/icons/button2.png"), image_width: THEME_ICON_SIZE, tip: "Clone currently selected group" do
if @active_group
push_state(Dialog::NamePromptDialog, title: "Clone Group", renaming: @active_group, accept_label: "Clone", list: window.backend.config.groups, callback_method: proc { |group, name|
clone = TAC::Config::Group.from_json( JSON.parse( @active_group.to_json, symbolize_names: true ))
@@ -72,7 +72,7 @@ module TAC
end
end
button get_image("#{TAC::ROOT_PATH}/media/icons/save.png"), image_width: THEME_ICON_SIZE, tip: "Save group as preset" do
button get_image("#{TAC::MEDIA_PATH}/icons/save.png"), image_width: THEME_ICON_SIZE, tip: "Save group as preset" do
if @active_group
push_state(Dialog::NamePromptDialog, title: "Save Group Preset", renaming: @active_group, accept_label: "Save", list: window.backend.config.presets.groups, callback_method: proc { |group, name|
clone = TAC::Config::Group.from_json( JSON.parse( @active_group.to_json, symbolize_names: true ))
@@ -89,7 +89,7 @@ module TAC
end
end
button get_image("#{TAC::ROOT_PATH}/media/icons/import.png"), image_width: THEME_ICON_SIZE, tip: "Import group from preset" do
button get_image("#{TAC::MEDIA_PATH}/icons/import.png"), image_width: THEME_ICON_SIZE, tip: "Import group from preset" do
push_state(Dialog::PickPresetDialog, title: "Pick Group Preset", limit: :groups, callback_method: proc { |preset|
push_state(Dialog::NamePromptDialog, title: "Name Group", renaming: preset, accept_label: "Add", list: window.backend.config.groups, callback_method: proc { |group, name|
clone = TAC::Config::Group.from_json( JSON.parse( group.to_json, symbolize_names: true ))
@@ -119,7 +119,7 @@ module TAC
@actions_menu = flow(width: 1.0, height: 36) do
label "Actions", text_size: THEME_SUBHEADING_TEXT_SIZE, fill: true, text_align: :center
button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_width: THEME_ICON_SIZE, tip: "Add action" do
button get_image("#{TAC::MEDIA_PATH}/icons/plus.png"), image_width: THEME_ICON_SIZE, tip: "Add action" do
if @active_group
push_state(TAC::Dialog::ActionDialog, title: "Create Action", list: @active_group.actions, callback_method: method(:create_action))
else
@@ -127,7 +127,7 @@ module TAC
end
end
button get_image("#{TAC::ROOT_PATH}/media/icons/button2.png"), image_width: THEME_ICON_SIZE, tip: "Clone currently selected action" do
button get_image("#{TAC::MEDIA_PATH}/icons/button2.png"), image_width: THEME_ICON_SIZE, tip: "Clone currently selected action" do
if @active_group && @active_action
push_state(Dialog::ActionDialog, title: "Clone Action", action: @active_action, cloning: true, accept_label: "Clone", list: @active_group.actions, callback_method: proc { |action, name, comment|
clone = TAC::Config::Action.from_json( JSON.parse( @active_action.to_json, symbolize_names: true ))
@@ -150,7 +150,7 @@ module TAC
end
end
button get_image("#{TAC::ROOT_PATH}/media/icons/save.png"), image_width: THEME_ICON_SIZE, tip: "Save action as preset" do
button get_image("#{TAC::MEDIA_PATH}/icons/save.png"), image_width: THEME_ICON_SIZE, tip: "Save action as preset" do
if @active_action
push_state(Dialog::NamePromptDialog, title: "Save Action Preset", renaming: @active_action, accept_label: "Save", list: window.backend.config.presets.actions, callback_method: proc { |action, name|
clone = TAC::Config::Action.from_json( JSON.parse( @active_action.to_json, symbolize_names: true ))
@@ -167,7 +167,7 @@ module TAC
end
end
button get_image("#{TAC::ROOT_PATH}/media/icons/import.png"), image_width: THEME_ICON_SIZE, tip: "Import action from preset" do
button get_image("#{TAC::MEDIA_PATH}/icons/import.png"), image_width: THEME_ICON_SIZE, tip: "Import action from preset" do
if @active_group
push_state(Dialog::PickPresetDialog, title: "Pick Action Preset", limit: :actions, callback_method: proc { |preset|
push_state(Dialog::ActionDialog, title: "Name Action", action: preset, accept_label: "Add", list: @active_group.actions, callback_method: proc { |action, name, comment|
@@ -202,7 +202,7 @@ module TAC
stack fill: true, height: 1.0, padding_left: 2, padding_right: 2 do
@variables_menu = flow(width: 1.0, height: 36) do
label "Variables", text_size: THEME_SUBHEADING_TEXT_SIZE, fill: true, text_align: :center
button get_image("#{TAC::ROOT_PATH}/media/icons/plus.png"), image_width: THEME_ICON_SIZE, tip: "Add variable" do
button get_image("#{TAC::MEDIA_PATH}/icons/plus.png"), image_width: THEME_ICON_SIZE, tip: "Add variable" do
if @active_action
push_state(TAC::Dialog::VariableDialog, title: "Create Variable", list: @active_action.variables, callback_method: method(:create_variable))
else
@@ -553,10 +553,10 @@ module TAC
@variables_list.clear
end
button get_image("#{TAC::ROOT_PATH}/media/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit group" do
button get_image("#{TAC::MEDIA_PATH}/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit group" do
push_state(Dialog::NamePromptDialog, title: "Rename Group", renaming: group, list: window.backend.config.groups, callback_method: method(:update_group))
end
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete group", **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete group", **THEME_DANGER_BUTTON do
push_state(Dialog::ConfirmDialog, dangerous: true, title: "Are you sure?", message: "Delete group and all of its actions and variables?", callback_method: proc { delete_group(group) })
end
end
@@ -586,11 +586,11 @@ module TAC
window.backend.config_changed!
end
button get_image("#{TAC::ROOT_PATH}/media/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit action" do
button get_image("#{TAC::MEDIA_PATH}/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit action" do
push_state(Dialog::ActionDialog, title: "Edit Action", action: action, list: @active_group.actions, callback_method: method(:update_action))
end
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete action", **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete action", **THEME_DANGER_BUTTON do
push_state(Dialog::ConfirmDialog, dangerous: true, title: "Are you sure?", message: "Delete action and all of its variables?", callback_method: proc { delete_action(action) })
end
end
@@ -612,7 +612,7 @@ module TAC
push_state(Dialog::VariableDialog, title: "Edit Variable", variable: variable, list: @active_action.variables, callback_method: method(:update_variable))
end
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete variable", **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete variable", **THEME_DANGER_BUTTON do
push_state(Dialog::ConfirmDialog, title: "Are you sure?", message: "Delete variable?", callback_method: proc { delete_variable(variable) })
end
end

View File

@@ -38,7 +38,7 @@ module TAC
refresh_panel
end
list_box items: ["Power Play", "Freight Frenzy", "Ultimate Goal", "Skystone"], width: 200, height: 1.0 do |item|
list_box items: ["CENTERSTAGE", "Power Play", "Freight Frenzy", "Ultimate Goal", "Skystone"], width: 200, height: 1.0 do |item|
season = item.downcase.gsub(" ", "_").to_sym
@field = TAC::Simulator::Field.new(container: @field_container, season: season, simulation: nil)
end
@@ -68,7 +68,7 @@ module TAC
end
end
@field = TAC::Simulator::Field.new(container: @field_container, season: :power_play, simulation: nil)
@field = TAC::Simulator::Field.new(container: @field_container, season: :centerstage, simulation: nil)
@nodes ||= []
@unit = :inches
@total_distance = 0
@@ -80,12 +80,15 @@ module TAC
@segment_thickness = 2
@font = CyberarmEngine::Text.new(font: THEME_BOLD_FONT, size: 18, border: true, static: true)
@last_mouse_position = CyberarmEngine::Vector.new(window.mouse_x, window.mouse_y)
measure_path
refresh_panel
end
def draw
super
@field.draw
display_path
@@ -105,15 +108,19 @@ module TAC
@font.width + 12,
@font.height + 12,
0xaa_000000,
100_000)
@font.draw
100_000
)
@font.draw
end
end
def update
super
current_state.request_repaint if window.mouse_x != @last_mouse_position.x || window.mouse_y != @last_mouse_position.y
@last_mouse_position = CyberarmEngine::Vector.new(window.mouse_x, window.mouse_y)
@field.update
measure_path

View File

@@ -24,7 +24,7 @@ module TAC
# Spawn game clock window
$clock_pid = Process.spawn(
RbConfig.ruby,
"#{ROOT_PATH}/timecrafters_configuration_tool.rb",
"#{MEDIA_PATH}/../timecrafters_configuration_tool.rb",
"--game-clock-remote-display"
)

View File

@@ -118,7 +118,7 @@ module TAC
page(TAC::Pages::Editor, { group: group, group_is_preset: true })
end
button get_image("#{TAC::ROOT_PATH}/media/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit group" do
button get_image("#{TAC::MEDIA_PATH}/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit group" do
push_state(
Dialog::NamePromptDialog,
title: "Rename Group Preset",
@@ -128,7 +128,7 @@ module TAC
)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete group", **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete group", **THEME_DANGER_BUTTON do
push_state(
Dialog::ConfirmDialog,
title: "Are you sure?",
@@ -151,7 +151,7 @@ module TAC
page(TAC::Pages::Editor, { action: action, action_is_preset: true })
end
button get_image("#{TAC::ROOT_PATH}/media/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit action" do
button get_image("#{TAC::MEDIA_PATH}/icons/gear.png"), image_width: THEME_ICON_SIZE, tip: "Edit action" do
push_state(
Dialog::ActionDialog,
title: "Edit Action Preset",
@@ -161,7 +161,7 @@ module TAC
)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete action", **THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/trashcan.png"), image_width: THEME_ICON_SIZE, tip: "Delete action", **THEME_DANGER_BUTTON do
push_state(
Dialog::ConfirmDialog,
title: "Are you sure?",

View File

@@ -6,7 +6,7 @@ module TAC
menu_bar.clear do
search = edit_line "", fill: true, height: 1.0
button get_image("#{TAC::ROOT_PATH}/media/icons/zoom.png"), image_height: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/zoom.png"), image_height: 1.0 do
unless search.value.strip.empty?
search_results = search_config(search.value.strip)

View File

@@ -6,7 +6,7 @@ module TAC
header_bar("Simulator")
menu_bar.clear do
button get_image("#{TAC::ROOT_PATH}/media/icons/right.png"), tip: "Run Simulation", image_height: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/right.png"), tip: "Run Simulation", image_height: 1.0 do
save_source
begin
@@ -19,11 +19,11 @@ module TAC
end
end
button get_image("#{TAC::ROOT_PATH}/media/icons/stop.png"), tip: "Stop Simulation", image_height: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/stop.png"), tip: "Stop Simulation", image_height: 1.0 do
@simulation.robots.each { |robot| robot.queue.clear } if @simulation
end
button get_image("#{TAC::ROOT_PATH}/media/icons/save.png"), tip: "Save", image_height: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/save.png"), tip: "Save", image_height: 1.0 do
save_source
end
end

View File

@@ -30,7 +30,7 @@ module TAC
end
status_bar.clear do
@tacnet_icon = image "#{TAC::ROOT_PATH}/media/icons/signal3.png", height: 26
@tacnet_icon = image "#{TAC::MEDIA_PATH}/icons/signal3.png", height: 26
@status_label = label "TACNET: Not Connected", text_size: 26
end

View File

@@ -336,6 +336,111 @@ module TAC
end
end
###########################
### --- CENTERSTAGE --- ###
###########################
def draw_field_centerstage
# Corner TAPE
2.times do |i|
Gosu.rotate((i + 2) * 90.0, 72, 72) do
Gosu.draw_quad(
24 - 2, 0, i.odd? ? @red : @blue,
24, 0, i.odd? ? @red : @blue,
0, 24 - 2, i.odd? ? @red : @blue,
0, 24, i.odd? ? @red : @blue,
@z
)
end
end
# Backstage TAPE
# BLUE
Gosu.draw_rect(0, 22, 58.5, 2, @blue, @z)
Gosu.draw_quad(
72 - 2, 0, @blue,
72, 0, @blue,
58.5 - 2, 24, @blue,
58.5, 24, @blue,
@z
)
# RED
Gosu.draw_rect(@field_size, 22, -58.5, 2, @red, @z)
Gosu.draw_quad(
@field_size - (72 - 2), 0, @red,
@field_size - 72, 0, @red,
@field_size - (58.5 - 2), 24, @red,
@field_size - 58.5, 24, @red,
@z
)
# Backstage BACKDROP
Gosu.draw_rect(24, 0, 24, 11.25, 0xff_252525, @z)
Gosu.draw_rect(@field_size - 48, 0, 24, 11.25, 0xff_252525, @z)
# Pixel TAPE
7.times do |i|
next if i == 3 # skip 4th iteration; empty slot
# TAPE
Gosu.draw_rect(24 + 11.5 + (12 * i), @field_size - 6, 1, 6, 0xff_dddddd, @z)
# Pixel
Gosu.rotate(30, 24 + 12 + (12 * i), @field_size - 1.75) do
Gosu.draw_circle(24 + 12 + (12 * i), @field_size - 1.75, 2.25, 6, 0xff_ffffff, @z)
end
end
# Spike marks TAPE
# BLUE
2.times do |r|
2.times do |i|
Gosu.rotate(r * 180, @field_size / 2, @field_size / 2 + 12) do
c = r.even? ? @blue : @red
Gosu.translate(0, i * 48) do
Gosu.draw_rect(35.5, @field_size / 2 - 1.5, 12, 1, c, @z)
Gosu.draw_rect(47.5 - 1, @field_size / 2 - 18, 1, 12, c, @z)
Gosu.draw_rect(35.5, @field_size / 2 - 23.5, 12, 1, c, @z)
# --- mark
Gosu.draw_rect(35.5 + 6, @field_size / 2 - 1.5, 0.125, 1, 0xff_000000, @z)
Gosu.draw_rect(47.5 - 1, @field_size / 2 - 18 + 6, 1, 0.125, 0xff_000000, @z)
Gosu.draw_rect(35.5 + 6, @field_size / 2 - 23.5, 0.125, 1, 0xff_000000, @z)
end
end
end
end
# Trusses
Gosu.draw_rect(0, @field_size / 2 - 2, 2, 28, 0xff_656565, @z)
Gosu.draw_rect(23, @field_size / 2 - 2, 2, 28, 0xff_656565, @z)
Gosu.draw_rect(47, @field_size / 2 - 2, 2, 28, 0xff_656565, @z)
Gosu.draw_rect(@field_size / 2 + 24 + -1, @field_size / 2 - 2, 2, 28, 0xff_656565, @z)
Gosu.draw_rect(@field_size / 2 + 24 + 23, @field_size / 2 - 2, 2, 28, 0xff_656565, @z)
Gosu.draw_rect(@field_size / 2 + 24 + 46, @field_size / 2 - 2, 2, 28, 0xff_656565, @z)
# Crossbeams
# BLUE
Gosu.draw_rect(0, @field_size / 2 + 12 + 2, 26, 2, @blue, @z)
Gosu.draw_rect(24, @field_size / 2 + 12 - 1, 24, 2, @blue, @z)
# YELLOW
# --- Blue
Gosu.draw_rect(0, @field_size / 2 + 2, 25, 1, @soft_orange, @z)
Gosu.draw_rect(23, @field_size / 2 + 21, 26, 1, @soft_orange, @z)
# --- Middle
Gosu.draw_rect(24 + 24, @field_size / 2 + 2, 48, 1, @soft_orange, @z)
Gosu.draw_rect(24 + 24, @field_size / 2 + 12 - 0.5, 48, 1, @soft_orange, @z)
Gosu.draw_rect(24 + 24, @field_size / 2 + 12 - 0.5, 48, 1, @soft_orange, @z)
# --- --- parallel beams
Gosu.draw_rect(24 + 28, @field_size / 2 + 2, 1, 10, @soft_orange, @z)
Gosu.draw_rect(@field_size / 2, @field_size / 2 + 2, 1, 10, @soft_orange, @z)
Gosu.draw_rect(24 + 72 - 4, @field_size / 2 + 2, 1, 10, @soft_orange, @z)
# --- Red
Gosu.draw_rect(47 + 72, @field_size / 2 + 2, 25, 1, @soft_orange, @z)
Gosu.draw_rect(23 + 72, @field_size / 2 + 21, 26, 1, @soft_orange, @z)
# RED
Gosu.draw_rect(24 + 72, @field_size / 2 + 12 - 1, 24, 2, @red, @z)
Gosu.draw_rect(46 + 72, @field_size / 2 + 12 + 2, 26, 2, @red, @z)
end
def draw_tile_box(color)
Gosu.draw_rect(0, 0, 24, 2, color, @z)
Gosu.draw_rect(22, 2, 2, 22, color, @z)

View File

@@ -8,7 +8,7 @@ module TAC
@field_container = field_container
@robots = []
@field = Field.new(simulation: self, season: :power_play, container: @field_container)
@field = Field.new(simulation: self, season: :centerstage, container: @field_container)
@show_paths = false
@last_milliseconds = Gosu.milliseconds

View File

@@ -9,7 +9,7 @@ module TAC
end
@title_font = CyberarmEngine::Text.new(TAC::NAME, z: 100, size: 72, border: true, border_size: 2, border_color: 0xff_000000, font: THEME[:TextBlock][:font], static: true)
@logo = Gosu::Image.new("#{TAC::ROOT_PATH}/media/logo.png")
@logo = Gosu::Image.new("#{TAC::MEDIA_PATH}/logo.png")
@title_animator = CyberarmEngine::Animator.new(start_time: Gosu.milliseconds + 0, duration: 750, from: 0.0, to: 1.0, tween: :swing_from_to)
@logo_animator = CyberarmEngine::Animator.new(start_time: Gosu.milliseconds + 750, duration: 1_000, from: 0.0, to: 1.0, tween: :swing_to)
@@ -46,6 +46,7 @@ module TAC
def button_down(id)
super
pop_state
push_state(@next_state)
end
end

View File

@@ -39,15 +39,15 @@ class Editor < CyberarmEngine::GuiState
@header_bar_label = label TAC::NAME, fill: true, text_align: :center, text_size: 32, font: TAC::THEME_BOLD_FONT, margin_left: BORDERLESS ? 36 * 3 : 0
@window_controls = flow(width: 36 * 3, height: 1.0) do
button get_image("#{TAC::ROOT_PATH}/media/icons/minus.png"), tip: "Minimize", image_height: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/minus.png"), tip: "Minimize", image_height: 1.0 do
window.minimize if window.respond_to?(:minimize)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/larger.png"), tip: "Maximize", image_height: 1.0 do |btn|
button get_image("#{TAC::MEDIA_PATH}/icons/larger.png"), tip: "Maximize", image_height: 1.0 do |btn|
window.maximize if window.respond_to?(:maximize)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/cross.png"), tip: "Exit", image_height: 1.0, **TAC::THEME_DANGER_BUTTON do
button get_image("#{TAC::MEDIA_PATH}/icons/cross.png"), tip: "Exit", image_height: 1.0, **TAC::THEME_DANGER_BUTTON do
window.close
end
end
@@ -57,27 +57,27 @@ class Editor < CyberarmEngine::GuiState
@navigation = stack(width: 64, height: 1.0, scroll: true) do
background 0xff_333333
button get_image("#{TAC::ROOT_PATH}/media/icons/home.png"), margin: 4, tip: "Home", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/home.png"), margin: 4, tip: "Home", image_width: 1.0 do
page(TAC::Pages::Home)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/menuList.png"), margin: 4, tip: "Editor", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/menuList.png"), margin: 4, tip: "Editor", image_width: 1.0 do
page(TAC::Pages::Editor)
end
@tacnet_button = button get_image("#{TAC::ROOT_PATH}/media/icons/signal3.png"), margin: 4, tip: "TACNET", image_width: 1.0 do
@tacnet_button = button get_image("#{TAC::MEDIA_PATH}/icons/signal3.png"), margin: 4, tip: "TACNET", image_width: 1.0 do
page(TAC::Pages::TACNET)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/gear.png"), margin: 4, tip: "Configurations", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/gear.png"), margin: 4, tip: "Configurations", image_width: 1.0 do
page(TAC::Pages::Configurations)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/menuGrid.png"), margin: 4, tip: "Presets", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/menuGrid.png"), margin: 4, tip: "Presets", image_width: 1.0 do
page(TAC::Pages::Presets)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/zoom.png"), margin: 4, tip: "Search", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/zoom.png"), margin: 4, tip: "Search", image_width: 1.0 do
page(TAC::Pages::Search)
end
@@ -86,23 +86,23 @@ class Editor < CyberarmEngine::GuiState
para "Tools", width: 1.0, text_align: :center
end
button get_image("#{TAC::ROOT_PATH}/media/icons/right.png"), margin: 4, tip: "Simulator", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/right.png"), margin: 4, tip: "Simulator", image_width: 1.0 do
page(TAC::Pages::Simulator)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/joystickLeft.png"), margin: 4, tip: "Field Planner", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/joystickLeft.png"), margin: 4, tip: "Field Planner", image_width: 1.0 do
page(TAC::Pages::FieldPlanner)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/massiveMultiplayer.png"), margin: 4, tip: "Drive Team Rotation Generator", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/massiveMultiplayer.png"), margin: 4, tip: "Drive Team Rotation Generator", image_width: 1.0 do
page(TAC::Pages::DriveTeamRotationGenerator)
end
button get_image("#{TAC::ROOT_PATH}/media/icons/custom_stopWatch.png"), margin: 4, tip: "Game Clock", image_width: 1.0 do
button get_image("#{TAC::MEDIA_PATH}/icons/custom_stopWatch.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
button get_image("#{TAC::MEDIA_PATH}/icons/power.png"), margin: 4, tip: "Exit", image_width: 1.0, **TAC::THEME_DANGER_BUTTON do
window.close
end
end

View File

@@ -1,7 +1,13 @@
module TAC
ROOT_PATH = File.expand_path("../..", __FILE__)
if ARGV.join.include?("--dev")
ROOT_PATH = File.expand_path("../..", __FILE__)
else
ROOT_PATH = "#{Dir.home}/TimeCrafters_Configuration_Tool"
end
CONFIGS_PATH = "#{ROOT_PATH}/data/configs"
SETTINGS_PATH = "#{ROOT_PATH}/data/settings.json"
MEDIA_PATH = "#{File.expand_path("../..", __FILE__)}/media"
CONFIG_SPEC_VERSION = 2
end

View File

@@ -1,6 +1,6 @@
module TAC
THEME_FONT = "#{TAC::ROOT_PATH}/media/fonts/NotoSans-Bold.ttf"
THEME_BOLD_FONT = "#{TAC::ROOT_PATH}/media/fonts/NotoSans-Black.ttf"
THEME_FONT = "#{TAC::MEDIA_PATH}/fonts/NotoSans-Bold.ttf"
THEME_BOLD_FONT = "#{TAC::MEDIA_PATH}/fonts/NotoSans-Black.ttf"
THEME = {
TextBlock: {
text_static: true,
@@ -27,7 +27,7 @@ module TAC
},
ToggleButton: {
width: 18,
checkmark_image: "#{TAC::ROOT_PATH}/media/icons/checkmark.png",
checkmark_image: "#{TAC::MEDIA_PATH}/icons/checkmark.png",
},
}

View File

@@ -1,5 +1,5 @@
module TAC
NAME = "TimeCrafters Configuration Tool"
VERSION = "0.7.1"
VERSION = "0.7.2"
RELEASE_NAME = "Beta"
end

View File

@@ -7,7 +7,7 @@ module TAC
self.caption = "#{TAC::NAME} v#{TAC::VERSION} (#{TAC::RELEASE_NAME})"
@backend = Backend.new
@notification_manager = GosuNotifications::NotificationManager.new(window: self, edge: :bottom)
@notification_manager = CyberarmEngine::NotificationManager.new(window: self, edge: :bottom)
if ARGV.join.include?("--game-clock-remote-display")
push_state(PracticeGameClock::View, remote_control_mode: true)
@@ -26,9 +26,9 @@ module TAC
end
def update
super
@notification_manager.update
super
end
def needs_redraw?
@@ -37,7 +37,7 @@ module TAC
def toast(title, message = nil)
@notification_manager.create_notification(
priority: GosuNotifications::Notification::PRIORITY_HIGH,
priority: CyberarmEngine::Notification::PRIORITY_HIGH,
title: title,
tagline: message ? message : "",

View File

@@ -4,7 +4,6 @@ begin
rescue LoadError
require "cyberarm_engine"
end
require "gosu_notifications"
require "socket"
require "securerandom"
require "json"