/* * The unique portions of SunderMud code as well as the integration efforts * for code from other sources is based on the efforts of: * * Lotherius (elfren@aros.net) * * This code can only be used under the terms of the DikuMud, Merc, * and ROM licenses. The same requirements apply to the changes that * have been made. * * All other copyrights remain in place and in force. */ /* Zeran - obj_cond.c written to support object conditions and all related functions */ #include "everything.h" void show_obj_cond (CHAR_DATA *ch, OBJ_DATA *obj); void check_damage_obj (CHAR_DATA *ch, OBJ_DATA *obj, int chance); void damage_obj (CHAR_DATA *ch, OBJ_DATA *obj, int damage); void set_obj_cond (OBJ_DATA *obj, int condition); void show_obj_cond (CHAR_DATA *ch, OBJ_DATA *obj) { char buf[MAX_STRING_LENGTH]; int condition=0; if (IS_SET(obj->extra_flags, ITEM_NO_COND)) /*no show condition */ return; if (obj->condition == 100) condition = 0; else if (obj->condition > 90) condition = 1 ; else if (obj->condition > 75) condition = 2; else if (obj->condition > 50) condition = 3; else if (obj->condition > 25) condition = 4; else if (obj->condition > 10) condition = 5; else if (obj->condition > 0) condition = 6; else if (obj->condition == 0) condition = 7; sprintf (buf, "Condition: %s\n\r", cond_table[condition]); send_to_char (buf, ch); return; } void check_damage_obj (CHAR_DATA *ch, OBJ_DATA *obj, int chance) { /* Assumption - NULL obj means check all equipment */ bool checkall=FALSE; bool done=FALSE; int damage_pos; OBJ_DATA *dobj=NULL; int stop=0; if (obj == NULL) checkall=TRUE; if (checkall) /*damage random equipped item*/ { if (number_percent () <= chance) /*something dinged up*/ { while ((!done) && (stop <= 20)) /* stop prevents infinite loop */ { damage_pos = number_range (1, MAX_WEAR); if ((dobj = get_eq_char (ch, damage_pos)) != NULL) done=TRUE; stop++; } if (done) damage_obj (ch, dobj, 1); } else return; } else if (number_percent () <= chance) /*damage passed in object*/ { damage_obj(ch, obj, 1); return; } return; } void damage_obj (CHAR_DATA *ch, OBJ_DATA *obj, int damage) { int counter; if (obj == NULL) { bug ("NULL obj passed to damage_obj",0); return; } obj->condition -= damage; obj->condition = URANGE (0, obj->condition, 100); /*Check for item falling apart*/ if (obj->condition == 0) { char mesbuf[256]; sprintf (mesbuf, "{c%s{c has become too badly damaged to use!{x\n\r", ( (obj->short_descr && obj->short_descr[0] != '\0') ? obj->short_descr : "Something") ); send_to_char (mesbuf, ch); unequip_char (ch, obj); return; } /* Now make adjustments to armor values and modify char AC */ if (obj->item_type == ITEM_ARMOR) { /* restore char AC as if not wearing object, then damage the object, then recalculate character AC */ for (counter=0 ; counter < 4 ; counter ++) { ch->armor[counter] += apply_ac (obj, obj->wear_loc, counter); obj->value[counter] = obj->valueorig[counter]*(obj->condition)/100; if ((obj->value[counter] == 0) && (obj->valueorig[counter] != 0)) obj->value[counter] = 1; /*always worth something til it breaks*/ ch->armor[counter] -= apply_ac (obj, obj->wear_loc, counter); } } return; } void set_obj_cond (OBJ_DATA *obj, int condition) { int counter; obj->condition = condition; if (obj->item_type == ITEM_ARMOR) for (counter=0 ; counter < 4 ; counter ++) { obj->value[counter] = obj->valueorig[counter]*(obj->condition)/100; if ((obj->value[counter] == 0) && (obj->valueorig[counter] != 0)) obj->value[counter] = 1; /*always worth something til it breaks*/ } return; }