]> git.pond.sub.org Git - empserver/blob - tests/actofgod/geninput.pl
setsector: Don't disclose number of landmines to occupier
[empserver] / tests / actofgod / geninput.pl
1 #!/usr/bin/perl
2
3 # Assumed initial state:
4 # nats POGO, 1..5, $MAXNOC-1
5 # sects
6 #     x>0,y>0   own 1
7 #     x<-1,y>0  own 2
8 #     x>0,y<0   own 3
9 #     x<-1,y<0  own 0
10 #     all wilderness, rest sea
11 #     owned sectors have 1m 1c
12 # units 5 cs #0..4, 5 f1 #0..4, 5 sup #0..4, all in 1,-1 owned by 3
13
14 use warnings;
15 use strict;
16
17 my $MAXNOC = 99;
18 my $xmax = 31;
19 my $ymax = 15;
20 my $STAT_GOD = 5;
21 my $INT_MAX = 0x7fffffff;
22 my $INT_MIN = -$INT_MAX - 1;
23
24 my %ef2edit = (
25     sect => 'l',
26     ship => 's',
27     plane => 'p',
28     land => 'u',
29     nuke => 'n',
30     nat => 'c',
31 );
32
33 my %edit2setres = (
34     i => 'i',
35     g => 'g',
36     c => 'o',
37     f => 'f',
38     u => 'u',
39 );
40
41 my %edit2setsect = (
42     o => 'ow',
43     O => 'ol',
44     i => 'i',
45     g => 'g',
46     c => 'oi',
47     e => 'e',
48     M => 'mi',
49     m => 'mo',
50     a => 'a',
51     w => 'w',
52     f => 'f',
53     u => 'u',
54 );
55
56 sub edit {
57     my ($ef, $id, $key, @rest) = @_;
58     my $args = join(' ', @rest);
59     print "edit $ef2edit{$ef} $id $key $args\n";
60 }
61
62 sub iedit {
63     my ($ef, $id, @rest) = @_;
64     print "edit $ef2edit{$ef} $id\n";
65     for my $inp (@rest) {
66         print "$inp\n";
67     }
68     print "\n";
69 }
70
71 sub next_id {
72     my ($ef, $id) = @_;
73     if ($ef ne 'sect') {
74         return $id + 1;
75     }
76     my ($x, $y) = split /,/, $id;
77     $x += 2;
78     return "$x,$y";
79 }
80
81 sub edit_int1 {
82     my ($ef, $id, $key, $lob, $upb) = @_;
83     edit($ef, $id, $key, $lob);
84     $id = next_id($ef, $id);
85     edit($ef, $id, $key, $lob - 1)
86         if ($lob > $INT_MIN);
87     $id = next_id($ef, $id);
88     edit($ef, $id, $key, $upb);
89     $id = next_id($ef, $id);
90     edit($ef, $id, $key, $upb + 1)
91         if ($upb < $INT_MAX);
92 }
93
94 sub edit_int {
95     my ($ef, $id, @rest) = @_;
96     for my $it (@rest) {
97         edit_int1($ef, $id, @$it);
98     }
99 }
100
101 sub setres {
102     my ($id, $key, $val) = @_;
103     print "setres $key $id $val\n";
104 }
105
106 sub setsect {
107     my ($id, $key, $val) = @_;
108     print "setsect $key $id $val\n";
109 }
110
111 sub give {
112     my ($id, $key, $val) = @_;
113     print "give $key $id $val\n";
114 }
115
116 sub swaps {
117     my ($id1, $id2) = @_;
118     print "swaps $id1 $id2\ny\n";
119 }
120
121 ## Sector
122
123 # invalid key
124 edit('sect', '0,0', '@', 0);
125 setres('0,0', '@', 0);
126 setsect('0,0', '@', 0);
127 give('0,0', '@', 0);
128
129 # own oldown che_target
130 for my $key ('o', 'O', 'X') {
131     edit('sect', '1,7', $key, 0);
132     edit('sect', '1,7', $key, -1);
133     edit('sect', '3,7', $key, $MAXNOC - 1);
134     edit('sect', '3,7', $key, $MAXNOC);
135 }
136 edit('sect', '5,7', 'o', 2);
137 for my $key ('ow', 'ol') {
138     setsect('7,7', $key, 0);
139     setsect('7,7', $key, -1);
140     setsect('9,7', $key, $MAXNOC - 1);
141     setsect('9,7', $key, $MAXNOC);
142 }
143 setsect('11,7', 'ow', 2);
144
145 # x,y (copy)
146 edit('sect', '1,7', 'L', '1,-7');
147 edit('sect', '3,-7', 'L', '3,-7', 'L', '1,0');
148
149 # effic mobil iron gmin fertil oil uran work loyalty che pstage ptime
150 # fallout avail mines road rail defense
151 sub sect_int {
152     for my $it (@_) {
153         my ($key, $lob, $upb) = @$it;
154         edit_int1('sect', '1,1', $key, $lob, $upb);
155         my $rkey = $edit2setres{$key};
156         if (defined $rkey) {
157             $upb = 100;
158             setres('2,2', $rkey, $lob);
159             setres('4,2', $rkey, $lob - 1);
160             setres('6,2', $rkey, $upb);
161             setres('8,2', $rkey, $upb + 1);
162         }
163         my $skey = $edit2setsect{$key};
164         if (defined $skey) {
165             setsect('1,3', $skey, $INT_MIN);
166             setsect('3:7,3', $skey, 1);
167             setsect('5,3', $skey, $INT_MAX);
168             setsect('7,3', $skey, -1);
169         }
170     }
171 }
172 sect_int(
173     ['e', 0, 100],
174     ['m', -127, 127],
175     ['i', 0, 127],
176     ['g', 0, 127],
177     ['f', 0, 127],
178     ['c', 0, 127],
179     ['u', 0, 127],
180     ['w', 0, 100],
181     ['l', 0, 127],
182     ['x', 0, 255],
183     ['p', 0, 4],
184     ['t', 0, 32767],
185     ['F', 0, 9999],
186     ['a', 0, 9999],
187     ['M', 0, 32767],
188     ['R', 0, 100],
189     ['r', 0, 100],
190     ['d', 0, 100],
191 );
192
193 # special case: mines in occupied sector
194 setsect('1:3,-3', 'ol', 1);
195 setsect('1,-3', 'mi', 1);
196 edit('sect', '3,-3', 'M', 1);
197
198 # dist
199 edit('sect', '2,4', 'D', '4,4');
200 edit('sect', '4,4', 'D', '4,4');
201
202 # des newdes
203 for my $key ('s', 'S') {
204     edit('sect', '6,4', $key, '+');
205     edit('sect', '6,4', $key, '+');
206     edit('sect', '8,4', $key, '+');
207     edit('sect', '8,4', $key, ',');
208 }
209
210 # multiple arguments
211 edit('sect', '1,5', 'm', 1, 'a', 1);
212
213 # interactive edit
214 iedit('sect', '3,5', 'm 2', 'a 1');
215 iedit('sect', '5,5', ' ');
216
217 # give
218 give('2,6', 'l', $INT_MIN);
219 give('4:8,6', 'c', 1);
220 give('6,6', 'c', $INT_MAX);
221 give('8,6', 'c', -1);
222
223 # swapsector
224 swaps('-2,2', '2,-2');
225
226 ## Ship, plane, land unit
227
228 for my $ef ('ship', 'plane', 'land') {
229     # invalid key
230     edit($ef, 0, '@', 0);
231     # own
232     edit($ef, 0, 'O', 0);
233     edit($ef, 0, 'O', -1);
234     edit($ef, 1, 'O', $MAXNOC - 1);
235     edit($ef, 1, 'O', $MAXNOC);
236     edit($ef, 2, 'O', 2);
237     # uid (copy)
238     edit($ef, 3, 'U', 5, 'U', 3);
239     edit($ef, 0, 'U', 0, 'U', -1);
240     # x,y
241     my $key = $ef eq 'plane' ? 'l' : 'L';
242     edit($ef, 2, $key, '3,-1');
243     edit($ef, 3, $key, '1,-1');
244 }
245
246 # ship: effic mobil tech pstage ptime milit
247 edit_int('ship', 2, (
248     ['E', 0, 100],
249     ['M', -127, 127],
250     ['T', 0, 32767],
251     ['a', 0, 4],
252     ['b', 0, 32767],
253     ['m', 0, 50],
254 ));
255
256 # plane: effic mobil range tech
257 edit_int('plane', 2, (
258     ['e', 0, 100],
259     ['m', -127, 127],
260     ['r', 0, 9],
261     ['t', 50, 32767],
262 ));
263
264 # land: effic mobil tech harden retreat milit
265 edit_int('land', 2, (
266     ['e', 0, 100],
267     ['M', -127, 127],
268     ['t', 50, 32767],
269     ['F', 0, 127],
270     ['Z', 0, 100],
271     ['m', 0, 25],
272 ));
273
274 # fleet, wing, army
275 sub unit_group {
276     my ($ef, $key) = @_;
277     edit($ef, 2, $key, '~');
278     edit($ef, 3, $key, 'a');
279 }
280 unit_group('ship', 'F');
281 unit_group('plane', 'w');
282 unit_group('land', 'a');
283
284 # rpath, rflags
285 for my $ef ('ship', 'land') {
286     edit($ef, 2, 'R', '""');
287     edit($ef, 3, 'R', 'jj');
288     # Take care to have only valid bits set in final state
289     edit($ef, 2, 'W', 0, 'W', 1);
290     edit($ef, 3, 'W', 513, 'W', 1030, 'W', 2);
291 }
292
293 # plane: flags
294 # Take care to have only valid bits set in final state
295 edit('plane', 2, 'f', 4);
296
297 # carrier
298 sub unit_carrier {
299     my ($ef, $skey, $pkey) = @_;
300     edit($ef, 2, $skey, -1, $skey, 9999);
301     edit($ef, 3, $skey, 3);
302     edit($ef, 4, $skey, 4, $pkey, 4);
303 }
304 unit_carrier('plane', 's', 'y');
305 unit_carrier('land', 'S', 'Y');
306
307 # interactive edit
308 iedit('ship', 0, 'M 2', 'm 1', 'f 1');
309 iedit('ship', 0, 'R n', 'R ""');
310 iedit('plane', 0, 'm 2', 'y -1');
311 iedit('land', 0, 'M 2', 'Y -1');
312
313 ## Nation
314
315 # invalid key
316 edit('nat', 0, '@', 0);
317
318 # btus reserve timeused money
319
320 edit_int('nat', 1, (
321     ['b', 0, 640],
322     ['m', 0, 2147483647],
323     ['u', 0, 86400],
324     ['M', -2147483648, 2147483647],
325 ));
326
327 # tgms
328 # Take care to use ones that won't receive further telegrams
329 edit('nat', 6, 't', -1);
330 edit('nat', 7, 't', 65536);
331
332 # tlev rlev elev hlev
333 for my $key ('T', 'R', 'E', 'H') {
334     edit('nat', 1, $key, 3.14);
335     edit('nat', 2, $key, 100);
336     edit('nat', 3, $key, -1);
337 }
338
339 # cnam
340 edit('nat', 1, 'n', 'POGO');
341 edit('nat', 2, 'n', '2');
342 edit('nat', 3, 'n', 'drei');
343
344 # pnam
345 edit('nat', 1, 'r', 1);
346 edit('nat', 2, 'r', '012345678901234567890123456789');
347
348 # xcap,ycap xorg,yorg
349 for my $key ('c', 'o') {
350     edit('nat', 1, $key, '0,0');
351     edit('nat', 2, $key, '2,0');
352 }
353
354 # status
355 # Refs to nats with status 0 are invalid, take care to use
356 # unreferenced ones for that
357 edit('nat', 6, 's', 0);
358 edit('nat', 7, 's', -1);
359 edit('nat', 4, 's', $STAT_GOD);
360 edit('nat', 5, 's', $STAT_GOD + 1);
361
362 # interactive edit
363 iedit('nat', 5, 'b 640', 'T 1');
364
365 ## Epilog: read telegrams (they're not in xdump)
366 for my $cnum (0, 1, 2, 3, 4, 5, 98) {
367     print "read $cnum\n";
368 }