--- deliantra/server/common/object.C 2011/05/08 12:40:41 1.350
+++ deliantra/server/common/object.C 2018/11/17 23:33:17 1.365
@@ -1,24 +1,24 @@
/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
- *
- * Copyright (©) 2005,2006,2007,2008,2009,2010,2011 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ *
+ * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2001 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992 Frank Tore Johansen
- *
+ *
* Deliantra is free software: you can redistribute it and/or modify it under
* the terms of the Affero GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the Affero GNU General Public License
* and the GNU General Public License along with this program. If not, see
* .
- *
+ *
* The authors can be reached via e-mail to
*/
@@ -47,13 +47,13 @@
//+GPL
-short freearr_x[SIZEOFFREE] = {
+int freearr_x[SIZEOFFREE] = {
0,
0, 1, 1, 1, 0, -1, -1, -1,
0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -1,
0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, -1, -2, -3, -3, -3, -3, -3, -3, -3, -2, -1
};
-short freearr_y[SIZEOFFREE] = {
+int freearr_y[SIZEOFFREE] = {
0,
-1, -1, 0, 1, 1, 1, 0, -1,
-2, -2, -2, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2,
@@ -74,22 +74,22 @@
};
const char *wall_suffix[16] = {
- "0",
- "1_3",
- "1_4",
- "2_1_2",
- "1_2",
- "2_2_4",
- "2_2_1",
- "3_1",
- "1_1",
- "2_2_3",
- "2_2_2",
- "3_3",
- "2_1_1",
- "3_4",
- "3_2",
- "4"
+ "0",
+ "1_3",
+ "1_4",
+ "2_1_2",
+ "1_2",
+ "2_2_4",
+ "2_2_1",
+ "3_1",
+ "1_1",
+ "2_2_3",
+ "2_2_2",
+ "3_3",
+ "2_1_1",
+ "3_4",
+ "3_2",
+ "4"
};
static void
@@ -237,7 +237,7 @@
{
/* n-squared behaviour (see kv.get), but I'm hoping both
* objects with lists are rare, and lists stay short. If not, use a
- * different structure or at least keep the lists sorted...
+ * different structure or at least keep the lists sorted...
*/
/* For each field in wants, */
@@ -353,15 +353,15 @@
*/
}
- /* Don't merge objects that are applied. With the new 'body' code,
+ /* Don't merge objects that are applied. With the new 'body' code,
* it is possible for most any character to have more than one of
* some items equipped, and we don't want those to merge.
*/
if (ob1->flag [FLAG_APPLIED] || ob2->flag [FLAG_APPLIED])
return 0;
- /* Note sure why the following is the case - either the object has to
- * be animated or have a very low speed. Is this an attempted monster
+ /* Not sure why the following is the case - either the object has to
+ * be animated or have a very low speed. Is this an attempted monster
* check?
*/
if (!ob1->flag [FLAG_ANIMATE] && ob1->has_active_speed ())
@@ -448,12 +448,13 @@
}
// adjust weight per container type ("of holding")
-static uint32
-weight_adjust_for (object *op, uint32 weight)
+static weight_t
+weight_adjust_for (object *op, weight_t weight)
{
- return op->type == CONTAINER
- ? weight - weight * op->stats.Str / 100
- : weight;
+ if (op->type == CONTAINER)
+ weight -= weight * op->stats.Str / 100;
+
+ return weight;
}
/*
@@ -461,22 +462,22 @@
* and also updates how much the environment(s) is/are carrying.
*/
static void
-adjust_weight (object *op, sint32 sub, sint32 add)
+adjust_weight (object *op, weight_t sub, weight_t add)
{
while (op)
{
- sint32 ocarrying = op->carrying;
+ weight_t carrying = (weight_t)op->carrying
+ - weight_adjust_for (op, sub)
+ + weight_adjust_for (op, add);
- op->carrying -= weight_adjust_for (op, sub);
- op->carrying += weight_adjust_for (op, add);
+ sub = op->carrying;
+ op->carrying = carrying;
+ add = op->carrying;
if (object *pl = op->visible_to ())
if (pl != op) // player is handled lazily
esrv_update_item (UPD_WEIGHT, pl, op);
- sub = ocarrying;
- add = op->carrying;
-
op = op->env;
}
}
@@ -489,7 +490,7 @@
void
object::update_weight ()
{
- sint32 sum = 0;
+ weight_t sum = 0;
for (object *op = inv; op; op = op->below)
{
@@ -637,10 +638,10 @@
/* copy the body_info to the body_used - this is only really
* need for monsters, but doesn't hurt to do it for everything.
* by doing so, when a monster is created, it has good starting
- * values for the body_used info, so when items are created
+ * values for the body_used info, so when items are created
* for it, they can be properly equipped.
*/
- for (int i = NUM_BODY_LOCATIONS; i--; )
+ for (int i = 0; i < NUM_BODY_LOCATIONS; ++i)
slot[i].used = slot[i].info;
attachable::instantiate ();
@@ -754,7 +755,7 @@
|| (m.move_off | op->move_off ) != m.move_off
|| (m.move_slow | op->move_slow) != m.move_slow
/* This isn't perfect, but I don't expect a lot of objects to
- * have move_allow right now.
+ * have move_allow right now.
*/
|| ((m.move_block | op->move_block) & ~op->move_allow) != m.move_block
m.invalidate ();
@@ -844,7 +845,7 @@
/* This function removes object 'op' from the list of active
* objects.
- * This should only be used for style maps or other such
+ * This should only be used for style maps or other such
* reference maps where you don't want an object that isn't
* in play chewing up cpu time getting processed.
* The reverse of this is to call update_ob_speed, which
@@ -1007,29 +1008,6 @@
++free_count;
}
-// special "grave" map used to store all removed objects
-// till they can be destroyed - saves a lot of checks in the rest
-// of the code
-static struct freed_map
-: maptile
-{
- freed_map ()
- : maptile (3, 3)
- {
- path = "";
- name = "/internal/freed_objects_map";
- no_drop = 1;
- no_reset = 1;
-
- state = MAP_ACTIVE;
- }
-
- ~freed_map ()
- {
- destroy ();
- }
-} freed_map; // freed objects are moved here to avoid crashes
-
void
object::do_destroy ()
{
@@ -1112,7 +1090,7 @@
if (more)
more->remove ();
- /*
+ /*
* In this case, the object to be removed is in someones
* inventory.
*/
@@ -1427,7 +1405,7 @@
* flag contains INS_ABOVE_FLOOR_ONLY, once we find the last
* floor, we want to insert above that and no further.
* Also, if there are spell objects on this space, we stop processing
- * once we get to them. This reduces the need to traverse over all of
+ * once we get to them. This reduces the need to traverse over all of
* them when adding another one - this saves quite a bit of cpu time
* when lots of spells are cast in one area. Currently, it is presumed
* that flying non pickable objects are spell objects.
@@ -1563,7 +1541,7 @@
}
/* this function inserts an object in the map, but if it
- * finds an object of its own type, it'll remove that one first.
+ * finds an object of its own type, it'll remove that one first.
* op is the object to insert it under: supplies x and the map.
*/
void
@@ -1605,9 +1583,9 @@
&& ms.volume () < m->max_volume))
return true;
- if (originator && originator->is_player ())
- originator->contr->failmsgf (
- "No matter how hard you try, you just cannot put the %s here H",
+ if (originator)
+ originator->failmsgf (
+ "No matter how hard you try, you just cannot put the %s here! H",
query_name ()
);
@@ -1631,7 +1609,7 @@
if (nrof > nr)
{
- sint64 oweight = total_weight ();
+ weight_t oweight = total_weight ();
nrof -= nr;
@@ -1702,7 +1680,7 @@
* This function inserts the object op in the linked list
* inside the object environment.
*
- * The function returns now pointer to inserted item, and return value can
+ * The function returns now pointer to inserted item, and return value can
* be != op, if items are merged. -Tero
*/
object *
@@ -1725,15 +1703,15 @@
/* return the original object and remove inserted object
(client prefers the original object) */
- // carring must be 0 for mergable objects
- sint64 oweight = tmp->weight * tmp->nrof;
+ // carrying must be 0 for mergable objects
+ weight_t oweight = weight_t (tmp->weight) * tmp->nrof;
tmp->nrof += op->nrof;
if (object *pl = tmp->visible_to ())
esrv_update_item (UPD_NROF, pl, tmp);
- adjust_weight (this, oweight, tmp->weight * tmp->nrof);
+ adjust_weight (this, oweight, weight_t (tmp->weight) * tmp->nrof);
op->destroy ();
op = tmp;
@@ -1832,7 +1810,7 @@
return 0;
/* The objects have to be checked from top to bottom.
- * Hence, we first go to the top:
+ * Hence, we first go to the top:
*/
for (object *next, *tmp = ms.top; tmp; tmp = next)
{
@@ -2026,14 +2004,14 @@
* Note - updated to take an object instead of archetype - this is necessary
* because arch_blocked (now ob_blocked) needs to know the movement type
* to know if the space in question will block the object. We can't use
- * the archetype because that isn't correct if the monster has been
+ * the archetype because that isn't correct if the monster has been
* customized, changed states, etc.
*/
int
find_free_spot (const object *ob, maptile *m, int x, int y, int start, int stop)
{
int altern[SIZEOFFREE];
- int index = 0, flag;
+ int index = 0;
for (int i = start; i < stop; i++)
{
@@ -2059,7 +2037,7 @@
/* Basically, if we find a wall on a space, we cut down the search size.
* In this way, we won't return spaces that are on another side of a wall.
- * This mostly work, but it cuts down the search size in all directions -
+ * This mostly work, but it cuts down the search size in all directions -
* if the space being examined only has a wall to the north and empty
* spaces in all the other directions, this will reduce the search space
* to only the spaces immediately surrounding the target area, and
@@ -2099,7 +2077,7 @@
find_first_free_spot (const object *ob, maptile *m, int x, int y)
{
for (int i = 0; i < SIZEOFFREE; i++)
- if (!ob->blocked (m, x + freearr_x[i], y + freearr_y[i]))
+ if (!ob->blocked (m, x + DIRX (i), y + DIRY (i)))
return i;
return -1;
@@ -2120,7 +2098,7 @@
swap (arr [end], arr [rndm (end + 1)]);
}
-/* new function to make monster searching more efficient, and effective!
+/* new function to make monster searching more efficient, and effective!
* This basically returns a randomized array (in the passed pointer) of
* the spaces to find monsters. In this way, it won't always look for
* monsters to the north first. However, the size of the array passed
@@ -2155,7 +2133,7 @@
int
find_dir (maptile *m, int x, int y, object *exclude)
{
- int max = SIZEOFFREE, mflags;
+ int max = SIZEOFFREE;
MoveType move_type;
if (exclude && exclude->head_ () != exclude)
@@ -2374,8 +2352,8 @@
if (dir < 0)
return 0; /* exit condition: invalid direction */
- dx = x + freearr_x[dir];
- dy = y + freearr_y[dir];
+ dx = x + DIRX (dir);
+ dy = y + DIRY (dir);
mflags = get_map_flags (m, &m, dx, dy, &dx, &dy);
@@ -2458,7 +2436,7 @@
}
/* Zero the key_values on op, decrementing the shared-string
- * refcounts and freeing the links.
+ * refcounts and freeing the links.
*/
void
key_values::clear ()
@@ -2743,8 +2721,8 @@
object *
object::force_find (shstr_tmp name)
{
- /* cycle through his inventory to look for the MARK we want to
- * place
+ /* cycle through his inventory to look for the MARK we want to
+ * place
*/
for (object *tmp = inv; tmp; tmp = tmp->below)
if (tmp->type == FORCE && tmp->slaying == name)