[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

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