aboutsummaryrefslogtreecommitdiff
path: root/mklevelinfo.pl
blob: 376651f9faa13b0e98fef4837c74f918038ce9c9 (plain)
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
#!/usr/bin/perl -w

%struct = (
	0 => [ 2, 'desc', "first 2 bytes are level number in screencodes" ],
	2 => [ 2, 'sub0', "a subroutine" ],
	4 => [ 2, 'sub1', "a subroutine" ],
	6 => [ 2, 'sub2', "a subroutine" ],
	8 => [ 2, 'sub3', "a subroutine" ],
	10 => [ 1, 'num_bombs', "number of bombs to pick up on this level" ],
	11 => [ 1, 'bullet_chance', '0 = no bullets' ],
	12 => [ 1, 'y_start', 'jumpman starting Y position' ],
	13 => [ 1, 'x_start', 'jumpman starting X position' ],
	14 => [ 2, 'offs', 'points to $0600' ],
	16 => [ 1, 'points_per_bomb', 'points awarded per bomb pickup (always $64 aka 100)' ],
	17 => [ 2, 'time_bonus', 'amount of time bonus at start of level' ],
	19 => [ 1, 'offs', 'always $00' ],
	20 => [ 2, 'unkn_table0', 'pointer to ROM table or $06xx' ],
	22 => [ 2, 'map0', 'map data' ],
	24 => [ 2, 'map1', 'map data' ],
	26 => [ 2, 'map2', 'map data' ],
	28 => [ 2, 'unkn_table1', 'unknown, pointer to a ROM table or $0000' ],
	30 => [ 2, 'offs', 'always $0000' ],
	32 => [ 2, 'sub_bomb', 'called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine' ],
	34 => [ 2, 'sub_start', 'called at start of level, $06E6 for some levels, or else a ROM subroutine' ],
	36 => [ 2, 'sub6', 'always $9740 aka game_main_loop' ],
	38 => [ 2, 'sub_eol', 'called at end of level (all bombs picked up). $06E6 for all but level07' ],
	40 => [ 6, 'offs', 'all zeroes' ],
	46 => [ 9, 'offs', 'unknown' ],
	55 => [ 3, 'offs', 'unknown, always $00 $00 $00' ],
	58 => [ 2, 'offs', 'unknown, not a ROM address' ],
	60 => [ 4, 'offs', 'unknown, level05 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00' ],
);

sub mkaddr {
	return sprintf("\$%04x", $_[0]);
}

sub mknum {
	return sprintf("%02d", $_[0]);
}

sub mkrange {
	my ($level, $label, $start, $len, $type, $comment) = @_;
	my $sa = mkaddr($start);
	my $ea = mkaddr($start + $len - 1);
	my $llab;
	if($level >= 0) {
		my $ll = sprintf("%02d", $level);
		$llab = "level$ll";
	} else {
		if($level == -609) {
			$llab = "cur_level";
		} else {
			$llab = "work_level";
		}
		my $l = <<EOF;
label { name "${llab}_$label"; addr $sa; size $len; comment "$comment"; };
EOF
		return $l;
	}
	my $range = <<EOF;
range { name "${llab}_$label"; start $sa; end $ea; type $type; comment "$comment"; };
EOF
	return $range;
}

for $level (-610,-609,0..11) {
	$addr = 0xa000 + $level * 0x40;
	for $offset (sort { $a <=> $b } keys %struct) {
		my ($size, $label, $comment) = @{$struct{$offset}};
		if($level == 0 && $offset == 0) {
			$comment = "64-byte level descriptors, 12 of them (1 per level). " . $comment;
		}

		$type = 'bytetable';
		if(($label =~ /^sub/) or ($label =~ /^map/) or ($label =~ /^unkn_table/)) {
			$type = 'addrtable';
		}

		if($label eq 'time_bonus') {
			$type = 'wordtable';
		}

		if($label eq 'offs') {
			$label .= "_" . mknum($offset);
		}

		print mkrange($level, $label, $addr + $offset, $size, $type, $comment);
	}
	print "\n";
}