먼저, MV가 설치된 폴더에서 DLC 폴더로 갑니다.
KadokawaPlugins 폴더에서 LastUsedItem 플러그인을 만들고 있는 게임의 js/plugins 폴더로 복사해서 붙여 넣습니다.
귀환서 아이템을 만들고 공통 이벤트를 설정합니다.
귀환서 아이템의 메모(comment) 란에는 다음과 같은 모든 귀환서에서 공통으로 처리할 노트 태그를 설정해둡니다.
1 2 3 | <귀환서:true> <불가능:[1,2]> <가능:[{baseMapId:3, mapId: 4, x:14,y:24}, {baseMapId:4, mapId: 3, x:9,y:10}]> | cs |
'귀환서' 공통 이벤트에서 이 정보를 가져와 처리해야 합니다.
텍스트로 보면 다음과 같습니다.
◆Script:// 마지막으로 사용한 아이템 ID :Script:var _lastItemIdx = $gameVariables.value(8); :Script:// 아이템 객체 획득 :Script:$gameTemp._teleportItem = $dataItems[_lastItemIdx]; ◆If:Script:$gameTemp._teleportItem.meta["귀환서"] === "true" ◆Script:$gameTemp._teleportDisableMap = eval($gameTemp._teleportItem.meta["불가능"]); :Script:$gameTemp._teleportMovableMap = eval($gameTemp._teleportItem.meta["가능"]); ◆Comment:현재 맵이 귀환서 사용 불가능 지역인가? ◆If:Script:$gameTemp._teleportDisableMap.contains($gameMap.mapId()) ◆Text:None, Window, Bottom :Text:사용 불가능 지역입니다. ◆Change Items:귀환서 + 1 ◆ :End ◆Comment:현재 맵이 귀환서 사용 가능 지역인가? ◆If:Script:$gameTemp._teleportMovableMap ◆Control Variables:#0001 인덱스 = 0 ◆Loop ◆Script:var idx = $gameVariables.value(1); :Script:$gameTemp._myTempItem = $gameTemp._teleportMovableMap[idx]; ◆If:Script:!!$gameTemp._myTempItem ◆Control Variables:#0002 이동할 맵 ID = parseInt($gameTemp._myTempItem.mapId) ◆Control Variables:#0003 이동할 맵 X = parseInt($gameTemp._myTempItem.x) ◆Control Variables:#0004 이동할 맵 Y = parseInt($gameTemp._myTempItem.y) ◆Control Variables:#0005 현재 맵 ID = parseInt($gameTemp._myTempItem.baseMapId) ◆Comment:새로 추가한 5번 변수와 비교 ◆If:Script:$gameVariables.value(5) === $gameMap.mapId() ◆Transfer Player:{이동할 맵 ID} ({이동할 맵 X},{이동할 맵 Y}) ◆Break Loop ◆ :Else ◆Control Variables:#0001 인덱스 += 1 ◆ :End ◆ :Else ◆Break Loop ◆ :End ◆ :Repeat Above ◆ :End ◆ :End
차례대로 살펴봅시다.
LastUsedItem 플러그인을 사용하면 마지막으로 사용한 아이템의 ID 값을 변수에 저장할 수 있습니다.
이 ID 값을 _lastItemIdx 변수에 담고, 세이브 파일에 저장되지 않는 임시 전역 변수 안에 저장합니다.
이렇게 하면 노트 태그 값을 가져올 수 있는 아이템 객체를 얻게 됩니다.
1 2 3 4 | // 마지막으로 사용한 아이템 ID var _lastItemIdx = $gameVariables.value(8); // 아이템 객체 획득 $gameTemp._teleportItem = $dataItems[_lastItemIdx]; | cs |
플러그인이 없어도 노트 태그 값이 자동으로 만들어지는데요.
이점을 활용하면 다음과 같이 귀환서 아이템인지 확인하는 용도의 조건문을 만들 수 있습니다.
1 | ◆If:Script:$gameTemp._teleportItem.meta["귀환서"] === "true" | cs |
귀환서 아이템의 노트 태그 값을 가져와 배열로 만듭니다.
노트 태그 값에 있는 배열은 그냥 문자열이기 때문에 자바스크립트 배열로 만들어야 합니다.
JSON.parse나 JsonEx.parse를 쓸 수도 있지만, 그냥 eval을 사용하여 처리하겠습니다.
1 2 | $gameTemp._teleportDisableMap = eval($gameTemp._teleportItem.meta["불가능"]); $gameTemp._teleportMovableMap = eval($gameTemp._teleportItem.meta["가능"]); | cs |
이 데이터를 스크립트로 처리하면 아래와 같이 불가능 지역을 수 많은 조건 분기 문이 없이 체크할 수 있습니다.
◆If:Script:$gameTemp._teleportDisableMap.contains($gameMap.mapId()) ◆Text:None, Window, Bottom :Text:사용 불가능 지역입니다. ◆Change Items:귀환서 + 1 ◆ :End
지역 이동 처리도 구현해야 합니다.
배열에 있는 값을 차례대로 나열하려면 반복문으로 인덱스 0부터 끝까지 읽어야 합니다.
또한 해당 원소에는 mapId, x, y 값이 있을 것으로 예상됩니다.
그러나 해당 값은 문자열 값이므로 자바스크립트 정수 값으로 바꾸는 처리를 해야 합니다.
mapId가 현재 맵의 ID와 같으면 노트 태그에 적어둔 특정 맵 좌표로 이동 됩니다
◆Comment:현재 맵이 귀환서 사용 가능 지역인가? ◆If:Script:$gameTemp._teleportMovableMap ◆Control Variables:#0001 인덱스 = 0 ◆Loop ◆Script:var idx = $gameVariables.value(1); :Script:$gameTemp._myTempItem = $gameTemp._teleportMovableMap[idx]; ◆If:Script:!!$gameTemp._myTempItem ◆Control Variables:#0002 이동할 맵 ID = parseInt($gameTemp._myTempItem.mapId) ◆Control Variables:#0003 이동할 맵 X = parseInt($gameTemp._myTempItem.x) ◆Control Variables:#0004 이동할 맵 Y = parseInt($gameTemp._myTempItem.y) ◆Control Variables:#0005 현재 맵 ID = parseInt($gameTemp._myTempItem.baseMapId) ◆Comment:새로 추가한 5번 변수와 비교 ◆If:Script:$gameVariables.value(5) === $gameMap.mapId() ◆Transfer Player:{이동할 맵 ID} ({이동할 맵 X},{이동할 맵 Y}) ◆Break Loop ◆ :Else ◆Control Variables:#0001 인덱스 += 1 ◆ :End ◆ :Else ◆Break Loop ◆ :End ◆ :Repeat Above ◆ :End
※ 주의 : 변수의 조작에서 이 글의 변수 ID 값과는 다른 변수 ID 값을 설정하신 경우,
스크립트 실행 구문에 있는 변수의 ID 값도 바꿔줘야 합니다.
그렇지 않으면 반복문을 탈출할 수 없게 되면서 게임이 멈추게 됩니다.