--- deliantra/Deliantra-Client/DC/MapWidget.pm 2006/10/08 21:22:30 1.85 +++ deliantra/Deliantra-Client/DC/MapWidget.pm 2007/04/01 15:08:14 1.102 @@ -8,9 +8,12 @@ use CFPlus; use CFPlus::OpenGL; use CFPlus::UI; +use CFPlus::Macro; our @ISA = CFPlus::UI::Base::; +sub ::T() { 64 } + my $magicmap_tex = new_from_file CFPlus::Texture CFPlus::find_rcfile "magicmap.png", mipmap => 1, wrap => 0, internalformat => GL_ALPHA; @@ -69,39 +72,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; - # putting the password into the env is somewhat tasteless -# local $ENV{CFPLUS_LOGIN} = $::PROFILE->{user}; -# local $ENV{CFPLUS_PASSWORD} = $::PROFILE->{password}; -# local $ENV{CFPLUS_UPLOAD} = $::CONN->{upload}; - - my ($pid, $fh); - unless ($pid = open $fh, "-|:utf8", "-") { - $SIG{__DIE__} = sub { - warn "@_\n"; - 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; @@ -112,37 +88,59 @@ 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"; } if (1) { # upload a map my $mapname = $::CONN->{map_info}[0]; + my $mappath = "$mapdir/$mapname"; + + -e $mappath and die "$mappath already exists\n"; + print "getting map revision for $mapname...\n"; # 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, + path => $mapname, + revision => $rev, + cf_login => $::PROFILE->{user}, + }; + + require File::Basename; + require File::Path; + + File::Path::mkpath (File::Basename::dirname ($mappath)); + open my $fh, ">:raw:perlio", "$mappath.meta" + or die "$mappath.meta: $!\n"; + print $fh CFPlus::to_json $meta; + close $fh; + open my $fh, ">:raw:perlio:utf8", $mappath + or die "$mappath: $!\n"; + print $fh $map; + close $fh; + + print "saved as $mappath\n"; + + print "invoking editor...\n"; + exec "/root/s2/gce $mappath";#d# # now upload it # require HTTP::Request::Common; @@ -173,27 +171,7 @@ die "viewvc parse error, unable to detect revision\n"; } } - - print "invoking editor...\n"; - exec "/root/s2/gce";#d# - - 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 { @@ -203,14 +181,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; @@ -307,8 +290,8 @@ sub size_request { ( - 32 * CFPlus::ceil $::WIDTH / 32, - 32 * CFPlus::ceil $::HEIGHT / 32, + ::T * CFPlus::ceil $::WIDTH / ::T, + ::T * CFPlus::ceil $::HEIGHT / ::T, ) } @@ -344,8 +327,8 @@ $mod &= CFPlus::KMOD_CTRL | CFPlus::KMOD_ALT | CFPlus::KMOD_SHIFT; - if ($uni == ord "\t") { - $::PL_WINDOW->toggle_visibility; + if ($sym == 9) { + ($mod & CFPlus::KMOD_SHIFT ? $::CONSOLE->{window} : $::PL_WINDOW)->toggle_visibility; } elsif ($sym == CFPlus::SDLK_F1 && !$mod) { $::HELP_WINDOW->toggle_visibility; } elsif ($sym == CFPlus::SDLK_F2 && !$mod) { @@ -358,19 +341,6 @@ ::toggle_player_page ($::INVENTORY_PAGE); } elsif ($sym == CFPlus::SDLK_F9 && !$mod) { $::SETUP_DIALOG->toggle_visibility; - } elsif ($sym == CFPlus::SDLK_INSERT && $mod & CFPlus::KMOD_CTRL) { - $::BIND_EDITOR->set_binding (undef, undef, [], - sub { - my ($mod, $sym, $cmds) = @_; - $::BIND_EDITOR->cfg_bind ($mod, $sym, $cmds); - }); - $::BIND_EDITOR->start; - $::BIND_EDITOR->show; -#TODO: elmex, what was this supposed to do? it currently crashes the client. -# } elsif ($sym == CFPlus::SDLK_INSERT && not ($mod & CFPlus::KMOD_CTRL)) { -# $::BIND_EDITOR->stop; -# $::BIND_EDITOR->ask_for_bind_and_commit; -# $::BIND_EDITOR->hide; } elsif (!$::CONN) { return 0; # bindings further down need a valid connection @@ -385,12 +355,15 @@ } elsif ($uni == ord ".") { $::CONN->user_send ($self->{completer}{last_command}) if exists $self->{completer}{last_command}; - } elsif (my $bind_cmd = $::PROFILE->{bindings}{$mod}{$sym}) { - $::CONN->user_send ($_) for @$bind_cmd; + } elsif (my @macros = CFPlus::Macro::match_event $ev) { + $::CONN->macro_send ($_) for @macros; } elsif (($sym == CFPlus::SDLK_KP_PLUS && !$mod) || $uni == ord "+") { $::CONN->user_send ("rotateshoottype +"); } elsif (($sym == CFPlus::SDLK_KP_MINUS && !$mod) || $uni == ord "-") { $::CONN->user_send ("rotateshoottype -"); + } elsif ($uni == ord '!') { + $self->{completer}->set_prefix ("shout "); + $self->{completer}->show; } elsif ($uni == ord '"') { $self->{completer}->set_prefix ("$::CFG->{say_command} "); $self->{completer}->show; @@ -456,8 +429,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]; @@ -476,19 +449,22 @@ unless $focused || !$::FAST; if (delete $self->{need_update}) { - my $tilesize = $self->{tilesize} = int 32 * $::CFG->{map_scale}; + my $tilesize = $self->{tilesize} = int ::T * $::CFG->{map_scale}; + + my $sw = $self->{sw} = 1 + CFPlus::ceil $self->{w} / $tilesize; + my $sh = $self->{sh} = 1 + CFPlus::ceil $self->{h} / $tilesize; - my $sx = $self->{sx} = CFPlus::ceil $::CFG->{map_shift_x} / $tilesize; - my $sy = $self->{sy} = CFPlus::ceil $::CFG->{map_shift_y} / $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); @@ -520,9 +496,9 @@ glTranslate $sx0, $sy0; glScale $::CFG->{map_scale}, $::CFG->{map_scale}; - $::MAP->draw ($sx, $sy, 0, 0, $sw, $sh); + $::MAP->draw ($dx, $dy, $sw, $sh, ::T); - glScale 32, 32; + glScale ::T, ::T; if (my $tex = $self->{fow_texture}) { glEnable GL_TEXTURE_2D; @@ -537,8 +513,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}; @@ -607,11 +583,11 @@ my ($w, $h) = @$self{qw(w h)}; - my $sw = int $::WIDTH / (32 * $::CFG->{map_scale}) + 0.99; - my $sh = int $::HEIGHT / (32 * $::CFG->{map_scale}) + 0.99; + my $sw = int $::WIDTH / (::T * $::CFG->{map_scale}) + 0.99; + my $sh = int $::HEIGHT / (::T * $::CFG->{map_scale}) + 0.99; - my $sx = int $::CFG->{map_shift_x} / 32; - my $sy = int $::CFG->{map_shift_y} / 32; + my $sx = int $::CFG->{map_shift_x} / ::T; + my $sy = int $::CFG->{map_shift_y} / ::T; my $ox = 0.5 * ($w - $sw); my $oy = 0.5 * ($h - $sh); @@ -694,7 +670,7 @@ (new CFPlus::UI::Menu items => [ ["bind " . (CFPlus::asxml $self->{select}) . " to a key" - => sub { $::BIND_EDITOR->do_quick_binding ([$self->{select}], sub { $entry->grab_focus }) }] + => sub { CFPlus::Macro::quick_macro [$self->{select}], sub { $entry->grab_focus } }] ], )->popup ($ev); return 1;