#==============================================================================
# +++ VX移植 - VA负重系统改进版 +++
#==============================================================================
# VX版 原作者 By 雪流星
# 蓝本 杂兵天下的VA移植版
# 改进 By:VIPArcher
# -- 本脚本来自 [url]https://rpg.blue[/url] 使用或转载请保留以上信息。
# 二次小改 By:小茶司令(爱呗茶)2020.4.3
#==============================================================================
# 就是在物品画面的右上角放了一个显示负重的窗口
# 更新了代码,取消的原来的计算每个队员的负重然后累加的模式 2014-12-10
# 增加了商店界面的负重显示 2014-9-3
#==============================================================================
#
# 物品备注<load N> 则该物品占用 N 点负重
# load也可以写成「负重」或「負重」#注:没有“「」”不写的话默认为 Default_Load
# 更改当前负重 current_load(x[,assign])
# 其中 x 为数值可以为负数,assign 为 true 时当前负重直接赋值为x(可省略)
# 例如:current_load(10,true) 当前负重直接赋值为10
# 默认给物品增加一行说明.说明内容是物品的重量.
# 但默认帮助窗口一共只能显示2行内容.
# 因此你在数据库设置武器、护甲说明的时候.
# 如果设置了2行内容.那么这新增加的第3行将无法显示出来.
# 特别地,如果你使用了我的【技能物品说明增强】脚本,请将其置于该脚本以上的位置
# 2020.4.3 增加内容:
# 1.每名角色的独立装备负重
# 2.队伍中若有一名以上角色装备负重超过上限则进行超重处理
# 3.装备超重提示
# 4.添加若干常量设置
#==============================================================================
$VIPArcherScript ||= {};$VIPArcherScript[:load] = 20140919
#==============================================================================
# ★ 设定部分 ★
#==============================================================================
module VIPArcher end
module VIPArcher::Load
Default_Load = 1 #物品的默认负重
Default_Equip = 40 #每名角色默认装备重量上限 ###########################
#若不想使用默认负重则需数据库角色备注里添加文本 例: <负重 50>
Width = 150 #负重信息窗口宽度
Load_Name = "负重:" #负重前显示的文字
Load_Var = 0 #作为队伍负重上限的变量ID,为0禁用变量作为负重上限,变成
#累计每个角色的负重能力来计算负重上限
EQUIPSWLOAD = true #true 使用 / false 不使用
# 用于是否显示装备栏的负重信息#####################
$equip_map = true #装备负重提示开关
Load_Eval = "((mhp + mmp) * @level / agi) * [hp_rate,0.5].max"
# 每个角色的负重计算公式(eval)
Stop_SW = false #true 使用 / false 不使用
# 事件中调用增减道具/武器/防具时,如果会导致超过负重上限,是否执行中断事件处理
# 推荐不使用,因为新加的功能就有一个是当超过负重时限制角色移动,开启这个
# 的话这个限制移动就无效了的说·3·
Movable = false #true 使用 / false 不使用
# 满负重时降低移动速度(不使用时禁止移动连事件都无法启动,只能丢弃/使用物品)
Move_Speed = 2 # 满负重时的移动速度
# 负重超过上限时的提示内容
Message = "\\i[4]负重超过可承受的范围,\n移动将变得\\c[10]十分艰难!\\c[0]
丢些没用的东西掉吧。"
# 装备负重超过上限时的提示内容
Message2 = "\\i[4]检测到队伍中至少有一名角色装备负重\n\\c[10]超过可承受范围\\c[0],队伍行动将变得\\c[10]十分艰难!\\c[0]
必要时请及时更换更轻便的装备哦。"
# 装备负重信息默认显示位置
Messset = 1 #0 上 / 1 中 / 2 下
# 按X键(A键)是否可以丢弃道具
# 如果你另外使用了丢弃道具的脚本请关闭
Lose_SW = false #true 使用 / false 不使用
# 是否在帮助窗口内自动添加负重信息
Help_SW = false #true 使用 / false 不使用
# 装备在身上的装备是否算入负重
Equip_SW = true #true 计算 / false 不计算
# "★★★★★★ 注意 ★★★★★★"
# 如果你的角色初始装备有占负重并且开启上面的功能,那么你必须
# 在游戏一开始时为当前负重赋值(自己算到底有多少负重·3·)
# 当有新队员加入队伍并且也带有负重的装备那么你也需要为当前负重加上对应的重量,
# 例如:事件脚本运行 current_load(10) 就是加上10的当前负重
end
#==============================================================================
# ☆ 装备负重 ☆#######################
#==============================================================================
class Game_Actor
include VIPArcher::Load
attr_accessor :equip_weight #已装备物品重量
attr_accessor :equip_weightmax #最大负重
alias setup_plus setup
alias refresh_plus refresh
alias change_equip_plus change_equip
#--------------------------------------------------------------------------
# ● 设置
#--------------------------------------------------------------------------
def setup(actor_id)
setup_plus(actor_id)
@equip_weight = equips.compact.inject(0) {|r, item| r += item.load }
@equip_weightmax = loadmax
end
#--------------------------------------------------------------------------
# ● 获取队伍角色最大负重
#--------------------------------------------------------------------------
def loadmax
return $1.to_i if $data_actors[id].note =~ /<(?:load|负重|負重)\s*(\d+)>/i
return Default_Equip
end
#--------------------------------------------------------------------------
# ● 更换装备
# slot_id : 装备栏 ID
# item : 武器/护甲(为 nil 时装备解除)
#--------------------------------------------------------------------------
def change_equip(slot_id, item)
change_equip_plus(slot_id, item)
$equip_map = true
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
if @equip_weight != equips.compact.inject(0) {|r, item| r += item.load }
@equip_weight = equips.compact.inject(0) {|r, item| r += item.load }
end
refresh_plus
end
end
#==============================================================================
# ☆ 装备超重提示 ☆#######################
#==============================================================================
class Scene_Map < Scene_Base
include VIPArcher::Load
alias start_plus start
def start
start_plus
equiptips
end
#--------------------------------------------------------------------------
# ● 装备超重提示
#--------------------------------------------------------------------------
def equiptips
if $equip_map
for i in 1..$data_system.party_members.clone.size
if $game_actors[i].equip_weight > $game_actors[i].equip_weightmax
$game_message.position = Messset
$equip_map = false
return $game_message.texts.push("#{Message2}")
end
end
end
end
end
#==============================================================================
# ☆ 能力窗口 ☆#######################
#==============================================================================
class Window_EquipStatus
include VIPArcher::Load #继承了该模块
alias refresh_plus refresh
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
refresh_plus
if EQUIPSWLOAD
contents.font.size = 16 ;contents.font.color = text_color(21)
if @actor !=nil
x=80
contents.draw_text(x,0,100,16,"负重:")
if @actor.equip_weight > @actor.equip_weightmax
contents.font.color = text_color(10)
contents.draw_text(x-30,20,100,16,"超重!")
end
contents.font.color = text_color(0)
contents.draw_text(x+50,0,100,16,"#{@actor.equip_weight}/#{@actor.equip_weightmax}")
end
contents.font.size = 21
end
end
end
#==============================================================================
# ☆ 设定结束 ☆
#==============================================================================
class RPG::BaseItem
include VIPArcher::Load #继承了该模块
#--------------------------------------------------------------------------
# ● 获取道具的重量
#--------------------------------------------------------------------------
def load
return unless self.is_a?(RPG::Item) || self.is_a?(RPG::EquipItem)
return $1.to_i if @note =~ /<(?:load|负重|負重)\s*(\d+)>/i
return Default_Load #若备注没有 <负重 (数字)> 则自动替换为该常量
end
#--------------------------------------------------------------------------
# ● 新增负重帮助内容
#--------------------------------------------------------------------------
def description
if Help_SW && load && load != 0
return @description + "\n\\}重量:#{load}"
else
return @description
end
end unless $VIPArcherScript[:help_ex]
end
#==============================================================================
# 显示当前负重信息的窗口
#==============================================================================
class Window_Load < Window_Base
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize
super(Graphics.width - window_width, 72, window_width, fitting_height(1))
refresh
end
#--------------------------------------------------------------------------
# ● 获取窗口的宽度
#--------------------------------------------------------------------------
def window_width
Width
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
contents.clear
contents.font.size - 4
draw_text(0, 0, window_width - 64, 24,load_name,0)
draw_text(0, 0, window_width - 24, 24, weight,2)
@temp_load = $game_party.current_load
end
#--------------------------------------------------------------------------
# ● 获取当前负重信息
#--------------------------------------------------------------------------
def weight
"#{$game_party.current_load}/#{$game_party.total_load}"
end
#--------------------------------------------------------------------------
# ● 获取负重前显示文字
#--------------------------------------------------------------------------
def load_name
Load_Name
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
super
refresh if @temp_load != $game_party.current_load
end
end
#-------------------------------------------------------------------------------
class Window_ItemCategory < Window_HorzCommand
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 获取窗口的宽度
#--------------------------------------------------------------------------
def window_width
scene_item_is? ? Graphics.width - Width : Graphics.width
end
#--------------------------------------------------------------------------
# ● 获取列数
#--------------------------------------------------------------------------
def col_max
return scene_item_is? ? 3 : 4
end
#--------------------------------------------------------------------------
# ● 判断是否为物品栏场景
#--------------------------------------------------------------------------
def scene_item_is?
return SceneManager.scene_is?(Scene_Item)
end
end
#==============================================================================
# ■ 物品界面显示负重栏
#==============================================================================
class Scene_Item < Scene_ItemBase
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 开始处理
#--------------------------------------------------------------------------
alias load_start start
def start
load_start
@load_window = Window_Load.new
@load_window.y = 30
@load_window.viewport = @viewport
end
#--------------------------------------------------------------------------
# ● 结束处理
#--------------------------------------------------------------------------
alias load_terminate terminate
def terminate
load_terminate
@load_window.dispose
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
alias load_update update
def update
#--------------------------------------------------------------------------
# ★ 按X键(A键)丢弃道具 - 贵重物品无法丢弃 ★修改:VIPArcher
#--------------------------------------------------------------------------
if Input.trigger?(Input::X) && Lose_SW
item = @item_window.item
if item.is_a?(RPG::Item) && item.key_item?
Sound.play_buzzer
else
Sound.play_cancel
$game_party.lose_item(item, 1)
@item_window.refresh
end unless item == nil
end
@load_window.update
load_update
end
end
#-------------------------------------------------------------------------------
class Window_ShopNumber < Window_Selectable
include VIPArcher::Load
attr_accessor :buy_or_sell #买入的标志
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias vip_shopnumber_refresh refresh
def refresh
vip_shopnumber_refresh
draw_current_weight(@item)
end
#--------------------------------------------------------------------------
# ○ 买卖时重量变化的描绘
#--------------------------------------------------------------------------
def draw_current_weight(item)
current = $game_party.current_load
weight = current + item.load * @number * (@buy_or_sell ? 1 : -1)
width = contents_width - 8
cx = text_size(@currency_unit).width
change_color(system_color)
draw_text(4, y + 60, width, line_height, "#{Load_Name}")
change_color(normal_color)
wt = "#{weight} / #{$game_party.total_load}"
draw_text(4, y + 60, width, line_height, wt, 2)
end
end
#-------------------------------------------------------------------------------
class Window_ShopStatus < Window_Base
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias vip_shopstatus_refresh refresh
def refresh
vip_shopstatus_refresh
draw_weight_occupy(4, 24)
end
#--------------------------------------------------------------------------
# ● 绘制持负重信息
#--------------------------------------------------------------------------
def draw_weight_occupy(x, y)
rect = Rect.new(x, y, contents.width - 4 - x, line_height)
change_color(system_color)
draw_text(rect, "#{Load_Name}", 3)
change_color(normal_color)
weight = "#{$game_party.current_load}/#{$game_party.total_load}" #重量/MAX重量
draw_text(rect, weight, 2)
@temp_load = $game_party.current_load
end
end
#==============================================================================
# ■ 获取队伍最大负重
#==============================================================================
class Game_Party < Game_Unit
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :current_load, :load_trade_item #负重
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
alias load_initialize initialize
def initialize
load_initialize
total_load
@current_load = 0
@total_load = 0
end
#--------------------------------------------------------------------------
# ● 获取队伍最大负重
#--------------------------------------------------------------------------
def total_load
return $game_variables[Load_Var] if Load_Var > 0
all_members.inject(0) {|total,actor| total + actor.load }
end
#--------------------------------------------------------------------------
# ● 判断物品负重是否已满
#--------------------------------------------------------------------------
def load_max?
return false if @current_load == 0
@current_load >= total_load
end
#--------------------------------------------------------------------------
# ● 获取队伍的总装备重量
#--------------------------------------------------------------------------
# def equiptotal
# load=0
# for i in 1..$data_system.party_members.clone.size
# load += $game_actors[i].equip_weight
# end
# return load
# end
#--------------------------------------------------------------------------
# ● 判断装备负重是否已满##################################
#--------------------------------------------------------------------------
def eload_max?
max=0
for i in 1..$data_system.party_members.clone.size
max+=1 if $game_actors[i].equip_weight <= $game_actors[i].equip_weightmax
return false if max == $data_system.party_members.clone.size
end
end
#--------------------------------------------------------------------------
# ● 增加/减少物品时计算负重
#--------------------------------------------------------------------------
alias load_gain_item gain_item
def gain_item(item, n, include_equip = false)
return if item.nil?
load_gain_item(item, n, include_equip)
@current_load += item.load * n if !@load_trade_item
end
end
#-------------------------------------------------------------------------------
class Game_Actor < Game_Battler
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 装备时不计算负重的增减 * 方法覆盖
# new_item : 取出的物品
# old_item : 放入的物品
#--------------------------------------------------------------------------
def trade_item_with_party(new_item, old_item)
return false if new_item && !$game_party.has_item?(new_item)
$game_party.load_trade_item = true if Equip_SW == true
$game_party.gain_item(old_item, 1)
$game_party.lose_item(new_item, 1)
$game_party.load_trade_item = false if Equip_SW == true
return true
end
#--------------------------------------------------------------------------
# ● 获取角色的负重上限
#--------------------------------------------------------------------------
def load
eval(Load_Eval).to_i
end
end
#==============================================================================
# ■ 增减物品时判断负重
#==============================================================================
class Game_Interpreter
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 增减道具
#--------------------------------------------------------------------------
alias load_command_126 command_126
def command_126
n = operate_value(@params[1], @params[2], @params[3])
return command_115 if check_load(@params[0], 0, n) && Stop_SW
load_command_126
end
#--------------------------------------------------------------------------
# ● 增減武器
#--------------------------------------------------------------------------
alias load_command_127 command_127
def command_127
n = operate_value(@params[1], @params[2], @params[3])
return command_115 if check_load(@params[0], 1, n) && Stop_SW
load_command_127
end
#--------------------------------------------------------------------------
# ● 增減防具
#--------------------------------------------------------------------------
alias load_command_128 command_128
def command_128
n = operate_value(@params[1], @params[2], @params[3])
return command_115 if check_load(@params[0], 2, n) && Stop_SW
load_command_128
end
#--------------------------------------------------------------------------
# ● 增减物品超重时提示
#--------------------------------------------------------------------------
def check_load(item_id, type, n)
case type
when 0; item = $data_items[item_id]
when 1; item = $data_weapons[item_id]
when 2; item = $data_armors[item_id]
end
if (((item.load * n) + $game_party.current_load) > $game_party.total_load)
$game_message.texts.push("#{Message}") if $game_message.visible != true
$game_message.visible = true
end
return (((item.load * n) + $game_party.current_load) > $game_party.total_load)
end
#--------------------------------------------------------------------------
# ● 更改负重
#--------------------------------------------------------------------------
def current_load(current_load,assign = false)
if assign
$game_party.current_load = current_load
else
$game_party.current_load += current_load
end
end
end
#==============================================================================
# ★ 满负重时限制行动 ★
#==============================================================================
class Game_Player < Game_Character
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 判定是否可以移动###################
#--------------------------------------------------------------------------
alias load_movable? movable?
def movable?
return false if $game_party.load_max? && !Movable
return false if $game_party.eload_max? && !Movable ###################
load_movable?
end
end
#==============================================================================
# ★ 满负重时降低移动速度 ★
#==============================================================================
class Game_CharacterBase
include VIPArcher::Load
#--------------------------------------------------------------------------
# ● 获取移动速度(判断是否跑步)################
#--------------------------------------------------------------------------
alias load_real_move_speed real_move_speed
def real_move_speed
return Move_Speed if $game_party.load_max? && Movable
return Move_Speed if $game_party.eload_max? && Movable ################
load_real_move_speed
end
end
#==============================================================================
# ★ 满负重时限制购买 ★
#==============================================================================
class Window_ShopBuy < Window_Selectable
#--------------------------------------------------------------------------
# ● 查询商品是否可买
#--------------------------------------------------------------------------
alias load_enable? enable?
def enable?(item)
load_enable?(item) && !$game_party.load_max?
end
end
#==============================================================================
# ★ 根据负重设定可购买的物品数量 ★
#==============================================================================
class Scene_Shop < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 指令“买入”
#--------------------------------------------------------------------------
alias vip_load_command_buy command_buy
def command_buy
vip_load_command_buy
@number_window.buy_or_sell = true
end
#--------------------------------------------------------------------------
# ● 指令“卖出”
#--------------------------------------------------------------------------
alias vip_load_command_sell command_sell
def command_sell
vip_load_command_sell
@number_window.buy_or_sell = false
end
#--------------------------------------------------------------------------
# ● 获取可以买入的最大值
#--------------------------------------------------------------------------
alias load_max_buy max_buy
def max_buy
vip = @item.load == 0 ? load_max_buy : ($game_party.total_load -
$game_party.current_load) / @item.load
[load_max_buy,vip].min
end
end