颜色扩展
# @taroxd metadata 1.0
# @require taroxd_core
# @id color_ext
# @display 颜色扩展
# @help 
#  扩展了 \C 控制符的功能。大小写不敏感。
#  可用的颜色名称可以在下面长长的列表中找到,当然也可以自定义。
#  自定义时,注意使用小写字母。
#
#  使用范例:
#    \C[1]这是普通的蓝色,\C[Blue]这也是。
#    \C[66CCFF]这是洛天依的蓝色,\C[6CF]这也是。
#    \C[66CCFF7F]这是有半透明效果的洛天依的蓝色。
#
#  Taroxd::ColorExt 模块
#
#    常量:COLORS
#      哈希表,键为小写字母的 symbol,值为对应的颜色。
#      :"66ccff" 这样的键也是可以接受的。
#      :"1" 到 :"31" 之间的符号返回窗口皮肤中的颜色。
#      找不到值时,返回 Color.new
#
#    模块方法:hex_code(code)
#      接受一个字符串为参数,返回对应的颜色。
#      code 可以是 "66ccff" 这样的
#
#    模块方法:text_color,normal_color 等等
#      与 Window_Base 的对应方法相同。
#      可以让 Sprite 类包含这个模块,使这些方法在 Sprite 类中也可用。


module Taroxd::ColorExt
  COLORS = {
    aliceblue:            Color.new(240, 248, 255),
    antiquewhite:         Color.new(250, 235, 215),
    aqua:                 Color.new(0, 255, 255),
    aquamarine:           Color.new(127, 255, 212),
    azure:                Color.new(240, 255, 255),
    beige:                Color.new(245, 245, 220),
    bisque:               Color.new(255, 228, 196),
    black:                Color.new(0, 0, 0),
    blanchedalmond:       Color.new(255, 235, 205),
    blue:                 Color.new(0, 0, 255),
    blueviolet:           Color.new(138, 43, 226),
    brown:                Color.new(165, 42, 42),
    burlywood:            Color.new(222, 184, 135),
    cadetblue:            Color.new(95, 158, 160),
    chartreuse:           Color.new(127, 255, 0),
    chocolate:            Color.new(210, 105, 30),
    coral:                Color.new(255, 127, 80),
    cornflowerblue:       Color.new(100, 149, 237),
    cornsilk:             Color.new(255, 248, 220),
    crimson:              Color.new(220, 20, 60),
    cyan:                 Color.new(0, 255, 255),
    darkblue:             Color.new(0, 0, 139),
    darkcyan:             Color.new(0, 139, 139),
    darkgoldenrod:        Color.new(184, 134, 11),
    darkgray:             Color.new(169, 169, 169),
    darkgreen:            Color.new(0, 100, 0),
    darkkhaki:            Color.new(189, 183, 107),
    darkmagenta:          Color.new(139, 0, 139),
    darkolivegreen:       Color.new(85, 107, 47),
    darkorange:           Color.new(255, 140, 0),
    darkorchid:           Color.new(153, 50, 204),
    darkred:              Color.new(139, 0, 0),
    darksalmon:           Color.new(233, 150, 122),
    darkseagreen:         Color.new(143, 188, 143),
    darkslateblue:        Color.new(72, 61, 139),
    darkslategray:        Color.new(47, 79, 79),
    darkturquoise:        Color.new(0, 206, 209),
    darkviolet:           Color.new(148, 0, 211),
    deeppink:             Color.new(255, 20, 147),
    deepskyblue:          Color.new(0, 191, 255),
    dimgray:              Color.new(105, 105, 105),
    dodgerblue:           Color.new(30, 144, 255),
    firebrick:            Color.new(178, 34, 34),
    floralwhite:          Color.new(255, 250, 240),
    forestgreen:          Color.new(34, 139, 34),
    fuchsia:              Color.new(255, 0, 255),
    gainsboro:            Color.new(220, 220, 220),
    ghostwhite:           Color.new(248, 248, 255),
    gold:                 Color.new(255, 215, 0),
    goldenrod:            Color.new(218, 165, 32),
    gray:                 Color.new(128, 128, 128),
    green:                Color.new(0, 128, 0),
    greenyellow:          Color.new(173, 255, 47),
    honeydew:             Color.new(240, 255, 240),
    hotpink:              Color.new(255, 105, 180),
    indianred:            Color.new(205, 92, 92),
    indigo:               Color.new(75, 0, 130),
    ivory:                Color.new(255, 255, 240),
    khaki:                Color.new(240, 230, 140),
    lavender:             Color.new(230, 230, 250),
    lavenderblush:        Color.new(255, 240, 245),
    lawngreen:            Color.new(124, 252, 0),
    lemonchiffon:         Color.new(255, 250, 205),
    lightblue:            Color.new(173, 216, 230),
    lightcoral:           Color.new(240, 128, 128),
    lightcyan:            Color.new(224, 255, 255),
    lightgoldenrodyellow: Color.new(250, 250, 210),
    lightgreen:           Color.new(144, 238, 144),
    lightgrey:            Color.new(211, 211, 211),
    lightpink:            Color.new(255, 182, 193),
    lightsalmon:          Color.new(255, 160, 122),
    lightseagreen:        Color.new(32, 178, 170),
    lightskyblue:         Color.new(135, 206, 250),
    lightslategray:       Color.new(119, 136, 153),
    lightsteelblue:       Color.new(176, 196, 222),
    lightyellow:          Color.new(255, 255, 224),
    lime:                 Color.new(0, 255, 0),
    limegreen:            Color.new(50, 205, 50),
    linen:                Color.new(250, 240, 230),
    magenta:              Color.new(255, 0, 255),
    maroon:               Color.new(128, 0, 0),
    mediumaquamarine:     Color.new(102, 205, 170),
    mediumblue:           Color.new(0, 0, 205),
    mediumorchid:         Color.new(186, 85, 211),
    mediumpurple:         Color.new(147, 112, 219),
    mediumseagreen:       Color.new(60, 179, 113),
    mediumslateblue:      Color.new(123, 104, 238),
    mediumspringgreen:    Color.new(0, 250, 154),
    mediumturquoise:      Color.new(72, 209, 204),
    mediumvioletred:      Color.new(199, 21, 133),
    midnightblue:         Color.new(25, 25, 112),
    mintcream:            Color.new(245, 255, 250),
    mistyrose:            Color.new(255, 228, 225),
    moccasin:             Color.new(255, 228, 181),
    navajowhite:          Color.new(255, 222, 173),
    navy:                 Color.new(0, 0, 128),
    oldlace:              Color.new(253, 245, 230),
    olive:                Color.new(128, 128, 0),
    olivedrab:            Color.new(107, 142, 35),
    orange:               Color.new(255, 165, 0),
    orangered:            Color.new(255, 69, 0),
    orchid:               Color.new(218, 112, 214),
    palegoldenrod:        Color.new(238, 232, 170),
    palegreen:            Color.new(152, 251, 152),
    paleturquoise:        Color.new(175, 238, 238),
    palevioletred:        Color.new(219, 112, 147),
    papayawhip:           Color.new(255, 239, 213),
    peachpuff:            Color.new(255, 218, 185),
    peru:                 Color.new(205, 133, 63),
    pink:                 Color.new(255, 192, 203),
    plum:                 Color.new(221, 160, 221),
    powderblue:           Color.new(176, 224, 230),
    purple:               Color.new(128, 0, 128),
    red:                  Color.new(255, 0, 0),
    rosybrown:            Color.new(188, 143, 143),
    royalblue:            Color.new(65, 105, 225),
    saddlebrown:          Color.new(139, 69, 19),
    salmon:               Color.new(250, 128, 114),
    sandybrown:           Color.new(244, 164, 96),
    seagreen:             Color.new(46, 139, 87),
    seashell:             Color.new(255, 245, 238),
    sienna:               Color.new(160, 82, 45),
    silver:               Color.new(192, 192, 192),
    skyblue:              Color.new(135, 206, 235),
    slateblue:            Color.new(106, 90, 205),
    slategray:            Color.new(112, 128, 144),
    snow:                 Color.new(255, 250, 250),
    springgreen:          Color.new(0, 255, 127),
    steelblue:            Color.new(70, 130, 180),
    tan:                  Color.new(210, 180, 140),
    teal:                 Color.new(0, 128, 128),
    thistle:              Color.new(216, 191, 216),
    tomato:               Color.new(255, 99, 71),
    turquoise:            Color.new(64, 224, 208),
    violet:               Color.new(238, 130, 238),
    wheat:                Color.new(245, 222, 179),
    white:                Color.new(255, 255, 255),
    whitesmoke:           Color.new(245, 245, 245),
    yellow:               Color.new(255, 255, 0),
    yellowgreen:          Color.new(154, 205, 50),
  }
  COLORS.default_proc = -> h, k { h[k] = hex_code(k.to_s) || Color.new }

  module_function

  # 用颜色代码获取颜色
  def hex_code(code)
    case code.size
    when 3, 4
      Color.new(*code.each_char.map { |c| c.hex * 0x11 })
    when 6, 8
      Color.new(*code.scan(/../).map(&:hex))
    end
  end

  def windowskin
    Cache.system("Window")
  end

  def text_color(n)
    windowskin.get_pixel(64 + (n % 8) * 8, 96 + (n / 8) * 8)
  end

  def normal_color;      text_color(0);   end;
  def system_color;      text_color(16);  end;
  def crisis_color;      text_color(17);  end;
  def knockout_color;    text_color(18);  end;
  def gauge_back_color;  text_color(19);  end;
  def hp_gauge_color1;   text_color(20);  end;
  def hp_gauge_color2;   text_color(21);  end;
  def mp_gauge_color1;   text_color(22);  end;
  def mp_gauge_color2;   text_color(23);  end;
  def mp_cost_color;     text_color(23);  end;
  def power_up_color;    text_color(24);  end;
  def power_down_color;  text_color(25);  end;
  def tp_gauge_color1;   text_color(28);  end;
  def tp_gauge_color2;   text_color(29);  end;
  def tp_cost_color;     text_color(29);  end;
  32.times { |i| COLORS[:"#{i}"] = text_color(i) }
end

class Window_Base
  def_chain :process_escape_character do |old, code, text, pos|
    if code.casecmp('C').zero?
      sym = text.slice!(/^\[\w+]/i)[1..-2].downcase.to_sym
      change_color Taroxd::ColorExt::COLORS[sym]
    else
      old.call(code, text, pos)
    end
  end
end
用图片设置地图通行度
# @taroxd metadata 1.0
# @require taroxd_core
# @display 用图片设置地图通行度
# @id collision
# @help 
#             会用 Parallaxes 文件夹下面的对应图片作为该地图的通行度。
#             图片上透明的点表示可以通行,不透明的点表示不能通行。
#             不处理地图循环的情况。

module Taroxd::Collision
  ENABLE_FLOAT_POSITION = false   # 是否允许坐标出现小数。可能会导致未知错误。

  # 人物判定点到图块左上角的距离
  X_OFFSET = 16
  Y_OFFSET = 16

  # position:
  #   行走到的最远位置的坐标(可为 x 坐标或 y 坐标)
  # status:
  #   nil: 完全无法行走
  #   false: 可以行走,但无法走过一格。此时 position 为浮点数
  #   true: 可以完全走过一格,此时 position 为整数
  PassageStatus = Struct.new :position, :status

  def self.passage_status(x, y, d)
    pos = nil
    bx = (x * 32 + X_OFFSET).round
    by = (y * 32 + Y_OFFSET).round

    is_x = d == 4 || d == 6
    current = is_x ? x : y

    if d == 2 || d == 6
      step = 1
      target = (current + 1).floor
    else
      step = -1
      target = (current - 1).ceil
    end

    lbound = (current * 32).round + step
    ubound = target * 32
    bitmap = $game_map.collision_bitmap
    lbound.step(ubound, step) do |i|
      if is_x
        bx = i + X_OFFSET
      else
        by = i + Y_OFFSET
      end

      if bitmap.get_pixel(bx, by).alpha == 0
        pos = i
      else
        break
      end
    end

    if pos
      if pos == ubound
        PassageStatus[pos / 32, true]
      else
        PassageStatus[pos / 32.0, false]
      end
    else
      PassageStatus[nil, nil]
    end
  end
end

RPG::Map.note_s :collision

class Game_Map
  def collision?
    @map.collision
  end

  def collision_bitmap
    @map.collision && Cache.parallax(@map.collision)
  end

  # preload bitmap in cache
  def_after :setup do |_|
    collision_bitmap
  end

  def_and :passable? do |x, y, d|
    Taroxd::Collision.passage_status(x, y, d).status
  end unless Taroxd::Collision::ENABLE_FLOAT_POSITION
end

class Game_CharacterBase
  def_chain :move_straight do |old, d, turn_ok = true|
    if $game_map.collision? && !(@through || debug_through?)
      @move_succeed = passable?(@x.round, @y.round, d)

      if @move_succeed
        pos = Taroxd::Collision.passage_status(@x, @y, d).position
        if pos
          set_direction(d)
          d == 4 || d == 6 ? @x = pos : @y = pos
          increase_steps
        else
          @move_succeed = false
        end
      end

      if !@move_succeed && turn_ok
        set_direction(d)
        check_event_trigger_touch_front
      end
    else
      old.call(d, turn_ok)
    end
  end

end if Taroxd::Collision::ENABLE_FLOAT_POSITION
清除战斗日志
# @taroxd metadata 1.0
# @id clear_battle_log
# @display 清除战斗日志
module Taroxd
  class ClearBattleLog < BasicObject
    ::Object.const_set :Window_BattleLog, self
    def initialize(*) end
    def method_missing(*) end
  end
end