#!/opt/bin/perl use Crossfire::Map; use Storable; use POSIX; use Gtk2 -init; { open my $fh, "<:raw", "mask.bin" or die; sysread $fh, $mask, 1500*1500*4 or die } { open my $fh, "<:raw", "type.bin" or die; sysread $fh, $type, 1500*1500*4 or die } my %type = ( deep_sea => "#006", sea => "#008", shallow_sea => "#00a", beach => "#aa0", dunes => "#bb0", desert => "#cc0", steppe => "#880", steppelight => "#dd7", small_stones => "#eeb", marsh => "#0f8", grass => "#0f0", grassmedium => "#0e0", grassbrown => "#851", grassdark => "#274", desert => "#cc0", darkforest => "#040", evergreens => "#0a0", woods => "#080", swamp => "#660", deep_swamp => "#440", jungle_1 => "#084", hills_rocky => "#aa8", treed_hills => "#6a4", hills => "#aa4", mountain => "#ccc", mountain2 => "#cdd", mountain5 => "#ddd", cobblestones => "#ea2", ); for my $k (keys %type) { my $v = join "", map chr, (map $_*255/15, map hex, split //, substr $type{$k}, 1), 255; $color{$v} = $k; } my $maps = Storable::retrieve "worldmaps.pst"; for my $X (100..129) { print "$X\n";#d# for my $Y (100..129) { my $map = delete $maps->[$X][$Y]; { my $X = ($X - 100) * 50; my $Y = ($Y - 100) * 50; for my $x (0..49) { for my $y (0..49) { my $ofs = (($Y + $y)* 1500 + $X + $x) * 4; my $mask = substr $mask, $ofs, 4; my $type = substr $type, $ofs, 4; next if $mask eq "\xff\x00\x00\xff"; if (my $k = $color{$type}) { $map->{map}[$x][$y] = [{ _name => "$k", }]; } } } } if ((my $pid = fork)) { push @pids, $pid; waitpid shift @pids, 0 if @pids > 3; } else { eval { $map->write_file ("../maps/world/world_$X\_$Y") }; warn $@ if $@; POSIX::_exit 0; } } }