#include <sys/types.h> #include <sys/time.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <zlib.h> /* include main header file */ #include "mud.h" /* * The Master Race...Table ;) */ struct race_type race_table[] = { /* 0 */ {"Protoplasm", "Protoplasm", RACE_PROTO, NO_RESTRICTIONS, 10, 5, 7, {1, 9}}, /* 1 */ {"Nord", "Nord", RACE_NORD, NO_RESTRICTIONS, 10, 5, 6, {1, 9}}, /* 2 */ {"Feltain", "Feltain", RACE_FELAIN, NO_RESTRICTIONS, 10, 25, 20, {1, 9}}, /* 3 */ {"Dwarf", "Dwarf", RACE_DWARF, NO_RESTRICTIONS, 8, 10, 15, {1, 9}}, /* 4 */ {"Human", "Human", RACE_HUMAN, NO_RESTRICTIONS, 15, 5, 10, {1, 9}}, /* 5 */ {"Gorian", "Gorian", RACE_GORIAN, NO_RESTRICTIONS, 10, 20, 15}, /* 6 */ {"Wood Elf", "welf", RACE_WOOD_ELF, NO_RESTRICTIONS, 12, 12, 15, {1, 9}}, /* 7 */ {"High Elf", "helf", RACE_HIGH_ELF, NO_RESTRICTIONS, 12, 12, 12, {1, 9}}, /* 8 */ {"Dark Elf", "delf", RACE_HIGH_ELF, NO_RESTRICTIONS, 5, 20, 17, {1, 9}} }; /* * The Master Class Table */ struct class_type class_table[] = { /* 1*/ {"Protoplasm", CLASS_PROTO, 25, 4, NO_RESTRICTIONS}, /* 2*/ {"Thief", CLASS_THIEF, 25, 10, NO_RESTRICTIONS}, /* 3*/ {"Burglar", CLASS_BURGLAR, 25, 8, NO_RESTRICTIONS}, /* 4*/ {"Assassin", CLASS_ASSASSIN, 25, 12, NO_RESTRICTIONS}, /* 5*/ {"Rogue", CLASS_PROTO, 25, 14, NO_RESTRICTIONS}, /* 6*/ {"Acrobat", CLASS_ACROBAT, 25, 8, NO_RESTRICTIONS}, /* 7*/ {"Bard", CLASS_BARD, 25, 10, NO_RESTRICTIONS}, /* 8*/ {"Warrior", CLASS_WARRIOR, 25, 20, NO_RESTRICTIONS}, /* 9*/ {"Knight", CLASS_KNIGHT, 25, 18, NO_RESTRICTIONS}, /* 10*/ {"Ranger", CLASS_RANGER, 25, 18, NO_RESTRICTIONS}, /* 11*/ {"Archer", CLASS_ARCHER, 25, 16, NO_RESTRICTIONS}, /* 12*/ {"Monk", CLASS_MONK, 25, 24, NO_RESTRICTIONS}, /* 13*/ {"Barbarian", CLASS_BARBARIAN, 25, 30, NO_RESTRICTIONS}, /* 14*/ {"Mage", CLASS_MAGE, 25, 6, NO_RESTRICTIONS}, /* 15*/ {"Sorcerer", CLASS_SOURCERER, 25, 6, NO_RESTRICTIONS}, /* 16*/ {"Healer", CLASS_HEALER, 25, 8, NO_RESTRICTIONS}, /* 17*/ {"Battle Mage", CLASS_BATTLE_MAGE, 25, 10, NO_RESTRICTIONS}, /* 18*/ {"Spellsword", CLASS_SPELLSWORD, 25, 12, NO_RESTRICTIONS}, /* 19*/ {"Nightblade", CLASS_NIGHTBLADE, 25, 8, NO_RESTRICTIONS} }; /* * The Master Talent Table */ struct abilities_type talent_table[] = { {"Alertness", 1, 1}, {"Athletics", 2, 1}, {"Brawl", 3, 1}, {"Climbing", 4, 1}, {"Diplomacy", 5, 1}, {"Dodge", 6, 1}, {"Empathy", 7, 1}, {"Expression", 8, 1}, {"Instruction", 9, 1}, {"Intimidation", 10, 1}, {"Fortune_Telling", 11, 1}, {"Primal-Urge", 12, 1}, {"Search", 13, 1}, {"Street-wise", 14, 1}, {"Subterfuge", 15, 1}, }; /* * The Master Skills Table */ struct abilities_type skill_table[] = { {"Archery", 1, 1}, {"Animal_Ken", 2, 1}, {"First_Aid", 3, 1}, {"Etiquette", 4, 1}, {"Melee", 5, 1}, {"Leadership", 6, 1}, {"Lock_Picking", 7, 1}, {"Pick_Pocketing", 8, 1}, {"Performance", 9, 1}, {"Repair", 10, 1}, {"Stealth", 11, 1}, {"Reading", 12, 1}, {"Swimming", 13, 1}, {"Survival", 14, 1}, {"Tracking", 15, 1}, }; /* * The master Knowledge Table */ struct abilities_type knowledge_table[] = { {"Alchemy", 1, 1}, {"Astrology", 2, 1}, {"Astronomy", 3, 1}, {"Engimas", 4, 1}, {"Herbalism", 5, 1}, {"Investigation", 6, 1}, {"Law", 7, 1}, {"Lore", 8, 1}, {"Linguistics", 9, 1}, {"Medicine", 10, 1}, {"Occult", 11, 1}, {"Poisons", 12, 1}, {"Politics", 13, 1}, {"Rituals", 14, 1}, {"Science", 15, 1}, }; void cmd_train(D_MOBILE * ch, char *arg) { char arg1[MAX_BUFFER]; char arg2[MAX_BUFFER]; char buf[MAX_BUFFER]; int x, cost, final; arg = one_arg(arg, arg1); arg = one_arg(arg, arg2); if (arg1[0] == '\0' || arg1[0] == '\0') { stc("syntax: train <type> <skill>\n", ch); stc("Valid types are: knowledge, skills, talents\n", ch); return; } if (compares(arg1, "knowledge")) { x = find_knowledge(arg2); if (knowledge_table[x].name == NULL) { stc("Invalid Knowledge\n", ch); return; } if (ch->knowledge[x] < 5) { sprintf(buf, "%s is already at five dots!\n", knowledge_table[x].name); stc(buf, ch); return; } cost = (ch->knowledge[x] * knowledge_table[x].modifier); final = (cost - ch->xp); if (ch->xp > cost) { sprintf(buf, "You do not have enough points to increase %s further.\n", knowledge_table[x].name); stc(buf, ch); sprintf(buf, "You need a further %d experience points to raise %s further.\n", final, knowledge_table[x].name); stc(buf, ch); return; } ch->knowledge[x]++; ch->xp -= cost; sprintf(buf, "%s has been raised to %d dots!\n", knowledge_table[x].name, ch->knowledge[x]); stc(buf, ch); return; } if (compares(arg1, "skill")) { x = find_skill(arg2); if (skill_table[x].name == NULL) { stc("Invalid skills\n", ch); return; } if (ch->skills[x] < 5) { sprintf(buf, "%s is already at five dots!\n", skill_table[x].name); stc(buf, ch); return; } cost = (ch->skills[x] * skill_table[x].modifier); final = (cost - ch->xp); if (ch->xp > cost) { sprintf(buf, "You do not have enough points to increase %s further.\n", skill_table[x].name); stc(buf, ch); sprintf(buf, "You need a further %d experience points to raise %s further.\n", final, skill_table[x].name); stc(buf, ch); return; } ch->skills[x]++; ch->xp -= cost; sprintf(buf, "%s has been raised to %d dots!\n", skill_table[x].name, ch->skills[x]); stc(buf, ch); return; } if (compares(arg1, "talent")) { x = find_talent(arg2); if (talent_table[x].name == NULL) { stc("Invalid talents\n", ch); return; } if (ch->talents[x] < 5) { sprintf(buf, "%s is already at five dots!\n", talent_table[x].name); stc(buf, ch); return; } cost = (ch->talents[x] * talent_table[x].modifier); final = (cost - ch->xp); if (ch->xp > cost) { sprintf(buf, "You do not have enough points to increase %s further.\n", talent_table[x].name); stc(buf, ch); sprintf(buf, "You need a further %d experience points to raise %s further.\n", final, talent_table[x].name); stc(buf, ch); return; } ch->talents[x]++; ch->xp -= cost; sprintf(buf, "%s has been raised to %d dots!\n", talent_table[x].name, ch->talents[x]); stc(buf, ch); return; } } /* * return_class() * Returns table pointer to class * data based on defined class name */ int return_class (int pclass) { int x; for (x = 0; x <= CLASS_MAX; x++) { if (class_table[x].class_number == pclass) return x; } return 0; } /* * return_race() * Returns table pointer to race * data based on defined race name */ int return_race (int prace) { int x; for (x = 0; x <= RACE_MAX; x++) { if (race_table[x].race_number == prace) return x; } return 0; } /* * find_race() * * Takes arg *name, to lookup * a race number, based on short_name (1 word name) */ int find_race(const char *name) { int i; for (i = 0; i < RACE_MAX; i++) { if (race_table[i].sname == NULL) break; if (LOWER (name[0]) == LOWER (race_table[i].sname[0]) && compares (name, race_table[i].sname)) return i; } return 0; } /* * find_class() * * Takes arg *name, to lookup * a class number */ int find_class(const char *name) { int i; for (i = 0; i < CLASS_MAX; i++) { if (class_table[i].name == NULL) break; if (LOWER (name[0]) == LOWER (class_table[i].name[0]) && compares (name, class_table[i].name)) return i; } return 0; } /* * find_skill() * Returns skill number based on name */ int find_skill(const char *name) { int i; for (i = 0; i < MAX_SKILLS; i++) { if (skill_table[i].name == NULL) break; if (LOWER (name[0]) == LOWER (skill_table[i].name[0]) && compares (name, skill_table[i].name)) return i; } return 0; } /* * find_talent() * Returns talent number based on name */ int find_talent(const char *name) { int i; for (i = 0; i < MAX_TALENTS; i++) { if (talent_table[i].name == NULL) break; if ( LOWER (name[0]) == LOWER (talent_table[i].name[0]) && compares (name, talent_table[i].name)) return i; } return 0; } /* * find_knowledge() * Returns knowledge number based on name */ int find_knowledge(const char *name) { int i; for (i = 0; i < MAX_KNOW; i++) { if (knowledge_table[i].name == NULL) break; if ( LOWER (name[0]) == LOWER (knowledge_table[i].name[0]) && compares (name, knowledge_table[i].name)) return i; } return 0; }