Map Compressor - 스타크래프트 맵 압축 프로그램

Starcraft/StarCraft Files 2017.06.24 03:41

Chk 프로텍션은 따로 적용되어 있지 않습니다. 다른 프로텍터와 겸용하세요.


평균 30%에서 최대 50% 이상 추가 압축합니다.

사용법은 따로 적어놓지 않겠습니다.


사용후 압축률을 적어주시면 감사하겠습니다.


- 버그 수정 및 속도 개선


Map Compressor.rar

'Starcraft > StarCraft Files' 카테고리의 다른 글

Map Compressor - 스타크래프트 맵 압축 프로그램  (8) 2017.06.24
SMC Recover [SMC 언프로텍터]  (14) 2016.04.24
MPQ Repair 1.1.0  (6) 2012.03.24
posted by 자칭 프로그래머ㅡ ModMapper

스타크래프트 chk의 구조

Starcraft/scenario.chk 2016.12.16 02:14
  • 저런 구조들을 어떻게 분석해서 뭐가 뭔지 알아내는게 참 신기하단말이죠.

    제온 2017.04.18 14:37

먼저 이 강좌는 프로그래밍을 약간이라도 아는 사람이라는 기준 하에 쓰여졌다는 점을 알린다.



스타크래프트 맵의 chk(이하 청크) 는 여러개의 구휙이 구조는 리스트와 비슷한 구조로 배치되어 있다.

그래서 리스트와 읽는 방법이 같으며. 현재 위치가 파일의 끝 이상이 될 시 읽기를 종료한다.

[스타크래프트 chk의 예]


각 구휙은 4바이트 문자열의 이름 그리고 4바이트 정수의 크기 그리고 내용 (가변 크기)로 이루어져 있다.

그것을 코드로 표현하면 아래와도 같은 모습을 보이게 된다.

0

1

2

3

4

5

typedef struct {

    /* 4바이트 문자 */ Char Name[4];

    /* 4바이트 정수 */ Int32 Size;

    Void* Data;

Section;

 

[chk 섹션의 구조]





그렇다면 이 구휙들을 읽는 방법은 간단하다.

단계적으로 읽어나가서 필요한 구휙을 찾고, 원하는 값을 가져오면 되는 것이다.

아래는 구휙을 읽어 원하는 구휙을 가져오는 코드이다.


0

1

2

3

4

5

6

7

8

9

10

Void* GetSection(VoidpvBufferInt32 cbBufferCharName) {

    Void* BufferEnd = (Byte*)pvBuffer + cbBuffer;

    Int32 Size;

    while (BufferEnd > pvBuffer) {

        if (*(Int32*)Name == *(Int32*)pvBufferreturn (Byte*)pvBuffer + 4;

        pvBuffer = (Byte*)pvBuffer + 4;

        pvBuffer = (Byte*)pvBuffer + 4 + *(Int32*)pvBuffer;

    }

    return nullptr;

}

 

[메모리에서 원하는 구휙을 코드]


허나 우리가 해야할 것은 읽기 뿐만이 아닌 작성 또한 해야한다는 점이다.

강좌를 작성하는 이유는 많은 사람들이 지식을 얻고 가기 하기 위함인데.

C++은 메모리를 직접 관리하는데 탁월하지만 난이도가 높다.

그러므로 이제부터 비교적 난이도가 낮은 VB .Net으로 코드를 사용해 보겠다.


추가로 여기서 VB .Net을 선택한 이유는 아래와도 같다.

1. 내가 VB .Net을 주력으로 사용한다. (중요)

2. VB는 다른 사람이(초보자가) 사용하기 쉬위 여러 간단한 프로그램에서 사용된다.

3. 닷넷 프레임워크의 자원 사용할 수 있다.


참고로 작성일 기준으로 C#보다 VB .Net의 점유율이 약간 우세하다


[참조 : http://www.tiobe.com/tiobe-index/]


너무 잡다한 소리가 많았나? 그렇다면 이제 본격적으로 시작해 보겠다.

우리가 알아두어야 할 것은 우리는 수시로 추가와 제거를 해야 할 것이라는 점이다.

그래서 List와 MemoryStream를 사용하기로 했다. 왜냐하면 배열은 확장을 시도하면 자원 낭비가 심해지기 때문이다.

무슨 소리인지 모르겠다면 그냥 넘어가도 좋다. 그렇게 읽기와 작성 코드는 아래와도 같다.


0

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

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

'스타크래프트 chk의 구조 - Chunk의 읽기와 작성

'Code by ModMapper

 

Imports System.Collections.Generic

Imports System.Text

Imports System.IO

 

''' <summary>Chunk를 읽거나 작성하는 모듈입니다.</summary>

Module Chunk

    ''' <summary>Chunk 구휙 형식</summary>

    Public Structure Section

        Dim Name As String          '구휙 이름

        Dim Data As MemoryStream    '구휙 내용

    End Structure

 

    ''' <summary>파일에서 Chunk를 읽는 함수.</summary>

    ''' <param name="FileName">읽어들일 파일 이름.</param>

    ''' <returns>읽어들인 Chunk값</returns>

    Public Function Chunk_ReadFile(FileName As StringAs List(Of Section)

        '읽기 전용으로 파일 스트림을 연다.

        Dim FS As New FileStream(FileName, FileMode.Open, FileAccess.Read)

        Dim Chunk = Chunk_ReadStream(FS)

        FS.Close()  '사용한 파일 스트림을 닫음

        Return Chunk

    End Function

 

    ''' <summary>스트림에서 Chunk를 읽는 함수.</summary>

    ''' <param name="Stream">읽어들일 스트림.</param>

    ''' <returns>읽어들인 Chunk값</returns>

    Public Function Chunk_ReadStream(Stream As StreamAs List(Of Section)

        '스트림 읽기에 관련된 함수가 있는 BinaryReader를 생성한다.

        Dim Reader As New BinaryReader(Stream)

        Dim Chunk As New List(Of Section)

        '스트림이 끝날때 까지 반복

        While Stream.Position < Stream.Length

            Dim Section As Section

            Dim Size As Integer

            '스트림에서 구휙의 이름을 읽어들임 (4바이트 문자열)

            Section.Name = Encoding.Default.GetString(Reader.ReadBytes(4))

            '스트림에서 구휙의 크기를 읽어들임 (4바이트 정수)

            Size = Reader.ReadInt32()

            '메모리를 사용하기 위해 MemoryStream을 생성한다.

            Section.Data = New MemoryStream()

            If Size > 0 Then '만일 크기가 0이하면 할당 할 수 없기 때문에 예외 처리

                '스트림에서 내용을 읽어서 작성한다.

                Section.Data.Write(Reader.ReadBytes(Size), 0, Size)

            Else

                '스트림을 Size만큼 이동시킨다.

                Stream.Position += Size

            End If

            '읽어들인 구휙을 리스트에 넣는다

            Chunk.Add(Section)

        End While

        '읽어들인 Chunk를 반환

        Return Chunk

    End Function

 

    ''' <summary>파일에 Chunk를 작성하는 함수.</summary>

    ''' <param name="Chunk">작성할 Chunk 내용.</param>

    ''' <param name="FileName">Chunk를 작성할 파일 경로.</param>

    Public Sub Chunk_WriteFile(Chunk As List(Of Section), FileName As String)

        '쓰기 전용으로 파일 스트림을 연다. (이어서 작성하기를 원하면 Append를 사용해도 된다)

        Dim FS As New FileStream(FileName, FileMode.Create, FileAccess.Write)

        Chunk_WriteStream(Chunk, FS)

        FS.Close()  '사용한 파일 스트림을 닫음

    End Sub

 

    ''' <summary>스트림에 Chunk를 작성하는 함수.</summary>

    ''' <param name="Chunk">작성할 Chunk 내용.</param>

    ''' <param name="Stream">Chunk를 작성할 스트림.</param>

    Public Sub Chunk_WriteStream(Chunk As List(Of Section), Stream As Stream)

        '스트림 작성에 관련된 함수가 있는 BinaryWriter를 생성한다.

        Dim Writer As New BinaryWriter(Stream, Encoding.ASCII)

        '각 섹션을 반복

        For Each Section In Chunk

            '스트림의 이름을 바이트 값으로 변환

            Dim Name = Encoding.Default.GetBytes(Section.Name)

            '스트림 이름이 4바이트가 아녈 경우를 위한 예외 처리

            If Not Name.Length = 4 Then Array.Resize(Of Byte)(Name, 4)

            '스트림에 구휙 이름을 작성

            Writer.Write(Name)

            '스트림에 구휙 크기를 작성 (스트림의 Length는 8바이트이므로 변환)

            Writer.Write(CInt(Section.Data.Length))

            '스트림에 구휙 내용을 작성

            Section.Data.WriteTo(Stream)

        Next

    End Sub

End Module

 

[Chunk의 읽기와 작성]


주석 덕분에 코드가 길어보이지만 실제로는 그리 길지 않다.

파일 또한 올려놓을테니 가져가서 원하는 대로 사용해도 좋다.

Chunk.vb




'Starcraft > scenario.chk' 카테고리의 다른 글

스타크래프트 chk의 구조  (1) 2016.12.16
posted by 자칭 프로그래머ㅡ ModMapper

SMC Recover [SMC 언프로텍터]

Starcraft/StarCraft Files 2016.04.24 18:15
  • 실행이 안돼요..

    JN`OoBo 2016.05.13 05:59
  • 네이버 에닥카페에 댓글 확인해주세요. 여긴 사진 첨부가 안된거가틈

    JN`OoBo 2016.05.13 17:04
  • 비밀댓글입니다

    2016.05.15 23:08
  • 비밀댓글입니다

    2016.05.16 11:24
  • 아... 죄송한데 다시 한번 해주실수없을까요.. 이제보니까 버전이 틀려서;

    JN`OoBo 2016.05.28 03:47
  • 댓글하나하나 일일히 답변해주시는걸 보니 정말로 친절하신분이군요1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    ㅁㅍㅅㅇㅅ 2016.09.08 20:01
  • SMC 2.77로 프로텍트 건 파일을 언프로텍트 시도하면 Map not protected라고 뜹니다. 로그 확인해보니 " Pro"단락을 읽는 (아마) 오류가 있는걸로 보입니다.

    오류 2017.06.20 11:30
  • 비밀댓글입니다

    2018.05.28 10:13
  • 바이러스 검출됨

    ㅇㅇ 2018.07.01 13:38



SMC를 언프로텍트 하는 프로그램입니다

다른 프로텍터의 언프로텍트는 지원하지 않습니다


사용법

프로그램을 그냥 실행시키거나 맵 파일을 드래그하세요


명령줄

SMCRecover [파일 위치] [저장 위치] -comp [사운드 압축률] -output [로그 파일]

SMCRecover -open [파일 위치] -save [저장 위치] -comp [사운드 압축률] -output [로그 파일]


SMCRecover.exe


'Starcraft > StarCraft Files' 카테고리의 다른 글

Map Compressor - 스타크래프트 맵 압축 프로그램  (8) 2017.06.24
SMC Recover [SMC 언프로텍터]  (14) 2016.04.24
MPQ Repair 1.1.0  (6) 2012.03.24
posted by 자칭 프로그래머ㅡ ModMapper

솔직히 SMC 언프로텍트 말입니다

그거 개나소나 다 할수 있는거 아녜요?

별로 뭐 프로텍션 딱히 걸려있는것도 아니고 뚫기 쉽던데


왜 다들 강하다고 하는거 같지

'Starcraft > ModMapper's StarCraft' 카테고리의 다른 글

솔직히 SMC 언프로텍트 말입니다  (0) 2016.04.22
posted by 자칭 프로그래머ㅡ ModMapper

MPQ Repair 1.1.0

Starcraft/StarCraft Files 2012.03.24 21:56

<특징>

걍 MPQP 깨는용 다른거에는 중점을 안둿지만 열릴듯 ㅇㅇ;



'Starcraft > StarCraft Files' 카테고리의 다른 글

Map Compressor - 스타크래프트 맵 압축 프로그램  (8) 2017.06.24
SMC Recover [SMC 언프로텍터]  (14) 2016.04.24
MPQ Repair 1.1.0  (6) 2012.03.24
posted by 자칭 프로그래머ㅡ ModMapper