#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ /_/_/_/_/_/_/_/_/_/_/_/_/_/_/
# _ / ◆ 2 창에있는 선방 - KGC_2PaneSave ◆
#_/----------------------------------------------- -----------------------------
# _ / 2 창 식 저장 화면을 만듭니다.
#_/=============================================== =============================
# _ /«2000 식 선방 [2000StyleSave]»와 병용 불가
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ /_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#================================================= =============================
# ★ 지정 품목 ★
#================================================= =============================
module KGC
# ◆ 페이지
# 1 페이 지당 세이브 파일 4.
# 너무 많은 세이브 /로드 화면 표시 속도가 느려집니다.
# ※ 반드시 1 이상을 지정하세요.
TPS_PAGE_NUMBER = 4
# ◆ 파일 번호 서식
# [(i) .. 파일 번호]
TPS_FILE_INDEX_FORMAT = "파일 (i)"
# ◆ 회원 목록 열 수 (1 ~ 4)
# 5 이상하면 표시 입었습니다.
TPS_MEMBER_COLS = 3
# ◆ 앞두고 멤버도 그리기
#«멀티 파티»도입에만 적용.
TPS_DRAW_ALL_MEMBER = true
end
# ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★
$ imported = () if $ imported == nil
$ imported [ "2PaneSave"] = true
#================================================= =============================
# ■ Window_SaveFile
#================================================= =============================
class Window_SaveFile <Window_Base
attr_accessor : destination
#------------------------------------------------- -------------------------
# ● 오브젝트 초기화
# file_index : 저장 파일의 인덱스
# filename : 파일 이름 :
#------------------------------------------------- -------------------------
def initialize (file_index, filename)
super (file_index * 160, 64, 160, 96)
self.contents = Bitmap.new (width - 32, height - 32)
@ file_index = file_index
@ filename = "Save # (@ file_index + 1). rxdata"
@ time_stamp = Time.at (0)
@ file_exist = FileTest.exist? (@ filename)
if @ file_exist
file = File.open (@ filename, "r")
@ time_stamp = file.mtime
@ frame_count = Marshal.load (file)
unless@frame_count.is_a? (Integer)
@ frame_count = Marshal.load (file)
end
9.times (| i | # 불필요한 부분을 읽으 비행
Marshal.load (file)
)
@ total_sec = @ frame_count / Graphics.frame_rate
file.close
end
refresh
@ destination = self.x
@ selected = false
end
#------------------------------------------------- -------------------------
# ● 재생
#------------------------------------------------- -------------------------
def refresh
# MapInfo.rxdata를로드
mapinfo = load_data ( "Data / MapInfos.rxdata")
self.contents.clear
# 파일 번호 그리기
self.contents.font.color = system_color
name = KGC : : TPS_FILE_INDEX_FORMAT.dup
name.gsub! (/ (i) /) ( "# (@ file_index + 1)")
self.contents.draw_text (4, 0, 120, 32, name)
@ name_width = contents.text_size (name) width
# 세이브 파일이있는 경우
if @ file_exist
# 경기 시간을 그리기
hour = @ total_sec / 60 / 60
min = @ total_sec / 60 % 60
sec = @ total_sec % 60
time_string = sprintf ( "% 02d : % 02d : % 02d", hour, min, sec)
self.contents.font.color = normal_color
self.contents.draw_text (4, 32, 120, 32, time_string)
end
end
#------------------------------------------------- -------------------------
# ● 프레임 갱신
#------------------------------------------------- -------------------------
def update
super
# 창을 이동
if self.x! = @ destination
if (self.x - @ destination). abs <12
self.x = @ destination
else
dist = (@ destination - self.x) / 8
if dist <0
dist = dist, -12] min
else
dist = dist 12] max
end
self.x + = dist
end
end
end
end
# ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★
#================================================= =============================
# ■ Window_SaveFileInfo
#------------------------------------------------- -----------------------------
# 파일의 정보를 표시하는 창입니다.
#================================================= =============================
class Window_SaveFileInfo <Window_Base
#------------------------------------------------- -------------------------
# ● 오브젝트 초기화
#------------------------------------------------- -------------------------
def initialize
super (0, 160, 640, 320)
self.contents = Bitmap.new (width - 32, height - 32)
self.contents.font.size = 20
end
#------------------------------------------------- -------------------------
# ● 재생
# file_index : 저장 파일의 인덱스
#------------------------------------------------- -------------------------
def refresh (file_index)
if @ file_index == file_index
return
end
self.contents.clear
@ file_index = file_index
filename = "Save # (file_index + 1). rxdata"
if FileTest.exist? (filename)
self.contents.font.color = normal_color
self.contents.font.name = Font.default_name
self.contents.font.size = 20
self.contents.font.bold = Font.default_bold
draw_file_info (filename)
else
self.contents.font.color = disabled_color
self.contents.font.name = "Times New Roman"
self.contents.font.size = 32
self.contents.font.bold = true
self.contents.draw_text (0, 112, 640, 64, "- NO DATA -", 1)
end
end
#------------------------------------------------- -------------------------
# ● 파일 정보 그리기
# filename : 대상 파일 이름
#------------------------------------------------- -------------------------
def draw_file_info (filename)
file = File.open (filename, "r")
time_stamp = file.mtime
frame_count = Marshal.load (file)
unless frame_count.is_a? (Integer)
frame_count = Marshal.load (file)
end
game_system = Marshal.load (file)
game_switches = Marshal.load (file)
game_variables = Marshal.load (file)
game_self_switches = Marshal.load (file)
game_screen = Marshal.load (file)
game_actors = Marshal.load (file)
game_party = Marshal.load (file)
game_troop = Marshal.load (file)
game_map = Marshal.load (file)
total_sec = frame_count / Graphics.frame_rate
file.close
# 캐릭터 그리기
actors = game_party.actors
if $ imported [ "LargeParty"] & &! KGC : : TPS_DRAW_ALL_MEMBER
actors = game_party.battle_actors
end
actors.each_with_index (| actor, i |
x = i / 5 * (608 / KGC : : TPS_MEMBER_COLS)
y = i % 5 * 48
out = dead = false
if $ imported [ "LargeParty"] & &! game_party.battle_actors.include? (actor)
out = true
elsif actor.dead?
dead = true
end
image = RPG : : Cache.character (actor.character_name, actor.character_hue)
rect = Rect.new (0, 0, image.width>> 2 image.height>> 2)
self.contents.blt (x, y, image, rect, out? 128 : 255)
self.contents.font.color = dead? knockout_color : normal_color
self.contents.draw_text (x + 40, y, 108, 24, actor.name)
self.contents.font.color = system_color
self.contents.draw_text (x + 40, y + 24, 32, 24, "Lv")
self.contents.font.color = normal_color
self.contents.draw_text (x + 72, y + 24, 64, 24, actor.level.to_s)
)
# 플레이 시간을 그리기
hour = total_sec / 3600
min = total_sec / 60 % 60
sec = total_sec % 60
time_string = sprintf ( "% 02d : % 02d : % 02d", hour, min, sec)
self.contents.font.color = system_color
self.contents.draw_text (480, 240, 48, 24, "TIME")
self.contents.font.color = normal_color
self.contents.draw_text (528, 240, 80, 24, time_string 2)
# 타임 스탬프를 그리기
time_string = time_stamp.strftime ( "% Y / % m / % d % H : % M")
self.contents.draw_text (448, 264, 160, 24, time_string 2)
# 저장 위치 임무를 그리기
if $ imported [ "PlaceMission"]
mapinfo = load_data ( "Data / MapInfos.rxdata")
place = ""
# 맵 이름이없는 경우
if game_system.place == nil | | game_system.place == ""
# 맵 이름 검색
place = mapinfo [game_map.map_id] name
else
place = game_system.place
end
self.contents.font.color = system_color
cx = self.contents.text_size ( "저장 위치") width
self.contents.draw_text (4, 240, cx, 24, "저장 위치")
self.contents.font.color = normal_color
self.contents.draw_text (8 + cx, 240, 596 - cx, 24, place)
self.contents.font.color = system_color
cx = self.contents.text_size ( "위원회") width
self.contents.draw_text (4, 264, cx, 24, "위원회")
self.contents.font.color = normal_color
self.contents.draw_text (8 + cx, 264, 596 - cx, 24, game_system.mission)
end
end
end
# ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★
#================================================= =============================
# ■ Scene_Title
#================================================= =============================
class Scene_Title
#------------------------------------------------- -------------------------
# ● 프레임 갱신
#------------------------------------------------- -------------------------
alias update_KGC_2PaneSave update
def update
#하며 계속 판정
unless @ continue_checked
found = false
(KGC : : TPS_PAGE_NUMBER * 4) times (| i |
if FileTest.exist? ( "Save # (i +1) rxdata")
found = true
break
end
)
# 세이브 파일이 발견되면
if found
# 커서를하며 계속 적응
@ command_window.index = 1
end
@ continue_checked = true
end
update_KGC_2PaneSave
end
end
# ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★
#================================================= =============================
# ■ Scene_File
#================================================= =============================
class Scene_File
#------------------------------------------------- -------------------------
# ● 기본 과정
#------------------------------------------------- -------------------------
def main
@ file_number = KGC : : TPS_PAGE_NUMBER * 4
create_sprites
# 마지막으로 작업한 파일을 선택
@ file_index = $ game_temp.last_file_index
@ savefile_windows [@ file_index] selected = true
@ index_x = @ file_index % 4
@ top_position = 0
(@ file_index / 4) times (| i |
@ top_position -= 160 * 4
)
@ scroll = 0
# 창을 이동
move_window (true)
@ info_window.refresh (@ file_index)
# 영상 실행
Graphics.transition
# 메인 루프
loop (
Graphics.update
Input.update
update
if $ scene! = self
break
end
)
# 전환 준비
Graphics.freeze
dispose_sprites
end
#------------------------------------------------- -------------------------
# ● 스프 라이트 생성
#------------------------------------------------- -------------------------
def create_sprites
# 도움말 윈도우 작성
@ help_window = Window_Help.new
@ help_window.set_text (@ help_text)
# 세부화이루윙도우 만들기
@ savefile_windows = []
@ file_number.times (| i |
@ savefile_windows <<Window_SaveFile.new (i, make_filename (i))
)
# 정보 창 만들기
@ info_window = Window_SaveFileInfo.new
# 나비게토윙도우 만들기
if KGC : : TPS_PAGE_NUMBER> 1
@ navi_window = []
@ navi_sprite = []
2.times (| i |
@ navi_window [i] = Window_Base.new (0, 140, 80, 36)
@ navi_window [i]. back_opacity = 160
@ navi_window [i]. z = 1000
@ navi_sprite [i] = Sprite.new
@ navi_sprite [i]. bitmap = Bitmap.new (64, 24)
@ navi_sprite [i]. bitmap.font.size = 20
@ navi_sprite [i]. y = 144
@ navi_sprite [i]. z = 1001
)
@ navi_sprite [0]. bitmap.draw_text (0, 0, 64, 24, "← 뒤로", 1)
@ navi_sprite [0] x = 8
@ navi_sprite [1]. bitmap.draw_text (0, 0, 64, 24, "앞으로 →", 1)
@ navi_window [1] x = 560
@ navi_sprite [1] x = 568
end
# 창을 반투명 화
window_alpha if $ imported [ "MenuAlter"] & & KGC : : MA_MENU_TRANSPARENT
end
#------------------------------------------------- -------------------------
# ● 스프 삭제
#------------------------------------------------- -------------------------
def dispose_sprites
# 나비게토윙도우 삭제
if KGC : : TPS_PAGE_NUMBER> 1
2.times (| i |
@ navi_window [i]. dispose
@ navi_sprite [i]. bitmap.dispose
@ navi_sprite [i]. bitmap = nil
@ navi_sprite [i]. dispose
@ navi_window [i] = @ navi_sprite [i] = nil
)
end
# 윈도우 삭제
@ help_window.dispose
@ help_window = nil
@ savefile_windows.each_index (| i |
@ savefile_windows [i]. dispose
@ savefile_windows [i] = nil
)
@ info_window.dispose
@ info_window = nil
# 스뿌라이토셋토 삭제
if @ spriteset! = nil
@ spriteset.dispose
@ spriteset = nil
end
end
#------------------------------------------------- -------------------------
# ● 프레임 갱신
#------------------------------------------------- -------------------------
def update
# 윈도우 업데이트
@ help_window.update
@ savefile_windows.each (| w |
w.update
)
# C 버튼
if Input.trigger? (Input : : C)
on_decision (make_filename (@ file_index))
$ game_temp.last_file_index = @ file_index
return
# B 버튼
elsif Input.trigger? (Input : : B)
on_cancel
return
# →
elsif Input.repeat? (Input : : RIGHT)
# → 누름 상태가 반복이 아닌 경우 또는
# 또는 커서 위치가 파일 개수 이전의 경우
if Input.trigger? (Input : : RIGHT) | | @ file_index <@ file_number - 1
# 커서 SE 연주
$ game_system.se_play ($ data_system.cursor_se)
# 커서를 오른쪽으로 이동
@ savefile_windows [@ file_index] selected = false
@ file_index = (@ file_index + 1) % @ file_number
@ savefile_windows [@ file_index] selected = true
@ index_x + = 1
self.move_window
return
end
# ←
elsif Input.repeat? (Input : LEFT)
# ← 누름 상태가 반복이 아닌 경우 또는
# 또는 커서 위치가 0보다 뒤에 있으면
if Input.trigger? (Input : LEFT) | | @ file_index> 0
# 커서 SE 연주
$ game_system.se_play ($ data_system.cursor_se)
# 커서를 왼쪽으로 이동
@ savefile_windows [@ file_index] selected = false
@ file_index = (@ file_index + @ file_number - 1) % @ file_number
@ savefile_windows [@ file_index] selected = true
@ index_x -= 1
self.move_window
return
end
# ↓ 또는 R
elsif Input.repeat? (Input : : DOWN) | | Input.repeat? (Input : R)
# ↓, R 누름 상태를 반복하지 않은 경우
if Input.trigger? (Input : : DOWN) | | Input.trigger? (Input : R)
# 커서 SE 연주
$ game_system.se_play ($ data_system.cursor_se)
# 커서를 오른쪽으로 이동
@ savefile_windows [@ file_index] selected = false
@ file_index = (@ file_index + 4) % @ file_number
@ savefile_windows [@ file_index] selected = true
@ scroll = 1
self.move_window
return
end
# ↑ 또는 L
elsif Input.repeat? (Input : UP) | | Input.repeat? (Input : L)
# ↑, L 누름 상태를 반복하지 않은 경우
if Input.trigger? (Input : UP) | | Input.trigger? (Input : L)
# 커서 SE 연주
$ game_system.se_play ($ data_system.cursor_se)
# 커서를 왼쪽으로 이동
@ savefile_windows [@ file_index] selected = false
@ file_index = (@ file_index + @ file_number - 4) % @ file_number
@ savefile_windows [@ file_index] selected = true
@ scroll = -1
self.move_window
return
end
end
@ info_window.refresh (@ file_index)
end
#------------------------------------------------- -------------------------
# ● 저장 창 이동
# force : 강제 이동
#------------------------------------------------- -------------------------
def move_window (force = false)
if! force
# 일반적으로 커서 이동하는 경우
if @ scroll == 0 & & @ index_x> = 0 & & @ index_x "= 3
return
end
if @ index_x == 4 | | @ scroll == 1 # 오른쪽으로 스크롤
if @ file_index "= 3 # 왼쪽으로 이동
@ top_position = 0
else # 페이지 이동
@ top_position -= 160 * 4
end
@ index_x = 0 if @ scroll == 0
elsif @ index_x == -1 | | @ scroll == -1 # 왼쪽으로 스크롤
if @ file_index> = @ file_number - 4 # 오른쪽으로 이동
@ top_position = (@ file_number - 4) * -160
else # 일반적으로 이동
@ top_position + = 160 * 4
end
@ index_x = 3 if @ scroll == 0
end
@ scroll = 0
@ file_number.times (| i |
@ savefile_windows [i]. destination = @ top_position + 160 * i
)
else
@ file_number.times (| i |
@ savefile_windows [i]. x = @ savefile_windows [i]. destination =
@ top_position + 160 * i
)
end
end
#------------------------------------------------- -------------------------
# ● 창을 반투명 화
#------------------------------------------------- -------------------------
def window_alpha
# [Scene_Save에서 재정
end
end
# ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★
#================================================= =============================
# ■ Scene_Save
#================================================= =============================
class Scene_Save <Scene_File
#------------------------------------------------- -------------------------
# ● 창을 반투명 화
#------------------------------------------------- -------------------------
def window_alpha
# 스뿌라이토셋토 만들기
@ spriteset = Spriteset_Map.new
# 각 창을 반투명 화
@ help_window.back_opacity = 160
@ savefile_windows.each (| w |
w.back_opacity = 160
)
@ info_window.back_opacity = 160
end
#------------------------------------------------- -------------------------
# ● 저장 데이터 쓰기
# file : 쓰기 위해 파일 객체 (열려진)
#------------------------------------------------- -------------------------
def write_save_data (file)
# 세이브 파일 그리기 캐릭터 데이터를 생성
characters = []
for i in 0 ... $ game_party.actors.size
actor = $ game_party.actors [i]
characters.push (actor.battler_name, actor.battler_hue)
end
# 세이브 파일 그리기 캐릭터 데이터를 쓰는
Marshal.dump (characters, file)
# 플레이 시간 측정을위한 프레임 카운트를 기록
Marshal.dump (Graphics.frame_count, file)
# 저장 횟수를 1 증가
$ game_system.save_count + = 1
# 마법 저장
# (편집기에서 저장할 때마다 임의의 값으로 재작성)
$ game_system.magic_number = $ data_system.magic_number
# 각종 게임 개체를 작성
Marshal.dump ($ game_system, file)
Marshal.dump ($ game_switches, file)
Marshal.dump ($ game_variables, file)
Marshal.dump ($ game_self_switches, file)
Marshal.dump ($ game_screen, file)
Marshal.dump ($ game_actors, file)
Marshal.dump ($ game_party, file)
Marshal.dump ($ game_troop, file)
Marshal.dump ($ game_map, file)
Marshal.dump ($ game_player, file)
end
end
# ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★
#================================================= =============================
# ■ Scene_Load
#================================================= =============================
class Scene_Load <Scene_File
#------------------------------------------------- -------------------------
# ● 오브젝트 초기화
#------------------------------------------------- -------------------------
def initialize
# 임시 개체를 다시 만듭니다
$ game_temp = Game_Temp.new
# 타임 스탬프가 현재 파일을 선택
$ game_temp.last_file_index = 0
latest_time = Time.at (0)
(KGC : : TPS_PAGE_NUMBER * 4) times (| i |
filename = make_filename (i)
if FileTest.exist? (filename)
file = File.open (filename, "r")
if file.mtime> latest_time
latest_time = file.mtime
$ game_temp.last_file_index = i
end
file.close
end
)
super ( "어떤 파일을 로드하시겠습니까?")
end
end