--- deliantra/server/common/item.C 2007/04/23 18:09:57 1.26 +++ deliantra/server/common/item.C 2007/07/01 05:00:17 1.38 @@ -1,25 +1,24 @@ /* - * CrossFire, A Multiplayer game for X-windows + * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. * - * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team - * Copyright (C) 2002 Mark Wedel & Crossfire Development Team - * Copyright (C) 1992 Frank Tore Johansen + * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team + * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team + * Copyright (©) 1992,2007 Frank Tore Johansen * - * This program is free software; you can redistribute it and/or modify + * Crossfire TRT 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 2 of the License, or + * 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * The authors can be reached via e-mail at + * along with this program. If not, see . + * + * The authors can be reached via e-mail to */ #include @@ -49,18 +48,20 @@ * "This item goes %s\n", with the use/nonuse values filling in the %s */ Body_Locations body_locations[NUM_BODY_LOCATIONS] = { - {"body_range", "in your range slot", "in a human's range slot"}, - {"body_arm", "on your arm", "on a human's arm"}, - {"body_torso", "on your body", "on a human's torso"}, - {"body_head", "on your head", "on a human's head"}, - {"body_neck", "around your neck", "around a humans neck"}, - {"body_skill", "in your skill slot", "in a human's skill slot"}, - {"body_finger", "on your finger", "on a human's finger"} , - {"body_shoulder", "around your shoulders", "around a human's shoulders"}, - {"body_foot", "on your feet", "on a human's feet"}, - {"body_hand", "on your hands", "on a human's hands"}, - {"body_wrist", "around your wrists", "around a human's wrist"}, - {"body_waist", "around your waist", "around a human's waist"}, + {KW_body_skill , "You can use it as your skill" , "It is used as a skill"}, + {KW_body_combat , "You can wield it as your weapon" , "It is used as a combat weapon"}, + {KW_body_range , "You can use it as your range weapon" , "It is used as a range weapon"}, + {KW_body_shield , "You can wield it as a shield" , "It is used as a shield"}, + {KW_body_arm , "You can put it on your arm" , "It goes on a human's arm"}, + {KW_body_torso , "You can wear it on your body" , "It goes on a human's torso"}, + {KW_body_head , "You can wear it on your head" , "It goes on a human's head"}, + {KW_body_neck , "You can wear it around your neck" , "It goes around a human's neck"}, + {KW_body_finger , "You can wear it on your finger" , "It goes on a human's finger"} , + {KW_body_shoulder, "You can wear it around your shoulders", "It goes around a human's shoulders"}, + {KW_body_foot , "You can put it on your foot" , "It goes on a human's foot"}, + {KW_body_hand , "You can put it on your hand" , "It goes on a human's hand"}, + {KW_body_wrist , "You can wear it around your wrist" , "It goes around a human's wrist"}, + {KW_body_waist , "You can wear it around your waist" , "It goes around a human's waist"}, /*{"body_dragon_torso", "your body", "a dragon's body"} */ }; @@ -252,10 +253,9 @@ int get_power_from_ench (int ench) { - if (ench < 0) - ench = 0; - if (ench > 20) - ench = 20; + if (ench < 0) ench = 0; + if (ench > 20) ench = 20; + return enc_to_item_power[ench]; } @@ -273,7 +273,7 @@ enc = 0; for (i = 0; i < NUM_STATS; i++) - enc += get_attr_value (&op->stats, i); + enc += op->stats.stat (i); /* This protection logic is pretty flawed. 20% fire resistance * is much more valuable than 20% confusion, or 20% slow, or @@ -344,12 +344,10 @@ enc += 1; return get_power_from_ench (enc); - } /* returns the typedata that has a number equal to itemtype, if there * isn't one, returns NULL */ - const typedata * get_typedata (int itemtype) { @@ -364,7 +362,6 @@ /* returns the typedata that has a name equal to itemtype, if there * isn't one, return the plural name that matches, if there still isn't * one return NULL */ - const typedata * get_typedata_by_name (const char *name) { @@ -506,11 +503,10 @@ for (attr = 0; attr < NUM_STATS; attr++) { - if ((val = get_attr_value (&(op->stats), attr)) != 0) - { - sprintf (buf + strlen (buf), "(%s%+d)", short_stat_name[attr], val); - } + if ((val = op->stats.stat (attr))) + sprintf (buf + strlen (buf), "(%s%+d)", short_stat_name[attr], val); } + if (op->stats.exp) sprintf (buf + strlen (buf), "(speed %+lld)", (long long) op->stats.exp); if (op->stats.wc) @@ -542,6 +538,7 @@ strcat (buf, "(reflect missiles)"); if (QUERY_FLAG (op, FLAG_STEALTH)) strcat (buf, "(stealth)"); + /* Shorten some of the names, so they appear better in the windows */ len = strlen (buf); DESCRIBE_PATH_SAFE (buf, op->path_attuned, "Attuned", &len, VERY_BIG_BUF); @@ -716,10 +713,10 @@ case WAND: case ROD: case HORN: - safe_strcat (buf[use_buf], " (readied)", &len, HUGE_BUF); + safe_strcat (buf[use_buf], op->env && op->env->current_weapon == op ? " (readied)" : " (applied)", &len, HUGE_BUF); break; case WEAPON: - safe_strcat (buf[use_buf], " (wielded)", &len, HUGE_BUF); + safe_strcat (buf[use_buf], op->env && op->env->current_weapon == op ? " (wielded)" : " (applied)", &len, HUGE_BUF); break; case ARMOUR: case HELMET: @@ -775,7 +772,7 @@ #ifdef NEW_MATERIAL_CODE if ((op->is_armor () || op->is_weapon ()) && op->materialname && mt && - op->arch->clone.materialname != mt->name && !(op->material & M_SPECIAL)) + op->arch->materialname != mt->name && !(op->material & M_SPECIAL)) { strcpy (buf, mt->description); len = strlen (buf); @@ -844,11 +841,10 @@ } } break; + default: if (op->magic && ((QUERY_FLAG (op, FLAG_BEEN_APPLIED) && need_identify (op)) || QUERY_FLAG (op, FLAG_IDENTIFIED))) - { - sprintf (buf + strlen (buf), " %+d", op->magic); - } + sprintf (buf + strlen (buf), " %+d", op->magic); } return buf; @@ -939,7 +935,7 @@ int first = 1; for (t = op->randomitems->items; t != NULL; t = t->next) - if (t->item && t->item->clone.type == SPELL) + if (t->item && t->item->type == SPELL) { if (first) { @@ -947,7 +943,7 @@ strcat (retbuf, "(Spell abilities:)"); } strcat (retbuf, "("); - strcat (retbuf, t->item->clone.name); + strcat (retbuf, t->item->object::name); strcat (retbuf, ")"); } } @@ -1087,14 +1083,16 @@ case POWER_CRYSTAL: if (op->stats.maxsp > 1000) { /*higher capacity crystals */ - i = (op->stats.maxsp % 100) / 10; + i = (op->stats.maxsp % 1000) / 100; + if (i) - snprintf (buf, MAX_BUF, "(capacity %d.%dk). It is ", op->stats.maxsp / 100, i); + snprintf (buf, MAX_BUF, "(capacity %d.%dk). It is ", op->stats.maxsp / 1000, i); else - snprintf (buf, MAX_BUF, "(capacity %dk). It is ", op->stats.maxsp / 100); + snprintf (buf, MAX_BUF, "(capacity %dk). It is ", op->stats.maxsp / 1000); } else snprintf (buf, MAX_BUF, "(capacity %d). It is ", op->stats.maxsp); + strcat (retbuf, buf); i = (op->stats.sp * 10) / op->stats.maxsp; if (op->stats.sp == 0) @@ -1169,7 +1167,7 @@ for (attr = 0; attr < NUM_STATS; attr++) { - if ((val = get_attr_value (&(op->stats), attr)) != 0) + if ((val = op->stats.stat (attr))) { sprintf (buf, "(%s%+d)", short_stat_name[attr], val); strcat (retbuf, buf); @@ -1436,7 +1434,7 @@ /* Check to see if it increases/decreases any stats */ for (i = 0; i < NUM_STATS; i++) - if (get_attr_value (&(op->stats), i) != 0) + if (op->stats.stat (i)) return 1; /* If it doesn't fall into any of the above categories, must @@ -1455,40 +1453,41 @@ { switch (op->type) { - case RING: - case WAND: - case ROD: - case HORN: - case SCROLL: - case SKILL: - case SKILLSCROLL: - case SPELLBOOK: - case FOOD: - case POTION: - case BOW: - case ARROW: - case WEAPON: - case ARMOUR: - case SHIELD: - case HELMET: - case AMULET: - case BOOTS: - case GLOVES: - case BRACERS: - case GIRDLE: - case CONTAINER: - case DRINK: - case FLESH: - case INORGANIC: - case CLOSE_CON: - case CLOAK: - case GEM: - case POWER_CRYSTAL: - case POISON: - case BOOK: - case SKILL_TOOL: - return 1; + case RING: + case WAND: + case ROD: + case HORN: + case SCROLL: + case SKILL: + case SKILLSCROLL: + case SPELLBOOK: + case FOOD: + case POTION: + case BOW: + case ARROW: + case WEAPON: + case ARMOUR: + case SHIELD: + case HELMET: + case AMULET: + case BOOTS: + case GLOVES: + case BRACERS: + case GIRDLE: + case CONTAINER: + case DRINK: + case FLESH: + case INORGANIC: + case CLOSE_CON: + case CLOAK: + case GEM: + case POWER_CRYSTAL: + case POISON: + case BOOK: + case SKILL_TOOL: + return 1; } + /* Try to track down some stuff that may show up here. Thus, the * archetype file can be updated, and this function removed. */ @@ -1522,8 +1521,8 @@ op->title = op->inv->name; else if (op->arch) { - op->name = op->arch->clone.name; - op->name_pl = op->arch->clone.name_pl; + op->name = op->arch->object::name; + op->name_pl = op->arch->object::name_pl; } }