밤/낮

by 늑대소년 posted Jun 25, 2005
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

>스크립트 없나요?
사용법 :

도입 후, 커스터마이즈 항목을 기호에 따라 변경해 주세요.

이벤트 커멘드 「스크립트」로
$game_system.daynight_change = (true|false)
그렇다고 하는 스크립트를 입력하면, 밤낮 변환을 제어할 수 있습니다.
(↑ true 또는 false (을)를 지정)
전투중만 밤낮 변환을 제어하는 경우는
$game_system.daynight_change_battle = (true|false)
(을)를 사용합니다.
다만, $game_system.daynight_change 하지만 false 의 경우는 전투중도 무효가 됩니다.

현재 상태는
x = now_daynight
그리고 취득할 수 있습니다. 이벤트의 조건 분기등에 사용하는 경우는
$game_variables[id] = now_daynight
(을)를 사용합니다.( id (은)는 변수 ID)
phase  내용  
0  주  
1  저녁  
2  야  
3  조  
(개조했을 경우는 변동)

x = now_daynight_name
그리고 현재 상태명(낮이나 밤등)을 취득할 수 있습니다.

여인숙의 처리등 때문에, 낮이나 밤에 수동으로 바꾸는 경우는
change_daynight(phase[, duration, pass_days])
(을)를 사용합니다.
phase (은)는 변경 후 상태(↑를 참조), duration (은)는 변경에 걸치는 시간(프레임)입니다.
(생략 하면 duration = 40 하지만 적용됩니다)
pass_days (은)는 상태 변화 후에 경과시키는 날짜를 입력합니다.
(생략 하면 날짜는 가산되지 않습니다)
이벤트등으로 날짜를 경과시키고 싶은 경우에도 사용할 수 있습니다.
<례> change_daynight(0, 0, 1) # 0 프레임으로 낮으로 이행해, 1일 경과시킨다
현재의 경과일수는
x = $game_system.daynight_pass_days
그리고 취득할 수 있습니다.(직접 고쳐 쓰는 일도 가능)

건조물의 내부에 들어갔을 때 등 , 일시적으로 통상시에 되돌리고 싶은 경우도 있습니다.
그 경우는
$game_system.daynight_change = false
$game_screen.daynight_default(0)
(을)를 실행하는 것으로, 통상의 색조에 되돌릴 수 있습니다.
반대로, 해당 장소에서 나올 때
$game_system.daynight_change = true
$game_screen.daynight_apply(0)
(을)를 실행하는 것으로, 이전 상태를 재현할 수 있습니다.
(0) 에는, 변환 시간을 프레임 단위로 지정합니다.
무리명에 [DN ...] (을)를 더하면, 적의 출현 조건을 설정할 수 있습니다.
... 에는, 그 무리를 출현시키는 상태( phase )(을)를 콤마 단락으로 입력합니다.
지정시, 수치의 전에 - (을)를 넣으면, 지정했다 phase (을)를 출현 조건으로부터 제외합니다.

「밤」마셔 출현시키는 경우:[DN 2]
「주·조」는 출현시키지 않는 경우:[DN -0,-3]
([DN-0,-3](이)나[DN -0, -3](와)과 같이, 공백을 들어갈 수 있어도 넣지 않아도 상관하지 않습니다)



#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/  ◆밤낮 변환 - KGC_DayNight◆
#_/----------------------------------------------------------------------------
#_/ 게임중에 밤낮의 개념을 작성합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

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

module KGC
  # ◆밤낮 변환 방식
  #  0:시 사이 경과 1:보수 2:현실 시간(미묘)
  DAYNIGHT_METHOD = 1

  # ◆이벤트중은 시간을 멈춘다
  #  「시간 경과」사용시만 유효
  DAYNIGHT_EVENT_STOP = true

  # ◆일자가 바뀌는 상태
  #  여기서 지정한 상태가 되었을 때, 날짜를 가산한다。
  # 초기 상태의 경우 0:낮 1:저녁 2:야 3:조
  # ※현실 시간의 경우, 현실과 같은 날짜는 되지 않기 때문에 주의.
  DAYNIGHT_PASS_PHASE = 3

  # ◆상태 변환시의 페이드 시간【단위:프레임】
  #  생략시도 이 값을 사용합니다.
  DAYNIGHT_DURATION = 40

  # ★☆이하의 3항목은 모두 같은 개수로 해 주세요☆★
  # 처리의 형편상, 최초를 낮으로 하면 베타

  # ◆밤낮의 명칭(별로 의미는 없다)
  DAYNIGHT_NAME = ["낮", "저녁", "야", "조"]

  # ◆밤낮의 색조(잘 모르는 경우는 이대로)
  DAYNIGHT_TONE = [Tone.new(0, 0, 0),
    Tone.new(-32, -96, -96),
    Tone.new(-128, -128, -32),
    Tone.new(-48, -48, -16)]

# ◆밤낮 변환 시간(다음 상태에 옮길 때까지의 기간)
# 변환 방식이 시간의 경우는 초수, 보수의 경우는 보수 그대로.
# 전투중은 변환 시간이 10배(1/10의 속도)
# 현실 시간의 경우, 다음 상태에 바꾸는 시각(24시간 방식)

  DAYNIGHT_TIME = [30, 10, 25, 10]

  # DAYNIGHT_TIME = [16, 20, 6, 10]
  # ↑현실 시간용의 샘플. 시험하는 경우는 코멘트를 해제
end

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

$imported["DayNight"] = true

#--------------------------------------------------------------------------
# ● 現在の状態
#--------------------------------------------------------------------------
def now_daynight
  # 現在の状態を返す
  return $game_system.daynight_phase
end
#--------------------------------------------------------------------------
# ● 状態名取得
#--------------------------------------------------------------------------
def now_daynight_name
  # 現在の状態名を返す
  return KGC::DAYNIGHT_NAME[now_daynight]
end
#--------------------------------------------------------------------------
# ● 昼夜手動切り替え
#     phase     : 切り替え後の状態INDEX
#     duration  : 切り替え時間(フレーム)  (省略時:DAYNIGHT_DURATION)
#     pass_days : 経過させる日数  (省略時:0)
#--------------------------------------------------------------------------
def change_daynight(phase, duration = KGC::DAYNIGHT_DURATION, pass_days = 0)
  # カウント初期化
  $game_system.daynight_count = 0
  # フェーズ更新
  $game_system.daynight_phase = phase
  # 手動切り替え有効
  $game_temp.manual_daynight_change = duration
  # 日数経過
  $game_system.daynight_pass_days += pass_days
end

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

#==============================================================================
# ■ Game_Temp
#==============================================================================

class Game_Temp
  attr_accessor :manual_daynight_change
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_DayNight initialize
  def initialize
    # 元の処理を実行
    initialize_KGC_DayNight

    @manual_daynight_change = false
  end
end

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

#==============================================================================
# ■ Game_System
#==============================================================================

class Game_System
  attr_accessor :daynight_change, :daynight_change_battle
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_DayNight initialize
  def initialize
    # 元の処理を実行
    initialize_KGC_DayNight

    @daynight_count, @daynight_phase, @daynight_pass_days = 0, 0, 0
    @daynight_change, @daynight_change_battle = true, true
  end
  #--------------------------------------------------------------------------
  # ● 昼夜判定用カウント取得
  #--------------------------------------------------------------------------
  def daynight_count
    @daynight_count = 0 if @daynight_count == nil
    return @daynight_count
  end
  #--------------------------------------------------------------------------
  # ● 昼夜判定用カウント設定
  #--------------------------------------------------------------------------
  def daynight_count=(n)
    @daynight_count = 0 if @daynight_count == nil
    @daynight_count = n
  end
  #--------------------------------------------------------------------------
  # ● 現在の状態取得
  #--------------------------------------------------------------------------
  def daynight_phase
    @daynight_phase = 0 if @daynight_phase == nil
    return @daynight_phase
  end
  #--------------------------------------------------------------------------
  # ● 現在の状態設定
  #--------------------------------------------------------------------------
  def daynight_phase=(n)
    @daynight_phase = 0 if @daynight_phase == nil
    @daynight_phase = n
  end
  #--------------------------------------------------------------------------
  # ● 経過日数取得
  #--------------------------------------------------------------------------
  def daynight_pass_days
    @daynight_pass_days = 0 if @daynight_pass_days == nil
    return @daynight_pass_days
  end
  #--------------------------------------------------------------------------
  # ● 経過日数設定
  #--------------------------------------------------------------------------
  def daynight_pass_days=(n)
    @daynight_pass_days = 0 if @daynight_pass_days == nil
    @daynight_pass_days = n
  end
end

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

#==============================================================================
# ■ Game_Screen
#==============================================================================

class Game_Screen
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_DayNight initialize
  def initialize
    # 元の処理を実行
    initialize_KGC_DayNight

    # とりあえず現在の状態に設定
    @tone = KGC::DAYNIGHT_TONE[$game_system.daynight_phase].clone
    # 移動判定用座標
    @x, @y = 0, 0
    # フレーム更新用カウント初期化
    @frame_count = Graphics.frame_count
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_KGC_DayNight update
  def update
    # 元の処理を実行
    update_KGC_DayNight

    # 昼夜切り替え判定
    if (!$game_temp.in_battle && $game_system.daynight_change) ||
        ($game_temp.in_battle && $game_system.daynight_change &&
        $game_system.daynight_change_battle)
      case KGC::DAYNIGHT_METHOD
      when 0  # 時間判定
        # カウント増加量計算
        inc_count = Graphics.frame_count - @frame_count
        # 加算量がおかしい場合は戻る
        if inc_count >= 100
          @frame_count = Graphics.frame_count
          return
        end
        # イベント中は戻る
        if KGC::DAYNIGHT_EVENT_STOP && $game_system.map_interpreter.running?
          @frame_count = Graphics.frame_count
          return
        end
        # カウント加算
        if $game_temp.in_battle
          inc_count /= 10.0
          $game_system.daynight_count += inc_count
        else
          $game_system.daynight_count += inc_count
        end
        # カウントを戻す
        @frame_count = Graphics.frame_count
        # 状態移行判定
        count = $game_system.daynight_count / Graphics.frame_rate
        if count >= KGC::DAYNIGHT_TIME[$game_system.daynight_phase]
          # 次の状態へ移行
          $game_system.daynight_count = 0
          $game_system.daynight_phase += 1
          # 最後の状態に達した場合
          if $game_system.daynight_phase >= KGC::DAYNIGHT_TONE.size
            # 最初の状態に戻す
            $game_system.daynight_phase = 0
          end
          # 日数経過判定
          if $game_system.daynight_phase == KGC::DAYNIGHT_PASS_PHASE
            $game_system.daynight_pass_days += 1
          end
          # 色調切り替え
          start_tone_change(KGC::DAYNIGHT_TONE[$game_system.daynight_phase],
            KGC::DAYNIGHT_DURATION)
        end
      when 1  # 歩数判定
        # 移動判定
        if @x != $game_player.x || @y != $game_player.y
          # 座標更新
          @x = $game_player.x
          @y = $game_player.y
          # カウント加算
          $game_system.daynight_count += 1
          # 状態移行判定
          count = $game_system.daynight_count
          if count >= KGC::DAYNIGHT_TIME[$game_system.daynight_phase]
            # 次の状態へ移行
            $game_system.daynight_count = 0
            $game_system.daynight_phase += 1
            # 最後の状態に達した場合
            if $game_system.daynight_phase >= KGC::DAYNIGHT_TONE.size
              # 最初の状態に戻す
              $game_system.daynight_phase = 0
            end
            # 日数経過判定
            if $game_system.daynight_phase == KGC::DAYNIGHT_PASS_PHASE
              $game_system.daynight_pass_days += 1
            end
            # 色調切り替え
            start_tone_change(KGC::DAYNIGHT_TONE[$game_system.daynight_phase],
              KGC::DAYNIGHT_DURATION)
          end
        end
      when 2  # 現実時間
        # 現在の時間を取得
        time = Time.now
        # 状態移行判定
        time1 = KGC::DAYNIGHT_TIME[$game_system.daynight_phase]
        time2 = KGC::DAYNIGHT_TIME[$game_system.daynight_phase - 1]
        if time2 != nil && time2 > time1
          change = time.hour < time2 && time.hour >= time1
        else
          change = time.hour >= time1
        end
        if change
          # 次の状態へ移行
          $game_system.daynight_count = 0
          $game_system.daynight_phase += 1
          # 最後の状態に達した場合
          if $game_system.daynight_phase >= KGC::DAYNIGHT_TONE.size
            # 最初の状態に戻す
            $game_system.daynight_phase = 0
          end
          # 日数経過判定
          if $game_system.daynight_phase == KGC::DAYNIGHT_PASS_PHASE
            $game_system.daynight_pass_days += 1
          end
          # 色調切り替え
          start_tone_change(KGC::DAYNIGHT_TONE[$game_system.daynight_phase],
            KGC::DAYNIGHT_DURATION)
        end
      end
    end
    # 手動切り替えが行われた場合
    if $game_temp.manual_daynight_change != nil
      # 色調切り替え
      start_tone_change(KGC::DAYNIGHT_TONE[$game_system.daynight_phase],
        KGC::DAYNIGHT_DURATION)
      # 手動切り替え解除
      $game_temp.manual_daynight_change = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● デフォルトの状態(0, 0, 0)に戻す
  #     duration : 切り替え時間(フレーム)  (省略時:40)
  #--------------------------------------------------------------------------
  def daynight_default(duration = KGC::DAYNIGHT_DURATION)
    start_tone_change(Tone.new(0, 0, 0), duration)
  end
  #--------------------------------------------------------------------------
  # ● 現在の状態を適用
  #     duration : 切り替え時間(フレーム)  (省略時:40)
  #--------------------------------------------------------------------------
  def daynight_apply(duration = KGC::DAYNIGHT_DURATION)
    start_tone_change(KGC::DAYNIGHT_TONE[$game_system.daynight_phase], duration)
  end
end


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

#==============================================================================
# ■ Game_Map
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # ● エンカウントリストの取得
  #--------------------------------------------------------------------------
  alias encounter_list_KGC_DayNight encounter_list
  def encounter_list
    # 元の処理を実行
    list = encounter_list_KGC_DayNight.dup

    # 出現条件判定
    list.each_index do |i|
      appear = false
      troop = $data_troops[list[i]]
      # 出現条件が無い場合は次へ
      next unless troop.name =~ /[DN((?:[ ]*[-]?d+(?:,[ ]*)?)+)]/i
      # 出現条件を適用
      for dn in $1.split(/,/)
        dn.gsub!(/[ ]/) {""}
        appear |= dn[0, 1] == "-" ? $game_system.daynight_phase != dn.to_i.abs :
          $game_system.daynight_phase == dn.to_i
      end
      list[i] = nil unless appear
    end
    return list.compact
  end
end


Articles

1 2 3 4 5 6 7 8 9 10