ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/main.C
(Generate patch)

Comparing deliantra/server/server/main.C (file contents):
Revision 1.167 by root, Tue Oct 12 06:20:14 2010 UTC vs.
Revision 1.179 by root, Sat Nov 17 23:33:18 2018 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2001-2003 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2001-2003 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen 6 * Copyright (©) 1992 Frank Tore Johansen
7 * 7 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 8 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the 9 * the terms of the Affero GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your 10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version. 11 * option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the Affero GNU General Public License 18 * You should have received a copy of the Affero GNU General Public License
19 * and the GNU General Public License along with this program. If not, see 19 * and the GNU General Public License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>. 20 * <http://www.gnu.org/licenses/>.
21 * 21 *
22 * The authors can be reached via e-mail to <support@deliantra.net> 22 * The authors can be reached via e-mail to <support@deliantra.net>
23 */ 23 */
24 24
25#include <global.h> 25#include <global.h>
26#include <object.h> 26#include <object.h>
58 * the function that calls this should figure them out. 58 * the function that calls this should figure them out.
59 */ 59 */
60bool 60bool
61object::enter_map (maptile *newmap, int x, int y) 61object::enter_map (maptile *newmap, int x, int y)
62{ 62{
63 if (destroyed () || !newmap || newmap->in_memory != MAP_ACTIVE) 63 if (destroyed () || !newmap || !newmap->linkable ())
64 return false; 64 return false;
65 65
66 if (out_of_map (newmap, x, y)) 66 if (out_of_map (newmap, x, y))
67 { 67 {
68 LOG (llevError, "enter_map: supplied coordinates are not within the map! (%s: %d, %d)\n", &newmap->path, x, y); 68 LOG (llevError, "enter_map: supplied coordinates are not within the map! (%s: %d, %d)\n", &newmap->path, x, y);
104 } 104 }
105 105
106 if (i >= 0) 106 if (i >= 0)
107 { 107 {
108 maptile *m = newmap; 108 maptile *m = newmap;
109 sint16 nx = x + freearr_x[i]; 109 sint16 nx = x + DIRX (i);
110 sint16 ny = y + freearr_y[i]; 110 sint16 ny = y + DIRY (i);
111 111
112 if (xy_normalise (m, nx, ny)) 112 if (xy_normalise (m, nx, ny))
113 { 113 {
114 newmap = m; 114 newmap = m;
115 x = nx; 115 x = nx;
130 return false; 130 return false;
131 } 131 }
132 132
133 enemy = 0; 133 enemy = 0;
134 134
135 newmap->activate (); // workaround for activate activating everyhing on the map, includign the palyer on the {link} map
135 //newmap->insert (this, x, y); 136 //newmap->insert (this, x, y);
136 newmap->insert (this, x, y, 0, INS_NO_AUTO_EXIT); 137 newmap->insert (this, x, y, 0, INS_NO_AUTO_EXIT);
138 prefetch_surrounding_maps ();
137 139
138 if (map == newmap) // see if we actually arrived there - insert might trigger a teleport 140 if (map == newmap) // see if we actually arrived there - insert might trigger a teleport
139 { 141 {
140 if (contr) 142 if (contr)
141 { 143 {
149 151
150 if (i < 0) 152 if (i < 0)
151 golem->drop_and_destroy (); 153 golem->drop_and_destroy ();
152 else 154 else
153 { 155 {
154 newmap->insert (golem, x + freearr_x[i], y + freearr_y[i]); 156 newmap->insert (golem, x + DIRX (i), y + DIRY (i));
155 golem->direction = find_dir_2 (golem->x - x, golem->y - y); 157 golem->direction = find_dir_2 (golem->x - x, golem->y - y);
156 } 158 }
157 } 159 }
158 } 160 }
159 161
235 // used for the inner loop 237 // used for the inner loop
236 if (_i < actives.size ()) // HACK, rely on _i :/ 238 if (_i < actives.size ()) // HACK, rely on _i :/
237 { 239 {
238 object *next = actives [_i + 1]; 240 object *next = actives [_i + 1];
239 241
240 prefetch (&next->flag , 0, 1); 242 ecb_prefetch (&next->flag , 0, 1);
241 prefetch (&next->speed , 0, 1); 243 ecb_prefetch (&next->speed , 0, 1);
242 prefetch (&next->anim_speed, 0, 1); 244 ecb_prefetch (&next->anim_speed, 0, 1);
243 prefetch (&next->contr , 0, 1); 245 ecb_prefetch (&next->contr , 0, 1);
244 } 246 }
245 247
246 /* Now process op */ 248 /* Now process op */
247 if (expect_false (op->flag [FLAG_FREED])) 249 if (expect_false (op->flag [FLAG_FREED]))
248 { 250 {
368 _exit (make_core); 370 _exit (make_core);
369} 371}
370 372
371/* 373/*
372 * do_specials() is a collection of functions to call from time to time. 374 * do_specials() is a collection of functions to call from time to time.
373 * Modified 2000-1-14 MSW to use the global pticks count to determine how 375 * Modified 2000-1-14 MSW to use the global server_tick count to determine how
374 * often to do things. This will allow us to spred them out more often. 376 * often to do things. This will allow us to spred them out more often.
375 * I use prime numbers for the factor count - in that way, it is less likely 377 * I use prime numbers for the factor count - in that way, it is less likely
376 * these actions will fall on the same tick (compared to say using 500/2500/15000 378 * these actions will fall on the same tick (compared to say using 500/2500/15000
377 * which would mean on that 15,000 tick count a whole bunch of stuff gets 379 * which would mean on that 15,000 tick count a whole bunch of stuff gets
378 * done). Of course, there can still be times where multiple specials are 380 * done). Of course, there can still be times where multiple specials are
385do_specials () 387do_specials ()
386{ 388{
387 shstr::gc (); 389 shstr::gc ();
388 archetype::gc (); 390 archetype::gc ();
389 391
390 if (expect_false (!(pticks % TICKS_PER_HOUR))) 392 if (expect_false (!(server_tick % TICKS_PER_HOUR)))
391 maptile::adjust_daylight (); 393 maptile::adjust_daylight ();
392 394
393 if (expect_false (!(pticks % 2503))) 395 if (expect_false (!(server_tick % 2503)))
394 fix_weight (); /* Hack to fix weightproblems caused by bugs */ 396 fix_weight (); /* Hack to fix weightproblems caused by bugs */
395 397
396 if (expect_false (!(pticks % 5003))) 398 if (expect_false (!(server_tick % 5003)))
397 write_book_archive (); 399 write_book_archive ();
398 400
399 if (expect_false (!(pticks % 5009))) 401 if (expect_false (!(server_tick % 5009)))
400 clean_friendly_list (); 402 clean_friendly_list ();
401 403
402 if (expect_false (!(pticks % 5011))) 404 if (expect_false (!(server_tick % 5011)))
403 obsolete_parties (); 405 obsolete_parties ();
404 406
405 if (expect_false (!(pticks % 12503))) 407 if (expect_false (!(server_tick % 12503)))
406 fix_luck (); 408 fix_luck ();
407} 409}
408 410
409void 411void
410server_tick () 412one_tick ()
411{ 413{
412 // first do the user visible stuff 414 // first do the user visible stuff
413 INVOKE_GLOBAL (CLOCK); 415 INVOKE_GLOBAL (CLOCK);
414 process_events (); // "do" something with objects with speed 416 process_events (); // "do" something with objects with speed
415 client::clock (); // draw client maps etc. 417 client::clock (); // draw client maps etc.
416 418
417 // then do some bookkeeping, should not really be here 419 // then do some bookkeeping, should not really be here
418 do_specials (); /* Routines called from time to time. */ 420 do_specials (); /* Routines called from time to time. */
419 attachable::check_mortals (); 421 attachable::check_mortals ();
420 422
421 ++pticks; 423 // now that we aggressively reuse id's, this is very unlikely to happen...
422
423 if (object::object_count >= RESTART_COUNT) 424 if (object::object_count >= RESTART_COUNT)
424 cleanup ("running out of protocol ID values - need full restart"); 425 cleanup ("running out of protocol ID values - need full restart");
425} 426}
426 427
427// normal main 428// normal main
430{ 431{
431 settings.argc = argc; 432 settings.argc = argc;
432 settings.argv = argv; 433 settings.argv = argv;
433 434
434 rndm.seed (time (0)); 435 rndm.seed (time (0));
435 g_thread_init (0); // for the slice allocator only 436
437 // temporary(?) testing hack
438 if (argc >= 2 && !strcmp (argv [1], "--noise"))
439 {
440 void noise_test ();
441 noise_test ();
442 exit (0);
443 }
436 444
437#if 0 445#if 0
438 // code sometiems used for timing benchmarks 446 // code sometiems used for timing benchmarks
439 random_number_generator<freeciv_random_generator> rng; 447 random_number_generator<freeciv_random_generator> rng;
440 rng.seed(0); 448 rng.seed(0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines