Project1
标题:
VA的分解脚本我想要
[打印本页]
作者:
奥特曼盖亚
时间:
2013-8-21 10:38
标题:
VA的分解脚本我想要
各位大神谁有这种脚本并教我怎么用这脚本要像合成脚本一样有公式
作者:
xggzga117
时间:
2013-8-22 11:26
可以用事件来做。
作者:
奥特曼盖亚
时间:
2013-8-23 13:22
我知道太麻烦了我要每个都弄到
作者:
chd114
时间:
2013-8-23 13:47
=begin
==============================================================================
★ Item_Transmute
------------------------------------------------------------------------------
配方不公开的物品合成(加强版)
原作者 Summoner
By Chd114
------------------------------------------------------------------------------
注:该脚本具有至高权威性,可以覆盖任何此脚本的前身脚本!
注:此脚本无视魔法免疫!
注:使用此脚本时,处于无敌状态!
==============================================================================
本脚本以知识共享署名-非商业性使用 3.0 Unported 许可协议进行许可。
详见 http://creativecommons.org/licenses/by-nc/3.0/
==============================================================================
原作者的话:
这是一个配方不公开的物品合成,也就是说什么材料可以合成什么物品玩家在
游戏中的合成界面是不能直接看到的。由于物品的合成配方不是公开的,所以
玩家需要通过自己探索或从NPC处得到合成配方(当然看攻略也是一种可能)
例如M&M中的配药水,Diablo II的盒子,NWV中的铁匠铺、Wizard Lab……
可扩展性:可以加强、扩展的东西应该很多。
例如:合成需要花费GP、SP甚至XP,合成需要特定器具,合成失败受到伤害,
某些物品的几率合成、物品图鉴等等。
有的东西已经注释清楚了,搞懂原理的话,根据自己需要改起来也不会很麻烦。
个人一下子没时间实现这些,欢迎大家多多修改分享。
Chd114的话(2013年6月9日 11:45:40):
其实这个脚本的改进思路早在去年此脚本出来之前就有想法了···只不过那个
时候本人的技术还差了一点所以就没有盲目去弄今天(2013年6月9日 9:33:40)
花了2小时左右的时间鼓捣了下最后把大部分东西都弄好了
Chd114的话(2013年6月10日 7:59:49):
吃饭前来了新的灵感,于是就在吃完饭后鼓捣了下下···现在一个配方里的每一种成
功额外产物和失败额外产物都可以设定独立的出现概率了,而且还加了新功能,
可以控制开关与变量!(2013年6月10日 8:28:03)
此脚本冲突可能性:与装备耐久度、随即装备属性之类会导致装备具有独立性的
脚本功能冲突,其他脚本基本上不冲突
使用方法:在事件中使用脚本$scene = Scene_Compose.new,然后等待2帧
==============================================================================
若合成失败(无匹配的配方、因合成概率低而失败)物品是否失去
=end
$Ingredient_Lost_When_Fail = true#false
# 合成成功/失败SE
# 若不使用SE请设置为“""”(不含外引号)
$SE_Compose_Successful = ""
$SE_Compose_Failed = ""
#=============================================================================
# ■ 配方及补充的定义
#-----------------------------------------------------------------------------
# Game_System
#=============================================================================
class Game_System
attr_accessor :formulas
attr_accessor :products
attr_accessor :sproducts
attr_accessor :fproducts
attr_accessor :other
attr_accessor :probability
alias formulas_initialize initialize
def initialize
formulas_initialize
@formulas = []
@products = []
@sproducts = []
@fproducts = []
@other = []
@probability = []
=begin
===========================配方表===========================================
配方格式
@formulas[i] = [[材料种类,材料编号,数量],[材料种类,材料编号,数量]……]
@products[i] = [[成品种类,成品编号,数量],[成品种类,成品编号,数量]……]
@sproducts[i] = [[成功额外产物种类,编号,数量,出现概率],[成功额外产物种类,编号,数量,出现概率]]
@fproducts[i] = [[失败额外产物种类,编号,数量,出现概率],[失败额外产物种类,编号,数量,出现概率]]
@other[i] = [[开关/变量,开关/变量编号,控制系数],[开关/变量,开关/变量编号,控制系数]]
@probability[i] = 合成成功率
种类:物品 0 武器 1 防具 2
1.如果有两个配方材料相同,理论上会按编号较小的处理
2.配方材料的顺序与合成是无关的(当然如果你想改成有关肯定也不会太麻烦)
3.允许某个材料拆成多件成品(可能就不叫物品合成,应该叫物品分解了)
4.产物数量神马的理论上你可以无限写,只要你不怕麻烦加手抽筋。
5.暂时不支持多步合并为一步的合成
例如 A + B = C,C + D = E,如果不存在A + B + D = E的配方
A + B + D无法合成 E
6.暂时不支持将配方逆向使用(本功能会尝试完善)
例如 A + B = C,C = A + B,如果不存在C = A + B的配方
C无法拆解成A + B
7.暂时不支持花费金钱的合成与配方学习(本功能会尝试完善)
例如A + B = C,作者设定成合成此配方的成品需要花费5000金币之类的
8.成功额外产物出现的概率与失败额外产物出现的概率会导致所有成功额外
产物或所有失败额外产物同时出现,比如失败额外产物有大药膏和艾西非远
古祭祀,则在合成失败后若出现失败的额外产物时同时出现大药膏和艾西非
远古祭祀。
9.成功额外产物和失败额外产物的设定和配方材料、配方成品设定格式是一致的。
10.@other[i]里面控制开关与变量,当[开关/变量,开关/变量编号,控制系数]
里面的[开关/变量]为0时是改变开关,改变开关的时候若控制系数为0则是关闭,
1就是打开,当[开关/变量]为1时是改变变量,这个时候控制系数可以添任意正负
整数。
11.当你要改变开关状态时控制系数只能是1或0
12.不需要的功能全部数字写0即可
13.只有合成/拆分成功时才能改变开关与变量
14.已经打开的开关依然可以用合成/拆分操作重复打开
=end
#初始化模板
@formulas[0] = []
@products[0] = []
@sproducts[0] = []
@fproducts[0] = []
@other[0] = []
@probability[0] = []
#这个才是样例!!!
@formulas[1] = [[1,1,1]]
@products[1] = [[2,29,1]]
@sproducts[1] = [[1,2,1,50],[1,3,1,100]]
@fproducts[1] = [[0,2,1,50],[0,3,3,100]]
@other[1] = [[0,10,1],[1,20,2]]#10号开关打开,20号变量+2
@probability[1] = 100
end
end
class Game_Temp
attr_accessor :forge
alias forge_item_initialize initialize
def initialize
forge_item_initialize
# 定义合成窗口中的物品储存区
[url=home.php?mod=space&uid=14254]@Forge[/url] = []
end
end
#==============================================================================
# ■ Window_ForgeCommand
#------------------------------------------------------------------------------
# 合成画面、选择要做的事的窗口
#==============================================================================
class Window_ComposeCommand < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super(0, 64, 640, 64)
self.contents = Bitmap.new(width - 32, height - 32)
@item_max = 4
@column_max = 4
@commands = ["更改材料", "合成", "放弃合成", "离开"]
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i)
end
end
#--------------------------------------------------------------------------
# ● 描绘项目
# index : 项目编号
#--------------------------------------------------------------------------
def draw_item(index)
x = 4 + index * 160
self.contents.draw_text(x, 0, 128, 32, @commands[index])
end
end
#==============================================================================
# ■ Window_ForgeLeft
#------------------------------------------------------------------------------
# 合成画面中显示拥有的物品的窗口
#==============================================================================
class Window_ComposeLeft < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super(0, 128, 320, 352)
@column_max = 1
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# ● 获取物品
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
self.update_cursor_rect
@data = []
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
@data.push($data_weapons[i])
end
end
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
# 如果项目数不是 0 就生成位图、描绘全部项目
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
for i in 0...@item_max
draw_item(i)
end
end
end
#--------------------------------------------------------------------------
# ● 描绘项目
# index : 项目标号
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
self.contents.font.color = text_color(item.name_color_66RPG)
x = 4
y = index * 32
rect = Rect.new(x, y, self.width / @column_max - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == text_color(item.name_color_66RPG) ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 32, 32), opacity)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
self.contents.draw_text(x + 256, y, 32, 32, number.to_s, 2)
end
#--------------------------------------------------------------------------
# ● 刷新帮助文本
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? "" : self.item.description)
end
end
#==============================================================================
# ■ Window_ForgeRight
#------------------------------------------------------------------------------
# 合成画面中的合成区窗口
#==============================================================================
class Window_ComposeRight < Window_Selectable
attr_accessor :forge_item
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize(forge_item)
super(320, 128, 320, 352)
@column_max = 1
@forge_item = []
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# ● 获取物品
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# ● 获取物品
#--------------------------------------------------------------------------
def item_number
return @data_number[self.index]
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
@data_number = []
@forge_item = $game_temp.forge
for item_forge in @forge_item
case item_forge[0]
when 0
item = $data_items[item_forge[1]]
when 1
item = $data_weapons[item_forge[1]]
when 2
item = $data_armors[item_forge[1]]
end
if (item != nil) and (item_forge[2] != 0)
@data.push(item)
@data_number.push(item_forge[2])
else
@data.delete(item)
end
end
# 如果项目数不是 0 就生成位图、描绘全部项目
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
for i in 0...@item_max
draw_item(i)
end
end
end
#--------------------------------------------------------------------------
# ● 描绘项目
# index : 项目标号
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
case item
when RPG::Item
number = $game_temp.forge[index][2]
when RPG::Weapon
number = $game_temp.forge[index][2]
when RPG::Armor
number = $game_temp.forge[index][2]
end
self.contents.font.color = text_color(item.name_color_66RPG)
x = 4
y = index * 32
rect = Rect.new(x, y, self.width / @column_max - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == text_color(item.name_color_66RPG) ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 32, 32), opacity)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
self.contents.draw_text(x + 256, y, 32, 32, number.to_s, 2)
end
#--------------------------------------------------------------------------
# ● 刷新帮助文本
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? "" : self.item.description)
end
end
#==============================================================================
# ■ Scene_Compose
#------------------------------------------------------------------------------
# 处理物品合成画面的类
#==============================================================================
class Scene_Compose
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize
# 生成帮助窗口
@help_window = Window_Help.new
# 生成命令窗口
@command_window = Window_ComposeCommand.new
@command_window.active = false
# 生成左方窗口
@item_window = Window_ComposeLeft.new
@item_window.active = true
@item_window.help_window = @help_window
# 生成右方窗口
@forge_window = Window_ComposeRight.new([])
@forge_window.active = false
@forge_window.help_window = @help_window
# 初始化配方与合成区
@formulas = $game_system.formulas
@products = $game_system.products
@sproducts = $game_system.sproducts
@fproducts = $game_system.fproducts
@other = $game_system.other
@probability = $game_system.probability
@forge = []
@products_temp = []
@sproducts_temp = []
@fproducts_temp = []
@other_temp = []
@probability_temp = []
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 执行过渡
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入情报
Input.update
# 刷新画面
update
# 如果画面被切换的话就中断循环
if $scene != self
break
end
end
# 准备过渡
Graphics.freeze
# 释放窗口
@help_window.dispose
@command_window.dispose
@item_window.dispose
@forge_window.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
@help_window.update
@command_window.update
@item_window.update
@forge_window.update
if @command_window.active
update_command
return
end
if @item_window.active
update_item
return
end
if @forge_window.active
update_forge
return
end
return
end
#--------------------------------------------------------------------------
# ● 刷新画面(指令窗口激活的情况下)
#--------------------------------------------------------------------------
def update_command
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
abort
# 切换到地图画面
$scene = Scene_Map.new
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 命令窗口光标位置分支
case @command_window.index
when 0 # 更改材料
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 窗口状态转向物品窗口
@command_window.active = false
@item_window.active = true
@forge_window.active = false
when 1 # 合成
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 执行合成命令
if $game_temp.forge != []
compose
end
when 2 # 放弃合成
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 放弃合成
abort
when 3 # 离开
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 放弃合成
abort
# 切换到地图画面
$scene = Scene_Map.new
end
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面(物品窗口激活的情况下)
#--------------------------------------------------------------------------
def update_item
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 切换到指令窗口
@item_window.active = false
@command_window.active = true
@help_window.set_text("")
return
end
# 按下 C 键的情况
if Input.trigger?(Input::C)
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 获取物品
@item = @item_window.item
# 获取物品的所持数
case @item
when RPG::Item
number = $game_party.item_number(@item.id)
typetemp = 0
when RPG::Weapon
number = $game_party.weapon_number(@item.id)
typetemp = 1
when RPG::Armor
number = $game_party.armor_number(@item.id)
typetemp = 2
end
if number != nil
# 更改合成窗口的物品
case @item
when RPG::Item
$game_party.lose_item(@item.id, 1)
when RPG::Weapon
$game_party.lose_weapon(@item.id, 1)
when RPG::Armor
$game_party.lose_armor(@item.id, 1)
end
forge_change(typetemp, @item.id, 1)
# 刷新各窗口
@item_window.update
@help_window.update
@forge_window.update
@item_window.refresh
@forge_window.refresh
end
end
# 按下 右方向键 的情况
if Input.trigger?(Input::RIGHT)
# 切换到合成窗口
@item_window.active = false
@forge_window.active = true
end
end
#--------------------------------------------------------------------------
# ● 刷新画面(合成窗口激活的情况下)
#--------------------------------------------------------------------------
def update_forge
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 切换到指令窗口
@forge_window.active = false
@command_window.active = true
@help_window.set_text("")
return
end
# 按下 C 键的情况
if Input.trigger?(Input::C)
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 获取物品
@item = @forge_window.item
# 获取物品的所持数
case @item
when RPG::Item
number = @forge_window.item_number
typetemp = 0
when RPG::Weapon
number = @forge_window.item_number
typetemp = 1
when RPG::Armor
number = @forge_window.item_number
typetemp = 2
end
if number != nil
# 更改合成窗口的物品
case @item
when RPG::Item
$game_party.gain_item(@item.id, 1)
when RPG::Weapon
$game_party.gain_weapon(@item.id, 1)
when RPG::Armor
$game_party.gain_armor(@item.id, 1)
end
#p number
forge_change(typetemp, @item.id, -1)
# 刷新各窗口
@item_window.refresh
@forge_window.refresh
@help_window.update
@item_window.update
@forge_window.update
end
end
# 按下 左方向键 的情况下
if Input.trigger?(Input::LEFT)
# 切换到合成窗口
@forge_window.active = false
@item_window.active = true
end
end
#--------------------------------------------------------------------------
# ● 更改合成窗口物品
#--------------------------------------------------------------------------
def forge_change(type,id,number)
quantity = number
for item in $game_temp.forge
if (item[0]==type) and (item[1]==id)
item[2] = [item[2] += quantity,99].min
if item[2] == 0
$game_temp.forge.delete(item)
end
return
end
end
$game_temp.forge.push([type,id,number])
end
#--------------------------------------------------------------------------
# ● 放弃合成
#--------------------------------------------------------------------------
def abort
# 将合成窗口中的物品转移至物品窗口中
for item in $game_temp.forge
# 判断物品类型并归还
case item[0]
when 0
$game_party.gain_item(item[1], item[2])
when 1
$game_party.gain_weapon(item[1], item[2])
when 2
$game_party.gain_armor(item[1], item[2])
end
end
$game_temp.forge = []
# 刷新各窗口
@item_window.refresh
@forge_window.refresh
end
#--------------------------------------------------------------------------
# ● 检测是否有符合的配方
#--------------------------------------------------------------------------
def match
match_one = false
match_this = false
# 检测每一个配方
for i in
[email protected]
# 将合成窗口中的物品复制到合成缓存区
# 注意: 直接使用"="将传引用 导致检测配方是否匹配时合成窗口中物品被删除
@forge = $game_temp.forge.dup
# 检测这个配方中每一项材料
for ingredient in @formulas[i]
match_this = true
# 合成区中没有此项材料的情况
unless @forge.include?(ingredient)
match_this = false
break
end
# 从合成区中暂时删除这项材料
@forge.delete(ingredient)
end
if match_this == false
next
end
# 检测合成区中是否还有配方外的材料剩余
unless @forge == []
match_this = false
end
# 满足这一个配方的情况
if match_this == true
match_one = true
# 获取配方的成品、成功额外产物、失败额外产物、合成各种概率
@products_temp = @products[i]
@sproducts_temp = @sproducts[i]
@fproducts_temp = @fproducts[i]
@other_temp = @other[i]
@probability_temp = @probability[i]
$g=i
break
end
end
return match_one
end
#--------------------------------------------------------------------------
# ● 合成
#--------------------------------------------------------------------------
def compose
# 如果有符合的配方
if match
# 将合成窗口中的材料改变为成品
$game_temp.forge = []
if @probability_temp==100
@pro1=0#当成功率为100%时随机概率是0
else
@pro1=rand(99)#当成功率不为100%时随即概率为0-99
end
if @pro1<@probability_temp
for i in 0...@other_temp.size
if @other_temp[i][1]!=0
if @other_temp[i][0]==0
$game_switches[@other_temp[i][1]]=@other_temp[i][2]#控制开关
else
$game_variables[@other_temp[i][1]]+=@other_temp[i][2]#控制变量
end
end
$game_map.need_refresh = true#强制刷新地图
end
for i in 0...@products_temp.size
forge_change(@products_temp[i][0], @products_temp[i][1], @products_temp[i][2])
end
for i in 0...@sproducts_temp.size
if @sproducts_temp[i][3]==100
@pro2=0#成功额外产率为100%时随即概率为0
elsif @sproducts_temp[i][3]<100
@pro2=rand(99)#成功额外产率为0-99%时随即概率为0-99%
else
@pro2=0#成功额外产率为0%时没有成功额外产物
end
if @pro2<@sproducts_temp[i][3]
forge_change(@sproducts_temp[i][0], @sproducts_temp[i][1], @sproducts_temp[i][2])
end
end
else
for i in 0...@fproducts_temp.size
if @fproducts_temp[i][3]==100
@pro3=0#成功额外产率为100%时随即概率为0
elsif @fproducts_temp[i][3]<100
@pro3=rand(99)#成功额外产率为0-99%时随即概率为0-99%
else
@pro3=0#成功额外产率为0%时没有成功额外产物
end
if @pro3<@fproducts_temp[i][3]
forge_change(@fproducts_temp[i][0], @fproducts_temp[i][1], @fproducts_temp[i][2])
end
end
end
if $SE_Compose_Successful != ""
Audio.se_play($SE_Compose_Successful)
end
# 合成失败的情况
else
if $SE_Compose_Failed != ""
Audio.se_play($SE_Compose_Failed)
end
if $Ingredient_Lost_When_Fail
$game_temp.forge = []
end
end
# 刷新各窗口
@item_window.refresh
@forge_window.refresh
end
end
复制代码
作者:
chd114
时间:
2013-8-23 13:47
这个脚本还可以改变开关和变量,可以说是无所不做了= =
作者:
fangyc
时间:
2013-8-23 14:07
哦,看错了……4楼的脚本应该可行~~
作者:
chd114
时间:
2013-8-23 14:18
fangyc 发表于 2013-8-23 14:07
哦,看错了……4楼的脚本应该可行~~
这个脚本是配方不公开····然后你成品、材料、额外产物、合成(分解)失败的产物都可以设置任意数量/种类
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1