class ProconBypassMan::Procon

Attributes

user_operation[RW]

Public Class Methods

new(binary) click to toggle source
# File lib/procon_bypass_man/procon.rb, line 23
def initialize(binary)
  self.user_operation = ProconBypassMan::Procon::UserOperation.new(binary.dup)
end
reset!() click to toggle source
# File lib/procon_bypass_man/procon.rb, line 13
def self.reset!
  @@status = {
    buttons: {},
    current_layer_key: :up,
    ongoing_macro: MacroRegistry.load(:null),
    ongoing_mode: ModeRegistry.load(:manual),
  }
end

Public Instance Methods

apply!() click to toggle source
# File lib/procon_bypass_man/procon.rb, line 36
def apply!
  if user_operation.change_layer?
    @@status[:current_layer_key] = user_operation.next_layer_key if user_operation.pressed_next_layer?
    user_operation.set_no_action!
    return
  end

  if ongoing_macro.finished?
    current_layer.macros.each do |macro_name, options|
      if options[:if_pressed].all? { |b| user_operation.pressed_button?(b) }
        @@status[:ongoing_macro] = MacroRegistry.load(macro_name)
      end
    end
  end

  case current_layer.mode
  when :manual
    @@status[:ongoing_mode] = ModeRegistry.load(:manual)
    current_layer.flip_buttons.each do |button, options|
      if !options[:if_pressed]
        FlipCache.fetch(key: button, expires_in: options[:flip_interval]) do
          status[button] = !status[button]
        end
        next
      end

      if options[:if_pressed] && options[:if_pressed].all? { |b| user_operation.pressed_button?(b) }
        FlipCache.fetch(key: button, expires_in: options[:flip_interval]) do
          status[button] = !status[button]
        end
      else
        FlipCache.fetch(key: button, expires_in: options[:flip_interval]) do
          status[button] = false
        end
      end
    end
  else
    unless ongoing_mode.name == current_layer.mode
      @@status[:ongoing_mode] = ProconBypassMan::Procon::ModeRegistry.load(current_layer.mode)
    end
    if(binary = ongoing_mode.next_binary)
      self.user_operation.merge(target_binary: binary)
    end
    return
  end

  status
end
current_layer() click to toggle source
# File lib/procon_bypass_man/procon.rb, line 32
def current_layer
  ProconBypassMan::Configuration.instance.layers[current_layer_key]
end
current_layer_key() click to toggle source
# File lib/procon_bypass_man/procon.rb, line 30
def current_layer_key; @@status[:current_layer_key]; end
ongoing_macro() click to toggle source
# File lib/procon_bypass_man/procon.rb, line 28
def ongoing_macro; @@status[:ongoing_macro]; end
ongoing_mode() click to toggle source
# File lib/procon_bypass_man/procon.rb, line 29
def ongoing_mode; @@status[:ongoing_mode]; end
status() click to toggle source
# File lib/procon_bypass_man/procon.rb, line 27
def status; @@status[:buttons]; end
to_binary() click to toggle source

@return [String<binary>]

# File lib/procon_bypass_man/procon.rb, line 86
def to_binary
  if ongoing_mode.name != :manual
    return user_operation.binary
  end

  if ongoing_macro.ongoing?
    step = ongoing_macro.next_step or return(user_operation.binary)
    user_operation.press_button_only(step)
    return user_operation.binary
  end

  current_layer.flip_buttons.each do |button, options|
    # 何もしないで常に連打
    if !options[:if_pressed] && status[button]
      user_operation.press_button(button) unless user_operation.pressed_button?(button)
      next
    end

    # 押している時だけ連打
    if options[:if_pressed] && options[:if_pressed].all? { |b| user_operation.pressed_button?(b) }
      if !status[button]
        user_operation.unpress_button(button)
      end

      options[:force_neutral]&.each do |force_neutral_button|
        user_operation.pressed_button?(force_neutral_button) && user_operation.unpress_button(force_neutral_button)
      end
    end
  end

  current_layer.remaps.each do |from_button, to_buttons|
    if user_operation.pressed_button?(from_button)
      user_operation.unpress_button(from_button)
      # TODO 2重でpressしないようにしたい
      to_buttons[:to].each do |to_button|
        user_operation.press_button(to_button) unless user_operation.pressed_button?(to_button)
      end
    end
  end

  user_operation.binary
end

Private Instance Methods

method_missing(name) click to toggle source
Calls superclass method
# File lib/procon_bypass_man/procon.rb, line 131
def method_missing(name)
  if name.to_s =~ /\Apressed_[a-z]+\?\z/
    user_operation.public_send(name)
  else
    super
  end
end