-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAllWater.cpp
More file actions
168 lines (129 loc) · 3.36 KB
/
AllWater.cpp
File metadata and controls
168 lines (129 loc) · 3.36 KB
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DESCRIPTION "Adds a flat water layer at the given height or 0."
#define ARGUMENTS "<map filename> [<level: 0>] [<flags: 20>]"
#define USAGE( minimumArguments, argc, argv ) \
if( argc < minimumArguments + 1 ) \
{ \
printf( " %s\n", argv[0] ); \
printf( " " DESCRIPTION "\n\n" ); \
printf( " Usage: \"%s " ARGUMENTS "\"\n", argv[0] ); \
printf( " Built at: " __DATE__ "\n" ); \
return -1; \
}
FILE *Input;
int XOffset,YOffset;
float WaterLevel;
/*
MCNK
0x14 MCVT Offset
0x18 MCNR Offset
0x1C MCLY Offset
0x20 MCRF Offset
0x24 MCAL Offset
0x2C MCSH Offset
0x58 MCSE Offset
0x60 MCLQ Offset
0x68 Z' Base Coordinate
0x6C X' Base Coordinate
0x70 Y Base Coordinate
*/
struct MCIN{
unsigned int Offset;
unsigned int Size;
unsigned int Temp1;
unsigned int Temp2;
};
unsigned int MDDF_Offset;
unsigned int MODF_Offset;
MCIN *Positions;
unsigned int MCLQ_Positions[256];
unsigned int MCSE_Positions[256];
char *File;
unsigned int FileSize;
char *NewFile;
unsigned int NewFileSize;
unsigned int Change;
unsigned char Flag;
void FindMCNKs()
{
Positions=(MCIN *)(File+92);
}
void FindMCLQ()
{
for (int i=0;i<256;i++)
{
MCLQ_Positions[i]=*((unsigned int *)(File+Positions[i].Offset+0x60+8))+Positions[i].Offset;
MCSE_Positions[i]=*((unsigned int *)(File+Positions[i].Offset+0x58+8))+Positions[i].Offset;
}
}
void FixMCLQ()
{
float *TFloat;
unsigned int *TInt;
for (int i=0;i<256;i++)
{
TFloat=(float *)(NewFile+MCLQ_Positions[i]+Change+8);
*TFloat=WaterLevel;
for(int j=0;j<81;j++)
{
TFloat=(float *)(NewFile+MCLQ_Positions[i]+Change+8+4+j*8);
*TFloat=WaterLevel;
TInt=(unsigned int *)(NewFile+MCLQ_Positions[i]+Change+8+4+j*8+4);
*TInt=0xFF;
}
TFloat=(float *)(NewFile+MCLQ_Positions[i]+Change+8+652);
*TFloat=WaterLevel;
memset(NewFile+MCLQ_Positions[i]+Change+8+656,Flag,64);
memset(NewFile+MCLQ_Positions[i]+Change+8+656+64,0,84);
int Num;
Positions[i].Offset=Positions[i].Offset+Change;
TInt=(unsigned int *)(NewFile+Positions[i].Offset+8);
*TInt=5;
TInt=(unsigned int *)(NewFile+Positions[i].Offset+8+0x64);
*TInt=812;
TInt=(unsigned int *)(NewFile+Positions[i].Offset+8+0x58);
*TInt+=812-(MCSE_Positions[i]-MCLQ_Positions[i]);
Change+=812-(MCSE_Positions[i]-MCLQ_Positions[i]);
if (i!=255)
Num=MCLQ_Positions[i+1]-MCSE_Positions[i]+8;
else
Num=8;
memcpy(NewFile+MCSE_Positions[i]+Change,File+MCSE_Positions[i],Num);
}
}
int main(int argc, char **argv)
{
USAGE( 1, argc, argv );
char *replace;
int i,len;
if(argc>2)
WaterLevel=atof(argv[2]);
else
WaterLevel=0;
if(argc>3)
Flag=(unsigned char)(atoi(argv[3])%256);
else
Flag=0x14;
printf("Setting Water Level of %s to %.2f\n",argv[1],WaterLevel);
Input=fopen(argv[1],"rb+");
fseek(Input,0,SEEK_END);
FileSize=ftell(Input);
NewFileSize=FileSize;
File=new char[FileSize];
NewFile=new char[FileSize+804*256];
fseek(Input,0,SEEK_SET);
fread(File,1,FileSize,Input);
fclose(Input);
Change=0;
FindMCNKs();
FindMCLQ();
FixMCLQ();
memcpy(NewFile,File,MCLQ_Positions[0]+8);
Input=fopen(argv[1],"wb");
fwrite(NewFile,1,FileSize+Change,Input);
fclose(Input);
delete File;
delete NewFile;
}