/* * Copyright (C) 2002-2007 The Warp Rogue Team * Part of the Warp Rogue Project * * This software is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License. * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY. * * See the license.txt file for more details. */ /* * Module Name: Stats * Description: - */ #define Uses_Ui #define Uses_Util #define Uses_Character #define Uses_CharacterAdvancement #define Uses_ProgramManager #define Uses_Random #define Uses_DataFile #include "mheader.h" #include "charstat.h" #define STAT_BONUS_BASE 50 #define STAT_SHORT_NAME_SIZE 4 #define STAT_LONG_NAME_SIZE 16 /* * stat name structure */ typedef struct { /* the abbreviated name of the stat */ const char short_name[STAT_SHORT_NAME_SIZE]; /* the full name of the stat */ const char long_name[STAT_LONG_NAME_SIZE]; } STAT_NAME; /* * stat names */ static const STAT_NAME StatName[MAX_STATS] = { {"MV", "Movement"}, {"CC", "Close Combat"}, {"RC", "Ranged Combat"}, {"ST", "Strength"}, {"TN", "Toughness"}, {"IN", "Initiative"}, {"LD", "Leadership"}, {"SG", "Sagacity"}, {"FR", "Force"} }; /* * stat advance */ void stat_advance(CHARACTER *character, STAT i) { CHARACTER_STAT *stat; stat = &character->stat[i]; stat->current += STANDARD_STAT_ADVANCE; stat->total += STANDARD_STAT_ADVANCE; stat->advance += STANDARD_STAT_ADVANCE; } /* * returns the stat bonus modifier */ STAT_BONUS stat_bonus(const CHARACTER *character, STAT stat) { STAT_BONUS bonus; bonus = (character->stat[stat].current - STAT_BONUS_BASE) / 10; if (bonus < 0) { bonus = 0; } return bonus; } /* * applies stat modifiers */ void stat_modifiers_apply(CHARACTER *character, STAT_MODIFIER *stat_modifier) { STAT i; for (i = 0; i < MAX_STATS; i++) { character->stat[i].current += stat_modifier[i]; } } /* * reverts stat modifiers */ void stat_modifiers_revert(CHARACTER *character, const STAT_MODIFIER *stat_modifier, STAT_MODIFIER restore_max ) { STAT i; for (i = 0; i < MAX_STATS; i++) { STAT_MODIFIER revert_modifier; revert_modifier = -stat_modifier[i]; if (revert_modifier > 0 && revert_modifier > restore_max) { character->stat[i].total -= (revert_modifier - restore_max); revert_modifier = restore_max; } character->stat[i].current += revert_modifier; } } /* * returns the abbreviated name of a stat */ const char * stat_short_name(STAT stat) { return StatName[stat].short_name; } /* * returns the full name of a stat */ const char * stat_long_name(STAT stat) { return StatName[stat].long_name; } /* * returns true if the passed string is an abbreviated stat name */ bool is_short_stat_name(const char *str) { STAT i; for (i = 0; i < MAX_STATS; i++) { if (strings_equal(str, StatName[i].short_name)) { return true; } } return false; } /* * name -> stat index */ STAT name_to_stat(const char *name, bool abbreviated) { STAT i; for (i = 0; i < MAX_STATS; i++) { if (abbreviated && strings_equal(name, StatName[i].short_name)) { return i; } else { if (strings_equal(name, StatName[i].long_name)) { return i; } } } die("*** CORE ERROR *** invalid character stat: %s", name); return 0; }