diff --git a/i-mic-fps.rb b/i-mic-fps.rb index 4d0c904..282781a 100644 --- a/i-mic-fps.rb +++ b/i-mic-fps.rb @@ -89,6 +89,9 @@ require_relative "lib/map_loader" require_relative "lib/manifest" require_relative "lib/map" +require_relative "lib/crosshair" +require_relative "lib/demo" + require_relative "lib/window" if ARGV.join.include?("--profile") diff --git a/lib/crosshair.rb b/lib/crosshair.rb new file mode 100644 index 0000000..7f0ffd5 --- /dev/null +++ b/lib/crosshair.rb @@ -0,0 +1,16 @@ +class IMICFPS + class Crosshair + include CommonMethods + + def initialize(color: Gosu::Color.rgb(255,127,0), size: 10, thickness: 3) + @color = color + @size = size + @thickness = thickness + end + + def draw + draw_rect(window.width/2-@size, (window.height/2-@size)-@thickness/2, @size*2, @thickness, @color, 0, :default) + draw_rect((window.width/2)-@thickness/2, window.height/2-(@size*2), @thickness, @size*2, @color, 0, :default) + end + end +end \ No newline at end of file diff --git a/lib/demo.rb b/lib/demo.rb new file mode 100644 index 0000000..a5761e9 --- /dev/null +++ b/lib/demo.rb @@ -0,0 +1,108 @@ +class IMICFPS + class Demo + def initialize(camera:, player:, demo:, mode:) + @camera = camera + @player = player + @demo = demo + @mode = mode + + @index= 0 + @tick = 0 + @changed = false + + if ARGV.join.include?("--playdemo") + @data = File.exist?(demo) ? File.read("./demo.dat").lines : "" + + elsif ARGV.join.include?("--savedemo") + @file = File.open(demo, "w") + + @last_pitch = @camera.orientation.z + @last_yaw = @camera.orientation.y + + at_exit { @file.close } + end + end + + def button_down(id) + if recording? + unless @last_written_index == @index + @last_written_index = @index + @file.puts("tick #{@index}") + end + + @file.puts("down #{InputMapper.action(id)}") + @changed = true + end + end + + def button_up(id) + if recording? + unless @last_written_index == @index + @last_written_index = @index + @file.puts("tick #{@index}") + end + + @file.puts("up #{InputMapper.action(id)}") + @changed = true + end + end + + def update + play if playing? + record if recording? + + @tick += 1 + end + + def playing?; @mode == :play; end + def recording?; !playing?; end + + def play + if @data[@index]&.start_with?("tick") + if @tick == @data[@index].split(" ").last.to_i + @index+=1 + + until(@data[@index]&.start_with?("tick")) + break unless @data[@index] + + data = @data[@index].split(" ") + if data.first == "up" + input = InputMapper.get(data.last.to_sym) + key = input.is_a?(Array) ? input.first : input + $window.current_state.button_up(key) if key + + elsif data.first == "down" + input = InputMapper.get(data.last.to_sym) + key = input.is_a?(Array) ? input.first : input + $window.current_state.button_down(key) if key + + elsif data.first == "mouse" + @camera.orientation.z = data[1].to_f + @player.orientation.y = (data[2].to_f * -1) - 180 + else + # hmm + end + + @index += 1 + end + end + end + end + + def record + if @camera.orientation.z != @last_pitch || @camera.orientation.y != @last_yaw + unless @last_written_index == @index + @last_written_index = @index + @file.puts("tick #{@index}") + end + + @file.puts("mouse #{@camera.orientation.z} #{@camera.orientation.y}") + @last_pitch = @camera.orientation.z + @last_yaw = @camera.orientation.y + end + + @changed = false + @index += 1 + end + end +end \ No newline at end of file diff --git a/lib/states/game_states/game.rb b/lib/states/game_states/game.rb index 661eaef..8563c57 100644 --- a/lib/states/game_states/game.rb +++ b/lib/states/game_states/game.rb @@ -10,35 +10,22 @@ class IMICFPS @camera = Camera.new(position: @player.position.clone) @camera.attach_to(@player) - @crosshair_size = 10 - @crosshair_thickness = 3 - @crosshair_color = Gosu::Color.rgb(255,127,0) + @crosshair = Crosshair.new @text = Text.new("Pending...", x: 10, y: 10, z: 1, size: 18, font: "DejaVu Sans", shadow_color: Gosu::Color::BLACK) if ARGV.join.include?("--playdemo") - @demo_data = File.exist?("./demo.dat") ? File.read("./demo.dat").lines : "" - @demo_index= 0 - @demo_tick = 0 + @demo = Demo.new(camera: @camera, player: @player, demo: "./demo.dat", mode: :play) if File.exist?("./demo.dat") elsif ARGV.join.include?("--savedemo") - @demo_file = File.open("./demo.dat", "w") - @demo_index= 0 - @demo_changed = false - - @demo_last_pitch = @camera.orientation.z - @demo_last_yaw = @camera.orientation.y - - at_exit { @demo_file.close } + @demo = Demo.new(camera: @camera, player: @player, demo: "./demo.dat", mode: :record) end end def draw @map.render(@camera) - # Draw crosshair - draw_rect(window.width/2-@crosshair_size, (window.height/2-@crosshair_size)-@crosshair_thickness/2, @crosshair_size*2, @crosshair_thickness, @crosshair_color, 0, :default) - draw_rect((window.width/2)-@crosshair_thickness/2, window.height/2-(@crosshair_size*2), @crosshair_thickness, @crosshair_size*2, @crosshair_color, 0, :default) + @crosshair.draw @text.draw end @@ -61,55 +48,7 @@ class IMICFPS @text.text = "" end - if ARGV.join.include?("--playdemo") - if @demo_data[@demo_index]&.start_with?("tick") - if @demo_tick == @demo_data[@demo_index].split(" ").last.to_i - @demo_index+=1 - - until(@demo_data[@demo_index]&.start_with?("tick")) - break unless @demo_data[@demo_index] - - data = @demo_data[@demo_index].split(" ") - if data.first == "up" - input = InputMapper.get(data.last.to_sym) - key = input.is_a?(Array) ? input.first : input - self.button_up(key) - - elsif data.first == "down" - input = InputMapper.get(data.last.to_sym) - key = input.is_a?(Array) ? input.first : input - self.button_down(key) - - elsif data.first == "mouse" - @camera.orientation.z = data[1].to_f - @player.orientation.y = (data[2].to_f * -1) - 180 - else - # hmm - end - - @demo_index += 1 - end - end - end - end - - if ARGV.join.include?("--savedemo") - if @camera.orientation.z != @demo_last_pitch || @camera.orientation.y != @demo_last_yaw - unless @demo_last_written_index == @demo_index - @demo_last_written_index = @demo_index - @demo_file.puts("tick #{@demo_index}") - end - - @demo_file.puts("mouse #{@camera.orientation.z} #{@camera.orientation.y}") - @demo_last_pitch = @camera.orientation.z - @demo_last_yaw = @camera.orientation.y - end - - @demo_changed = false - @demo_index += 1 - end - - @demo_tick += 1 if @demo_tick + @demo.update if @demo window.close if window.button_down?(Gosu::KbEscape) window.number_of_vertices = 0 @@ -146,14 +85,8 @@ eos end def button_down(id) - if ARGV.join.include?("--savedemo") - unless @demo_last_written_index == @demo_index - @demo_last_written_index = @demo_index - @demo_file.puts("tick #{@demo_index}") - end - @demo_file.puts("down #{InputMapper.action(id)}") - @demo_changed = true - end + @demo.button_down(id) if @demo + InputMapper.keydown(id) Publisher.instance.publish(:button_down, nil, id) @@ -163,14 +96,8 @@ eos end def button_up(id) - if ARGV.join.include?("--savedemo") - unless @demo_last_written_index == @demo_index - @demo_last_written_index = @demo_index - @demo_file.puts("tick #{@demo_index}") - end - @demo_file.puts("up #{InputMapper.action(id)}") - @demo_changed = true - end + @demo.button_up(id) if @demo + InputMapper.keyup(id) Publisher.instance.publish(:button_up, nil, id)