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.176 by root, Tue Nov 10 05:11:05 2009 UTC vs.
Revision 1.182 by root, Sun Feb 7 04:22:33 2010 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 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra 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 * 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
23 */ 23 */
24 24
25#include <unistd.h> 25#include <unistd.h>
26 26
27#include "global.h" 27#include "global.h"
28#include "loader.h"
29#include "path.h" 28#include "path.h"
30 29
31//+GPL 30//+GPL
32 31
33sint8 maptile::outdoor_darkness; 32sint8 maptile::outdoor_darkness;
150 // blocks anything but wizards. 149 // blocks anything but wizards.
151 150
152 if (tmp->flag [FLAG_ALIVE] 151 if (tmp->flag [FLAG_ALIVE]
153 && tmp->head_ () != ob 152 && tmp->head_ () != ob
154 && tmp != ob 153 && tmp != ob
155 && tmp->type != DOOR 154 && tmp->type != DOOR)
156 && !tmp->flag [FLAG_WIZPASS])
157 return 1; 155 return 1;
158 } 156 }
159 } 157 }
160 158
161 return 0; 159 return 0;
630 case KW_shopgreed: thawer.get (shopgreed); break; 628 case KW_shopgreed: thawer.get (shopgreed); break;
631 case KW_shopmin: thawer.get (shopmin); break; 629 case KW_shopmin: thawer.get (shopmin); break;
632 case KW_shopmax: thawer.get (shopmax); break; 630 case KW_shopmax: thawer.get (shopmax); break;
633 case KW_shoprace: thawer.get (shoprace); break; 631 case KW_shoprace: thawer.get (shoprace); break;
634 case KW_outdoor: thawer.get (outdoor); break; 632 case KW_outdoor: thawer.get (outdoor); break;
635 case KW_temp: thawer.get (temp); break;
636 case KW_pressure: thawer.get (pressure); break;
637 case KW_humid: thawer.get (humid); break;
638 case KW_windspeed: thawer.get (windspeed); break;
639 case KW_winddir: thawer.get (winddir); break;
640 case KW_sky: thawer.get (sky); break;
641 633
642 case KW_per_player: thawer.get (per_player); break; 634 case KW_per_player: thawer.get (per_player); break;
643 case KW_per_party: thawer.get (per_party); break; 635 case KW_per_party: thawer.get (per_party); break;
644 case KW_no_reset: thawer.get (no_reset); break; 636 case KW_no_reset: thawer.get (no_reset); break;
645 case KW_no_drop: thawer.get (no_drop); break; 637 case KW_no_drop: thawer.get (no_drop); break;
714//-GPL 706//-GPL
715 707
716bool 708bool
717maptile::_save_header (object_freezer &freezer) 709maptile::_save_header (object_freezer &freezer)
718{ 710{
719#define MAP_OUT(k) freezer.put (KW_ ## k, k) 711#define MAP_OUT(k) freezer.put (KW(k), k)
720#define MAP_OUT2(k,v) freezer.put (KW_ ## k, v) 712#define MAP_OUT2(k,v) freezer.put (KW(k), v)
721 713
722 MAP_OUT2 (arch, "map"); 714 MAP_OUT2 (arch, CS(map));
723 715
724 if (name) MAP_OUT (name); 716 if (name) MAP_OUT (name);
725 MAP_OUT (swap_time); 717 MAP_OUT (swap_time);
726 MAP_OUT (reset_time); 718 MAP_OUT (reset_time);
727 MAP_OUT (reset_timeout); 719 MAP_OUT (reset_timeout);
735 MAP_OUT (shopgreed); 727 MAP_OUT (shopgreed);
736 MAP_OUT (shopmin); 728 MAP_OUT (shopmin);
737 MAP_OUT (shopmax); 729 MAP_OUT (shopmax);
738 if (shoprace) MAP_OUT (shoprace); 730 if (shoprace) MAP_OUT (shoprace);
739 731
740 MAP_OUT (darkness);
741 MAP_OUT (width); 732 MAP_OUT (width);
742 MAP_OUT (height); 733 MAP_OUT (height);
743 MAP_OUT (enter_x); 734 MAP_OUT (enter_x);
744 MAP_OUT (enter_y); 735 MAP_OUT (enter_y);
745 736 MAP_OUT (darkness);
746 if (msg) freezer.put (KW_msg , KW_endmsg , msg);
747 if (maplore) freezer.put (KW_maplore, KW_endmaplore, maplore);
748
749 MAP_OUT (outdoor); 737 MAP_OUT (outdoor);
750 MAP_OUT (temp); 738
751 MAP_OUT (pressure); 739 if (msg) freezer.put (KW(msg) , KW(endmsg) , msg);
752 MAP_OUT (humid); 740 if (maplore) freezer.put (KW(maplore), KW(endmaplore), maplore);
753 MAP_OUT (windspeed);
754 MAP_OUT (winddir);
755 MAP_OUT (sky);
756 741
757 MAP_OUT (per_player); 742 MAP_OUT (per_player);
758 MAP_OUT (per_party); 743 MAP_OUT (per_party);
759 744
760 if (tile_path [0]) MAP_OUT2 (tile_path_1, tile_path [0]); 745 if (tile_path [0]) MAP_OUT2 (tile_path_1, tile_path [0]);
761 if (tile_path [1]) MAP_OUT2 (tile_path_2, tile_path [1]); 746 if (tile_path [1]) MAP_OUT2 (tile_path_2, tile_path [1]);
762 if (tile_path [2]) MAP_OUT2 (tile_path_3, tile_path [2]); 747 if (tile_path [2]) MAP_OUT2 (tile_path_3, tile_path [2]);
763 if (tile_path [3]) MAP_OUT2 (tile_path_4, tile_path [3]); 748 if (tile_path [3]) MAP_OUT2 (tile_path_4, tile_path [3]);
764 749
765 freezer.put (this); 750 freezer.put (this);
766 freezer.put (KW_end); 751 freezer.put (KW(end));
767 752
768 return true; 753 return true;
769} 754}
770 755
771bool 756bool
856 841
857 clear (); 842 clear ();
858} 843}
859 844
860/* decay and destroy perishable items in a map */ 845/* decay and destroy perishable items in a map */
846// TODO: should be done regularly, not on map load?
861void 847void
862maptile::do_decay_objects () 848maptile::do_decay_objects ()
863{ 849{
864 if (!spaces) 850 if (!spaces)
865 return; 851 return;
867 for (mapspace *ms = spaces + size (); ms-- > spaces; ) 853 for (mapspace *ms = spaces + size (); ms-- > spaces; )
868 for (object *above, *op = ms->bot; op; op = above) 854 for (object *above, *op = ms->bot; op; op = above)
869 { 855 {
870 above = op->above; 856 above = op->above;
871 857
872 bool destroy = 0;
873
874 // do not decay anything above unique floor tiles (yet :) 858 // do not decay anything above unique floor tiles (yet :)
875 if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE)) 859 if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE))
876 break; 860 break;
861
862 bool destroy = 0;
877 863
878 if (QUERY_FLAG (op, FLAG_IS_FLOOR) 864 if (QUERY_FLAG (op, FLAG_IS_FLOOR)
879 || QUERY_FLAG (op, FLAG_OBJ_ORIGINAL) 865 || QUERY_FLAG (op, FLAG_OBJ_ORIGINAL)
880 || QUERY_FLAG (op, FLAG_UNIQUE) 866 || QUERY_FLAG (op, FLAG_UNIQUE)
881 || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR) 867 || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR)
912 || mat & M_LIQUID 898 || mat & M_LIQUID
913 || (mat & M_IRON && rndm (1, 5) == 1) 899 || (mat & M_IRON && rndm (1, 5) == 1)
914 || (mat & M_GLASS && rndm (1, 2) == 1) 900 || (mat & M_GLASS && rndm (1, 2) == 1)
915 || ((mat & M_STONE || mat & M_ADAMANT) && rndm (1, 10) == 1) 901 || ((mat & M_STONE || mat & M_ADAMANT) && rndm (1, 10) == 1)
916 || ((mat & M_SOFT_METAL || mat & M_BONE) && rndm (1, 3) == 1) 902 || ((mat & M_SOFT_METAL || mat & M_BONE) && rndm (1, 3) == 1)
917 || (mat & M_ICE && temp > 32)) 903 //|| (mat & M_ICE && temp > 32)
904 )
918 destroy = 1; 905 destroy = 1;
919 } 906 }
920 907
921 /* adjust overall chance below */ 908 /* adjust overall chance below */
922 if (destroy && rndm (0, 1)) 909 if (destroy && rndm (0, 1))
1622 if (distance <= MAX_SOUND_DISTANCE) 1609 if (distance <= MAX_SOUND_DISTANCE)
1623 ns->send_msg (NDI_GREY | NDI_DEF, SAY_CHANNEL, msg); 1610 ns->send_msg (NDI_GREY | NDI_DEF, SAY_CHANNEL, msg);
1624 } 1611 }
1625} 1612}
1626 1613
1614dynbuf mapwalk_buf (sizeof (maprect) * 25, sizeof (maprect) * 25);
1615
1627static void 1616static void
1628split_to_tiles (dynbuf &buf, maptile *m, int x0, int y0, int x1, int y1, int dx, int dy) 1617split_to_tiles (dynbuf &buf, maptile *m, int x0, int y0, int x1, int y1, int dx, int dy)
1629{ 1618{
1630 // clip to map to the left 1619 // clip to map to the left
1631 if (x0 < 0) 1620 if (x0 < 0)
1686 r->dx = dx; 1675 r->dx = dx;
1687 r->dy = dy; 1676 r->dy = dy;
1688} 1677}
1689 1678
1690maprect * 1679maprect *
1691maptile::split_to_tiles (int x0, int y0, int x1, int y1) 1680maptile::split_to_tiles (dynbuf &buf, int x0, int y0, int x1, int y1)
1692{ 1681{
1693 static dynbuf buf (sizeof (maprect) * 8, sizeof (maprect) * 8);
1694 buf.clear (); 1682 buf.clear ();
1695 1683
1696 ::split_to_tiles (buf, this, x0, y0, x1, y1, 0, 0); 1684 ::split_to_tiles (buf, this, x0, y0, x1, y1, 0, 0);
1697 1685
1698 // add end marker 1686 // add end marker

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines