Project1
标题:
《命运的引导者~传说宝石2》获得经验的脚本出错……
[打印本页]
作者:
wshzya
时间:
2012-11-30 13:07
标题:
《命运的引导者~传说宝石2》获得经验的脚本出错……
本帖最后由 wshzya 于 2012-12-1 11:40 编辑
我用了命运的引导者~传说宝石2获得经验的脚本。
#◆◇◆◇◆ アクティブレベルアップVXA ver 1.01 ◇◆◇◆◇
# 開発者用・高速数字描写機構 ver 1.11 以降必須
# サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/
# by みんと
=begin
■ 更新履歴
○ ver 1.01(2012/01/21)
多人数PTで落ちるミスを修正
○ ver 1.00(2012/01/20)
公開
■ 説明
なるべく下の方にセクションを作成し、
本スクリプトを導入してください。
戦闘終了時のリザルト表示を
カシャカシャEXP獲得表示に変更します。
ゲージもアクティブで変動し、
いっぱいになったらレベルアップします。
また、その際は専用のグラフィックに変更されます。
画像はサンプルのものを使用していただいて構いません。
演出はCボタン(Enterキー)でカットできます。
=end
#==============================================================================
# ☆ MINTO
#------------------------------------------------------------------------------
# 様々なフラグを扱うメインモジュールです。
#==============================================================================
module MINTO
# アクティブレベルアップVXを有効化 ( true で有効 / false で無効 )
RGSS["Active_Lv_UpVX"] = true
end
# アクティブレベルアップVXが有効な場合に以降の処理を実行する
if MINTO::RGSS["Active_Lv_UpVX"] == true then
#==============================================================================
# ☆ カスタマイズ
#------------------------------------------------------------------------------
# 機能のカスタマイズをここで行います。
#==============================================================================
module MINTO
# 使用する顔グラグラフィックファイル名
# Face_Name[ID] = ["通常時のファイル末尾名", "LVUP時のファイル末尾名"]
# すべてピクチャーフォルダを参照します。
# ※ ファイル名は機械的に参照します。
# たとえば、Face_Name[1] = ["普", "笑"]と設定し、
# ファイル名がActor1でインデックスが0の場合、
# 実際のファイル名は Actor1_0普, Actor1_0笑 となります。
# 原則、全アクター分設定してください。
# nil の場合は「現在の設定グラフィック」を参照します。
Face_Name = [] # 変更しない
Face_Name[1] = [nil, nil]
Face_Name[2] = [nil, nil]
Face_Name[3] = [nil, nil]
Face_Name[4] = [nil, nil]
Face_Name[5] = [nil, nil]
Face_Name[6] = [nil, nil]
Face_Name[7] = [nil, nil]
Face_Name[8] = [nil, nil]
Face_Name[9] = [nil, nil]
Face_Name[12] = [nil, nil]
Face_Name[13] = [nil, nil]
Face_Name[14] = [nil, nil]
Face_Name[15] = [nil, nil]
Face_Name[16] = [nil, nil]
Face_Name[17] = [nil, nil]
Face_Name[18] = [nil, nil]
Face_Name[19] = [nil, nil]
Face_Name[20] = [nil, nil]
Face_Name[21] = [nil, nil]
Face_Name[22] = [nil, nil]
# 確保するメンバーサイズ
# 他サイトさんの戦闘メンバー拡張スクリプトを導入している場合は、
# その最大数を設定してください
Max_Size = 4
# 演出用の最終レベル
#(他サイトさんのレベル限界変更スクリプトを導入している場合は、
# その最終値を入力してください)
Final_Level = 99
# 空EXPゲージの名前
Base_EXP_Gauge = "gauge"
# 本体EXPゲージの名前
A_EXP_Gauge = "gauge_exp2"
# 演出時間フレーム
#(1秒間が基本的に60フレームです。
# ただし、入手EXPがそれ未満の場合はEXP分のフレーム時間になります)
LVUP_Frame = 300
# ゲージ加算SE([ファイル名, ボリューム, ピッチ)
# ※ マシンスペックが高くないと、おそらく処理落ちします
# 不要な場合はSE名に "" を設定してください
Gauge_SE = ["Decision1", 80, 400]
# LVUP時に鳴らすSE([ファイル名, ボリューム, ピッチ)
LVUP_SE = ["Up4", 100, 150]
#--------------------------------------------------------------------------
# ● KGC Softwareスクリプトの検索
# key : スクリプトキー
#--------------------------------------------------------------------------
def self.search_kgc(key)
# 指定されたスクリプトが有効かどうか調べる
$imported != nil and $imported[key] == true
end
end
#==============================================================================
# ■ Mint_Picture_Number
#------------------------------------------------------------------------------
# ピクチャー数字のスプライト表示を扱うクラスです。
# このクラスは数値の高速再描写に特化したクラスとなっています。
#==============================================================================
class Mint_Picture_Number
#--------------------------------------------------------------------------
# ● ストリングポップ
# string : 求められた文字列のピクチャーの名前
# x_plus : 外部からのX座標の調整用
# y_plus : 外部からのY座標の調整用
#--------------------------------------------------------------------------
def string_pop(string = "", x_plus = 0, y_plus = 0)
# string が無効なら処理を終了
return if string == ""
# 配列の nil をなくす
#@string_pop_sprite.compact!
#@string_pop_duration.compact!
# スプライトを生成
string_pop_sprite = Sprite.new
# 画像を描写
if Scene_Menu.method_defined?("snapshot_for_background") then
string_pop_sprite.bitmap = Cache.picture(string)
else
string_pop_sprite.bitmap = RPG::Cache.picture(string)
end
# 座標データを代入
string_pop_sprite.x = @x.to_i + x_plus
string_pop_sprite.y = @y.to_i + y_plus
string_pop_sprite.z = 10001
# 配列の先頭にシフト
@string_pop_sprite.push(string_pop_sprite)
@string_pop_duration.push(40)
end
#--------------------------------------------------------------------------
# ● フレーム更新
# battler : バトラー
#--------------------------------------------------------------------------
def update(battler = nil)
# 1つでもストリングポップが表示中の場合
if @string_pop_sprite.size >= 1
# 表示中のストリングポップを1つずつ処理する
for i in 0...@string_pop_sprite.size
# ストリングポップを代入
string = @string_pop_sprite[i]
# スプライトが無効な場合
if string.nil?
# 次の処理へ
next
end
# 不透明度が0の場合
if string.opacity <= 0
# ストリングポップを解放
#dispose_string_pop(i)
# 次の処理へ
next
end
# カウントを減らす
@string_pop_duration[i] -= 1
# 残りカウントに応じて分岐
case @string_pop_duration[i]
when 36..39
string.y -= 4
string.blend_type = 1
when 33..37
string.y -= 2
string.blend_type = 1
when 32..34
string.y += 2
string.blend_type = 0
when 25..32
string.y += 4
string.blend_type = 0
end
# 透明度をカウントに応じて下げる
string.opacity = 255 - ((12 - @string_pop_duration[i]) * 26)
end
# 配列の nil を無くす
#@string_pop_sprite.compact!
#@string_pop_duration.compact!
end
end
end
#==============================================================================
# ■ MINTO_Number
#------------------------------------------------------------------------------
# ピクチャーよる数字の表示を扱うモジュールです。
# このモジュールは数値の高速描写に特化したモジュールとなっています。
#==============================================================================
module MINTO_Number
#--------------------------------------------------------------------------
# ● 定数
#--------------------------------------------------------------------------
WIDHT = -4 # 横幅調節値
HEIGHT = 24 # 1カラーの高さ
#--------------------------------------------------------------------------
# ● 数字の描写
# x : 描写先 X 座標
# y : 描写先 Y 座標
# number : 描写する数字
# bitmap : 使用するビットマップ
# color : 使用するカラーインデックス
# text : 使用する画像ファイル名
#--------------------------------------------------------------------------
def self.draw_number(x, y, number, bitmap, color = 0, text = "String02")
# ピクチャーの読み込み
picture = Cache.picture(text)
# ピクチャーの基本の横幅を取得する
width_base = picture.width / 10.0
# 求められた数字を一文字ずつ配列にする
array = number.to_s.split(//)
# ループ処理(イテレータ)
(0...array.size).each do |i|
# 描写座標を計算
draw_x = array[i].to_i * width_base
draw_y = HEIGHT * color
# 描写座標を取得する
rect = Rect.new(draw_x, draw_y, width_base, HEIGHT)
# 数字を描写
bitmap.blt(x + (i * (width_base + WIDHT)), y + 4, picture, rect)
end
end
end
#==============================================================================
# ■ Mint_Gauge_System_Active
#------------------------------------------------------------------------------
# ピクチャーゲージのスプライト表示を扱うクラスです。
# このクラスはゲージの高速再描写に特化したクラスとなっています。
#==============================================================================
class Mint_Gauge_System_Active
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# gauge : ゲージ画像
#--------------------------------------------------------------------------
def initialize(x, y, z = 500, type = 0)
# 空ゲージを読み込む
gauge_base = Cache.picture(MINTO::Base_EXP_Gauge)
# 空ゲージ用のスプライトを作成
@sprite_gauge_base = Sprite.new
# 座標を設定
@sprite_gauge_base.x = x
@sprite_gauge_base.y = y
@sprite_gauge_base.z = z
# スプライトを作成
[url=home.php?mod=space&uid=114926]@sprite[/url] = @sprite_gauge_base.dup
@sprite.x -= 16
@sprite.y -= 16
@sprite.z += 1
@sprite.bitmap = Bitmap.new(64, 32)
@sprite.bitmap.font.color.set(0, 200, 250)
# 空ゲージを描写
@sprite_gauge_base.bitmap = gauge_base
# 本体ゲージを読み込む
@gauge = gauge_initialize(type)
# 本体ゲージ用の配列を作成
@sprite_gauge = [Sprite.new]
(1..6).each do |i|
# 本体ゲージ用のスプライトを作成
@sprite_gauge[i] = Sprite.new
# 座標を設定
@sprite_gauge[i].x = (x - i) + 8
@sprite_gauge[i].y = y + i
@sprite_gauge[i].z = z
end
end
#--------------------------------------------------------------------------
# ● ゲージ用ビットマップの作成
#--------------------------------------------------------------------------
def gauge_initialize(type)
# タイプに応じて分岐
case type
when 0
# ゲージの読み込み
gauge = Cache.picture(MINTO::A_EXP_Gauge)
end
# 本体ゲージ用のスプライトを作成
sprite_gauge = []
(1..100).each do |i|
# 本体ゲージ用のビットマップを作成
sprite_gauge[i] = Bitmap.new(i, 1)
# 本体ゲージ用の描写範囲を計算
dest_rect = Rect.new(0, 0, i, 1)
sprite_gauge[i].stretch_blt(dest_rect, gauge, gauge.rect)
end
return sprite_gauge
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
# スプライトを解放
for s in @sprite_gauge
s.dispose
end
@sprite_gauge_base.bitmap.dispose
@sprite_gauge_base.dispose
@sprite.bitmap.dispose
@sprite.dispose
end
#--------------------------------------------------------------------------
# ● 縁文字描写
#--------------------------------------------------------------------------
def draw_frame_text(x, y, width, height, text, ag = 0)
# 元の色を保存
ori_color = @sprite.bitmap.font.color.clone
# 縁の色を定義
@sprite.bitmap.font.color.set(0, 0, 0)
# 縁文字を描写
@sprite.bitmap.draw_text(x-1, y, width, height, text, ag)
@sprite.bitmap.draw_text(x+1, y, width, height, text, ag)
@sprite.bitmap.draw_text(x, y-1, width, height, text, ag)
@sprite.bitmap.draw_text(x, y+1, width, height, text, ag)
# 元の色に戻す
@sprite.bitmap.font.color = ori_color
# 本体の文字を描写
@sprite.bitmap.draw_text(x, y, width, height, text, ag)
end
#--------------------------------------------------------------------------
# ● 可視状態の取得
#--------------------------------------------------------------------------
def visible
# 先頭の可視状態を返す
return @sprite_gauge[1].visible
end
#--------------------------------------------------------------------------
# ● 可視状態の変更
# visible : 新しい可視状態
#--------------------------------------------------------------------------
def visible=(visible)
# 可視状態の変更(イテレータ)
(1..6).each{|i| @sprite_gauge[i].visible = visible}
@sprite_gauge_base.visible = visible
end
#--------------------------------------------------------------------------
# ● レートの設定
# rate : ゲージの減少率
#--------------------------------------------------------------------------
def set_rate(rate)
rate = [[rate, 100].min, 0].max
# ゲージを実際に描写
@sprite_gauge[1].bitmap = @gauge[rate]
@sprite_gauge[2].bitmap = @gauge[rate]
@sprite_gauge[3].bitmap = @gauge[rate]
@sprite_gauge[4].bitmap = @gauge[rate]
@sprite_gauge[5].bitmap = @gauge[rate]
@sprite_gauge[6].bitmap = @gauge[rate]
end
end
#==============================================================================
# ■ Game_Temp
#------------------------------------------------------------------------------
# セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン
# スタンスは $game_temp で参照されます。
#==============================================================================
class Game_Temp
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :after_battle_phase # アフターバトルフェーズ中フラグ
end
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
# の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● EXPリストの取得
#--------------------------------------------------------------------------
def exp_list
return @exp_list
end
#--------------------------------------------------------------------------
# ● ゲージ用のEXP_NEXT の取得
#--------------------------------------------------------------------------
def minto_next_exp(lv, exp)
exp_rate = exp_for_level(lv + 1) - exp_for_level(lv)
next_exp = exp_for_level(lv + 1) - exp
rate = (next_exp * 100) / exp_rate
if exp_for_level(lv + 1) == 0
rate = 100
end
return 100 - rate
end
#--------------------------------------------------------------------------
# ● 次のレベルまでの EXP 取得
#--------------------------------------------------------------------------
def next_rest_exp2(lv, exp)
return exp_for_level(lv + 1) > 0 ? (exp_for_level(lv + 1) - exp) : 0
end
#--------------------------------------------------------------------------
# ● 次のレベルの経験値を取得
#--------------------------------------------------------------------------
def next_level_exp
exp_for_level([url=home.php?mod=space&uid=22147]@level[/url] + 1)
end
#--------------------------------------------------------------------------
# ○ AP 獲得(KGC[EquipLearnSkill]再定義)
# ap : AP の増加量
# show : マスタースキル表示フラグ
#--------------------------------------------------------------------------
def gain_ap(ap, show)
# 最終スキルを記憶
last_full_ap_skills = full_ap_skills
# 装備品により習得しているスキルに AP を加算
equipment_skills(true).each do |skill|
# APの変更
change_ap(skill, skill_ap(skill.id) + ap)
end
# マスタースキル表示フラグが有効で、且つスキル要素が異なっている場合
if show == true and (last_full_ap_skills != full_ap_skills) then
# メソッドを返す(スキル習得)
return true
end
# メソッドを返す(スキル未習得)
return false
end
#--------------------------------------------------------------------------
# ○ マスターしたスキルの表示(KGC[EquipLearnSkill]再定義)
# new_skills : 新しくマスターしたスキルの配列
#--------------------------------------------------------------------------
def display_full_ap_skills(new_skills)
# 無効化(処理を行わない)
return
end
end
#==============================================================================
# ■ Game_Troop
#------------------------------------------------------------------------------
# 敵グループおよび戦闘に関するデータを扱うクラスです。バトルイベントの処理も
# 行います。このクラスのインスタンスは $game_troop で参照されます。
#==============================================================================
class Game_Troop < Game_Unit
#--------------------------------------------------------------------------
# ● 全滅判定の取得
#--------------------------------------------------------------------------
def all_dead?
# スーパークラスの処理に以降
bool = super
# 勝利確定の場合
if bool then
# アフターバトルフェーズ中でない場合
unless $game_temp.after_battle_phase then
# アフターバトルフェーズを予約する
$game_temp.after_battle_phase = true
# アフターバトルフェーズ準備
SceneManager.scene.reservation_after_battle_phase
end
end
# メソッドを返す
return bool
end
#--------------------------------------------------------------------------
# ● ドロップアイテムの配列作成)
# forcing : 強制フラグ
#--------------------------------------------------------------------------
def make_drop_items(forcing = false)
# 強制フラグがオフの場合
if forcing == false then
# メソッドを返す
return []
end
return dead_members.inject([]) {|r, enemy| r += enemy.make_drop_items }
end
end
#==============================================================================
# ■ Game_Message
#------------------------------------------------------------------------------
# 文章や選択肢などを表示するメッセージウィンドウの状態を扱うクラスです。この
# クラスのインスタンスは $game_message で参照されます。
#==============================================================================
class Game_Message
#--------------------------------------------------------------------------
# ● テキストの追加
#--------------------------------------------------------------------------
alias :minto_rgss3_3_add :add
def add(text)
# アフターバトルフェーズが予約されている場合
if $game_temp.after_battle_phase
# メソッドを返す
return
end
# 元の処理を実行
minto_rgss3_3_add(text)
end
end
#==============================================================================
# ■ Window_BattleMessage
#------------------------------------------------------------------------------
# 戦闘中に表示するメッセージウィンドウです。通常のメッセージウィンドウの機能
# に加え、戦闘進行のナレーションを表示する機能を持ちます。
#==============================================================================
class Window_BattleMessage < Window_Message
#--------------------------------------------------------------------------
# ● 可視状態の変更
# visible : 新しい可視状態
#--------------------------------------------------------------------------
def visible=(visible)
# アフターバトルフェーズ中の場合
if $game_temp.after_battle_phase == true then
# スーパークラスを実行(文章の無効化)
super(visible)
# メッセージを不可視にする
$game_message.visible = false
# メッセージとそれに係わるフラグを無効化
$game_message.texts.clear
# アフターバトルフェーズ中でない場合
else
# スーパークラスを実行(通常の処理)
super(visible)
end
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias :update_Active_Lv_UpVX :update
def update
# 元の処理を実行
update_Active_Lv_UpVX
# アフターバトルフェーズ中の場合
if $game_temp.after_battle_phase == true then
# ウィンドウを可視状態にする
self.visible = true
end
end
end
#==============================================================================
# ■ Window_BattleResult
#------------------------------------------------------------------------------
# バトル終了時に、獲得した EXP やゴールドなどを表示するウィンドウです。
#==============================================================================
class Window_BattleResult < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# exp : EXP
# gold : ゴールド
# treasures : トレジャー
#--------------------------------------------------------------------------
def initialize(exp, gold, treasures, ap, gage_window)
super(320, 0, 224, 416)
self.opacity = 255
self.z = 0x270f
# 各データを保管
[url=home.php?mod=space&uid=13302]@exp[/url] = [exp, 999999].min
[url=home.php?mod=space&uid=236945]@gold[/url] = [gold, 999999].min
@ap = ap
@puls = 0
@items = {}
@gage_window = gage_window
# 文字の表示形式を調節
self.contents.font.italic = true
# テキストの配列を作成
text_array = ["EXP", Vocab::currency_unit]
# APが0以外の場合
if @ap != 0 then
# 用語[AP]を追加
text_array << "AP"
@puls = 48
end
# ループ処理
for i in 0...text_array.size do
# テキストを取得
text = text_array[i]
# テキスト表示
frame_text(4, 8 + 50 * i, 224, 25, text, system_color)
# アンダーライン描写
self.contents.fill_rect(4, 40 + 50 * i, 224, 1, system_color)
end
# 文字の表示形式を戻す
self.contents.font.italic = false
# 入手アイテムが1つでも存在する場合
if treasures.to_a != [] then
# ループ処理
for item in treasures do
# 無効な個数の場合
if @items[item] == nil then
# 個数を初期化
@items[item] = 0
end
# 個数を加算
@items[item] += 1
# アイテムを入手
$game_party.gain_item(item, 1)
end
# 重複するアイテムを削除
treasures.uniq!
# トレジャー用のテキストを表示
frame_text(4, 24 * 4 + @puls, 256, 24, "入手道具", system_color)
# 入手アイテム名のY座標
y = 24 * 5 + @puls
# ループ処理
for item in treasures do
# 入手アイテムを描写
draw_item_name(item, 4, y)
y += 24
end
end
refresh
end
#--------------------------------------------------------------------------
# ● 縁文字描写
#--------------------------------------------------------------------------
def frame_text(x, y, width, height, text, color, ag = 0)
self.contents.font.color.set(0, 0, 0)
self.contents.font.shadow = false
self.contents.draw_text(x-1, y, width, height, text, ag)
self.contents.draw_text(x+1, y, width, height, text, ag)
self.contents.draw_text(x, y-1, width, height, text, ag)
self.contents.draw_text(x, y+1, width, height, text, ag)
self.contents.font.color = color
self.contents.draw_text(x, y, width, height, text, ag)
end
#--------------------------------------------------------------------------
# ● アイテム名の描画
# item : アイテム
# x : 描画先 X 座標
# y : 描画先 Y 座標
#--------------------------------------------------------------------------
def draw_item_name(item, x, y)
# 無効なアイテムの場合
if item == nil then
# メソッドを返す
return
end
# アイテムのアイコンを描写
draw_icon(item.icon_index, x, y, true)
# アイテム名を縁取りして描写
frame_text(x + 28, y, 112, 24, item.name, normal_color)
# 対象アイテムを2つ以上入手している場合
if @items[item] >= 2 then
# アイテムの入手個数を描写
frame_text(-24, y, 188, 24, "×", normal_color, 2)
frame_text(0, y, 188, 24, @items[item].to_s, normal_color, 2)
end
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.openness = 1
@gage_window.openness = 1
@gage_window.visible = true
# 16フレーム待つ
16.times do
# ウィンドウを開く
self.openness += 16
@gage_window.openness += 16
# ゲーム画面を更新
Graphics.update
end
# EXPを描写
MINTO_Number.draw_number(96, 4, @exp, self.contents, 1)
# ゴールドを描写
MINTO_Number.draw_number(96, 52, @gold, self.contents, 1)
# APが0以外の場合
if @ap != 0 then
# APを描写
MINTO_Number.draw_number(96, 100, @ap, self.contents, 1)
end
# ゲージウィンドウをリフレッシュ
@gage_window.refresh_exp
end
end
#==============================================================================
# ■ Window_Active_Exp
#------------------------------------------------------------------------------
# 獲得したEXPに応じて、ゲージを変動させるウィンドウです。
#==============================================================================
class Window_Active_Exp < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# exp : EXP
#--------------------------------------------------------------------------
def initialize(exp, skills, last_exp, last_level)
super(0, 0, 320, 416)
edge = Cache.picture("Blue_Edge")
[url=home.php?mod=space&uid=13302]@exp[/url] = exp
# EXP表示用の配列を作成
@text = []
# LV表示用の配列を作成
@lv = []
# EXPゲージ用の配列
@exp_gauge = []
# スキル保存用の配列
@skills = []
# 最終EXP用の配列
@last_exp = last_exp
# 最終レベル用の配列
@last_level = last_level
# ループ処理
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# 配列を初期化
@skills[i] = []
# ループ処理
for id in 0...skills[i].size do
# スキルが有効な場合
if skills[i] != nil and skills[i][id] != nil then
# 最終スキルの配列の複製を作成
@skills[i] << skills[i][id].id
end
end
end
# 演出スキップフラグをクリア
@skip = false
self.opacity = 255
self.z = 9999
# スプライトを作成
@sprite = Sprite.new
# スプライトのビットマップを作成
@sprite.bitmap = Bitmap.new(width - 32, height - 32)
# スプライトのデータを設定
@sprite.x = self.x + 16
@sprite.y = self.y + 16
@sprite.z = 10000
# グラフィック用のスプライトを作成
@sprite3 = @sprite.dup
@sprite3.z = 9999
@sprite3.bitmap = Bitmap.new(width - 32, 416)
@sprite3.visible = false
# ループ処理
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
dest_rect = Rect.new(0, 16 + (96 * i), 352 * 81 / 100, 108 * 81 / 100)
@sprite3.bitmap.stretch_blt(dest_rect, edge, edge.rect)
end
# グラフィック用のスプライトを作成
@sprite2 = @sprite.dup
@sprite2.z = 9999
@sprite2.bitmap = Bitmap.new(width - 32, height - 32)
end
#--------------------------------------------------------------------------
# ● プラス座標の取得
#--------------------------------------------------------------------------
def puls_y
size = MINTO::Max_Size
return (96.0 * (4.0 / size.to_f)).to_i
end
#--------------------------------------------------------------------------
# ● 修正座標の取得
# y : Y座標
#--------------------------------------------------------------------------
def y_pass(y)
size = MINTO::Max_Size
return (y * (4.0 / size.to_f)).to_i
end
#--------------------------------------------------------------------------
# ● スプライトの作成
#--------------------------------------------------------------------------
def sprite_set
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# アクターを取得
actor = $game_party.all_members[i]
# 座標を取得
y = i * puls_y
# アクター名を描写
frame_text(4, y, 164, 24, actor.name, normal_color)
# 用語を描写
frame_text(12, y + y_pass(36), 64, 24, "LV", system_color)
frame_text(128, y + y_pass(66), 64, 24, "NEXT", system_color, 2)
end
end
#--------------------------------------------------------------------------
# ● 顔グラフィックの描画
# face_name : 顔グラフィック ファイル名
# face_index : 顔グラフィック インデックス
# x : 描画先 X 座標
# y : 描画先 Y 座標
# size : 表示サイズ
#--------------------------------------------------------------------------
def draw_face(face_name, face_index, x, y, size = puls_y)
rect = Rect.new(0, 0, 0, 0)
rect.x = (face_index % 4 * 96 + (96 - size) / 2)
rect.y = (face_index / 4 * 96 + (96 - size) / 2)
rect.width = puls_y.to_m(96)
rect.height = puls_y.to_m(96)
# 対象の範囲を消す
@sprite2.bitmap.fill_rect(x, y, puls_y, puls_y, Color.new(0, 0, 0, 0))
@sprite2.bitmap.blt(x + 76, y, Cache.face(face_name), rect)
end
#--------------------------------------------------------------------------
# ● グラフィックの作成
# actor : アクター
# x : 描写先のX座標
# y : 描写先のY座標
# index : インデックス
# type : 描写タイプ
#--------------------------------------------------------------------------
def graphic_set(actor, x, y, index, type)
# 顔グラフィックの配列
face = []
# 顔グラフィック末尾名が有効な場合
unless MINTO::Face_Name[actor.id][type].nil? then
# ファイル名を作成
file_name = "#{actor.face_name}_#{actor.face_index}"
# ファイル末尾名を取得
file_name += MINTO::Face_Name[actor.id][type]
# 顔グラフィックを読み込む
face[index] = Cache.picture(file_name)
# 対象の範囲を消す
rect = Rect.new(x, y, puls_y, puls_y)
@sprite2.bitmap.fill_rect(rect, Color.new(0, 0, 0, 0))
# 顔グラフィックを描写
@sprite2.bitmap.blt(x, y, face[index], Rect.new(0, 0, puls_y, puls_y))
# 顔グラフィック末尾名が無効な場合
else
# 現在の設定グラフィックを描写
draw_face(actor.face_name, actor.face_index, x, y)
end
end
#--------------------------------------------------------------------------
# ● 縁文字描写
#--------------------------------------------------------------------------
def frame_text(x, y, width, height, text, color, ag = 0)
@sprite.bitmap.font.color.set(0, 0, 0)
@sprite.bitmap.font.shadow = false
@sprite.bitmap.draw_text(x-1, y, width, height, text, ag)
@sprite.bitmap.draw_text(x+1, y, width, height, text, ag)
@sprite.bitmap.draw_text(x, y-1, width, height, text, ag)
@sprite.bitmap.draw_text(x, y+1, width, height, text, ag)
@sprite.bitmap.font.color = color
@sprite.bitmap.draw_text(x, y, width, height, text, ag)
end
#--------------------------------------------------------------------------
# ● リフレッシュEXP
#--------------------------------------------------------------------------
def refresh_exp
# 可視フラグをオン
self.visible = true
@sprite3.visible = true
# 用語を描写
sprite_set
# 更新フレーム数を作成
thyme = @exp < MINTO::LVUP_Frame ? @exp.abs : MINTO::LVUP_Frame
rate_p = @exp < MINTO::LVUP_Frame ? @exp.abs : MINTO::LVUP_Frame
# EXPの配列
exp = []
# LVの配列
last_lv = []
# 最終EXPの配列
last_exp = []
# レベルアップフラグ
level_up = []
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
actor = $game_party.all_members[i]
# 座標を取得
x = 160
y = i * puls_y
# LV表示用のピクチャー数字を作成
@lv[i] = Mint_Picture_Number.new(52, y + y_pass(52), 2, 10000)
# NEXT_EXP表示用のピクチャー数字を作成
@text[i] = Mint_Picture_Number.new(x + 40, y + y_pass(82), 6, 10000)
# EXPゲージを作成
@exp_gauge[i] = Mint_Gauge_System_Active.new(x + 8,
y + y_pass(102), 9999)
# 最終LevelとEXPを代入
last_lv[i] = @last_level[i].to_i
last_exp[i] = @last_exp[i].to_i
# EXPの獲得が可能な場合
if actor.exist? then
# 入手EXPがLVUP_Frame以上なら、LVUP_Frameで割ってその余りを求める
if @exp > MINTO::LVUP_Frame then
last_exp[i] += @exp % MINTO::LVUP_Frame
# 経験値2倍の場合
if actor.final_exp_rate >= 2
# 倍率補正を考慮
for to_loop in 0...(actor.final_exp_rate - 1) do
last_exp[i] += @exp % MINTO::LVUP_Frame
end
end
end
end
# グラフィックを描写
graphic_set(actor, 0, y, actor.id, 0)
end
# 更新フレームがなくなるまで繰り返す
thyme.times do
# グラフィックをクリア
@sprite2.bitmap.clear
# Cボタンが押された場合
if Input.trigger?(Input::C)
# スキップフラグをオン
@skip = true
end
# スキップしない場合
if @skip != true then
# ゲージ加算SEが有効な場合
if MINTO::Gauge_SE[0] != "" then
# SEデータを代入
data = MINTO::Gauge_SE
# ゲージ加算SEを演奏
Audio.se_play("Audio/SE/#{data[0]}", data[1], data[2])
end
end
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# アクターを代入
actor = $game_party.all_members[i]
# EXPの獲得が可能な場合
if actor.exist? then
# 描写用のEXPを加算
last_exp[i] += (@exp / rate_p)
# 経験値倍率補正がある場合
if actor.final_exp_rate >= 2
# 倍率補正を考慮
for to_loop in 0...(actor.final_exp_rate - 1) do
last_exp[i] += (@exp / rate_p)
end
end
end
# NEXT_EXPを取得
next_p = actor.next_rest_exp2(last_lv[i], last_exp[i])
# NEXT_EXPが文字列ではない場合
if next_p.is_a?(Numeric) then
# 最低値を0に設定
next_p = next_p.to_min(0)
# アクターのマザーデータを取得
d_actor = $data_actors[actor.id]
# 最終レベルを代入
final_level = MINTO::Final_Level
# レベルアップが可能な場合
# (NEXT_EXPが0で且つ、最終レベルがMAXレベル未満の場合)
if next_p == 0 and last_lv[i] < final_level then
# 描写用のLVを加算
last_lv[i] += 1
# スキル習得判定
for skill in actor.class.learnings do
# レベル条件を満たしている場合
if last_lv[i] >= skill.level then
# 最終スキルに存在しない場合
unless @skills[i].include?(skill.skill_id) then
# 最終スキルに保存
@skills[i].push(skill.skill_id)
# NewSkill表示
@lv[i].string_pop("NewSkill", 144, y_pass(-32))
end
end
end
# スキップしない場合
if @skip != true then
# SEデータを代入
data = MINTO::LVUP_SE
# SEを演奏する
Audio.se_play("Audio/SE/#{data[0]}", data[1], data[2])
end
# 限界レベルを取得
last_lv[i] = [last_lv[i], final_level].min
# LVUP表示
@lv[i].string_pop("lvup", 144)
# レベルアップフラグを設定
level_up[i] = true
end
# レベルアップが有効な場合
if level_up[i] == true then
# グラフィックを描写
graphic_set(actor, 0, (i * puls_y), actor.id, 1)
else
# グラフィックを描写
graphic_set(actor, 0, (i * puls_y), actor.id, 0)
end
end
# ゲージの長さを算出
n = actor.next_rest_exp2(last_lv[i], last_exp[i])
rate = actor.minto_next_exp(last_lv[i], last_exp[i]).to_max(0, 100)
# ゲージを更新
@exp_gauge[i].set_rate(rate)
# NEXT_EXPを描写
@text[i].set_text(n.to_min(0))
# 最終レベルを描写
@lv[i].set_text(last_lv[i])
# LVUP表示を更新
@lv[i].update
end
# スキップフラグがオフの場合
if @skip == false then
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
end
end
# 必須ウェイトタイム(変更しない)
thyme = 0
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# LVUP表示カウントを取得する
size = @lv[i].string_pop_duration.size
count = @lv[i].string_pop_duration[size - 1].to_i
# thyme より count の方が高ければ thyme を上書き
if count > thyme then
thyme = count
end
end
# 必須ウェイトタイムが1以上の限り更新する
while thyme >= 1 do
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# LVUP表示を更新
@lv[i].update
end
# カウントを減らす
thyme -= 1
# ゲーム画面を更新
Graphics.update
end
# 入力情報を更新
Input.update
end
#--------------------------------------------------------------------------
# ● フレーム更新(スキル習得)
# learning_skill : 新たにスキルを習得したかどうかのフラグ
#--------------------------------------------------------------------------
def update_skill(learning_skill)
# SkillLearningSE演奏フラグ
learning = 0
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# アクターを代入
actor = $game_party.all_members[i]
# EXPの獲得が可能な場合
if $game_party.existing_members.include?(actor) then
# スキル数が増えている場合
if learning_skill[actor] == true then
# SkillLearning表示
@lv[i].string_pop("learning", -64, y_pass(-32))
# SEを演奏する
learning = 1
end
end
end
# 一人でもスキルを習得した場合
if learning == 1 then
# SEデータを代入
data = MINTO::LVUP_SE
# SEを演奏する
Audio.se_play("Audio/SE/#{data[0]}", data[1], data[2])
end
# 必須ウェイトタイム(変更しない)
thyme = 0
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# LVUP表示カウントを取得する
count = @lv[i].string_pop_duration[0].to_i
# thyme より count の方が高ければ thyme を上書き
if count > thyme then
thyme = count
end
end
# ループ処理(必須ウェイトタイム)
thyme.times do
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# LVUP表示を更新
@lv[i].update
end
# ゲーム画面を更新
Graphics.update
end
# 入力情報を更新
Input.update
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
# ループ処理
for sprite in @text + @lv + @exp_gauge do
# 特殊スプライトを解放
sprite.dispose
end
# スプライトを解放
@sprite.bitmap.dispose
@sprite.dispose
@sprite2.bitmap.dispose
@sprite2.dispose
@sprite3.bitmap.dispose
@sprite3.dispose
# スーパークラスを実行
super
end
end
#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
# メニュー画面の処理を行うクラスです。
#==============================================================================
class Scene_Menu < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 背景として使うためのスナップショット作成
#--------------------------------------------------------------------------
def snapshot_for_background
end
end
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
# バトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :last_exp # 最終EXP
attr_reader :last_level # 最終レベル
attr_reader :last_skills # 最終スキルの配列
attr_accessor :active_gauge_window # ゲージウィンドウ
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
alias :terminate_Active_Lv_UpVX :terminate
def terminate
# アクティブゲージウィンドウが有効な場合
if @active_gauge_window != nil then
# アクティブゲージウィンドウを解放
@active_gauge_window.dispose
# バトルリザルトウィンドウを解放
@result_window.dispose
end
# アフターバトルフェーズをクリア
$game_temp.after_battle_phase = false
# 元の処理を実行
terminate_Active_Lv_UpVX
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
alias :minto_rgss3_3_pre_terminate :pre_terminate
def pre_terminate
# アフターバトルフェーズ中の場合
if $game_temp.after_battle_phase == true then
# アフターバトルフェーズの開始
start_after_battle_phase
# ループ処理
loop do
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
# C ボタンが押された場合
if Input.trigger?(Input::C) == true then
break
end
end
end
# 元の処理を実行
minto_rgss3_3_pre_terminate
end
#--------------------------------------------------------------------------
# ● アフターバトルフェーズの準備
#--------------------------------------------------------------------------
def reservation_after_battle_phase
# 最終EXPとレベルを初期化
@last_exp = []
@last_level = []
# 最終スキルの配列
@last_skills = []
# パーティー人数分だけ繰り返す
for i in 0...$game_party.all_members.size.to_m(MINTO::Max_Size) do
# アクターを取得
actor = $game_party.all_members[i]
# 最終EXPを保存
@last_exp[i] = actor.exp.to_i
# 最終レベルを保存
@last_level[i] = actor.level.to_i
# 最終スキルの取得
@last_skills[i] = actor.skills.dec
end
# リザルトデータを記憶
@exp = $game_troop.exp_total
@gold = $game_troop.gold_total
@drop_items = $game_troop.make_drop_items(true)
@ap = 0
end
#--------------------------------------------------------------------------
# ● アフターバトルフェーズの開始
#--------------------------------------------------------------------------
def start_after_battle_phase
# アクティブゲージウィンドウを作成
@active_gauge_window = Window_Active_Exp.new(@exp, @last_skills,
@last_exp, @last_level)
# バトルリザルトウィンドウを作成
@result_window = Window_BattleResult.new(@exp, @gold, @drop_items, @ap,
@active_gauge_window)
end
end
end
复制代码
第830行 unless MINTO::Face_Name[actor.id][type].nil? then
出现 NoMethodError。undefined method '[]' for nil:NilClass。
别的人物都没问题,但有几个不管换位置还是职业都出错。求指教~~~
作者:
wshzya
时间:
2012-11-30 21:04
看相关帖子里就有命运引导者传说宝石正式版……
作者:
wshzya
时间:
2012-12-1 11:39
自己解决了~~~~~~
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1