幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1818|回复: 8

[RMVX] [求助]通过武器熟练度获得技能的方法

[复制链接]

1

主题

3

帖子

35

积分

②入门

积分
35
发表于 2007-5-27 17:31:50 | 显示全部楼层 |阅读模式
请教下各位大大,想通过武器熟练度获得技能,类似于FFTA那样的,该怎么做呢?
回复

使用道具 举报

38

主题

3468

帖子

1

积分

超级版主

传说中的Bunny火神~!

Rank: 8Rank: 8

积分
1
发表于 2007-5-27 22:25:29 | 显示全部楼层
首先要先能获得武器的熟练度,这个好像有在日站见到过脚本,不过没有研究过……只要有了那个熟练度,就可以在关于角色习得技能的地方修改了。
我突然发现,我是一个很幸运的好人。老婆真好~ 点我进入JQ(激情)教程范例收集!
回复 支持 反对

使用道具 举报

550

主题

9117

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-5-27 22:29:46 | 显示全部楼层
个人的想法用split分割熟练度。。。。然后写个module  OK了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

35

积分

②入门

积分
35
 楼主| 发表于 2007-5-28 17:06:45 | 显示全部楼层
脚本.....没有编程基础不会弄的说....[s:6]
在66上找到这样个脚本
  1. #=======================================================
  2. module RPG
  3.   class Armor
  4.     def name
  5.       name = @name.split(/@/)[0]
  6.       return name != nil ? name : ''
  7.     end
  8.     def sk_exp
  9.       exp = @name.split(/@/)[1]
  10.       return exp != nil ? exp.to_i : 0
  11.     end
  12.     def sk_id
  13.       id = @name.split(/,/)[1]
  14.       return id != nil ? id.to_i : 0
  15.     end
  16.   end
  17. end
  18. class Game_Actor < Game_Battler
  19.    attr_accessor :ap     
  20.    attr_accessor :svap   
  21.   #---------------------------------------------------
  22.   # ● 设置
  23.   #     actor_id : 角色 ID
  24.   #---------------------------------------------------
  25.   alias old_setup setup
  26.   def setup(actor_id)
  27.     old_setup(actor_id)
  28.     @ap = 0
  29.     @svap = {}
  30.   end
  31. end
  32. #=======================================================
  33. # ■ Window_EquipRight
  34. #-------------------------------------------------------
  35. #  装备画面、显示角色现在装备的物品的窗口。
  36. #=======================================================
  37. class Window_EquipRight < Window_Selectable
  38.   #---------------------------------------------------
  39.   # ● 初始化对像
  40.   #     actor : 角色
  41.   #---------------------------------------------------
  42.   def initialize(actor)
  43.     super(272, 64, 368, 192)
  44.     self.contents = Bitmap.new(width - 32, height - 32)
  45.     @actor = actor
  46.     refresh
  47.     self.index = 0
  48.   end
  49.   #---------------------------------------------------
  50.   # ● 获取物品
  51.   #---------------------------------------------------
  52.   def item
  53.     return @data[self.index]
  54.   end
  55.   #---------------------------------------------------
  56.   # ● 刷新
  57.   #---------------------------------------------------
  58.   def refresh
  59.     self.contents.clear
  60.     @data = []
  61.     @data.push($data_weapons[@actor.weapon_id])
  62.     @data.push($data_armors[@actor.armor1_id])
  63.     @data.push($data_armors[@actor.armor2_id])
  64.     @data.push($data_armors[@actor.armor3_id])
  65.     @data.push($data_armors[@actor.armor4_id])
  66.     @item_max = @data.size
  67.     self.contents.font.color = system_color
  68.     self.contents.draw_text(4, 32 * 0, 92, 32, $data_system.words.weapon)
  69.     self.contents.draw_text(4, 32 * 1, 92, 32, $data_system.words.armor1)
  70.     self.contents.draw_text(4, 32 * 2, 92, 32, $data_system.words.armor2)
  71.     self.contents.draw_text(4, 32 * 3, 92, 32, $data_system.words.armor3)
  72.     self.contents.draw_text(5, 32 * 4, 92, 32, $data_system.words.armor4)
  73.    
  74.     if @actor.armor4_id > 0
  75.     @actor.svap[$data_armors[@actor.armor4_id].id] = @actor.ap
  76.     x = 5  
  77.     y = 128
  78.    
  79.     if @actor.skill_learn?($data_armors[@actor.armor4_id].sk_id) or
  80.       @actor.ap >= $data_armors[@actor.armor4_id].sk_exp
  81.     @actor.ap = $data_armors[@actor.armor4_id].sk_exp
  82.     end
  83.   
  84.     a = Color.new(255,255,255,200)
  85.     b = Color.new(0,0,0,255)
  86.    
  87.     if $data_armors[@actor.armor4_id].sk_exp > 0
  88.     c_1 = 255 * @actor.ap / $data_armors[@actor.armor4_id].sk_exp
  89.     c = Color.new(255,255-c_1,255,200)
  90.     w = 98 * @actor.ap / $data_armors[@actor.armor4_id].sk_exp
  91.     self.contents.fill_rect(x+190, y+18, 100, 10, a)
  92.     self.contents.fill_rect(x+191, y+19, 98, 8, b)
  93.     self.contents.fill_rect(x+191, y+19, w, 8, c)
  94.     self.contents.font.size = 16
  95.     self.contents.font.color = Color.new(255,255,255,255)
  96.     self.contents.draw_text(x+150, y-6, 92, 32, "技能:",2)
  97.     self.contents.draw_text(x+250, y-6, 92, 32, $data_skills[$data_armors[@actor.armor4_id].sk_id].name)
  98.     if @actor.ap == $data_armors[@actor.armor4_id].sk_exp or @actor.skill_learn?($data_skills[$data_armors[@actor.armor4_id].sk_id])
  99.     self.contents.draw_text(x+160, y+5, 92, 32, "MAX",2)
  100.     else
  101.     self.contents.draw_text(x+135, y+5, 92, 32, @actor.ap.to_s,2)
  102.     self.contents.draw_text(x+145, y+5, 92, 32, "/",2)
  103.     self.contents.draw_text(x+170, y+5, 92, 32, $data_armors[@actor.armor4_id].sk_exp.to_s,2)
  104.   
  105.     end
  106.     end
  107.     end
  108.     self.contents.font.size = 22
  109.     draw_item_name(@data[0], 92, 32 * 0)
  110.     draw_item_name(@data[1], 92, 32 * 1)
  111.     draw_item_name(@data[2], 92, 32 * 2)
  112.     draw_item_name(@data[3], 92, 32 * 3)
  113.     draw_item_name(@data[4], 92, 32 * 4)
  114.   end
  115.   #---------------------------------------------------
  116.   # ● 刷新帮助文本
  117.   #---------------------------------------------------
  118.   def update_help
  119.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  120.   end
  121. end
  122. class Game_Battler
  123.   #---------------------------------------------------
  124.   # ● 应用通常攻击效果
  125.   #     attacker : 攻击者 (battler)
  126.   #---------------------------------------------------
  127.   def attack_effect(attacker)
  128.     # 清除会心一击标志
  129.     self.critical = false
  130.     # 第一命中判定
  131.     hit_result = (rand(100) < attacker.hit)
  132.     # 命中的情况下
  133.     if hit_result == true
  134.       # 计算基本伤害
  135.       atk = [attacker.atk - self.pdef / 2, 0].max
  136.       self.damage = atk * (20 + attacker.str) / 20
  137.       
  138.       if attacker.is_a?(Game_Actor) and attacker.armor4_id > 0
  139.       attacker.ap += self.damage / 10
  140.       if attacker.ap > $data_armors[attacker.armor4_id].sk_exp
  141.       attacker.ap = $data_armors[attacker.armor4_id].sk_exp
  142.       end  
  143.       end
  144.       
  145.       # 属性修正
  146.       self.damage *= elements_correct(attacker.element_set)
  147.       self.damage /= 100
  148.       # 伤害符号正确的情况下
  149.       if self.damage > 0
  150.         # 会心一击修正
  151.         if rand(100) < 4 * attacker.dex / self.agi
  152.           self.damage *= 2
  153.           self.critical = true
  154.         end
  155.         # 防御修正
  156.         if self.guarding?
  157.           self.damage /= 2
  158.         end
  159.       end
  160.       # 分散
  161.       if self.damage.abs > 0
  162.         amp = [self.damage.abs * 15 / 100, 1].max
  163.         self.damage += rand(amp+1) + rand(amp+1) - amp
  164.       end
  165.       # 第二命中判定
  166.       eva = 8 * self.agi / attacker.dex + self.eva
  167.       hit = self.damage < 0 ? 100 : 100 - eva
  168.       hit = self.cant_evade? ? 100 : hit
  169.       hit_result = (rand(100) < hit)
  170.     end
  171.     # 命中的情况下
  172.     if hit_result == true
  173.       # 状态冲击解除
  174.       remove_states_shock
  175.       # HP 的伤害计算
  176.       self.hp -= self.damage
  177.       # 状态变化
  178.       @state_changed = false
  179.       states_plus(attacker.plus_state_set)
  180.       states_minus(attacker.minus_state_set)
  181.     # Miss 的情况下
  182.     else
  183.       # 伤害设置为 "Miss"
  184.       self.damage = "Miss"
  185.       # 清除会心一击标志
  186.       self.critical = false
  187.     end
  188.     # 过程结束
  189.     return true
  190.   end
  191.   #---------------------------------------------------
  192.   # ● 应用特技效果
  193.   #     user  : 特技的使用者 (battler)
  194.   #     skill : 特技
  195.   #---------------------------------------------------
  196.   def skill_effect(user, skill)
  197.     # 清除会心一击标志
  198.     self.critical = false
  199.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  200.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  201.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  202.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  203.       # 过程结束
  204.       return false
  205.     end
  206.     # 清除有效标志
  207.     effective = false
  208.     # 公共事件 ID 是有效的情况下,设置为有效标志
  209.     effective |= skill.common_event_id > 0
  210.     # 第一命中判定
  211.     hit = skill.hit
  212.     if skill.atk_f > 0
  213.       hit *= user.hit / 100
  214.     end
  215.     hit_result = (rand(100) < hit)
  216.     # 不确定的特技的情况下设置为有效标志
  217.     effective |= hit < 100
  218.     # 命中的情况下
  219.     if hit_result == true
  220.       # 计算威力
  221.       power = skill.power + user.atk * skill.atk_f / 100
  222.       if power > 0
  223.         power -= self.pdef * skill.pdef_f / 200
  224.         power -= self.mdef * skill.mdef_f / 200
  225.         power = [power, 0].max
  226.       end
  227.       # 计算倍率
  228.       rate = 20
  229.       rate += (user.str * skill.str_f / 100)
  230.       rate += (user.dex * skill.dex_f / 100)
  231.       rate += (user.agi * skill.agi_f / 100)
  232.       rate += (user.int * skill.int_f / 100)
  233.       # 计算基本伤害
  234.       self.damage = power * rate / 20
  235.       
  236.       if user.is_a?(Game_Actor) and user.armor4_id > 0
  237.       if self.damage < 0
  238.       user.ap += -self.damage / 10
  239.       else
  240.       user.ap += self.damage / 10
  241.       end
  242.       if user.ap > $data_armors[user.armor4_id].sk_exp or user.ap < 0
  243.         user.ap = $data_armors[user.armor4_id].sk_exp
  244.       end  
  245.       end
  246.       
  247.       # 属性修正
  248.       self.damage *= elements_correct(skill.element_set)
  249.       self.damage /= 100
  250.       # 伤害符号正确的情况下
  251.       if self.damage > 0
  252.         # 防御修正
  253.         if self.guarding?
  254.           self.damage /= 2
  255.         end
  256.       end
  257.       # 分散
  258.       if skill.variance > 0 and self.damage.abs > 0
  259.         amp = [self.damage.abs * skill.variance / 100, 1].max
  260.         self.damage += rand(amp+1) + rand(amp+1) - amp
  261.       end
  262.       # 第二命中判定
  263.       eva = 8 * self.agi / user.dex + self.eva
  264.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  265.       hit = self.cant_evade? ? 100 : hit
  266.       hit_result = (rand(100) < hit)
  267.       # 不确定的特技的情况下设置为有效标志
  268.       effective |= hit < 100
  269.     end
  270.     # 命中的情况下
  271.     if hit_result == true
  272.       # 威力 0 以外的物理攻击的情况下
  273.       if skill.power != 0 and skill.atk_f > 0
  274.         # 状态冲击解除
  275.         remove_states_shock
  276.         # 设置有效标志
  277.         effective = true
  278.       end
  279.       # HP 的伤害减法运算
  280.       last_hp = self.hp
  281.       self.hp -= self.damage
  282.       effective |= self.hp != last_hp
  283.       # 状态变化
  284.       @state_changed = false
  285.       effective |= states_plus(skill.plus_state_set)
  286.       effective |= states_minus(skill.minus_state_set)
  287.       # 威力为 0 的场合
  288.       if skill.power == 0
  289.         # 伤害设置为空的字串
  290.         self.damage = ""
  291.         # 状态没有变化的情况下
  292.         unless @state_changed
  293.           # 伤害设置为 "Miss"
  294.           self.damage = "Miss"
  295.         end
  296.       end
  297.     # Miss 的情况下
  298.     else
  299.       # 伤害设置为 "Miss"
  300.       self.damage = "Miss"
  301.     end
  302.     # 不在战斗中的情况下
  303.     unless $game_temp.in_battle
  304.       # 伤害设置为 nil
  305.       self.damage = nil
  306.     end
  307.     # 过程结束
  308.     return effective
  309.   end
  310. end   
  311. class Window_Sklb < Window_Base
  312.   def initialize(actor)
  313.     @actor = actor
  314.     super(640-256, 0, 256, 480)
  315.     self.contents = Bitmap.new(width - 32, height - 32)
  316.     refresh
  317.   end
  318.   def refresh
  319.     i = 0
  320.     self.contents.clear
  321.     a = Color.new(255,255,255,200)
  322.     b = Color.new(0,0,0,255)
  323.     for j in @actor.svap.keys
  324.     if @actor.svap[j] > 0  
  325.     c_1 = 255 * @actor.svap[j] / $data_armors[j].sk_exp
  326.     c = Color.new(255,255-c_1,255,200)
  327.     w = 218 * @actor.svap[j] / $data_armors[j].sk_exp
  328.     self.contents.font.size = 18
  329.     bitmap = RPG::Cache.icon($data_armors[j].icon_name)
  330.     self.contents.blt(4, i*46, bitmap, Rect.new(0, 0, 24, 24))
  331.     self.contents.fill_rect(0,   i*46+32, 220, 10,a)
  332.     self.contents.fill_rect(0+1, i*46+1+32, 218, 8,b)
  333.     self.contents.fill_rect(0+1, i*46+1+32, w, 8,c)
  334.    
  335.     self.contents.draw_text(4+24,       i*46, 128, 32,$data_armors[j].name)
  336.     self.contents.draw_text(4+128,    i*46, 128, 32,$data_skills[$data_armors[j].sk_id].name)
  337.    
  338.     if @actor.svap[j] >= $data_armors[j].sk_exp
  339.     self.contents.draw_text(4+100,    i*46+16, 128, 32,"MAX")
  340.     else
  341.     self.contents.draw_text(4+32,    i*46+16, 128, 32,@actor.svap[j].to_s,1)
  342.     self.contents.draw_text(4+113,   i*46+16, 128, 32,"/")
  343.     self.contents.draw_text(4+128,   i*46+16, 128, 32,$data_armors[j].sk_exp.to_s)
  344.     end
  345.     i+=1
  346.     end
  347.   end
  348. end
  349. end
  350. class Scene_Equip
  351.   #---------------------------------------------------
  352.   # ● 主处理
  353.   #---------------------------------------------------
  354.   def main
  355.     # 获取角色
  356.     @actor = $game_party.actors[@actor_index]
  357.     # 生成窗口
  358.     @help_window = Window_Help.new
  359.     @left_window = Window_EquipLeft.new(@actor)
  360.     @right_window = Window_EquipRight.new(@actor)
  361.     @item_window1 = Window_EquipItem.new(@actor, 0)
  362.     @item_window2 = Window_EquipItem.new(@actor, 1)
  363.     @item_window3 = Window_EquipItem.new(@actor, 2)
  364.     @item_window4 = Window_EquipItem.new(@actor, 3)
  365.     @item_window5 = Window_EquipItem.new(@actor, 4)
  366.     # 关联帮助窗口
  367.     @right_window.help_window = @help_window
  368.     @item_window1.help_window = @help_window
  369.     @item_window2.help_window = @help_window
  370.     @item_window3.help_window = @help_window
  371.     @item_window4.help_window = @help_window
  372.     @item_window5.help_window = @help_window
  373.     @sklb = Window_Sklb.new(@actor)
  374.     @sklb.visible=false
  375.     @sklb.z += 5
  376.     # 设置光标位置
  377.     @right_window.index = @equip_index
  378.     refresh
  379.     # 执行过渡
  380.     Graphics.transition
  381.     # 主循环
  382.     loop do
  383.       # 刷新游戏画面
  384.       Graphics.update
  385.       # 刷新输入信息
  386.       Input.update
  387.       # 刷新画面
  388.       update
  389.       # 如果画面切换的话的就中断循环
  390.       if $scene != self
  391.         break
  392.       end
  393.     end
  394.     # 准备过渡
  395.     Graphics.freeze
  396.     # 释放窗口
  397.     @help_window.dispose
  398.     @left_window.dispose
  399.     @right_window.dispose
  400.     @item_window1.dispose
  401.     @item_window2.dispose
  402.     @item_window3.dispose
  403.     @item_window4.dispose
  404.     @item_window5.dispose
  405.     @sklb.dispose
  406.   end
  407.   alias up_right update_right
  408.   def update_right
  409.     up_right
  410.     if Input.trigger?(Input::X)
  411.       @sklb.visible=true
  412.     end
  413.     if Input.trigger?(Input::Y)
  414.       @sklb.visible=false
  415.     end
  416.    end
  417.   #---------------------------------------------------
  418.   # ● 刷新画面 (物品窗口被激活的情况下)
  419.   #---------------------------------------------------
  420.   def update_item
  421.     # 按下 B 键的情况下
  422.     if Input.trigger?(Input::B)
  423.       # 演奏取消 SE
  424.       $game_system.se_play($data_system.cancel_se)
  425.       # 激活右侧窗口
  426.       @right_window.active = true
  427.       @item_window.active = false
  428.       @item_window.index = -1
  429.       return
  430.     end
  431.     # 按下 C 键的情况下
  432.     if Input.trigger?(Input::C)
  433.       # 演奏装备 SE
  434.       $game_system.se_play($data_system.equip_se)
  435.       # 获取物品窗口现在选择的装备数据
  436.       item = @item_window.item
  437.       # 变更装备
  438.       if item != nil and item.is_a?(RPG::Armor)
  439.       @actor.svap[$data_armors[@actor.armor4_id].id] = @actor.ap
  440.       @actor.svap.include?(item.id) ? @actor.ap = @actor.svap[item.id] : @actor.ap = 0
  441.       end
  442.       @actor.equip(@right_window.index, item == nil ? 0 : item.id)
  443.       # 激活右侧窗口
  444.       @right_window.active = true
  445.       @item_window.active = false
  446.       @item_window.index = -1
  447.       # 再生成右侧窗口、物品窗口的内容
  448.       @right_window.refresh
  449.       @item_window.refresh
  450.       return
  451.     end
  452.   end
  453. end
  454. class Scene_Map
  455.   alias shensi_update update
  456.   def update
  457.     shensi_update
  458.     for i in 0...$game_party.actors.size
  459.       @actor = $game_party.actors[i]
  460.       if @actor.armor4_id > 0 and
  461.         @actor.ap >= $data_armors[@actor.armor4_id].sk_exp
  462.         @actor = $game_party.actors[i]
  463.         @actor.learn_skill($data_armors[@actor.armor4_id].sk_id)
  464.      end
  465.    end   
  466. end
  467. end
复制代码

但是有点问题:
   装备武器但是经验没有达到max的时候是无法使用技能的。我的想法是通过修改技能习得的条件(判定装备则习得;判定未装备,经验到达max则习得,未到max则忘却技能——应该是这个意思吧=。=)但是自己没学过编程,临时现学的修改了几次都是出错>.<....所以...希望高手能指点下...
   还有就是能不能把熟练度变成技能掌握度显示在特技栏里,我的意思是即使不装备武器也能够看到该技能习得需要的经验?
   PS:偶日文也不行啊,去日站,估计会迷路的[s:5]
回复 支持 反对

使用道具 举报

550

主题

9117

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-5-28 22:14:59 | 显示全部楼层
思路相似,,唯一的不同,,我没写出来

噢厚厚 [s:2]

装备武器但是经验没有达到max的时候是无法使用技能的   怎么个意思?   那个脚本干什么滴?
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

20

主题

197

帖子

2641

积分

⑥精研

积分
2641
QQ
发表于 2007-5-28 22:32:19 | 显示全部楼层
FFTA机制,是指在使用某种武器时,武器本身带有XX技能可以习得,根据每场战斗来学习该技能,同时如果你有装备这项武器时,也可以无条件使用该技能,当你学会后,没有武器依然可以使用XX技能,条件是经验值是MAX....[s:4]
根据以上机制结论是
1.在战斗结束后,应该检查AP值是否MAX,如果MAX应当为ACTOR添加技能项....
2.在战斗时应当对未装备该武器的个人技能进行检查.... 判定ACTOR的可用性
3.技能AP的清除动作检查.............
签名要少于60,SO,i haven't upload my pic
回复 支持 反对

使用道具 举报

1

主题

3

帖子

35

积分

②入门

积分
35
 楼主| 发表于 2007-6-3 00:07:36 | 显示全部楼层
俄....以经验为第一条件判断....应该没什么大区别吧....主要是要加上武器装备判断
看起来还是脚本的问题啊....

回4楼的:我的意思是,该脚本必须是AP max才能习得技能,即使装备着武器,AP不满也不能使用技能.而我想要在装备武器的时候也能使用技能呢... [s:4]
回复 支持 反对

使用道具 举报

550

主题

9117

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-6-3 01:49:57 | 显示全部楼层
那这样你最好配合随即装备的脚本,因为那个是针对某个编号的武器的,, [s:5]  [s:5] 而随机装备的脚本,是随出来的都是不同编号的装备 [s:7]
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

550

主题

9117

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2007-6-3 01:51:03 | 显示全部楼层
个人是这么认为的,,我也没看你那个脚本,,头晕……………… [s:5]  [s:5]  [s:5]
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-23 05:14 , Processed in 0.013210 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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