View difference between Paste ID: aDfX5KSs and 7PGq8Eyw
SHOW: | | - or go back to the newest paste.
1
/* ManRNG - a cross-platform command-line RNG generator for Pokémon games
2
 (c) M.andrew 2012
3
4
 This utility provides the user with access to the full range of RNG
5
 operations available in the popular Pokémon series of games, allowing
6
 him to find shiny and/or flawless Pokémon no matter what type of computer
7
 he is using. By default, positive results are send to stdout in CSV format,
8
 allowing them to be easily piped into bash text manipulation utilities
9
 or simply saved directly into text files.
10
11
 The ultimate goal of this program is to match the seed-generation capabilities
12
 of the widely-known RNG Reporter utility for Windows while supporting all
13
 of its major file formats, including the XML profiles of the alpha-stage
14
 RNGR 9.96. Once this goal is realized and a standarized format for args
15
 is set in place, I foresee writing frontends for the program to improve
16
 its ease of use for the public.
17
*/
18-
#include <stdio.h>
18+
#include <cstdio>
19
#include <cstdlib>
20-
#include <iostream>
20+
#include <cstring>
21
22
#include "researcher.h"
23
#include "thirdgen.h"
24
#include "fourthgen.h"
25
#include "fifthgen.h"
26
27
enum ERROR_CODES {
28
	ERR_NOARGS   = 1,
29
	ERR_NOMETHOD,
30
	ERR_FALSEARGS,
31
	ERR_3GNOSUPPORT,
32
	ERR_4GNOSUPPORT,
33
	ERR_5GNOSUPPORT,
34
	ERR_UNKNOWN  = 255,
35
};
36-
int MethodLen (char* Method) {
36+
37-
	int counter = 0;
37+
38-
	do
38+
39
	char MethodSwitch;
40-
		counter++=Method++;
40+
	size_t ArgLen = strlen(Method);
41
	if (ArgLen < 2)
42-
	while (Method != NULL)
42+
43-
	return counter;
43+
		fprintf(stderr,"Method string must be at least 2 chars!\n");
44
		exit(ERR_NOMETHOD);
45
	}
46
	else if (ArgLen == 2)
47
	{
48
		MethodSwitch = Method[1];
49-
	int ArgLen = MethodLen(Method);
49+
50
	else	
51
	{
52-
		fprintf(stderr,"Method string must be at least 2 chars!");
52+
53
		// them into single-char options and let them
54
		// gracefully descend through the control flow
55
		
56
		// options supported:	
57
		// -t [--timefinder]
58
		// -p [--pandora]
59-
	char LongOpSwitch = Method[1]++;
59+
60-
	if (LongOpSwitch == '-')
60+
61
		// -m [--seed2time]
62
		// -r [--parameters]
63
		// -q [--noclue]
64
		int LongArgLen = static_cast<int>(ArgLen-2); // -2 to account for the two hyphens
65
		char* LongOpName = new char[LongArgLen];
66
		for (int i = 0; i >= LongArgLen; ++i)
67
		{
68
			LongOpName[i] = Method[i+2];
69
		}
70
		if      (LongOpName == "timefinder")     { MethodSwitch = 't'; }
71
		else if (LongOpName == "pandora")        { MethodSwitch = 'p'; }
72
		else if (LongOpName == "pidfromivs")     { MethodSwitch = 'v'; }
73-
		char* LongOpName = new char[ArgLen-2];
73+
74-
		for (int i = 0, i >= ArgLen-2, i++)
74+
75
		else if (LongOpName == "parameters")     { MethodSwitch = 'r'; }
76
		else if (LongOpName == "noclue")         { MethodSwitch = 'q'; }
77
		else
78
		{
79
			fprintf(stderr,"Long method name unrecognized!\n");
80
			delete[] LongOpName;
81
			exit(ERR_NOMETHOD);
82
		}
83
		delete[] LongOpName;
84
	}
85
	// Now that we're here, we should 
86-
			fprintf(stderr,"Long method name unrecognized!")
86+
87
	{
88
		case '3':
89
			// options supported:
90
			// -t [--timefinder]
91
			// -p [--pandora]
92-
		case 3:
92+
93
			{
94
				case 't':
95
					TimeFinderThird();
96
					break;
97
				case 'p':
98
					PandoraThird();
99
					break;
100
				default:
101
					fprintf(stderr,"Unsupported method for third generation RNG.\n");
102
					exit(ERR_3GNOSUPPORT);
103
			}
104
		break;
105-
					fprintf(stderr,"Unsupported method for third generation RNG.");
105+
106
		case '4':
107
			// options supported:
108-
		case 4:
108+
109
			// -v [--pidfromivs]
110
			// -c [--chainsidfinder]
111
			// -m [--seed2time]
112
			// -p [--pandora]
113
			switch (MethodSwitch)
114
			{
115
				case 't':
116
					TimeFinderFourth();
117
					break;
118
				case 'v':
119
					PidFromIVsFourth();
120
					break;
121
				case 'c':
122
					ChainSIDFinderFourth();
123
					break;
124
				case 'm':
125
					Seed2TimeFourth();
126
					break;
127
				case 'p':
128
					PandoraFourth();
129
					break;
130
				default:
131
					fprintf(stderr,"Unsupported method for fourth generation RNG.\n");
132
					exit(ERR_5GNOSUPPORT);
133-
					fprintf(stderr,"Unsupported method for fourth generation RNG.");
133+
134
			}
135
		break;
136-
		case 5:		
136+
137
		case '5':		
138
			// options supported:
139
			// -t [--timefinder]
140
			// -r [--parameters]
141
			// -m [--seed2time] (c-gear)
142
			// -p [--pandora]
143
			switch (MethodSwitch)
144
			{
145
				case 't':
146
					TimeFinderFifth();
147
					break;
148
				case 'r':
149
					ParamSearchFifth();
150
					break;
151
				case 'm':
152
					Seed2TimeFifth();
153
					break;
154
				case 'p':
155
					PandoraFifth();
156
					break;
157-
					fprintf(stderr,"Unsupported method for fifth generation RNG.");
157+
158
					fprintf(stderr,"Unsupported method for fifth generation RNG.\n");
159
					exit(ERR_5GNOSUPPORT);
160
					break;
161
			}
162
		break;
163
164
		case 'r':
165
			// options supported:
166
			// -q [--noclue]
167
			switch (MethodSwitch)
168-
		fprintf(stderr,"ManRNG cannot function without any arguments!");
168+
169
				case 'q':
170
					Researcher();
171
					break;
172
				default:
173
					fprintf(stderr,"I have no idea what modes Researcher should support. But not that one!\n");
174-
	if (GenFlag == '3' || GenFlag == '4' || GenFlag == '5')
174+
					exit(ERR_UNKNOWN);
175
					break;
176
			}
177-
		if (MethodSearch == "")
177+
		break;
178
		
179-
			fprintf(stderr,"ManRNG requires a method as its second argument.");
179+
		default:
180
			fprintf(stderr,"This error should never happen. Consult Mandrew for advice.\n");
181
			exit(ERR_UNKNOWN);
182
			break;
183
	}
184-
	else if (GenFlag == 'r')
184+
185
}
186-
		Researcher();
186+
187
int main(int argc, char* argv[])
188
{
189
	if (argv[1] == NULL)
190-
		fprintf(stderr,"ManRNG requires -3, -4, -5, or -r as its first argument.");
190+
191
		fprintf(stderr,"ManRNG cannot function without any arguments!\n");
192
		exit(ERR_NOARGS);
193
	}
194
	
195
	char GenFlag = argv[1][1]; //this should be a 3, 4, or 5
196
	char* MethodSearch;
197
	if (GenFlag == '3' || GenFlag == '4' || GenFlag == '5' || GenFlag == 'r')
198
	{
199
		MethodSearch = argv[2];
200
		if (MethodSearch == NULL) 
201
		{
202
			fprintf(stderr,"ManRNG requires a method as its second argument.\n");
203
			exit(ERR_NOMETHOD);
204
		}
205
		RNGMethodHandler(static_cast<int>(GenFlag),MethodSearch);
206
	}
207
	else if (GenFlag == 'v')
208
	{
209
		printf("ManRNG version 0.01\n");
210
	}
211
	else
212
	{
213
		fprintf(stderr,"ManRNG requires -3, -4, -5, -r, or -v as its first argument.\n");
214
		exit(ERR_FALSEARGS);
215
	}
216
}