#! perl # MANDATORY cf::map->register (qr{^\?random/([0-9a-f]{32})}); sub init { my ($self) = @_; $self->{random_id} = $1; if (0 < Coro::AIO::aio_load "$cf::RANDOM_MAPS/$self->{random_id}.meta", my $data) { $self->{random} = cf::from_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) = @_; my $rmp = $self->{random}; "random map at $rmp->{custom}, level $rmp->{dungeon_level}" } sub save_path { my ($self) = @_; sprintf "%s/%s.map", $cf::RANDOM_MAPS, $self->{random_id} } sub uniq_path { undef } sub load_header_orig { my ($self) = @_; return unless $self->{random}; $self->generate_random_map ($self->{random}); 1 } sub clean_random_maps { my $files = Coro::AIO::aio_readdir $cf::RANDOM_MAPS or return; my $META_TIMEOUT = $cf::CFG{map_random_meta_timeout} || 86400 * 7; my $MAP_TIMEOUT = $cf::CFG{map_random_map_timeout} || 3600 * 6; for my $file (@$files) { next if $file =~ /\.pst$/; Coro::AIO::aio_stat "$cf::RANDOM_MAPS/$file" and next; my $age = $cf::NOW - (stat _)[8]; if ($file =~ /\.meta$/) { if ($age > $META_TIMEOUT) { warn "resetting random meta data for $file"; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; } } else { if ($age > $MAP_TIMEOUT) { warn "resetting random map $file"; IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file.pst"; } } } } # clean up old temp maps regularly Event->timer ( reentrant => 0, data => cf::WF_AUTOCANCEL, interval => 3600, after => 60, cb => 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 => 12, ysize => 12, }); warn sprintf "%d: %d %d\n", $seed, $map->width, $map->height;#d# $map->destroy; } }; } 1