/************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefiting. We hope that you share your changes too. What goes * * around, comes around. * *************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * *************************************************************************** * 1stMUD ROM Derivative (c) 2001-2003 by Ryan Jennings * * http://1stmud.dlmud.com/ <r-jenn@shaw.ca> * ***************************************************************************/ #include "merc.h" #include "olc.h" #include "lookup.h" #include "interp.h" #include "tables.h" #include "recycle.h" OLCED(raedit_create) { RACE_DATA *pRace; char buf[MIL]; if (!IS_NULLSTR(argument) && race_lookup(argument) == NULL) sprintf(buf, argument); else sprintf(buf, "New Race%d", maxRace + 1); pRace = new_race(); replace_string(pRace->name, buf); LINK(pRace, race_first, race_last, next, prev); edit_start(ch, pRace, ED_RACE); chprintln(ch, "Race created."); return TRUE; } OLCED(raedit_list) { RACE_DATA *i; int count = 0; chprintln(ch, "Num Race Name\n\r" "-----------------------------------------------"); for (i = race_first; i; i = i->next) { if (!IS_NULLSTR(i->name)) { count++; chprintlnf(ch, "[%2d] %-30s", count, i->name); } } chprintln(ch, "\n\r-----------------------------------------------"); return FALSE; } OLCED(raedit_show) { RACE_DATA *pRace; int x; EDIT_RACE(ch, pRace); chprintln(ch, draw_line(ch, NULL, 0)); chprintlnf(ch, "Name:\t[%s] PC Race: [%s]", pRace->name, pRace->pc_race == 0 ? "{WNO{w" : "{RYES{w"); chprintlnf(ch, "Act:\t[%s]", flag_string(act_flags, pRace->act)); chprintlnf(ch, "Aff:\t[%s]", flag_string(affect_flags, pRace->aff)); chprintlnf(ch, "Off:\t[%s]", flag_string(off_flags, pRace->off)); chprintlnf(ch, "Imm:\t[%s]", flag_string(imm_flags, pRace->imm)); chprintlnf(ch, "Res:\t[%s]", flag_string(res_flags, pRace->res)); chprintlnf(ch, "Vuln:\t[%s]", flag_string(vuln_flags, pRace->vuln)); chprintlnf(ch, "Form:\t[%s]", flag_string(form_flags, pRace->form)); chprintlnf(ch, "Parts:\t[%s]", flag_string(part_flags, pRace->parts)); chprintlnf(ch, "Points:\t[%d]", pRace->points); chprint(ch, "ClassX:\t"); for (x = 0; x < maxClass; x++) { chprintf(ch, "%s [%d] ", class_table[x].name, pRace->class_mult[x]); } chprintln(ch, ""); chprint(ch, "Skills:\t"); for (x = 0; x < 5; x++) { if (pRace->skills[x] && skill_lookup(pRace->skills[x]) > -1) { chprintf(ch, "[%s] ", pRace->skills[x]); } } chprintln(ch, ""); chprintlnf (ch, "Stats\tSTR[%d] INT[%d] WIS[%d] DEX[%d] CON[%d]", pRace->stats[STAT_STR], pRace->stats[STAT_INT], pRace->stats[STAT_WIS], pRace->stats[STAT_DEX], pRace->stats[STAT_CON]); chprintlnf (ch, "MStats\tSTR[%d] INT[%d] WIS[%d] DEX[%d] CON[%d]", pRace->max_stats[STAT_STR], pRace->max_stats[STAT_INT], pRace->max_stats[STAT_WIS], pRace->max_stats[STAT_DEX], pRace->max_stats[STAT_CON]); chprintlnf(ch, "Size:\t[%s]", flag_string(size_flags, pRace->size)); chprintln(ch, draw_line(ch, NULL, 0)); return FALSE; } OLCED(raedit_classx) { char clas[MSL]; char value[MSL]; RACE_DATA *pRace; EDIT_RACE(ch, pRace); if (!pRace->pc_race) { chprintln(ch, "Race must be a PC race first."); return FALSE; } if (!IS_NULLSTR(argument)) { argument = one_argument(argument, clas); argument = one_argument(argument, value); if (class_lookup(clas) < 0) { chprintln(ch, "That class does not exist."); return FALSE; } if (!is_number(value)) { chprintln(ch, "Second argument must be numeric."); return FALSE; } if (atoi(value) < 75) { chprintln(ch, "{RWARNING!{x Class modifier should be at least 75."); } pRace->class_mult[class_lookup(clas)] = atoi(value); chprintlnf(ch, "Race modifier for class %s is set to %d.", clas, atoi(value)); return TRUE; } chprintln(ch, "Syntax: classx class value"); return FALSE; } OLCED(raedit_skills) { int x; RACE_DATA *pRace; EDIT_RACE(ch, pRace); if (!pRace->pc_race) { chprintln(ch, "Race must be a PC race first."); return FALSE; } if (skill_lookup(argument) != -1) { if (pRace->skills[0] != NULL && pRace->skills[1] != NULL && pRace->skills[2] != NULL && pRace->skills[3] != NULL && pRace->skills[4] != NULL && pRace->skills[5] != NULL) { chprintln(ch, "No avaliable slot for the skill"); return FALSE; } for (x = 0; x < 5; x++) { if (!str_cmp(pRace->skills[x], argument)) { pRace->skills[x] = NULL; chprintlnf(ch, "Skill %s deleted.", argument); return TRUE; } if (pRace->skills[x] == NULL) { replace_string(pRace->skills[x], argument); chprintlnf(ch, "Skill %s set.", argument); return TRUE; } } } chprintln(ch, "Syntax: skills skill"); return FALSE; } OLCED(raedit_stats) { char str[MSL]; char inte[MSL]; char wis[MSL]; char dex[MSL]; char con[MSL]; RACE_DATA *pRace; EDIT_RACE(ch, pRace); if (!pRace->pc_race) { chprintln(ch, "Race must be a PC race first."); return FALSE; } if (!IS_NULLSTR(argument)) { argument = one_argument(argument, str); argument = one_argument(argument, inte); argument = one_argument(argument, wis); argument = one_argument(argument, dex); argument = one_argument(argument, con); if (!str || !is_number(str)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!inte || !is_number(inte)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!wis || !is_number(wis)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!dex || !is_number(dex)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!con || !is_number(con)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } pRace->stats[STAT_STR] = atoi(str); pRace->stats[STAT_INT] = atoi(inte); pRace->stats[STAT_WIS] = atoi(wis); pRace->stats[STAT_DEX] = atoi(dex); pRace->stats[STAT_CON] = atoi(con); chprintlnf (ch, "Stats set to: str[%d] int[%d] wis[%d] dex[%d] con[%d]", atoi(str), atoi(inte), atoi(wis), atoi(dex), atoi(con)); return TRUE; } chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } OLCED(raedit_mstats) { char str[MSL]; char inte[MSL]; char wis[MSL]; char dex[MSL]; char con[MSL]; RACE_DATA *pRace; EDIT_RACE(ch, pRace); if (!pRace->pc_race) { chprintln(ch, "Race must be a PC race first."); return FALSE; } if (!IS_NULLSTR(argument)) { argument = one_argument(argument, str); argument = one_argument(argument, inte); argument = one_argument(argument, wis); argument = one_argument(argument, dex); argument = one_argument(argument, con); if (!str || !is_number(str)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!inte || !is_number(inte)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!wis || !is_number(wis)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!dex || !is_number(dex)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } if (!con || !is_number(con)) { chprintln(ch, "Syntax: stats str int wis dex con."); return FALSE; } pRace->max_stats[STAT_STR] = atoi(str); pRace->max_stats[STAT_INT] = atoi(inte); pRace->max_stats[STAT_WIS] = atoi(wis); pRace->max_stats[STAT_DEX] = atoi(dex); pRace->max_stats[STAT_CON] = atoi(con); chprintlnf (ch, "Max Stats set to: str[%d] int[%d] wis[%d] dex[%d] con[%d]", atoi(str), atoi(inte), atoi(wis), atoi(dex), atoi(con)); return TRUE; } chprintln(ch, "Syntax: mstats str int wis dex con."); return FALSE; } OLCED(raedit_delete) { RACE_DATA *pRace; CHAR_DATA *rch; MOB_INDEX_DATA *mch; int ihash; EDIT_RACE(ch, pRace); if (str_cmp(argument, "confirm")) { chprintln (ch, "Typing 'delete confirm' will permanetely remove this race!"); return FALSE; } else { for (ihash = 0; ihash < MAX_KEY_HASH; ihash++) { for (mch = mob_index_hash[ihash]; mch; mch = mch->next) { if (mch->race == pRace) { mch->race = default_race; SET_BIT(mch->area->area_flags, AREA_CHANGED); } } } for (rch = char_first; rch != NULL; rch = rch->next) { if (rch->race == pRace) { if (IS_NPC(rch)) rch->race = default_race; else rch->race = default_race; } } UNLINK(pRace, race_first, race_last, next, prev); free_race(pRace); pRace = race_first; edit_start(ch, pRace, ED_RACE); chprintln(ch, "Race deleted."); } return TRUE; } OLCED(raedit_name) { RACE_DATA *pRace; MOB_INDEX_DATA *pMob; int ihash; char arg[MIL]; EDIT_RACE(ch, pRace); first_arg(argument, arg, FALSE); if (IS_NULLSTR(arg)) { chprintln(ch, "Change name to what?"); return FALSE; } if (race_lookup(arg) != NULL) { chprintln(ch, "A race with that name already exists."); return FALSE; } if (str_cmp(arg, pRace->name)) { for (ihash = 0; ihash < MAX_KEY_HASH; ihash++) { for (pMob = mob_index_hash[ihash]; pMob; pMob = pMob->next) { if (pMob->race == pRace) SET_BIT(pMob->area->area_flags, AREA_CHANGED); } } } replace_string(pRace->name, arg); chprintln(ch, "Name set."); return TRUE; }