#!/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 } 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 %natural = ( deep_sea => 1, sea => 1, shallow_sea => 1, beach => 1, desert => 1, brush => 1, steppe => 1, marsh => 1, grassbrown => 1, grassmedium => 1, grassdark => 1, grass => 1, darkforest => 1, evergreens => 1, evergreen => 1, tree => 1, tree1 => 1, tree2 => 1, tree3 => 1, tree4 => 1, tree5 => 1, tree6 => 1, forestsparse=> 1, woods => 1, woods_2 => 1, woods_3 => 1, swamp => 1, deep_swamp => 1, jungle_1 => 1, jungle_2 => 1, jungle_3 => 1, wasteland => 1, hills_rocky => 1, hills => 1, treed_hills => 1, mountain => 1, mountain_2 => 1, mountain2 => 1, mountain3 => 1, mountain4 => 1, mountain5 => 1, s_mountain => 1, snow => 1, drifts => 1, flagstone => 1, istone => 1, ); 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]; Storable::nstore $map, "pst/$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; # only remove something if we have a worldmap replacement next if $type eq "\xff\xff\xff\xff"; # mask means: protect unnaturals from overwriting if ($mask eq "\xff\x00\x00\xff") { $map->{map}[$x][$y] = [ grep !$natural{$_->{_name}}, @{ $map->{map}[$x][$y] || [] } ]; } else { delete $map->{map}[$x][$y]; } } } } if ((my $pid = fork)) { push @pids, $pid; waitpid shift @pids, 0 if @pids >= 1; } else { eval { $map->write_file ("../maps/world-overlay/world_$X\_$Y") }; warn $@ if $@; POSIX::_exit 0; } } } POSIX::_exit 0;