--- deliantra/server/lib/cf.pm 2010/01/30 23:46:39 1.503 +++ deliantra/server/lib/cf.pm 2010/03/28 22:29:50 1.508 @@ -1,7 +1,7 @@ # # This file is part of Deliantra, the Roguelike Realtime MMORPG. # -# Copyright (©) 2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team +# Copyright (©) 2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team # # Deliantra is free software: you can redistribute it and/or modify it under # the terms of the Affero GNU General Public License as published by the @@ -1401,38 +1401,47 @@ $todo{$base} = \%ext; } + my $pass = 0; my %done; while (%todo) { my $progress; + ++$pass; + + ext: while (my ($k, $v) = each %todo) { for (split /,\s*/, $v->{meta}{depends}) { - goto skip + next ext unless exists $done{$_}; } - warn "... loading '$k' into '$v->{pkg}'\n"; + warn "... pass $pass, loading '$k' into '$v->{pkg}'\n"; - unless (eval $v->{source}) { - my $msg = $@ ? "$v->{path}: $@\n" - : "$v->{base}: extension inactive.\n"; - - if (exists $v->{meta}{mandatory}) { - warn $msg; - cf::cleanup "mandatory extension failed to load, exiting."; - } - - warn $msg; - } + my $active = eval $v->{source}; + + if (length $@) { + warn "$v->{path}: $@\n"; + + cf::cleanup "mandatory extension '$k' failed to load, exiting." + if exists $v->{meta}{mandatory}; + } else { + $done{$k} = delete $todo{$k}; + push @EXTS, $v->{pkg}; + $progress = 1; - $done{$k} = delete $todo{$k}; - push @EXTS, $v->{pkg}; - $progress = 1; + warn "$v->{base}: extension inactive.\n" + unless $active; + } } - skip: - die "cannot load " . (join ", ", keys %todo) . ": unable to resolve dependencies\n" - unless $progress; + unless ($progress) { + warn "cannot load " . (join ", ", keys %todo) . ": unable to resolve dependencies\n"; + + while (my ($k, $v) = each %todo) { + cf::cleanup "mandatory extension '$k' has unresolved dependencies, exiting." + if exists $v->{meta}{mandatory}; + } + } } }; } @@ -1762,7 +1771,7 @@ # mit "rum" bekleckern, nicht $self->_create_random_map ( $rmp->{wallstyle}, $rmp->{wall_name}, $rmp->{floorstyle}, $rmp->{monsterstyle}, - $rmp->{treasurestyle}, $rmp->{layoutstyle}, $rmp->{doorstyle}, $rmp->{decorstyle}, + $rmp->{treasurestyle}, $rmp->{layoutstyle}, $rmp->{doorstyle}, $rmp->{decorstyle}, $rmp->{miningstyle}, $rmp->{origin_map}, $rmp->{final_map}, $rmp->{exitstyle}, $rmp->{this_map}, $rmp->{exit_on_final_map}, $rmp->{xsize}, $rmp->{ysize}, @@ -2086,6 +2095,9 @@ $self->post_load; } +# customize the map for a given player, i.e. +# return the _real_ map. used by e.g. per-player +# maps to change the path to ~playername/mappath sub customise_for { my ($self, $ob) = @_; @@ -3566,6 +3578,8 @@ } sub write_runtime_sync { + my $t0 = EV::time; + # first touch the runtime file to show we are still running: # the fsync below can take a very very long time. @@ -3573,7 +3587,7 @@ my $guard = cf::lock_acquire "write_runtime"; - my $fh = aio_open "$RUNTIMEFILE~", O_WRONLY | O_CREAT, 0644 + my $fh = aio_open "$RUNTIMEFILE~", O_WRONLY | O_CREAT | O_TRUNC, 0644 or return; my $value = $cf::RUNTIME + 90 + 10; @@ -3596,7 +3610,7 @@ aio_rename "$RUNTIMEFILE~", $RUNTIMEFILE and return; - warn "runtime file written.\n"; + warn sprintf "runtime file written (%gs).\n", EV::time - $t0; 1 }