Project1

标题: 有dalao帮忙修改这个脚本吗? [打印本页]

作者: 1696993583    时间: 2018-4-6 17:31
标题: 有dalao帮忙修改这个脚本吗?

某天.我打开了 原创发布区 其中这样一个东西吸引了我.(可以先看后面再看脚本)
#==============================================================================
# 地图菜单插件 - 技能商店
#==============================================================================
# 作者:guoxiaomi
# 鸣谢:66RPG 叶子 任务界面
#==============================================================================
class Interpreter
  #----------------------------------------------------------------------------
  # 常量
  #----------------------------------------------------------------------------
  # 每个角色可以学习的技能  
  Skill_Shop_Actor_Data = {1=>[1,2,3], 2=>[1,2,4], 3=>[2,4,6], 4=>[1,2,3,4,5,6]}
  # 每个技能的需求
  # 数组里分别是[所需金钱, 所需等级, 先决技能]
  # 先决技能 = 0 说明不需要先决技能
  Skill_Shop_Skill_Data = {1=>[0,0,0], 2=>[0,0,0], 3=>[0,0,0], 4=>[10,0,0], 5=>[0,5,0], 6=>[0,0,1]}
  
  #----------------------------------------------------------------------------
  # 初始化方法
  #----------------------------------------------------------------------------
  def init_skill_shop(i = 0)
    # 设置商店调用标记
    $skill_shop_index = 0
    # 全局变量数组 v
    v = $game_variables
    # 如果 v[i] 已经是 Hash,那么不操作后面的赋值
    if i != 0
      return if v[i].is_a?(Hash)
    end
    # 技能商店库存   
    # v[商店ID] = {技能1_ID => 技能1_库存, 技能2_ID => 技能2_库存...}
    v[1] = {1=>2, 2=>2, 3=>2}
    v[2] = {2=>1, 4=>1, 6=>1}
    v[3] = {1=>4, 2=>4, 3=>4, 4=>4, 5=>4, 6=>4}
  end
  
  #----------------------------------------------------------------------------
  # 呼叫菜单方法
  #----------------------------------------------------------------------------
  def call_skill_shop(i)
    # 第一次调用时自动初始化
    init_skill_shop(i) if !$skill_shop_index
    # 将 shop 的数据记录到全局变量里
    $skill_shop_index = i
    # 设置 1 个 Show Window 用来展示菜单
    help_window = Window_Show.new (96, 32, 448, 64)
    help_window.back_opacity = 192
    help_window.contents.font.size = 32
    help_window.set_text('技能商店', 1)
    # 设置 3 个 Show Window 用来展示框架
    help_window1 = Window_Show.new (96,96,160,160)
    help_window1.back_opacity = 192
    help_window2 = Window_Show.new (96,256,160,160)
    help_window2.back_opacity = 192
    help_window3 = Window_Show.new (256,96,288,320)
    help_window3.back_opacity = 192
    # 读取队伍里的所有成员名
    ary = []   
    $game_party.actors.each do |actor|
      ary.push actor.name
    end
    # 设置窗口位置
    $wmm_position = {1=>[96,96,160,160], 2=>[96,256,160,160], 3=>[256,96,288,320]}
    # 设置窗口透明度为 0
    $wmm_backopacity = 0
    # 呼叫菜单窗口
    call_mapmenu(*ary)
    # 调用商店标志归零
    $skill_shop_index = 0
    # 释放help_window
    help_window.dispose   
    help_window1.dispose
    help_window2.dispose
    help_window3.dispose
    # 刷新地图
    $game_map.need_refresh = true
  end  
end

class Game_Party
  alias _Skill_Shop_set_mapwindow_task set_mapwindow_task
  def set_mapwindow_task
    # 继承之前的定义
    _Skill_Shop_set_mapwindow_task
    # 只有在 $skill_shop_index 不为 0 的时候才读取内容
    if $skill_shop_index && $skill_shop_index != 0
      # 队伍里的每个角色循环一遍
      $game_party.actors.each do |actor|
        # name 的第一部分
        name_main = actor.name
        # 从此角色的 id 中得到对应的可以学习的技能
        skill_actor = Interpreter::Skill_Shop_Actor_Data[actor.id]
        # 从 $skill_shop_index 得到该商店售卖的技能
        skill_shop = $game_variables[$skill_shop_index].keys
        # 交集就是所有的技能 id ,循环一遍
        (skill_actor & skill_shop).sort.each do |skill_id|
          # 读取技能的名称作为子菜单名
          name_sub = $data_skills[skill_id].name
          # 将角色 ID 和 技能 ID 记入 '@' 选项中方便后面识别         
          name_setting = "Refresh-Actor[#{actor.id}]-Skill[#{skill_id}]"
          # name 读取完毕,添加 'refresh' 选项使得页面可以实时刷新
          name = name_main + ':' + name_sub + '@' + name_setting
          # 下面是 text 内容,首先初始化数组,最后会把数组拼起来
          text = []         
          # 技能名
          text.push($data_skills[skill_id].name + "\n")
          # 库存余量
          text.push("库存 \\c[4]" + $game_variables[$skill_shop_index][skill_id].to_s + "\\c[0] 个\n")
          # 技能描述
          text.push($data_skills[skill_id].description + "\n\n")
          # 判断学习显示 遗忘 or 学习
          text.push("按空格  ")
          if actor.skill_learn?(skill_id)
            text.push "\\c[2]遗忘"
          else
            text.push "\\c[4]学习"
          end
          text.push "\\c[0]\n"
          # 获取学习限制是数据
          limit_ary = Interpreter::Skill_Shop_Skill_Data[skill_id]
          limit_gold, limit_level, limit_skill = *limit_ary
          # 判断金钱
          text.push("所需金钱: #{limit_gold} ")
          text.push("\\c[2]金钱不足\\c[0]") if $game_party.gold < limit_gold
          # 判断等级
          text.push("\n所需等级: #{limit_level} ")
          text.push("\\c[2]等级不足\\c[0]") if actor.level < limit_level
          # 判断技能
          if limit_skill != 0 && !actor.skill_learn?(limit_skill)
            text.push("\n需要先学会 \\c[2]#{$data_skills[limit_skill].name}\\c[0]\n")
          end
          # 添加此任务到菜单
          @tasks_info.push Game_Task.new(name, text.join(""))
        end
      end
    end
  end
end

class Window_MapMenu < Window_Command  
  alias _Skill_Shop_run_confirm run_confirm
  def run_confirm(ary)
    # 先进行原来的处理
    _Skill_Shop_run_confirm(ary)
    # 只有在 $skill_shop_index 不为 0 的时候才响应判断
    if $skill_shop_index && $skill_shop_index != 0
      # 从 '@' 选项中获得 actor id 和 skill id
      if ary[2] =~ /Actor\[(\d+)\]/
        actor_id = $1.to_i
      end
      if ary[2] =~ /Skill\[(\d+)\]/
        skill_id = $1.to_i
      end
      # 获取 actor
      actor = $game_party.actors.find{|actor| actor.id == actor_id}
      # 获取技能学习限制
      limit_ary = Interpreter::Skill_Shop_Skill_Data[skill_id]
      limit_gold, limit_level, limit_skill = *limit_ary
      # 如果 actor 已经学会此技能
      if actor.skill_learn?(skill_id)
        # 遗忘技能
        actor.forget_skill(skill_id)
        # 返回一半金钱
        $game_party.gain_gold(limit_gold / 2)
        # 播放冻结 SE
        $game_system.se_play($data_system.load_se)
      else
        # 如果商店有存货
        if $game_variables[$skill_shop_index][skill_id] > 0
          # 如果金钱和等级都没有问题
          if $game_party.gold >= limit_gold && actor.level >= limit_level
            # 如果未设置 先决技能 或 先决技能已学习
            if limit_skill == 0 || actor.skill_learn?(limit_skill)            
              # 学会此技能
              actor.learn_skill(skill_id)
              # 损失金钱
              $game_party.lose_gold(limit_gold)
              # 修改库存对应的全局变量
              $game_variables[$skill_shop_index][skill_id] -= 1
              # 播放成功 SE
              $game_system.se_play($data_system.shop_se)
            else
              # 播放冻结 SE
              $game_system.se_play($data_system.buzzer_se)
            end
          else
            # 播放冻结 SE
            $game_system.se_play($data_system.buzzer_se)
          end
        else
          # 播放冻结 SE
          $game_system.se_play($data_system.buzzer_se)
        end
      end
    end
  end
end
#==============================================================================
# 作者:guoxiaomi
# 鸣谢:66RPG 叶子 任务界面
#==============================================================================
  像这样的学习技能脚本早就满大街了.不过让我吸引的是 技能数量库存 .
  我就想:如果这个存 技能 的地方变为 存 物品 的地方.拿东西(学习技能)需要钱再改为需要 变量 特定物品 等级 等等.这样游戏里执行对应的脚本后就随机放入 物品 后就实现了 交换 等级奖励 刷新点等等.用途非常广泛!
  所以...有脚本帝帮忙么 (本人脚本盲一枚).
作者: 芯☆淡茹水    时间: 2018-4-6 17:47
把技能改成物品,差不多可以重新写了。
@guoxiaomi
作者: 1696993583    时间: 2018-4-6 17:59
芯☆淡茹水 发表于 2018-4-6 17:47
把技能改成物品,差不多可以重新写了。
@guoxiaomi

................
作者: 文雅夕露    时间: 2018-4-6 21:41
物品仓库的意思吗...
拿VX的物品仓库移植一下应该可以实现吧。
作者: 灯笼菜刀王    时间: 2018-4-6 23:48
其实我一直想不通, 拥有一个无限容量的背包, 还要仓库干嘛呢?
作者: SailCat    时间: 2018-4-7 00:27
如果只是物品仓库的话,纯事件就可以http://rpg.blue/forum.php?mod=vi ... eid%26typeid%3D1337
作者: chd114    时间: 2018-4-7 00:31
在游戏开始数据初始化部分和存读档的部分加新的Game_Party
存取物品就是不同PartyPY交易同时做物品增减
作者: 灯笼菜刀王    时间: 2018-4-7 01:05
本帖最后由 灯笼菜刀王 于 2018-4-7 01:13 编辑

  单品99那也是因为被gain_item限制了嘛.....   再说,99和9999又没啥区别.......


咱是觉得, 仓库的意义应该是要限制携带的物品才是, 所以仓库系统的大头不应该先限制包包的容积么?

限定身上携带的药品数量, 避免嗑药硬啃BOSS,  这样仓库的存在才有意义嘛



作者: ikki    时间: 2018-4-7 09:36
不是有现成的物品银行的脚本么?2006年的脚本




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1