[BACK]Return to init.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / xrogue

Annotation of early-roguelike/xrogue/init.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:     init.c - global variable initializaton
        !             3:
        !             4:     XRogue: Expeditions into the Dungeons of Doom
        !             5:     Copyright (C) 1991 Robert Pietkivitch
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
        !            10:     All rights reserved.
        !            11:
        !            12:     Based on "Rogue: Exploring the Dungeons of Doom"
        !            13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            14:     All rights reserved.
        !            15:
        !            16:     See the file LICENSE.TXT for full copyright and licensing information.
        !            17: */
        !            18:
        !            19: #include <curses.h>
        !            20: #include <ctype.h>
        !            21: #include <string.h>
        !            22: #include "rogue.h"
        !            23: #include "mach_dep.h"
        !            24:
        !            25: /*
        !            26:  * If there is any news, put it in a character string and assign it to
        !            27:  * rogue_news.  Otherwise, assign NULL to rogue_news.
        !            28:  */
        !            29:
        !            30: static char *rogue_news = "Enter a number within the minimum and maximum \
        !            31: range.  When satisfied with your  choices, enter a 'y'.  For help at any \
        !            32: other time enter a '?' or a '='.";
        !            33:
        !            34: /* replace the above line with this when descriptions are done  */
        !            35: /* other time enter a '?' or a '='.         For character and item descriptions \
        !            36: enter a '\\' on any other screen.";
        !            37: */
        !            38:
        !            39: struct words rainbow[NCOLORS] = {
        !            40: { "Amber" },          { "Aquamarine" },       { "Beige" },
        !            41: { "Black" },          { "Blue" },             { "Brown" },
        !            42: { "Clear" },          { "Crimson" },          { "Ecru" },
        !            43: { "Gold" },           { "Green" },            { "Grey" },
        !            44: { "Indigo" },         { "Khaki" },            { "Lavender" },
        !            45: { "Magenta" },        { "Orange" },           { "Pink" },
        !            46: { "Plaid" },          { "Purple" },           { "Red" },
        !            47: { "Silver" },         { "Saffron" },          { "Scarlet" },
        !            48: { "Tan" },            { "Tangerine" },        { "Topaz" },
        !            49: { "Turquoise" },      { "Vermilion" },        { "Violet" },
        !            50: { "White" },          { "Yellow" }
        !            51: };
        !            52:
        !            53: struct words sylls[NSYLLS] = {
        !            54:     {"a"},   {"ae"},  {"ak"},  {"an"},  {"ax"},  {"ach"}, {"ano"}, {"ars"},
        !            55:     {"bha"}, {"bar"}, {"bre"}, {"cha"}, {"cre"}, {"cum"}, {"cow"}, {"duh"},
        !            56:     {"dha"}, {"e"},   {"ea"},  {"em"},  {"et"},  {"ey"},  {"eck"}, {"etk"},
        !            57:     {"egg"}, {"exl"}, {"fu"},  {"fen"}, {"fid"}, {"gan"}, {"gle"}, {"h"},
        !            58:     {"ha"},  {"hr"},  {"ht"},  {"how"}, {"hex"}, {"hip"}, {"hoc"}, {"i"},
        !            59:     {"ia"},  {"ig"},  {"it"},  {"iz"},  {"ion"}, {"ink"}, {"ivi"}, {"iss"},
        !            60:     {"je"},  {"jin"}, {"jha"}, {"jyr"}, {"ka"},  {"kho"}, {"kal"}, {"kli"},
        !            61:     {"lu"},  {"lre"}, {"lta"}, {"lri"}, {"m"},   {"ma"},  {"mh"},  {"mi"},
        !            62:     {"mr"},  {"mar"}, {"myr"}, {"moh"}, {"mul"}, {"nep"}, {"nes"}, {"o"},
        !            63:     {"oc"},  {"om"},  {"oq"},  {"ox"},  {"orn"}, {"oxy"}, {"olm"}, {"ode"},
        !            64:     {"po"},  {"pie"}, {"pod"}, {"pot"}, {"qar"}, {"que"}, {"ran"}, {"rah"},
        !            65:     {"rok"}, {"sa"},  {"sat"}, {"sha"}, {"sol"}, {"sri"}, {"ti"},  {"tem"},
        !            66:     {"tar"}, {"tki"}, {"tch"}, {"tox"}, {"u"},   {"ub"},  {"uh"},  {"ur"},
        !            67:     {"uv"},  {"unk"}, {"uwh"}, {"ugh"}, {"uyr"}, {"va"},  {"vil"}, {"vit"},
        !            68:     {"vom"}, {"vux"}, {"wah"}, {"wex"}, {"xu"},  {"xed"}, {"xen"}, {"ya"},
        !            69:     {"yep"}, {"yih"}, {"zef"}, {"zen"}, {"zil"}, {"zym"}, {"-"}
        !            70: };
        !            71:
        !            72: struct words stones[NSTONES] = {
        !            73:       { "Agate" },            { "Alexandrite" },      { "Amethyst" },
        !            74:       { "Azurite" },          { "Bloodstone" },       { "Cairngorm" },
        !            75:       { "Carnelian" },        { "Chalcedony" },       { "Chrysoberyl" },
        !            76:       { "Chrysolite" },       { "Chrysoprase" },      { "Citrine" },
        !            77:       { "Coral" },            { "Diamond" },          { "Emerald" },
        !            78:       { "Garnet" },           { "Heliotrope" },       { "Hematite" },
        !            79:       { "Hyacinth" },         { "Jacinth" },          { "Jade" },
        !            80:       { "Jargoon" },          { "Jasper" },           { "Kryptonite" },
        !            81:       { "Lapis lazuli" },     { "Malachite" },        { "Mocca stone" },
        !            82:       { "Moonstone" },        { "Obsidian" },         { "Olivine" },
        !            83:       { "Onyx" },             { "Opal" },             { "Pearl" },
        !            84:       { "Peridot" },          { "Quartz" },           { "Rhodochrosite" },
        !            85:       { "Rhodolite" },        { "Ruby" },             { "Sapphire" },
        !            86:       { "Sardonyx" },         { "Serpentine" },       { "Spinel" },
        !            87:       { "Tiger eye" },        { "Topaz" },            { "Tourmaline" },
        !            88:       { "Turquoise" },        { "Zircon" }
        !            89: };
        !            90:
        !            91: struct words wood[NWOOD] = {
        !            92:         {"Avocado wood"}, {"Balsa"},        {"Banyan"},       {"Birch"},
        !            93:         {"Cedar"},        {"Cherry"},       {"Cinnabar"},     {"Dogwood"},
        !            94:         {"Driftwood"},    {"Ebony"},        {"Eucalyptus"},   {"Hemlock"},
        !            95:         {"Ironwood"},     {"Mahogany"},     {"Manzanita"},    {"Maple"},
        !            96:         {"Oak"},          {"Pine"},         {"Redwood"},      {"Rosewood"},
        !            97:         {"Teak"},         {"Walnut"},       {"Aloe"},         {"Sandalwood"}
        !            98: };
        !            99:
        !           100: struct words metal[NMETAL] = {
        !           101:         {"Aluminium"},    {"Bone"},         {"Brass"},        {"Bronze"},
        !           102:         {"Copper"},       {"Chromium"},     {"Iron"},         {"Lead"},
        !           103:         {"Magnesium"},    {"Pewter"},       {"Platinum"},     {"Silver"},
        !           104:         {"Steel"},        {"Tin"},          {"Titanium"},     {"Zinc"}
        !           105: };
        !           106:
        !           107: /*
        !           108:  * make sure all the percentages specified in the tables add up to the
        !           109:  * right amounts
        !           110:  */
        !           111:
        !           112: void
        !           113: badcheck(char *name, struct magic_item *magic, int bound)
        !           114: {
        !           115:     register struct magic_item *end;
        !           116:
        !           117:     if (magic[bound - 1].mi_prob == 1000)
        !           118:         return;
        !           119:     printf("\nBad percentages for %s:\n", name);
        !           120:     for (end = &magic[bound] ; magic < end ; magic++)
        !           121:         printf("%4d%% %s\n", magic->mi_prob, magic->mi_name);
        !           122:     printf(retstr);
        !           123:     fflush(stdout);
        !           124:     while (getchar() != '\n')
        !           125:         continue;
        !           126: }
        !           127:
        !           128: /*
        !           129:  * init_colors:
        !           130:  *      Initialize the potion color scheme for this time
        !           131:  */
        !           132:
        !           133: void
        !           134: init_colors(void)
        !           135: {
        !           136:     register int i;
        !           137:     register char *str;
        !           138:
        !           139:     for (i = 0 ; i < MAXPOTIONS ; i++)
        !           140:     {
        !           141:         do
        !           142:             str = rainbow[rnd(NCOLORS)].w_string;
        !           143:         until (isupper(*str));
        !           144:         *str = tolower(*str);
        !           145:         p_colors[i] = str;
        !           146:         p_know[i] = FALSE;
        !           147:         p_guess[i] = NULL;
        !           148:         if (i > 0)
        !           149:                 p_magic[i].mi_prob += p_magic[i-1].mi_prob;
        !           150:     }
        !           151:     badcheck("potions", p_magic, MAXPOTIONS);
        !           152: }
        !           153:
        !           154: /*
        !           155:  * do any initialization for food
        !           156:  */
        !           157:
        !           158: void
        !           159: init_foods(void)
        !           160: {
        !           161:     register int i;
        !           162:
        !           163:     for (i=0; i < MAXFOODS; i++) {
        !           164:         if (i > 0)
        !           165:             foods[i].mi_prob += foods[i-1].mi_prob;
        !           166:     }
        !           167:     badcheck("foods", foods, MAXFOODS);
        !           168: }
        !           169:
        !           170: /*
        !           171:  * init_materials:
        !           172:  *      Initialize the construction materials for wands and staffs
        !           173:  */
        !           174:
        !           175: void
        !           176: init_materials(void)
        !           177: {
        !           178:     register int i;
        !           179:     register char *str;
        !           180:
        !           181:     for (i = 0 ; i < MAXSTICKS ; i++)
        !           182:     {
        !           183:         do
        !           184:             if (rnd(100) > 50)
        !           185:             {
        !           186:                 str = metal[rnd(NMETAL)].w_string;
        !           187:                 if (isupper(*str))
        !           188:                         ws_type[i] = "wand";
        !           189:             }
        !           190:             else
        !           191:             {
        !           192:                 str = wood[rnd(NWOOD)].w_string;
        !           193:                 if (isupper(*str))
        !           194:                         ws_type[i] = "staff";
        !           195:             }
        !           196:         until (isupper(*str));
        !           197:         *str = tolower(*str);
        !           198:         ws_made[i] = str;
        !           199:         ws_know[i] = FALSE;
        !           200:         ws_guess[i] = NULL;
        !           201:         if (i > 0)
        !           202:                 ws_magic[i].mi_prob += ws_magic[i-1].mi_prob;
        !           203:     }
        !           204:     badcheck("sticks", ws_magic, MAXSTICKS);
        !           205: }
        !           206:
        !           207: /*
        !           208:  * do any initialization for miscellaneous magic
        !           209:  */
        !           210:
        !           211: void
        !           212: init_misc(void)
        !           213: {
        !           214:     register int i;
        !           215:
        !           216:     for (i=0; i < MAXMM; i++) {
        !           217:         m_know[i] = FALSE;
        !           218:         m_guess[i] = NULL;
        !           219:         if (i > 0)
        !           220:             m_magic[i].mi_prob += m_magic[i-1].mi_prob;
        !           221:     }
        !           222:     badcheck("miscellaneous magic", m_magic, MAXMM);
        !           223: }
        !           224:
        !           225: /*
        !           226:  * init_names:
        !           227:  *      Generate the names of the various scrolls
        !           228:  */
        !           229:
        !           230: void
        !           231: init_names(void)
        !           232: {
        !           233:     register int nsyl;
        !           234:     register char *cp, *sp;
        !           235:     register int i, nwords;
        !           236:
        !           237:     for (i = 0 ; i < MAXSCROLLS ; i++)
        !           238:     {
        !           239:         cp = prbuf;
        !           240:         nwords = rnd(cols/20) + 1 + (cols > 40 ? 1 : 0);
        !           241:         while(nwords--)
        !           242:         {
        !           243:             nsyl = rnd(5)+1;
        !           244:             while(nsyl--)
        !           245:             {
        !           246:                 sp = sylls[rnd(NSYLLS)].w_string;
        !           247:                 while(*sp)
        !           248:                     *cp++ = *sp++;
        !           249:             }
        !           250:             *cp++ = ' ';
        !           251:         }
        !           252:         *--cp = '\0';
        !           253:         s_names[i] = (char *) new(strlen(prbuf)+1);
        !           254:         s_know[i] = FALSE;
        !           255:         s_guess[i] = NULL;
        !           256:         strcpy(s_names[i], prbuf);
        !           257:         if (i > 0)
        !           258:                 s_magic[i].mi_prob += s_magic[i-1].mi_prob;
        !           259:     }
        !           260:     badcheck("scrolls", s_magic, MAXSCROLLS);
        !           261: }
        !           262:
        !           263: /*
        !           264:  * init_player:
        !           265:  *      roll up the rogue
        !           266:  */
        !           267:
        !           268: void
        !           269: init_player(void)
        !           270: {
        !           271:     int stat_total, round = 0, minimum, maximum, ch, i, j = 0;
        !           272:     short do_escape, *our_stats[NUMABILITIES-1];
        !           273:     struct linked_list  *weap_item, *armor_item, *food_item;
        !           274:     struct object *obj;
        !           275:
        !           276:     weap_item = armor_item = food_item = NULL;
        !           277:
        !           278:     if (char_type == -1) {  /* not set via options */
        !           279:         /* See what type character will be */
        !           280:         wclear(hw);
        !           281:         touchwin(hw);
        !           282:         wmove(hw,2,0);
        !           283:         for(i=1; i<=NUM_CHARTYPES-1; i++) {
        !           284:             wprintw(hw,"[%d] %s\n",i,char_class[i-1].name);
        !           285:         }
        !           286:         mvwaddstr(hw, 0, 0, "What character class do you desire? ");
        !           287:         draw(hw);
        !           288:         char_type = (wgetch(hw) - '0');
        !           289:         while (char_type < 1 || char_type > NUM_CHARTYPES-1) {
        !           290:             wmove(hw,0,0);
        !           291:             wprintw(hw,"Please enter a character type between 1 and %d: ",
        !           292:                     NUM_CHARTYPES-1);
        !           293:             draw(hw);
        !           294:             char_type = (wgetch(hw) - '0');
        !           295:         }
        !           296:         char_type--;
        !           297:     }
        !           298:     player.t_ctype = char_type;
        !           299:     player.t_quiet = 0;
        !           300:     pack = NULL;
        !           301:
        !           302:     /* Select the gold */
        !           303:     purse = 3000;
        !           304:     switch (player.t_ctype) {
        !           305:         case C_FIGHTER:
        !           306:             purse += 200;
        !           307:         when C_MAGICIAN:
        !           308:         case C_CLERIC:
        !           309:         case C_DRUID:
        !           310:             purse += 100;
        !           311:         when C_THIEF:
        !           312:         case C_ASSASSIN:
        !           313:         purse += 0;
        !           314:         when C_RANGER:
        !           315:         case C_PALADIN:
        !           316:             purse -= 100;
        !           317:         when C_MONK:
        !           318:             purse -= 200;
        !           319:     }
        !           320:     /*
        !           321:      * allow me to describe a super character
        !           322:      */
        !           323:         /* let's lessen the restrictions on this okay? */
        !           324:     if (wizard && strcmp(getenv("SUPER"),"YES") == 0) {
        !           325:         pstats.s_str = MAXATT;
        !           326:         pstats.s_intel = MAXATT;
        !           327:         pstats.s_wisdom = MAXATT;
        !           328:         pstats.s_dext = MAXATT;
        !           329:         pstats.s_const = MAXATT;
        !           330:         pstats.s_charisma = MAXATT;
        !           331:         pstats.s_exp = 10000000L;
        !           332:         pstats.s_lvl = 1;
        !           333:         pstats.s_lvladj = 0;
        !           334:         pstats.s_hpt = 500;
        !           335:         pstats.s_carry = totalenc(&player);
        !           336:         strcpy(pstats.s_dmg,"4d8");
        !           337:         check_level();
        !           338:         wmove(hw,0,0);
        !           339:         wclrtoeol(hw);
        !           340:         draw(hw);
        !           341:         mpos = 0;
        !           342:
        !           343:     /* set quest item */
        !           344:     if(player.t_ctype == C_FIGHTER)  quest_item = AXE_AKLAD;
        !           345:     if(player.t_ctype == C_RANGER)   quest_item = BRIAN_MANDOLIN;
        !           346:     if(player.t_ctype == C_PALADIN)  quest_item = HEIL_ANKH;
        !           347:     if(player.t_ctype == C_MAGICIAN) quest_item = STONEBONES_AMULET;
        !           348:     if(player.t_ctype == C_CLERIC)   quest_item = GERYON_HORN;
        !           349:     if(player.t_ctype == C_THIEF)    quest_item = MUSTY_DAGGER;
        !           350:     if(player.t_ctype == C_ASSASSIN) quest_item = EYE_VECNA;
        !           351:     if(player.t_ctype == C_DRUID)    quest_item = QUILL_NAGROM;
        !           352:     if(player.t_ctype == C_MONK)     quest_item = EMORI_CLOAK;
        !           353:
        !           354:     /* armor */
        !           355:         if (player.t_ctype == C_THIEF || player.t_ctype == C_ASSASSIN)
        !           356:             j = STUDDED_LEATHER;
        !           357:         else if (player.t_ctype == C_MONK) {
        !           358:         armor_item = spec_item(MM, MM_BRACERS, 20, 0);
        !           359:         obj = OBJPTR(armor_item);
        !           360:             obj->o_weight = things[TYP_MM].mi_wght;
        !           361:         whatis (armor_item);  /* identify it */
        !           362:             obj->o_flags |= (ISKNOW | ISPROT);
        !           363:             add_pack(armor_item, TRUE);
        !           364:             cur_misc[WEAR_BRACERS] = obj;
        !           365:         goto w_armorjmp;
        !           366:     }
        !           367:         else j =  PLATE_ARMOR;
        !           368:
        !           369:         armor_item = spec_item(ARMOR, j, 20, 0);
        !           370:         obj = OBJPTR(armor_item);
        !           371:         obj->o_weight = armors[j].a_wght;
        !           372:         obj->o_flags |= (ISKNOW | ISPROT);
        !           373:         add_pack(armor_item, TRUE);
        !           374:         cur_armor = obj;
        !           375:
        !           376:     w_armorjmp:  /* monk doesn't wear armor */
        !           377:
        !           378:         /* weapons */
        !           379:         if (player.t_ctype == C_THIEF || player.t_ctype == C_ASSASSIN ||
        !           380:             player.t_ctype == C_MONK)
        !           381:         j = BASWORD;
        !           382:         else if (player.t_ctype == C_FIGHTER || player.t_ctype == C_RANGER ||
        !           383:         player.t_ctype == C_PALADIN)
        !           384:         j = TWOSWORD;
        !           385:     else j = TRIDENT;
        !           386:
        !           387:         weap_item = spec_item(WEAPON, j, 20, 20);
        !           388:         obj = OBJPTR(weap_item);
        !           389:         obj->o_flags |= (ISKNOW | ISPROT);
        !           390:         obj->o_weight = weaps[j].w_wght;
        !           391:         add_pack(weap_item, TRUE);
        !           392:         cur_weapon = obj;
        !           393:
        !           394:     /* food */
        !           395:         food_item = spec_item(FOOD, E_RATION, 0, 0);
        !           396:         obj = OBJPTR(food_item);
        !           397:         obj->o_flags |= ISKNOW;
        !           398:         obj->o_weight = foods[TYP_FOOD].mi_wght;
        !           399:         add_pack(food_item, TRUE); /* just one */
        !           400:
        !           401:     /* give wizard plenty gold */
        !           402:         purse = 50000;
        !           403:     }
        !           404:     else
        !           405:     /* default attributes checked */
        !           406:     {
        !           407:     if (def_attr == TRUE) {  /* "default" option used in ROGUEOPTS */
        !           408:     switch(player.t_ctype) {
        !           409:         /* set "default attributes" option and quest items here */
        !           410:         case C_FIGHTER:
        !           411:         case C_MONK:
        !           412:                 pstats.s_intel = 7;
        !           413:                 pstats.s_dext = 16;
        !           414:                 pstats.s_charisma = 11;
        !           415:             if (player.t_ctype == C_FIGHTER) {
        !           416:                     pstats.s_str = 16;
        !           417:                     pstats.s_wisdom = 7;
        !           418:                     pstats.s_const = 17;
        !           419:                 quest_item = AXE_AKLAD;
        !           420:         }
        !           421:         else {
        !           422:                     pstats.s_str = 11;
        !           423:                     pstats.s_wisdom = 11;
        !           424:                     pstats.s_const = 18;
        !           425:                 quest_item = EMORI_CLOAK;
        !           426:         }
        !           427:         when C_RANGER:
        !           428:         case C_PALADIN:
        !           429:                 pstats.s_str = 11;
        !           430:                 pstats.s_dext = 16;
        !           431:                 pstats.s_const = 16;
        !           432:                 pstats.s_charisma = 13;
        !           433:             /* intelligence or wisdom */
        !           434:             if (player.t_ctype == C_RANGER) {
        !           435:                     pstats.s_intel = 11;
        !           436:                     pstats.s_wisdom = 7;
        !           437:                 quest_item = BRIAN_MANDOLIN;
        !           438:             }
        !           439:             else {
        !           440:                     pstats.s_intel = 7;
        !           441:                     pstats.s_wisdom = 11;
        !           442:                 quest_item = HEIL_ANKH;
        !           443:             }
        !           444:         when C_THIEF:
        !           445:         case C_ASSASSIN:
        !           446:                 pstats.s_intel = 7;
        !           447:                 pstats.s_str = 14;
        !           448:                 pstats.s_wisdom = 7;
        !           449:                 pstats.s_dext = 18;
        !           450:                 pstats.s_const = 17;
        !           451:                 pstats.s_charisma = 11;
        !           452:             if (player.t_ctype == C_THIEF)
        !           453:                 quest_item = MUSTY_DAGGER;
        !           454:             else
        !           455:                 quest_item = EYE_VECNA;
        !           456:         when C_MAGICIAN:
        !           457:         case C_CLERIC:
        !           458:         case C_DRUID:
        !           459:                 pstats.s_str = 10;
        !           460:                 pstats.s_dext = 16;
        !           461:                 pstats.s_const = 15;
        !           462:                 pstats.s_charisma = 12;
        !           463:             /* intelligence & wisdom */
        !           464:             if (player.t_ctype == C_MAGICIAN) {
        !           465:                     pstats.s_intel = 14;
        !           466:                     pstats.s_wisdom = 7;
        !           467:             }
        !           468:             else {
        !           469:                     pstats.s_intel = 7;
        !           470:                     pstats.s_wisdom = 14;
        !           471:             }
        !           472:             if (player.t_ctype == C_MAGICIAN)
        !           473:                 quest_item = STONEBONES_AMULET;
        !           474:             else if (player.t_ctype == C_CLERIC)
        !           475:                 quest_item = GERYON_HORN;
        !           476:             else
        !           477:                 quest_item = QUILL_NAGROM;
        !           478:     }
        !           479:         /* Intialize */
        !           480:         pstats.s_exp = 0L;
        !           481:         pstats.s_lvl = 1;
        !           482:         pstats.s_lvladj = 0;
        !           483:         pstats.s_exp = 0L;
        !           484:         strcpy(pstats.s_dmg,"2d4");
        !           485:         pstats.s_carry = totalenc(&player);
        !           486:         check_level();
        !           487:         wmove(hw,0,0);
        !           488:         wclrtoeol(hw);
        !           489:         draw(hw);
        !           490:         mpos = 0;
        !           491:
        !           492:         /* Get the hit points. */
        !           493:         pstats.s_hpt = 12 + const_bonus();  /* Base plus bonus */
        !           494:
        !           495:         /* Add in the component that varies according to class */
        !           496:         pstats.s_hpt += char_class[player.t_ctype].hit_pts;
        !           497:
        !           498:         /* dole out some armor */
        !           499:         if (player.t_ctype == C_THIEF || player.t_ctype == C_ASSASSIN)
        !           500:         j = STUDDED_LEATHER;
        !           501:         else if (player.t_ctype == C_FIGHTER || player.t_ctype == C_RANGER ||
        !           502:              player.t_ctype == C_PALADIN) {
        !           503:          switch (rnd(4)) {
        !           504:              case 0:         j = PLATE_ARMOR;
        !           505:              when 1:         j = PLATE_MAIL;
        !           506:              when 2: case 3: j = BANDED_MAIL;
        !           507:         }
        !           508:     }
        !           509:         else if (player.t_ctype == C_MONK) {
        !           510:         if (rnd(3) == 0) j = MM_PROTECT;
        !           511:         else j = MM_BRACERS;
        !           512:         armor_item = spec_item(MM, j, rnd(125)/60+3, 0);
        !           513:         obj = OBJPTR(armor_item);
        !           514:             obj->o_weight = things[TYP_MM].mi_wght;
        !           515:         whatis (armor_item);  /* identify it */
        !           516:             obj->o_flags |= ISKNOW;
        !           517:             add_pack(armor_item, TRUE);
        !           518:         goto p_armorjmp;
        !           519:     }
        !           520:     else {  /* other characters */
        !           521:         switch (rnd(7)) {
        !           522:         case 0:         j = PLATE_MAIL;
        !           523:         when 1: case 2: j = BANDED_MAIL;
        !           524:         when 3: case 4: j = SPLINT_MAIL;
        !           525:         when 5: case 6: j = PADDED_ARMOR;
        !           526:         }
        !           527:     }
        !           528:         armor_item = spec_item(ARMOR, j, rnd(100)/85, 0);
        !           529:         obj = OBJPTR(armor_item);
        !           530:         obj->o_weight = armors[j].a_wght;
        !           531:         obj->o_flags |= ISKNOW;
        !           532:         add_pack(armor_item, TRUE);
        !           533:
        !           534:     p_armorjmp:  /* monk doesn't wear armor */
        !           535:
        !           536:         /* give him a weapon */
        !           537:         if (player.t_ctype == C_THIEF || player.t_ctype == C_ASSASSIN ||
        !           538:             player.t_ctype == C_MONK) {
        !           539:         switch (rnd(5)) {
        !           540:         case 0:         j = BASWORD;
        !           541:         when 1: case 2: j = TRIDENT;
        !           542:         when 3: case 4: j = BARDICHE;
        !           543:         }
        !           544:     }
        !           545:         else if (player.t_ctype == C_FIGHTER || player.t_ctype == C_RANGER ||
        !           546:         player.t_ctype == C_PALADIN) {
        !           547:         switch (rnd(5)) {
        !           548:         case 0:         j= TWOSWORD;
        !           549:         when 1: case 2: j= TRIDENT;
        !           550:         when 3: case 4: j= SWORD;
        !           551:         }
        !           552:     }
        !           553:         else {
        !           554:         switch (rnd(7)) {
        !           555:         case 0:         j = TRIDENT;
        !           556:         when 1: case 2: j = SWORD;
        !           557:         when 3: case 4: j = BARDICHE;
        !           558:         when 5:         j = MACE;
        !           559:         when 6:         j = SPETUM;
        !           560:         }
        !           561:     }
        !           562:         weap_item = spec_item(WEAPON, j, rnd(155)/75, rnd(165)/80);
        !           563:         obj = OBJPTR(weap_item);
        !           564:         obj->o_weight = weaps[j].w_wght;
        !           565:         obj->o_flags |= ISKNOW;
        !           566:         add_pack(weap_item, TRUE);
        !           567:
        !           568:         /* food rations */
        !           569:         food_item = spec_item(FOOD, E_RATION, 0, 0);
        !           570:         obj = OBJPTR(food_item);
        !           571:         obj->o_weight = foods[TYP_FOOD].mi_wght;
        !           572:         obj->o_flags |= ISKNOW;
        !           573:         add_pack(food_item, TRUE);
        !           574:
        !           575:     /* give him some fruit - coose from those w/o special effects */
        !           576:     switch (rnd(6)) {
        !           577:         case 0: j = E_BANANA;
        !           578:         when 1: j = E_BLUEBERRY;
        !           579:         when 2: j = E_ELDERBERRY;
        !           580:         when 3: j = E_GUANABANA;
        !           581:         when 4: j = E_CAPRIFIG;
        !           582:         when 5: j = E_GOOSEBERRY;
        !           583:     }
        !           584:         food_item = spec_item(FOOD, j, 0, 0);
        !           585:         obj = OBJPTR(food_item);
        !           586:         obj->o_weight = foods[TYP_FOOD].mi_wght;
        !           587:         obj->o_flags |= ISKNOW;
        !           588:         add_pack(food_item, TRUE);
        !           589:
        !           590:     /* adjust purse */
        !           591:     purse = 2000;
        !           592:     }
        !           593:     else {  /* select attibutes */
        !           594:         switch(player.t_ctype) {
        !           595:             case C_FIGHTER:     round = A_STRENGTH;
        !           596:             when C_RANGER:      round = A_CHARISMA;
        !           597:             when C_PALADIN:     round = A_CHARISMA;
        !           598:             when C_MAGICIAN:    round = A_INTELLIGENCE;
        !           599:             when C_CLERIC:      round = A_WISDOM;
        !           600:             when C_THIEF:       round = A_DEXTERITY;
        !           601:             when C_ASSASSIN:    round = A_DEXTERITY;
        !           602:             when C_DRUID:       round = A_WISDOM;
        !           603:             when C_MONK:        round = A_CONSTITUTION;
        !           604:         }
        !           605:
        !           606:         do {
        !           607:             wclear(hw);
        !           608:
        !           609:             /* If there is any news, display it */
        !           610:             if (rogue_news) {
        !           611:                 register int i;
        !           612:
        !           613:                 /* Print a separator line */
        !           614:                 wmove(hw, 12, 0);
        !           615:                 for (i=0; i<cols; i++) waddch(hw, '-');
        !           616:
        !           617:                 /* Print the news */
        !           618:                 mvwaddstr(hw, 14, 0, rogue_news);
        !           619:             }
        !           620:
        !           621:             stat_total = MAXSTATS;
        !           622:             do_escape = FALSE;  /* No escape seen yet */
        !           623:
        !           624:             /* Initialize abilities */
        !           625:             pstats.s_intel = 0;
        !           626:             pstats.s_str = 0;
        !           627:             pstats.s_wisdom = 0;
        !           628:             pstats.s_dext = 0;
        !           629:             pstats.s_const = 0;
        !           630:             pstats.s_charisma = 0;
        !           631:
        !           632:             /* Initialize pointer into abilities */
        !           633:             our_stats[A_INTELLIGENCE] = &pstats.s_intel;
        !           634:             our_stats[A_STRENGTH] = &pstats.s_str;
        !           635:             our_stats[A_WISDOM] = &pstats.s_wisdom;
        !           636:             our_stats[A_DEXTERITY] = &pstats.s_dext;
        !           637:             our_stats[A_CONSTITUTION] = &pstats.s_const;
        !           638:
        !           639:             /* Let player distribute attributes */
        !           640:             for (i=0; i<NUMABILITIES-1; i++) {
        !           641:                 wmove(hw, 2, 0);
        !           642:                 wprintw(hw, "You are creating a %s with %2d attribute points.",
        !           643:                                 char_class[player.t_ctype].name, stat_total);
        !           644:
        !           645:                 /*
        !           646:                  * Player must have a minimum of 7 in any attribute and 11 in
        !           647:                  * the player's primary attribute.
        !           648:                  */
        !           649:                 minimum = (round == i ? 11 : 7);
        !           650:
        !           651:                 /* Subtract out remaining minimums */
        !           652:                 maximum = stat_total - (7 * (NUMABILITIES-1 - i));
        !           653:
        !           654:                 /* Subtract out remainder of profession minimum (11 - 7) */
        !           655:                 if (round > i) maximum -= 4;
        !           656:
        !           657:                 /* Maximum can't be greater than 18 */
        !           658:                 if (maximum > 18) maximum = 18;
        !           659:
        !           660:                 wmove(hw, 4, 0);
        !           661:                 wprintw(hw,
        !           662:                    "Minimum: %2d;  Maximum: %2d  (%s corrects previous entry)",
        !           663:                    minimum, maximum, unctrl('\b'));
        !           664:
        !           665:                 wmove(hw, 6, 0);
        !           666:                 wprintw(hw, "    Int: %-2d", pstats.s_intel);
        !           667:                 wprintw(hw, "    Str: %-2d", pstats.s_str);
        !           668:                 wprintw(hw, "    Wis: %-2d", pstats.s_wisdom);
        !           669:                 wprintw(hw, "    Dex: %-2d", pstats.s_dext);
        !           670:                 wprintw(hw, "    Con: %-2d", pstats.s_const);
        !           671:                 wprintw(hw, "    Cha: %-2d", pstats.s_charisma);
        !           672:                 wclrtoeol(hw);
        !           673:                 wmove(hw, 6, 11*i + 9);
        !           674:                 if (do_escape == FALSE) draw(hw);
        !           675:
        !           676:                 /* Get player's input */
        !           677:                 if (do_escape || maximum == minimum) {
        !           678:                     *our_stats[i] = maximum;
        !           679:                     stat_total -= maximum;
        !           680:                 }
        !           681:                 else for (;;) {
        !           682:                     ch = wgetch(hw);
        !           683:                     if (ch == '\b') {   /* Backspace */
        !           684:                         if (i == 0) continue;   /* Can't move back */
        !           685:                         else {
        !           686:                             stat_total += *our_stats[i-1];
        !           687:                             *our_stats[i] = 0;
        !           688:                             *our_stats[i-1] = 0;
        !           689:                             i -= 2;     /* Back out */
        !           690:                             break;
        !           691:                         }
        !           692:                     }
        !           693:                     if (ch == '\033') { /* Escape */
        !           694:                         /*
        !           695:                          * Escape will result in using all maximums for
        !           696:                          * remaining abilities.
        !           697:                          */
        !           698:                         do_escape = TRUE;
        !           699:                         *our_stats[i] = maximum;
        !           700:                         stat_total -= maximum;
        !           701:                         break;
        !           702:                     }
        !           703:
        !           704:                     /* Do we have a legal digit? */
        !           705:                     if (ch >= '0' && ch <= '9') {
        !           706:                         ch -= '0';      /* Convert it to a number */
        !           707:                         *our_stats[i] = 10 * *our_stats[i] + ch;
        !           708:
        !           709:                         /* Is the number in range? */
        !           710:                         if (*our_stats[i] >= minimum &&
        !           711:                             *our_stats[i] <= maximum) {
        !           712:                             stat_total -= *our_stats[i];
        !           713:                             break;
        !           714:                         }
        !           715:
        !           716:                         /*
        !           717:                          * If it's too small, get more - 1x is the only
        !           718:                          * allowable case.
        !           719:                          */
        !           720:                         if (*our_stats[i] < minimum && *our_stats[i] == 1) {
        !           721:                             /* Print the player's one */
        !           722:                             waddch(hw, '1');
        !           723:                             draw(hw);
        !           724:                             continue;
        !           725:                         }
        !           726:                     }
        !           727:
        !           728:                     /* Error condition */
        !           729:                     putchar('\007');
        !           730:                     *our_stats[i] = 0;
        !           731:                     i--;        /* Rewind */
        !           732:                     break;
        !           733:                 }
        !           734:             }
        !           735:
        !           736:             /* Discard extra points over 18 */
        !           737:             if (stat_total > 18) stat_total = 18;
        !           738:
        !           739:             /* Charisma gets what's left */
        !           740:             pstats.s_charisma = stat_total;
        !           741:
        !           742:             /* Intialize constants */
        !           743:             pstats.s_lvl = 1;
        !           744:             pstats.s_lvladj = 0;
        !           745:             pstats.s_exp = 0L;
        !           746:             strcpy(pstats.s_dmg,"2d4");
        !           747:             pstats.s_carry = totalenc(&player);
        !           748:
        !           749:             /* Get the hit points. */
        !           750:             pstats.s_hpt = 12 + const_bonus();  /* Base plus bonus */
        !           751:
        !           752:             /* Add in the component that varies according to class */
        !           753:             pstats.s_hpt += char_class[player.t_ctype].hit_pts;
        !           754:
        !           755:             /* Display the character */
        !           756:             wmove(hw, 2, 0);
        !           757:             wprintw(hw,"You are creating a %s.",
        !           758:                         char_class[player.t_ctype].name);
        !           759:             wclrtoeol(hw);
        !           760:
        !           761:             /* Get rid of max/min line */
        !           762:             wmove(hw, 4, 0);
        !           763:             wclrtoeol(hw);
        !           764:
        !           765:             wmove(hw, 6, 0);
        !           766:             wprintw(hw, "    Int: %2d", pstats.s_intel);
        !           767:             wprintw(hw, "    Str: %2d", pstats.s_str);
        !           768:             wprintw(hw, "    Wis: %2d", pstats.s_wisdom);
        !           769:             wprintw(hw, "    Dex: %2d", pstats.s_dext);
        !           770:             wprintw(hw, "    Con: %2d", pstats.s_const);
        !           771:             wprintw(hw, "    Cha: %2d", pstats.s_charisma);
        !           772:             wclrtoeol(hw);
        !           773:
        !           774:             wmove(hw, 8, 0);
        !           775:             wprintw(hw, "    Hp: %2d", pstats.s_hpt);
        !           776:             wclrtoeol(hw);
        !           777:
        !           778:             wmove(hw, 10, 0);
        !           779:             wprintw(hw, "    Gold: %ld", purse);
        !           780:
        !           781:             mvwaddstr(hw, 0, 0, "Is this character okay? ");
        !           782:             draw(hw);
        !           783:         } while(wgetch(hw) != 'y');
        !           784:       }
        !           785:     }
        !           786:     pstats.s_arm = 10;
        !           787:     max_stats = pstats;
        !           788:     /* Set up initial movement rate */
        !           789:     player.t_action = A_NIL;
        !           790:     player.t_movement = 6;
        !           791:     player.t_no_move = 0;
        !           792:     player.t_using = NULL;
        !           793:     wclear(hw);
        !           794: }
        !           795:
        !           796: /*
        !           797:  * init_stones:
        !           798:  *      Initialize the ring stone setting scheme for this time
        !           799:  */
        !           800:
        !           801: void
        !           802: init_stones(void)
        !           803: {
        !           804:     register int i;
        !           805:     register char *str;
        !           806:
        !           807:     for (i = 0 ; i < MAXRINGS ; i++)
        !           808:     {
        !           809:         do
        !           810:             str = stones[rnd(NSTONES)].w_string;
        !           811:         until (isupper(*str));
        !           812:         *str = tolower(*str);
        !           813:         r_stones[i] = str;
        !           814:         r_know[i] = FALSE;
        !           815:         r_guess[i] = NULL;
        !           816:         if (i > 0)
        !           817:                 r_magic[i].mi_prob += r_magic[i-1].mi_prob;
        !           818:     }
        !           819:     badcheck("rings", r_magic, MAXRINGS);
        !           820: }
        !           821:
        !           822: /*
        !           823:  * init_things
        !           824:  *      Initialize the probabilities for types of things
        !           825:  */
        !           826:
        !           827: void
        !           828: init_things(void)
        !           829: {
        !           830:     register struct magic_item *mp;
        !           831:
        !           832:     for (mp = &things[1] ; mp < &things[NUMTHINGS] ; mp++)
        !           833:         mp->mi_prob += (mp-1)->mi_prob;
        !           834:     badcheck("things", things, NUMTHINGS);
        !           835: }
        !           836:

CVSweb