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
|
#!/usr/bin/perl
use strict;
#This util generates a graph of all the levels in the levels folder.
#run using "perl utils/graph-levels.pl | dot -Tpng > out.png" in the root frogatto folder. Outputs to out.png to cwd.
# appending --show_music after utils/graph-levels.pl will write the song used in each level, under the level's name
my $show_music = 0;
while(my $arg = shift @ARGV) {
if($arg eq '--show_music') {
$show_music = 1;
} else {
die "Unrecognized argument: $arg";
}
}
my @levels = glob("data/level/*");
my %index = ();
my $index = 1;
print qq~digraph "frogatto" {
node [width=1.0,height=1.0];
~;
my @adj = ();
foreach my $level (@levels) {
open LVL, "<$level" or die;
$level =~ s/.*\///;
$index{$level} = $index;
my $door = '';
my $saves = 0;
my $music = '';
while(my $line = <LVL>) {
if(my ($toilet) = $line =~ /type="(save_toilet|dungeon_save_door)"/) {
++$saves;
}
if(my ($label) = $line =~ /label="(.*)"/) {
$door = $label;
}
if(my ($song_name) = $line =~ /music="(.*)"/) {
$music = $song_name;
}
if(my ($next_level) = $line =~ /next_level="(.*)"/) {
push @adj, [$level, $next_level, 'next_level'];
}
if(my ($previous_level) = $line =~ /previous_level="(.*)"/) {
push @adj, [$level, $previous_level, 'prev_level'];
}
if(my ($dest_level) = $line =~ /dest_level="'(.*)'"/) {
push @adj, [$level, $dest_level, $door];
}
}
close LVL;
my $label = $level;
$label .= " (save)" if $saves == 1;
$label .= " ($saves saves)" if $saves > 1;
if($show_music){
$label .= "\\n";
$label .= $music;
}
print qq~N$index [label="$label",shape=box,fontsize=12];\n~;
++$index;
}
foreach my $adj (@adj) {
my ($src, $dst, $door) = @$adj;
my ($a, $b) = ($index{$src}, $index{$dst});
print qq~N$a -> N$b [label="$door", weight=1, style="setlinewidth(1.0)"];\n~
if $a and $b;
}
print "}";
|