home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / omega2 / part15 / ochar.c next >
C/C++ Source or Header  |  1988-07-26  |  13KB  |  513 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
  2. /* ochar.c */
  3. /* Player generation */
  4.  
  5. #include "oglob.h"
  6.  
  7.  
  8. /* set player to begin with */
  9. void initplayer()
  10. {
  11.    int i;
  12.    int oldchar=FALSE;
  13.    FILE *fd;
  14.  
  15.    strcpy(Player.name,getlogin());
  16.    Player.itemweight = 0;
  17.    Player.food = 36; 
  18.    Player.packptr = 0;
  19.    Player.options = 0;
  20.    for (i=0;i<MAXITEMS;i++)
  21.      Player.possessions[i] = NULL;
  22.    for (i=0;i<MAXPACK;i++)
  23.      Player.pack[i] = NULL;
  24.    for (i=0;i<NUMIMMUNITIES;i++) Player.immunity[i] = 0;
  25.    for (i=0;i<NUMSTATI;i++) Player.status[i] = 0;
  26.    for (i=0;i<NUMRANKS;i++) {
  27.      Player.rank[i] = 0;
  28.      Player.guildxp[i] = 0;
  29.    }
  30.    Player.alignment = 0;
  31.    Player.cash = 250;
  32.    if ((fd=omegarc_check())!=NULL) {
  33.      fread((char *)&i,sizeof(int),1,fd);
  34.      if (i != VERSION) {
  35.        print1("Out of date .omegarc! Make another!");
  36.        morewait();
  37.      }
  38.      else {
  39.        oldchar = TRUE;
  40.        fread((char *)&Player,sizeof(Player),1,fd);
  41.        fread((char *)&Searchnum,sizeof(int),1,fd);
  42.        fread((char *)&Verbosity,sizeof(char),1,fd);
  43.        strcpy(Player.name,getlogin());
  44.      }
  45.      fclose(fd);
  46.    }
  47.    if (! oldchar) {
  48.      initstats();
  49.      optionset(RUNSTOP);
  50.      optionset(CONFIRM);
  51.    }
  52.    Searchnum = max(1,min(9,Searchnum));
  53.    Player.hp = Player.maxhp = Player.maxcon;
  54.    calc_melee();
  55.    Player.mana = Player.maxmana = calcmana();
  56.    Player.click = 1;
  57.    strcpy(Player.meleestr,"CCBC");
  58.    dataprint();
  59.  }
  60.  
  61.  
  62. FILE *omegarc_check()
  63. {
  64.   FILE *fd;
  65.   strcpy(Str3,".omegarc");
  66.   if ((fd = fopen(Str3,"r")) != NULL) {
  67.     print2("Use .omegarc in wd? [yn] ");
  68.     if (ynq2()!='y') fd = NULL;
  69.   }
  70.   clearmsg();
  71.   return(fd);
  72. }
  73.  
  74. void initstats()
  75. {
  76.   char response;
  77.   print1("Do you want to run a character [c] or play yourself [p]?");
  78.   do response = mcigetc(); while ((response!='c')&&(response != 'p'));
  79.   if (response == 'c') omegan_character_stats();
  80.   else {
  81.     user_character_stats();
  82.     user_intro();
  83.     print1("Do you want to save this set-up to .omegarc in this wd? [yn] ");
  84.     if (ynq1()=='y')
  85.       save_omegarc();
  86.   }
  87.   xredraw();
  88. }
  89.  
  90. void save_omegarc()
  91. {
  92.   FILE *fd = fopen(".omegarc","w");
  93.   int i=VERSION;
  94.   if (fd == NULL)
  95.     print1("Sorry, couldn't save .omegarc for some reason.");
  96.   else {
  97.     fwrite((char *)&i,sizeof(int),1,fd);
  98.     print1("First, set options.");
  99.     setoptions();
  100.     fwrite((char *)&Player,sizeof(Player),1,fd);
  101.     fwrite((char *)&Searchnum,sizeof(int),1,fd);
  102.     fwrite((char *)&Verbosity,sizeof(char),1,fd);
  103.     fclose(fd);
  104.   }
  105. }
  106.  
  107.  
  108.  
  109. int calcmana()
  110. {
  111.   return(Player.pow * (Player.level+1));
  112. }
  113.  
  114.  
  115. /*  npcbehavior digits 1234
  116.  
  117. 4 : alignment (LAWFUL,CHAOTIC, or NEUTRAL)
  118. 3 : primary combat action (melee,missile,spell,thief,flight,1..5)
  119. 2 : competence at 4 (0..9, 0 = incompetent, 9 = masterful)
  120. 1 : conversation mode
  121.  
  122. status : 1 = dead, 2 = saved, 3 = retired
  123. */
  124. int fixnpc(status)
  125. int status;
  126. {
  127.   int npcbehavior=0;
  128.   char response;
  129.   if (status == 1) { /* player is dead, all undead are chaotic */
  130.     npcbehavior+=CHAOTIC;
  131.     npcbehavior+=10; /* melee */
  132.     npcbehavior+=100*min(9,((int) (Player.level/3)));
  133.     npcbehavior+=3000; /* evil */
  134.   }
  135.   else {
  136.     clearmsg();
  137.     print1("NPC Behavior Determination Module");
  138.     menuclear();
  139.     menuprint("Your overall NPC behavior is:");
  140.     if (Player.alignment < -10) {
  141.       npcbehavior += CHAOTIC;
  142.       menuprint("\n\n CHAOTIC");
  143.     }
  144.     else if (Player.alignment > 10) {
  145.       npcbehavior += LAWFUL;
  146.       menuprint("\n\n LAWFUL");
  147.     }
  148.     else {
  149.       npcbehavior += NEUTRAL;
  150.       menuprint("\n\n NEUTRAL");
  151.     }
  152.     menuprint("\n\n1: hand-to-hand combat");
  153.     menuprint("\n2: missile combat");
  154.     menuprint("\n3: spellcasting");
  155.     menuprint("\n4: thieving");
  156.     menuprint("\n5: escape");
  157.     menuprint("\n\nEnter NPC response to combat: ");
  158.     response = '0';
  159.     while ((response != '1') && 
  160.        (response != '2') &&
  161.        (response != '3') &&
  162.        (response != '4') &&
  163.        (response != '5'))
  164.       response = menugetc();
  165.     menuaddch(response);
  166.     npcbehavior+=10*(response - '0');
  167.     npcbehavior+=100*competence_check(response-'0');
  168.     response = '0';
  169.     menuclear();
  170.     menuprint("1: threaten");
  171.     menuprint("\n2: greet");
  172.     menuprint("\n3: aid");
  173.     menuprint("\n4: beg");
  174.     menuprint("\n5: silence");
  175.     menuprint("\n\nEnter NPC response to conversation: ");
  176.     while ((response != '1') && 
  177.        (response != '2') &&
  178.        (response != '3') &&
  179.        (response != '4') &&
  180.        (response != '5'))
  181.       response = menugetc();
  182.     menuaddch(response);
  183.     npcbehavior+=1000*(response - '0');
  184.     xredraw();
  185.   }
  186.     return(npcbehavior);
  187. }
  188.  
  189.  
  190. /* estimates on a 0..9 scale how good a player is at something */
  191. int competence_check(attack)
  192. int attack;  
  193. {
  194.   int ability = 0;
  195.   switch(attack) {
  196.   case 1: /* melee */
  197.     ability += statmod(Player.str);
  198.   case 2: /* missle */
  199.     ability += statmod(Player.dex);
  200.     ability += Player.rank[LEGION];
  201.     ability += ((int) (Player.dmg / 10) - 1);
  202.     break;
  203.   case 3: /* spellcasting */
  204.     ability += statmod(Player.iq);
  205.     ability += statmod(Player.pow);
  206.     ability += Player.rank[CIRCLE];
  207.     ability += Player.rank[COLLEGE];
  208.     ability += Player.rank[PRIEST];
  209.     break;
  210.   case 4: /* thieving */
  211.     ability += statmod(Player.dex);
  212.     ability += statmod(Player.agi);
  213.     ability += Player.rank[THIEVES];
  214.     break;
  215.   case 5: /* escape */
  216.     ability += 2 * statmod(Player.agi);
  217.     break;
  218.   }
  219.   ability += ((int) (Player.level / 5));
  220.   if (ability < 0) ability = 0;
  221.   if (ability > 9) ability = 9;
  222.   return(ability);
  223. }
  224.  
  225. void user_character_stats()
  226. {
  227.   int num,iqpts=0,numints=0,ok,agipts=0,dexpts=0,powpts=0,conpts=0;
  228.   print1("OK, now try to answer honestly the following questions:");
  229.   morewait();
  230.   print1("How many pounds can you bench press? ");
  231.   num = parsenum();
  232.   if (num < 30) Player.str = Player.maxstr = 3;
  233.   else if (num < 90) Player.str = Player.maxstr = num/10;
  234.   else Player.str = Player.maxstr = 9+((num-120)/30);
  235.   if (Player.str > 18) {
  236.     print2("Even if it's true, I don't believe it.");
  237.     morewait();
  238.     clearmsg();
  239.     Player.str = Player.maxstr = 18;
  240.   }
  241.   
  242.   print1("Took an official IQ test? [yn] ");
  243.   if (ynq1()=='y') {
  244.     print1("So, whadja get? ");
  245.     num = parsenum()/10;
  246.     if (num > 18) {
  247.       print2("Even if it's true, I don't believe it.");
  248.       morewait();
  249.       clearmsg();
  250.       num = 18;
  251.     }
  252.     iqpts+=num;
  253.     numints++;
  254.   }
  255.  
  256.   print1("Took Undergraduate entrance exams? [yn] ");
  257.   if (ynq1()=='y') {
  258.     do {
  259.       print1("So, what percentile? ");
  260.       num = parsenum();
  261.       ok = (num < 100);
  262.       if (! ok) {
  263.     print2("That's impossible!");
  264.     morewait();
  265.     clearmsg();
  266.       }
  267.     } while (! ok);
  268.     iqpts += (int) ((((num - 49)/50.0)*9)+9);
  269.     numints++;
  270.   }
  271.   print1("Took Graduate entrance exams? [yn] ");
  272.   if (ynq1()=='y') {
  273.     do {
  274.       print1("So, what percentile? ");
  275.       num = parsenum();
  276.       ok = (num < 100);
  277.       if (! ok) {
  278.     print2("That's impossible!");
  279.     morewait();
  280.     clearmsg();
  281.       }
  282.     } while (! ok);
  283.     iqpts += (int) ((((num - 49)/50.0)*9)+9);
  284.     numints++;
  285.   }
  286.  
  287.   if (numints == 0) {
  288.     print1("Pretty dumb, aren't you? [yn] ");
  289.     if (ynq1()=='y') {
  290.       Player.iq = random_range(3)+3;      
  291.       print2("I thought so....");
  292.     }
  293.     else {
  294.       Player.iq = random_range(6)+8;
  295.       print2("Well, not *that* dumb.");
  296.     }
  297.     morewait();
  298.     clearmsg();
  299.   }
  300.   else Player.iq = iqpts/numints;
  301.   Player.maxiq = Player.iq;
  302.   agipts = 0;
  303.   print1("Can you dance? [yn] ");
  304.   if (ynq1()=='y') {
  305.     agipts++;
  306.     nprint1(" Well? [yn] ");
  307.     if (ynq1()=='y') agipts+=2;
  308.   }
  309.   print1("Do you have training in a martial art or gymnastics? [yn] ");
  310.   if (ynq1()=='y') {
  311.     agipts+=2;
  312.     print2("Do you have dan rank or equivalent? [yn] ");
  313.     if (ynq2()=='y') agipts+=4;
  314.   }
  315.   clearmsg();
  316.   print1("Do you play some field sport? [yn] ");
  317.   if (ynq1()=='y') {
  318.     agipts++;
  319.     nprint1(" Are you good? [yn] ");
  320.     if (ynq1()=='y') agipts++;
  321.   }
  322.   print1("Do you cave, mountaineer, etc.? [yn] ");
  323.   if (ynq1()=='y')
  324.     agipts+=3;
  325.   print1("Do you skate or ski? [yn] ");
  326.   if (ynq1()=='y') {
  327.     agipts+=2;
  328.     nprint1(" Well? [yn] ");
  329.     if (ynq1()=='y') agipts+=2;
  330.   }
  331.   print1("Are you physically handicapped? [yn] ");
  332.   if (ynq1()=='y')
  333.     agipts-=4;
  334.   print1("Are you accident prone? [yn] ");
  335.   if (ynq1()=='y')
  336.     agipts-=4;
  337.   print1("Can you use a bicycle? [yn] ");
  338.   if (ynq1()!='y')
  339.     agipts-=4;
  340.   Player.agi = Player.maxagi = 9 + agipts/2;
  341.   print1("Do you play video games? [yn] ");
  342.   if (ynq1()=='y') {
  343.     dexpts+=2;
  344.     print2("Do you get high scores? [yn] ");
  345.     if (ynq2()=='y') dexpts+=4;
  346.   }
  347.   clearmsg();
  348.   print1("Are you an archer, fencer, or marksman? [yn] ");
  349.   if (ynq1()=='y') {
  350.     dexpts+=2;
  351.     print2("A good one? [yn] ");
  352.     if (ynq2()=='y') dexpts+=4;
  353.   }
  354.   clearmsg();
  355.   print1("Have you ever picked a lock? [yn] ");
  356.   if (ynq1()=='y') {
  357.     dexpts+=2;
  358.     print2("Really. Well, the police are being notified.");
  359.   }
  360.   morewait();
  361.   clearmsg();
  362.   print1("What's your typing speed (words per minute) ");
  363.   num = parsenum();
  364.   if (num > 125) {
  365.     print2("Tell me another one....");
  366.     morewait();
  367.     clearmsg();
  368.     num = 125;
  369.   }
  370.   dexpts += num/25;
  371.   print1("Hold your arm out. Tense your fist. Hand shaking? [yn] ");
  372.   if (ynq1()=='y')
  373.     dexpts-=3;
  374.   print1("Ambidextrous, are you? [yn] ");
  375.   if (ynq1()=='y')
  376.     dexpts+=4;
  377.   print1("Can you cut a deck of cards with one hand? [yn] ");
  378.   if (ynq1()=='y')
  379.     dexpts+=2;
  380.   print1("Can you tie your shoes blindfolded? [yn] ");
  381.   if (ynq1()!='y')
  382.     dexpts-=3;
  383.   Player.dex = Player.maxdex = 6 + dexpts/2;
  384.   print1("Do you ever get colds? [yn] ");
  385.   if (ynq1()!='y') 
  386.     conpts+=4;
  387.   else {
  388.     nprint1(" Frequently? [yn] ");
  389.     if (ynq1() == 'y') conpts -=4;
  390.   }
  391.   print1("Had any serious accident or illness this year? [yn] ");
  392.   if (ynq1()=='y') conpts -=4;
  393.   else conpts +=4;
  394.   print1("Have a chronic disease? [yn] ");
  395.   if (ynq1() =='y') conpts -=4;
  396.   print1("Overweight or underweight by more than 20 percent? [yn] ");
  397.   if (ynq1() =='y') conpts -=2;
  398.   print1("High Blood Pressure? [yn] ");
  399.   if (ynq1() =='y') conpts -=2;
  400.   print1("Smoke? [yn] ");
  401.   if (ynq1() =='y') conpts -=3;
  402.   print1("Take aerobics classes? [yn] ");
  403.   if (ynq1() =='y') conpts +=2;
  404.   print1("How many miles can you run? ");
  405.   num = parsenum();
  406.   if (num > 25) {
  407.     print2("Right. Sure. Give me a break.");
  408.     morewait();
  409.     clearmsg();
  410.     conpts += 8;
  411.   }
  412.   else if (num < 1) conpts -= 3;
  413.   else if (num < 5) conpts += 2;
  414.   else if (num < 10) conpts += 4;
  415.   else conpts += 8;
  416.   Player.con = Player.maxcon = 12 + conpts/3;
  417.   print1("Do animals react oddly to your presence? [yn] ");
  418.   if (ynq1()=='y') {
  419.     print2("How curious that must be.");
  420.     morewait();
  421.     clearmsg();
  422.     powpts += 2;
  423.   }
  424.   print1("Can you see auras? [yn] ");
  425.   if (ynq1()=='y') {
  426.     nprint1(" How strange.");
  427.     morewait();
  428.     powpts += 3;
  429.   }
  430.   print1("Ever have an out-of-body experience? [yn] ");
  431.   if (ynq1()=='y') {
  432.     print2("Wow, man. Fly the friendly skies....");
  433.     morewait();
  434.     clearmsg();
  435.     powpts += 3;
  436.   }
  437.   print1("Did you ever cast a spell? [yn] ");
  438.   if (ynq1()=='y') {
  439.     powpts += 3;
  440.     nprint1(" Did it work? [yn] ");
  441.     if (ynq1()=='y') {
  442.       powpts+=7;
  443.       print2("Sure it did.");
  444.       morewait();
  445.       clearmsg();
  446.     }
  447.   }
  448.   print1("Do you have ESP? [yn] ");
  449.   if (ynq1()=='y') {
  450.     powpts += 3;
  451.     print2("Yeah, tell me more.");
  452.     morewait();
  453.     clearmsg();
  454.   }
  455.   print1("Do you have PK? [yn] ");
  456.   if (ynq1()=='y') {
  457.     powpts+= 6;
  458.     print2("I can't tell you how much that moves me.");
  459.     morewait();
  460.     clearmsg();
  461.   }
  462.   print1("Do you believe in ghosts? [yn] ");
  463.   if (ynq1()=='y') {
  464.     powpts+=2;
  465.     print2("I do! I do! I do believe in ghosts!");
  466.     morewait();
  467.     clearmsg();
  468.   }
  469.   print1("Are you Irish? [yn] ");
  470.   if (ynq1()=='y') {
  471.     powpts+=2;
  472.     nprint1(" Is that blarney or what?");
  473.     morewait();
  474.   }
  475.   Player.pow = Player.maxpow = 3 + powpts/2;
  476.   print1("What is your sexual preference? [mf] ");
  477.   do Player.preference = mcigetc();
  478.   while ((Player.preference != 'm') && (Player.preference != 'f'));
  479. }
  480.  
  481.  
  482.  
  483. void omegan_character_stats()
  484. {
  485.   int share1,share2,i=0;
  486.   print1("To reroll hit ESCAPE; hit any other key to accept these stats.");
  487.   print2("You have only 10 chances to reroll....");
  488.   do {
  489.     i++;
  490.     Player.iq = Player.maxiq = 4 + random_range(5)+
  491.       (share1 = random_range(6)) + (share2 = random_range(6));
  492.     Player.pow = Player.maxpow = 4 + random_range(5) + share1 +share2;
  493.     Player.dex = Player.maxdex = 4 + random_range(5)+
  494.       (share1 = random_range(6)) + (share2 = random_range(6));
  495.     Player.agi = Player.maxagi = 4 + random_range(5) + share1 +share2;
  496.     Player.str = Player.maxstr = 4 + random_range(5)+
  497.       (share1 = random_range(6)) + (share2 = random_range(6));
  498.     Player.con = Player.maxcon = 4 + random_range(5) + share1 +share2;
  499.     Player.cash = random_range(100)+random_range(100)+
  500.       random_range(100)+random_range(100)+random_range(100);
  501.     calc_melee();
  502.     dataprint();
  503.   } while ((i < 11) && (mgetc() == ESCAPE));
  504.   clearmsg();
  505.   print1("Please enter your character's name: ");
  506.   strcpy(Player.name,msgscanstring());
  507.   print1("What is your character's sexual preference? [mf] ");
  508.   do Player.preference = mcigetc();
  509.   while ((Player.preference != 'm') && (Player.preference != 'f'));
  510.  
  511. }
  512.  
  513.