#include <drinks.h> #include <living.h> #undef PUBLIC_SURRENDER #undef POINTS_LOG #undef DEBUG int hp, max_hp, gp, max_gp, xp, wimpy, *drink_info; #ifdef SURRENDER_ON int surrender; #endif nosave int max; nosave string which; nosave mapping counts; nosave int ltime; nosave string lverb; void create() { max_hp = 1; max_gp = 1; #ifdef SURRENDER_ON surrender = -1; #endif drink_info = allocate( D_SIZEOF ); counts = ([ ]); } /* create() */ int query_hp() { return hp; } varargs int set_hp( int number, object attacker ) { if ( number > max_hp ) number = max_hp; hp = number; if ( ( hp < 0 ) && ( find_call_out( "do_death" ) == -1 ) ) call_out( "do_death", 0, attacker ); return hp; } /* set_hp() */ protected int check_wimpy() { int hp; hp = this_object()->query_hp(); if ( hp < 1 ) return 0; if (100 * hp < this_object()->query_wimpy() * this_object()->query_max_hp()) { this_object()->run_away(); return 1; } return 0; } #ifdef SURRENDER_ON protected int check_surrender(object attacker) { int hp; hp = this_object()->query_hp(); if (hp < 1) return 0; if (hp * 100 < this_object()->query_surrender() * this_object()->query_max_hp()) { ({ attacker, this_object() })->event_surrender( this_object(), attacker); return 1; } return 0; } #endif varargs int adjust_hp( int number, object attacker, object weapon, string attack ) { hp += number; if ( hp > max_hp ) hp = max_hp; if ( ( hp < 0 ) && ( find_call_out( "do_death" ) == -1 ) ) call_out( "do_death", 0, attacker, weapon, attack ); if (hp > 0 && number < 0 && attacker && attacker != this_object()) { #if SURRENDER_ON if (this_object()->query_surrender() >= this_object()->query_wimpy()) { if (!check_surrender(attacker)) check_wimpy(); } else { if (!check_wimpy()) check_surrender(attacker); } #else check_wimpy(); #endif } return hp; } /* adjust_hp() */ varargs string health_string(object person, int full) { return HEALTH_H->health_string(person, full); } /* health_string() */ int query_max_hp() { return max_hp; } int set_max_hp( int number ) { int old_hp; old_hp = hp; if ( max_hp == hp ) hp = number; else if ( max_hp ) { hp = ( hp * number ) / max_hp; } else hp = number; max_hp = number; if ( hp > max_hp ) hp = max_hp; if ( ( hp < 0 ) && ( old_hp > 0 ) ) hp = max_hp; return max_hp; } /* set_max_hp() */ int query_gp() { return gp; } int query_specific_gp( string gp_type ) { return gp; } /* query_specific_gp() */ void clear_gp_info() { which = 0; } int set_gp( int number ) { gp = number; if ( gp > max_gp ) gp = max_gp; return gp; } /* set_gp() */ int adjust_gp( int number ) { if ( gp + number < 0 ) return -1; gp += number; if ( gp > max_gp ) gp = max_gp; return gp; } int query_max_gp() { return max_gp; } int set_max_gp( int number ) { if ( max_gp ) gp = ( gp * number ) / max_gp; else gp = number; max_gp = number; if ( gp > max_gp ) gp = max_gp; return max_gp; } /* set_max_gp() */ int query_xp() { return xp; } varargs int adjust_xp( int number, int shared ) { if(number > 10000) { TCRE("shiannar", sprintf("%s %O recieved %d xp from %s %O", TO->query_name(), TO, number, PO->query_short(), PO)); } if(number > 10000 && previous_object() && explode(file_name(previous_object()), "/")[0] == "w") log_file("CHEAT", ctime(time()) + " " + file_name(previous_object()) + " gave " + number + " Xp for " + this_object()->query_name() + "\n"); xp += number; return xp; } /* adjust_xp() */ int query_wimpy() { return wimpy; } int set_wimpy( int number ) { if ( ( number < 0 ) || ( number > 100 ) ) return -1; return wimpy = number; } /* set_wimpy() */ #ifdef SURRENDER_ON int query_surrender() { if (surrender == -1) { if (wimpy > 94) return 100; else return wimpy + 5; } else return surrender; } int set_surrender( int number ) { if ( ( number < 0 ) || ( number > 100 ) ) return -1; return surrender = number; } /* set_surrender() */ #endif int *query_drink_info() { return drink_info; } int query_volume( int type ) { if ( type >= D_SIZEOF ) return 0; return drink_info[ type ]; } /* query_volume() */ int adjust_volume( int type, int amount ) { if ( type >= D_SIZEOF ) return 0; return drink_info[ type ] += amount; } /* adjust_volume() */ void update_volumes() { int i, delta; delta = (int)this_object()->query_con(); for ( i = 0; i < sizeof( drink_info ); i++ ) { if ( drink_info[ i ] > delta ) { drink_info[ i ] -= delta; // drinking cools you down if you're hot, eating warms you up // if you're cold. if(this_object()->query_personal_temp() > 0 && i == D_DRINK) this_object()->adjust_personal_temp(-(delta/3)); else if(this_object()->query_personal_temp() < 0 && i == D_FOOD) this_object()->adjust_personal_temp(delta/3); } else if ( drink_info[ i ] < -delta ) drink_info[ i ] += delta; else drink_info[ i ] = 0; } } /* update_volumes() */ mapping query_counts() { return counts; }