--- deliantra/server/common/map.C 2009/10/12 21:27:55 1.161 +++ deliantra/server/common/map.C 2009/11/06 13:03:34 1.168 @@ -1,7 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2001-2003,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * @@ -28,6 +28,8 @@ #include "loader.h" #include "path.h" +//+GPL + sint8 maptile::outdoor_darkness; /* This rolls up wall, blocks_magic, blocks_view, etc, all into @@ -82,12 +84,9 @@ return 1; } - /* Save some cycles - instead of calling get_map_flags(), just get the value - * directly. - */ mapspace &ms = m->at (sx, sy); - int mflags = ms.flags (); + int mflags = ms.flags (); int blocked = ms.move_block; /* If space is currently not blocked by anything, no need to @@ -116,45 +115,45 @@ */ for (object *tmp = ms.bot; tmp; tmp = tmp->above) { - /* This must be before the checks below. Code for inventory checkers. */ - if (tmp->type == CHECK_INV && OB_MOVE_BLOCK (ob, tmp)) + if (OB_MOVE_BLOCK (ob, tmp)) { - bool have = check_inv_recursive (ob, tmp); + if (INVOKE_OBJECT (BLOCKED_MOVE, tmp, ob)) + if (RESULT_INT (0)) + return 1; + else + continue; - /* If last_sp is set, the player/monster needs an object, - * so we check for it. If they don't have it, they can't - * pass through this space. - */ - if (tmp->last_sp) + if (tmp->type == CHECK_INV) { - if (!have) + bool have = check_inv_recursive (ob, tmp); + + // last_sp set means we block if we don't have. + if (logical_xor (have, tmp->last_sp)) return 1; } - else + else if (tmp->type == T_MATCH) { - /* In this case, the player must not have the object - - * if they do, they can't pass through. - */ - if (have) + // T_MATCH allows "entrance" iff the match is true + // == blocks if the match fails + + // we could have used an INVOKE_OBJECT, but decided against it, as we + // assume that T_MATCH is relatively common. + if (!match (tmp->slaying, ob, tmp, ob)) return 1; } - } - else - { - /* Broke apart a big nasty if into several here to make - * this more readable. first check - if the space blocks - * movement, can't move here. - * second - if a monster, can't move there, unless it is a - * dm. - */ - if (OB_MOVE_BLOCK (ob, tmp)) - return 1; + else + return 1; // unconditional block + + } else { + // space does not block the ob, directly, but + // anything alive that is not a door still + // blocks anything but wizards. if (tmp->flag [FLAG_ALIVE] && tmp->head_ () != ob && tmp != ob && tmp->type != DOOR - && !tmp->flag [FLAG_WIZ]) + && !tmp->flag [FLAG_WIZPASS]) return 1; } } @@ -226,7 +225,7 @@ * The object 'container' is the object that contains the inventory. * This is needed so that we can update the containers weight. */ -void +static void fix_container (object *container) { object *tmp = container->inv, *next; @@ -247,6 +246,8 @@ container->update_weight (); } +//-GPL + void maptile::set_object_flag (int flag, int value) { @@ -271,6 +272,8 @@ INVOKE_OBJECT (RESET, tmp); } +//+GPL + /* link_multipart_objects go through all the objects on the map looking * for objects whose arch says they are multipart yet according to the * info we have, they only have the head (as would be expected when @@ -307,6 +310,8 @@ } } +//-GPL + /* * Loads (ands parses) the objects into a given map from the specified * file pointer. @@ -477,6 +482,8 @@ spaces = salloc0 (size ()); } +//+GPL + /* Takes a string from a map definition and outputs a pointer to the array of shopitems * corresponding to that string. Memory is allocated for this, it must be freed * at a later date. @@ -562,34 +569,34 @@ /* opposite of parse string, this puts the string that was originally fed in to * the map (or something equivilent) into output_string. */ -static void -print_shop_string (maptile *m, char *output_string) +static const char * +print_shop_string (maptile *m) { - int i; - char tmp[MAX_BUF]; + static dynbuf_text buf; buf.clear (); - strcpy (output_string, ""); - for (i = 0; i < m->shopitems[0].index; i++) + for (int i = 0; i < m->shopitems[0].index; i++) { if (m->shopitems[i].typenum) { if (m->shopitems[i].strength) - sprintf (tmp, "%s:%d;", m->shopitems[i].name, m->shopitems[i].strength); + buf.printf ("%s:%d;", m->shopitems[i].name, m->shopitems[i].strength); else - sprintf (tmp, "%s;", m->shopitems[i].name); + buf.printf ("%s;", m->shopitems[i].name); } else { if (m->shopitems[i].strength) - sprintf (tmp, "*:%d;", m->shopitems[i].strength); + buf.printf ("*:%d;", m->shopitems[i].strength); else - sprintf (tmp, "*"); + buf.printf ("*"); } - - strcat (output_string, tmp); } + + return buf; } +//-GPL + /* This loads the header information of the map. The header * contains things like difficulty, size, timeout, etc. * this used to be stored in the map object, but with the @@ -690,6 +697,8 @@ abort (); } +//+GPL + /****************************************************************************** * This is the start of unique map handling code *****************************************************************************/ @@ -716,6 +725,8 @@ } } +//-GPL + bool maptile::_save_header (object_freezer &freezer) { @@ -732,20 +743,14 @@ MAP_OUT (no_reset); MAP_OUT (no_drop); MAP_OUT (difficulty); - if (default_region) MAP_OUT2 (region, default_region->name); - if (shopitems) - { - char shop[MAX_BUF]; - print_shop_string (this, shop); - MAP_OUT2 (shopitems, shop); - } - + if (shopitems) MAP_OUT2 (shopitems, print_shop_string (this)); MAP_OUT (shopgreed); MAP_OUT (shopmin); MAP_OUT (shopmax); if (shoprace) MAP_OUT (shoprace); + MAP_OUT (darkness); MAP_OUT (width); MAP_OUT (height); @@ -788,6 +793,8 @@ return freezer.save (path); } +//+GPL + /* * Remove and free all objects in the given map. */ @@ -1535,6 +1542,8 @@ return adjacent_map (op1->map, op2->map, &dx, &dy); } +//-GPL + object * maptile::insert (object *op, int x, int y, object *originator, int flags) { @@ -1556,6 +1565,8 @@ return ::region::default_region (); } +//+GPL + /* picks a random object from a style map. */ object * @@ -1580,6 +1591,8 @@ return archetype::find ("bug"); } +//-GPL + void maptile::play_sound (faceidx sound, int x, int y) const {