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

Project1

 找回密码
 注册会员
搜索
查看: 3792|回复: 14

[原创发布] 初来乍到,贡献一个自制的怪物手册脚本

[复制链接]

Lv2.观梦者

梦石
0
星屑
735
在线时间
42 小时
注册时间
2019-11-26
帖子
28
发表于 2019-11-27 15:28:37 | 显示全部楼层 |阅读模式

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

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

x
比较原始哈,是我做着玩的一个小游戏的脚本。
初来乍到,算是给大家的一点见面礼~

  1. #-----------------------------------------------------
  2. #Author: xsrong
  3. #
  4. #支持在信息中添加怪物的简介。在数据库敌人标签卡中对应的怪物的备注中以
  5. #<ENEMY_INFO 简介内容>#标注敌人的简介文字
  6. #例:<ENEMY_INFO 史莱姆性情温顺,通常不会主动攻击人类。>
  7. #
  8. #支持显示自定义属性值。
  9. #在数据库敌人标签卡中对应的怪物的备注中将需要显示的自定义属性以
  10. #<属性名 属性值>的形式记录。然后搜索ADD_STATUS,向里面增加需要显示的属性的中
  11. #文名称。搜索ADD_PARAMS,向里面增加怪物备注中记录的属性名
  12. #例子可以参考代码中的“测试属性值”
  13. #
  14. #本脚本增加了$game_defeate_enemies全局变量
  15. #$game_defeate_enemies是初始值为0的整数型数组,数组下标为敌人的id,值为击败该敌人的数量
  16. #如$game_defeate_enemies[1]即为击败id为1的敌人的数量
  17. #-----------------------------------------------------

  18. # 向菜单栏中增加【怪物手册】的选项
  19. class Window_MenuCommand
  20.   ENEMY_MANUAL = "怪物手册"
  21.   alias xsrong_add_original_commands add_original_commands
  22.   def add_original_commands
  23.     xsrong_add_original_commands
  24.     add_command(ENEMY_MANUAL, :enemy_manual)
  25.   end
  26. end

  27. # 增加选择【怪物手册】后的动作
  28. class Scene_Menu
  29.   alias xsrong_create_command_window create_command_window
  30.   def create_command_window
  31.     xsrong_create_command_window
  32.     @command_window.set_handler(:enemy_manual, method(:command_enemy_manual))
  33.   end
  34.   
  35.   #切换到【怪物手册】的场景
  36.   def command_enemy_manual
  37.     SceneManager.call(Scene_Enemy_Manual)
  38.   end
  39. end

  40. # 定义【怪物手册】的场景
  41. class Scene_Enemy_Manual < Scene_MenuBase
  42.   def start
  43.     super
  44.     # 增加怪物清单的选择窗口
  45.     @enemy_manual_list_window = Window_Enemy_Manual_List.new
  46.     @enemy_manual_list_window.set_handler(:enemy_status, method(:on_enemy_status))
  47.     @enemy_manual_list_window.set_handler(:cancel, method(:return_scene))
  48.    
  49.     # 增加显示怪物信息的窗口
  50.     @enemy_manual_status_window = Window_Enemy_Manual_Status.new
  51.    
  52.     # 将增加的两个窗口之间关联起来
  53.     @enemy_manual_list_window.help_window = @enemy_manual_status_window
  54.     @enemy_manual_status_window.main_window = @enemy_manual_list_window
  55.   end
  56.   
  57.   # 怪物图册中按下确定,激活显示怪物信息的窗口
  58.   def on_enemy_status
  59.     @enemy_manual_list_window.deactivate
  60.     @enemy_manual_status_window.activate
  61.   end
  62. end

  63. # 定义显示怪物信息的窗口
  64. class Window_Enemy_Manual_Status < Window_Base
  65.   attr_accessor :main_window
  66.   # 以下两个常量用来表示怪物的自定义属性,使用方法见初始注释
  67.   ADD_STATUS = ["测试属性值:"]
  68.   ADD_PARAMS= ["TEST"]
  69.   
  70.   # 窗口的初始化
  71.   # @offset_y 表示窗口内容的y坐标的修正值,用以实现通过上下方向键滚动窗口内容。
  72.   # @info_arr 保存怪物简介文字的数组,用来实现内容换行
  73.   def initialize
  74.     super(Graphics.width / 3, 0, Graphics.width / 3 * 2, Graphics.height)
  75.     @offset_y = 0
  76.     @info_arr = []
  77.     @status_name = ["体力上限:", "魔力上限:", "物理攻击:", "物理防御:", "魔法攻击:", "魔法防御:", "敏捷值:", "幸运值:"]
  78.     @status_name += ADD_STATUS
  79.     # @status_name = ["击倒次数:"] + @status_name   # 取消注释后可在怪物手册中显示击倒该怪物的数量
  80.     deactivate
  81.   end
  82.   
  83.   # 向该窗口中写入查看的怪物的具体信息
  84.   def set_enemy_status(enemy)
  85.     if @enemy != enemy
  86.       @enemy = enemy
  87.       refresh
  88.     end
  89.   end
  90.   
  91.   # 清空窗口中现有的内容
  92.   def clear
  93.     set_enemy_status(nil)
  94.   end
  95.   
  96.   # 向窗口中写入怪物手册的总览内容
  97.   def draw_totle_info
  98.     defeated_enemies = []
  99.     defeated_enemies_count = 0
  100.     $game_defeated_enemies.each do |e|
  101.       defeated_enemies << e if e != 0
  102.       defeated_enemies_count += e
  103.     end
  104.     draw_text_ex(0, line_height * 0, "击倒达成率:" + (defeated_enemies.length.to_f / ($data_enemies.length - 1).to_f * 100).round(2).to_s + "%")
  105.     draw_text_ex(0, line_height * 1, "击倒怪物种类数:" + defeated_enemies.length.to_s + "/" + ($data_enemies.length - 1).to_s)
  106.     draw_text_ex(0, line_height * 2, "击倒怪物数量:" + defeated_enemies_count.to_s)
  107.   end
  108.   
  109.   # 绘制怪物简介的文字
  110.   def draw_enemy_info
  111.     if @enemy
  112.       @info_arr = []
  113.       info = /<ENEMY_INFO\s*(.+)>/ =~ @enemy.note ? $1 : ""
  114.       while info != ""
  115.         @info_arr << info[0..13]
  116.         info[0..13] = ""
  117.       end
  118.       for i in 0..@info_arr.length - 1
  119.         draw_text_ex(0, (i + 3 + @status_name.length) * line_height - @offset_y, @info_arr[i])
  120.       end
  121.     end
  122.   end
  123.   
  124.   # 绘制怪物的名字
  125.   def draw_enemy_name
  126.     draw_text_ex(0, -@offset_y, @enemy.name) if @enemy
  127.   end
  128.   
  129.   # 绘制怪物的各项属性
  130.   def draw_enemy_params
  131.     if @enemy
  132.       add_params = []
  133.       ADD_PARAMS.each do |param|
  134.         param = "<" + param + "\\s*(.+)>"
  135.         p = Regexp.new(param) =~ @enemy.note ? $1 : ""
  136.         add_params << p
  137.       end
  138.       params = @enemy.params
  139.       params += add_params
  140.       params_max_text_length = 0
  141.       @status_name.each do |sn|
  142.         params_max_text_length = sn.length if sn.length > params_max_text_length
  143.       end
  144.       # params = [$game_defeated_enemies[@enemy.id]] + params # 取消注释后可在怪物手册中显示击倒该怪物的数量
  145.       for i in 0..params.length - 1
  146.         draw_text_ex(0, (i + 2) * line_height - @offset_y, @status_name[i])
  147.         draw_text_ex(params_max_text_length * 23, (i + 2) * line_height - @offset_y, params[i])
  148.       end
  149.     end        
  150.   end
  151.   
  152.   # 实际绘制窗口的内容
  153.   def draw_enemy_status
  154.     if @enemy
  155.       if $game_defeated_enemies[@enemy.id] != 0  # 曾击败过该敌人则显示敌人的具体信息
  156.         draw_enemy_name
  157.         draw_enemy_params
  158.         draw_enemy_info
  159.       else
  160.         draw_text_ex(0, 0, "??????") # 未曾击败过该敌人则以??????代替敌人的具体信息
  161.       end
  162.     end
  163.   end
  164.   
  165.   # 增加该窗口的按键方法
  166.   def update
  167.     super
  168.     if Input.trigger?(:B)
  169.       @offset_y = 0
  170.       deactivate
  171.       @main_window.activate
  172.     end
  173.    
  174.     if Input.repeat?(:DOWN) && self.active
  175.       scroll_down
  176.       refresh
  177.     end
  178.    
  179.     if Input.repeat?(:UP) && self.active
  180.       scroll_up
  181.       refresh
  182.     end
  183.    
  184.   end
  185.   
  186.   def scroll_down
  187.     @offset_y += line_height if @offset_y < (@info_arr.length + @status_name.length - 13) * line_height
  188.   end
  189.   
  190.   def scroll_up
  191.     @offset_y -= line_height if @offset_y > 0
  192.   end
  193.   
  194.   def refresh
  195.     contents.clear
  196.     draw_enemy_status
  197.   end

  198. end

  199. # 定义显示敌人清单的窗口
  200. class Window_Enemy_Manual_List < Window_Command
  201.   def initialize
  202.     super(0, 0)
  203.   end
  204.   
  205.   def window_width
  206.     return Graphics.width / 3
  207.   end
  208.   
  209.   def window_height
  210.     return Graphics.height
  211.   end
  212.   
  213.   # 增加敌人清单窗口中的各个敌人选项
  214.   def make_command_list
  215.     add_command("手册总览", :all, true)
  216.     $data_enemies.each do |enemy|
  217.       if enemy
  218.         if $game_defeated_enemies[enemy.id] == 0   # 从未击败过该敌人时
  219.           add_command("???", :enemy_status, false) # 敌人的名字以???代替
  220.         else
  221.           add_command(enemy.name, :enemy_status, true) # 如击败过该敌人则显示敌人的真实名字
  222.         end
  223.       end
  224.     end
  225.   end
  226.   
  227.   # 更新显示敌人信息窗口中的内容
  228.   def update_help
  229.     super
  230.     if index > 0
  231.       enemy = $data_enemies[index]
  232.       @help_window.set_enemy_status(enemy)
  233.     else
  234.       @help_window.draw_totle_info
  235.     end
  236.   end
  237. end

  238. # 为Gmae_Troop类增加了统计在战斗中打败的怪物的方法,并在战斗胜利后调用该方法
  239. class Game_Troop  
  240.   def defeated_members
  241.     dead_members.inject([]) {|r, enemy| r += [enemy.enemy_id]}
  242.   end
  243. end

  244. module BattleManager
  245.   # 修改全局变量$game_defeated_enemies,将战斗中击倒过的怪物对应的数量+1
  246.   def self.gain_defeated_enemies
  247.     $game_troop.defeated_members.each do |enemy_id|
  248.       $game_defeated_enemies[enemy_id] += 1
  249.     end
  250.   end
  251.   
  252.   # 修改战斗胜利后的处理,增加调用gain_defeated_enemies,实现战斗胜利后增加击倒过的怪物数量
  253.   BattleManager.singleton_class.send(:alias_method, :xsrong_process_victory, :process_victory)
  254.   def self.process_victory
  255.     gain_defeated_enemies
  256.     xsrong_process_victory
  257.   end
  258. end

  259. module DataManager
  260.   # 开始新游戏时增加$game_defeated_enemies变量
  261.   DataManager.singleton_class.send(:alias_method, :xsrong_create_game_objects, :create_game_objects)
  262.   def self.create_game_objects
  263.     xsrong_create_game_objects
  264.     $game_defeated_enemies = Array.new($data_enemies.length){0}
  265.   end
  266.   
  267.   # 存档时保存$game_defeated_enemies变量
  268.   DataManager.singleton_class.send(:alias_method, :xsrong_make_save_contents, :make_save_contents)
  269.   def self.make_save_contents
  270.     contents = xsrong_make_save_contents
  271.     contents[:defeated_enemies] = $game_defeated_enemies
  272.     contents
  273.   end
  274.   
  275.   # 读档时读取$game_defeated_enemies变量
  276.   DataManager.singleton_class.send(:alias_method, :xsrong_extract_save_contents, :extract_save_contents)
  277.   def self.extract_save_contents(contents)
  278.     xsrong_extract_save_contents(contents)
  279.     $game_defeated_enemies = contents[:defeated_enemies]
  280.   end
  281. end
复制代码

评分

参与人数 1星屑 +300 收起 理由
VIPArcher + 300 原创发布

查看全部评分

Lv4.逐梦者 (版主)

漾夕☽星化残月☾

梦石
0
星屑
8447
在线时间
3845 小时
注册时间
2015-5-12
帖子
2076

剧作品鉴家

发表于 2019-11-28 11:29:12 | 显示全部楼层
欢迎欢迎呀。
又有嗷嗷待哺的大大来照顾小雏鸡了。

脚本的使用版权方面的事情要不要做个声明呢
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
139
在线时间
19 小时
注册时间
2019-11-19
帖子
41
发表于 2019-11-28 11:42:29 | 显示全部楼层
欢迎大佬加入
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2080
在线时间
195 小时
注册时间
2019-10-1
帖子
37
发表于 2019-12-8 15:52:19 | 显示全部楼层
在备注里写简介?怎么不显示啊
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1236
在线时间
221 小时
注册时间
2018-8-27
帖子
84
发表于 2019-12-8 17:34:22 | 显示全部楼层
大佬有没有做过探索到的发现物收集的插件啊?
《大理段素义游记》填坑中...
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
735
在线时间
42 小时
注册时间
2019-11-26
帖子
28
 楼主| 发表于 2019-12-9 11:53:21 | 显示全部楼层
an2chun7 发表于 2019-12-8 15:52
在备注里写简介?怎么不显示啊

可以发个截图给我看看你怎么设置的么?
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
735
在线时间
42 小时
注册时间
2019-11-26
帖子
28
 楼主| 发表于 2019-12-9 11:54:11 | 显示全部楼层
MichaelPolo 发表于 2019-12-8 17:34
大佬有没有做过探索到的发现物收集的插件啊?

我只是个菜渣……
你说的脚本我没有写过,不过用这个脚本改一改应该可以实现的 吧……
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2080
在线时间
195 小时
注册时间
2019-10-1
帖子
37
发表于 2019-12-10 21:50:31 | 显示全部楼层
就是这个样子。我好笨,求指导
QQ截图20191210214047.png
QQ截图20191210214548.png
回复 支持 1 反对 0

使用道具 举报

Lv2.观梦者

梦石
0
星屑
735
在线时间
42 小时
注册时间
2019-11-26
帖子
28
 楼主| 发表于 2019-12-10 22:36:00 | 显示全部楼层
an2chun7 发表于 2019-12-10 21:50
就是这个样子。我好笨,求指导

<ENEMY_INFO XXXXX>
不是<ENEMY_INF3 XXXXX>
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2080
在线时间
195 小时
注册时间
2019-10-1
帖子
37
发表于 2019-12-11 22:48:59 | 显示全部楼层

啊谢谢呐,还有测试属性值那个是做什么用的,那一行能不能去掉?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 04:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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