Interpreter 1:
复制代码
- #==============================================================================
- # ■ Interpreter (分割定义 1)
- #------------------------------------------------------------------------------
- # 执行事件命令的解释器。本类在 Game_System 类
- # 与 Game_Event 类的内部使用。
- #==============================================================================
- class Interpreter
- #--------------------------------------------------------------------------
- # ● 初始化标志
- # depth : 事件的深度
- # main : 主标志
- #--------------------------------------------------------------------------
- def initialize(depth = 0, main = false)
- @depth = depth
- @main = main
- # 深度超过 100 级
- if depth > 100
- print("调用公用事件超过了限制。")
- exit
- end
- # 清除注释器的内部状态
- clear
- end
- #--------------------------------------------------------------------------
- # ● 清除
- #--------------------------------------------------------------------------
- def clear
- @map_id = 0 # 启动时的地图 ID
- @event_id = 0 # 事件 ID
- @message_waiting = false # 信息结束后待机中
- @move_route_waiting = false # 移动结束后待机中
- @button_input_variable_id = 0 # 输入按钮 变量 ID
- @wait_count = 0 # 窗口计数
- @child_interpreter = nil # 子实例
- @branch = {} # 分支数据
- end
- #--------------------------------------------------------------------------
- # ● 设置事件
- # list : 执行内容
- # event_id : 事件 ID
- #--------------------------------------------------------------------------
- def setup(list, event_id)
- # 清除注释器的内部状态
- clear
- # 记忆地图 ID
- @map_id = $game_map.map_id
- # 记忆事件 ID
- @event_id = event_id
- # 记忆执行内容
- @list = list
- # 初始化索引
- @index = 0
- # 清除分支数据用复述
- @branch.clear
- end
- #--------------------------------------------------------------------------
- # ● 执行中判定
- #--------------------------------------------------------------------------
- def running?
- return @list != nil
- end
- #--------------------------------------------------------------------------
- # ● 设置启动中事件
- #--------------------------------------------------------------------------
- def setup_starting_event
- # 刷新必要的地图
- if $game_map.need_refresh
- $game_map.refresh
- end
- # 如果调用的公共事件被预约的情况下
- if $game_temp.common_event_id > 0
- # 设置事件
- setup($data_common_events[$game_temp.common_event_id].list, 0)
- # 解除预约
- $game_temp.common_event_id = 0
- return
- end
- # 循环 (地图事件)
- for event in $game_map.events.values
- # 如果找到了启动中的事件
- if event.starting
- # 如果不是自动执行
- if event.trigger < 3
- # 清除启动中标志
- event.clear_starting
- # 锁定
- event.lock
- end
- # 设置事件
- setup(event.list, event.id)
- return
- end
- end
- if $game_switches[54] == true
- setup($data_common_events[14].list ,0)
- end
- end
- #--------------------------------------------------------------------------
- # ● 刷新画面
- #--------------------------------------------------------------------------
- def update
- # 初始化循环计数
- @loop_count = 0
- # 循环
- loop do
- # 循环计数加 1
- @loop_count += 1
- # 如果执行了 100 个事件指令
- if @loop_count > 100
- # 为了防止系统崩溃、调用 Graphics.update
- Graphics.update
- @loop_count = 0
- end
- # 如果地图与事件启动有差异
- if $game_map.map_id != @map_id
- # 事件 ID 设置为 0
- @event_id = 0
- end
- # 子注释器存在的情况下
- if @child_interpreter != nil
- # 刷新子注释器
- @child_interpreter.update
- # 子注释器执行结束的情况下
- unless @child_interpreter.running?
- # 删除字注释器
- @child_interpreter = nil
- end
- # 如果子注释器还存在
- if @child_interpreter != nil
- return
- end
- end
- # 信息结束待机的情况下
- if @message_waiting
- return
- end
- # 移动结束待机的情况下
- if @move_route_waiting
- # 强制主角移动路线的情况下
- if $game_player.move_route_forcing
- return
- end
- # 循环 (地图事件)
- for event in $game_map.events.values
- # 本事件为强制移动路线的情况下
- if event.move_route_forcing
- return
- end
- end
- # 清除移动结束待机中的标志
- @move_route_waiting = false
- end
- # 输入按钮待机中的情况下
- if @button_input_variable_id > 0
- # 执行按钮输入处理
- input_button
- return
- end
- # 等待中的情况下
- if @wait_count > 0
- # 减少等待计数
- @wait_count -= 1
- return
- end
- # 如果被强制行动的战斗者存在
- if $game_temp.forcing_battler != nil
- return
- end
- # 如果各画面的调用标志已经被设置
- if $game_temp.battle_calling or
- $game_temp.shop_calling or
- $game_temp.name_calling or
- $game_temp.menu_calling or
- $game_temp.save_calling or
- $game_temp.gameover
- return
- end
- # 执行内容列表为空的情况下
- if @list == nil
- # 主地图事件的情况下
- if @main
- # 设置启动中的事件
- setup_starting_event
- end
- # 什么都没有设置的情况下
- if @list == nil
- return
- end
- end
- # 尝试执行事件列表、返回值为 false 的情况下
- if execute_command == false
- return
- end
- # 推进索引
- @index += 1
- end
- end
- #--------------------------------------------------------------------------
- # ● 输入按钮
- #--------------------------------------------------------------------------
- def input_button
- # 判定按下的按钮
- n = 0
- for i in 1..18
- if Input.trigger?(i)
- n = i
- end
- end
- # 按下按钮的情况下
- if n > 0
- # 更改变量值
- $game_variables[@button_input_variable_id] = n
- $game_map.need_refresh = true
- # 输入按键结束
- @button_input_variable_id = 0
- end
- end
- #--------------------------------------------------------------------------
- # ● 设置选择项
- #--------------------------------------------------------------------------
- def setup_choices(parameters)
- # choice_max 为设置选择项的项目数
- $game_temp.choice_max = parameters[0].size
- # message_text 为设置选择项
- for text in parameters[0]
- $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
- #--------------------------------------------------------------------------
- # ● 角色用 itereta (考虑全体同伴)
- # parameter : 1 以上为 ID、0 为全体
- #--------------------------------------------------------------------------
- def iterate_actor(parameter)
- # 全体同伴的情况下
- if parameter == 0
- # 同伴全体循环
- for actor in $game_party.actors
- # 评价块
- yield actor
- end
- # 单体角色的情况下
- else
- # 获取角色
- actor = $game_actors[parameter]
- # 获取角色
- yield actor if actor != nil
- end
- end
- #--------------------------------------------------------------------------
- # ● 敌人用 itereta (考虑队伍全体)
- # parameter : 0 为索引、-1 为全体
- #--------------------------------------------------------------------------
- def iterate_enemy(parameter)
- # 队伍全体的情况下
- if parameter == -1
- # 队伍全体循环
- for enemy in $game_troop.enemies
- # 评价块
- yield enemy
- end
- # 敌人单体的情况下
- else
- # 获取敌人
- enemy = $game_troop.enemies[parameter]
- # 评价块
- yield enemy if enemy != nil
- end
- end
- #--------------------------------------------------------------------------
- # ● 战斗者用 itereta (要考虑全体队伍、全体同伴)
- # parameter1 : 0 为敌人、1 为角色
- # parameter2 : 0 以上为索引、-1 为全体
- #--------------------------------------------------------------------------
- def iterate_battler(parameter1, parameter2)
- # 敌人的情况下
- if parameter1 == 0
- # 调用敌人的 itereta
- iterate_enemy(parameter2) do |enemy|
- yield enemy
- end
- # 角色的情况下
- else
- # 全体同伴的情况下
- if parameter2 == -1
- # 同伴全体循环
- for actor in $game_party.actors
- # 评价块
- yield actor
- end
- # 角色单体 (N 个人) 的情况下
- else
- # 获取角色
- actor = $game_party.actors[parameter2]
- # 评价块
- yield actor if actor != nil
- end
- end
- end
- end
Scene_Map:
复制代码
- #==============================================================================
- # ■ Scene_Map
- #------------------------------------------------------------------------------
- # 处理地图画面的类。
- #==============================================================================
- class Scene_Map
- attr_accessor :money
- attr_accessor :fever
- #--------------------------------------------------------------------------
- # ● 主处理
- #--------------------------------------------------------------------------
- def main
- # 生成活动块
- @spriteset = Spriteset_Map.new
- # 生成信息窗口
- @message_window = Window_Message.new
- @money_window= Window_Gold.new
- @money_window.x=420
- @money_window.y=40
- @money_window.z=51
- @money_window.visible=false
- # 执行过渡
- Graphics.transition
- # 主循环
- loop do
- # 刷新游戏画面
- Graphics.update
- # 刷新输入信息
- Input.update
- # 刷新画面
- update
- # 如果画面切换的话就中断循环
- if $scene != self
- break
- end
- end
- # 准备过渡
- Graphics.freeze
- # 释放活动块
- @spriteset.dispose
- # 释放信息窗口
- @message_window.dispose
- @money_window.dispose
- # 标题画面切换中的情况下
- if $scene.is_a?(Scene_Title)
- # 淡入淡出画面
- Graphics.transition
- Graphics.freeze
- end
- end
- #--------------------------------------------------------------------------
- # ● 刷新画面
- #--------------------------------------------------------------------------
- def update
- # 循环
- loop do
- # 按照地图、实例、主角的顺序刷新
- # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
- # 的机会的重要因素)
- $game_map.update
- $game_system.map_interpreter.update
- $game_player.update
- # 系统 (计时器)、画面刷新
- $game_system.update
- $game_screen.update
- # 如果主角在场所移动中就中断循环
- unless $game_temp.player_transferring
- break
- end
- # 执行场所移动
- transfer_player
- # 处理过渡中的情况下、中断循环
- if $game_temp.transition_processing
- break
- end
- end
- # 刷新活动块
- @spriteset.update
- # 刷新信息窗口
- @message_window.update
- if @money==1
- @money_window.visible=true
- @money_window.update
- @money_window.refresh
- else
- @money_window.visible=false
- end
- #——开头读取梦境的时候按下任意键返回Title
- if $from_dream_to_title==true
- if Input.trigger?(Input::B) or Input.trigger?(Input::A) or Input.trigger?(Input::C) or
- Input.trigger?(Input::X) or Input.trigger?(Input::Y) or Input.trigger?(Input::Z) or
- Input.trigger?(Input::LEFT) or Input.trigger?(Input::RIGHT) or Input.trigger?(Input::UP) or Input.trigger?(Input::DOWN)
- $scene = Scene_Title.new
- end
- end
- #——选择Title内容的时候
- if $title_selecting == true
- update_star_rain
- case $title_selected
- when 1
- c3_title_cmd1
- $title_selected = 0
- when 2
- c3_title_cmd2
- $title_selected = 0
- when 3
- c3_title_cmd3
- $title_selected = 0
- when 4
- c3_title_cmd4
- $title_selected = 0
- when 5
- c3_title_cmd5
- $title_selected = 0
- else
- end
- end
- # 游戏结束的情况下
- if $game_temp.gameover
- # 切换的游戏结束画面
- $scene = Scene_Gameover.new
- return
- end
- # 返回标题画面的情况下
- if $game_temp.to_title
- # 切换到标题画面
- $scene = Scene_Title.new
- return
- end
- # 处理过渡中的情况下
- if $game_temp.transition_processing
- # 清除过渡处理中标志
- $game_temp.transition_processing = false
- # 执行过渡
- if $game_temp.transition_name == ""
- Graphics.transition(20)
- else
- if $game_switches[52] # 加速切换
- Graphics.transition(20, "Graphics/Transitions/" +
- $game_temp.transition_name)
- else
- Graphics.transition(40, "Graphics/Transitions/" +
- $game_temp.transition_name)
- end
- end
- end
- # 显示信息窗口中的情况下
- if $game_temp.message_window_showing
- return
- end
- # 遇敌计数为 0 且、且遇敌列表不为空的情况下
- if $game_player.encounter_count == 0 and $game_map.encounter_list != []
- # 不是在事件执行中或者禁止遇敌中
- unless $game_system.map_interpreter.running? or
- $game_system.encounter_disabled
- # 确定队伍
- n = rand($game_map.encounter_list.size)
- troop_id = $game_map.encounter_list[n]
- # 队伍有效的话
- if $data_troops[troop_id] != nil
- # 设置调用战斗标志
- $game_temp.battle_calling = true
- $game_temp.battle_troop_id = troop_id
- $game_temp.battle_can_escape = true
- $game_temp.battle_can_lose = false
- $game_temp.battle_proc = nil
- end
- end
- end
- # 按下 B 键的情况下
- if Input.trigger?(Input::B)
- # 不是在事件执行中或菜单禁止中
- unless $game_system.map_interpreter.running? or
- $game_system.menu_disabled or $game_map.map_id == 298
- # 设置菜单调用标志以及 SE 演奏
- $game_switches[54]=true
- end
- end
- # 调试模式为 ON 并且按下 F9 键的情况下
- if $DEBUG and Input.press?(Input::F9)
- # 设置调用调试标志
- $game_temp.debug_calling = true
- end
- # 不在主角移动中的情况下
- unless $game_player.moving?
- # 执行各种画面的调用
- if $game_temp.battle_calling
- call_battle
- elsif $game_temp.shop_calling
- call_shop
- elsif $game_temp.name_calling
- call_name
- elsif $game_temp.menu_calling
- call_menu
- elsif $game_temp.save_calling
- call_save
- elsif $game_temp.debug_calling
- call_debug
- end
- end
- #————有关自动存档功能
- if Input.trigger?(Input::F5) and $game_party.actors != nil
- for actor in $game_party.actors
- if actor.armor2_id==145 or actor.armor3_id==145 or actor.armor4_id==145
- unless $game_system.map_interpreter.running?
- if $game_system.save_disabled
- Audio.se_play("Audio/Se/003-System03")
- else
- Audio.se_play("Audio/SE/007-System07")
- carol3_save
- end
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 调用战斗
- #--------------------------------------------------------------------------
- def call_battle
- # 清除战斗调用标志
- $game_temp.battle_calling = false
- # 清除菜单调用标志
- $game_temp.menu_calling = false
- $game_temp.menu_beep = false
- # 生成遇敌计数
- $game_player.make_encounter_count
- if $map_bgm_in_battle == 0
- $game_temp.map_bgm = $game_system.playing_bgm
- $game_system.bgm_stop
- end
- $game_system.se_play($data_system.battle_start_se)
- if $map_bgm_in_battle == 0
- $game_system.bgm_play($game_system.battle_bgm)
- end
- $game_player.straighten
- # 切换到战斗画面
- $scene = Scene_Battle.new
- end
- #--------------------------------------------------------------------------
- # ● 调用商店
- #--------------------------------------------------------------------------
- def call_shop
- # 清除商店调用标志
- $game_temp.shop_calling = false
- # 矫正主角姿势
- $game_player.straighten
- # 切换到商店画面
- $scene = Scene_Shop.new
- end
- #--------------------------------------------------------------------------
- # ● 调用名称输入
- #--------------------------------------------------------------------------
- def call_name
- # 清除商店调用名称输入标志
- $game_temp.name_calling = false
- # 矫正主角姿势
- $game_player.straighten
- # 切换到名称输入画面
- $scene = Scene_Name.new
- end
- #--------------------------------------------------------------------------
- # ● 调用菜单
- #--------------------------------------------------------------------------
- def call_menu
- # 清除商店调用菜单标志
- $game_temp.menu_calling = false
- # 已经设置了菜单 SE 演奏标志的情况下
- if $game_temp.menu_beep
- # 演奏确定 SE
- $game_system.se_play($data_system.decision_se)
- # 清除菜单演奏 SE 标志
- $game_temp.menu_beep = false
- end
- # 矫正主角姿势
- $game_player.straighten
- # 切换到菜单画面
- $scene = Scene_Menu.new
- end
- #--------------------------------------------------------------------------
- # ● 调用存档
- #--------------------------------------------------------------------------
- def call_save
- # 矫正主角姿势
- $game_player.straighten
- # 切换到存档画面
- $scene = Scene_Save.new
- end
- def call_MG
- $game_player.straighten
- $scene = Scene_Magic.new
- $game_temp.mgbuy_calling = false
- end
- #--------------------------------------------------------------------------
- # ● 调用调试
- #--------------------------------------------------------------------------
- def call_debug
- # 清除商店调用调试标志
- $game_temp.debug_calling = false
- # 演奏确定 SE
- $game_system.se_play($data_system.decision_se)
- # 矫正主角姿势
- $game_player.straighten
- # 切换到调试画面
- $scene = Scene_Debug.new
- end
- #--------------------------------------------------------------------------
- # ● 主角的场所移动
- #--------------------------------------------------------------------------
- def transfer_player
- # 清除主角场所移动调试标志
- $game_temp.player_transferring = false
- # 移动目标与现在的地图有差异的情况下
- if $game_map.map_id != $game_temp.player_new_map_id
- # 设置新地图
- $game_map.setup($game_temp.player_new_map_id)
- end
- # 设置主角位置
- $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
- #——看看是否需要自动存盘
- if $game_variables[545] == 0 and $game_party.actors != nil
- for actor in $game_party.actors
- if actor.armor2_id==145 or actor.armor3_id==145 or actor.armor4_id==145
- if $game_system.save_disabled
- else
- carol3_save
- end
- end
- end
- end
- # 设置主角朝向
- case $game_temp.player_new_direction
- when 2 # 下
- $game_player.turn_down
- when 4 # 左
- $game_player.turn_left
- when 6 # 右
- $game_player.turn_right
- when 8 # 上
- $game_player.turn_up
- end
- # 矫正主角姿势
- $game_player.straighten
- # 刷新地图 (执行并行事件)
- $game_map.update
- # 在生成活动块
- @spriteset.dispose
- @spriteset = Spriteset_Map.new
- # 处理过渡中的情况下
- if $game_temp.transition_processing
- # 清除过渡处理中标志
- $game_temp.transition_processing = false
- # 执行过渡
- Graphics.transition(20)
- end
- # 执行地图设置的 BGM、BGS 的自动切换
- $game_map.autoplay
- # 设置画面
- Graphics.frame_reset
- # 刷新输入信息
- Input.update
- end
- end
以下引用qiuyulun于2008-6-14 1:20:27的发言:
你有载入菜单吗
以下引用dbshy于2008-6-14 19:18:56的发言:
LZ把工程传上来
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |