--- deliantra/server/ext/map-random.ext 2007/01/11 00:16:58 1.1 +++ deliantra/server/ext/map-random.ext 2008/05/03 08:50:30 1.24 @@ -1,41 +1,101 @@ -#! perl +#! perl # mandatory -use base "cf::path"; - -__PACKAGE__->register ("random"); +cf::map->register (qr{^\?random/([0-9a-f]{32})}); sub init { my ($self) = @_; - Coro::AIO::aio_load "$cf::RANDOM_MAPS/$self->{path}.meta", my $data; - $self->{random} = cf::from_json $data; + $self->{random_id} = $1; + + if (0 < Coro::AIO::aio_load "$cf::RANDOMDIR/$self->{random_id}.meta", my $data) { + $self->{random} = cf::decode_json $data; + $self->{random}{custom} ||= "$self->{random}{origin_map}+$self->{random}{origin_x}+$self->{random}{origin_y}"; + } else { + warn "unable to read meta file for $self->{random_id}\n"; + return 0; + } + + 1 +} + +sub thawer_merge { + # we have to keep some variables in memory intact + local $_[0]{random_id}; + local $_[0]{random}; + + $_[0]->SUPER::thawer_merge ($_[1]); } sub visible_name { my ($self) = @_; -# if (my $rmp = $self->{random}) { -# # todo: be more intelligent about this -# "?random/$rmp->{origin_map}+$rmp->{origin_x}+$rmp->{origin_y}/$rmp->{dungeon_level}" -# } else { - $self->as_string -# } + my $rmp = $self->{random}; + "random map at $rmp->{custom}, level $rmp->{dungeon_level}" } sub save_path { my ($self) = @_; - sprintf "%s/%s", $RANDOM_MAPS, $self->{path} + sprintf "%s/%s.map", $cf::RANDOMDIR, $self->{random_id} } sub uniq_path { undef } -sub load_orig { +sub load_header_orig { my ($self) = @_; - cf::map::generate_random_map "$self", $self->{random} + return unless $self->{random}; + + $self->generate_random_map ($self->{random}); + $self->activate; + + 1 +} + +sub clean_random_maps { + my $files = Coro::AIO::aio_readdir $cf::RANDOMDIR + or return; + + my $META_TIMEOUT = $cf::CFG{map_random_meta_timeout} || 86400 * 7; + + for my $file (@$files) { + next unless $file =~ /\.meta$/; + + Coro::AIO::aio_stat "$cf::RANDOMDIR/$file" + and next; + + my $age = $cf::NOW - (stat _)[8]; + + if ($age > $META_TIMEOUT) { + warn "resetting random meta data for $file"; + IO::AIO::aio_unlink "$cf::RANDOMDIR/$file"; + } + } +} + +# clean up old temp maps regularly +our $CLEAN_RANDOM_MAPS = cf::periodic 3600, Coro::unblock_sub { + clean_random_maps; +}; + +# map generator stresstest, NEVER enable under normal circumstances +if (0) { + cf::async { + my $seed = 0; + while () { + my $map = cf::map::new; + $map->generate_random_map ({ + region => "scorn", + random_seed => $seed++, + xsize => (int rand 90) + 3, + ysize => (int rand 90) + 3, + }); +# warn sprintf "%d: %d %d\n", $seed, $map->width, $map->height;#d# + $map->destroy; + } + }; } 1