#if defined(macintosh) #include <types.h> #include <time.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include "merc.h" #include "interp.h" #include "balance.h" /* * fix_weapon_damage() * * In order to balance the game, all weapons must do about * the same damage based on the object's level. * * TODO: Add fix for special weapons so they wont be * affected, and thus have what is set * * Weapons do at level 105, 8d18 damage, avg 76 */ void fix_weapon_damage(OBJ_DATA * obj) { return; obj->value[1] = interpolate(obj->level, 1, 8); obj->value[2] = interpolate(obj->level, 5, 18); } /* * fix_spell_damage() * * Spell damage should be normalized, regardless * of whats going on. * * Avg spell damage should be around 150 total */ int fix_spell_damage(int spell_level, int spell_hits) { ++spell_level; ++spell_hits; int total = number_range(spell_level * 2, spell_level * 4); total /= spell_hits; total += 1; total += number_range(1, 2); return total; } int calculate_spellcost(int level, int mana_cost) { int total; if (level == 1) return mana_cost; total = (++mana_cost / ++level); if (total <= 0) total = 1; return total; } /* * test_spell() * * Utility to test damage of spells given * arguments of level and hits total */ void test_spell (CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MSL]; int level; int hits; int dam; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1 == '\0' || arg2 == '\0') { stc("Syntax: testspell <level> <hits\n", ch); return; } level = atoi(arg1); hits = atoi(arg2); dam = fix_spell_damage(level, hits); sprintf(buf, "Spell level: {R%d{x\n", level); stc(buf, ch); sprintf(buf, "Spell Hits: {Y%d{x\n", hits); stc(buf, ch); sprintf(buf, "Damage per hit: {W%d{x\n", dam); stc(buf, ch); stc("---------------------------\n", ch); sprintf(buf, "Avg damage: {w%d{x\n", (dam * hits)); stc(buf, ch); } /* * find_base_attack * Determines base attack bonus */ int find_base_attack(CHAR_DATA * ch) { int bonus; switch(ch->class) { default: log_string("find base attack: ERROR no class?"); break; case CLASS_FIGHTER: bonus = interpolate(ch->level, 1, 20); break; case CLASS_THIEF: bonus = interpolate(ch->level, 1, 15); break; case CLASS_WIZARD: bonus = interpolate(ch->level, 1, 5); break; case CLASS_PRIEST: bonus = interpolate(ch->level, 1, 10); break; case CLASS_SWORDANGEL: bonus = interpolate(ch->level, 1, 30); break; } return bonus; } /* * level_char_hp() * * Determines how much hp the player gains on level */ int level_char_hp(CHAR_DATA * ch) { int hp; switch(ch->class) { default: log_string("level_char_hp: ERROR no class?"); break; case CLASS_FIGHTER: hp = number_range(15, 25); break; case CLASS_THIEF: hp = number_range(11, 19); break; case CLASS_WIZARD: hp = number_range(7, 13); break; case CLASS_PRIEST: hp = number_range(10, 14); break; } return hp; } /* * level_char_mana() * * Determines how much mana the player gains per level */ int level_char_mana(CHAR_DATA * ch) { int mana; switch(ch->class) { default: log_string("level_char_mana: ERROR no class?"); break; case CLASS_FIGHTER: mana = number_range(7, 13); break; case CLASS_THIEF: mana = number_range(10, 14); break; case CLASS_WIZARD: mana = number_range(15, 25); break; case CLASS_PRIEST: mana = number_range(11, 19); break; } return mana; } /* * level_char_move() * * Determines how much move per level the player gains */ int level_char_move(CHAR_DATA * ch) { int move; switch(ch->class) { default: log_string("level_char_mana: ERROR no class?"); break; case CLASS_FIGHTER: case CLASS_THIEF: case CLASS_SWORDANGEL: move = number_range(10, 20); break; case CLASS_WIZARD: case CLASS_PRIEST: move = number_range(7, 13); break; } return move; }