设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3903|回复: 8
打印 上一主题 下一主题

[已经解决] 关于VA的怪物图鉴

[复制链接]

Lv1.梦旅人

梦石
0
星屑
239
在线时间
33 小时
注册时间
2018-11-9
帖子
12
跳转到指定楼层
1
发表于 2018-11-17 15:18:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
最近在论坛里捞到了怪物图鉴脚本,当然,找遍了论坛与贴吧,VA的怪物图鉴脚本我也只找到了这么一个。我想的是在图鉴里增加一下自己手写的怪物说明,希望有大佬能教教我。以下是脚本
核心部分
RUBY 代码复制
  1. module Snstar
  2.   module EnemyList
  3.     # 敌人类型      0       1       2       3       4       5
  4.     ENEMY_TYPE = ["异兽", "魔物", "精怪", "人形", "其他", "首领"]
  5.     ENEMY_TYPE_DEFAULT = 4       # 敌人的默认类型
  6.     ENCOUNTER_PERCENT = 1        # 敌人现身所提升的辨识度
  7.     DEFEAT_PERCENT = 5           # 敌人战败所提升的辨识度
  8.     TEST_PERCENT = 5             # 测试用调整的辨识度
  9.     INCLUDE_ALL_CATEGORY = true  # 是否包含“全部”类型
  10.     ALL_CATEGORY_TEXT = "全部"   # “全部”类型的文字
  11.     ENEMY_MORE_INFO_BUTTON = :b  # 显示敌人更多资讯的按键
  12.     ENEMY_MORE_INFO = true      # 是否显示更多讯息(扩充用)
  13.  
  14.     DRAW_ENEMY_ICON = false # 需要使用绘制单张图标才能使用
  15.  
  16.     # 敌人图像大小限定
  17.     ENEMY_IMAGE_MAX_WIDTH = 170  # 敌人图像宽度限定
  18.     ENEMY_IMAGE_MAX_HEIGHT = 192 # 敌人图像高度限定
  19.     ENEMY_IMAGE_FOLDER = "Graphics/EnemyImages/" # 敌人指定图像资料夹
  20.     ENEMY_HUE_SYNC_DB = false # 敌人指定图像是否使用资料库设定的色相
  21.  
  22.     # 文字设定
  23.     ENEMY_LIST_COMMAND_TEXT = "真理图鉴" # 主选单命令用字
  24.     ENEMY_LIST_SWITCH_ID    = 0        # 主选单命令显示的控制开关
  25.     ENEMY_LIST_ENABLE_ID    = 0        # 主选单命令有效的控制开关
  26.  
  27.     ENEMY_PERCENT_VOCAB = "辨识度"   # 辨识度用字
  28.     ENEMY_PERCENT_BASE_COLOR = Color.new(0, 255, 0)#Color.new(0, 0, 0)
  29.     ENEMY_PERCENT_FILL_COLOR = Color.new(255, 255, 0)
  30.     NO_DISPLAY_MASK = "??"         # 无法显示时的替代文字
  31.     EST_DISPLAY_MASK = "大约是%s"    # 显示估算数值时的文字
  32.     DROP_GOLD_VOCAB  = "携带金钱"
  33.     DROP_ITEM_VOCAB  = "掉落物"
  34.     FEA_WEAK_ELE_RATE = "弱点"    # 属性有效度 > 100% 的文字
  35.     FEA_RES_ELE_RATE  = "抵抗"    # 属性有效度 < 100% 的文字
  36.     FEA_DEBUFF_RATE   = "弱化属性"    # 弱化属性的文字
  37.     FEA_ATK_ELEMENT   = "属性"    # 攻击附带属性的文字
  38.  
  39.     # 辨识度提升数值
  40.     PERCENTAGE_ON_ENCOUNTER = 1 # 敌人现身时提升辨识度
  41.     PERCENTAGE_ON_DEFEAT    =10 # 敌人落败时提升辨识度
  42.  
  43.     # 辨识度显示参数数值
  44.     NAME_DISPLAY_PERC   = 1   # 名称显示百分比
  45.     HP_EST_DISPLAY_PERC = 1   # HP估算显示百分比
  46.     HP_DISPLAY_PERC     = 1  # HP显示百分比
  47.     MP_EST_DISPLAY_PERC = 1  # MP估算显示百分比
  48.     MP_DISPLAY_PERC     = 1  # MP显示百分比
  49.     ATK_DISPLAY_PERC    = 50  # 攻击力显示百分比
  50.     DEF_DISPLAY_PERC    = 50  # 防御力显示百分比
  51.     MAT_DISPLAY_PERC    = 75  # 魔法攻击显示百分比
  52.     MDF_DISPLAY_PERC    = 75  # 魔法防御显示百分比
  53.     AGI_DISPLAY_PERC    = 75  # 敏捷显示百分比
  54.     Level_DISPLAY_PERC    = 1  # 等级显示百分比
  55.     GOLD_DISPLAY_PERC   = 100 # 掉落金钱显示百分比
  56.     ITEM_DISPLAY_PERC   = 100 # 掉落物显示百分比
  57.     #TYPE_BOSS
  58.   end
  59. end
  60. class RPG::Enemy < RPG::BaseItem
  61.   include Snstar::EnemyList
  62.   def list_type
  63.     self.note.split(/[\r\n]+/).each{ |line|
  64.       if line =~ /\[(?:ltype) (\d+)\]/
  65.         return $1 ? $1.to_i : ENEMY_TYPE_DEFAULT
  66.       end}
  67.     return ENEMY_TYPE_DEFAULT
  68.   end
  69.   def list_image
  70.     self.note.split(/[\r\n]+/).each{ |line|
  71.       if line =~ /\[(?:limage) (\S+)\]/
  72.         return $1
  73.       end}
  74.     return nil # battler_name
  75.   end
  76.   def no_list?
  77.     self.note.split(/[\r\n]+/).each{ |line|
  78.       return true if line =~ /\[no_list\]/
  79.       }
  80.     return false
  81.   end
  82. end
  83. class Game_Party < Game_Unit
  84.   include Snstar::EnemyList
  85.   #--------------------------------------------------------------------------
  86.   # ● 初始化
  87.   #--------------------------------------------------------------------------
  88.   alias enemy_list_initialize initialize
  89.   def initialize
  90.     enemy_list_initialize
  91.     @enemy_know_percentage=[]
  92.     $data_enemies.each{ |e|
  93.       next unless e
  94.       set_enemy_percentage(e.id, 0)
  95.     }
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 设置敌人百分比
  99.   #--------------------------------------------------------------------------
  100.   def set_enemy_percentage(e_id, percentage=100)
  101.     temp_p = [[0, percentage].max ,100].min
  102.     @enemy_know_percentage[e_id] = temp_p
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # ● 获取敌人百分比
  106.   #--------------------------------------------------------------------------
  107.   def enemy_percent(e_id)
  108.     return 0 unless seen_enemy?(e_id)
  109.     return @enemy_know_percentage[e_id]
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 提升敌人百分比
  113.   #--------------------------------------------------------------------------
  114.   def see_enemy(e_id, percentage = 1)
  115.     temp_p = @enemy_know_percentage[e_id] + percentage
  116.     set_enemy_percentage(e_id, temp_p)
  117.   end
  118.   def know_enemy(e_id)
  119.     set_enemy_percentage(e_id, 100)
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● 判断是否见过敌人
  123.   #--------------------------------------------------------------------------
  124.   def seen_enemy?(e_id)
  125.     return @enemy_know_percentage[e_id] > 0
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● 判断是否熟知敌人
  129.   #--------------------------------------------------------------------------
  130.   def known_enemy?(e_id, percentage=100)
  131.     return false unless seen_enemy?(e_id)
  132.     return enemy_percent(e_id) == percentage
  133.   end
  134.   #--------------------------------------------------------------------------
  135.   # ● 战斗开始提升辨识度
  136.   #--------------------------------------------------------------------------
  137.   alias enemy_list_on_battle_start on_battle_start
  138.   def on_battle_start
  139.     enemy_list_on_battle_start
  140.     $game_troop.members.each{ |m|
  141.       e_id = m.enemy.id
  142.       see_enemy(e_id, ENCOUNTER_PERCENT)
  143.     }
  144.   end
  145. end
  146. class Game_Enemy < Game_Battler
  147.   #--------------------------------------------------------------------------
  148.   # ● 敌人战败提升辨识度
  149.   #--------------------------------------------------------------------------
  150.   alias enemy_list_perform_collapse_effect perform_collapse_effect
  151.   def perform_collapse_effect
  152.     enemy_list_perform_collapse_effect
  153.     $game_party.see_enemy(@enemy_id, Snstar::EnemyList::DEFEAT_PERCENT)
  154.   end
  155. end
  156. class Game_Interpreter
  157.   #--------------------------------------------------------------------------
  158.   # ● 呼叫敌人图鉴场景
  159.   #--------------------------------------------------------------------------
  160.   def call_enemy_list
  161.     SceneManager.call(Scene_List)
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ● 提升敌人辨识度
  165.   #--------------------------------------------------------------------------
  166.   def gain_enemy_percentage(e_id, per)
  167.     $game_party.see_enemy(e_id, per)
  168.   end
  169. end

窗口部分
RUBY 代码复制
  1. class Window_EnemyType < Window_HorzCommand
  2.   include Snstar::EnemyList
  3.   #--------------------------------------------------------------------------
  4.   # ● 初始化
  5.   #--------------------------------------------------------------------------
  6.   def initialize(x, y, min_height=48)
  7.     super(x, y)
  8.     @min_height = min_height
  9.     @max_height = window_height
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 定义窗口宽度
  13.   #--------------------------------------------------------------------------
  14.   def window_width
  15.     Graphics.width
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 定义栏数
  19.   #--------------------------------------------------------------------------
  20.   def col_max
  21.     return 6
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 窗口更新
  25.   #--------------------------------------------------------------------------
  26.   def update
  27.     super
  28.     @item_window.category = current_symbol if @item_window
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 绘制敌人类型列表
  32.   #--------------------------------------------------------------------------
  33.   def make_command_list
  34.     add_command(ALL_CATEGORY_TEXT, :all) if INCLUDE_ALL_CATEGORY
  35.     ENEMY_TYPE.each{ |type|
  36.       add_command(type, type.to_sym)
  37.     }
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 设置敌人列表窗口
  41.   #--------------------------------------------------------------------------
  42.   def item_window=(item_window)
  43.     @item_window = item_window
  44.     update
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 窗口有效化
  48.   #--------------------------------------------------------------------------
  49.   def activate
  50.     super
  51.     return unless @max_height
  52.     self.height = @max_height
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● 窗口失效
  56.   #--------------------------------------------------------------------------
  57.   def deactivate
  58.     super
  59.     return unless @min_height
  60.     self.height = @min_height
  61.     @item_window.select_last_index
  62.   end
  63. end
  64. class Window_EnemyList < Window_ItemList
  65.   include Snstar::EnemyList
  66.   #--------------------------------------------------------------------------
  67.   # ● 初始化
  68.   #--------------------------------------------------------------------------
  69.   def initialize(x, y, width, height)
  70.     super(x, y, width, height)
  71.     @last_index = {}
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 选择上次索引
  75.   #--------------------------------------------------------------------------
  76.   def select_last_index
  77.     select(@last_index[@category])
  78.   end
  79.   def select(index)
  80.     super(index)
  81.     @info_window.enemy = @data[@index]
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 窗口失效
  85.   #--------------------------------------------------------------------------
  86.   def deactivate
  87.     super
  88.     return unless @last_index
  89.     @last_index[@category] = @index # 纪录当前敌人类型的索引
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ● 最大栏数
  93.   #--------------------------------------------------------------------------
  94.   def col_max
  95.     return 1
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 生成敌人列表
  99.   #--------------------------------------------------------------------------
  100.   def make_item_list
  101.     @data = []
  102.     @last_index[@category] = 0 if @last_index[@category].nil?
  103.     selected_type = ENEMY_TYPE.index(@category.to_s)
  104.     $data_enemies.each{ |enemy|
  105.       next if enemy.nil?
  106.       next if enemy.name == "" # 名字为空的敌人跳过
  107.       next if enemy.no_list? # 指定不列入的敌人跳过
  108.       if @category == :all or (enemy.list_type == selected_type)
  109.         @data.push(enemy)
  110.       end
  111.     }
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 绘制敌人项目
  115.   #--------------------------------------------------------------------------
  116.   def draw_item(index)
  117.     item = @data[index]
  118.     if item
  119.       rect = item_rect(index)
  120.       rect.width -= 4
  121.       draw_item_name(item, rect.x, rect.y)
  122.     end
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 绘制敌人名称
  126.   #--------------------------------------------------------------------------
  127.   def draw_item_name(item, x, y, enabled = true, width = 172)
  128.     return unless item
  129.     if DRAW_ENEMY_ICON
  130.       draw_icon(item.icon_index, x, y, enabled)
  131.       x += 24
  132.     end
  133.     change_color(normal_color, enabled)
  134.     per = $game_party.enemy_percent(item.id)
  135.     if  per >= NAME_DISPLAY_PERC
  136.       text = item.name
  137.     else
  138.       text = NO_DISPLAY_MASK
  139.     end
  140.     draw_text(x, y, width, line_height, text)
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● 资讯窗口更新
  144.   #--------------------------------------------------------------------------
  145.   def update_info
  146.     @info_window.set_item(item)
  147.   end
  148.   #--------------------------------------------------------------------------
  149.   # ● 设置资讯窗口
  150.   #--------------------------------------------------------------------------
  151.   def info_window=(info_window)
  152.     @info_window = info_window
  153.     #call_update_info
  154.   end
  155. end
  156. class Window_EnemyDetail < Window_Base
  157.   include Snstar::EnemyList
  158.   attr_reader :enemy
  159.   #--------------------------------------------------------------------------
  160.   # ● 初始化
  161.   #--------------------------------------------------------------------------
  162.   def initialize
  163.     super(160, 48, Graphics.width-160, Graphics.height-48)
  164.     @enemy = nil
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● 设置当前敌人
  168.   #--------------------------------------------------------------------------
  169.   def enemy=(e)
  170.     @enemy = e
  171.     if enemy
  172.       @percentage = $game_party.enemy_percent(e.id) # 获取当前敌人辨识度
  173.     else
  174.       @percentage = 0
  175.     end
  176.     refresh
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 检查当前辨识度百分比
  180.   #--------------------------------------------------------------------------
  181.   def checkPercent?(per)
  182.     return @percentage >= per
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ● 窗口刷新
  186.   #--------------------------------------------------------------------------
  187.   def refresh
  188.     contents.clear
  189.     return unless @enemy # 无敌人时返回
  190.     return unless checkPercent?(NAME_DISPLAY_PERC) # 不显示名称时返回
  191.     @partial = false
  192.     draw_enemy_image(0, 0) # 绘制敌人图像
  193.     draw_enemy_name(0, ENEMY_IMAGE_MAX_HEIGHT) # 绘制敌人名称
  194.     draw_enemy_features(0, ENEMY_IMAGE_MAX_HEIGHT+line_height)
  195.     draw_enemy_percentage(0, ENEMY_IMAGE_MAX_HEIGHT+line_height*5) # 绘制敌人辨识度
  196.     partial_refresh
  197.   end
  198.   #--------------------------------------------------------------------------
  199.   # ● 窗口半刷新
  200.   #--------------------------------------------------------------------------
  201.   def partial_refresh
  202.     return unless @enemy # 无敌人时返回
  203.     rect = Rect.new(ENEMY_IMAGE_MAX_WIDTH+8, 0,
  204.       contents.width-(ENEMY_IMAGE_MAX_WIDTH+8), contents.height-line_height)
  205.     contents.clear_rect(rect)
  206.     if ENEMY_MORE_INFO && @partial
  207.       Sound.play_cursor
  208.       draw_other_info
  209.       @partial = false
  210.     else
  211.       draw_enemy_hp(ENEMY_IMAGE_MAX_WIDTH+8, 0) # 绘制敌人体力
  212.       draw_enemy_mp(ENEMY_IMAGE_MAX_WIDTH+8, line_height) # 绘制敌人魔力
  213.       2.upto(7){ |n|
  214.         draw_enemy_param(ENEMY_IMAGE_MAX_WIDTH+8, line_height*n, n) # 绘制敌人能力
  215.       }
  216.       draw_enemy_gold(ENEMY_IMAGE_MAX_WIDTH+8, line_height*8) # 绘制敌人掉落金
  217.       draw_enemy_item(ENEMY_IMAGE_MAX_WIDTH+8, line_height*9) # 绘制敌人掉落物
  218.       @partial = true
  219.     end
  220.   end
  221.   #--------------------------------------------------------------------------
  222.   # ● 绘制敌人特征
  223.   #--------------------------------------------------------------------------
  224.   def draw_enemy_features(x, y)
  225.     fy = y
  226.     for i in 0..4 do
  227.       feature = @enemy.features[i]
  228.       next unless feature
  229.       label, value = get_feature(feature)
  230.       next if label==""
  231.       change_color(system_color)
  232.       draw_text(x, fy, text_width(label), line_height, label)
  233.       change_color(normal_color)
  234.       draw_text(x+72, fy, text_width(value), line_height, value)
  235.       fy+=line_height
  236.     end
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ● 获取敌人特征
  240.   #--------------------------------------------------------------------------
  241.   def get_feature(feature)
  242.     code = feature.code
  243.     id = feature.data_id
  244.     value = feature.value
  245.     return "", 0 unless [11, 31].include?(code)
  246.     if code == 11
  247.       if value < 1.0
  248.         label = FEA_RES_ELE_RATE
  249.       elsif value > 1.0
  250.         label = FEA_WEAK_ELE_RATE
  251.       else
  252.         return "", 0
  253.       end
  254.       element = $data_system.elements[id]
  255.       return_value = element + " #{value.truncate}倍"
  256.     elsif code == 31
  257.       label = FEA_ATK_ELEMENT
  258.       return_value = $data_system.elements[id]
  259.     end
  260.     return label, return_value
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 绘制敌人图像
  264.   #--------------------------------------------------------------------------
  265.   def draw_enemy_image(x, y)
  266.     image_name = @enemy.list_image # 获取指定图像
  267.     if image_name.nil? # 指定图像为空时
  268.       image = Cache.battler(@enemy.battler_name, @enemy.battler_hue) # 获取战斗图
  269.     else
  270.       hue = ENEMY_HUE_SYNC_DB ? @enemy.battler_hue : 0
  271.       image = Cache.load_bitmap(ENEMY_IMAGE_FOLDER, image_name, hue) # 获取战斗图
  272.     end
  273.  
  274.     ix = (image.width/2-ENEMY_IMAGE_MAX_WIDTH/2).abs  # 获取中心点
  275.     # 敌人图像宽度在显示范围外
  276.     if image.width > ENEMY_IMAGE_MAX_WIDTH
  277.       # 居中对齐
  278.       rx = ix
  279.       cx = x
  280.     # 敌人图像宽度在显示范围外
  281.     else
  282.       # 居中对齐
  283.       rx = 0
  284.       cx = ix
  285.     end
  286.     # 敌人图像高度在显示范围外
  287.     if image.height > ENEMY_IMAGE_MAX_HEIGHT
  288.       cy = y
  289.     # 敌人图像高度在显示范围内
  290.     else
  291.       cy = ENEMY_IMAGE_MAX_HEIGHT - image.height - 8 # 向下对齐
  292.     end
  293.     rect = Rect.new(rx, 0, ENEMY_IMAGE_MAX_WIDTH, ENEMY_IMAGE_MAX_HEIGHT)
  294.     contents.blt(cx, cy, image, rect, 255)
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● 绘制敌人辨识度
  298.   #--------------------------------------------------------------------------
  299.   def draw_enemy_percentage(x, y)
  300.     width = contents.width
  301.     change_color(system_color)
  302.     text = ENEMY_PERCENT_VOCAB
  303.     draw_text(x, y, text_width(text), line_height, text)
  304.     # 绘制辨识度进度槽
  305.     draw_gauge(x+96, y, width - 96, @percentage.to_f/100,
  306.       ENEMY_PERCENT_BASE_COLOR, ENEMY_PERCENT_FILL_COLOR)
  307.     # 绘制百分比
  308.     change_color(normal_color)
  309.     text = "#{@percentage}%"
  310.     draw_text(x+96, y, text_width(text), line_height, text)
  311.   end
  312.   #--------------------------------------------------------------------------
  313.   # ● 绘制敌人名称
  314.   #--------------------------------------------------------------------------
  315.   def draw_enemy_name(x, y)
  316.     change_color(system_color)
  317.     text = "名称"
  318.     draw_text(x, y, text_width(text), line_height, text)
  319.     # 绘制名称
  320.     change_color(normal_color)
  321.     text = @enemy.name
  322.     draw_text(x+72, y, text_width(text), line_height, text)
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # ● 绘制敌人体力
  326.   #--------------------------------------------------------------------------
  327.   def draw_enemy_hp(x, y)
  328.     change_color(system_color)
  329.     text = Vocab::hp
  330.     draw_text(x, y, 108, line_height, text)
  331.     change_color(normal_color)
  332.     hp = @enemy.params[0]
  333.     # 判断显示百分比
  334.     if checkPercent?(HP_DISPLAY_PERC)
  335.       text = hp
  336.     elsif checkPercent?(HP_EST_DISPLAY_PERC)
  337.       # 计算体力约值
  338.       ahp = [(hp/10) * 10 - @enemy.params[3], 10].max
  339.       text = sprintf(EST_DISPLAY_MASK, ahp)
  340.     else
  341.       text = NO_DISPLAY_MASK
  342.     end
  343.     draw_text(x+72, y, text_width(text), line_height, text)
  344.   end
  345.   #--------------------------------------------------------------------------
  346.   # ● 绘制敌人魔力
  347.   #--------------------------------------------------------------------------
  348.   def draw_enemy_mp(x, y)
  349.     change_color(system_color)
  350.     text = Vocab::mp
  351.     draw_text(x, y, 108, line_height, text)
  352.     change_color(normal_color)
  353.     mp = @enemy.params[1]
  354.     # 判断显示百分比
  355.     if checkPercent?(MP_DISPLAY_PERC)
  356.       text = mp
  357.     elsif checkPercent?(MP_EST_DISPLAY_PERC)
  358.       # 计算魔力约值
  359.       amp = [(mp/10) * 10 - @enemy.params[5], @enemy.params[4], 5].max
  360.       text = sprintf(EST_DISPLAY_MASK, amp)
  361.     else
  362.       text = NO_DISPLAY_MASK
  363.     end
  364.     draw_text(x+72, y, text_width(text), line_height, text)
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● 绘制敌人能力值
  368.   #--------------------------------------------------------------------------
  369.   def draw_enemy_param(x, y, param_id)
  370.     # 能力值ID为1或2时,调用绘制体力/魔力方法
  371.     draw_enemy_hp(x, y) if param_id==0
  372.     draw_enemy_mp(x, y) if param_id==1
  373.     return if param_id < 2
  374.     change_color(system_color)
  375.     # 绘制能力值名称
  376.     draw_text(x, y, 108, line_height, Vocab::param(param_id))
  377.     change_color(normal_color)
  378.     # 获取能力值百分比
  379.     param_percent = [ATK_DISPLAY_PERC, DEF_DISPLAY_PERC, MAT_DISPLAY_PERC,
  380.                      MDF_DISPLAY_PERC, AGI_DISPLAY_PERC, Level_DISPLAY_PERC ]
  381.     # 判断显示百分比
  382.     if checkPercent?(param_percent[param_id-2])
  383.       text = @enemy.params[param_id]
  384.     else
  385.       text = NO_DISPLAY_MASK
  386.     end
  387.     draw_text(x+72, y, text_width(text), line_height, text)
  388.   end
  389.   #--------------------------------------------------------------------------
  390.   # ● 绘制敌人掉落金钱
  391.   #--------------------------------------------------------------------------
  392.   def draw_enemy_gold(x, y)
  393.     change_color(system_color)
  394.     draw_text(x, y, 96, line_height, DROP_GOLD_VOCAB)
  395.     change_color(normal_color)
  396.     # 判断显示百分比
  397.     if checkPercent?(GOLD_DISPLAY_PERC)
  398.       draw_currency_value(@enemy.gold, Vocab.currency_unit, x+12, y, 108)
  399.     else
  400.       draw_text(x+72, y, 96, line_height, NO_DISPLAY_MASK)
  401.     end
  402.   end
  403.   #--------------------------------------------------------------------------
  404.   # ● 绘制敌人掉落物
  405.   #--------------------------------------------------------------------------
  406.   def draw_enemy_item(x, y)
  407.     change_color(system_color)
  408.     draw_text(x, y, 96, line_height, DROP_ITEM_VOCAB)
  409.     change_color(normal_color)
  410.     # 判断显示百分比
  411.     if checkPercent?(ITEM_DISPLAY_PERC)
  412.       nn_di = 0
  413.       for i in 0..2 do
  414.         di = item_object(@enemy.drop_items[i]) # 获取掉落物物件
  415.         if di
  416.           ly = y+line_height*(nn_di+1) # 计算绘制高度
  417.           draw_item_name(di, x+24, ly)
  418.           nn_di += 1 # 计数器+1
  419.         end
  420.       end
  421.       return if nn_di > 0 # 计数器大于0时返回
  422.       draw_text(x+80, y, 96, line_height, "无")
  423.     else
  424.       draw_text(x+24, y+line_height, 96, line_height, NO_DISPLAY_MASK)
  425.     end
  426.   end
  427.   #--------------------------------------------------------------------------
  428.   # ● 计算敌人掉落物
  429.   #--------------------------------------------------------------------------
  430.   def item_object(drop_item)
  431.     kind = drop_item.kind
  432.     data_id = drop_item.data_id
  433.     return $data_items  [data_id] if kind == 1
  434.     return $data_weapons[data_id] if kind == 2
  435.     return $data_armors [data_id] if kind == 3
  436.     return nil
  437.   end
  438.   #--------------------------------------------------------------------------
  439.   # ● 绘制其他资讯
  440.   #--------------------------------------------------------------------------
  441.   def draw_other_info
  442.  
  443.   end
  444.   #--------------------------------------------------------------------------
  445.   # ● 获得文字宽度
  446.   #--------------------------------------------------------------------------
  447.   def text_width(text)
  448.     return text_size(text).width + 5
  449.   end
  450. end

场景部分
RUBY 代码复制
  1. class Scene_List < Scene_Base
  2.   include Snstar::EnemyList
  3.   #--------------------------------------------------------------------------
  4.   # ● 场景开始
  5.   #--------------------------------------------------------------------------
  6.   def start
  7.     super
  8.     create_category_window
  9.     create_list_window
  10.     create_detail_window
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 创建敌人类型窗口
  14.   #--------------------------------------------------------------------------
  15.   def create_category_window
  16.     @category_window = Window_EnemyType.new(0, 0)
  17.     @category_window.set_handler(:ok,     method(:on_category_ok))
  18.     @category_window.set_handler(:cancel, method(:return_scene))
  19.     @category_window.viewport = @viewport
  20.   end
  21.   #--------------------------------------------------------------------------
  22.   # ● 创建敌人列表窗口
  23.   #--------------------------------------------------------------------------
  24.   def create_list_window
  25.     @list_window = Window_EnemyList.new(0, 48, 160, Graphics.height-48)
  26.     @list_window.set_handler(:cancel, method(:on_list_cancel))
  27.     @list_window.viewport = @viewport
  28.     @category_window.item_window = @list_window
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 创建敌人讯息窗口
  32.   #--------------------------------------------------------------------------
  33.   def create_detail_window
  34.     @detail_window = Window_EnemyDetail.new
  35.     @list_window.info_window = @detail_window
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 选择类型完成
  39.   #--------------------------------------------------------------------------
  40.   def on_category_ok
  41.     @list_window.activate
  42.     @list_window.select_last
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 离开敌人列表
  46.   #--------------------------------------------------------------------------
  47.   def on_list_cancel
  48.     @list_window.unselect
  49.     @category_window.activate
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ● 场景更新
  53.   #--------------------------------------------------------------------------
  54.   def update
  55.     super
  56.     on_list_partial_refersh if Input.trigger?(ENEMY_MORE_INFO_BUTTON)
  57.     enemy_percent_change(:left) if Input.trigger?(:LEFT)
  58.     enemy_percent_change(:right) if Input.trigger?(:RIGHT)
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 敌人讯息半刷新
  62.   #--------------------------------------------------------------------------
  63.   def on_list_partial_refersh
  64.     @detail_window.partial_refresh
  65.   end
  66.   #--------------------------------------------------------------------------
  67.   # ● 更改敌人辨识度百分比(仅游戏测试时可用)
  68.   #--------------------------------------------------------------------------
  69.   def enemy_percent_change(sym)
  70.     return unless $TEST
  71.     return unless @list_window.active
  72.     enemy = @detail_window.enemy
  73.     return unless enemy
  74.     $game_party.see_enemy(enemy.id, TEST_PERCENT) if sym == :right
  75.     $game_party.see_enemy(enemy.id, -TEST_PERCENT) if sym == :left
  76.     @list_window.refresh
  77.     @detail_window.enemy = enemy
  78.   end
  79. end
  80. class Window_MenuCommand < Window_Command
  81.   include Snstar::EnemyList
  82.   #--------------------------------------------------------------------------
  83.   # ● 加入敌人图鉴命令
  84.   #--------------------------------------------------------------------------
  85.   alias enemy_list_add_original_commands add_original_commands
  86.   def add_original_commands
  87.     enemy_list_add_original_commands
  88.     return unless ENEMY_LIST_SWITCH_ID==0 || $game_switches[ENEMY_LIST_SWITCH_ID]
  89.     enabled = ENEMY_LIST_ENABLE_ID == 0 || $game_switches[ENEMY_LIST_ENABLE_ID]
  90.     add_command(ENEMY_LIST_COMMAND_TEXT, :enemy_list, enabled)
  91.   end
  92. end
  93. class Scene_Menu < Scene_MenuBase
  94.   #--------------------------------------------------------------------------
  95.   # ● 创建命令窗口
  96.   #--------------------------------------------------------------------------
  97.   alias enemy_list_create_command_window create_command_window
  98.   def create_command_window
  99.     enemy_list_create_command_window
  100.     @command_window.set_handler(:enemy_list, method(:enemy_list_display))
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 呼叫敌人图鉴场景
  104.   #--------------------------------------------------------------------------
  105.   def enemy_list_display
  106.     SceneManager.call(Scene_List)
  107.   end
  108. end

Lv2.观梦者

梦石
0
星屑
600
在线时间
1118 小时
注册时间
2012-12-24
帖子
831
2
发表于 2018-11-17 16:21:54 | 只看该作者
本帖最后由 江户川洛奇 于 2018-11-17 16:44 编辑

不知道怎么传图片
是像附件这样的吗?
怪物说明什么的写在敌人的备注里
第一行用<note1:巴拉巴拉>
第二行用<note2:巴拉巴拉>
当然可以自己改用法啦
按A就可以切换到说明部分


核心脚本
RUBY 代码复制
  1. module Snstar
  2.   module EnemyList
  3.     # 敌人类型          0              1          2      3        4          5   
  4.     ENEMY_TYPE = ["异兽", "魔物", "精怪", "人形", "其他", "首领"]
  5.     ENEMY_TYPE_DEFAULT = 4       # 敌人的默认类型
  6.     ENCOUNTER_PERCENT = 1        # 敌人现身所提升的辨识度
  7.     DEFEAT_PERCENT = 5           # 敌人战败所提升的辨识度
  8.     TEST_PERCENT = 5             # 测试用调整的辨识度
  9.     INCLUDE_ALL_CATEGORY = true  # 是否包含“全部”类型
  10.     ALL_CATEGORY_TEXT = "全部"   # “全部”类型的文字
  11.     ENEMY_MORE_INFO_BUTTON = :X  # 显示敌人更多资讯的按键
  12.     ENEMY_MORE_INFO = true      # 是否显示更多讯息(扩充用)
  13.  
  14.     DRAW_ENEMY_ICON = false # 需要使用绘制单张图标才能使用
  15.  
  16.     # 敌人图像大小限定
  17.     ENEMY_IMAGE_MAX_WIDTH = 170  # 敌人图像宽度限定
  18.     ENEMY_IMAGE_MAX_HEIGHT = 192 # 敌人图像高度限定
  19.     ENEMY_IMAGE_FOLDER = "Graphics/EnemyImages/" # 敌人指定图像资料夹
  20.     ENEMY_HUE_SYNC_DB = false # 敌人指定图像是否使用资料库设定的色相
  21.  
  22.     # 文字设定
  23.     ENEMY_LIST_COMMAND_TEXT = "敌人图鉴" # 主选单命令用字
  24.     ENEMY_LIST_SWITCH_ID    = 0        # 主选单命令显示的控制开关
  25.     ENEMY_LIST_ENABLE_ID    = 0        # 主选单命令有效的控制开关
  26.  
  27.     ENEMY_PERCENT_VOCAB = "辨识度"   # 辨识度用字
  28.     ENEMY_PERCENT_BASE_COLOR = Color.new(0, 255, 0)#Color.new(0, 0, 0)
  29.     ENEMY_PERCENT_FILL_COLOR = Color.new(255, 255, 0)
  30.     NO_DISPLAY_MASK = "???"         # 无法显示时的替代文字
  31.     EST_DISPLAY_MASK = "约%s"    # 显示估算数值时的文字
  32.     DROP_GOLD_VOCAB  = "携带金钱"
  33.     DROP_ITEM_VOCAB  = "掉落物"
  34.     FEA_WEAK_ELE_RATE = "弱点"    # 属性有效度 > 100% 的文字
  35.     FEA_RES_ELE_RATE  = "抵抗"    # 属性有效度 < 100% 的文字
  36.     FEA_DEBUFF_RATE   = "弱化属性"    # 弱化属性的文字
  37.     FEA_ATK_ELEMENT   = "属性"    # 攻击附带属性的文字
  38.  
  39.  
  40.     # 辨识度提升数值
  41.     PERCENTAGE_ON_ENCOUNTER = 1 # 敌人现身时提升辨识度
  42.     PERCENTAGE_ON_DEFEAT    = 5 # 敌人落败时提升辨识度
  43.  
  44.     # 辨识度显示参数数值
  45.     NAME_DISPLAY_PERC   = 1   # 名称显示百分比
  46.     HP_EST_DISPLAY_PERC = 5   # HP估算显示百分比
  47.     HP_DISPLAY_PERC     = 10  # HP显示百分比
  48.     MP_EST_DISPLAY_PERC = 10  # MP估算显示百分比
  49.     MP_DISPLAY_PERC     = 15  # MP显示百分比
  50.     ATK_DISPLAY_PERC    = 50  # 攻击力显示百分比
  51.     DEF_DISPLAY_PERC    = 50  # 防御力显示百分比
  52.     MAT_DISPLAY_PERC    = 75  # 魔法攻击显示百分比
  53.     MDF_DISPLAY_PERC    = 75  # 魔法防御显示百分比
  54.     AGI_DISPLAY_PERC    = 75  # 敏捷显示百分比
  55.     LUK_DISPLAY_PERC    = 75  # 幸运显示百分比
  56.     GOLD_DISPLAY_PERC   = 100 # 掉落金钱显示百分比
  57.     ITEM_DISPLAY_PERC   = 100 # 掉落物显示百分比
  58.     #TYPE_BOSS
  59.   end
  60. end
  61. class RPG::Enemy < RPG::BaseItem
  62.   include Snstar::EnemyList
  63.   def list_type
  64.     self.note.split(/[\r\n]+/).each{ |line|
  65.       if line =~ /\[(?:ltype) (\d+)\]/
  66.         return $1 ? $1.to_i : ENEMY_TYPE_DEFAULT
  67.       end}
  68.     return ENEMY_TYPE_DEFAULT
  69.   end
  70.   def list_image
  71.     self.note.split(/[\r\n]+/).each{ |line|
  72.       if line =~ /\[(?:limage) (\S+)\]/
  73.         return $1
  74.       end}
  75.     return nil # battler_name
  76.   end
  77.   def no_list?
  78.     self.note.split(/[\r\n]+/).each{ |line|
  79.       return true if line =~ /\[no_list\]/
  80.       }
  81.     return false
  82.   end
  83. end
  84. class Game_Party < Game_Unit
  85.   include Snstar::EnemyList
  86.   #--------------------------------------------------------------------------
  87.   # ● 初始化
  88.   #--------------------------------------------------------------------------
  89.   alias enemy_list_initialize initialize
  90.   def initialize
  91.     enemy_list_initialize
  92.     @enemy_know_percentage=[]
  93.     $data_enemies.each{ |e|
  94.       next unless e
  95.       set_enemy_percentage(e.id, 0)
  96.     }
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 设置敌人百分比
  100.   #--------------------------------------------------------------------------
  101.   def set_enemy_percentage(e_id, percentage=100)
  102.     temp_p = [[0, percentage].max ,100].min
  103.     @enemy_know_percentage[e_id] = temp_p
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 获取敌人百分比
  107.   #--------------------------------------------------------------------------
  108.   def enemy_percent(e_id)
  109.     return 0 unless seen_enemy?(e_id)
  110.     return @enemy_know_percentage[e_id]
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # ● 提升敌人百分比
  114.   #--------------------------------------------------------------------------
  115.   def see_enemy(e_id, percentage = 1)
  116.     temp_p = @enemy_know_percentage[e_id] + percentage
  117.     set_enemy_percentage(e_id, temp_p)
  118.   end
  119.   def know_enemy(e_id)
  120.     set_enemy_percentage(e_id, 100)
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● 判断是否见过敌人
  124.   #--------------------------------------------------------------------------
  125.   def seen_enemy?(e_id)
  126.     return @enemy_know_percentage[e_id] > 0
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 判断是否熟知敌人
  130.   #--------------------------------------------------------------------------
  131.   def known_enemy?(e_id, percentage=100)
  132.     return false unless seen_enemy?(e_id)
  133.     return enemy_percent(e_id) == percentage
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 战斗开始提升辨识度
  137.   #--------------------------------------------------------------------------
  138.   alias enemy_list_on_battle_start on_battle_start
  139.   def on_battle_start
  140.     enemy_list_on_battle_start
  141.     $game_troop.members.each{ |m|
  142.       e_id = m.enemy.id
  143.       see_enemy(e_id, ENCOUNTER_PERCENT)
  144.     }
  145.   end
  146. end
  147. class Game_Enemy < Game_Battler
  148.   #--------------------------------------------------------------------------
  149.   # ● 敌人战败提升辨识度
  150.   #--------------------------------------------------------------------------
  151.   alias enemy_list_perform_collapse_effect perform_collapse_effect
  152.   def perform_collapse_effect
  153.     enemy_list_perform_collapse_effect
  154.     $game_party.see_enemy(@enemy_id, Snstar::EnemyList::DEFEAT_PERCENT)
  155.   end
  156. end
  157. class Game_Interpreter
  158.   #--------------------------------------------------------------------------
  159.   # ● 呼叫敌人图鉴场景
  160.   #--------------------------------------------------------------------------
  161.   def call_enemy_list
  162.     SceneManager.call(Scene_List)
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # ● 提升敌人辨识度
  166.   #--------------------------------------------------------------------------
  167.   def gain_enemy_percentage(e_id, per)
  168.     $game_party.see_enemy(e_id, per)
  169.   end
  170. end


窗口部分
RUBY 代码复制
  1. class Window_EnemyType < Window_HorzCommand
  2.   include Snstar::EnemyList
  3.   #--------------------------------------------------------------------------
  4.   # ● 初始化
  5.   #--------------------------------------------------------------------------
  6.   def initialize(x, y, min_height=48)
  7.     super(x, y)
  8.     @min_height = min_height
  9.     @max_height = window_height
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 定义窗口宽度
  13.   #--------------------------------------------------------------------------
  14.   def window_width
  15.     Graphics.width
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 定义栏数
  19.   #--------------------------------------------------------------------------
  20.   def col_max
  21.     return 6
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 窗口更新
  25.   #--------------------------------------------------------------------------
  26.   def update
  27.     super
  28.     @item_window.category = current_symbol if @item_window
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 绘制敌人类型列表
  32.   #--------------------------------------------------------------------------
  33.   def make_command_list
  34.     add_command(ALL_CATEGORY_TEXT, :all) if INCLUDE_ALL_CATEGORY
  35.     ENEMY_TYPE.each{ |type|
  36.       add_command(type, type.to_sym)
  37.     }
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 设置敌人列表窗口
  41.   #--------------------------------------------------------------------------
  42.   def item_window=(item_window)
  43.     @item_window = item_window
  44.     update
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 窗口有效化
  48.   #--------------------------------------------------------------------------
  49.   def activate
  50.     super
  51.     return unless @max_height
  52.     self.height = @max_height
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● 窗口失效
  56.   #--------------------------------------------------------------------------
  57.   def deactivate
  58.     super
  59.     return unless @min_height
  60.     self.height = @min_height
  61.     @item_window.select_last_index
  62.   end
  63. end
  64. class Window_EnemyList < Window_ItemList
  65.   include Snstar::EnemyList
  66.   #--------------------------------------------------------------------------
  67.   # ● 初始化
  68.   #--------------------------------------------------------------------------
  69.   def initialize(x, y, width, height)
  70.     super(x, y, width, height)
  71.     @last_index = {}
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 选择上次索引
  75.   #--------------------------------------------------------------------------
  76.   def select_last_index
  77.     select(@last_index[@category])
  78.   end
  79.   def select(index)
  80.     super(index)
  81.     @info_window.enemy = @data[@index]
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 窗口失效
  85.   #--------------------------------------------------------------------------
  86.   def deactivate
  87.     super
  88.     return unless @last_index
  89.     @last_index[@category] = @index # 纪录当前敌人类型的索引
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ● 最大栏数
  93.   #--------------------------------------------------------------------------
  94.   def col_max
  95.     return 1
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 生成敌人列表
  99.   #--------------------------------------------------------------------------
  100.   def make_item_list
  101.     @data = []
  102.     @last_index[@category] = 0 if @last_index[@category].nil?
  103.     selected_type = ENEMY_TYPE.index(@category.to_s)
  104.     $data_enemies.each{ |enemy|
  105.       next if enemy.nil?
  106.       next if enemy.name == "" # 名字为空的敌人跳过
  107.       next if enemy.no_list? # 指定不列入的敌人跳过
  108.       if @category == :all or (enemy.list_type == selected_type)
  109.         @data.push(enemy)
  110.       end
  111.     }
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 绘制敌人项目
  115.   #--------------------------------------------------------------------------
  116.   def draw_item(index)
  117.     item = @data[index]
  118.     if item
  119.       rect = item_rect(index)
  120.       rect.width -= 4
  121.       draw_item_name(item, rect.x, rect.y)
  122.     end
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 绘制敌人名称
  126.   #--------------------------------------------------------------------------
  127.   def draw_item_name(item, x, y, enabled = true, width = 172)
  128.     return unless item
  129.     if DRAW_ENEMY_ICON
  130.       draw_icon(item.icon_index, x, y, enabled)
  131.       x += 24
  132.     end
  133.     change_color(normal_color, enabled)
  134.     per = $game_party.enemy_percent(item.id)
  135.     if  per >= NAME_DISPLAY_PERC
  136.       text = item.name
  137.     else
  138.       text = NO_DISPLAY_MASK
  139.     end
  140.     draw_text(x, y, width, line_height, text)
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● 资讯窗口更新
  144.   #--------------------------------------------------------------------------
  145.   def update_info
  146.     @info_window.set_item(item)
  147.   end
  148.   #--------------------------------------------------------------------------
  149.   # ● 设置资讯窗口
  150.   #--------------------------------------------------------------------------
  151.   def info_window=(info_window)
  152.     @info_window = info_window
  153.     #call_update_info
  154.   end
  155. end
  156. class Window_EnemyDetail < Window_Base
  157.   include Snstar::EnemyList
  158.   attr_reader :enemy
  159.   #--------------------------------------------------------------------------
  160.   # ● 初始化
  161.   #--------------------------------------------------------------------------
  162.   def initialize
  163.     super(160, 48, Graphics.width-160, Graphics.height-48)
  164.     @enemy = nil
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● 设置当前敌人
  168.   #--------------------------------------------------------------------------
  169.   def enemy=(e)
  170.     @enemy = e
  171.     if enemy
  172.       @percentage = $game_party.enemy_percent(e.id) # 获取当前敌人辨识度
  173.     else
  174.       @percentage = 0
  175.     end
  176.     refresh
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 检查当前辨识度百分比
  180.   #--------------------------------------------------------------------------
  181.   def checkPercent?(per)
  182.     return @percentage >= per
  183.   end
  184.   #--------------------------------------------------------------------------
  185.   # ● 窗口刷新
  186.   #--------------------------------------------------------------------------
  187.   def refresh
  188.     contents.clear
  189.     return unless @enemy # 无敌人时返回
  190.     return unless checkPercent?(NAME_DISPLAY_PERC) # 不显示名称时返回
  191.     @partial = false
  192.     draw_enemy_image(0, 0) # 绘制敌人图像
  193.     draw_background_text
  194.     draw_enemy_name(0, ENEMY_IMAGE_MAX_HEIGHT) # 绘制敌人名称
  195.     draw_enemy_features(0, ENEMY_IMAGE_MAX_HEIGHT+line_height)
  196.     draw_enemy_percentage(0, ENEMY_IMAGE_MAX_HEIGHT+line_height*5) # 绘制敌人辨识度
  197.     partial_refresh
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ● 窗口半刷新
  201.   #--------------------------------------------------------------------------
  202.   def partial_refresh
  203.     return unless @enemy # 无敌人时返回
  204.     rect = Rect.new(ENEMY_IMAGE_MAX_WIDTH+8, 0,
  205.       contents.width-(ENEMY_IMAGE_MAX_WIDTH+8), contents.height-line_height)
  206.     contents.clear_rect(rect)
  207.     if ENEMY_MORE_INFO && @partial
  208.       Sound.play_cursor
  209.       draw_other_info
  210.  
  211.       @partial = false
  212.     else
  213.       draw_enemy_hp(ENEMY_IMAGE_MAX_WIDTH+8, 0) # 绘制敌人体力
  214.        draw_enemy_mp(ENEMY_IMAGE_MAX_WIDTH+8, line_height) # 绘制敌人魔力
  215.        2.upto(7){ |n|
  216.          draw_enemy_param(ENEMY_IMAGE_MAX_WIDTH+8, line_height*n, n) # 绘制敌人能力
  217.        }
  218.        draw_enemy_gold(ENEMY_IMAGE_MAX_WIDTH+8, line_height*8) # 绘制敌人掉落金
  219.        draw_enemy_item(ENEMY_IMAGE_MAX_WIDTH+8, line_height*9) # 绘制敌人掉落物
  220.  
  221.       @partial = true
  222.     end
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● 绘制敌人特征
  226.   #--------------------------------------------------------------------------
  227.   def draw_enemy_features(x, y)
  228.     fy = y
  229.     for i in 0..4 do
  230.       feature = @enemy.features[i]
  231.       next unless feature
  232.       label, value = get_feature(feature)
  233.       next if label==""
  234.       change_color(system_color)
  235.       draw_text(x, fy, text_width(label), line_height, label)
  236.       change_color(normal_color)
  237.       draw_text(x+72, fy, text_width(value), line_height, value)
  238.       fy+=line_height
  239.     end
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ● 获取敌人特征
  243.   #--------------------------------------------------------------------------
  244.   def get_feature(feature)
  245.     code = feature.code
  246.     id = feature.data_id
  247.     value = feature.value
  248.     return "", 0 unless [11, 31].include?(code)
  249.     if code == 11
  250.       if value < 1.0
  251.         label = FEA_RES_ELE_RATE
  252.       elsif value > 1.0
  253.         label = FEA_WEAK_ELE_RATE
  254.       else
  255.         return "", 0
  256.       end
  257.       element = $data_system.elements[id]
  258.       return_value = element + " #{value.truncate}倍"
  259.     elsif code == 31
  260.       label = FEA_ATK_ELEMENT
  261.       return_value = $data_system.elements[id]
  262.     end
  263.     return label, return_value
  264.   end
  265.   #--------------------------------------------------------------------------
  266.   # ● 绘制敌人图像
  267.   #--------------------------------------------------------------------------
  268.   def draw_enemy_image(x, y)
  269.     image_name = @enemy.list_image # 获取指定图像
  270.     if image_name.nil? # 指定图像为空时
  271.       image = Cache.battler(@enemy.battler_name, @enemy.battler_hue) # 获取战斗图
  272.     else
  273.       hue = ENEMY_HUE_SYNC_DB ? @enemy.battler_hue : 0
  274.       image = Cache.load_bitmap(ENEMY_IMAGE_FOLDER, image_name, hue) # 获取战斗图
  275.     end
  276.  
  277.     ix = (image.width/2-ENEMY_IMAGE_MAX_WIDTH/2).abs  # 获取中心点
  278.     # 敌人图像宽度在显示范围外
  279.     if image.width > ENEMY_IMAGE_MAX_WIDTH
  280.       # 居中对齐
  281.       rx = ix
  282.       cx = x
  283.     # 敌人图像宽度在显示范围外
  284.     else
  285.       # 居中对齐
  286.       rx = 0
  287.       cx = ix
  288.     end
  289.     # 敌人图像高度在显示范围外
  290.     if image.height > ENEMY_IMAGE_MAX_HEIGHT
  291.       cy = y
  292.     # 敌人图像高度在显示范围内
  293.     else
  294.       cy = ENEMY_IMAGE_MAX_HEIGHT - image.height - 8 # 向下对齐
  295.     end
  296.     rect = Rect.new(rx, 0, ENEMY_IMAGE_MAX_WIDTH, ENEMY_IMAGE_MAX_HEIGHT)
  297.     contents.blt(cx, cy, image, rect, 255)
  298.   end
  299.   #--------------------------------------------------------------------------
  300.   # ● 绘制敌人辨识度
  301.   #--------------------------------------------------------------------------
  302.   def draw_enemy_percentage(x, y)
  303.     width = contents.width
  304.     change_color(system_color)
  305.     text = ENEMY_PERCENT_VOCAB
  306.     draw_text(x, y, text_width(text), line_height, text)
  307.     # 绘制辨识度进度槽
  308.     draw_gauge(x+96, y, width - 96, @percentage.to_f/100,
  309.       ENEMY_PERCENT_BASE_COLOR, ENEMY_PERCENT_FILL_COLOR)
  310.     # 绘制百分比
  311.     change_color(normal_color)
  312.     text = "#{@percentage}%"
  313.     draw_text(x+96, y, text_width(text), line_height, text)
  314.   end
  315.   #--------------------------------------------------------------------------
  316.   # ● 绘制敌人名称
  317.   #--------------------------------------------------------------------------
  318.   def draw_enemy_name(x, y)
  319.     change_color(system_color)
  320.     text = "名称"
  321.     draw_text(x, y, text_width(text), line_height, text)
  322.     # 绘制名称
  323.     change_color(normal_color)
  324.     text = @enemy.name
  325.     draw_text(x+72, y, text_width(text), line_height, text)
  326.   end
  327.   #--------------------------------------------------------------------------
  328.   # ● 绘制敌人体力
  329.   #--------------------------------------------------------------------------
  330.   def draw_enemy_hp(x, y)
  331.     change_color(system_color)
  332.     text = Vocab::hp
  333.     draw_text(x, y, 108, line_height, text)
  334.     change_color(normal_color)
  335.     hp = @enemy.params[0]
  336.     # 判断显示百分比
  337.     if checkPercent?(HP_DISPLAY_PERC)
  338.       text = hp
  339.     elsif checkPercent?(HP_EST_DISPLAY_PERC)
  340.       # 计算体力约值
  341.       ahp = [(hp/10) * 10 - @enemy.params[3], 10].max
  342.       text = sprintf(EST_DISPLAY_MASK, ahp)
  343.     else
  344.       text = NO_DISPLAY_MASK
  345.     end
  346.     draw_text(x+72, y, text_width(text), line_height, text)
  347.   end
  348.   #--------------------------------------------------------------------------
  349.   # ● 绘制敌人魔力
  350.   #--------------------------------------------------------------------------
  351.   def draw_enemy_mp(x, y)
  352.     change_color(system_color)
  353.     text = Vocab::mp
  354.     draw_text(x, y, 108, line_height, text)
  355.     change_color(normal_color)
  356.     mp = @enemy.params[1]
  357.     # 判断显示百分比
  358.     if checkPercent?(MP_DISPLAY_PERC)
  359.       text = mp
  360.     elsif checkPercent?(MP_EST_DISPLAY_PERC)
  361.       # 计算魔力约值
  362.       amp = [(mp/10) * 10 - @enemy.params[5], @enemy.params[4], 5].max
  363.       text = sprintf(EST_DISPLAY_MASK, amp)
  364.     else
  365.       text = NO_DISPLAY_MASK
  366.     end
  367.     draw_text(x+72, y, text_width(text), line_height, text)
  368.   end
  369.   #--------------------------------------------------------------------------
  370.   # ● 绘制敌人能力值
  371.   #--------------------------------------------------------------------------
  372.   def draw_enemy_param(x, y, param_id)
  373.     # 能力值ID为1或2时,调用绘制体力/魔力方法
  374.     draw_enemy_hp(x, y) if param_id==0
  375.     draw_enemy_mp(x, y) if param_id==1
  376.     return if param_id < 2
  377.     change_color(system_color)
  378.     # 绘制能力值名称
  379.     draw_text(x, y, 108, line_height, Vocab::param(param_id))
  380.     change_color(normal_color)
  381.     # 获取能力值百分比
  382.     param_percent = [ATK_DISPLAY_PERC, DEF_DISPLAY_PERC, MAT_DISPLAY_PERC,
  383.                      MDF_DISPLAY_PERC, AGI_DISPLAY_PERC, LUK_DISPLAY_PERC ]
  384.     # 判断显示百分比
  385.     if checkPercent?(param_percent[param_id-2])
  386.       text = @enemy.params[param_id]
  387.     else
  388.       text = NO_DISPLAY_MASK
  389.     end
  390.     draw_text(x+72, y, text_width(text), line_height, text)
  391.   end
  392.   #--------------------------------------------------------------------------
  393.   # ● 绘制敌人掉落金钱
  394.   #--------------------------------------------------------------------------
  395.   def draw_enemy_gold(x, y)
  396.     change_color(system_color)
  397.     draw_text(x, y, 96, line_height, DROP_GOLD_VOCAB)
  398.     change_color(normal_color)
  399.     # 判断显示百分比
  400.     if checkPercent?(GOLD_DISPLAY_PERC)
  401.       draw_currency_value(@enemy.gold, Vocab.currency_unit, x+12, y, 108)
  402.     else
  403.       draw_text(x+72, y, 96, line_height, NO_DISPLAY_MASK)
  404.     end
  405.   end
  406.   #--------------------------------------------------------------------------
  407.   # ● 绘制敌人掉落物
  408.   #--------------------------------------------------------------------------
  409.   def draw_enemy_item(x, y)
  410.     change_color(system_color)
  411.     draw_text(x, y, 96, line_height, DROP_ITEM_VOCAB)
  412.     change_color(normal_color)
  413.     # 判断显示百分比
  414.     if checkPercent?(ITEM_DISPLAY_PERC)
  415.       nn_di = 0
  416.       for i in 0..2 do
  417.         di = item_object(@enemy.drop_items[i]) # 获取掉落物物件
  418.         if di
  419.           ly = y+line_height*(nn_di+1) # 计算绘制高度
  420.           draw_item_name(di, x+24, ly)
  421.           nn_di += 1 # 计数器+1
  422.         end
  423.       end
  424.       return if nn_di > 0 # 计数器大于0时返回
  425.       draw_text(x+80, y, 96, line_height, "无")
  426.     else
  427.       draw_text(x+24, y+line_height, 96, line_height, NO_DISPLAY_MASK)
  428.     end
  429.   end
  430.   #--------------------------------------------------------------------------
  431.   # ● 计算敌人掉落物
  432.   #--------------------------------------------------------------------------
  433.   def item_object(drop_item)
  434.     kind = drop_item.kind
  435.     data_id = drop_item.data_id
  436.     return $data_items  [data_id] if kind == 1
  437.     return $data_weapons[data_id] if kind == 2
  438.     return $data_armors [data_id] if kind == 3
  439.     return nil
  440.   end
  441.   #--------------------------------------------------------------------------
  442.   # ● 绘制敌人简介
  443.   #--------------------------------------------------------------------------
  444.   def draw_other_info
  445.     if checkPercent?(NAME_DISPLAY_PERC)
  446.     x = 200
  447.       y = 0
  448.       e_na = $1.to_s if enemy.note =~ /<note1:\s*(.*?)>/i
  449.       e_nb = $1.to_s if enemy.note =~ /<note2:\s*(.*?)>/i
  450.       e_nc = $1.to_s if enemy.note =~ /<note3:\s*(.*?)>/i
  451.       e_nd = $1.to_s if enemy.note =~ /<note4:\s*(.*?)>/i
  452.       e_ne = $1.to_s if enemy.note =~ /<note5:\s*(.*?)>/i
  453.       e_nf = $1.to_s if enemy.note =~ /<note6:\s*(.*?)>/i
  454.       change_color(system_color)
  455.       draw_text(x, y, 500, line_height, "简介:")
  456.       change_color(normal_color)
  457.       draw_text(x+46, y + line_height * 0, 500, line_height, e_na)
  458.       draw_text(x,    y + line_height * 1, 500, line_height, e_nb)
  459.       draw_text(x,    y + line_height * 2, 500, line_height, e_nc)
  460.       draw_text(x,    y + line_height * 3, 500, line_height, e_nd)
  461.       draw_text(x,    y + line_height * 4, 500, line_height, e_ne)
  462.       draw_text(x,    y + line_height * 5, 500, line_height, e_nf)
  463.     end
  464.   end
  465.   #--------------------------------------------------------------------------
  466.   # ● 绘制提示
  467.   #--------------------------------------------------------------------------
  468.   def draw_background_text
  469.     draw_text(0, 0, 500, line_height, "A键切换")
  470.   end
  471.   #--------------------------------------------------------------------------
  472.   # ● 获得文字宽度
  473.   #--------------------------------------------------------------------------
  474.   def text_width(text)
  475.     return text_size(text).width + 5
  476.   end
  477. end



场景部分
RUBY 代码复制
  1. class Scene_List < Scene_Base
  2.   include Snstar::EnemyList
  3.   #--------------------------------------------------------------------------
  4.   # ● 场景开始
  5.   #--------------------------------------------------------------------------
  6.   def start
  7.     super
  8.     create_category_window
  9.     create_list_window
  10.     create_detail_window
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 创建敌人类型窗口
  14.   #--------------------------------------------------------------------------
  15.   def create_category_window
  16.     @category_window = Window_EnemyType.new(0, 0)
  17.     @category_window.set_handler(:ok,     method(:on_category_ok))
  18.     @category_window.set_handler(:cancel, method(:return_scene))
  19.     @category_window.viewport = @viewport
  20.   end
  21.   #--------------------------------------------------------------------------
  22.   # ● 创建敌人列表窗口
  23.   #--------------------------------------------------------------------------
  24.   def create_list_window
  25.     @list_window = Window_EnemyList.new(0, 48, 160, Graphics.height-48)
  26.     @list_window.set_handler(:cancel, method(:on_list_cancel))
  27.     @list_window.viewport = @viewport
  28.     @category_window.item_window = @list_window
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 创建敌人讯息窗口
  32.   #--------------------------------------------------------------------------
  33.   def create_detail_window
  34.     @detail_window = Window_EnemyDetail.new
  35.     @list_window.info_window = @detail_window
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 选择类型完成
  39.   #--------------------------------------------------------------------------
  40.   def on_category_ok
  41.     @list_window.activate
  42.     @list_window.select_last
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 离开敌人列表
  46.   #--------------------------------------------------------------------------
  47.   def on_list_cancel
  48.     @list_window.unselect
  49.     @category_window.activate
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ● 场景更新
  53.   #--------------------------------------------------------------------------
  54.   def update
  55.     super
  56.     on_list_partial_refersh if Input.trigger?(ENEMY_MORE_INFO_BUTTON)
  57.     enemy_percent_change(:left) if Input.trigger?(:LEFT)
  58.     enemy_percent_change(:right) if Input.trigger?(:RIGHT)
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 敌人讯息半刷新
  62.   #--------------------------------------------------------------------------
  63.   def on_list_partial_refersh
  64.     @detail_window.partial_refresh
  65.   end
  66.   #--------------------------------------------------------------------------
  67.   # ● 更改敌人辨识度百分比(仅游戏测试时可用)
  68.   #--------------------------------------------------------------------------
  69.   def enemy_percent_change(sym)
  70.     return unless $TEST
  71.     return unless @list_window.active
  72.     enemy = @detail_window.enemy
  73.     return unless enemy
  74.     $game_party.see_enemy(enemy.id, TEST_PERCENT) if sym == :right
  75.     $game_party.see_enemy(enemy.id, -TEST_PERCENT) if sym == :left
  76.     @list_window.refresh
  77.     @detail_window.enemy = enemy
  78.   end
  79. end
  80. class Window_MenuCommand < Window_Command
  81.   include Snstar::EnemyList
  82.   #--------------------------------------------------------------------------
  83.   # ● 加入敌人图鉴命令
  84.   #--------------------------------------------------------------------------
  85.   alias enemy_list_add_original_commands add_original_commands
  86.   def add_original_commands
  87.     enemy_list_add_original_commands
  88.     return unless ENEMY_LIST_SWITCH_ID==0 || $game_switches[ENEMY_LIST_SWITCH_ID]
  89.     enabled = ENEMY_LIST_ENABLE_ID == 0 || $game_switches[ENEMY_LIST_ENABLE_ID]
  90.     add_command(ENEMY_LIST_COMMAND_TEXT, :enemy_list, enabled)
  91.   end
  92. end
  93. class Scene_Menu < Scene_MenuBase
  94.   #--------------------------------------------------------------------------
  95.   # ● 创建命令窗口
  96.   #--------------------------------------------------------------------------
  97.   alias enemy_list_create_command_window create_command_window
  98.   def create_command_window
  99.     enemy_list_create_command_window
  100.     @command_window.set_handler(:enemy_list, method(:enemy_list_display))
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 呼叫敌人图鉴场景
  104.   #--------------------------------------------------------------------------
  105.   def enemy_list_display
  106.     SceneManager.call(Scene_List)
  107.   end
  108. end









另外还有一个是根据角色图鉴改的,没那么方便使用就是了

OW[H{668WPR1FA(8W)@YO4N.png (71.17 KB, 下载次数: 25)

OW[H{668WPR1FA(8W)@YO4N.png

IRBCOFIT~_R3Q9~`F[W%FP3.png (73.21 KB, 下载次数: 21)

IRBCOFIT~_R3Q9~`F[W%FP3.png

RJX$L]1GCQ]6_E]2MWNXL}F.png (360.16 KB, 下载次数: 20)

RJX$L]1GCQ]6_E]2MWNXL}F.png

评分

参与人数 1星屑 +20 收起 理由
VIPArcher + 20 认可答案

查看全部评分


点击签名档去一个神奇的地方
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
239
在线时间
33 小时
注册时间
2018-11-9
帖子
12
3
 楼主| 发表于 2018-11-17 17:24:33 | 只看该作者
江户川洛奇 发表于 2018-11-17 16:21
不知道怎么传图片
是像附件这样的吗?
怪物说明什么的写在敌人的备注里

没错,效果达到了,感谢大佬!

点评

我不是大佬a  发表于 2018-11-19 10:14
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
239
在线时间
33 小时
注册时间
2018-11-9
帖子
12
4
 楼主| 发表于 2018-11-17 17:39:17 | 只看该作者
江户川洛奇 发表于 2018-11-17 16:21
不知道怎么传图片
是像附件这样的吗?
怪物说明什么的写在敌人的备注里

另外,萌新可以再问你两个问题吗?第一个是破限插件的问题,插件里都改了最大值是几万,但像攻击、防御等在数据库里都只能是999,这是我使用的方法不对吗?第二个问题是,怎么才能够把比如10000金币显示成1w,1000血量显示成1k这种……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
30
在线时间
2 小时
注册时间
2019-4-2
帖子
1
5
发表于 2019-4-2 16:50:17 | 只看该作者
江户川洛奇 发表于 2018-11-17 16:21
不知道怎么传图片
是像附件这样的吗?
怪物说明什么的写在敌人的备注里

前辈,想请问一下,这个脚本使用之后,可简介里根本还是一片空白,就是这个情况。
简介:
然而,对应的怪物备注里面其实是有内容的,但哪怕辨识度到100,简介依然是空的,请问怎么回事?
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
50 小时
注册时间
2021-8-10
帖子
7
6
发表于 2021-9-20 14:40:40 | 只看该作者
江户川洛奇 发表于 2018-11-17 16:21
不知道怎么传图片
是像附件这样的吗?
怪物说明什么的写在敌人的备注里

为啥我按A键没有用啊
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
390
在线时间
50 小时
注册时间
2021-8-10
帖子
7
7
发表于 2021-9-20 14:44:15 | 只看该作者
江户川洛奇 发表于 2018-11-17 16:21
不知道怎么传图片
是像附件这样的吗?
怪物说明什么的写在敌人的备注里

自己解决了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1914
在线时间
211 小时
注册时间
2009-11-10
帖子
234
8
发表于 2022-1-7 13:52:24 | 只看该作者

请问这个图鉴 里面 EnemyImages 这个文件夹 里 的图片要怎么编辑名字 才能用到啊.
因为 我的横版战斗是用敌人的行走图  当做战斗图用 所以 我的Battlers 文件夹里都是行走图。
所以造成 怪物图鉴里显示的是行走图。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-25 07:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表