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

Comparing deliantra/server/common/map.C (file contents):
Revision 1.109 by root, Thu Jun 7 19:12:22 2007 UTC vs.
Revision 1.113 by root, Fri Jul 13 15:54:40 2007 UTC

1/* 1/*
2 * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. 2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2001-2003,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2001-2003,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software; you can redistribute it and/or modify it 8 * Crossfire TRT is free software: you can redistribute it and/or modify
9 * under the terms of the GNU General Public License as published by the Free 9 * it under the terms of the GNU General Public License as published by
10 * Software Foundation; either version 2 of the License, or (at your option) 10 * the Free Software Foundation, either version 3 of the License, or
11 * any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, but 13 * This program is distributed in the hope that it will be useful,
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License along 18 * You should have received a copy of the GNU General Public License
19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * 20 *
22 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 22 */
24 23
25#include <unistd.h> 24#include <unistd.h>
356{ 355{
357 if (!spaces) 356 if (!spaces)
358 return; 357 return;
359 358
360 for (mapspace *ms = spaces + size (); ms-- > spaces; ) 359 for (mapspace *ms = spaces + size (); ms-- > spaces; )
361 for (object *op = ms->bot; op; op = op->above) 360 {
361 object *op = ms->bot;
362 while (op)
362 { 363 {
363 /* already multipart - don't do anything more */ 364 /* already multipart - don't do anything more */
364 if (op->head_ () == op && !op->more && op->arch->more) 365 if (op->head_ () == op && !op->more && op->arch->more)
365 { 366 {
366 op->remove (); 367 op->remove ();
367 op->expand_tail (); 368 op->expand_tail ();
369
370 // FIXME: INS_ON_TOP is just a workaround for the pentagram vs.
371 // multi-tile monster bug, where INS_ABOVE_FLOOR_ONLY put the monsters
372 // below the pentagrams... hopefully INS_ON_TOP doesn't break anything
368 insert (op, op->x, op->y, 0, INS_NO_MERGE | INS_ABOVE_FLOOR_ONLY | INS_NO_WALK_ON); 373 insert (op, op->x, op->y, 0, INS_NO_MERGE | INS_ON_TOP | INS_NO_WALK_ON);
374
375 op = ms->bot; // we are mutating the mapspace too much with INS_ON_TOP
376 // so we have to reset the iteration through the mapspace
369 } 377 }
378 else
379 op = op->above;
370 } 380 }
381 }
371} 382}
372 383
373/* 384/*
374 * Loads (ands parses) the objects into a given map from the specified 385 * Loads (ands parses) the objects into a given map from the specified
375 * file pointer. 386 * file pointer.
735 case KW_tile_path_1: thawer.get (tile_path [0]); break; 746 case KW_tile_path_1: thawer.get (tile_path [0]); break;
736 case KW_tile_path_2: thawer.get (tile_path [1]); break; 747 case KW_tile_path_2: thawer.get (tile_path [1]); break;
737 case KW_tile_path_3: thawer.get (tile_path [2]); break; 748 case KW_tile_path_3: thawer.get (tile_path [2]); break;
738 case KW_tile_path_4: thawer.get (tile_path [3]); break; 749 case KW_tile_path_4: thawer.get (tile_path [3]); break;
739 750
751 case KW_ERROR:
752 set_key (thawer.kw_str, thawer.value);
753 break;
754
740 case KW_end: 755 case KW_end:
741 return true; 756 return true;
742 757
743 default: 758 default:
744 if (!thawer.parse_error ("map", 0)) 759 if (!thawer.parse_error ("map", 0))
865 * Remove and free all objects in the given map. 880 * Remove and free all objects in the given map.
866 */ 881 */
867void 882void
868maptile::clear () 883maptile::clear ()
869{ 884{
870 sfree (regions, size ()), regions = 0; 885 sfree (regions, size ()); regions = 0;
871 free (regionmap), regionmap = 0; 886 delete [] regionmap; regionmap = 0;
872 887
873 if (spaces) 888 if (spaces)
874 { 889 {
875 for (mapspace *ms = spaces + size (); ms-- > spaces; ) 890 for (mapspace *ms = spaces + size (); ms-- > spaces; )
876 while (object *op = ms->bot) 891 while (object *op = ms->bot)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines