전투

배틀샵 스크립트

by 백호 posted Feb 22, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
#이 스크립트를 사용하기전에 [Scene_Debug] 아래에 삽입버튼을 눌러 이름을
#아무렇게나 정한후
#$game_special_elements = {}
#$imported = {}
#$data_states = load_data("Data/States.rxdata")
#$data_system = load_data("Data/System.rxdata")
#이 스크립트를 넣어주세요 (앞에 #는 삭제)


#번역:버밀
#스크립트 에디터 -> 맨 아래의 메인을 우클릭 -> 삽입버튼 클릭 -> 이름을 보관소
#로 한후 이 스크립트를 붙여넣기 한다

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/  ◆변수 숍- KGC_VariableShop
#_/----------------------------------------------------------------------------
#_/ 변수로 아이템의 구입을 하는 특수한 가게를 작성합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

# 도입 이 끝난 상태 플래그를 온
$imported["VariableShop"] = true

#==============================================================================
# ★ 커스터마이즈(customize) 항목 ★
#==============================================================================

# 변수 숍에 사용하는 변수 ID
#  게임중에도 변경 가능
$vs_id = 10

# 판매 가격 설정 비율(판매 가격표시가 [데이타베이스의 가격]‰ 이 된다)
#  게임중에도 변경 가능
$vs_rate = 10

# 가격의 단위 설정
#  변수 ID를 첨자로 한 배열을 작성
$vs_domination = []
$vs_domination[10] = "배틀포인트"  # 변수 ID10:배틀 포인트

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

#==============================================================================
# ■ Module_RPG
#------------------------------------------------------------------------------
#  RPG 모듈재정의
#==============================================================================

module RPG
  class Item
    #------------------------------------------------------------------------
    # ● 특수 가격
    #------------------------------------------------------------------------
    def price2
      n = @price * $vs_rate / 100 # 이 3개의 숫자 부분에서 배틀포인트 비율을 정하는거죠
    end
  end
  class Weapon
    def price2
      n = @price * $vs_rate / 100 # 10으로 하면 아이템의 원가이고 0이 늘어나면 점점 가격
    end
  end
  class Armor
    def price2
      n = @price * $vs_rate / 100 # 하락... 1로 하면 가격이 급상승 대충 이해하세요 -_-;
    end
  end
end

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

#==============================================================================
# ■ Window_Variable
#------------------------------------------------------------------------------
#  변수를 표시하는 윈도우입니다.
#==============================================================================

class Window_Variable < Window_Gold
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    cx = contents.text_size($vs_domination[$vs_id]).width
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120-cx-2, 32, $game_variables[$vs_id].to_s, 2)
    self.contents.font.color = system_color
    self.contents.draw_text(124-cx, 0, cx, 32, $vs_domination[$vs_id], 2)
  end
end

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

#==============================================================================
# ■ Window_VariableShopCommand
#------------------------------------------------------------------------------
#  변수 숍 화면에서 , 용건을 선택하는 윈도우입니다.
#==============================================================================

class Window_VariableShopCommand < Window_ShopCommand
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  alias initialize_KGC_VariableShop initialize
  def initialize
    # 원래의 처리를 실행
    initialize_KGC_VariableShop

    @item_max = 2
    @commands = ["구입한다", "그만둔다"]
    refresh
    self.index = 0
  end
end

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

#==============================================================================
# ■ Window_VariableShopBuy
#------------------------------------------------------------------------------
#  변수 숍 화면에서 , 구입할 수 있는 상품의 일람을 표시하는 윈도우입니다.
#==============================================================================

class Window_VariableShopBuy < Window_ShopBuy
  #--------------------------------------------------------------------------
  # ● 항목의 묘화
  #    index : 항목 번호
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    # 아이템의 소지수를 취득
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    # 가격이 변수의 값 이하 , 한편 소지수가 99 가 아니면 통상 문자색에 ,
    # 그렇지 않으면 무효 문자색으로 설정
    if item.price2 <= $game_variables[$vs_id] && number < 99
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4
    y = index * 32
    rect = Rect.new(x, y, self.width - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 88, 32, item.price2.to_s, 2)
  end
end

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

#==============================================================================
# ■ Window_VariableShopNumber
#------------------------------------------------------------------------------
#  변수 숍 화면에서 , 구입하는 아이템의 개수를 입력하는 윈도우입니다.
#==============================================================================

class Window_VariableShopNumber < Window_ShopNumber
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_item_name(@item, 4, 96)
    self.contents.font.color = normal_color
    self.contents.draw_text(272, 96, 32, 32, "×")
    self.contents.draw_text(308, 96, 24, 32, @number.to_s, 2)
    self.cursor_rect.set(304, 96, 32, 32)
    # 합계 가격과 단위를 묘화
    domination = $vs_domination[$vs_id]
    cx = contents.text_size(domination).width
    total_price = @price * @number
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 160, 328-cx-2, 32, total_price.to_s, 2)
    self.contents.font.color = system_color
    self.contents.draw_text(332-cx, 160, cx, 32, domination, 2)
  end
end

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

#==============================================================================
# ■ Scene_Shop
#------------------------------------------------------------------------------
#  숍 화면의 처리를 실시하는 클래스입니다.
#==============================================================================

class Scene_Shop
  #--------------------------------------------------------------------------
  # ● 메인 처리
  #--------------------------------------------------------------------------
  alias main_KGC_VariableShop main
  def main
    # 변수 숍을 호출했을 경우
    if $call_vs && $game_variables[$vs_id] != nil
      # 변수 숍 화면에 이행
      $scene = Scene_VariableShop.new
      $call_vs = false
      return
    end

    # 원래의 처리를 실행
    main_KGC_VariableShop
  end
end

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

#==============================================================================
# ■ Scene_VariableShop
#------------------------------------------------------------------------------
#  변수 숍 화면의 처리를 실시하는 클래스입니다.
#==============================================================================

class Scene_VariableShop < Scene_Shop
  #--------------------------------------------------------------------------
  # ● 메인 처리
  #--------------------------------------------------------------------------
  def main
    # 스프라이트 세트를 작성
    @spriteset = Spriteset_Map.new
    # 헬프 윈도우를 작성
    if $imported["HelpExtension"]
      @help_window = Window_HelpExtension.new
    else
      @help_window = Window_Help.new
    end
    @help_window.back_opacity = 160
    # 커멘드 윈도우를 작성
    @command_window = Window_VariableShopCommand.new
    @command_window.back_opacity = 160
    # 변수 윈도우를 작성
    @variable_window = Window_Variable.new
    @variable_window.back_opacity = 160
    @variable_window.x = 480
    @variable_window.y = $imported["HelpExtension"] ? 128 : 64
    # 더미 윈도우를 작성
    if $imported["HelpExtension"]
      @dummy_window = Window_Base.new(0, 192, 640, 288)
    else
      @dummy_window = Window_Base.new(0, 128, 640, 352)
    end
    @dummy_window.back_opacity = 160
    # 구입 윈도우를 작성
    @buy_window = Window_VariableShopBuy.new($game_temp.shop_goods)
    @buy_window.back_opacity = 160
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
    # 個?入力ウィンドウを作成
    @number_window = Window_VariableShopNumber.new
    @number_window.back_opacity = 160
    @number_window.active = false
    @number_window.visible = false
    # ステ?タスウィンドウを作成
    @status_window = Window_ShopStatus.new
    @status_window.back_opacity = 160
    @status_window.visible = false
    # トランジション?行
    Graphics.transition
    # メインル?プ
    loop do
      # ゲ?ム?面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレ?ム更新
      update
      # ?面が切り替わったらル?プを中?
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @spriteset.dispose
    @help_window.dispose
    @command_window.dispose
    @variable_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @number_window.dispose
    @status_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレ?ム更新
  #--------------------------------------------------------------------------
  def update
    # ウィンドウを更新
    @help_window.update
    @command_window.update
    @variable_window.update
    @dummy_window.update
    @buy_window.update
    @number_window.update
    @status_window.update
    # コマンドウィンドウがアクティブの場合: update_command を呼ぶ
    if @command_window.active
      update_command
      return
    end
    # 購入ウィンドウがアクティブの場合: update_buy を呼ぶ
    if @buy_window.active
      update_buy
      return
    end
    # 個?入力ウィンドウがアクティブの場合: update_number を呼ぶ
    if @number_window.active
      update_number
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレ?ム更新 (コマンドウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_command
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # マップ?面に切り替え
      $scene = Scene_Map.new
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # コマンドウィンドウのカ?ソル位置で分岐
      case @command_window.index
      when 0  # 購入する
        # 決定 SE を演奏
        $game_system.se_play($data_system.decision_se)
        # ウィンドウの?態を購入モ?ドへ
        @command_window.active = false
        @dummy_window.visible = false
        @buy_window.active = true
        @buy_window.visible = true
        @buy_window.refresh
        @status_window.visible = true
      when 1  # やめる
        # 決定 SE を演奏
        $game_system.se_play($data_system.decision_se)
        # マップ?面に切り替え
        $scene = Scene_Map.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレ?ム更新 (購入ウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_buy
    # ステ?タスウィンドウのアイテムを設定
    @status_window.item = @buy_window.item
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # ウィンドウの?態を初期モ?ドへ
      @command_window.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      # ヘルプテキストを消去
      @help_window.set_text("")
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # アイテムを取得
      @item = @buy_window.item
      # アイテムが無?の場合、または?格が所持金より上の場合
      if @item == nil || @item.price2 > $game_variables[$vs_id]
        # ブザ? SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # アイテムの所持?を取得
      case @item
      when RPG::Item
        number = $game_party.item_number(@item.id)
      when RPG::Weapon
        number = $game_party.weapon_number(@item.id)
      when RPG::Armor
        number = $game_party.armor_number(@item.id)
      end
      # すでに 99 個所持している場合
      if number == 99
        # ブザ? SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      # 最大購入可能個?を計算
      max = @item.price2 == 0 ? 99 : $game_variables[$vs_id] / @item.price2
      max = [max, 99 - number].min
      # ウィンドウの?態を個?入力モ?ドへ
      @buy_window.active = false
      @buy_window.visible = false
      @number_window.set(@item, max, @item.price2)
      @number_window.active = true
      @number_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # ● フレ?ム更新 (個?入力ウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_number
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # 個?入力ウィンドウを非アクティブ?不可視に設定
      @number_window.active = false
      @number_window.visible = false
      # ウィンドウの?態を購入モ?ドへ
      @buy_window.active = true
      @buy_window.visible = true
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # ショップ SE を演奏
      $game_system.se_play($data_system.shop_se)
      # 個?入力ウィンドウを非アクティブ?不可視に設定
      @number_window.active = false
      @number_window.visible = false
      # 購入?理
      $game_variables[$vs_id] -= @number_window.number * @item.price2
      case @item
      when RPG::Item
        $game_party.gain_item(@item.id, @number_window.number)
      when RPG::Weapon
        $game_party.gain_weapon(@item.id, @number_window.number)
      when RPG::Armor
        $game_party.gain_armor(@item.id, @number_window.number)
      end
      # 各ウィンドウをリフレッシュ
      @variable_window.refresh
      @buy_window.refresh
      @status_window.refresh
      # ウィンドウの?態を購入モ?ドへ
      @buy_window.active = true
      @buy_window.visible = true
      return
    end
  end
end