use strict; use warnings; use File::Find; my $dir = '../../../binaries/data/mods/official/entities'; my @xml; find({wanted=>sub{ push @xml, $_ if /\.xml$/; }, no_chdir=>1}, $dir); s~\Q$dir/~~ for @xml; my %nodes; for my $f (@xml) { $f =~ m~(?:.*/|^)(.*)\.xml~ or die "invalid filename $f"; my $name = $1; open I, "$dir/$f" or die "error opening $dir/$f: $!"; my $data = do { local $/; }; close I; my $parent; $parent = $1 if $data =~ /Parent="(.*?)"/; my ($upgrade, $rank); $upgrade = $1 if $data =~ /Up.*newentity="(.*?)"/s; $rank = $1 if $data =~ /Up.*rank="(.*?)"/s; my $actor; $actor = $1 if $data =~ /\s*(.*?)\s*1, parent=>$parent, upgrade=>[$upgrade, $rank], actor=>$actor }; } open O, ">", "entities.dot" or die $!; print O < "$_";\n} if defined $nodes{$_}{parent}; } print O "\n /* upgrade edges */\n"; print O " edge [color=red fontcolor=red]\n"; for (sort keys %nodes) { if (defined $nodes{$_}{upgrade}[0]) { print O qq{ "$_" -> "$nodes{$_}{upgrade}[0]"}; print O qq{ [label="from rank $nodes{$_}{upgrade}[1]"]} if defined $nodes{$_}{upgrade}[1]; print O qq{;\n}; } } print O "}\n"; close O; system("dot.exe", "-Tpng", "entities.dot", "-o", "entities.png");