Files
i-mic-rts/lib/connection.rb

68 lines
2.0 KiB
Ruby

class IMICRTS
# {IMICRTS::Connection} is the abstract middleman that Director sends/receives Orders from.
# not to be confused with {IMICRTS::Networking::Connection}
class Connection
# Connection modes:
# :virtual => emulates networking without sockets (used for solo play)
# :host => starts server
# :client => connects to server/host
def initialize(director:, mode:, hostname: "localhost", port: 56789)
@director = director
@mode = mode
@hostname = hostname
@port = port
@pending_orders = []
case @mode
when :virtual
when :host
@server = Networking::Server.new(director: @director, hostname: @hostname, port: @port)
@connection = Networking::Connection.new(director: @director, hostname: @hostname, port: @port)
when :client
@connection = Networking::Connection.new(director: @director, hostname: @hostname, port: @port)
else
raise RuntimeError, "Unable to process Connection of type: #{@mode.inspect}"
end
end
def add_order(order)
@pending_orders.push(order)
end
def update
# data = @pending_orders.sort_by { |order| order.tick_id }.map do |order|
# # Order serialized size in bytes + serialized order data
# pp order.serialized_order
# [order.serialized_order.length].pack("n") + order.serialized_order
# end.join
if @mode == :virtual
else
@pending_orders.each do |order|
# TODO: make this include order_id and tick_id
@server.broadcast(order.serialized_order) if @server
@connection.write(order.serialized_order) unless @server
@pending_orders.delete(order)
end
end
case @mode
when :virtual
when :host
@server.update
@connection.update
when :client
@connection.update
end
end
def finalize
@server.stop if @server
@connection.close if @connection
end
end
end