/****************************************************************************/ /* NAMN.C - Create random names. */ /* Somewhat modified for CGI-option... */ /****************************************************************************/ /* Johan Danforth of http://spitfire.ausys.se/johan/workshop/ */ /* */ /* version 2.0 */ /* syntax: namn <rule-file> <nr of names to create> */ /* namn alver.nam 100 */ /* */ /* Default extension for rule-files are *.nam */ /* */ /****************************************************************************/ /**************************************************************************** * Modified by Jack (June 2002) * * + Better ANSI C compliance (will compile on other OSs/compilers!! * + Handles files in both UNIX & the other line ending types * + More paranoid about memory usage & more tolerant of errors in nam file * ****************************************************************************/ /**************************************************************************** * Modified by Xerves (Sept 2004) for Rafermand support ****************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include "mud.h" /****************************************************************************/ /* Compile Time parameters */ /****************************************************************************/ #define SYLLABLES_PER_SECTION 100 //Number of options per section #define SYLLABLE_LENGTH 12 //Max length of a single section #define NAME_LENGTH 36 //Max length of the name #define NAME_DEVIL_FEMALE NAMESET_DIR "devil_female.nam" #define NAME_DEVIL_MALE NAMESET_DIR "devil_male.nam" #define NAME_DWARF_FEMALE NAMESET_DIR "dwarf_female.nam" #define NAME_DWARF_MALE NAMESET_DIR "dwarf_male.nam" #define NAME_ELF_FEMALE NAMESET_DIR "elf_female.nam" #define NAME_ELF_MALE NAMESET_DIR "elf_male.nam" #define NAME_FAIRY_FEMALE NAMESET_DIR "fairy_female.nam" #define NAME_FAIRY_MALE NAMESET_DIR "fairy_male.nam" #define NAME_HUMAN_FEMALE NAMESET_DIR "human_female.nam" #define NAME_HUMAN_MALE NAMESET_DIR "human_male.nam" #define NAME_HOBBIT_FEMALE NAMESET_DIR "hobbit_female.nam" #define NAME_HOBBIT_MALE NAMESET_DIR "hobbit_male.nam" #define NAME_OGRE_FEMALE NAMESET_DIR "ogre_female.nam" #define NAME_OGRE_MALE NAMESET_DIR "ogre_male.nam" #define NAME_FELINE NAMESET_DIR "feline.nam" void get_generate_filename(int race, int sex, char *filename) { if (race == 1 && sex == 1) sprintf(filename, NAME_ELF_MALE); else if (race == 1 && sex == 2) sprintf(filename, NAME_ELF_FEMALE); else if (race == 2 && sex == 1) sprintf(filename, NAME_DWARF_MALE); else if (race == 2 && sex == 2) sprintf(filename, NAME_DWARF_FEMALE); else if (race == 3 && sex == 1) sprintf(filename, NAME_OGRE_MALE); else if (race == 3 && sex == 2) sprintf(filename, NAME_OGRE_FEMALE); else if (race == 4 && sex == 1) sprintf(filename, NAME_HOBBIT_MALE); else if (race == 4 && sex == 2) sprintf(filename, NAME_HOBBIT_FEMALE); else if (race == 5 && sex == 1) sprintf(filename, NAME_FAIRY_MALE); else if (race == 5 && sex == 2) sprintf(filename, NAME_FAIRY_FEMALE); else if (sex == 1) sprintf(filename, NAME_HUMAN_MALE); else sprintf(filename, NAME_HUMAN_FEMALE); return; } //Only need to generate 1 name at a time. Need to supply the race and sex so the //proper rulefile can be used. Lastly, the value is copied into the buffer supplied //so that the command can be called numerious times if needed void generate_randomname(int race, int sex, char *buffer) { time_t t; int gstart = 0; int gmiddle = 0; int gend = 0; int cnt = 0; char tempstring[151]; char filename[256]; char start[SYLLABLES_PER_SECTION][SYLLABLE_LENGTH]; /* start syllable */ char middle[SYLLABLES_PER_SECTION][SYLLABLE_LENGTH]; /* middle syllable */ char end[SYLLABLES_PER_SECTION][SYLLABLE_LENGTH]; /* ending syllable */ char name[NAME_LENGTH]; /* name */ FILE *fp; memset (start, 0, SYLLABLES_PER_SECTION*SYLLABLE_LENGTH); memset (middle, 0, SYLLABLES_PER_SECTION*SYLLABLE_LENGTH); memset (end, 0, SYLLABLES_PER_SECTION*SYLLABLE_LENGTH); memset (name, 0, NAME_LENGTH); strcpy(buffer, ""); if (race < 0 || race >= max_npc_race) { bug("generate_randomname: invalid race of %d", race); return; } if (sex == 0) sex = 1; //Set a male name if sex is 0 get_generate_filename(race, sex, filename); fp = fopen(filename, "r"); if (fp == NULL) { bug("Cannot open file: %s",filename); return; } /* read file until [start] it found (starting syllable) */ while (strcmp(tempstring, "[start]") != 0) { if (++cnt == SYLLABLES_PER_SECTION) { bug("generate_random_name: Aborting before [start] in %s", filename); return; } memset (tempstring, 0, sizeof(tempstring)); fgets(tempstring, 150, fp); if (tempstring[strlen(tempstring)-2] == '\r') { tempstring[strlen(tempstring)-2] = '\0'; } else tempstring[strlen(tempstring)-1] = '\0';/* remove linefeed */ } cnt = 0; /* read file until [middle] is found (middle syllable) */ while (strcmp(tempstring, "[middle]") != 0) { if (++cnt == SYLLABLES_PER_SECTION) { bug("generate_random_name: Aborting before [middle] in %s", filename); return; } memset (tempstring, 0, sizeof(tempstring)); fgets(tempstring, 150, fp); if (tempstring[strlen(tempstring)-2] == '\r') { tempstring[strlen(tempstring)-2] = '\0'; } else tempstring[strlen(tempstring)-1] = '\0';/* remove linefeed */ if ((tempstring[0] != '/') && (tempstring[0] != '[')) { strncpy(start[gstart], tempstring, strlen(tempstring)); gstart++; } } cnt = 0; /* read file until [end] is found (ending syllable) */ while (strcmp(tempstring, "[end]") != 0) { if (++cnt == SYLLABLES_PER_SECTION) { bug("generate_random_name: Aborting before [end] in %s", filename); return; } memset (tempstring, 0, sizeof(tempstring)); fgets(tempstring, 150, fp); if (tempstring[strlen(tempstring)-2] == '\r') { tempstring[strlen(tempstring)-2] = '\0'; } else tempstring[strlen(tempstring)-1] = '\0';/* remove linefeed */ if ((tempstring[0] != '/') && (tempstring[0] != '[')) { strncpy(middle[gmiddle], tempstring, strlen(tempstring)); gmiddle++; } } cnt = 0; /* read file until [stop] is found (end of syllables) */ while (strcmp(tempstring, "[stop]") != 0) { if (++cnt == SYLLABLES_PER_SECTION) { bug("generate_random_name: Aborting before [stop] in %s", filename); return; } memset (tempstring, 0, sizeof(tempstring)); fgets(tempstring, 150, fp); if (tempstring[strlen(tempstring)-2] == '\r') { tempstring[strlen(tempstring)-2] = '\0'; } else tempstring[strlen(tempstring)-1] = '\0';/* remove linefeed */ if ((tempstring[0] != '/') && (tempstring[0] != '[')) { strncpy(end[gend], tempstring, strlen(tempstring)); gend++; } } fclose(fp); srand((unsigned)time(&t)); /* Kick on the rand-generator... */ /* correct the number of available syllables... */ gstart--; gmiddle--; gend--; strcpy(name, start[number_range(0, gstart)]); /* get a start */ strcat(name, middle[number_range(0, gmiddle)]); /* get a middle */ strcat(name, end[number_range(0, gend)]); /* get an ending */ sprintf(buffer, "%s", name); return; } void do_generatename(CHAR_DATA *ch, char *argument) { char arg1[MIL]; char arg2[MIL]; char buf[MSL]; int race; int sex; int cnt = 0; int x; if (argument[0] == '\0') { send_to_char("Syntax: generatename <race> <sex> [#names]\n\r", ch); return; } argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); race = atoi(arg1); if (race < 0 || race >= max_npc_race) { ch_printf(ch, "Range is 0 to %d", max_npc_race); return; } sex = atoi(arg2); if (sex < 1 || sex > 2) { send_to_char("Your choices are 1 for male or 2 for female.\n\r", ch); return; } cnt = atoi(argument); if (cnt < 0 || cnt > 20) { send_to_char("Range for # of names is 0 to 20.\n\r", ch); return; } if (cnt < 1) cnt = 1; for (x = 1; x <= cnt; x++) { generate_randomname(race, sex, buf); ch_printf(ch, "%-15.15s ", buf); if (x % 5 == 0) send_to_char("\n\r", ch); } if (--x % 5 != 0) send_to_char("\n\r", ch); return; }