… | |
… | |
83 | |
83 | |
84 | use Time::HiRes 'time'; |
84 | use Time::HiRes 'time'; |
85 | use EV; |
85 | use EV; |
86 | use List::Util qw(max min); |
86 | use List::Util qw(max min); |
87 | |
87 | |
88 | use Crossfire; |
88 | use Deliantra; |
89 | use Crossfire::Protocol::Constants; |
89 | use Deliantra::Protocol::Constants; |
90 | |
90 | |
91 | use Compress::LZF; |
91 | use Compress::LZF; |
92 | |
92 | |
93 | use CFPlus; |
93 | use CFPlus; |
94 | use CFPlus::OpenGL (); |
94 | use CFPlus::OpenGL (); |
… | |
… | |
469 | my ($conn, $flags, $prompt) = @_; |
469 | my ($conn, $flags, $prompt) = @_; |
470 | |
470 | |
471 | # FIXME: a very ugly hack to wait for stat update #d# |
471 | # FIXME: a very ugly hack to wait for stat update #d# |
472 | if ($prompt =~ /roll new stats/ and not $conn->{stat_change_with}) { |
472 | if ($prompt =~ /roll new stats/ and not $conn->{stat_change_with}) { |
473 | unless ($QUERY_TIMER) { |
473 | unless ($QUERY_TIMER) { |
474 | $QUERY_TIMER = |
|
|
475 | EV::timer 1, 0, sub { |
474 | $QUERY_TIMER = EV::timer 1, 0, sub { |
476 | server_query ($conn, $flags, $prompt, 1); |
475 | server_query ($conn, $flags, $prompt, 1); |
477 | $QUERY_TIMER = undef |
476 | $QUERY_TIMER = undef |
478 | }; |
477 | }; |
|
|
478 | |
479 | return; |
479 | return; |
480 | } |
480 | } |
481 | } |
481 | } |
482 | |
482 | |
483 | $conn->{query_dialog} = my $dialog = new CFPlus::UI::Toplevel |
483 | $conn->{query_dialog} = my $dialog = new CFPlus::UI::Toplevel |
… | |
… | |
2227 | $BUTTONBAR->add (new CFPlus::UI::Button |
2227 | $BUTTONBAR->add (new CFPlus::UI::Button |
2228 | text => "Save Config", |
2228 | text => "Save Config", |
2229 | tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", |
2229 | tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", |
2230 | on_activate => sub { |
2230 | on_activate => sub { |
2231 | $::CFG->{layout} = CFPlus::UI::get_layout; |
2231 | $::CFG->{layout} = CFPlus::UI::get_layout; |
2232 | CFPlus::write_cfg "$Crossfire::VARDIR/cfplusrc"; |
2232 | CFPlus::write_cfg "$Deliantra::VARDIR/cfplusrc"; |
2233 | status "Configuration Saved"; |
2233 | status "Configuration Saved"; |
2234 | 0 |
2234 | 0 |
2235 | }, |
2235 | }, |
2236 | ); |
2236 | ); |
2237 | |
2237 | |
… | |
… | |
2270 | my $animate_timer; |
2270 | my $animate_timer; |
2271 | |
2271 | |
2272 | my $fps = 9; |
2272 | my $fps = 9; |
2273 | |
2273 | |
2274 | sub force_refresh { |
2274 | sub force_refresh { |
2275 | $WANT_REFRESH->stop; |
|
|
2276 | |
|
|
2277 | if ($ENV{CFPLUS_DEBUG} & 4) { |
2275 | if ($ENV{CFPLUS_DEBUG} & 4) { |
2278 | $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02; |
2276 | $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02; |
2279 | debug sprintf "%3.2f", $fps; |
2277 | debug sprintf "%3.2f", $fps; |
2280 | } |
2278 | } |
2281 | |
2279 | |
|
|
2280 | $WANT_REFRESH->stop; |
|
|
2281 | |
2282 | $CFPlus::UI::ROOT->draw; |
2282 | $CFPlus::UI::ROOT->draw; |
2283 | CFPlus::SDL_GL_SwapBuffers; |
2283 | CFPlus::SDL_GL_SwapBuffers; |
2284 | $LAST_REFRESH = $NOW; |
2284 | $LAST_REFRESH = $NOW; |
2285 | } |
2285 | } |
2286 | |
2286 | |
2287 | $WANT_REFRESH = EV::idle_ns \&force_refresh; |
2287 | $WANT_REFRESH = EV::idle_ns \&force_refresh; |
2288 | |
2288 | |
2289 | my $input = EV::timer 0, 1/60, sub { |
2289 | # 0.015 is server tick time / 8 ~~ 66.6...hz |
|
|
2290 | my $input = EV::periodic 0, 0.015, undef, sub { |
2290 | $NOW = time; |
2291 | $NOW = time; |
2291 | |
2292 | |
2292 | ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) |
2293 | ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) |
2293 | for CFPlus::poll_events; |
2294 | for CFPlus::poll_events; |
2294 | |
2295 | |
… | |
… | |
2316 | }, |
2317 | }, |
2317 | CFPlus::SDL_VIDEOEXPOSE => sub { |
2318 | CFPlus::SDL_VIDEOEXPOSE => sub { |
2318 | CFPlus::UI::full_refresh; |
2319 | CFPlus::UI::full_refresh; |
2319 | }, |
2320 | }, |
2320 | CFPlus::SDL_ACTIVEEVENT => sub { |
2321 | CFPlus::SDL_ACTIVEEVENT => sub { |
2321 | # not useful, as APPACTIVE include sonly iconified state, not unmapped |
2322 | # not useful, as APPACTIVE includes only iconified state, not unmapped |
2322 | # printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, CFPlus::SDL_GetAppState;#d# |
2323 | # printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, CFPlus::SDL_GetAppState;#d# |
2323 | # printf "a %x\n", CFPlus::SDL_GetAppState & CFPlus::SDL_APPACTIVE;#d# |
2324 | # printf "a %x\n", CFPlus::SDL_GetAppState & CFPlus::SDL_APPACTIVE;#d# |
2324 | # printf "A\n" if $_[0]{state} & CFPlus::SDL_APPACTIVE; |
2325 | # printf "A\n" if $_[0]{state} & CFPlus::SDL_APPACTIVE; |
2325 | # printf "K\n" if $_[0]{state} & CFPlus::SDL_APPINPUTFOCUS; |
2326 | # printf "K\n" if $_[0]{state} & CFPlus::SDL_APPINPUTFOCUS; |
2326 | # printf "M\n" if $_[0]{state} & CFPlus::SDL_APPMOUSEFOCUS; |
2327 | # printf "M\n" if $_[0]{state} & CFPlus::SDL_APPMOUSEFOCUS; |
… | |
… | |
2348 | }, |
2349 | }, |
2349 | ); |
2350 | ); |
2350 | |
2351 | |
2351 | ############################################################################# |
2352 | ############################################################################# |
2352 | |
2353 | |
2353 | $SIG{INT} = $SIG{TERM} = sub { exit }; |
2354 | $SIG{INT} = $SIG{TERM} = sub { |
|
|
2355 | EV::unloop; |
|
|
2356 | #d# TODO calling exit here hangs the process in some futex |
|
|
2357 | }; |
2354 | |
2358 | |
2355 | { |
2359 | { |
2356 | CFPlus::read_cfg "$Crossfire::VARDIR/cfplusrc"; |
2360 | CFPlus::read_cfg "$Deliantra::VARDIR/cfplusrc"; |
2357 | CFPlus::DB::Server::run; |
2361 | CFPlus::DB::Server::run; |
2358 | |
2362 | |
2359 | CFPlus::UI::set_layout ($::CFG->{layout}); |
2363 | CFPlus::UI::set_layout ($::CFG->{layout}); |
2360 | |
2364 | |
2361 | my %DEF_CFG = ( |
2365 | my %DEF_CFG = ( |