기타

[KGC]강화스크립트

by 백호 posted Feb 21, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
이벤트 커멘드 「조건 분기」에서 4개째의 방어용 기구가 인식되지 않는XP자체의 버그를 수정.
이벤트 커멘드 「스크립트」로 , 1행째에 false 가 돌아가는 스크립트를 기술하면(자) 다운 당하는XP자체의 버그를 수정.
배틀 이벤트로 「문장 표시」 「애니메이션 표시」를 실시하면 이상하게 무거워지는XP자체의 버그를 수정.
전투중에 엑터를 제외해 , 재차 더하면(자) 버틀러 그래픽이 사라지는XP자체의 버그를 수정.
전투 개시 트란지션 변경 기능을 추가.
전투 배경 전체화 기능을 추가.
전투시의 스테이터스 윈도우 투과 기능을 추가.


※ Main 바로 위에 삽입해주세요.
=======================================================================



#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆기본 설정 강화 - KGC_Base Reinforce◆
#_/----------------------------------------------------------------------------
#_/  RPGXP의 기본 기능을 미묘하게 강화합니다. (버그 수정도 있어)
#_/  Reinforces some basic functions of "RPG Maker XP".
#_/  (There are some bag fixes.)
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================
# ★ 커스터마이즈 항목 - Customize ★
#==============================================================================

module KGC
  # ◆전투 배경 전체화
  BR_BATTLEBACK_FULL = true
  # ◆메인 국면시에 윈도우 투과
  #  BR_BATTLEBACK_FULL 가 true 때 에 유효.
  BR_WINDOW_CLEAR_MAIN_PHASE = true
  # ◆메인 국면시에 윈도우 배경만 반투과
  #  BR_WINDOW_CLEAR_MAIN_PHASE 가 false 때 에 유효.
  BR_WINDOW_BACK_CLEAR_MAIN_PHASE = true

  # ◆전투 개시 트란지션(nil 으로 해제)
  BR_BATTLE_START_TRANSITION = "016-Diamond02"
end

#### BR_BATTLEBACK_FULL
### Makes battleback full screen.

#### BR_WINDOW_CLEAR_MAIN_PHASE
### Makes windows transparency at the Main-Phase in battle.
# When BR_BATTLEBACK_FULL is true, this is effective.

#### BR_BATTLE_START_TRANSITION
### Transition of battle beginning. (nil : release)

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

$imported = {} if $imported == nil
$imported["Base Reinforce"] = true

#==============================================================================
# ■ RPG::Sprite
#==============================================================================

class RPG::Sprite
  def animation_set_sprites(sprites, cell_data, position)
    for i in 0..15
      sprite = sprites[i]
      pattern = cell_data[i, 0]
      if sprite == nil || pattern == nil || pattern == -1
        sprite.visible = false if sprite != nil
        next
      end
      sprite.visible = true
      sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
      if position == 3
        if self.viewport != nil
          sprite.x = self.viewport.rect.width / 2
          sprite.y = self.viewport.rect.height / 2
        else
          sprite.x, sprite.y = 320, 240
        end
      else
        sprite.x = self.x - self.ox + self.src_rect.width / 2
        sprite.y = self.y - self.oy + self.src_rect.height / 2
        sprite.y -= self.src_rect.height / 4 if position == 0
        sprite.y += self.src_rect.height / 4 if position == 2
      end
      sprite.x += cell_data[i, 1]
      sprite.y += cell_data[i, 2]
      sprite.z = 2000
      sprite.ox = sprite.oy = 96
      sprite.zoom_x = cell_data[i, 3] / 100.0
      sprite.zoom_y = cell_data[i, 3] / 100.0
      sprite.angle = cell_data[i, 4]
      sprite.mirror = (cell_data[i, 5] == 1)
      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
      sprite.blend_type = cell_data[i, 7]
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Sprite_Battler
#==============================================================================

class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  alias update_KGC_Base_Reinforce update
  def update
    # 버틀러가 nil 의 경우
    if @battler == nil
      @battler_name = nil
      @battler_hue = nil
    end

    update_KGC_Base_Reinforce
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Spriteset_Battle
#==============================================================================

if KGC::BR_BATTLEBACK_FULL
class Spriteset_Battle
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  alias update_KGC_Base_Reinforce update
  def update
    # 원의 처리를 실행
    update_KGC_Base_Reinforce

    @viewport1.rect.height = 480
    # 배틀 백이 변경되었을 경우
    if @battleback_name2 != $game_temp.battleback_name
      # 전체화
      @battleback_name2 = $game_temp.battleback_name
      mag_x = 640.0 / @battleback_sprite.bitmap.width
      mag_y = 480.0 / @battleback_sprite.bitmap.height
      @battleback_sprite.zoom_x = mag_x
      @battleback_sprite.zoom_y = mag_y
    end
  end
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_BattleStatus
#==============================================================================

class Window_BattleStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    super
    # 메인 국면 때는 불투명도를 약간 내리는(하는 김에 윈도우 소거)
    if $game_temp.battle_main_phase
      self.contents_opacity -= 2 if self.contents_opacity > 224
      if self.opacity > 0 && KGC::BR_BATTLEBACK_FULL && KGC::BR_WINDOW_CLEAR_MAIN_PHASE
        self.opacity -= 16
      end
      if self.back_opacity > 128 && KGC::BR_BATTLEBACK_FULL && KGC::BR_WINDOW_BACK_CLEAR_MAIN_PHASE
        self.back_opacity -= 8
      end
    else
      self.contents_opacity += 2 if self.contents_opacity < 255
      if self.opacity < 255 && KGC::BR_BATTLEBACK_FULL && KGC::BR_WINDOW_CLEAR_MAIN_PHASE
        self.opacity += 16
      end
      if self.back_opacity < 255 && KGC::BR_BATTLEBACK_FULL && KGC::BR_WINDOW_BACK_CLEAR_MAIN_PHASE
        self.back_opacity += 8
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 이름의 묘화
  #--------------------------------------------------------------------------
  def draw_actor_name(actor, x, y)
    self.contents.font.color = normal_color
    self.contents.draw_shadow_text(x, y, 120, 32, actor.name)
  end
  #--------------------------------------------------------------------------
  # ● 스테이트의 묘화
  #--------------------------------------------------------------------------
  def draw_actor_state(actor, x, y, width = 120)
    text = make_battler_state_text(actor, width, true)
    self.contents.font.color = actor.dead? ? knockout_color : normal_color
    self.contents.draw_shadow_text(x, y, width, 32, text)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

class Interpreter
#==============================================================================
# ■□■□■ Interpreter 3 ■□■□■
#==============================================================================
  #--------------------------------------------------------------------------
  # ● 조건 분기
  #--------------------------------------------------------------------------
  def command_111
    # 로컬 변수 result 를 초기화
    result = false
    # 조건 판정
    case @parameters[0]
    when 0  # 스윗치
      result = ($game_switches[@parameters[1]] == (@parameters[2] == 0))
    when 1  # 변수
      value1 = $game_variables[@parameters[1]]
      if @parameters[2] == 0
        value2 = @parameters[3]
      else
        value2 = $game_variables[@parameters[3]]
      end
      case @parameters[4]
      when 0  # 와 동치
        result = (value1 == value2)
      when 1  # 이상
        result = (value1 >= value2)
      when 2  # 이하
        result = (value1 <= value2)
      when 3  # 초
        result = (value1 > value2)
      when 4  # 미만
        result = (value1 < value2)
      when 5  # 이외
        result = (value1 != value2)
      end
    when 2  # 셀프 스윗치
      if @event_id > 0
        key = [$game_map.map_id, @event_id, @parameters[1]]
        if @parameters[2] == 0
          result = ($game_self_switches[key] == true)
        else
          result = ($game_self_switches[key] != true)
        end
      end
    when 3  # 타이머
      if $game_system.timer_working
        sec = $game_system.timer / Graphics.frame_rate
        if @parameters[2] == 0
          result = (sec >= @parameters[1])
        else
          result = (sec <= @parameters[1])
        end
      end
    when 4  # 엑터
      actor = $game_actors[@parameters[1]]
      if actor != nil
        case @parameters[2]
        when 0  # 파티에 있는
          result = ($game_party.actors.include?(actor))
        when 1  # 이름
          result = (actor.name == @parameters[3])
        when 2  # 스킬
          result = (actor.skill_learn?(@parameters[3]))
        when 3  # 무기
          result = (actor.weapon_id == @parameters[3])
        when 4  # 방어용 기구
          result = (actor.armor1_id == @parameters[3] or
                    actor.armor2_id == @parameters[3] or
                    actor.armor3_id == @parameters[3] or
                    actor.armor4_id == @parameters[3])
        when 5  # 스테이트
          result = (actor.state?(@parameters[3]))
        end
      end
    when 5  # 에너미
      enemy = $game_troop.enemies[@parameters[1]]
      if enemy != nil
        case @parameters[2]
        when 0  # 출현하고 있는
          result = (enemy.exist?)
        when 1  # 스테이트
          result = (enemy.state?(@parameters[3]))
        end
      end
    when 6  # 캐릭터
      character = get_character(@parameters[1])
      if character != nil
        result = (character.direction == @parameters[2])
      end
    when 7  # 골드
      if @parameters[2] == 0
        result = ($game_party.gold >= @parameters[1])
      else
        result = ($game_party.gold <= @parameters[1])
      end
    when 8  # 아이템
      result = ($game_party.item_number(@parameters[1]) > 0)
    when 9  # 무기
      result = ($game_party.weapon_number(@parameters[1]) > 0)
    when 10  # 방어용 기구
      result = ($game_party.armor_number(@parameters[1]) > 0)
    when 11  # 버튼
      result = (Input.press?(@parameters[1]))
    when 12  # 스크립트
      result = eval(@parameters[1])
    end
    # 판정 결과를 해시에 격납
    @branch[@list[@index].indent] = result
    # 판정 결과가 진이었던 경우
    if @branch[@list[@index].indent] == true
      # 분기 데이터를 삭제
      @branch.delete(@list[@index].indent)
      # 계속
      return true
    end
    # 조건에 해당하지 않는 경우 : 커멘드 스킵
    return command_skip
  end
#==============================================================================
# ■□■□■ Interpreter 7 ■□■□■
#==============================================================================
  #--------------------------------------------------------------------------
  # ● 스크립트
  #--------------------------------------------------------------------------
  def command_355
    # script 에 1 행목을 설정
    script = @list[@index].parameters[0] + "n"
    # 루프
    loop {
      # 다음의 이벤트 커멘드가 스크립트 2 행 눈 이후의 경우
      if @list[@index+1].code == 655
        # script 에 2 행목 이후를 추가
        script += @list[@index+1].parameters[0] + "n"
      # 이벤트 커멘드가 스크립트 2 행 눈 이후가 아닌 경우
      else
        # 루프 중단
        break
      end
      # 인덱스를 진행시키는
      @index += 1
    }
    # 평가
    result = eval(script)
    # 계속
    return true
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

class Scene_Battle
#==============================================================================
# ■□■□■ Scene_Battle 1 ■□■□■
#==============================================================================
  #--------------------------------------------------------------------------
  # ● 메인 처리
  #--------------------------------------------------------------------------
  def main
    # 트란지션 실행
    if KGC::BR_BATTLE_START_TRANSITION != nil
      Graphics.transition(40, "Graphics/Transitions/" + KGC::BR_BATTLE_START_TRANSITION)
    end
    # 트란지션 준비
    Graphics.freeze
    # 전투용의 각종 일시 데이터를 초기화
    $game_temp.in_battle = true
    $game_temp.battle_turn = 0
    $game_temp.battle_event_flags.clear
    $game_temp.battle_abort = false
    $game_temp.battle_main_phase = false
    $game_temp.battleback_name = $game_map.battleback_name
    $game_temp.forcing_battler = nil
    # 배틀 이벤트용 interpreter를 초기화
    $game_system.battle_interpreter.setup(nil, 0)
    # 무리를 준비
    @troop_id = $game_temp.battle_troop_id
    $game_troop.setup(@troop_id)
    # 엑터 커멘드 윈도우를 작성
    s1 = $data_system.words.attack
    s2 = $data_system.words.skill
    s3 = $data_system.words.guard
    s4 = $data_system.words.item
    @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
    @actor_command_window.y = 160
    @actor_command_window.back_opacity = 160
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # 그 외의 윈도우를 작성
    @party_command_window = Window_PartyCommand.new
    @help_window = Window_Help.new
    @help_window.back_opacity = 160
    @help_window.visible = false
    @status_window = Window_BattleStatus.new
    @message_window = Window_Message.new
    # 스프라이트 세트를 작성
    @spriteset = Spriteset_Battle.new
    # 웨이트 카운트를 초기화
    @wait_count = 0
    # 트란지션 실행
    if $data_system.battle_transition == ""
      Graphics.transition(20)
    else
      Graphics.transition(40, "Graphics/Transitions/" +
        $data_system.battle_transition)
    end
    # 프레바트르페즈 개시
    start_phase1
    # 메인 루프
    loop do
      # 게임 화면을 갱신
      Graphics.update
      # 입력 정보를 갱신
      Input.update
      # 프레임 갱신
      update
      # 화면이 바뀌면(자) 루프를 중단
      if $scene != self
        break
      end
    end
    # 맵을 리프레쉬
    $game_map.refresh
    # 트란지션 준비
    Graphics.freeze
    # 윈도우를 해방
    @actor_command_window.dispose if @actor_command_window != nil
    @party_command_window.dispose
    @help_window.dispose
    @status_window.dispose
    @message_window.dispose
    @skill_window.dispose if @skill_window != nil
    @item_window.dispose if @item_window != nil
    @result_window.dispose if @result_window != nil
    # 스프라이트 세트를 해방
    @spriteset.dispose
    # 타이틀 화면으로 전환하고 안의 경우
    if $scene.is_a?(Scene_Title)
      # 화면을 페이드아웃
      Graphics.transition
      Graphics.freeze
    end
    # 전투 테스트로부터 게임 오버 화면 이외에 바꾸고 안의 경우
    if $BTEST && !$scene.is_a?(Scene_Gameover)
      $scene = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    # 배틀 이벤트 실행중의 경우
    if $game_system.battle_interpreter.running?
      @running = true
      # interpreter를 갱신
      $game_system.battle_interpreter.update
      # 액션을 강제당하고 있는 버틀러가 존재하지 않는 경우
      if $game_temp.forcing_battler == nil
        # 배틀 이벤트의 실행이 끝났을 경우
        unless $game_system.battle_interpreter.running?
          # 전투 계속의 경우 , 배틀 이벤트의 셋업을 재실행
          unless judge
            setup_battle_event
          end
        end
        # 애프터 배틀 국면이 아니고 , 메세지가 표시되어 있지 않은
        # 한편 애니메이션 표시중이 아닌 경우
        if @phase != 5 && !@message_window.visible && !@spriteset.effect?
          # 스테이터스 윈도우를 리프레쉬
          @status_window.refresh
        end
      end
    elsif @running
      # 스테이터스 윈도우를 리프레쉬
      @status_window.refresh
      @running = false
    end
    # 시스템 (타이머), 화면을 갱신
    $game_system.update
    $game_screen.update
    # 타이머가 0 가 되었을 경우
    if $game_system.timer_working and $game_system.timer == 0
      # 배틀 중단
      $game_temp.battle_abort = true
    end
    # 윈도우를 갱신
    @help_window.update
    @party_command_window.update
    @actor_command_window.update if @actor_command_window != nil
    @status_window.update
    @message_window.update
    # 스프라이트 세트를 갱신
    @spriteset.update
    # 트란지션 처리중의 경우
    if $game_temp.transition_processing
      # 트란지션 처리중 플래그를 클리어
      $game_temp.transition_processing = false
      # 트란지션 실행
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    # 메세지 윈도우 표시중의 경우
    if $game_temp.message_window_showing
      return
    end
    # 효과 표시중의 경우
    if @spriteset.effect?
      return
    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.battle_abort
      # 배틀 개시전의 것 BGM 에 되돌리는
      $game_system.bgm_play($game_temp.map_bgm)
      # 배틀 종료
      battle_end(1)
      return
    end
    # 웨이트중의 경우
    if @wait_count > 0
      # 웨이트 카운트를 줄이는
      @wait_count -= 1
      return
    end
    # 액션을 강제당하고 있는 버틀러가 존재하지 않고 ,
    # 한편 배틀 이벤트가 실행중의 경우
    if $game_temp.forcing_battler == nil and
      $game_system.battle_interpreter.running?
      return
    end
    # 국면에 의해 분기
    case @phase
    when 1  # 프레바트르페즈
      update_phase1
    when 2  # 파티 커멘드 국면
      update_phase2
    when 3  # 엑터 커멘드 국면
      update_phase3
    when 4  # 메인 국면
      update_phase4
    when 5  # 애프터 배틀 국면
      update_phase5
    end
  end
  #--------------------------------------------------------------------------
  # ● 배틀 종료
  #    result : 결과 (0:승리 1:도주 2:패배)
  #--------------------------------------------------------------------------
  alias battle_end_KGC_Base battle_end
  def battle_end(result)
    # 오토 스테이트를 갱신
    for actor in $game_party.actors
      for i in 1...($imported["EquipExtension"] ? actor.equip_type.size : 5)
        actor.update_auto_state(nil, $data_armors[
          $imported["EquipExtension"] ? actor.armor_id[i] :
          eval("actor.armor#{i}_id")])
      end
    end

    # 원의 처리를 실행
    battle_end_KGC_Base(result)
  end
end