Code: |
Script : Pokemon_Item_Bag | Ligne : 607 | Méthode : in `item_id' Script : Pokemon_Item_Bag | Ligne : 614 | Méthode : in `item_icon' Script : Pokemon_Item_Bag | Ligne : 89 | Méthode : in `main' |
Code: |
#============================================================================== # ■ Pokemon_Item_Bag # Pokemon Script Project - Krosk # 23/08/07 #----------------------------------------------------------------------------- # Scène à ne pas modifier de préférence #----------------------------------------------------------------------------- # Interface du Sac #----------------------------------------------------------------------------- #------------------------------------------------------------- # $data_item # [Nom, Icone, Type, Description, Prix, Profil] # Profil: "BALL": usable en combat uniquement, tenable, jetable, limité # "BATTLE" : usable en combat uniquement sur les Pokémons, tenable, jetable, limité (boosts stats en combat) # "ITEM": usable en combat sur les Pokémons, en map, tenable, jetable, limité (Consommables tels Potions, etc) # "HOLD": non usable, tenable, jetable, illimité (objets boostants les types) # "PKMN": usable hors combat uniquement, sur les Pokémons, tenable, jetable, limité (super bonbon, boosts stats) # "KEYITEM": non usable en combat, usable en map en interaction, non tenable, non jetable, usage illimité (Objets rares) # "MAP" : usage en interaction, tenable, jetable, limité (repousse, flute repousse) # "CS" / "HM" : non usable en combat, usable en map sur les Pokémons, non tenable, non jetable, usage illimité #------------------------------------------------------------- #------------------------------------------------------------ # @bag = [ paramètre, [], [], [], [], [] ] # id: id objet, nombre: -1 pour objet utilisable à l'infini. # paramètre : optionnel # @bag[1] : Items, objets simples, sous la forme [id, nombre] # @bag[2] : Balles sous la forme [id, nombre] # @bag[3] : CT/CS sous la forme [id, nombre] # @bag[4] : Baies [id, nombre] # @bag[5] : Objets clés #------------------------------------------------------------ module POKEMON_S class Pokemon_Item_Bag # ------------------------------------------- # Initialisation # socket: cf rubrique @bag, indique la poche # item_index: index du curseur # mode = # ------------------------------------------- def initialize(socket_index = $pokemon_party.bag_index, z_level = 100, mode = 0) @bag_index = socket_index[0] @item_index = socket_index[1] @z_level = z_level @mode = mode end def main string_dp = $game_variables[5000]["menu_dp"] ? "_DP" : "" Graphics.freeze @background = Sprite.new @background.bitmap = RPG::Cache.picture("bagfond"+string_dp+".png") @background.z = @z_level @bag_sprite = Sprite.new @bag_sprite.bitmap = RPG::Cache.picture("bag"+@bag_index.to_s+string_dp+".png") @bag_sprite.z = @z_level + 1 @bag_sprite.x = 102 @bag_sprite.y = 96 @socket_name = Window_Base.new(51-16, 27-16, 228+32, 45+32) @socket_name.contents = Bitmap.new(228, 45) @socket_name.opacity = 0 @socket_name.z = @z_level + 1 @socket_name.contents.font.name = $fontface @socket_name.contents.font.size = $fontsizebig @socket_name.contents.font.color = @socket_name.normal_color @item_list = POKEMON_S::Pokemon_Item_List.new(@bag_index, @item_index) @item_list.opacity = 0 @item_list.z = @z_level + 1 @item_list.active = true @item_list.visible = true @text_window = Window_Base.new(6, 286, 273, 193) @text_window.opacity = 0 @text_window.contents = Bitmap.new(241, 161) @text_window.contents.font.name = $fontface @text_window.contents.font.size = $fontsizebig @text_window.contents.font.color = @text_window.normal_color @text_window.z = @z_level + 1 @item_icon = Sprite.new @item_icon.z = @z_level + 2 @item_icon.x = 12 @item_icon.y = 213 @item_icon.zoom_x = 3 @item_icon.zoom_y = 3 @item_icon.bitmap = RPG::Cache.icon(item_icon) @drop_counter = Window_Base.new(0, 0, 120, 64) @drop_counter.contents = Bitmap.new(150-32, 32) @drop_counter.x = 640 - 120 - 3 @drop_counter.y = 480 - 64 - 3 @drop_counter.z = @z_level + 4 @drop_counter.contents.font.name = $fontface @drop_counter.contents.font.size = $fontsize @drop_counter.contents.font.color = @drop_counter.normal_color @drop_counter.visible = false @drop_counter_number = 1 list = ["UTILISER", "DONNER", "JETER", "ORDRE", "RETOUR"] if $battle_var.in_battle list = ["UTILISER", "RETOUR"] end @command_window = Window_Command.new(260, list) @command_window.active = false @command_window.visible = false @command_window.x = 640 - 260 - 3 @command_window.y = 480 - @command_window.height - 3 @command_window.z = @z_level + 10 refresh_all Graphics.transition loop do Graphics.update if @done == true break end Input.update if @drop_counter.visible == true update_drop next end if @command_window.active == true update_command next end if @command_window.active == false @item_list.update update next end end $pokemon_party.bag_index[0] = @bag_index $pokemon_party.bag_index[1] = @item_list.index Graphics.freeze @item_list.dispose @text_window.dispose @item_icon.dispose @background.dispose @socket_name.dispose @drop_counter.dispose @bag_sprite.dispose end def update if Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP) refresh return end if Input.repeat?(Input::RIGHT) and @item_list.on_switch == -1 and @mode != "planter" $game_system.se_play($data_system.cursor_se) @bag_index += @bag_index == 5 ? -4 : 1 @item_list.refresh(@bag_index) refresh_all return end if Input.repeat?(Input::LEFT) and @item_list.on_switch == -1 and @mode != "planter" $game_system.se_play($data_system.cursor_se) @bag_index += @bag_index == 1 ? 4 : -1 @item_list.refresh(@bag_index) refresh_all return end if Input.trigger?(Input::C) if @mode == "sell" if @item_list.index == @item_list.size @done = true return end # item invendable if not(Item.soldable?(item_id)) $game_system.se_play($data_system.buzzer_se) return end # $scene = Pokemon_Item_Shop.new $scene.call_item_amount([item_id, item_amount], "sell", @z_level + 100) refresh_all return end # Echange d'objet if @item_list.on_switch != -1 if @item_list.index != @item_list.size $game_system.se_play($data_system.decision_se) $pokemon_party.item_switch(@bag_index, @item_list.index, @item_list.on_switch) @item_list.on_switch = -1 refresh_all else $game_system.se_play($data_system.cancel_se) @item_list.on_switch = -1 refresh_all end return end # Mode sélection objet à donner if @mode == "hold" # Fermer le sac if @item_list.index == @item_list.size $game_system.se_play($data_system.decision_se) @done = true @return_data = [0, false] # Fermer le sac elsif Item.holdable?(item_id) $game_system.se_play($data_system.decision_se) @done = true @return_data = [item_id, true] else $game_system.se_play($data_system.buzzer_se) end return end # Mode sélection baie à planter if @mode == "planter" # Fermer le sac if @item_list.index == @item_list.size $game_system.se_play($data_system.decision_se) @done = true @return_data = 0 # Fermer le sac elsif Item.socket(item_id) == 4 $game_system.se_play($data_system.decision_se) @done = true @return_data = item_id else $game_system.se_play($data_system.buzzer_se) end return end # Retour if @item_list.index == @item_list.size @done = true # Retour au combat if $battle_var.in_battle return end $scene = POKEMON_S::Pokemon_Menu.new(2) return # Sélection item else @command_window.active = true refresh @command_window.visible = true return end end if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) if @mode == "hold" @done = true @return_data = [0, false] return end if @mode == "sell" @done = true return end if @mode == "planter" @done = true @return_data = 0 return end if @item_list.on_switch != -1 @item_list.on_switch = -1 refresh_all return end if $battle_var.in_battle $game_system.se_play($data_system.cancel_se) @return_data = 0 @done = true return end $game_system.se_play($data_system.cancel_se) $scene = POKEMON_S::Pokemon_Menu.new(2) @done = true return end end def return_data return @return_data end # ---------------------------------- # Appel en cas de changement d'item # ---------------------------------- def refresh string_dp = $game_variables[5000]["menu_dp"] ? "_DP" : "" # Sprite sac @bag_sprite.bitmap = RPG::Cache.picture("bag"+@bag_index.to_s+string_dp+".png") # Nom de la poche @socket_name.contents.clear @socket_name.contents.draw_text(0,0, 228, 48, socket_name, 1) # Tracage de l'icone objet @item_icon.bitmap = RPG::Cache.icon(item_icon) # Texte de description if @command_window.active string = [] string[0] = Item.name(item_id) string[1] = "est sélectionné." elsif @drop_counter.visible == true string = [] string[0] = "En jeter" string[1] = "combien?" elsif @item_list.on_switch != -1 string = [] string[0] = "Echanger avec" string[1] = "lequel?" else string = string_builder(item_descr, 15) end text_window_draw(string) refresh_command_list end # ------------------------------------ # Appel en cas de changement de poche # ------------------------------------ def refresh_all refresh_list refresh end # ------------------------------------ # Rafraichissement de liste (même poche) # ------------------------------------ def refresh_list @item_list.refresh_list end # ---------------------------------- # Liste d'actions associé à l'item # ---------------------------------- def update_command @command_window.update if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) @command_window.active = false @command_window.visible = false refresh return end if Input.trigger?(Input::C) case @command_window.index # Utiliser when 0 if $battle_var.in_battle and not(Item.battle_usable?(item_id)) $game_system.se_play($data_system.buzzer_se) return end if not($battle_var.in_battle) and not(Item.map_usable?(item_id)) $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) @command_window.active = false @command_window.visible = false if Item.use_on_pokemon?(item_id) item_mode = "item_use" if Item.item_able_mode?(item_id) item_mode = "item_able" end scene = POKEMON_S::Pokemon_Party_Menu.new(0, @z_level + 100, item_mode, item_id) scene.main # return_data = [id item_utilisé, item utilisé oui/non, ] data = scene.return_data used = data[1] item_used = 0 else # Utilisé data = Item.effect(item_id) used = data[0] item_used = item_id string = data[1] return_map = data[2] if string.type == String and string != "" window = Pokemon_Window_Help.new window.draw_text(string) Input.update until Input.trigger?(Input::C) Graphics.update Input.update end window.dispose end end if used $pokemon_party.use_item(item_id) end # En combat, retour à l'écran après utilisation de l'objet if $battle_var.in_battle and used $battle_var.action_id = 1 @done = true @return_data = item_used return end if used and return_map @done = true return end refresh_all @item_list.refresh Graphics.transition return # Retour (dernière option) when @command_window.item_max-1 $game_system.se_play($data_system.cancel_se) @command_window.active = false @command_window.visible = false refresh return # Donner when 1 if not(Item.holdable?(item_id)) $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) @command_window.active = false @command_window.visible = false scene = POKEMON_S::Pokemon_Party_Menu.new(0, @z_level + 100, "hold", item_id) scene.main return_data = scene.return_data # return_data = [item tenu true/false, id item_tenu, item remplacé true/false, id item remplacé] item_id2 = return_data[2] replaced = return_data[3] if replaced $pokemon_party.add_item(item_id2) end item_id1 = return_data[0] hold = return_data[1] if hold $pokemon_party.drop_item(item_id1) end refresh_all Graphics.transition return # Jeter when 2 if not(Item.holdable?(item_id)) $game_system.se_play($data_system.buzzer_se) return end $game_system.se_play($data_system.decision_se) @command_window.active = false @command_window.visible = false @drop_counter.visible = true refresh refresh_drop_counter return # Ordre when 3 @item_list.on_switch = @item_list.index @command_window.active = false @command_window.visible = false refresh_all return end end end def refresh_command_list # Fermer le sac if @item_list.index == @item_list.size return end # En combat if $battle_var.in_battle if Item.battle_usable?(item_id) @command_window.enable_item(0) else @command_window.disable_item(0) end # En map else if Item.map_usable?(item_id) @command_window.enable_item(0) else @command_window.disable_item(0) end if Item.holdable?(item_id) @command_window.enable_item(1) @command_window.enable_item(2) else @command_window.disable_item(1) @command_window.disable_item(2) end end end def update_drop if Input.repeat?(Input::UP) if @drop_counter_number < item_amount @drop_counter_number += 1 refresh_drop_counter end return end if Input.repeat?(Input::DOWN) if @drop_counter_number > 1 @drop_counter_number -= 1 refresh_drop_counter end return end if Input.repeat?(Input::LEFT) if @drop_counter_number > 1 @drop_counter_number -= 10 if @drop_counter_number < 1 @drop_counter_number = 1 end refresh_drop_counter end return end if Input.repeat?(Input::RIGHT) if @drop_counter_number < item_amount @drop_counter_number += 10 if @drop_counter_number > item_amount @drop_counter_number = item_amount end refresh_drop_counter end return end if Input.repeat?(Input::B) $game_system.se_play($data_system.cancel_se) @drop_counter_number = 1 @drop_counter.visible = false @command_window.active = true @command_window.visible= true refresh return end if Input.repeat?(Input::C) $game_system.se_play($data_system.decision_se) if decision $game_system.se_play($data_system.decision_se) id_ = item_id $pokemon_party.drop_item(id_, @drop_counter_number) @drop_counter.visible = false refresh_list text_window_draw(["Jeté " + @drop_counter_number.to_s, Item.name(id_) + "."]) @drop_counter_number = 1 @command_window.active = false @command_window.visible = false Input.update until Input.trigger?(Input::C) Graphics.update Input.update end refresh_all return else $game_system.se_play($data_system.cancel_se) @drop_counter_number = 1 @drop_counter.visible = false @command_window.active = false @command_window.visible = false refresh return end end end def refresh_drop_counter @drop_counter.contents.clear @drop_counter.contents.draw_text(0,0,88,32, "x " + @drop_counter_number.to_s, 2) end # ---------------------------------- # Identification de l'item !!!!!!! Utilise l'index de la poche # ---------------------------------- def item_id return $pokemon_party.bag[@bag_index][@item_list.index][0] end def item_icon if @item_list.index == @item_list.size return "return.png" else return Item.icon(item_id) end end def item_descr if @item_list.index == @item_list.size if $battle_var.in_battle return "Retourner au combat." end if @mode == "sell" return "Retourner au magasin." end return "Retourner au jeu." else return Item.descr(item_id) end end def item_amount return $pokemon_party.bag[@bag_index][@item_list.index][1] end # ---------------------------------- # Decision # ---------------------------------- def decision @command = Window_Command.new(120, ["OUI", "NON"], $fontsize) @command.x = 517 @command.y = 480 - 6 - @drop_counter.height - @command.height @command.z = @z_level + 15 loop do Graphics.update Input.update @command.update if Input.trigger?(Input::C) and @command.index == 0 @command.dispose @command = nil return true end if (Input.trigger?(Input::C) and @command.index == 1) or Input.trigger?(Input::B) @command.dispose @command = nil return false end end end # ---------------------------------- # Texte # ---------------------------------- def socket_name case @bag_index when 1 return "OBJETS" when 2 return "POKéBALL" when 3 return "CT & CS" when 4 return "BAIES" when 5 return "OBJ.RARES" end end def text_window_draw(list) @text_window.contents.clear for i in 0..list.length-1 @text_window.contents.draw_text(0, 38*i, 241, $fhb, list[i]) end end def dialog_window_draw(string) end def string_builder(text, limit) length = text.length full1 = false full2 = false full3 = false full4 = false string1 = "" string2 = "" string3 = "" string4 = "" word = "" for i in 0..length letter = text[i..i] if letter != " " and i != length word += letter.to_s else word = word + " " if (string1 + word).length < limit and not(full1) string1 += word word = "" else full1 = true end if (string2 + word).length < limit and not(full2) string2 += word word = "" else full2 = true end if (string3 + word).length < limit and not(full3) string3 += word word = "" else full3 = true end #if (string4 + word).length < limit and not(full4) string4 += word word = "" #else # full4 = true #end end end if string4.length > 1 string4 = string4[0..string4.length-2] end return [string1, string2, string3, string4] end end # ---------------------------------- # class liste des objets dans une poche (socket) # ---------------------------------- class Pokemon_Item_List < Window_Selectable attr_accessor :on_switch def initialize(socket = 1, index = 1) super(287, 32, 356, 416, $fn) self.contents = Bitmap.new(324, 384) self.contents.font.name = $fontnarrow self.contents.font.size = $fontnarrowsize self.contents.font.color = normal_color @bag_index = socket @item_max = size + 1 @on_switch = -1 self.index = index end def refresh(socket = @bag_index) self.index = 0 @bag_index = socket @item_max = size + 1 refresh_list end def refresh_list self.contents.clear self.contents = Bitmap.new(356, $fhb*(size+1)) self.contents.font.name = $fontnarrow self.contents.font.size = $fontnarrowsize self.contents.font.color = normal_color hl = $fn i = 0 for item in $pokemon_party.bag[@bag_index] id = item[0] amount = item[1] if @on_switch == i self.contents.font.color = text_color(2) # Rouge end self.contents.draw_text(14, hl*i, 304, hl, Item.name(id)) if Item.holdable?(id) self.contents.draw_text(14, hl*i, 304, hl, "x ", 2) self.contents.draw_text(14, hl*i, 304, hl, amount.to_s, 2) end if @on_switch == i self.contents.font.color = normal_color end i += 1 end self.contents.draw_text(14, hl*i, 310, hl, "FERMER LE SAC") end def item_id(index = @bag_index) return $pokemon_party.bag[index][self.index] end def size return $pokemon_party.bag_list(@bag_index).length end end end |
Code: |
#============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ # 文章表示に使うメッセージウィンドウです。 #============================================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(80, 304, 480, 160) self.contents = Bitmap.new(width - 32, height - 32) self.visible = false self.z = 9998 @fade_in = false @fade_out = false @contents_showing = false @cursor_width = 0 self.active = false self.index = -1 end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose terminate_message $game_temp.message_window_showing = false if @input_number_window != nil @input_number_window.dispose end super end #-------------------------------------------------------------------------- # ● メッセージ終了処理 #-------------------------------------------------------------------------- def terminate_message self.active = false self.pause = false self.index = -1 self.contents.clear # 表示中フラグをクリア @contents_showing = false # メッセージ コールバックを呼ぶ if $game_temp.message_proc != nil $game_temp.message_proc.call end # 文章、選択肢、数値入力に関する変数をクリア $game_temp.message_text = nil $game_temp.message_proc = nil $game_temp.choice_start = 99 $game_temp.choice_max = 0 $game_temp.choice_cancel_type = 0 $game_temp.choice_proc = nil $game_temp.num_input_start = 99 $game_temp.num_input_variable_id = 0 $game_temp.num_input_digits_max = 0 # ゴールドウィンドウを開放 if @gold_window != nil @gold_window.dispose @gold_window = nil end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = normal_color self.contents.font.name = $fontface self.contents.font.size = $fontsize x = y = 0 @cursor_width = 0 # 選択肢なら字下げを行う if $game_temp.choice_start == 0 x = 8 end # 表示待ちのメッセージがある場合 if $game_temp.message_text != nil text = $game_temp.message_text # 制御文字処理 begin last_text = text.clone text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] } end until text == last_text text.gsub!(/\\[Nn]\[([0-9]+)\]/) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : "" end # 便宜上、"\\\\" を "\000" に変換 text.gsub!(/\\\\/) { "\000" } # "\\C" を "\001" に、"\\G" を "\002" に変換 text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } text.gsub!(/\\[Gg]/) { "\002" } # c に 1 文字を取得 (文字が取得できなくなるまでループ) while ((c = text.slice!(/./m)) != nil) # \\ の場合 if c == "\000" # 本来の文字に戻す c = "\\" end # \C[n] の場合 if c == "\001" # 文字色を変更 text.sub!(/\[([0-9]+)\]/, "") color = $1.to_i if color >= 0 and color <= 7 self.contents.font.color = text_color(color) end # 次の文字へ next end # \G の場合 if c == "\002" # ゴールドウィンドウを作成 if @gold_window == nil @gold_window = Window_Gold.new @gold_window.x = 560 - @gold_window.width if $game_temp.in_battle @gold_window.y = 192 else @gold_window.y = self.y >= 128 ? 32 : 384 end @gold_window.opacity = self.opacity @gold_window.back_opacity = self.back_opacity end # 次の文字へ next end # 改行文字の場合 if c == "\n" # 選択肢ならカーソルの幅を更新 if y >= $game_temp.choice_start @cursor_width = [@cursor_width, x].max end # y に 1 を加算 y += 1 x = 0 # 選択肢なら字下げを行う if y >= $game_temp.choice_start x = 8 end # 次の文字へ next end # 文字を描画 self.contents.draw_text(4 + x, 32 * y, 40, 32, c) # x に描画した文字の幅を加算 x += self.contents.text_size(c).width end end # 選択肢の場合 if $game_temp.choice_max > 0 @item_max = $game_temp.choice_max self.active = true self.index = 0 end # 数値入力の場合 if $game_temp.num_input_variable_id > 0 digits_max = $game_temp.num_input_digits_max number = $game_variables[$game_temp.num_input_variable_id] @input_number_window = Window_InputNumber.new(digits_max) @input_number_window.number = number @input_number_window.x = self.x + 8 @input_number_window.y = self.y + $game_temp.num_input_start * 32 end end #-------------------------------------------------------------------------- # ● ウィンドウの位置と不透明度の設定 #-------------------------------------------------------------------------- def reset_window if $game_temp.in_battle self.y = 16 else case $game_system.message_position when 0 # 上 self.y = 16 when 1 # 中 self.y = 160 when 2 # 下 self.y = 304 end print($game_system.message_position.y) end if $game_system.message_frame == 0 self.opacity = 255 else self.opacity = 0 end self.back_opacity = 160 end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # フェードインの場合 if @fade_in self.contents_opacity += 24 if @input_number_window != nil @input_number_window.contents_opacity += 24 end if self.contents_opacity == 255 @fade_in = false end return end # 数値入力中の場合 if @input_number_window != nil @input_number_window.update # 決定 if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) $game_variables[$game_temp.num_input_variable_id] = @input_number_window.number $game_map.need_refresh = true # 数値入力ウィンドウを解放 @input_number_window.dispose @input_number_window = nil terminate_message end return end # メッセージ表示中の場合 if @contents_showing # 選択肢の表示中でなければポーズサインを表示 if $game_temp.choice_max == 0 self.pause = true end # キャンセル if Input.trigger?(Input::B) if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0 $game_system.se_play($data_system.cancel_se) $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1) terminate_message end end # 決定 if Input.trigger?(Input::C) if $game_temp.choice_max > 0 $game_system.se_play($data_system.decision_se) $game_temp.choice_proc.call(self.index) end terminate_message end return end # フェードアウト中以外で表示待ちのメッセージか選択肢がある場合 if @fade_out == false and $game_temp.message_text != nil @contents_showing = true $game_temp.message_window_showing = true reset_window refresh Graphics.frame_reset self.visible = true self.contents_opacity = 0 if @input_number_window != nil @input_number_window.contents_opacity = 0 end @fade_in = true return end # 表示すべきメッセージがないが、ウィンドウが可視状態の場合 if self.visible @fade_out = true self.opacity -= 48 if self.opacity == 0 self.visible = false @fade_out = false $game_temp.message_window_showing = false end return end end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if @index >= 0 n = $game_temp.choice_start + @index self.cursor_rect.set(8, n * 32, @cursor_width, 32) else self.cursor_rect.empty end end end |
Code: |
$game_system.se_play($data_system.decision_se) |
Code: |
$game_system.se_play("Le nom du morceau") |
Code: |
#============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ # 文章表示に使うメッセージウィンドウです。 #============================================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(80, 304, 480, 160) self.contents = Bitmap.new(width - 32, height - 32) self.visible = false self.z = 9998 @fade_in = false @fade_out = false @contents_showing = false @cursor_width = 0 self.active = false self.index = -1 end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose terminate_message $game_temp.message_window_showing = false if @input_number_window != nil @input_number_window.dispose end super end #-------------------------------------------------------------------------- # ● メッセージ終了処理 #-------------------------------------------------------------------------- def terminate_message self.active = false self.pause = false self.index = -1 self.contents.clear # 表示中フラグをクリア @contents_showing = false # メッセージ コールバックを呼ぶ if $game_temp.message_proc != nil $game_temp.message_proc.call end # 文章、選択肢、数値入力に関する変数をクリア $game_temp.message_text = nil $game_temp.message_proc = nil $game_temp.choice_start = 99 $game_temp.choice_max = 0 $game_temp.choice_cancel_type = 0 $game_temp.choice_proc = nil $game_temp.num_input_start = 99 $game_temp.num_input_variable_id = 0 $game_temp.num_input_digits_max = 0 # ゴールドウィンドウを開放 if @gold_window != nil @gold_window.dispose @gold_window = nil end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = normal_color self.contents.font.name = $fontface self.contents.font.size = $fontsize x = y = 0 @cursor_width = 0 # 選択肢なら字下げを行う if $game_temp.choice_start == 0 x = 8 end # 表示待ちのメッセージがある場合 if $game_temp.message_text != nil text = $game_temp.message_text # 制御文字処理 begin last_text = text.clone text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] } end until text == last_text text.gsub!(/\\[Nn]\[([0-9]+)\]/) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : "" end # 便宜上、"\\\\" を "\000" に変換 text.gsub!(/\\\\/) { "\000" } # "\\C" を "\001" に、"\\G" を "\002" に変換 text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } text.gsub!(/\\[Gg]/) { "\002" } # c に 1 文字を取得 (文字が取得できなくなるまでループ) while ((c = text.slice!(/./m)) != nil) # \\ の場合 if c == "\000" # 本来の文字に戻す c = "\\" end # \C[n] の場合 if c == "\001" # 文字色を変更 text.sub!(/\[([0-9]+)\]/, "") color = $1.to_i if color >= 0 and color <= 7 self.contents.font.color = text_color(color) end # 次の文字へ next end # \G の場合 if c == "\002" # ゴールドウィンドウを作成 if @gold_window == nil @gold_window = Window_Gold.new @gold_window.x = 560 - @gold_window.width if $game_temp.in_battle @gold_window.y = 192 else @gold_window.y = self.y >= 128 ? 32 : 384 end @gold_window.opacity = self.opacity @gold_window.back_opacity = self.back_opacity end # 次の文字へ next end # 改行文字の場合 if c == "\n" # 選択肢ならカーソルの幅を更新 if y >= $game_temp.choice_start @cursor_width = [@cursor_width, x].max end # y に 1 を加算 y += 1 x = 0 # 選択肢なら字下げを行う if y >= $game_temp.choice_start x = 8 end # 次の文字へ next end # 文字を描画 self.contents.draw_text(4 + x, 32 * y, 40, 32, c) # x に描画した文字の幅を加算 x += self.contents.text_size(c).width end end # 選択肢の場合 if $game_temp.choice_max > 0 @item_max = $game_temp.choice_max self.active = true self.index = 0 end # 数値入力の場合 if $game_temp.num_input_variable_id > 0 digits_max = $game_temp.num_input_digits_max number = $game_variables[$game_temp.num_input_variable_id] @input_number_window = Window_InputNumber.new(digits_max) @input_number_window.number = number @input_number_window.x = self.x + 8 @input_number_window.y = self.y + $game_temp.num_input_start * 32 end end #-------------------------------------------------------------------------- # ● ウィンドウの位置と不透明度の設定 #-------------------------------------------------------------------------- def reset_window if $game_temp.in_battle self.y = 16 else case $game_system.message_position when 0 # 上 self.y = 16 when 1 # 中 self.y = 160 when 2 # 下 self.y = 304 end print($game_system.message_position.y) end if $game_system.message_frame == 0 self.opacity = 255 else self.opacity = 0 end self.back_opacity = 160 end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # フェードインの場合 if @fade_in self.contents_opacity += 24 if @input_number_window != nil @input_number_window.contents_opacity += 24 end if self.contents_opacity == 255 @fade_in = false end return end # 数値入力中の場合 if @input_number_window != nil @input_number_window.update # 決定 if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) $game_variables[$game_temp.num_input_variable_id] = @input_number_window.number $game_map.need_refresh = true # 数値入力ウィンドウを解放 @input_number_window.dispose @input_number_window = nil terminate_message end return end # メッセージ表示中の場合 if @contents_showing # 選択肢の表示中でなければポーズサインを表示 if $game_temp.choice_max == 0 self.pause = true end # キャンセル if Input.trigger?(Input::B) if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0 $game_system.se_play($data_system.cancel_se) $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1) terminate_message end end # 決定 if Input.trigger?(Input::C) $game_system.se_play("Audio/SE/select.wav") if $game_temp.choice_max > 0 $game_temp.choice_proc.call(self.index) end terminate_message end return end # フェードアウト中以外で表示待ちのメッセージか選択肢がある場合 if @fade_out == false and $game_temp.message_text != nil @contents_showing = true $game_temp.message_window_showing = true reset_window refresh Graphics.frame_reset self.visible = true self.contents_opacity = 0 if @input_number_window != nil @input_number_window.contents_opacity = 0 end @fade_in = true return end # 表示すべきメッセージがないが、ウィンドウが可視状態の場合 if self.visible @fade_out = true self.opacity -= 48 if self.opacity == 0 self.visible = false @fade_out = false $game_temp.message_window_showing = false end return end end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if @index >= 0 n = $game_temp.choice_start + @index self.cursor_rect.set(8, n * 32, @cursor_width, 32) else self.cursor_rect.empty end end end |
Code: |
#============================================================================== # ■ Window_Message # Pokemon Script Project - Krosk # 18/07/07 #----------------------------------------------------------------------------- # Scène à ne pas modifier de préférence #----------------------------------------------------------------------------- # #----------------------------------------------------------------------------- class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def initialize # Redéfinition taille du cadre super(21, 342, 597, 126) self.contents = Bitmap.new(width - 32, height - 32) self.visible = false self.z = 9998 self.opacity = 0 @dummy = Sprite.new @dummy.bitmap = RPG::Cache.picture(POKEMON_S::MSG) @dummy.visible = false @dummy.z = 9997 @fade_in = false @fade_out = false @contents_showing = false @cursor_width = 0 @speed_defilement = POKEMON_S::SPEED_MSG self.active = false self.index = -1 end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def reset_window # Redéfinition if $game_temp.in_battle self.y = 342 @dummy.y = 336 else case $game_system.message_position when 0 # 上 self.y = 6 @dummy.y = 0 when 1 # 中 self.y = 166 @dummy.y = 160 when 2 # Redéfinition position du cadre inférieur self.y = 342 @dummy.y = 336 when 3 self.y = $position + 6 @dummy.y = $position $game_system.message_position = 2 end end case $game_system.message_frame when 0 #self.opacity = 255 @dummy.opacity = 255 when 1 #self.opacity = 0 @dummy.opacity = 0 when 2 #self.opacity = $opacite @dummy.opacity = $opacite $game_system.message_frame = 0 else #self.opacity = 0 @dummy.opacity = 0 end self.back_opacity = 255 end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def update super # フェードインの場合 if @fade_in self.contents_opacity += 24 if @input_number_window != nil @input_number_window.contents_opacity += 24 end if self.contents_opacity == 255 @fade_in = false if @speed_defilement != 0 refresh end end return end # 数値入力中の場合 if @input_number_window != nil @input_number_window.update # 決定 if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) $game_variables[$game_temp.num_input_variable_id] = @input_number_window.number $game_map.need_refresh = true # 数値入力ウィンドウを解放 @input_number_window.dispose @input_number_window = nil $nb_min = nil $nb_max = nil terminate_message end return end # メッセージ表示中の場合 if @contents_showing # 選択肢の表示中でなければポーズサインを表示 if $game_temp.choice_max == 0 self.pause = true end # キャンセル if Input.trigger?(Input::B) if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0 $game_system.se_play($data_system.cancel_se) $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1) terminate_message end end # 決定 if Input.trigger?(Input::C) if $game_temp.choice_max > 0 $game_system.se_play($data_system.decision_se) $game_temp.choice_proc.call(self.index) end terminate_message end return end # フェードアウト中以外で表示待ちのメッセージか選択肢がある場合 if @fade_out == false and $game_temp.message_text != nil @contents_showing = true $game_temp.message_window_showing = true reset_window if @speed_defilement == 0 refresh end self.visible = true @dummy.visible = true Graphics.frame_reset self.contents_opacity = 0 if @input_number_window != nil @input_number_window.contents_opacity = 0 end @fade_in = true return end # 表示すべきメッセージがないが、ウィンドウが可視状態の場合 if self.visible @fade_out = true @dummy.opacity = 0 #self.opacity -= 48 if @dummy.opacity == 0 #self.opacity == 0 self.visible = false @dummy.visible = false @fade_out = false $game_temp.message_window_showing = false end return end end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = normal_color self.contents.font.name = $fontface self.contents.font.size = $fontsize text_count = 0 x = y = 0 push = false @cursor_width = 0 # 選択肢なら字下げを行う if $game_temp.choice_start == 0 x = 8 end # 表示待ちのメッセージがある場合 if $game_temp.message_text != nil text = $game_temp.message_text # 制御文字処理 begin last_text = text.clone text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] } # MODIF text.gsub!(/\\[Pp]\[([0-9]+)\]/) { $string[$1.to_i] } end until text == last_text text.gsub!(/\\[Nn]\[([0-9]+)\]/) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : "" end # 便宜上、"\\\\" を "\000" に変換 text.gsub!(/\\\\/) { "\000" } # "\\C" を "\001" に、"\\G" を "\002" に変換 text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } text.gsub!(/\\[Gg]/) { "\002" } # c に 1 文字を取得 (文字が取得できなくなるまでループ) while ((c = text.slice!(/./m)) != nil) # \\ の場合 if c == "\000" # 本来の文字に戻す c = "\\" end # \C[n] の場合 if c == "\001" # 文字色を変更 text.sub!(/\[([0-9]+)\]/, "") color = $1.to_i if color >= 0 and color <= 7 self.contents.font.color = text_color(color) end # 次の文字へ next end # \G の場合 if c == "\002" # ゴールドウィンドウを作成 if @gold_window == nil @gold_window = Window_Gold.new @gold_window.x = 560 - @gold_window.width if $game_temp.in_battle @gold_window.y = 192 else @gold_window.y = self.y >= 128 ? 32 : 384 end @gold_window.opacity = 255 @gold_window.back_opacity = 255 end # 次の文字へ next end # 改行文字の場合 if c == "\n" # 選択肢ならカーソルの幅を更新 if y >= $game_temp.choice_start @cursor_width = [@cursor_width, x].max end # y に 1 を加算 y += 1 x = 0 # 選択肢なら字下げを行う if y >= $game_temp.choice_start x = 8 end # 次の文字へ next end # 文字を描画 self.contents.draw_text(4 + x, 32 * y, 40, 32, c) text_count += 1 Input.update if Input.trigger?(Input::C) push = true end if text_count == @speed_defilement and @speed_defilement != 0 and push == false Graphics.update #$game_map.update $scene.update#spriteset.update text_count = 0 end # x に描画した文字の幅を加算 x += self.contents.text_size(c).width end end # 選択肢の場合 if $game_temp.choice_max > 0 @item_max = $game_temp.choice_max self.active = true self.index = 0 end # 数値入力の場合 if $game_temp.num_input_variable_id > 0 @input_number_window = Window_InputNumber.new($game_temp.num_input_digits_max) @input_number_window.x = self.x + 8 @input_number_window.y = self.y + $game_temp.num_input_start * 32 end end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def update_cursor_rect if @index >= 0 n = $game_temp.choice_start + @index self.cursor_rect.set(0, n * 32, 32, 32) else self.cursor_rect.empty end end end class Interpreter def setup_choices(parameters) # Redéfinition # choice_max に選択肢の項目数を設定 $game_temp.choice_max = parameters[0].size # message_text に選択肢を設定 for text in parameters[0] # Espaces supplémentaires $game_temp.message_text += " " + text + "\n" end # キャンセルの場合の処理を設定 $game_temp.choice_cancel_type = parameters[1] # コールバックを設定 current_indent = @list[@index].indent $game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n } end end |
Code: |
$game_system.se_play($data_system.decision_se) |