티스토리 뷰

<서론>

스타듀밸리 작물가격 계산기 프로그램을 만들고싶어졌다

계산기를 만들려면 작물 가격 데이터가 필요했다

그리고 스타듀밸리 작물 가격에 대한 데이터는 인터넷에 널려있다

그러나 인터넷에 있는 데이터에 의존하고 싶지 않았다

스타듀밸리 게임으로부터 직접 데이터를 추출해내고 싶었다


더군다나 Stardew Valley는 XNA로 개발되었고, XNA는 C#.NET 라이브러리이다



(Process Explorer에서 Stardew Valley에 로드된 DLL들을 보면 XNA DLL들을 확인할 수 있다)


즉, 바이트 코드(CIL, MSIL이라고 불리는)로 이루어져있기 때문에 디컴파일이 어렵지 않다

그래서 시작하게 되었다

끝나고보니 .NET의 디컴파일이 쉬워보여서 시작한 일이지만 데이터 추출에 디컴파일은 필요없었다


<본론>

Stardew Valley Path: "C:\Program Files (x86)\steam\steamapps\common\stardew valley"


Content라는 디렉토리가 보인다

가격 데이터는 저기있을 확률이 99%다

그리고 디렉토리를 들어가보면, xnb라는 바이너리 파일들을 확인할 수 있다

이 내용을 확인하려면 XNB Node라는 프로그램이 필요하다


XNB Node는 여기서 다운받았다

(http://kjm00006.blog.me/220668634921)


위 이미지에 보이듯, 다운을 받아서 Stardew Valley Path에 XNBNode 디렉토리를 놓았다

그리고 XNBNode 디렉토리에서 cmd를 열어 프로그램을 실행했다



extract: xnb로부터 데이터를 추출한다

..\Content: 인풋 디렉토리

.\output: 아웃풋 디렉토리

--quiet: 조용히-


실행완료 후 XNBNode\output 디렉토리를 보면 xnb 파일이 extract된 png 파일과 yaml 파일을 확인할 수 있다

위키디피아에서 yaml은 human-readable data serialization language라고 설명하고 있다

즉, 데이터는 YAML 파일에 있다


필자는 가격 데이터를 찾고있다. 가격 데이터가 있을 확률이 가장 높은 곳은 Data 디렉토리로 추측된다

그리고 Data 디렉토리에는 ObjectInformation.yaml이라는 파일이 있다

필자는 이것을 sublime으로 열어보았다 (메모장으로 열어도 된다)



사실 이것만 찾으면 끝이다

60: 에 보이는 에메랄드는 옆에 250이라고 써있고, 게임상에서도 250원이다

68: 에 보이는 토파즈는 옆에 80이라고 써있고, 게임상에서도 80원이다

그리고 

즉, ObjectID: ObjectName/ObjectPrice/... 이라는 것을 추측할 수 있다


이 파일을 파싱하여 가격 데이터를 추출하면 목적 달성이다

필자는 이 외에 .NET Decompiler를 사용하여 가격 데이터가 어떤 파일에 저장되었는지 찾는 삽질을 했는데, 그 삽질 과정은 생략하였다


<결론>

데이터 추출 과정을 요약하자면 다음과 같다

1. XNBNode 프로그램을 사용해 xnb 파일을 extract하였다

2. 그리하여 xnb 파일로부터 데이터를 저장하고있는 yaml 파일을 얻었다

3. 그리고 필자가 원하는 "가격 데이터"를 가지고있는 yaml 파일을 찾아냈다

생각보다 어렵지 않았다

다음 할일은 계산기를 만드는 일이다

그때 돌아오도록 하겠다

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함