--- deliantra/Deliantra-Client/DC/MapWidget.pm 2006/10/08 21:57:54 1.87 +++ deliantra/Deliantra-Client/DC/MapWidget.pm 2006/12/04 15:17:14 1.94 @@ -69,36 +69,12 @@ ::start_game (); } -sub check_lwp($) { - my ($res) = @_; - - $res->is_error - and die $res->status_line; - - $res -} - sub editor_invoke { my $editsup = $::CONN && $::CONN->{editor_support} or return; - my ($pid, $fh); - unless ($pid = open $fh, "-|:utf8", "-") { - $SIG{__DIE__} = sub { - my $msg = $_[0]; - $msg =~ s/\n+/\n/; - warn "FATAL: $msg"; - CFPlus::_exit 99; - }; - - open STDERR, ">&STDOUT"; - binmode STDOUT, ":utf8"; - binmode STDERR, ":utf8"; - close $fh; - - $| = 1; + CFPlus::background { print "preparing editor startup...\n"; - CFPlus::set_proxy; my $server = $editsup->{gameserver} || "default"; $server =~ s/([^a-zA-Z0-9_\-])/sprintf "=%x=", ord $1/ge; @@ -109,19 +85,12 @@ print "map directory is $mapdir\n"; print "lib directory is $libdir\n"; - require LWP::UserAgent; - - my $ua = LWP::UserAgent->new ( - agent => "cfplus $CFPlus::VERSION", - keep_alive => 1, - env_proxy => 1, - timeout => 30, - ); + my $ua = CFPlus::lwp_useragent; for my $file (qw(archetypes crossfire.0)) { my $url = "$editsup->{lib_root}$file"; print "mirroring $url...\n"; - check_lwp $ua->mirror ($url, "$libdir/$file"); + CFPlus::lwp_check $ua->mirror ($url, "$libdir/$file"); printf "%s size %d octets\n", $file, -s "$libdir/$file"; } @@ -136,14 +105,14 @@ # try to get the most recent head revision, what a hack, # this should have been returned while downloading *sigh* - my $log = (check_lwp $ua->get ("$editsup->{cvs_root}/$mapname?view=log&logsort=rev"))->decoded_content; + my $log = (CFPlus::lwp_check $ua->get ("$editsup->{cvs_root}/$mapname?view=log&logsort=rev"))->decoded_content; if ($log =~ /\?rev=(\d+\.\d+)"/) { my $rev = $1; print "downloading revision $rev...\n"; - my $map = (check_lwp $ua->get ("$editsup->{cvs_root}/$mapname?rev=$rev"))->decoded_content; + my $map = (CFPlus::lwp_check $ua->get ("$editsup->{cvs_root}/$mapname?rev=$rev"))->decoded_content; my $meta = { %$editsup, @@ -199,24 +168,7 @@ die "viewvc parse error, unable to detect revision\n"; } } - - CFPlus::_exit; } - - my $buffer; - - Event->io (fd => $fh, poll => 'r', cb => sub { - unless (sysread $fh, $buffer, 4096, length $buffer) { - $_[0]->w->cancel; - $buffer .= "done\n"; - } - - while ($buffer =~ s/^(.*)\n//) { - ::message ({ - markup => "editor($pid): " . CFPlus::asxml $1, - }); - } - }); } sub invoke_button_down { @@ -226,14 +178,19 @@ $self->grab_focus; return unless $::CONN; - my $x = 1 + CFPlus::floor +($ev->{x} - $self->{sx0}) / $self->{tilesize} - $self->{sx}; - my $y = 1 + CFPlus::floor +($ev->{y} - $self->{sy0}) / $self->{tilesize} - $self->{sy}; + my $x = $self->{dx} + CFPlus::floor +($ev->{x} - $self->{sx0}) / $self->{tilesize}; + my $y = $self->{dy} + CFPlus::floor +($ev->{y} - $self->{sy0}) / $self->{tilesize}; - $x -= int 0.5 * $self->{sw}; - $y -= int 0.5 * $self->{sh}; + $x -= CFPlus::floor $::MAP->w * 0.5; + $y -= CFPlus::floor $::MAP->h * 0.5; - $::CONN->lookat ($x, $y) - if $::CONN; + if ($::CONN) { + if ($::IN_BUILD_MODE) { + $::CONN->buildat ($::IN_BUILD_MODE, $x, $y); + } else { + $::CONN->lookat ($x, $y) + } + } } elsif ($ev->{button} == 2) { $self->grab_focus; @@ -479,8 +436,8 @@ sub set_magicmap { my ($self, $w, $h, $x, $y, $data) = @_; - $x -= $::MAP->ox + int 0.5 * $::MAP->w; - $y -= $::MAP->oy + int 0.5 * $::MAP->h; + $x -= $::MAP->ox + 1 + int 0.5 * $::MAP->w; + $y -= $::MAP->oy + 1 + int 0.5 * $::MAP->h; $self->{magicmap} = [$x, $y, $w, $h, $data]; @@ -501,17 +458,20 @@ if (delete $self->{need_update}) { my $tilesize = $self->{tilesize} = int 32 * $::CFG->{map_scale}; - my $sx = $self->{sx} = CFPlus::ceil $::CFG->{map_shift_x} / $tilesize; - my $sy = $self->{sy} = CFPlus::ceil $::CFG->{map_shift_y} / $tilesize; + my $sw = $self->{sw} = 1 + CFPlus::ceil $self->{w} / $tilesize; + my $sh = $self->{sh} = 1 + CFPlus::ceil $self->{h} / $tilesize; + + my $sx = CFPlus::ceil $::CFG->{map_shift_x} / $tilesize; + my $sy = CFPlus::ceil $::CFG->{map_shift_y} / $tilesize; my $sx0 = $self->{sx0} = $::CFG->{map_shift_x} - $sx * $tilesize; my $sy0 = $self->{sy0} = $::CFG->{map_shift_y} - $sy * $tilesize; - my $sw = $self->{sw} = 1 + CFPlus::ceil $self->{w} / $tilesize; - my $sh = $self->{sh} = 1 + CFPlus::ceil $self->{h} / $tilesize; + my $dx = $self->{dx} = CFPlus::ceil 0.5 * ($::MAP->w - $sw) - $sx; + my $dy = $self->{dy} = CFPlus::ceil 0.5 * ($::MAP->h - $sh) - $sy; if ($::CFG->{fow_enable}) { - my ($w, $h, $data) = $::MAP->fow_texture ($sx, $sy, 0, 0, $sw, $sh); + my ($w, $h, $data) = $::MAP->fow_texture ($dx, $dy, $sw, $sh); if ($::CFG->{fow_smooth} && $CFPlus::OpenGL::GL_VERSION >= 1.2) { # smooth fog of war glConvolutionParameter (GL_CONVOLUTION_2D, GL_CONVOLUTION_BORDER_MODE, GL_CONSTANT_BORDER); @@ -543,7 +503,7 @@ glTranslate $sx0, $sy0; glScale $::CFG->{map_scale}, $::CFG->{map_scale}; - $::MAP->draw ($sx, $sy, 0, 0, $sw, $sh); + $::MAP->draw ($dx, $dy, $sw, $sh); glScale 32, 32; @@ -560,8 +520,8 @@ if ($self->{magicmap}) { my ($x, $y, $w, $h, $data) = @{ $self->{magicmap} }; - $x += $::MAP->ox - $sx + int 0.5 * ($::MAP->w - $sw + 1); - $y += $::MAP->oy - $sy + int 0.5 * ($::MAP->h - $sh + 1); + $x += $::MAP->ox + $self->{dx}; + $y += $::MAP->oy + $self->{dy}; glTranslate - $x - 1, - $y - 1; glBindTexture GL_TEXTURE_2D, $magicmap_tex->{name};