PROTO_TEXT = "put me in the big portal"
CEDRIC_TEXT = "put me in the big portal"
RUE_TEXT = "put me in the big portal"

module Script
  def self.px
    logpos($game_player.x, $game_player.real_x, $game_player.direction == 6)
  end

  def self.py
    logpos($game_player.y, $game_player.real_y, $game_player.direction == 2)
  end

  def self.is_name_swear
    test_string = $game_oneshot.player_name.downcase
    if ["fuck", "shit", "ass", "cock", "damn", "penis", "tiddy", "titty", "cunt", "fag", "whore"].any? { |swear| test_string.include? swear }
      return true
    end
    return false
  end

  def self.is_name_niko
    test_string = $game_oneshot.player_name.downcase
    if test_string == "niko"
      return true
    end
    return false
  end

  def self.is_name_like_niko
    test_string = $game_oneshot.player_name.downcase
    if ["nico", "nikko", "nicco", "nikoh", "nicoh"].any? { |name| test_string == name }
      return true
    end
    return false
  end

  def self.is_name_like_mom_dad
    test_string = $game_oneshot.player_name.downcase
    if ["mom", "dad", "mommy", "daddy", "mama", "papa"].any? { |name| test_string == name }
      return true
    end
    return false
  end

  def self.is_name_gross
    test_string = $game_oneshot.player_name.downcase
    if ["poo", "pee", "fart", "stinky", "piss", "shit", "slimy"].any? { |name| test_string == name }
      return true
    end
    return false
  end

  # EQUINOX MODIFICATION
  # If I break this thing again...

  def self.is_name_meta
    test_string = $game_oneshot.player_name.downcase
    if ["entity", "world machine"].any? { |meta| test_string.include? meta }
      return true
    end
    return false
  end

  # Then fml...

  def self.start_bruteforce
    $game_oneshot.bruteforce_start = Graphics.frame_count
  end

  def self.check_bruteforce
    if ($game_oneshot.bruteforce_start == nil)
      $game_oneshot.bruteforce_start = Graphics.frame_count
    end
    time_passed = Graphics.frame_count - $game_oneshot.bruteforce_start
    if (time_passed > (2 * 60 * 63014))
      return true
    else
      return false
    end
  end

  def self.skip_bruteforce
    $game_oneshot.bruteforce_start -= 62800 * 2 * 60
  end

  def self.lose_all_items
    for i in 1..99
      $game_party.lose_item(i, 99)
    end
  end

  def self.bruteforce_vars
    if ($game_oneshot.bruteforce_start == nil)
      $game_oneshot.bruteforce_start = Graphics.frame_count
    end
    time_passed = Graphics.frame_count - $game_oneshot.bruteforce_start
    counts_tried = time_passed / (2 * 60)
    digit1 = counts_tried % 10
    digit2 = ((counts_tried % 100) - digit1) / 10
    digit3 = ((counts_tried % 1000) - (digit2 * 10) - digit1) / 100
    digit4 = ((counts_tried % 10000) - (digit3 * 100) - (digit2 * 10) - digit1) / 1000
    digit5 = ((counts_tried % 100000) - (digit4 * 1000) - (digit3 * 100) - (digit2 * 10) - digit1) / 10000
    $game_variables[26] = digit5
    $game_variables[27] = digit4
    $game_variables[28] = digit3
    $game_variables[29] = digit2
    $game_variables[30] = digit1
  end

  def self.fix_footsplashes(xDelta, yDelta)
    $scene.fix_footsplashes(xDelta, yDelta)
  end

  def self.move_player_relative(x, y)
    $game_player.x += x
    $game_player.y += y
    $game_player.real_x += x * 4 * 32
    $game_player.real_y += y * 4 * 32
    $game_map.display_x += x * 4 * 32
    $game_map.display_y += y * 4 * 32
  end

  def self.move_player(x, y)
    xDelta = x - $game_player.x
    yDelta = y - $game_player.y
    Script.move_player_relative(xDelta, yDelta)
  end

  def self.eve_x(name)
    for event in $game_map.events.values
      if event.name == name
        return logpos(event.x, event.real_x, event.direction == 6)
      end
    end
    return 0
  end

  def self.eve_y(name)
    for event in $game_map.events.values
      if event.name == name
        return logpos(event.y, event.real_y, event.direction == 2)
      end
    end
    return 0
  end

  def self.countdown_over
    equinox = Time.new(2018, 3, 21)
    diff = equinox - Time.now
    if (diff <= 0)
      return true
    end
    return false
  end

  def self.countdown_extend_over
    equinox = Time.new(2018, 3, 21)
    diff = equinox - Time.now
    if (diff <= 0)
      return true
    end
    return false
  end

  def self.cdown_update(equinox)
    diff = equinox - Time.now
    if (diff < 0)
      diff = 0
    end
    seconds = diff % 60
    minutes = ((diff - seconds) / 60) % 60
    hours = ((((diff - seconds) / 60) - minutes) / 60) % 24
    days = (((((diff - seconds) / 60) - minutes) / 60) - hours) / 24
    secs1 = seconds % 10
    secs2 = (seconds - secs1) / 10
    mins1 = minutes % 10
    mins2 = (minutes - mins1) / 10
    hrs1 = hours % 10
    hrs2 = (hours - hrs1) / 10
    dys1 = days % 10
    dys2 = ((days - dys1) / 10) % 10
    dys3 = ((days - dys1 - (dys2 * 10)) / 100) % 10
    dys4 = ((days - dys1 - (dys2 * 10) - (dys3 * 100)) / 1000) % 10
    secs1 = secs1.floor
    change = false
    if secs1 != $game_variables[129]
      $game_variables[129] = secs1
      change = true
    end
    if secs2 != $game_variables[130]
      $game_variables[130] = secs2
      change = true
    end
    if mins1 != $game_variables[131]
      $game_variables[131] = mins1
      change = true
    end
    if mins2 != $game_variables[132]
      $game_variables[132] = mins2
      change = true
    end
    if hrs1 != $game_variables[133]
      $game_variables[133] = hrs1
      change = true
    end
    if hrs2 != $game_variables[134]
      $game_variables[134] = hrs2
      change = true
    end
    if dys1 != $game_variables[135]
      $game_variables[135] = dys1
      change = true
    end
    if dys2 != $game_variables[136]
      $game_variables[136] = dys2
      change = true
    end
    if dys3 != $game_variables[137]
      $game_variables[137] = dys3
      change = true
    end
    if dys4 != $game_variables[138]
      $game_variables[138] = dys4
      change = true
    end
    return change
  end

  def self.countdown_update
    return cdown_update(Time.new(2017, 12, 22))
  end

  def self.countdown_extend_update
    return cdown_update(Time.new(2017, 12, 22))
  end

  def self.countdown_equinox
    return cdown_update(Time.new(2022, 12, 21))
  end

  def self.countdown_update_rue
    if @rue_equinox == nil
      @rue_equinox = Time.now + 6
    end
    return cdown_update(@rue_equinox)
  end

  def self.niko_reflection_update
    for event in $game_map.events.values
      if event.name == "niko reflection"
        event.real_y = 27 * 128 / 2 - ($game_player.real_y - 27 * 128 / 2)
        event.real_x = $game_player.real_x
        event.y = 14 - (($game_player.y - 13))
        event.x = $game_player.x
        if event.y > 14
          event.y = 14
        end
        if event.real_y > 14 * 128
          event.real_y = 14 * 128
        end
        event.direction = $game_player.direction
        event.pattern = $game_player.pattern
        case event.direction
        when 2
          event.direction = 8
        when 8
          event.direction = 2
        end
        return
      end
    end
  end

  def self.niko_reflection_enc_update
    for event in $game_map.events.values
      if event.name == "niko reflection"
        event.real_y = 20 * 128 - ($game_player.real_y - 20 * 128)
        event.real_x = $game_player.real_x
        event.y = 20 - (($game_player.y - 20))
        event.x = $game_player.x
        if event.y > 19
          event.y = 19
        end
        if event.real_y > 19 * 128
          event.real_y = 19 * 128
        end

        if event.x > 14
          event.x = 14
        elsif event.x < 6
          event.x = 6
        end
        if event.real_x > (14 * 128) - 32
          event.real_x = (14 * 128) - 32
        elsif event.real_x < (6 * 128) + 32
          event.real_x = (6 * 128) + 32
        end

        event.direction = $game_player.direction
        event.pattern = $game_player.pattern
        case event.direction
        when 2
          event.direction = 8
        when 8
          event.direction = 2
        end
        return
      end
    end
  end

  def self.niko_reflection_peng_update
    for event in $game_map.events.values
      if event.name == "niko reflection"
        event.real_y = 20 * 128 - ($game_player.real_y - 20 * 128)
        event.real_x = $game_player.real_x
        event.y = 20 - (($game_player.y - 20))
        event.x = $game_player.x
        if event.y > 19
          event.y = 19
        end
        if event.real_y > 19 * 128
          event.real_y = 19 * 128
        end

        if event.x > 14
          event.x = 14
        elsif event.x < 6
          event.x = 6
        end
        if event.real_x > (14 * 128) - 32
          event.real_x = (14 * 128) - 32
        elsif event.real_x < (6 * 128) + 32
          event.real_x = (6 * 128) + 32
        end

        return
      end
    end
  end

  # Temporary switch assignment
  def self.tmp_s1=(val)
    $game_switches[TMP_INDEX + 0] = val
  end

  def self.tmp_s2=(val)
    $game_switches[TMP_INDEX + 1] = val
  end

  def self.tmp_s3=(val)
    $game_switches[TMP_INDEX + 2] = val
  end

  def self.tmp_v1=(val)
    $game_variables[TMP_INDEX + 0] = val
  end

  def self.tmp_v2=(val)
    $game_variables[TMP_INDEX + 1] = val
  end

  def self.tmp_v3=(val)
    $game_variables[TMP_INDEX + 2] = val
  end

  private

  TMP_INDEX = 22

  def self.logpos(pos, realpos, positive)
    bigpos = pos * 128
    if realpos < bigpos
      return pos - 1 if positive
    elsif realpos > bigpos
      return pos + 1 if positive
    end
    return pos
  end

  def self.set_cam(x, y)
    $game_map.display_x = x
    $game_map.display_y = y
  end

  def self.fadein_bgm(target, speed)
    $game_temp.target_bgm_vol_level = target
    $game_temp.bgm_fadein_speed = speed
  end

  def self.copy_journal
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games")
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot")
    begin
      File.open("_______.exe", "rb") do |input|
        File.open(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/_______.exe", "wb") do |output|
          while buff = input.read(4096)
            output.write(buff)
          end
        end
      end
    rescue Errno::EACCES => e
      #this probably means the clover.exe already exists and is running, so no need to create it again
    end
    if File.exists?("README.txt")
      File.open("README.txt", "rb") do |input|
        File.open(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/README.txt", "wb") do |output|
          while buff = input.read(4096)
            output.write(buff)
          end
        end
      end
    end
  end

  def self.create_boxes
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games")
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot")
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal1") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal1")
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal2") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal2")
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal3") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal3")
    Dir.mkdir(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigPortal") unless File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigPortal")
  end

  def self.delete_if_exists(f_name)
    File.delete(f_name) unless !File.exists?(f_name)
  end

  def self.clear_boxes
    for i in 1..3
      portal_path = Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal" + i.to_s
      case i
      when 1
        delete_if_exists(portal_path + "/blue_npc_prototype.png")
        delete_if_exists(portal_path + "/proto1.png")
        delete_if_exists(portal_path + "/keyB.txt")
      when 2
        delete_if_exists(portal_path + "/green_npc_cedric.png")
        delete_if_exists(portal_path + "/cedric.png")
        delete_if_exists(portal_path + "/keyG.txt")
      when 3
        delete_if_exists(portal_path + "/red_rue.png")
        delete_if_exists(portal_path + "/rue.png")
        delete_if_exists(portal_path + "/keyR.txt")
      end
    end
    delete_if_exists(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigPortal/keyB.txt")
    delete_if_exists(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigPortal/keyG.txt")
    delete_if_exists(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigPortal/keyR.txt")
  end

  def self.copy_file(src, dst)
    begin
      File.open(src, "rb") do |input|
        File.open(dst, "wb") do |output|
          while buff = input.read(4096)
            output.write(buff)
          end
        end
      end
    rescue Errno::EACCES => e
      #this probably means the file already exists and is open, so no need to create it again
    end
  end

  def self.write_key(dst, str)
    File.open(dst, "w") do |file|
      file.puts(str)
    end
  end

  def self.put_key_in_box(numb)
    portal_path = Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal" + numb.to_s
    case numb
    when 1
      copy_file("Graphics/Characters/blue_npc_prototype.png", portal_path + "/blue_npc_prototype.png")
      copy_file("Graphics/Faces/proto1.png", portal_path + "/proto1.png")
      write_key(portal_path + "/keyB.txt", tr(PROTO_TEXT))
    when 2
      copy_file("Graphics/Characters/green_npc_cedric.png", portal_path + "/green_npc_cedric.png")
      copy_file("Graphics/Faces/cedric.png", portal_path + "/cedric.png")
      write_key(portal_path + "/keyG.txt", tr(CEDRIC_TEXT))
    when 3
      copy_file("Graphics/Characters/red_rue.png", portal_path + "/red_rue.png")
      copy_file("Graphics/Faces/rue.png", portal_path + "/rue.png")
      write_key(portal_path + "/keyR.txt", tr(RUE_TEXT))
    end
  end

  def self.password1
    locale = $persistent.langcode
    if !Language::LANGUAGES.include? locale
      locale = "en"
    end
    source_dir = "Graphics/Fogs/_/scenario1/" + locale.downcase
    Dir.mkdir(Oneshot_UTF::DOCS_PATH) unless File.exists?(Oneshot_UTF::DOCS_PATH)
    copy_file(source_dir + "/pw1.png", Oneshot_UTF::DOCS_PATH + "/ONESHOT_password1.png")
    copy_file(source_dir + "/pw2.png", Oneshot_UTF::DOCS_PATH + "/ONESHOT_password2.png")
    copy_file(source_dir + "/pw3.png", Oneshot_UTF::DOCS_PATH + "/ONESHOT_password3.png")
    copy_file(source_dir + "/pw4.png", Oneshot_UTF::DOCS_PATH + "/ONESHOT_password4.png")
  end

  def self.password2
    locale = $persistent.langcode
    if !Language::LANGUAGES.include? locale
      locale = "en"
    end
    source_dir = "Graphics/Fogs/_/scenario2/#{locale.downcase}"
    Dir.mkdir(Oneshot_UTF::DOCS_PATH) unless File.exists?(Oneshot_UTF::DOCS_PATH)
    copy_file("#{source_dir}/pw1.png", "#{Oneshot_UTF::DOCS_PATH}/ONESHOT_password1.png")
    copy_file("#{source_dir}/pw2.png", "#{Oneshot_UTF::DOCS_PATH}/ONESHOT_password2.png")
    copy_file("#{source_dir}/pw3.png", "#{Oneshot_UTF::DOCS_PATH}/ONESHOT_password3.png")
    copy_file("#{source_dir}/pw4.png", "#{Oneshot_UTF::DOCS_PATH}/ONESHOT_password4.png")
  end

=begin
  def self.take_key_out_of_box(numb)
	if File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Box" + numb.to_s + "/key" + numb.to_s + ".png")
      File.delete(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Box" + numb.to_s + "/key" + numb.to_s + ".png")
	end
	if File.exists?(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigBox/key" + numb.to_s + ".png")
      File.delete(Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigBox/key" + numb.to_s + ".png")
	end
  end
=end

  def self.is_key_in_box(numb)
    portal_path = Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/Portal" + numb.to_s
    case numb
    when 1
      return File.exists?(portal_path + "/keyB.txt")
    when 2
      return File.exists?(portal_path + "/keyG.txt")
    when 3
      return File.exists?(portal_path + "/keyR.txt")
    end
    return false
  end

  def self.is_key_in_bigbox(numb)
    portal_path = Oneshot_UTF::DOCS_PATH + "/My Games/Oneshot/BigPortal"
    case numb
    when 1
      return File.exists?(portal_path + "/keyB.txt")
    when 2
      return File.exists?(portal_path + "/keyG.txt")
    when 3
      return File.exists?(portal_path + "/keyR.txt")
    end
    return false
  end
end

def has_lightbulb?
  $game_party.item_number(1) > 0
end

def button_pressed?
  (1..18).each do |i|
    return true if Input.trigger?(i)
  end
  return false
end

def enter_name
  $game_temp.name_calling = true
end

def check_exit(min, max, x: -1, y: -1)
  result = false
  if x >= 0
    if $game_player.x == x
      if $game_player.y >= min && $game_player.y <= max
        result = true
      end
    end
  elsif y >= 0
    if $game_player.y == y
      if $game_player.x >= min && $game_player.x <= max
        result = true
      end
    end
  end
  Script.tmp_s1 = $game_switches[11] ? false : result
end

def loadQASave(fname)
  filename = "testing_saves/" + fname + ".rxdata"
  # If file doesn't exist
  unless FileTest.exist?(filename)
    filename = "testing_saves_postgame/" + fname + ".rxdata"
    unless FileTest.exist?(filename)
      # Play buzzer SE
      $game_system.se_play($data_system.buzzer_se)
      return
    end
  end
  # Play load SE
  $game_system.se_play($data_system.load_se)

  # Read save data
  file = File.open(filename, "rb")
  # Read character data for drawing save file
  characters = Marshal.load(file)
  # Read frame count for measuring play time
  Graphics.frame_count = Marshal.load(file)
  # Read each type of game object
  $game_system = Marshal.load(file)
  $game_switches = Marshal.load(file)
  $game_variables = Marshal.load(file)
  $game_self_switches = Marshal.load(file)
  $game_screen = Marshal.load(file)
  $game_actors = Marshal.load(file)
  $game_party = Marshal.load(file)
  $game_troop = Marshal.load(file)
  $game_map = Marshal.load(file)
  $game_player = Marshal.load(file)
  $game_followers = Marshal.load(file)
  $game_oneshot = Marshal.load(file)
  $game_fasttravel = Marshal.load(file)
  $game_temp.footstep_sfx = Marshal.load(file)

  # If magic number is different from when saving
  # (if editing was added with editor)
  if $game_system.magic_number != $data_system.magic_number
    # Load map
    $game_map.setup($game_map.map_id)
    $game_player.center($game_player.x, $game_player.y)
  end
  # Refresh party members
  $game_party.refresh

  f_prev = $game_player
  for f in $game_followers
    f.leader = f_prev
    f.moveto($game_player.x, $game_player.y)
    f_prev = f
  end
  file.close
  # Restore BGM and BGS
  $game_system.bgm_play($game_system.playing_bgm)
  $game_system.bgs_play($game_system.playing_bgs)
  # Update map (run parallel process event)
  $game_map.update
  # Switch to map screen
  $scene = Scene_Map.new
end

def kill_perma_flags
  for i in 151..175
    $game_switches[i] = false
  end
  for i in 76..100
    $game_variables[i] = 0
  end
end

def bg(name)
  $game_map.bg_name = name
end

def particles(type)
  $game_map.particles_type = type
end

def ambient(r, g, b, gray = 0)
  $game_map.ambient.set(r, g, b, gray)
end

def clear_ambient
  $game_map.ambient.set(0, 0, 0, 0)
end

def add_light(id, file, intensity, x, y)
  #$scene.add_light(id, file, intensity, x, y)
end

def del_light(id)
  #$scene.del_light(id)
end

def clear_lights
  #$scene.clear_lights
end

def wrap_map
  $game_map.wrapping = true
end

def pan_offset_y(val)
  $game_map.pan_offset_y = val
end

# Map specific settings
def green_ambient
  ambient(-30, -20, -30)
end

def blue_ambient
  ambient(-40, -40, -40)
end

def house_ambient
  ambient(-15, -15, -15)
end

# Travel
def enable_travel
  $game_fasttravel.enabled = true
end

def disable_travel
  $game_fasttravel.enabled = false
end

def unlock_map(zone, map, dir)
  # Find the coordinate of the calling event
  e = $game_map.events.values.find { |e| e.name == "FAST TRAVEL" }
  raise "could not find event named FAST TRAVEL" if !e
  case dir
  when :down
    newdir = 2
  when :left
    newdir = 4
  when :right
    newdir = 6
  when :up
    newdir = 8
  else
    raise "invalid direction: #{dir}"
  end
  $game_fasttravel.enabled = true
  $game_fasttravel.zone = zone
  $game_fasttravel.unlock(map, $game_map.map_id, e.x, e.y, newdir)
end

# Misc
def watcher_tell_time
  hour = Time.now.hour
  if hour >= 6 && hour < 12
    Script.tmp_v1 = 0
  elsif hour >= 12 && hour < 17
    Script.tmp_v1 = 1
  elsif hour >= 17
    Script.tmp_v1 = 2
  else
    Script.tmp_v1 = 3
  end
end

# EQUINOX CLOCK
def e_clock
  hour = Time.now.hour
  min = Time.now.min
  h2 = hour % 10
  h1 = (hour - h2) / 10
  m2 = min % 10
  m1 = (min - m2) / 10
  $game_variables[154] = h1
  $game_variables[155] = h2
  $game_variables[156] = m1
  $game_variables[157] = m2
  $game_map.need_refresh = true
end

def plight_start_timer
  $game_oneshot.plight_timer = Time.now
end

def plight_update_timer
  if $game_oneshot.plight_timer == nil
    plight_start_timer
  end
  Script.tmp_v1 = ((Time.now - $game_oneshot.plight_timer) / 60).to_i
end

def activate_balcony?(ypos)
  !$scene.menu_open? &&
    $game_player.y == ypos &&
    $game_player.direction == 8 &&
    Input.trigger?(Input::ACTION) && !$game_system.map_interpreter.running? && !$game_temp.menus_visible
end


