--- deliantra/server/common/item.C 2007/09/30 20:22:12 1.40
+++ deliantra/server/common/item.C 2009/01/11 06:08:40 1.53
@@ -1,11 +1,11 @@
/*
- * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
+ * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992,2007 Frank Tore Johansen
*
- * Crossfire TRT is free software: you can redistribute it and/or modify
+ * Deliantra is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
@@ -18,14 +18,15 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
- * The authors can be reached via e-mail to
+ * The authors can be reached via e-mail to
*/
#include
-#include
#include
#include
+const char *const coins[NUM_COINS + 1] = { "royalty", "platinacoin", "goldcoin", "silvercoin", 0 };
+
/* the ordering of this is actually doesn't make a difference
* However, for ease of use, new entries should go at the end
* so those people that debug the code that get used to something
@@ -253,10 +254,7 @@
int
get_power_from_ench (int ench)
{
- if (ench < 0) ench = 0;
- if (ench > 20) ench = 20;
-
- return enc_to_item_power[ench];
+ return enc_to_item_power [clamp (ench, 0, 20)];
}
/* This takes an object 'op' and figures out what its item_power
@@ -300,9 +298,11 @@
for (i = 1; i < NROFATTACKS; i++)
if (op->attacktype & (1 << i))
enc++;
+
if (op->slaying)
enc += 2; /* What it slays is probably more relevent */
}
+
/* Items the player can equip */
if ((op->type == WEAPON) || (op->type == ARMOUR) || (op->type == HELMET) ||
(op->type == SHIELD) || (op->type == RING) ||
@@ -315,6 +315,7 @@
enc += op->stats.grace; /* grace regen */
enc += op->stats.exp; /* speed bonus */
}
+
enc += op->stats.luck;
/* Do spell paths now */
@@ -356,6 +357,7 @@
for (i = 0; i < item_types_size; i++)
if (item_types[i].number == itemtype)
return &item_types[i];
+
return NULL;
}
@@ -370,13 +372,15 @@
for (i = 0; i < item_types_size; i++)
if (!strcmp (item_types[i].name, name))
return &item_types[i];
+
for (i = 0; i < item_types_size; i++)
if (!strcmp (item_types[i].name_pl, name))
{
LOG (llevInfo,
- "get_typedata_by_name: I have been sent the plural %s, the singular form %s is preffered\n", name, item_types[i].name);
+ "get_typedata_by_name: I have been sent the plural %s, the singular form %s is prefered\n", name, item_types[i].name);
return &item_types[i];
}
+
return NULL;
}
@@ -419,7 +423,7 @@
query_weight (const object *op)
{
static char buf[10];
- sint32 i = (op->nrof ? op->nrof : 1) * op->weight + op->carrying;
+ sint32 i = op->total_weight ();
if (op->weight < 0)
return " ";
@@ -538,14 +542,18 @@
const char *
query_short_name (const object *op)
{
- static dynbuf_text buf; buf.clear ();
-
- if (op->name == NULL)
+ if (!op->name)
return "(null)";
- if (!op->nrof && !op->weight && !op->title && !is_magical (op))
+ if (!op->nrof
+ && !op->weight
+ && !op->title
+ && !is_magical (op)
+ && op->slaying != shstr_money)
return op->name; /* To speed things up (or make things slower?) */
+ static dynbuf_text buf; buf.clear ();
+
buf << (op->nrof <= 1 ? op->name : op->name_pl);
if (op->title && QUERY_FLAG (op, FLAG_IDENTIFIED))
@@ -567,6 +575,31 @@
}
break;
+ case ALTAR:
+ case TRIGGER_ALTAR:
+ case IDENTIFY_ALTAR:
+ case CONVERTER:
+ if (op->slaying == shstr_money)
+ {
+ bool wrap = !!buf.size ();
+
+ if (wrap) buf << " [";
+
+ archetype *coin = 0;
+
+ for (char const *const *c = coins; *coins; ++c)
+ if ((coin = archetype::find (*c)))
+ if (op->stats.food % coin->value == 0)
+ break;
+
+ sint32 coins = op->stats.food / coin->value;
+
+ buf.printf ("drop %d %s (or equivalent)", coins, coins == 1 ? &coin->name : &coin->name_pl);
+
+ if (wrap) buf << ']';
+ }
+ break;
+
case SKILL:
case AMULET:
case RING:
@@ -579,6 +612,7 @@
buf << " " << s;
}
break;
+
default:
if (op->magic && ((QUERY_FLAG (op, FLAG_BEEN_APPLIED) && need_identify (op)) || QUERY_FLAG (op, FLAG_IDENTIFIED)))
buf.printf (" %+d", op->magic);
@@ -778,7 +812,7 @@
switch ((int) ((FABS (op->speed)) * 15))
{
case 0:
- buf << "(very slow movement";
+ buf << "(very slow movement)";
break;
case 1:
buf << "(slow movement)";
@@ -1164,9 +1198,8 @@
void
examine (object *op, object *tmp)
{
- std::string s = tmp->describe (op);
-
- new_draw_info (NDI_UNIQUE, 0, op, s.c_str ());
+ std::string info = tmp->describe (op);
+ op->contr->infobox (MSG_CHANNEL ("examine"), info.c_str ());
}
/*
@@ -1181,12 +1214,12 @@
for (object *tmp = inv; tmp; tmp = tmp->below)
if (who && QUERY_FLAG (who, FLAG_WIZ))
- buf.printf ("%s- %-28.28s (%5d) %-8s\n", indent, query_name (tmp), tmp->count, query_weight (tmp));
+ buf.printf ("%s- %-28.28s (%5d) %-8s\n", indent, tmp->query_name (), tmp->count, tmp->query_weight ());
else if (!tmp->invisible && (type == CONTAINER || QUERY_FLAG (tmp, FLAG_APPLIED)))
- buf.printf ("%s- %-36.36s %-8s\n", indent, query_name (tmp), query_weight (tmp));
+ buf.printf ("%s- %-36.36s %-8s\n", indent, tmp->query_name (), tmp->query_weight ());
if (buf.size ())
- buf.printf ("%s(total weight: %s)\n", indent, query_weight (this));
+ buf.printf ("%s(total weight: %s)\n", indent, query_weight ());
else
buf.printf ("%s(empty)\n", indent);
@@ -1328,8 +1361,6 @@
void
identify (object *op)
{
- object *pl;
-
SET_FLAG (op, FLAG_IDENTIFIED);
CLEAR_FLAG (op, FLAG_KNOWN_MAGICAL);
CLEAR_FLAG (op, FLAG_NO_SKILL_IDENT);
@@ -1346,7 +1377,7 @@
op->title = op->inv->name;
else if (op->arch)
{
- op->name = op->arch->object::name;
+ op->name = op->arch->object::name;
op->name_pl = op->arch->object::name_pl;
}
}
@@ -1354,14 +1385,11 @@
/* If the object is on a map, make sure we update its face */
if (op->map)
update_object (op, UP_OBJ_CHANGE);
- else
- {
- pl = op->in_player ();
- if (pl)
- /* A lot of the values can change from an update - might as well send
- * it all.
- */
- esrv_send_item (pl, op);
- }
+
+ if (object *pl = op->visible_to ())
+ /* A lot of the values can change from an update - might as well send
+ * it all.
+ */
+ esrv_send_item (pl, op);
}