Project1
标题:
几个问题请教下。
[打印本页]
作者:
a22506365
时间:
2009-9-21 15:37
标题:
几个问题请教下。
第一:装备
请问有什么可以增加武器属性的脚本,比如要加什么东西多少钱多少经验才能够让武器附上属性
XP版本的。 还有 那个日文的太变态了第一个加了2点攻击第二个0点第三个10点第四个8点,就是
找不到地方改这些属性值,金钱方面自己改了还可以不过一级加的属性值第一个差不多后面三个都太多了、、
第二:事件、变量
怎么使用变量限制事件。比如我要做个剧情不过等级不够要用变量限制住。
第三:脚本、加点
我本身有一个加点的脚本了,不过想设置些回答问题问答对的就给与1点加点的属性点。
回答错的就减掉他1点属性点这样。不过就是找不到有什么脚本可以减掉加点的那些点数
比如
体质:50
魔力:50
力量:50
防御:50
敏捷:50
潜能点:10 ←加的或减就是潜能点这个。
第三:武器、打孔、打宝石
有没有XP版本的打孔打宝石的。或者随即属性的武器打造就可以。
作者:
白鬼
时间:
2009-9-21 16:25
一、有脚本还是用脚本方便。把你用的那个脚本用【
插入代码
复制代码
】贴出来,我帮你看看。
二、事件有一个功能 “条件分歧” 具体使用方法,请看置顶新手教程
三、潜能点是用变量来记录的。如果要加,可以直接“变量操作”。要减的话,问题很多。
直接“变量操作”可以。但是,如果这个时候潜能点为0时,就没有效果了。
也就是说,人家把潜能点都加好了,再去答题,答对了就又有潜能点了,打错了也不会被扣走。
其实可以这样操作,不去控制“潜能点”。事件有一个功能,事件指令第三页,“增减能力值”。
不过这个还是要做复杂的判断,如果XX在队伍中,就减少或者增加;如果不在,就不做任何修改。
总之,还是 “条件分歧”
【纠正一下】
你排列有问题,
第三:脚本、加点
第三:武器、打孔、打宝石
第三:武器、打孔、打宝石 应该是第四个了吧。
四、打孔脚本未见。不过你可以通过你问的第一个,那个来实现。其实说白了就是增加武器属性而已,打宝石或者武器升级都一样。
至于“随机属性的武器打造”,请在主站上搜索 “武器”
作者:
a22506365
时间:
2009-9-21 16:50
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
# ▼▲▼ XRXS24. システム?ウェポンプロパティXC. ver..01a ▼▲▼
# by 桜雅 在土
#
# ※ XRXS.RGSS改良カスタマイズ が必要です。
# --- 仕様 ---
#
# ◇装備武器のプロパティの変更
# ├◇例:actor(==Game_Actor)の装備武器の付与属性#1を 21 に設定
# └◇スクリプト:actor.weapon_property[PROPERTY_ELEMENT_GRANT_1st] = 21
#
#==============================================================================
# □ 定数
#==============================================================================
module Fixed_PropertyNumber
# 現在のプロパティの総数
PROPERTY_NUMBER = 8
# 「属性」数(ダメージ倍率ようとして用いられる属性の数)
ELEMENTS_NUMBER = 16
# 以下のナンバーは 同値は指定不可能かつ0から個数-1までの整数
PROPERTY_ROOM_FILLED = 0 # プロパティ:部屋が空いているかどうか
PROPERTY_LEVEL = 1 # プロパティ:武器レベル
PROPERTY_EXP = 2 # プロパティ:エクストラポイント
PROPERTY_EXP_SECOND = 3 # プロ靴匹#亥ē攻去楗荪ぅ螗?ケタ目(32768進法)
PROPERTY_ELEMENT_GRANT_1st = 4 # プロパティ:付与属性#1
PROPERTY_ELEMENT_GRANT_2nd = 5 # プロパティ:付与属性#2
PROPERTY_ELEMENT_GRANT_3rd = 6 # プロパティ:付与属性#3
PROPERTY_ELEMENT_GRANT_4th = 7 # プロパティ:付与属性#4
end
#==============================================================================
$xrxs24_weapon_property_system_work = true
#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :weapons_table # ウェポンテーブル
#--------------------------------------------------------------------------
# ウェポンテーブル解説
#--------------------------------------------------------------------------
=begin
@weapons_table[weapon_id, room_no, property]
weapon_id は、武器のIDです。
room_no は、部屋のNo.です。武器がここに格納されます。
property は、プロパティです。
property
0 部屋の空き情報。0が空き、1が埋まり。
1 EXP数値。数値が入ります。
例えば、@weapons_table[1, 0, 0] が1の場合、
ID.1の武器がNo.0の部屋に存在する。ということ。
=end
def weapons_table
@weapons_table
end
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs24_initialize initialize
def initialize
xrxs24_initialize
# ウェポンテーブルを作成
@weapons_table = Table.new(0,0,PROPERTY_NUMBER)
end
#--------------------------------------------------------------------------
# ● 武器の入手 # ←武器の増加
# weapon_id : 武器 ID
# set_level : 初期武器レベル # ←元個数n
#--------------------------------------------------------------------------
def gain_weapon(weapon_id, set_level)
# weapon_id が 0 の場合
if weapon_id == 0
return 0
end
# ハッシュの個数データを更新
if weapon_id > 0
@weapons[weapon_id] = [[weapon_number(weapon_id) + 1, 0].max, 99].min
end
# ウェポンテーブルに新規アイテムを追加
# xsize(テーブルの武器IDの最大値)が足りない場合リサイズ
if @weapons_table.xsize <= weapon_id
@weapons_table.resize(weapon_id+1, @weapons_table.ysize, @weapons_table.zsize)
end
# ysize(テーブルの個数の最大値)が足りない場合リサイズ
num = weapon_number(weapon_id)
if @weapons_table.ysize <= num
@weapons_table.resize(@weapons_table.xsize, num+1, @weapons_table.zsize)
end
# ウェポンテーブルから空き部屋No.を検索
for i in 0...@weapons_table.ysize
# 空き部屋である 0 を返した場合
if @weapons_table[weapon_id, i, PROPERTY_ROOM_FILLED] != 1
# 部屋を埋める
@weapons_table[weapon_id, i, PROPERTY_ROOM_FILLED] = 1
# 初期武器レベルを設定
@weapons_table[weapon_id, i, PROPERTY_LEVEL] = set_level
# EXPをレベルの三乗に設定
expp = set_level ** 3
# EXPの数値を設定
@weapons_table[weapon_id, i, PROPERTY_EXP] = expp%32768
@weapons_table[weapon_id, i, PROPERTY_EXP_SECOND] = (expp/32768).floor
# 終了、部屋番号を返す
return i
end
end
# 空き部屋が無かった場合
p "[空的房间!!" # 本来起こりえないはず # 起きたらプログラムミス
end
#--------------------------------------------------------------------------
# ● 武器を捨てる # ←武器の減少
# weapon_id : 武器 ID
# room_no : ルームNo. # ※元?個数n
#--------------------------------------------------------------------------
def lose_weapon(weapon_id, room_no)
# weapon_id が 0 の場合
if weapon_id == 0
return 0
end
# ハッシュの個数データを更新
if weapon_id > 0
@weapons[weapon_id] = [[weapon_number(weapon_id) - 1, 0].max, 99].min
end
# ウェポンテーブルに設定
# 部屋を空き部屋にする
@weapons_table[weapon_id, room_no, PROPERTY_ROOM_FILLED] = 0
# 他全プロパティを 0 化
for i in 0...PROPERTY_NUMBER
@weapons_table[weapon_id, room_no, i] = 0
end
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :weapon_property # 装備中の武器のウェポンプロパティ
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias xrxs24_setup setup
def setup(actor_id)
xrxs24_setup(actor_id)
# 初期化
@weapon_property = Table.new(PROPERTY_NUMBER)
@weapon_property[PROPERTY_LEVEL] = 1 # 初期武器のレベルは1
@equip_room_no = 0
end
#--------------------------------------------------------------------------
# ● 通常攻撃の属性取得
#--------------------------------------------------------------------------
alias xrxs24_element_set element_set
def element_set
attack_element_set = xrxs24_element_set
for i in 1..ELEMENTS_NUMBER
for j in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
if @weapon_property[j] == i and !attack_element_set.include?(i)
attack_element_set.push(i)
end
end
end
return attack_element_set
end
#--------------------------------------------------------------------------
# ● 装備変更予定の部屋番号
# room_no : 装備する元のアイテムの部屋No.
#--------------------------------------------------------------------------
def equip_room_no(rn)
@equip_room_no = rn
end
#--------------------------------------------------------------------------
# ● 装備の変更
# equip_type : 装備タイプ
# id : 武器 or 防具 ID (0 なら装備解除)
#--------------------------------------------------------------------------
alias xrxs24_equip equip
def equip(equip_type, id)
case equip_type
when 0 # 武器
if id == 0 or $game_party.weapon_number(id) > 0
# 現在装備武器
if @weapon_id != 0
# 現在装備を増やす
used_room_no = $game_party.gain_weapon(@weapon_id, 1)
# アクター現在武器のプロパティ
for i in 0...PROPERTY_NUMBER
# プロパティを部屋へコピー
$game_party.weapons_table[@weapon_id, used_room_no, i] = @weapon_property[i]
# コピー後に削除
@weapon_property[i] = 0
end
# 部屋の空き状況は無条件で 1 にする
$game_party.weapons_table[@weapon_id, used_room_no, PROPERTY_ROOM_FILLED] = 1
#p "武器ID. " + @weapon_id.to_s + ", 部屋No." + used_room_no.to_s
end
# 新規装着
if id != 0
# 装備対象武器のプロパティ
for i in 0...PROPERTY_NUMBER
# プロパティをアクターへコピー
@weapon_property[i] = $game_party.weapons_table[id, @equip_room_no, i]
# コピー後に削除
$game_party.weapons_table[id, @equip_room_no, i] = 0
end
# 装備対象のアイテムを消す
$game_party.lose_weapon(id, @equip_room_no)
# 外す場合
else
# アクタープロパティを初期化
for i in 0...PROPERTY_NUMBER
@weapon_property[i] = 0
end
end
# 装備変更
@weapon_id = id
end
return
end
xrxs24_equip(equip_type, id)
end
#--------------------------------------------------------------------------
# ● 基本攻撃力の取得
#--------------------------------------------------------------------------
def base_atk
weapon = $data_weapons[@weapon_id]
if weapon == nil
return 0
else
return weapon.atk * (100 + weapon.atk%10 * @weapon_property[PROPERTY_LEVEL]) /100
end
end
end
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
@data_id = []
xrxs24_refresh
end
#--------------------------------------------------------------------------
# ● アイテムの部屋番号の取得
#--------------------------------------------------------------------------
def item_room_no
return @data_id[self.index]
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
# 武器をプッシュ
@data.push($data_weapons[i])
# 部屋No.を合わせる
@data_id[@data.size-1] = j
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
alias xrxs24_draw_item draw_item
def draw_item(index)
item = @data[index]
case item
when RPG::Weapon
room_no = @data_id[index].nil? ? 0 : @data_id[index]
number = $game_party.weapon_number(item.id)
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 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)
if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id)
opacity = 255
else
opacity = 128
end
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id)
self.contents.font.color = system_color
self.contents.draw_text(x + 224, y, 56, 32, "Lv. ")
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
self.contents.draw_text(x +224, y, 56, 32, "Lv. ")
end
level = $game_party.weapons_table[item.id, room_no, PROPERTY_LEVEL].to_s
self.contents.draw_text(x + 232, y, 48, 32, level, 2)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
else
xrxs24_draw_item(index)
end
end
end
#==============================================================================
# ■ Window_EquipRight
#==============================================================================
class Window_EquipRight < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
xrxs24_refresh
self.contents.font.color = system_color
self.contents.draw_text(276, 0, 56, 32, "Lv. ")
self.contents.font.color = normal_color
level = @actor.weapon_property[PROPERTY_LEVEL].to_s
self.contents.draw_text(284, 0, 48, 32, level, 2)
end
end
#==============================================================================
# ■ Window_EquipItem
#==============================================================================
class Window_EquipItem < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● アイテムの部屋番号の取得
#--------------------------------------------------------------------------
def item_room_no
return @data_id[self.index]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
@data_id = []
xrxs24_refresh
end
#--------------------------------------------------------------------------
# ● 指定クラスが装備可能、かつ所有している武器を @data に返す
#--------------------------------------------------------------------------
def set_equipable_weapon_data(class_id)
weapon_set = $data_classes[class_id].weapon_set
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0 and weapon_set.include?(i)
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
# 武器をプッシュ
@data.push($data_weapons[i])
# 部屋No.を合わせる
@data_id[@data.size-1] = j
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
alias xrxs24_draw_item draw_item
def draw_item(index)
item = @data[index]
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 32
case item
when RPG::Weapon
room_no = @data_id[index].nil? ? 0 : @data_id[index]
number = $game_party.weapon_number(item.id)
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.font.color = system_color
self.contents.draw_text(x + 224, y, 56, 32, "Lv. ")
self.contents.font.color = normal_color
level = $game_party.weapons_table[item.id, room_no, PROPERTY_LEVEL].to_s
self.contents.draw_text(x + 232, y, 48, 32, level, 2)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
else
xrxs24_draw_item(index)
end
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
if self.item.is_a?(RPG::Weapon)
element_name = $data_system.elements[$game_party.weapons_table[self.item.id, self.item_room_no, PROPERTY_ELEMENT_GRANT_1st]]
else
element_name = ""
end
@help_window.set_text(self.item == nil ? "" : self.item.description + element_name)
end
end
#==============================================================================
# ■ Window_ShopSell
#==============================================================================
class Window_ShopSell < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :column_max
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
@data_id = []
xrxs24_refresh
end
#--------------------------------------------------------------------------
# ● 部屋No.の取得
#--------------------------------------------------------------------------
def item_room_no
return @data_id[self.index]
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
# 武器をプッシュ
@data.push($data_weapons[i])
# 部屋No.を合わせる
@data_id[@data.size-1] = j
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
alias xrxs24_draw_item draw_item
def draw_item(index)
item = @data[index]
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 32
case item
when RPG::Weapon
room_no = @data_id[index].nil? ? 0 : @data_id[index]
number = $game_party.weapon_number(item.id)
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.font.color = system_color
self.contents.draw_text(x + 224, y, 56, 32, "Lv. ")
self.contents.font.color = normal_color
level = $game_party.weapons_table[item.id, room_no, PROPERTY_LEVEL].to_s
self.contents.draw_text(x + 232, y, 48, 32, level, 2)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
else
xrxs24_draw_item(index)
end
end
end
#==============================================================================
# ■ Scene_Equip
#==============================================================================
class Scene_Equip
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
# アイテムウィンドウの可視状態設定
@item_window1.visible = (@right_window.index == 0)
@item_window2.visible = (@right_window.index == 1)
@item_window3.visible = (@right_window.index == 2)
@item_window4.visible = (@right_window.index == 3)
@item_window5.visible = (@right_window.index == 4)
# 現在装備中のアイテムを取得
item1 = @right_window.item
# 現在のアイテムウィンドウを @item_window に設定
case @right_window.index
when 0
@item_window = @item_window1
when 1
@item_window = @item_window2
when 2
@item_window = @item_window3
when 3
@item_window = @item_window4
when 4
@item_window = @item_window5
end
# ライトウィンドウがアクティブの場合
if @right_window.active
# 装備変更後のパラメータを消去
@left_window.set_new_parameters(nil, nil, nil)
end
# アイテムウィンドウがアクティブの場合
if @item_window.active
# 現在選択中のアイテムを取得
item2 = @item_window.item
# 部屋No.の取得
room_no = @item_window.item_room_no
# 装備は変更しない
# 装備変更後のパラメータを取得
if item2.is_a?(RPG::Weapon)
# 現在の仕様では、アクター自体には物理攻撃力保持が有り得ないと考える。
# この仕様が変更された場合は、ここの改造のこと。
if item2 == nil
new_atk = 0
else
level = $game_party.weapons_table[item2.id, room_no, PROPERTY_LEVEL]
new_atk = item2.atk * (100 + item2.atk%10 * level) / 100
end
end
new_pdef = @actor.pdef - (item1 == nil ? 0 : item1.pdef) + (item2 == nil ? 0 : item2.pdef)
new_mdef = @actor.mdef - (item1 == nil ? 0 : item1.mdef) + (item2 == nil ? 0 : item2.mdef)
# レフトウィンドウに描画
@left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アイテムウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_item
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# ライトウィンドウをアクティブ化
@right_window.active = true
@item_window.active = false
@item_window.index = -1
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 装備 SE を演奏
$game_system.se_play($data_system.equip_se)
# アイテムウィンドウで現在選択されているデータを取得
item = @item_window.item
item_room_no = @item_window.item_room_no
# 装備を変更------
# ---部屋No.を先に教える
@actor.equip_room_no(item_room_no != nil ? item_room_no : 0)
# ---実際に装備を変更
@actor.equip(@right_window.index, item == nil ? 0 : item.id)
# ---------------
# ライトウィンドウをアクティブ化
@right_window.active = true
@item_window.active = false
@item_window.index = -1
# ライトウィンドウ、アイテムウィンドウの内容を再作成
@right_window.refresh
@item_window.refresh
return
end
end
end
#==============================================================================
# ■ Scene_Shop
#==============================================================================
class Scene_Shop
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
alias xrxs24_main main
def main
# 売却確認ウィンドウの作成
@sell_check_window = Window_ShopSellCheck.new
@sell_check_window.active = false
@sell_check_window.visible = false
# 呼び戻す
xrxs24_main
# ウィンドウを解放
@sell_check_window.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs24_update update
def update
# ウィンドウを更新
@sell_check_window.update
# 売却確認ウィンドウがアクティブの場合: update_sell_check を呼ぶ
if @sell_check_window.active
update_sell_check
return
end
# 呼び戻す
xrxs24_update
end
#--------------------------------------------------------------------------
# ● フレーム更新 (売却ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
alias xrxs24_update_sell update_sell
def update_sell
# C ボタンが押された場合
if Input.trigger?(Input::C) and @sell_window.item.is_a?(RPG::Weapon)
# アイテムを取得
@item = @sell_window.item
# 部屋No.の取得
sell_room_no = @sell_window.room_no
# ステータスウィンドウのアイテムを設定
@status_window.item = @item
# アイテムが無効の場合、または価格が 0 (売却不可) の場合
if @item == nil or @item.price == 0
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# ウィンドウの状態を売却確認モードへ
@sell_window.active = false
@sell_window.visible = false
@sell_check_window.set(@item.id, sell_room_no)#,@item, max, @item.price / 2)
@sell_check_window.active = true
@sell_check_window.visible = true
@status_window.visible = true
return
end
xrxs24_update_sell
end
#--------------------------------------------------------------------------
# ● フレーム更新 (売却確認ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_sell_check
# B ボタンが押された場合 / "やめる"で C ボタンが押された場合
if Input.trigger?(Input::B) or
(Input.trigger?(Input::C) and @sell_check_window.cursor_pos == 1)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# 売却確認ウィンドウを非アクティブ?不可視に設定
@sell_check_window.active = false
@sell_check_window.visible = false
# ウィンドウの状態を売却モードへ
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
return
end
# "売却"で C ボタンが押された場合
if Input.trigger?(Input::C) and @sell_check_window.cursor_pos == 0
# ショップ SE を演奏
$game_system.se_play($data_system.shop_se)
# 売却確認ウィンドウを非アクティブ?不可視に設定
@sell_check_window.active = false
@sell_check_window.visible = false
# 売却処理
$game_party.gain_gold(@sell_check_window.total_price)
# room_noのアイテムを消す
item_id = @sell_check_window.item_id
room_no = @sell_check_window.room_no
$game_party.lose_weapon(item_id, room_no)
# 各ウィンドウをリフレッシュ
@gold_window.refresh
@sell_window.refresh
@status_window.refresh
# ウィンドウの状態を売却モードへ
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
return
end
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● アフターバトルフェーズ開始
#--------------------------------------------------------------------------
alias xrxs24_start_phase5 start_phase5
def start_phase5
# EXPを初期化
exp = 0
# ループ
for enemy in $game_troop.enemies
# エネミーが隠れ状態でない場合
unless enemy.hidden
# 獲得 EXP、ゴールドを追加
exp += enemy.exp
end
end
# EXP 獲得
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
#if actor.cant_get_exp? == false
# アクターの武器に経験値獲得
now_exp = actor.weapon_property[PROPERTY_EXP_SECOND] * 32768
now_exp += actor.weapon_property[PROPERTY_EXP]
now_exp += exp
actor.weapon_property[PROPERTY_EXP] += now_exp%32768
actor.weapon_property[PROPERTY_EXP_SECOND] +=(now_exp/32768).floor
#end
end
xrxs24_start_phase5
end
end
#==============================================================================
# ■ Window_ShopSellCheck
#------------------------------------------------------------------------------
# ショップ画面で、売却するアイテムを表示し、売却を選択するウィンドウです。
#==============================================================================
class Window_ShopSellCheck < Window_Base
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :total_price
attr_reader :cursor_pos
attr_reader :item_id
attr_reader :room_no
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 128, 368, 352)
self.contents = Bitmap.new(width - 32, height - 32)
end
#--------------------------------------------------------------------------
# ● アイテムID、部屋No.
#--------------------------------------------------------------------------
def set(item_id, room_no)
@item_id = item_id
@room_no = room_no
@cursor_pos = 0
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# アイテム名描写
draw_item_name($data_weapons[@item_id], 4, 32)
# 武器レベルの取得と描写
level = $game_party.weapons_table[@item_id, @room_no, PROPERTY_LEVEL]
self.contents.font.color = system_color
self.contents.draw_text(244, 32, 90, 32, "Lv. ")
self.contents.font.color = normal_color
self.contents.draw_text(244, 32, 90, 32, level.to_s, 2)
# カーソル位置の更新
self.cursor_rect.set(240, 224, 96, 32)
# 選択肢の描写
self.contents.draw_text(244, 224, 96, 32, "出售")
self.contents.draw_text(244, 256, 96, 32, "取消")
# 売却金額の計算
@total_price = $data_weapons[@item_id].price * (10 + 1*level) / 20
# 合計価格と通貨単位を描画
domination = $data_system.words.gold
cx = contents.text_size(domination).width
self.contents.font.color = normal_color
self.contents.draw_text(4, 160, 328-cx-2, 32, @total_price.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(332-cx, 160, cx, 32, domination, 2)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
if self.active
# カーソル上下
if Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
if @cursor_pos == 0
@cursor_pos = 1
else
@cursor_pos = 0
end
# カーソル位置の更新
self.cursor_rect.set(240, 224 + 32 * @cursor_pos, 96, 32)
end
end
end
end
#==============================================================================
# ■ Window_PartyWeapon
#------------------------------------------------------------------------------
# 鍛冶屋画面で、パーティ全員の現在装備している武器を表示するウィンドウです。
#==============================================================================
class Window_PartyWeapon < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 64, 368, 224)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
self.index = -1
end
#--------------------------------------------------------------------------
# ● アイテムの取得
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@data = []
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 192, 32, "全部武器")
self.contents.draw_text(4, 160, 192, 32, "所有物品")
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
next if actor == nil
@data.push($data_weapons[actor.weapon_id])
# キャラ顔
draw_actor_facesquare($game_party.actors[i], 4, 32 + 32 * i+4)
# 武器名
self.contents.font.color = normal_color
draw_item_name(@data[i], 36, 32 + 32 * i)
level = $game_party.actors[i].weapon_property[PROPERTY_LEVEL]
# レベル
self.contents.draw_text(296, 32 + 32 * i, 24, 32, level.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(260, 32 + 32 * i, 32, 32, "Lv.")
end
@item_max = @data.size
end
#--------------------------------------------------------------------------
# ● グラフィック→顔&枠の描画
# actor : アクター
# x : 描画先 X 座標
# y : 描画先 Y 座標
#--------------------------------------------------------------------------
def draw_actor_facesquare(actor, x, y, width = 24, height = 24)
bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
src_rect = Rect.new((bitmap.width/4 - width)/2, 0, width, height)
self.contents.blt(x, y, bitmap, src_rect)
self.contents.draw_polygon([[x,y],[x+width,y],[x+width,y+height],[x,y+height]], Color.new(255,255,255,128))
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? "" : self.item.description)
end
#--------------------------------------------------------------------------
# ● カーソルの矩形更新
#--------------------------------------------------------------------------
def update_cursor_rect
if @index == -1
self.cursor_rect.set(0, 0, 0,0)
else
self.cursor_rect.set(0, 32 + @index * 32, self.width - 32, 32)
end
end
end
#==============================================================================
# ■ Window_WeaponInfo
#------------------------------------------------------------------------------
# 鍛冶屋画面で、武器のパラメータなどを表示するウィンドウです。
#==============================================================================
class Window_WeaponInfo < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :level # 表示中の武器のレベル
attr_reader :property_elements # 属性
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# actor : アクター
#--------------------------------------------------------------------------
def initialize
super(368, 64, 272, 416)
self.contents = Bitmap.new(width - 32, height - 32)
# 消去する
set(nil)
@item_max = 5
end
#--------------------------------------------------------------------------
# ● レベルを上げられる状況にあるか
#--------------------------------------------------------------------------
def levelupable?
return @levelupable
end
#--------------------------------------------------------------------------
# ● 値をセットする
#--------------------------------------------------------------------------
def set(item, room_no = 0)
# 初期化
@levelupable = false
case item
when nil
# nilの場合全てを消去
self.contents.clear
return
when Game_Actor
# アクターを指定した場合は装備中の武器の情報 使用例:set(actor)
@actor = item
@item = $data_weapons[@actor.weapon_id]
else
# アイテムを指定した場合
@actor = nil
@item = item
@room_no = room_no
end
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
# 初期化
@levelupable = false
self.contents.clear
# 武器名
draw_item_name(@item, 4, 32)
# 武器の場合、Lv: の描写
if @item.is_a?(RPG::Weapon)
# 武器のレベルと経験値の取得
if @actor != nil
@level = @actor.weapon_property[PROPERTY_LEVEL]
exp_p = @actor.weapon_property[PROPERTY_EXP_SECOND]
exp_p *= 32768
exp_p += @actor.weapon_property[PROPERTY_EXP]
else
@level = $game_party.weapons_table[@item.id, @room_no, PROPERTY_LEVEL]
exp_p = $game_party.weapons_table[@item.id, @room_no, PROPERTY_EXP_SECOND]
exp_p *= 32768
exp_p += $game_party.weapons_table[@item.id, @room_no, PROPERTY_EXP]
end
# 武器レベル
self.contents.font.color = system_color
self.contents.draw_text(140, 64, 32, 32, "Lv.")
self.contents.font.color = normal_color
self.contents.draw_text(216, 64, 24, 32, @level.to_s, 2)
# 武器経験値
self.contents.font.size = 8
self.contents.font.color = system_color
self.contents.draw_text(156, 88, 32, 16, "EXP.")
# EXPメーター
self.contents.draw_line(171, 96, 273, 96, Color.new(0,0,0,255), 3)
now_level_exp = next_exp = ((@level) ** 3)
next_level_exp = ((@level + 1) ** 3) # 次のレベルの所要EXPへの割合
percentile = [[100 * (exp_p - now_level_exp) / (next_level_exp - now_level_exp), 0].max, 100].min
if percentile < 100
line_color = Color.new(255, 255, 0, 255)
else
line_color = Color.new( 0, 255, 0, 255)
@levelupable = true
end
self.contents.draw_line(172, 96, 172 + percentile, 96, line_color, 1)
self.contents.font.size = 22
# 攻撃力
self.contents.font.color = system_color
self.contents.draw_text( 96, 128, 96, 32, $data_system.words.atk)
atk_p = @item.atk * (100 + @item.atk%10 * level)/100
self.contents.font.color = normal_color
self.contents.draw_text(192, 128, 48, 32, atk_p.to_s, 2)
# 武器属性
i_no = 0
for i in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
if @actor != nil
element_id = @actor.weapon_property[i]
else
element_id = $game_party.weapons_table[@item.id, @room_no, i]
end
if element_id != 0 and element_id != nil
self.contents.font.color = normal_color
self.contents.draw_text(112, 160 + 32*i_no, 128, 32, $data_system.elements[element_id])
else
self.contents.font.color = disabled_color
self.contents.draw_text(112, 160 + 32*i_no, 128, 32, "---")
end
i_no += 1
end
end
# 可視状態にする
self.visible = true
end
#--------------------------------------------------------------------------
# ● カーソルの矩形更新
#--------------------------------------------------------------------------
def update_cursor_rect
if @index == -1
self.cursor_rect.set(0, 0, 0,0)
elsif @index == 0
self.cursor_rect.set(0, 64, self.width - 32, 32)
else
self.cursor_rect.set(0, 128 + @index * 32, self.width - 32, 32)
end
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
case self.index
when 0
@help_window.set_text("进行武器强化。")
else
@help_window.set_text("为武器附加属性。")
end
end
end
#==============================================================================
# ■ Window_CenterAsk
#------------------------------------------------------------------------------
# 画面中央で二択の質問を問い掛けるウィンドウです。
#==============================================================================
class Window_CenterAsk < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(320, 192, 160, 96)
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
@first_choice = ""
@second_choice = ""
@helptext = ["", ""]
@disabled = []
self.z = 9999
@item_max = 2
self.index = 0
end
#--------------------------------------------------------------------------
# ● 選択肢の設定 first_choice,second_choice == String
#--------------------------------------------------------------------------
def set(first_choice, second_choice, help1 = "", help2 = "")
@disabled[0] = false
@disabled[1] = false
@first_choice = first_choice
@second_choice = second_choice
@helptext[0] = help1
@helptext[1] = help2
width1 = self.contents.text_size(@first_choice).width
width2 = self.contents.text_size(@second_choice).width
self.width = (width1 > width2 ? width1 : width2) + 40
self.x = 320 - self.width / 2
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● 選択肢無効化
#--------------------------------------------------------------------------
def disable(n)
@disabled[n] = true
refresh
end
#--------------------------------------------------------------------------
# ● 選択肢が無効化されているか?
#--------------------------------------------------------------------------
def disabled?(n)
return @disabled[n]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
if @disabled[0]
self.contents.font.color = disabled_color
else
self.contents.font.color = normal_color
end
self.contents.draw_text(4, 0, self.width-8, 32, @first_choice)
if @disabled[1]
self.contents.font.color = disabled_color
else
self.contents.font.color = normal_color
end
self.contents.draw_text(4, 32, self.width-8, 32, @second_choice)
# カーソル位置も戻す
self.index = 0
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(@helptext[self.index])
end
end
#==============================================================================
# ■ Window_SmithyItems
#------------------------------------------------------------------------------
# 鍛冶屋画面で、付与のための所持アイテムの一覧を表示するウィンドウです。
#==============================================================================
class Window_SmithyItems < Window_ShopSell
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :item_max
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super
self.x = 32
self.y = 256
self.width = 336
self.height = 224
self.opacity = 0
self.back_opacity = 0
@column_max = 1
self.index = -1
refresh
end
#--------------------------------------------------------------------------
# ● 現在 @item の第一属性の取得
#--------------------------------------------------------------------------
def item_first_element
item = self.item
room_no = self.item_room_no
return 0 if item.nil? or item.id == 0
if item.is_a?(RPG::Armor)
element_set = item.guard_element_set
else
element_set = item.element_set
end
if element_set.size == 0 and item.is_a?(RPG::Weapon)
for i in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
element_id = $game_party.weapons_table[item.id, room_no, i]
if element_id > 0
element_set = [element_id]
break
end
end
end
if element_set.size == 0
return 0
else
return element_set[0]
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上のアイテムを @data に返す &属性所有のみ
#--------------------------------------------------------------------------
def set_own_item_data
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
if $data_items[i].element_set.size > 0
@data.push($data_items[i])
end
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す &属性所有のみ
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
for k in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
if ($data_weapons[i].element_set.size > 0) or
($game_party.weapons_table[i, j, k] > 0)
# 武器をプッシュ
@data.push($data_weapons[i])
# 部屋No.を合わせる
@data_id[@data.size-1] = j
break
end
end
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の防具を @data に返す &属性所有のみ
#--------------------------------------------------------------------------
def set_own_armor_data
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0
if $data_armors[i].guard_element_set.size > 0
@data.push($data_armors[i])
end
end
end
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
element_id = self.item_first_element
case element_id
when 0
@help_window.set_text("没有可以附加的属性")
else
@help_window.set_text("附加属性: " + $data_system.elements[element_id])
end
end
end
#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs24_update update
def update
xrxs24_update
# プレイヤーの移動中ではない場合
unless $game_player.moving?
# 鍛冶屋画面の呼び出しを実行
if $game_temp.smithy_calling
call_smithy
end
end
end
#--------------------------------------------------------------------------
# ● 鍛冶屋の呼び出し
#--------------------------------------------------------------------------
def call_smithy
# 鍛冶屋呼び出しフラグをクリア
$game_temp.smithy_calling = false
# プレイヤーの姿勢を矯正
$game_player.straighten
# 鍛冶屋画面に切り替え
$scene = Scene_Smithy.new
end
end
#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :smithy_calling # 鍛冶屋 呼び出しフラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs24_initialize initialize
def initialize
xrxs24_initialize
@smithy_calling = false
end
end
#==============================================================================
# ■ Interpreter
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ◆ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ◇ 鍛冶屋の処理
#--------------------------------------------------------------------------
def command_smithy
# バトル中断フラグをセット
$game_temp.battle_abort = true
# 鍛冶屋呼び出しフラグをセット
$game_temp.smithy_calling = true
# 商品リストに新しい項目を設定
$game_temp.shop_goods = [@parameters]
end
#--------------------------------------------------------------------------
# ◇ 武器経験値の取得
#--------------------------------------------------------------------------
def command_weapon_gain_exp(actor_id, exp)
now_exp = $game_party.actors[actor_id].weapon_property[PROPERTY_EXP_SECOND] * 32768
now_exp+= $game_party.actors[actor_id].weapon_property[PROPERTY_EXP]
now_exp+= exp
$game_party.actors[actor_id].weapon_property[PROPERTY_EXP] += now_exp%32768
$game_party.actors[actor_id].weapon_property[PROPERTY_EXP_SECOND] +=(now_exp/32768).floor
end
end
#==============================================================================
# ■ Scene_Smithy
#------------------------------------------------------------------------------
# 鍛冶屋画面の処理を行うクラスです。
#==============================================================================
class Scene_Smithy
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def main
# ヘルプウィンドウを作成
@help_window = Window_Help.new
# パーティ武器ウィンドウを作成
@partyweapon_window = Window_PartyWeapon.new
@partyweapon_window.help_window = @help_window
@partyweapon_window.height += 192
@partyweapon_window.active = true
@partyweapon_window.index = 0
# アイテムウィンドウを作成
@sellect_window = Window_SmithyItems.new
@sellect_window.help_window = @help_window
@sellect_window.z = @partyweapon_window.z + 1
@sellect_window.active = false
# 武器インフォウィンドウを作成
@weaponinfo_window = Window_WeaponInfo.new
@weaponinfo_window.set(nil)
@weaponinfo_window.active = false
@weaponinfo_window.index = -1
@weaponinfo_window.help_window = @help_window
# ゴールドウィンドウを作成
@gold_window = Window_Gold.new
@gold_window.x = 480
@gold_window.y = 416
@gold_window.z = @weaponinfo_window.z + 1
# 訪ねウィンドウを作成
@ask_window = Window_CenterAsk.new
@ask_window.active = false
@ask_window.help_window = @help_window
# トランジション実行
Graphics.transition
# メインループ
loop do
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
# フレーム更新
update
# 画面が切り替わったらループを中断
if $scene != self
break
end
end
# トランジション準備
Graphics.freeze
# ウィンドウを解放
@help_window.dispose
@gold_window.dispose
@partyweapon_window.dispose
@sellect_window.dispose
@weaponinfo_window.dispose
@ask_window.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# ウィンドウを更新
@help_window.update
@gold_window.update
@partyweapon_window.update
@sellect_window.update
@weaponinfo_window.update
@ask_window.update
# パーティ武器ウィンドウがアクティブの場合: update_partyweapon を呼ぶ
if @partyweapon_window.active
update_partyweapon
return
end
# 武器インフォウィンドウがアクティブの場合: update_weaponinfo を呼ぶ
if @weaponinfo_window.active
update_weaponinfo
return
end
# アイテム選択ウィンドウがアクティブの場合: update_sellect を呼ぶ
if @sellect_window.active
update_sellect
return
end
# 中央選択ウィンドウがアクティブの場合: update_ask を呼ぶ
if @ask_window.active
update_ask
return
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (パーティ武器ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_partyweapon
# ステータスウィンドウのアイテムを設定
@weaponinfo_window.set($game_party.actors[@partyweapon_window.index])
# B ボタンが押された場合
if Input.trigger?(Input::B)
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# マップ画面に切り替え
$scene = Scene_Map.new
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
@weaponinfo_window.active = true
@weaponinfo_window.index = 0
@partyweapon_window.active = false
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (武器インフォウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_weaponinfo
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
@partyweapon_window.active = true
@weaponinfo_window.active = false
@weaponinfo_window.index = -1
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
case @weaponinfo_window.index
when 0
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# レベルによる強化金額の設定はこちら(もう一箇所も)
price = (@weaponinfo_window.level ** 2).floor * 200
first_choice = "进行强化!! " + price.to_s + " " + $data_system.words.gold
if @weaponinfo_window.levelupable?
help1 = "支付强化武器所需的金钱。"
else
help1 = "武器经验值不足。"
end
if $game_party.gold < price
help1 = "现金不足。"
end
help2 = "中止强化。"
@ask_window.set(first_choice,"取消", help1, help2)
unless @weaponinfo_window.levelupable?
@ask_window.disable(0)
end
if $game_party.gold < price
@ask_window.disable(0)
end
@ask_window.active = true
@ask_window.visible = true
@weaponinfo_window.active = false
return
else
# 属性付与へ。まずはアイテムウィンドウへ移行
if @sellect_window.item_max <= 0
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# ウィンドウの状態を売却モードへ
@weaponinfo_window.active = false
@sellect_window.index = 0
@sellect_window.active = true
@sellect_window.refresh
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アイテム選択ウィンドウがアクティヴの場合)
#--------------------------------------------------------------------------
def update_sellect
# ステータスウィンドウのアイテムを設定
#@weaponinfo_window.set(@sellect_window.item, @sellect_window.item_room_no)
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# ウィンドウの状態を初期モードへ
@weaponinfo_window.active = true
@sellect_window.active = false
@sellect_window.index = -1
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 属性が一つ以上あるか、
if @sellect_window.item_first_element == 0
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# 属性を付与確認
price = 50000
first_choice = "附加属性!! " + price.to_s + " " + $data_system.words.gold
help1 = $data_system.elements[@sellect_window.item_first_element] + " 武器。"
help2 = "中止附加。"
if @sellect_window.item.price == 0
first_choice = "不能附加属性。"
help1 = "该人物不能使用。"
elsif $game_party.gold < price
help1 = "现金不足。"
end
@ask_window.set(first_choice,"取消", help1, help2)
if @sellect_window.item.price == 0
@ask_window.disable(0)
elsif $game_party.gold < price
@ask_window.disable(0)
end
@ask_window.active = true
@ask_window.visible = true
@sellect_window.active = false
return
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (中央二択ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_ask
# B ボタン or "やめる"で C ボタン が押された場合
if Input.trigger?(Input::B) or
(Input.trigger?(Input::C) and @ask_window.index == 1)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# ウィンドウ
@ask_window.active = false
@ask_window.visible = false
if @sellect_window.index >= 0
@sellect_window.active = true
else
@weaponinfo_window.active = true
end
return
end
# "実行"で C ボタンが押された場合
if Input.trigger?(Input::C) and @ask_window.index == 0
if @ask_window.disabled?(0)
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
if @sellect_window.index >= 0
# 属性付与
price = 50000
# 属性付与 SE を演奏
Audio.se_stop
Audio.se_play("Audio/SE/027-Door04.ogg")
# 付与を実行
# IDNo.の取得
case @weaponinfo_window.index
when 1
set_id = PROPERTY_ELEMENT_GRANT_1st
when 2
set_id = PROPERTY_ELEMENT_GRANT_2nd
when 3
set_id = PROPERTY_ELEMENT_GRANT_3rd
when 4
set_id = PROPERTY_ELEMENT_GRANT_4th
end
# 代入
$game_party.actors[@partyweapon_window.index].weapon_property[set_id] =
@sellect_window.item_first_element
# 付与に使用したアイテムをなくす
if @sellect_window.item.is_a?(RPG::Weapon)
$game_party.lose_weapon(@sellect_window.item.id, @sellect_window.item_room_no)
else
$game_party.lose_item(@sellect_window.item.id, 1)
end
else
# 武器強化
# 武器レベルアップ ME を演奏
Audio.me_stop
Audio.me_play("Audio/ME/011-Item02.mid")
# 強化を実行
$game_party.actors[@partyweapon_window.index].weapon_property[PROPERTY_LEVEL] += 1
# レベルによる強化金額の設定はこちら(もう一箇所も)
price = (@weaponinfo_window.level ** 1.5).floor * 50
end
# 金額を支払う
$game_party.lose_gold(price)
# ウィンドウを戻す
@weaponinfo_window.active = true
@sellect_window.active = false
@sellect_window.index = -1
# ウィンドウを消す
@ask_window.active = false
@ask_window.visible = false
# 再描写する
@gold_window.refresh
@sellect_window.refresh
@partyweapon_window.refresh
@weaponinfo_window.refresh
end
end
end
#==============================================================================
# ◇ 外部ライブラリ
#==============================================================================
class Bitmap
#--------------------------------------------------------------------------
# ● ライン描画 by 桜雅 在土
#--------------------------------------------------------------------------
def draw_line(start_x, start_y, end_x, end_y, start_color, width = 1, end_color = start_color)
# 描写距離の計算。大きめに直角時の長さ。
distance = (start_x - end_x).abs + (start_y - end_y).abs
# 描写開始
if end_color == start_color
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
if width == 1
self.set_pixel(x, y, start_color)
else
self.fill_rect(x - (width-1)/2.floor, y - (width-1)/2.floor, width, width, start_color)
end
end
else
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
r = start_color.red * (distance-i)/distance + end_color.red * i/distance
g = start_color.green * (distance-i)/distance + end_color.green * i/distance
b = start_color.blue * (distance-i)/distance + end_color.blue * i/distance
a = start_color.alpha * (distance-i)/distance + end_color.alpha * i/distance
if width == 1
self.set_pixel(x, y, Color.new(r, g, b, a))
else
self.fill_rect(x - (width-1)/2.floor, y - (width-1)/2.floor, width, width, Color.new(r, g, b, a))
end
end
end
end
#--------------------------------------------------------------------------
# ● 多角形の描画(塗りつぶしなし) by 和希
# peaks : 頂点座標の配列 [[x1,y1],[x2,y2],[x3,y3], ... ]
# color : 線の色
# width : 線の幅
#--------------------------------------------------------------------------
def draw_polygon(peaks, color, width = 1)
# 辺(=頂点)の個数分だけ辺を描く
for i in 0 ... (peaks.size - 1)
# 頂点同士を線で結ぶ
draw_line( peaks[i][0], peaks[i][1], peaks[i+1][0], peaks[i+1][1], color, width )
end
# 最後の頂点と最初の頂点を結ぶ
draw_line( peaks[peaks.size - 1][0], peaks[peaks.size - 1][1], peaks[0][0], peaks[0][1], color, width )
end
end
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
复制代码
作者:
a22506365
时间:
2009-9-21 16:51
本帖最后由 凌辰 于 2009-9-21 17:54 编辑
#==============================================================================
# 本脚本来自
www.66RPG.com
,使用和转载请保留此信息
#==============================================================================
# ▼▲▼ XRXS24. システム?ウェポンプロパティXC. ver..01a ▼▲▼
# by 桜雅 在土
#
# ※ XRXS.RGSS改良カスタマイズ が必要です。
# --- 仕様 ---
#
# ◇装備武器のプロパティの変更
# ├◇例:actor(==Game_Actor)の装備武器の付与属性#1を 21 に設定
# └◇スクリプト:actor.weapon_property[PROPERTY_ELEMENT_GRANT_1st] = 21
#
#==============================================================================
# □ 定数
#==============================================================================
module Fixed_PropertyNumber
# 現在のプロパティの総数
PROPERTY_NUMBER = 8
# 「属性」数(ダメージ倍率ようとして用いられる属性の数)
ELEMENTS_NUMBER = 16
# 以下のナンバーは 同値は指定不可能かつ0から個数-1までの整数
PROPERTY_ROOM_FILLED = 0 # プロパティ:部屋が空いているかどうか
PROPERTY_LEVEL = 1 # プロパティ:武器レベル
PROPERTY_EXP = 2 # プロパティ:エクストラポイント
PROPERTY_EXP_SECOND = 3 # プロ靴匹#亥ē攻去楗荪ぅ螗?ケタ目(32768進法)
PROPERTY_ELEMENT_GRANT_1st = 4 # プロパティ:付与属性#1
PROPERTY_ELEMENT_GRANT_2nd = 5 # プロパティ:付与属性#2
PROPERTY_ELEMENT_GRANT_3rd = 6 # プロパティ:付与属性#3
PROPERTY_ELEMENT_GRANT_4th = 7 # プロパティ:付与属性#4
end
#==============================================================================
$xrxs24_weapon_property_system_work = true
#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :weapons_table # ウェポンテーブル
#--------------------------------------------------------------------------
# ウェポンテーブル解説
#--------------------------------------------------------------------------
=begin
@weapons_table[weapon_id, room_no, property]
weapon_id は、武器のIDです。
room_no は、部屋のNo.です。武器がここに格納されます。
property は、プロパティです。
property
0 部屋の空き情報。0が空き、1が埋まり。
1 EXP数値。数値が入ります。
例えば、@weapons_table[1, 0, 0] が1の場合、
ID.1の武器がNo.0の部屋に存在する。ということ。
=end
def weapons_table
@weapons_table
end
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs24_initialize initialize
def initialize
xrxs24_initialize
# ウェポンテーブルを作成
@weapons_table = Table.new(0,0,PROPERTY_NUMBER)
end
#--------------------------------------------------------------------------
# ● 武器の入手 # ←武器の増加
# weapon_id : 武器 ID
# set_level : 初期武器レベル # ←元個数n
#--------------------------------------------------------------------------
def gain_weapon(weapon_id, set_level)
# weapon_id が 0 の場合
if weapon_id == 0
return 0
end
# ハッシュの個数データを更新
if weapon_id > 0
@weapons[weapon_id] = [[weapon_number(weapon_id) + 1, 0].max, 99].min
end
# ウェポンテーブルに新規アイテムを追加
# xsize(テーブルの武器IDの最大値)が足りない場合リサイズ
if @weapons_table.xsize <= weapon_id
@weapons_table.resize(weapon_id+1, @weapons_table.ysize, @weapons_table.zsize)
end
# ysize(テーブルの個数の最大値)が足りない場合リサイズ
num = weapon_number(weapon_id)
if @weapons_table.ysize <= num
@weapons_table.resize(@weapons_table.xsize, num+1, @weapons_table.zsize)
end
# ウェポンテーブルから空き部屋No.を検索
for i in
0...@weapons_table.ysize
# 空き部屋である 0 を返した場合
if @weapons_table[weapon_id, i, PROPERTY_ROOM_FILLED] != 1
# 部屋を埋める
@weapons_table[weapon_id, i, PROPERTY_ROOM_FILLED] = 1
# 初期武器レベルを設定
@weapons_table[weapon_id, i, PROPERTY_LEVEL] = set_level
# EXPをレベルの三乗に設定
expp = set_level ** 3
# EXPの数値を設定
@weapons_table[weapon_id, i, PROPERTY_EXP] = expp%32768
@weapons_table[weapon_id, i, PROPERTY_EXP_SECOND] = (expp/32768).floor
# 終了、部屋番号を返す
return i
end
end
# 空き部屋が無かった場合
p "[空的房间!!" # 本来起こりえないはず # 起きたらプログラムミス
end
#--------------------------------------------------------------------------
# ● 武器を捨てる # ←武器の減少
# weapon_id : 武器 ID
# room_no : ルームNo. # ※元?個数n
#--------------------------------------------------------------------------
def lose_weapon(weapon_id, room_no)
# weapon_id が 0 の場合
if weapon_id == 0
return 0
end
# ハッシュの個数データを更新
if weapon_id > 0
@weapons[weapon_id] = [[weapon_number(weapon_id) - 1, 0].max, 99].min
end
# ウェポンテーブルに設定
# 部屋を空き部屋にする
@weapons_table[weapon_id, room_no, PROPERTY_ROOM_FILLED] = 0
# 他全プロパティを 0 化
for i in 0...PROPERTY_NUMBER
@weapons_table[weapon_id, room_no, i] = 0
end
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :weapon_property # 装備中の武器のウェポンプロパティ
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias xrxs24_setup setup
def setup(actor_id)
xrxs24_setup(actor_id)
# 初期化
@weapon_property = Table.new(PROPERTY_NUMBER)
@weapon_property[PROPERTY_LEVEL] = 1 # 初期武器のレベルは1
@equip_room_no = 0
end
#--------------------------------------------------------------------------
# ● 通常攻撃の属性取得
#--------------------------------------------------------------------------
alias xrxs24_element_set element_set
def element_set
attack_element_set = xrxs24_element_set
for i in 1..ELEMENTS_NUMBER
for j in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
if @weapon_property[j] == i and !attack_element_set.include?(i)
attack_element_set.push(i)
end
end
end
return attack_element_set
end
#--------------------------------------------------------------------------
# ● 装備変更予定の部屋番号
# room_no : 装備する元のアイテムの部屋No.
#--------------------------------------------------------------------------
def equip_room_no(rn)
@equip_room_no = rn
end
#--------------------------------------------------------------------------
# ● 装備の変更
# equip_type : 装備タイプ
# id : 武器 or 防具 ID (0 なら装備解除)
#--------------------------------------------------------------------------
alias xrxs24_equip equip
def equip(equip_type, id)
case equip_type
when 0 # 武器
if id == 0 or $game_party.weapon_number(id) > 0
# 現在装備武器
if @weapon_id != 0
# 現在装備を増やす
used_room_no = $game_party.gain_weapon(@weapon_id, 1)
# アクター現在武器のプロパティ
for i in 0...PROPERTY_NUMBER
# プロパティを部屋へコピー
$game_party.weapons_table[@weapon_id, used_room_no, i] = @weapon_property
# コピー後に削除
@weapon_property
= 0
end
# 部屋の空き状況は無条件で 1 にする
$game_party.weapons_table[@weapon_id, used_room_no, PROPERTY_ROOM_FILLED] = 1
#p "武器ID. " + @weapon_id.to_s + ", 部屋No." + used_room_no.to_s
end
# 新規装着
if id != 0
# 装備対象武器のプロパティ
for i in 0...PROPERTY_NUMBER
# プロパティをアクターへコピー
@weapon_property
= $game_party.weapons_table[id, @equip_room_no, i]
# コピー後に削除
$game_party.weapons_table[id, @equip_room_no, i] = 0
end
# 装備対象のアイテムを消す
$game_party.lose_weapon(id, @equip_room_no)
# 外す場合
else
# アクタープロパティを初期化
for i in 0...PROPERTY_NUMBER
@weapon_property
= 0
end
end
# 装備変更
@weapon_id = id
end
return
end
xrxs24_equip(equip_type, id)
end
#--------------------------------------------------------------------------
# ● 基本攻撃力の取得
#--------------------------------------------------------------------------
def base_atk
weapon = $data_weapons[@weapon_id]
if weapon == nil
return 0
else
return weapon.atk * (100 + weapon.atk%10 * @weapon_property[PROPERTY_LEVEL]) /100
end
end
end
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
@data_id = []
xrxs24_refresh
end
#--------------------------------------------------------------------------
# ● アイテムの部屋番号の取得
#--------------------------------------------------------------------------
def item_room_no
return @data_id[self.index]
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
# 武器をプッシュ
@data.push($data_weapons
)
# 部屋No.を合わせる
@data_id[@data.size-1] = j
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
alias xrxs24_draw_item draw_item
def draw_item(index)
item = @data[index]
case item
when RPG::Weapon
room_no = @data_id[index].nil? ? 0 : @data_id[index]
number = $game_party.weapon_number(item.id)
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 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)
if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id)
opacity = 255
else
opacity = 128
end
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id)
self.contents.font.color = system_color
self.contents.draw_text(x + 224, y, 56, 32, "Lv. ")
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
self.contents.draw_text(x +224, y, 56, 32, "Lv. ")
end
level = $game_party.weapons_table[item.id, room_no, PROPERTY_LEVEL].to_s
self.contents.draw_text(x + 232, y, 48, 32, level, 2)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
else
xrxs24_draw_item(index)
end
end
end
#==============================================================================
# ■ Window_EquipRight
#==============================================================================
class Window_EquipRight < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
xrxs24_refresh
self.contents.font.color = system_color
self.contents.draw_text(276, 0, 56, 32, "Lv. ")
self.contents.font.color = normal_color
level = @actor.weapon_property[PROPERTY_LEVEL].to_s
self.contents.draw_text(284, 0, 48, 32, level, 2)
end
end
#==============================================================================
# ■ Window_EquipItem
#==============================================================================
class Window_EquipItem < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● アイテムの部屋番号の取得
#--------------------------------------------------------------------------
def item_room_no
return @data_id[self.index]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
@data_id = []
xrxs24_refresh
end
#--------------------------------------------------------------------------
# ● 指定クラスが装備可能、かつ所有している武器を @data に返す
#--------------------------------------------------------------------------
def set_equipable_weapon_data(class_id)
weapon_set = $data_classes[class_id].weapon_set
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0 and weapon_set.include?(i)
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
# 武器をプッシュ
@data.push($data_weapons
)
# 部屋No.を合わせる
@data_id[@data.size-1] = j
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
alias xrxs24_draw_item draw_item
def draw_item(index)
item = @data[index]
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 32
case item
when RPG::Weapon
room_no = @data_id[index].nil? ? 0 : @data_id[index]
number = $game_party.weapon_number(item.id)
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.font.color = system_color
self.contents.draw_text(x + 224, y, 56, 32, "Lv. ")
self.contents.font.color = normal_color
level = $game_party.weapons_table[item.id, room_no, PROPERTY_LEVEL].to_s
self.contents.draw_text(x + 232, y, 48, 32, level, 2)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
else
xrxs24_draw_item(index)
end
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
if self.item.is_a?(RPG::Weapon)
element_name = $data_system.elements[$game_party.weapons_table[self.item.id, self.item_room_no, PROPERTY_ELEMENT_GRANT_1st]]
else
element_name = ""
end
@help_window.set_text(self.item == nil ? "" : self.item.description + element_name)
end
end
#==============================================================================
# ■ Window_ShopSell
#==============================================================================
class Window_ShopSell < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :column_max
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs24_refresh refresh
def refresh
@data_id = []
xrxs24_refresh
end
#--------------------------------------------------------------------------
# ● 部屋No.の取得
#--------------------------------------------------------------------------
def item_room_no
return @data_id[self.index]
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
# 武器をプッシュ
@data.push($data_weapons
)
# 部屋No.を合わせる
@data_id[@data.size-1] = j
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
alias xrxs24_draw_item draw_item
def draw_item(index)
item = @data[index]
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 32
case item
when RPG::Weapon
room_no = @data_id[index].nil? ? 0 : @data_id[index]
number = $game_party.weapon_number(item.id)
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.font.color = system_color
self.contents.draw_text(x + 224, y, 56, 32, "Lv. ")
self.contents.font.color = normal_color
level = $game_party.weapons_table[item.id, room_no, PROPERTY_LEVEL].to_s
self.contents.draw_text(x + 232, y, 48, 32, level, 2)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
else
xrxs24_draw_item(index)
end
end
end
#==============================================================================
# ■ Scene_Equip
#==============================================================================
class Scene_Equip
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
# アイテムウィンドウの可視状態設定
@item_window1.visible = (@right_window.index == 0)
@item_window2.visible = (@right_window.index == 1)
@item_window3.visible = (@right_window.index == 2)
@item_window4.visible = (@right_window.index == 3)
@item_window5.visible = (@right_window.index == 4)
# 現在装備中のアイテムを取得
item1 = @right_window.item
# 現在のアイテムウィンドウを @item_window に設定
case @right_window.index
when 0
@item_window = @item_window1
when 1
@item_window = @item_window2
when 2
@item_window = @item_window3
when 3
@item_window = @item_window4
when 4
@item_window = @item_window5
end
# ライトウィンドウがアクティブの場合
if @right_window.active
# 装備変更後のパラメータを消去
@left_window.set_new_parameters(nil, nil, nil)
end
# アイテムウィンドウがアクティブの場合
if @item_window.active
# 現在選択中のアイテムを取得
item2 = @item_window.item
# 部屋No.の取得
room_no = @item_window.item_room_no
# 装備は変更しない
# 装備変更後のパラメータを取得
if item2.is_a?(RPG::Weapon)
# 現在の仕様では、アクター自体には物理攻撃力保持が有り得ないと考える。
# この仕様が変更された場合は、ここの改造のこと。
if item2 == nil
new_atk = 0
else
level = $game_party.weapons_table[item2.id, room_no, PROPERTY_LEVEL]
new_atk = item2.atk * (100 + item2.atk%10 * level) / 100
end
end
new_pdef = @actor.pdef - (item1 == nil ? 0 : item1.pdef) + (item2 == nil ? 0 : item2.pdef)
new_mdef = @actor.mdef - (item1 == nil ? 0 : item1.mdef) + (item2 == nil ? 0 : item2.mdef)
# レフトウィンドウに描画
@left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アイテムウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_item
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# ライトウィンドウをアクティブ化
@right_window.active = true
@item_window.active = false
@item_window.index = -1
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 装備 SE を演奏
$game_system.se_play($data_system.equip_se)
# アイテムウィンドウで現在選択されているデータを取得
item = @item_window.item
item_room_no = @item_window.item_room_no
# 装備を変更------
# ---部屋No.を先に教える
@actor.equip_room_no(item_room_no != nil ? item_room_no : 0)
# ---実際に装備を変更
@actor.equip(@right_window.index, item == nil ? 0 : item.id)
# ---------------
# ライトウィンドウをアクティブ化
@right_window.active = true
@item_window.active = false
@item_window.index = -1
# ライトウィンドウ、アイテムウィンドウの内容を再作成
@right_window.refresh
@item_window.refresh
return
end
end
end
#==============================================================================
# ■ Scene_Shop
#==============================================================================
class Scene_Shop
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
alias xrxs24_main main
def main
# 売却確認ウィンドウの作成
@sell_check_window = Window_ShopSellCheck.new
@sell_check_window.active = false
@sell_check_window.visible = false
# 呼び戻す
xrxs24_main
# ウィンドウを解放
@sell_check_window.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs24_update update
def update
# ウィンドウを更新
@sell_check_window.update
# 売却確認ウィンドウがアクティブの場合: update_sell_check を呼ぶ
if @sell_check_window.active
update_sell_check
return
end
# 呼び戻す
xrxs24_update
end
#--------------------------------------------------------------------------
# ● フレーム更新 (売却ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
alias xrxs24_update_sell update_sell
def update_sell
# C ボタンが押された場合
if Input.trigger?(Input::C) and @sell_window.item.is_a?(RPG::Weapon)
# アイテムを取得
@item = @sell_window.item
# 部屋No.の取得
sell_room_no = @sell_window.room_no
# ステータスウィンドウのアイテムを設定
@status_window.item = @item
# アイテムが無効の場合、または価格が 0 (売却不可) の場合
if @item == nil or @item.price == 0
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# ウィンドウの状態を売却確認モードへ
@sell_window.active = false
@sell_window.visible = false
@sell_check_window.set(@item.id, sell_room_no)#,@item, max, @item.price / 2)
@sell_check_window.active = true
@sell_check_window.visible = true
@status_window.visible = true
return
end
xrxs24_update_sell
end
#--------------------------------------------------------------------------
# ● フレーム更新 (売却確認ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_sell_check
# B ボタンが押された場合 / "やめる"で C ボタンが押された場合
if Input.trigger?(Input::B) or
(Input.trigger?(Input::C) and @sell_check_window.cursor_pos == 1)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# 売却確認ウィンドウを非アクティブ?不可視に設定
@sell_check_window.active = false
@sell_check_window.visible = false
# ウィンドウの状態を売却モードへ
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
return
end
# "売却"で C ボタンが押された場合
if Input.trigger?(Input::C) and @sell_check_window.cursor_pos == 0
# ショップ SE を演奏
$game_system.se_play($data_system.shop_se)
# 売却確認ウィンドウを非アクティブ?不可視に設定
@sell_check_window.active = false
@sell_check_window.visible = false
# 売却処理
$game_party.gain_gold(@sell_check_window.total_price)
# room_noのアイテムを消す
item_id = @sell_check_window.item_id
room_no = @sell_check_window.room_no
$game_party.lose_weapon(item_id, room_no)
# 各ウィンドウをリフレッシュ
@gold_window.refresh
@sell_window.refresh
@status_window.refresh
# ウィンドウの状態を売却モードへ
@sell_window.active = true
@sell_window.visible = true
@status_window.visible = false
return
end
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● アフターバトルフェーズ開始
#--------------------------------------------------------------------------
alias xrxs24_start_phase5 start_phase5
def start_phase5
# EXPを初期化
exp = 0
# ループ
for enemy in $game_troop.enemies
# エネミーが隠れ状態でない場合
unless enemy.hidden
# 獲得 EXP、ゴールドを追加
exp += enemy.exp
end
end
# EXP 獲得
for i in 0...$game_party.actors.size
actor = $game_party.actors
#if actor.cant_get_exp? == false
# アクターの武器に経験値獲得
now_exp = actor.weapon_property[PROPERTY_EXP_SECOND] * 32768
now_exp += actor.weapon_property[PROPERTY_EXP]
now_exp += exp
actor.weapon_property[PROPERTY_EXP] += now_exp%32768
actor.weapon_property[PROPERTY_EXP_SECOND] +=(now_exp/32768).floor
#end
end
xrxs24_start_phase5
end
end
#==============================================================================
# ■ Window_ShopSellCheck
#------------------------------------------------------------------------------
# ショップ画面で、売却するアイテムを表示し、売却を選択するウィンドウです。
#==============================================================================
class Window_ShopSellCheck < Window_Base
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :total_price
attr_reader :cursor_pos
attr_reader :item_id
attr_reader :room_no
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 128, 368, 352)
self.contents = Bitmap.new(width - 32, height - 32)
end
#--------------------------------------------------------------------------
# ● アイテムID、部屋No.
#--------------------------------------------------------------------------
def set(item_id, room_no)
@item_id = item_id
@room_no = room_no
@cursor_pos = 0
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# アイテム名描写
draw_item_name($data_weapons[@item_id], 4, 32)
# 武器レベルの取得と描写
level = $game_party.weapons_table[@item_id, @room_no, PROPERTY_LEVEL]
self.contents.font.color = system_color
self.contents.draw_text(244, 32, 90, 32, "Lv. ")
self.contents.font.color = normal_color
self.contents.draw_text(244, 32, 90, 32, level.to_s, 2)
# カーソル位置の更新
self.cursor_rect.set(240, 224, 96, 32)
# 選択肢の描写
self.contents.draw_text(244, 224, 96, 32, "出售")
self.contents.draw_text(244, 256, 96, 32, "取消")
# 売却金額の計算
@total_price = $data_weapons[@item_id].price * (10 + 1*level) / 20
# 合計価格と通貨単位を描画
domination = $data_system.words.gold
cx = contents.text_size(domination).width
self.contents.font.color = normal_color
self.contents.draw_text(4, 160, 328-cx-2, 32, @total_price.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(332-cx, 160, cx, 32, domination, 2)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
if self.active
# カーソル上下
if Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
if @cursor_pos == 0
@cursor_pos = 1
else
@cursor_pos = 0
end
# カーソル位置の更新
self.cursor_rect.set(240, 224 + 32 * @cursor_pos, 96, 32)
end
end
end
end
#==============================================================================
# ■ Window_PartyWeapon
#------------------------------------------------------------------------------
# 鍛冶屋画面で、パーティ全員の現在装備している武器を表示するウィンドウです。
#==============================================================================
class Window_PartyWeapon < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 64, 368, 224)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
self.index = -1
end
#--------------------------------------------------------------------------
# ● アイテムの取得
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@data = []
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 192, 32, "全部武器")
self.contents.draw_text(4, 160, 192, 32, "所有物品")
for i in 0...$game_party.actors.size
actor = $game_party.actors
next if actor == nil
@data.push($data_weapons[actor.weapon_id])
# キャラ顔
draw_actor_facesquare($game_party.actors
, 4, 32 + 32 * i+4)
# 武器名
self.contents.font.color = normal_color
draw_item_name(@data
, 36, 32 + 32 * i)
level = $game_party.actors
.weapon_property[PROPERTY_LEVEL]
# レベル
self.contents.draw_text(296, 32 + 32 * i, 24, 32, level.to_s, 2)
self.contents.font.color = system_color
self.contents.draw_text(260, 32 + 32 * i, 32, 32, "Lv.")
end
@item_max = @data.size
end
#--------------------------------------------------------------------------
# ● グラフィック→顔&枠の描画
# actor : アクター
# x : 描画先 X 座標
# y : 描画先 Y 座標
#--------------------------------------------------------------------------
def draw_actor_facesquare(actor, x, y, width = 24, height = 24)
bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
src_rect = Rect.new((bitmap.width/4 - width)/2, 0, width, height)
self.contents.blt(x, y, bitmap, src_rect)
self.contents.draw_polygon([[x,y],[x+width,y],[x+width,y+height],[x,y+height]], Color.new(255,255,255,128))
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? "" : self.item.description)
end
#--------------------------------------------------------------------------
# ● カーソルの矩形更新
#--------------------------------------------------------------------------
def update_cursor_rect
if @index == -1
self.cursor_rect.set(0, 0, 0,0)
else
self.cursor_rect.set(0, 32 + @index * 32, self.width - 32, 32)
end
end
end
#==============================================================================
# ■ Window_WeaponInfo
#------------------------------------------------------------------------------
# 鍛冶屋画面で、武器のパラメータなどを表示するウィンドウです。
#==============================================================================
class Window_WeaponInfo < Window_Selectable
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :level # 表示中の武器のレベル
attr_reader :property_elements # 属性
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# actor : アクター
#--------------------------------------------------------------------------
def initialize
super(368, 64, 272, 416)
self.contents = Bitmap.new(width - 32, height - 32)
# 消去する
set(nil)
@item_max = 5
end
#--------------------------------------------------------------------------
# ● レベルを上げられる状況にあるか
#--------------------------------------------------------------------------
def levelupable?
return @levelupable
end
#--------------------------------------------------------------------------
# ● 値をセットする
#--------------------------------------------------------------------------
def set(item, room_no = 0)
# 初期化
@levelupable = false
case item
when nil
# nilの場合全てを消去
self.contents.clear
return
when Game_Actor
# アクターを指定した場合は装備中の武器の情報 使用例:set(actor)
@actor = item
@item = $data_weapons[@actor.weapon_id]
else
# アイテムを指定した場合
@actor = nil
@item = item
@room_no = room_no
end
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
# 初期化
@levelupable = false
self.contents.clear
# 武器名
draw_item_name(@item, 4, 32)
# 武器の場合、Lv: の描写
if @item.is_a?(RPG::Weapon)
# 武器のレベルと経験値の取得
if @actor != nil
@level = @actor.weapon_property[PROPERTY_LEVEL]
exp_p = @actor.weapon_property[PROPERTY_EXP_SECOND]
exp_p *= 32768
exp_p += @actor.weapon_property[PROPERTY_EXP]
else
@level = $game_party.weapons_table[@item.id, @room_no, PROPERTY_LEVEL]
exp_p = $game_party.weapons_table[@item.id, @room_no, PROPERTY_EXP_SECOND]
exp_p *= 32768
exp_p += $game_party.weapons_table[@item.id, @room_no, PROPERTY_EXP]
end
# 武器レベル
self.contents.font.color = system_color
self.contents.draw_text(140, 64, 32, 32, "Lv.")
self.contents.font.color = normal_color
self.contents.draw_text(216, 64, 24, 32, @level.to_s, 2)
# 武器経験値
self.contents.font.size = 8
self.contents.font.color = system_color
self.contents.draw_text(156, 88, 32, 16, "EXP.")
# EXPメーター
self.contents.draw_line(171, 96, 273, 96, Color.new(0,0,0,255), 3)
now_level_exp = next_exp = ((@level) ** 3)
next_level_exp = ((@level + 1) ** 3) # 次のレベルの所要EXPへの割合
percentile = [[100 * (exp_p - now_level_exp) / (next_level_exp - now_level_exp), 0].max, 100].min
if percentile < 100
line_color = Color.new(255, 255, 0, 255)
else
line_color = Color.new( 0, 255, 0, 255)
@levelupable = true
end
self.contents.draw_line(172, 96, 172 + percentile, 96, line_color, 1)
self.contents.font.size = 22
# 攻撃力
self.contents.font.color = system_color
self.contents.draw_text( 96, 128, 96, 32, $data_system.words.atk)
atk_p = @item.atk * (100 + @item.atk%10 * level)/100
self.contents.font.color = normal_color
self.contents.draw_text(192, 128, 48, 32, atk_p.to_s, 2)
# 武器属性
i_no = 0
for i in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
if @actor != nil
element_id = @actor.weapon_property
else
element_id = $game_party.weapons_table[@item.id, @room_no, i]
end
if element_id != 0 and element_id != nil
self.contents.font.color = normal_color
self.contents.draw_text(112, 160 + 32*i_no, 128, 32, $data_system.elements[element_id])
else
self.contents.font.color = disabled_color
self.contents.draw_text(112, 160 + 32*i_no, 128, 32, "---")
end
i_no += 1
end
end
# 可視状態にする
self.visible = true
end
#--------------------------------------------------------------------------
# ● カーソルの矩形更新
#--------------------------------------------------------------------------
def update_cursor_rect
if @index == -1
self.cursor_rect.set(0, 0, 0,0)
elsif @index == 0
self.cursor_rect.set(0, 64, self.width - 32, 32)
else
self.cursor_rect.set(0, 128 + @index * 32, self.width - 32, 32)
end
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
case self.index
when 0
@help_window.set_text("进行武器强化。")
else
@help_window.set_text("为武器附加属性。")
end
end
end
#==============================================================================
# ■ Window_CenterAsk
#------------------------------------------------------------------------------
# 画面中央で二択の質問を問い掛けるウィンドウです。
#==============================================================================
class Window_CenterAsk < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(320, 192, 160, 96)
self.contents = Bitmap.new(width - 32, height - 32)
self.visible = false
@first_choice = ""
@second_choice = ""
@helptext = ["", ""]
@disabled = []
self.z = 9999
@item_max = 2
self.index = 0
end
#--------------------------------------------------------------------------
# ● 選択肢の設定 first_choice,second_choice == String
#--------------------------------------------------------------------------
def set(first_choice, second_choice, help1 = "", help2 = "")
@disabled[0] = false
@disabled[1] = false
@first_choice = first_choice
@second_choice = second_choice
@helptext[0] = help1
@helptext[1] = help2
width1 = self.contents.text_size(@first_choice).width
width2 = self.contents.text_size(@second_choice).width
self.width = (width1 > width2 ? width1 : width2) + 40
self.x = 320 - self.width / 2
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# ● 選択肢無効化
#--------------------------------------------------------------------------
def disable(n)
@disabled[n] = true
refresh
end
#--------------------------------------------------------------------------
# ● 選択肢が無効化されているか?
#--------------------------------------------------------------------------
def disabled?(n)
return @disabled[n]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
if @disabled[0]
self.contents.font.color = disabled_color
else
self.contents.font.color = normal_color
end
self.contents.draw_text(4, 0, self.width-8, 32, @first_choice)
if @disabled[1]
self.contents.font.color = disabled_color
else
self.contents.font.color = normal_color
end
self.contents.draw_text(4, 32, self.width-8, 32, @second_choice)
# カーソル位置も戻す
self.index = 0
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(@helptext[self.index])
end
end
#==============================================================================
# ■ Window_SmithyItems
#------------------------------------------------------------------------------
# 鍛冶屋画面で、付与のための所持アイテムの一覧を表示するウィンドウです。
#==============================================================================
class Window_SmithyItems < Window_ShopSell
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :item_max
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super
self.x = 32
self.y = 256
self.width = 336
self.height = 224
self.opacity = 0
self.back_opacity = 0
@column_max = 1
self.index = -1
refresh
end
#--------------------------------------------------------------------------
# ● 現在 @item の第一属性の取得
#--------------------------------------------------------------------------
def item_first_element
item = self.item
room_no = self.item_room_no
return 0 if item.nil? or item.id == 0
if item.is_a?(RPG::Armor)
element_set = item.guard_element_set
else
element_set = item.element_set
end
if element_set.size == 0 and item.is_a?(RPG::Weapon)
for i in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
element_id = $game_party.weapons_table[item.id, room_no, i]
if element_id > 0
element_set = [element_id]
break
end
end
end
if element_set.size == 0
return 0
else
return element_set[0]
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上のアイテムを @data に返す &属性所有のみ
#--------------------------------------------------------------------------
def set_own_item_data
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
if $data_items
.element_set.size > 0
@data.push($data_items
)
end
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す &属性所有のみ
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
# 武器の個別描写を行う
for j in 0...$game_party.weapons_table.ysize
if $game_party.weapons_table[i, j, PROPERTY_ROOM_FILLED] == 1
for k in [PROPERTY_ELEMENT_GRANT_1st,
PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd,
PROPERTY_ELEMENT_GRANT_4th]
if ($data_weapons
.element_set.size > 0) or
($game_party.weapons_table[i, j, k] > 0)
# 武器をプッシュ
@data.push($data_weapons
)
# 部屋No.を合わせる
@data_id[@data.size-1] = j
break
end
end
end
end
# ---
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の防具を @data に返す &属性所有のみ
#--------------------------------------------------------------------------
def set_own_armor_data
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0
if $data_armors
.guard_element_set.size > 0
@data.push($data_armors
)
end
end
end
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
element_id = self.item_first_element
case element_id
when 0
@help_window.set_text("没有可以附加的属性")
else
@help_window.set_text("附加属性: " + $data_system.elements[element_id])
end
end
end
#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs24_update update
def update
xrxs24_update
# プレイヤーの移動中ではない場合
unless $game_player.moving?
# 鍛冶屋画面の呼び出しを実行
if $game_temp.smithy_calling
call_smithy
end
end
end
#--------------------------------------------------------------------------
# ● 鍛冶屋の呼び出し
#--------------------------------------------------------------------------
def call_smithy
# 鍛冶屋呼び出しフラグをクリア
$game_temp.smithy_calling = false
# プレイヤーの姿勢を矯正
$game_player.straighten
# 鍛冶屋画面に切り替え
$scene = Scene_Smithy.new
end
end
#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :smithy_calling # 鍛冶屋 呼び出しフラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs24_initialize initialize
def initialize
xrxs24_initialize
@smithy_calling = false
end
end
#==============================================================================
# ■ Interpreter
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ◆ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ◇ 鍛冶屋の処理
#--------------------------------------------------------------------------
def command_smithy
# バトル中断フラグをセット
$game_temp.battle_abort = true
# 鍛冶屋呼び出しフラグをセット
$game_temp.smithy_calling = true
# 商品リストに新しい項目を設定
$game_temp.shop_goods = [@parameters]
end
#--------------------------------------------------------------------------
# ◇ 武器経験値の取得
#--------------------------------------------------------------------------
def command_weapon_gain_exp(actor_id, exp)
now_exp = $game_party.actors[actor_id].weapon_property[PROPERTY_EXP_SECOND] * 32768
now_exp+= $game_party.actors[actor_id].weapon_property[PROPERTY_EXP]
now_exp+= exp
$game_party.actors[actor_id].weapon_property[PROPERTY_EXP] += now_exp%32768
$game_party.actors[actor_id].weapon_property[PROPERTY_EXP_SECOND] +=(now_exp/32768).floor
end
end
#==============================================================================
# ■ Scene_Smithy
#------------------------------------------------------------------------------
# 鍛冶屋画面の処理を行うクラスです。
#==============================================================================
class Scene_Smithy
#--------------------------------------------------------------------------
# ◇ インクルード
#--------------------------------------------------------------------------
include Fixed_PropertyNumber
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def main
# ヘルプウィンドウを作成
@help_window = Window_Help.new
# パーティ武器ウィンドウを作成
@partyweapon_window = Window_PartyWeapon.new
@partyweapon_window.help_window = @help_window
@partyweapon_window.height += 192
@partyweapon_window.active = true
@partyweapon_window.index = 0
# アイテムウィンドウを作成
@sellect_window = Window_SmithyItems.new
@sellect_window.help_window = @help_window
@sellect_window.z = @partyweapon_window.z + 1
@sellect_window.active = false
# 武器インフォウィンドウを作成
@weaponinfo_window = Window_WeaponInfo.new
@weaponinfo_window.set(nil)
@weaponinfo_window.active = false
@weaponinfo_window.index = -1
@weaponinfo_window.help_window = @help_window
# ゴールドウィンドウを作成
@gold_window = Window_Gold.new
@gold_window.x = 480
@gold_window.y = 416
@gold_window.z = @weaponinfo_window.z + 1
# 訪ねウィンドウを作成
@ask_window = Window_CenterAsk.new
@ask_window.active = false
@ask_window.help_window = @help_window
# トランジション実行
Graphics.transition
# メインループ
loop do
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
# フレーム更新
update
# 画面が切り替わったらループを中断
if $scene != self
break
end
end
# トランジション準備
Graphics.freeze
# ウィンドウを解放
@help_window.dispose
@gold_window.dispose
@partyweapon_window.dispose
@sellect_window.dispose
@weaponinfo_window.dispose
@ask_window.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# ウィンドウを更新
@help_window.update
@gold_window.update
@partyweapon_window.update
@sellect_window.update
@weaponinfo_window.update
@ask_window.update
# パーティ武器ウィンドウがアクティブの場合: update_partyweapon を呼ぶ
if @partyweapon_window.active
update_partyweapon
return
end
# 武器インフォウィンドウがアクティブの場合: update_weaponinfo を呼ぶ
if @weaponinfo_window.active
update_weaponinfo
return
end
# アイテム選択ウィンドウがアクティブの場合: update_sellect を呼ぶ
if @sellect_window.active
update_sellect
return
end
# 中央選択ウィンドウがアクティブの場合: update_ask を呼ぶ
if @ask_window.active
update_ask
return
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (パーティ武器ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_partyweapon
# ステータスウィンドウのアイテムを設定
@weaponinfo_window.set($game_party.actors[@partyweapon_window.index])
# B ボタンが押された場合
if Input.trigger?(Input::B)
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# マップ画面に切り替え
$scene = Scene_Map.new
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
@weaponinfo_window.active = true
@weaponinfo_window.index = 0
@partyweapon_window.active = false
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (武器インフォウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_weaponinfo
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
@partyweapon_window.active = true
@weaponinfo_window.active = false
@weaponinfo_window.index = -1
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
case @weaponinfo_window.index
when 0
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# レベルによる強化金額の設定はこちら(もう一箇所も)
price = (@weaponinfo_window.level ** 2).floor * 200
first_choice = "进行强化!! " + price.to_s + " " + $data_system.words.gold
if @weaponinfo_window.levelupable?
help1 = "支付强化武器所需的金钱。"
else
help1 = "武器经验值不足。"
end
if $game_party.gold < price
help1 = "现金不足。"
end
help2 = "中止强化。"
@ask_window.set(first_choice,"取消", help1, help2)
unless @weaponinfo_window.levelupable?
@ask_window.disable(0)
end
if $game_party.gold < price
@ask_window.disable(0)
end
@ask_window.active = true
@ask_window.visible = true
@weaponinfo_window.active = false
return
else
# 属性付与へ。まずはアイテムウィンドウへ移行
if @sellect_window.item_max <= 0
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# ウィンドウの状態を売却モードへ
@weaponinfo_window.active = false
@sellect_window.index = 0
@sellect_window.active = true
@sellect_window.refresh
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アイテム選択ウィンドウがアクティヴの場合)
#--------------------------------------------------------------------------
def update_sellect
# ステータスウィンドウのアイテムを設定
#@weaponinfo_window.set(@sellect_window.item, @sellect_window.item_room_no)
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# ウィンドウの状態を初期モードへ
@weaponinfo_window.active = true
@sellect_window.active = false
@sellect_window.index = -1
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 属性が一つ以上あるか、
if @sellect_window.item_first_element == 0
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# 属性を付与確認
price = 50000
first_choice = "附加属性!! " + price.to_s + " " + $data_system.words.gold
help1 = $data_system.elements[@sellect_window.item_first_element] + " 武器。"
help2 = "中止附加。"
if @sellect_window.item.price == 0
first_choice = "不能附加属性。"
help1 = "该人物不能使用。"
elsif $game_party.gold < price
help1 = "现金不足。"
end
@ask_window.set(first_choice,"取消", help1, help2)
if @sellect_window.item.price == 0
@ask_window.disable(0)
elsif $game_party.gold < price
@ask_window.disable(0)
end
@ask_window.active = true
@ask_window.visible = true
@sellect_window.active = false
return
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (中央二択ウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_ask
# B ボタン or "やめる"で C ボタン が押された場合
if Input.trigger?(Input::B) or
(Input.trigger?(Input::C) and @ask_window.index == 1)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# ウィンドウ
@ask_window.active = false
@ask_window.visible = false
if @sellect_window.index >= 0
@sellect_window.active = true
else
@weaponinfo_window.active = true
end
return
end
# "実行"で C ボタンが押された場合
if Input.trigger?(Input::C) and @ask_window.index == 0
if @ask_window.disabled?(0)
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
return
end
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
if @sellect_window.index >= 0
# 属性付与
price = 50000
# 属性付与 SE を演奏
Audio.se_stop
Audio.se_play("Audio/SE/027-Door04.ogg")
# 付与を実行
# IDNo.の取得
case @weaponinfo_window.index
when 1
set_id = PROPERTY_ELEMENT_GRANT_1st
when 2
set_id = PROPERTY_ELEMENT_GRANT_2nd
when 3
set_id = PROPERTY_ELEMENT_GRANT_3rd
when 4
set_id = PROPERTY_ELEMENT_GRANT_4th
end
# 代入
$game_party.actors[@partyweapon_window.index].weapon_property[set_id] =
@sellect_window.item_first_element
# 付与に使用したアイテムをなくす
if @sellect_window.item.is_a?(RPG::Weapon)
$game_party.lose_weapon(@sellect_window.item.id, @sellect_window.item_room_no)
else
$game_party.lose_item(@sellect_window.item.id, 1)
end
else
# 武器強化
# 武器レベルアップ ME を演奏
Audio.me_stop
Audio.me_play("Audio/ME/011-Item02.mid")
# 強化を実行
$game_party.actors[@partyweapon_window.index].weapon_property[PROPERTY_LEVEL] += 1
# レベルによる強化金額の設定はこちら(もう一箇所も)
price = (@weaponinfo_window.level ** 1.5).floor * 50
end
# 金額を支払う
$game_party.lose_gold(price)
# ウィンドウを戻す
@weaponinfo_window.active = true
@sellect_window.active = false
@sellect_window.index = -1
# ウィンドウを消す
@ask_window.active = false
@ask_window.visible = false
# 再描写する
@gold_window.refresh
@sellect_window.refresh
@partyweapon_window.refresh
@weaponinfo_window.refresh
end
end
end
#==============================================================================
# ◇ 外部ライブラリ
#==============================================================================
class Bitmap
#--------------------------------------------------------------------------
# ● ライン描画 by 桜雅 在土
#--------------------------------------------------------------------------
def draw_line(start_x, start_y, end_x, end_y, start_color, width = 1, end_color = start_color)
# 描写距離の計算。大きめに直角時の長さ。
distance = (start_x - end_x).abs + (start_y - end_y).abs
# 描写開始
if end_color == start_color
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
if width == 1
self.set_pixel(x, y, start_color)
else
self.fill_rect(x - (width-1)/2.floor, y - (width-1)/2.floor, width, width, start_color)
end
end
else
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
r = start_color.red * (distance-i)/distance + end_color.red * i/distance
g = start_color.green * (distance-i)/distance + end_color.green * i/distance
b = start_color.blue * (distance-i)/distance + end_color.blue * i/distance
a = start_color.alpha * (distance-i)/distance + end_color.alpha * i/distance
if width == 1
self.set_pixel(x, y, Color.new(r, g, b, a))
else
self.fill_rect(x - (width-1)/2.floor, y - (width-1)/2.floor, width, width, Color.new(r, g, b, a))
end
end
end
end
#--------------------------------------------------------------------------
# ● 多角形の描画(塗りつぶしなし) by 和希
# peaks : 頂点座標の配列 [[x1,y1],[x2,y2],[x3,y3], ... ]
# color : 線の色
# width : 線の幅
#--------------------------------------------------------------------------
def draw_polygon(peaks, color, width = 1)
# 辺(=頂点)の個数分だけ辺を描く
for i in 0 ... (peaks.size - 1)
# 頂点同士を線で結ぶ
draw_line( peaks
[0], peaks
[1], peaks[i+1][0], peaks[i+1][1], color, width )
end
# 最後の頂点と最初の頂点を結ぶ
draw_line( peaks[peaks.size - 1][0], peaks[peaks.size - 1][1], peaks[0][0], peaks[0][1], color, width )
end
end
#==============================================================================
# 本脚本来自
www.66RPG.com
,使用和转载请保留此信息
#==============================================================================[line]1[/line]
粘贴脚本请在更多设定处勾选禁用Smilies。
凌辰留
作者:
a22506365
时间:
2009-9-21 16:53
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
# Sample master list for crafting script
# written by Deke
#============================================================================================
# 简介:
# 这是一个很不错的合成物品系统,可以通过游戏的过程,不断学习可以合成的
# 物品方法。
#
# 使用方法:
# 1、召唤界面:使用脚本$scene = Scene_Craft.new
#
# 2、学习合成:$game_party.learn_recipe(合成项目)
#
# 3、合成定义:
# 这个合成脚本可以定义两种合成物品。一种是预先定义好了的,就像下面这样,
# 直接写在这里就可以,另一种是在学习之前现场定义。
#
# 4、举例
# 4.1、学会recipe_list[1]定义的合成:$game_party.learn_recipe($game_temp.recipe_list[1])
# 注意,一行如果输入不下,在(的后面或[的后面按回车换行,否则可能出错
#
# 4.2、在游戏中临时定义一种合成,让玩家学会。使用事件中的脚本如下,
# 脚本:
# 材料 = [$game_variables[1],$game_variables[2]] #——材料编号是变量1、2的编号
# 材料种类 = [0,0] #——材料是物品
# 材料数量 = [$game_variables[3],$game_variables[4]] #——需要材料数量是变量3、4的编号
# 成品 = $game_variables[5] #——获得结果编号是5
# 成品种类 = 1 #——成品是防具类
# $game_party.learn_recipe(Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类))
#===========================================================================================
class Game_Temp
attr_reader :recipe_list
alias crafting_temp_initialize initialize
def initialize
crafting_temp_initialize
@recipe_list=[]
get_recipe_list
end
def get_recipe_list
##########################################################################
# 0 号合成物品设定 (物品小药水×2 + 中药水 = 大药水)
##########################################################################
材料 = [1, 2] # 需要材料的数据库编号
材料种类 = [0, 0] # 需要材料的种类,0是普通物品,1是防具,2是武器
材料数量 = [2, 1] # 需要材料的数量
成品 = 3 # 获得物品编号
成品种类 = 0 # 获得物品种类,0是普通物品,1是防具,2是武器
@recipe_list[1] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类)
##########################################################################
# 1 号合成物品设定 (武器铜剑、铁剑、钢剑各1 = 密切斯特剑)
##########################################################################
材料 = [1, 2, 3] # 需要材料的数据库编号
材料种类 = [2, 2, 2] # 需要材料的种类,0是普通物品,1是防具,2是武器
材料数量 = [3, 2, 1] # 需要材料的数量
成品 = 4 # 获得物品编号
成品种类 = 2 # 获得物品种类,0是普通物品,1是防具,2是武器
@recipe_list[2] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类)
##########################################################################
# 2 号合成物品设定 (物品力量之石×2 + 防具钢盾×1 = 密切斯特盾)
##########################################################################
材料 = [13, 3] # 需要材料的数据库编号
材料种类 = [0, 1] # 需要材料的种类,0是普通物品,1是防具,2是武器
材料数量 = [2, 1] # 需要材料的数量
成品 = 4 # 获得物品编号
成品种类 = 1 # 获得物品种类,0是普通物品,1是防具,2是武器
@recipe_list[3] = Game_Recipe.new(材料,材料种类, 材料数量,成品,成品种类)
end # of get_recipe_list method
end # of updates to Game_Temp Class
#================================
# CRAFTING PROGRAM
#----------------------------------------------------------------
#-written by Deke
#-yes_no window code created by Phsylomortis
#----------------------------------------------------------------
#================================
#updates to Game_Party class
class Game_Party
attr_accessor :recipes
alias crafting_party_initialize initialize
def initialize
crafting_party_initialize
@recipes=[]
end
#----------------------------------------------------------------------
def know?(recipe, version = 1)
unless recipe.is_a?(Game_Recipe)
recipe = get_recipe_from_master_list(recipe, version)
end
return $game_party.recipes.include?(recipe)
end
#----------------------------------------------------------------------
def learn_recipe(recipe , version = 1)
unless recipe.is_a?(Game_Recipe)
recipe = get_recipe_from_master_list(recipe, version)
end
if recipe.is_a?(Game_Recipe)
unless know?(recipe)
@recipes.push(recipe)
end
end
end
#----------------------------------------------------------------------
def forget_recipe(recipe , version = 1)
if !recipe.is_a?(Game_Recipe)
recipe = get_recipe_from_master_list(recipe, version)
end
if recipe.is_a?(Game_Recipe)
for i in
[email protected]
if recipe == @recipes[i]
index = i
break
end
end
if index != nil
@recipes.delete(@recipes[index])
end
end
end
#----------------------------------------------------------------------
def get_recipe_from_master_list(item, version)
index = nil
for i in 0...$game_temp.recipe_list.size
if item[0] == $game_temp.recipe_list[i].result and item[1] ==$game_temp.recipe_list[i].result_type
version -= 1
if version == 0
index = i
break
end
end
end
if index.is_a?(Integer)
return ($game_temp.recipe_list[index])
else
return false
end
end
end # of Game_Party updates
#================================
class Game_Recipe
attr_reader :ingredients
attr_reader :quantities
attr_reader :result
attr_reader :result_type
attr_reader :ingredient_types
#----------------------------------------------------------------------
def initialize( ingredients, ingredient_types, quantities, result, result_type)
@ingredients = ingredients
@ingredient_types = ingredient_types
@quantities = quantities
@result = result
@result_type = result_type
end
#----------------------------------------------------------------------
def name
case @result_type
when 0
name = $data_items[@result].name
when 1
name = $data_armors[@result].name
when 2
name = $data_weapons[@result].name
end
return name
end
#----------------------------------------------------------------------
def have
have_all = true
for i in
[email protected]
case @ingredient_types[i]
when 0
if $game_party.item_number(@ingredients[i]) < @quantities[i]
have_all=false
end
when 1
if $game_party.armor_number(@ingredients[i]) < @quantities[i]
have_all=false
end
when 2
if $game_party.weapon_number(@ingredients[i]) < @quantities[i]
have_all=false
end
end
end
return have_all
end
#----------------------------------------------------------------------
def decrement
for i in
[email protected]
case @ingredient_types[i]
when 0
$game_party.lose_item(@ingredients[i], @quantities[i])
when 1
$game_party.lose_armor(@ingredients[i], @quantities[i])
when 2
$game_party.lose_weapon(@ingredients[i], @quantities[i])
end
end
end
#----------------------------------------------------------------------
def make
if have
case @result_type
when 0
$game_party.gain_item(@result, 1)
when 1
$game_party.gain_armor(@result, 1)
when 2
$game_party.gain_weapon(@result, 1)
end
decrement
end
end
#----------------------------------------------------------------------
def == (recipe)
if recipe.is_a?(Game_Recipe)
equal = true
if recipe.ingredients != self.ingredients
equal = false
end
if recipe.ingredient_types != self.ingredient_types
equal = false
end
if recipe.quantities != self.quantities
equal = false
end
if recipe.result != self.result
equal=false
end
if recipe.result_type != self.result_type
equal = false
end
else
equal = false
end
return equal
end
end # of Game_Recipe class
#===================================
class Window_Craft < Window_Selectable
#--------------------------------------------------------------------------
def initialize
super(0, 64, 240, 416)
@column_max = 1
refresh
self.index = 0
end
#--------------------------------------------------------------------------
def recipe
return @data[self.index]
end
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
for i in 0...$game_party.recipes.size
@data.push($game_party.recipes[i])
end
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
self.contents.font.name = "黑体" # = "黑体"
self.contents.font.size = 18 # = 18
for i in 0...@item_max
draw_item(i)
end
end
end
#--------------------------------------------------------------------------
def draw_item(index)
recipe = @data[index]
self.contents.font.color = recipe.have ? normal_color : disabled_color
x = 16
y = index * 32
self.contents.draw_text(x , y, self.width-32, 32, recipe.name, 0)
end
#--------------------------------------------------------------------------
def update_help
current_recipe = recipe
if current_recipe.is_a?(Game_Recipe)
case current_recipe.result_type
when 0
description = $data_items[current_recipe.result].description
when 1
description = $data_armors[current_recipe.result].description
when 2
description = $data_weapons[current_recipe.result].description
end
else
description = ""
end
@help_window.set_text(description)
@help_window.update
end
end # of Window_Craft
#=======================================
class Window_CraftResult < Window_Base
#--------------------------------------------------------------------------
def initialize
super(240, 64, 400, 184)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = "黑体" # = $fontface.is_a?(String) ? $fontface : $defaultfonttype
self.contents.font.size = 18 # = 20
@result = nil
@type = nil
end
#--------------------------------------------------------------------------
def refresh
self.contents.clear
case @type
when 0
item = $data_items[@result]
if item.recover_hp_rate > item.recover_hp
hp_string = "HP回复率:"
hp_stat = item.recover_hp_rate
else
hp_string = "HP回复量:"
hp_stat = item.recover_hp
end
if item.recover_sp_rate > item.recover_sp
sp_string = "SP回复率:"
sp_stat = item.recover_sp_rate
else
sp_string = "SP回复量:"
sp_stat = item.recover_sp
end
@strings = [hp_string, sp_string, "物理防御:" , "魔法防御:", "命中率:", "分散度:"]
@stats = [hp_stat, sp_stat, item. pdef_f, item.mdef_f, item.hit, item.variance,
$game_party.item_number(@result)]
@bitmap = RPG::Cache.icon(item.icon_name)
when 1
item = $data_armors[@result]
@strings = ["物理防御:", "魔法防御:", "回避修正:", "力量增加:", "灵巧增加:",
"速度增加:", "魔力增加:"]
@stats = [item.pdef, item.mdef, item.eva, item.str_plus, item.dex_plus,
item.agi_plus, item.int_plus, $game_party.armor_number(@result) ]
@bitmap = RPG::Cache.icon(item.icon_name)
when 2
item = $data_weapons[@result]
@strings =["攻击力:", "物理防御:", "魔法防御:", "力量增加:", "灵巧增加:",
"速度增加:", "魔力增加:"]
@stats = [item.atk, item.pdef, item.mdef, item.str_plus, item.dex_plus,
item.agi_plus, item.int_plus, $game_party.weapon_number(@result) ]
@bitmap = RPG::Cache.icon(item.icon_name)
end
for i in
[email protected]
x = i%2 * 184
y = i /2 *28 +32
self.contents.font.color = normal_color
self.contents.draw_text(x,y,100, 28,@strings[i])
self.contents.font.color = system_color
self.contents.draw_text(x + 110, y, 45, 28, @stats[i].to_s)
end
self.contents.blt(0, 0, @bitmap, Rect.new(0, 0, 24, 24), 255)
self.contents.font.color= normal_color
self.contents.draw_text(40, 0, 300, 28, "待合成物品的现有数量:")
self.contents.font.color = system_color
count = @stats[@stats.size - 1].to_s
self.contents.draw_text(294, 0, 45, 28, count )
end
#----------------------------------------------------------------------
def set_result(result , type)
@result = result
@type = type
refresh
end
end #of Window_CraftResult
#=======================================
class Window_CraftIngredients < Window_Base
#--------------------------------------------------------------------------
def initialize
super(240, 248, 400, 232)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = "黑体" # = $fontface.is_a?(String) ? $fontface : $defaultfonttype
self.contents.font.size = 18 # = 20
@ingredients = []
@types = []
@quantities = []
@item = nil
@count = 0
end
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in
[email protected]
case @types[i]
when 0
@item = $data_items[@ingredients[i]]
@count = $game_party.item_number(@ingredients[i])
when 1
@item = $data_armors[@ingredients[i]]
@count = $game_party.armor_number(@ingredients[i])
when 2
@item = $data_weapons[@ingredients[i]]
@count = $game_party.weapon_number(@ingredients[i])
end
y = i *26
self.contents.blt(0, y, RPG::Cache.icon(@item.icon_name), Rect.new(0, 0, 24, 24), 255)
self.contents.font.color = @count >= @quantities[i] ? normal_color : disabled_color
self.contents.draw_text(30, y, 280, 28, @item.name)
self.contents.draw_text(300, y, 45, 28, @quantities[i].to_s)
self.contents.font.color = system_color
self.contents.draw_text(245, y, 45, 28, @count.to_s )
end
end
#--------------------------------------------------------------------------
def set_ingredients(ingredients , types, quantities)
@ingredients = ingredients
@types = types
@quantities = quantities
refresh
end
end # of Window_CraftIngredients
#======================================
class Scene_Craft
#--------------------------------------------------------------------------
def initialize(craft_index=0)
@craft_index=craft_index
end
#--------------------------------------------------------------------------
def main
@craft_window = Window_Craft.new
@craft_window.index=@craft_index
@confirm_window = Window_Base.new(120, 188, 400, 64)
@confirm_window.contents = Bitmap.new(368, 32)
@confirm_window.contents.font.name = "黑体"
@confirm_window.contents.font.size = 20
@help_window = Window_Help.new
@craft_window.help_window = @help_window
@result_window=Window_CraftResult.new
@ingredients_window=Window_CraftIngredients.new
@yes_no_window = Window_Command.new(100, ["确定", "放弃"])
@confirm_window.visible = false
@confirm_window.z = 1500
@yes_no_window.visible = false
@yes_no_window.active = false
@yes_no_window.index = 1
@yes_no_window.x = 270
@yes_no_window.y = 252
@yes_no_window.z = 1500
@label_window = Window_Base.new(450,200,190,52)
@label_window.contents=Bitmap.new(@label_window.width - 32,@label_window.height - 32)
@label_window.contents.font.size=20
@label_window.contents.font.color = @label_window.normal_color
@label_window.contents.font.name = "黑体"
@label_window.contents.draw_text(0, 0, @label_window.contents.width, 20, " 现有 需要")
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@help_window.dispose
@craft_window.dispose
@result_window.dispose
@ingredients_window.dispose
@confirm_window.dispose
@yes_no_window.dispose
@label_window.dispose
end
#--------------------------------------------------------------------------
def update
@craft_window.update
@ingredients_window.update
if $game_party.recipes.size > 0
@result_window.set_result(@craft_window.recipe.result, @craft_window.recipe.result_type)
@ingredients_window.set_ingredients(@craft_window.recipe.ingredients,
@craft_window.recipe.ingredient_types,
@craft_window.recipe.quantities)
end
if @craft_window.active
update_craft
return
end
if @yes_no_window.active
confirm_update
return
end
end
#--------------------------------------------------------------------------
def update_craft
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
return
end
if Input.trigger?(Input::C) and $game_party.recipes.size != 0
@recipe = @craft_window.recipe
if @recipe.have
@yes_no_window.active = true
@craft_window.active = false
else
$game_system.se_play($data_system.buzzer_se)
return
end
end
end
#--------------------------------------------------------------------------
def confirm_update
@craft_index = @craft_window.index
@confirm_window.visible = true
@confirm_window.z = 1500
@yes_no_window.visible = true
@yes_no_window.active = true
@yes_no_window.z = 1500
@yes_no_window.update
string = "合成 " + @recipe.name + "?"
cw = @confirm_window.contents.text_size(string).width
center = @confirm_window.contents.width/2 - cw /2
unless @drawn
@confirm_window.contents.draw_text(center, 0, cw, 30, string)
@drawn = true
end
if Input.trigger?(Input::C)
if @yes_no_window.index == 0
$game_system.se_play($data_system.decision_se)
@recipe.make
$game_system.se_play($data_system.save_se)
$scene=Scene_Craft.new(@craft_index)
else
$game_system.se_play($data_system.cancel_se)
$scene=Scene_Craft.new(@craft_index)
end
end
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene=Scene_Craft.new(@craft_index)
end
end
end # of Scene_Craft
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
复制代码
作者:
a22506365
时间:
2009-9-21 16:55
5楼的和上面的是同一个脚本 原来开始不会用插入代码所以发上去就成这样了不好意思
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1