기타

디스크 체인져 VX!! (업데이트..)

by Tofuman posted Dec 02, 2008
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
이 스크립트는 각 게임에 디스크를 만들어 부를 수 있도록 가능케 하는 스크립트입니다.

원작자: Zeriab
VX 번역자 & 커스텀 타일셋 : Omegazion
한글번역: Tofuman

디스크에 대해 뭔지 의문점이 있을 분들이 많으실 텐데,
간단히 말해서, "다른 프로잭트의 맵과 이벤트"를 말하는 겁니다.
결국 이 스크립트는  한 프로잭트로 여러 프로잭트의 맵을 돌리는 것이 가능하다는 거죠.
이렇게 되면 원래 999개 까지만 가능한 맵의 수를 무한정하게 만들 수 있고,
또한, 타일셋의 한정에 대한 문제마저 해소시킬 수도 있습니다. (이 점 때문에 아주 유용하다고 봐요.)
자세한 설명법은 스크립트 안에 적혀있습니다. 데모도 첨부해 있으니, 이해가 안가시는 분들은
써보시길...

1.02 업데이트
---------------------------------------------------------------------------------------------------------
버그가 고쳐졌습니다...


디스크 체인져.alz

출처: rpgrevolution.com



#==============================================================================
#  Disc Changer script VX + custom tilesets per disc feature
#------------------------------------------------------------------------------
# Original DC script by Zeriab, translated to VX by omegazion and added
# 한글 번역: Tofuman
# custom tilesets per disc feature. v1.02
#==============================================================================
=begin
머릿말
------------
이 스크립트는 디스크를 바꿔주는 스크립트인데, 각 디스크마다 999개의 맵을 저장할 수 있습니다.
또한, 각 디스크마다 각각 고유의 타일셋을 지정할 수 있기 때문에,
다른 말론 무한의 타일셋을 사용할 수 있게 됩니다.

사용법
------------
이 스크립트는 'change_disc'라는 커맨드로 사용할 수 있는데, 이 커맨드를 사용함으로
다른 디스크를 불러올 수 있습니다. 무슨 뜻이냐면, 다른 프로잭트로 맵을 만든 후,
그것을 본 프로잭트에 불러올 수 있다는 뜻이죠. 그러기 위해선 일단 다른 프로잭트로
맵을 만든 후, 그 프로잭트의 맵 파일을 본 프로잭트의 데이터 폴더안에 저장해야 하는데,
(맵 파일들은 보통 MapXXX.rvdata라고 되어있죠. XXX는 숫자로 되어있습니다.)
디스크1을 생성하기 위해선 먼저 본 프로잭트의 데이터 폴더 안에 'disc1'이라고 하는
또 다른 폴더를 만드신 후, 아까 말한 맵파일을 이 안에 저장하면 됩니다.
디스크2같은 경우는 'disc2'라는 이름의 폴더를 만드신 후, 그 안에 디스크2에 해당하는
맵 파일을 저장하면 됩니다. 그 이후의 디스크들도 다 같은 방식입니다.
 
각각의 디스크에 각각의 타일셋을 이용하기
-------------------------------------------
디스크 각각의 폴더 안에, 다른 프로잭트에서 만들던 맵의 타일셋을
저장해야 하는데, 그러면 본 프로잭트 안에서 그 타일셋으로 이루어진
맵을 사용할 수 있게 됩니다... (이 부분이 가장 마음에 드는 점이죠.)
그렇게 하려면 또, 디스크의 맵을 만들었던 프로잭트의 System.rvdata를
디스크폴더 안에 집어넣어야 합니다. 그렇게 하지 않으면 통행 설정이
본 프로잭트의 것으로 적용되어, 원치 않은 일이 발생할 수도 있기 때문이죠.

디스크 바꾸기
--------------
위에 설명했듯이 'change_disc'라는 스크립트 커맨드를 이용해야 디스크의
맵을 사용할 수 있는데, 이 커맨드를 사용하는 방법을 알려드리도록 하겠습니다.
기본적으로 신택스로는 chage_disc(디스크 넘버, 아이디 넘버 = nil, x위치 = nil, y위치 = nil, 방향 = nil)
를 사용하는데, 여기서 nil이 있는 옵션은 꼭 안 적어도 되는 것을 의미합니다.
그리고 만약에 안적는다면, 커맨드를 사용하기전의 본 프로잭트의 맵 아이디, 케릭터의 위치와 방향이 사용되게
됩니다.
예를 들어 디스크2를 부르고 싶다면 change_disc(2)를 스크립트 커맨드로 사용하심 됩니다.
이같은 경우는 커맨드를 사용하기 전에 캐릭터가 1번 아이디의 맵에 있다면
디스크2 안에 들어있는 1번 아이디의 맵으로 바뀌고, 케릭터의 위치와 방향 역시
그 전의 위치와 수치상으로 같은 곳에 위치하게 됩니다.
만약에 그러기 싫고, 디스크 2 안에 10번 맵을 사용한 후, x=6, y=13위치에 지정하고 싶다면,
change_disc(2, 10, 6, 13)
을 사용하시면 됩니다.
만약에 본 프로잭트에 사용되었던 맵으로 돌아가고 싶다면 디스크 부분에 0을 쓰시면 됩니다.
(본 프로잭트는 디스크 0으로 지정되어 있습니다.)
그 다음 방향을 설정하기 위해서는 6개의 숫자를 사용해야 하는데
0, 10 = 방향 변화없음
2 = 아래를 향함
4 = 왼쪽을 향햠
6 = 오른쪽을 향함
8 = 위를 향함
위의 숫자를 이용하심 됩니다.
예를 들어 플레이어를 디스크1의 맵43, 그리고 x=30, y=40에 아래를 향하게 지정하고 싶다면
change_disc(1, 43, 30, 4, 2)
를 사용하심 됩니다.

=end
class Game_System
  attr_writer :disc
  def disc
    @disc ||= ''
    @disc
  end
end
def change_disc(number, id = nil, x = nil, y = nil, direction = nil)
  # Change disc
  if number.is_a?(Integer)
    $game_system.disc = number <= 0 ? "" : "disc#{number}/"
  else
    disc = number.to_s
    disc += '/' unless disc[-1] == 47
    $game_system.disc = disc
  end
  # Process arguments
  map_id = id.is_a?(Integer) ? id : $game_map.map_id
  x = $game_player.x unless x.is_a?(Integer)
  y = $game_player.y unless y.is_a?(Integer)
  direction = $game_player.direction unless direction.is_a?(Integer)
  $game_player.reserve_transfer(map_id, x, y, direction)
  # Change the current map id in case the new and old are identical.
  $game_map.map_id = 1000 + map_id
end

class Game_Map
  attr_writer :map_id
  alias oz_dc_setup setup
  def setup(map_id)
    if $game_system.disc.empty? # Original Disc
      oz_dc_setup(map_id)       # Perform original call
    else
      @map_id = map_id
      # Load map data from disc
      @map = load_data(sprintf("Data/%sMap%03d.rvdata", $game_system.disc, @map_id))
      @display_x = 0
      @display_y = 0
      # Get Folder Location
      loc = "Data/#{$game_system.disc}"
      $game_system.disc =~ /([0-9]+)/
      dn = $1.to_i
      if not $game_temp.disc_passages[dn].nil?
        # Get passage data stored in game temp
        @passages = $game_temp.disc_passages[dn]
      elsif FileTest.exist?(loc + "System.rvdata") # If system.rvdata exists
        # load system settings from that file
        disc_sys = load_data(loc + "System.rvdata")
        # Use passage settings from that file
        @passages = disc_sys.passages
        # Store in Temp data for faster loading
        $game_temp.disc_passages[dn] = @passages
      else
        # Use default passage settings
        @passages = $data_system.passages
      end
      referesh_vehicles
      setup_events
      setup_scroll
      setup_parallax
      @need_refresh = false
    end
  end
end

#==============================================================================
#  ** 각 디스크에 커스텀 타일셋을 지정
#==============================================================================
class Spriteset_Map
  alias oz_dc_create_tilemap create_tilemap
  def create_tilemap
    if $game_system.disc.empty?
      oz_dc_create_tilemap
    else
      folder_loc = sprintf("Data/%s", $game_system.disc)
      @tilemap = Tilemap.new(@viewport1)
      # For each tileset file extension
      ["A1", "A2", "A3", "A4", "A5", "B", "C", "D", "E"].each_with_index do |name, i|
        tilename = "Tile#{name}"
        # If the file exists
        if not Dir[folder_loc + tilename + ".*"].empty?
          @tilemap.bitmaps[i] = Cache.load_bitmap(folder_loc, tilename)
        else
          # Load default bitmap
          @tilemap.bitmaps[i] = Cache.system(tilename)
        end
      end
      @tilemap.map_data = $game_map.data
      @tilemap.passages = $game_map.passages
    end
  end
end
class Game_Temp
  attr_accessor :disc_passages
  alias oz_dc_init initialize
  def initialize
    oz_dc_init
    @disc_passages = []
  end
end