home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / TOP / USR / SRC / world.t.Z / world.t / world.c < prev    next >
C/C++ Source or Header  |  1989-03-04  |  11KB  |  588 lines

  1. #define EXTERN
  2. #include "parame.inc"
  3. #include "variab.h"
  4. #include "locdat.inc"
  5. #include "objdat.inc"
  6. #include "objdes.inc"
  7. #include "gtext.inc"
  8. # ifdef OSK
  9. # include <signal.h>
  10.  
  11. extern char    *malloc ();
  12. # endif OSK
  13.  
  14. /* World C Version 1.00 copyright 1987 J.D.McDonald 
  15.    Use as you like for non-commercial purposes, but please
  16.    leave this note, and document any changes you make as yours */
  17.  
  18. static int     i, xloc, mxscor, succes, mloc, ikk, verb, vretrn;
  19. static int     scor, xretn, yretn, h, errflg;
  20.  
  21. # ifdef OSK
  22. char        *gamesdir;
  23. # endif OSK
  24.  
  25. main(argc,argv)
  26. char *argv[];
  27. {
  28.  
  29. #ifdef AMIGA
  30.     AmigaInit(argc,argv);
  31. #endif
  32. # ifdef OSK
  33.     setuid (getmuid ());
  34.     if (!(gamesdir = malloc (512)))
  35.         exit (207);
  36.     if (!info_str ("GAMES.LIB", gamesdir, 500))
  37.         strcpy (gamesdir, "/h0/USR/GAMES/LIB");
  38.     strcat (gamesdir, "/WORLD");
  39. /*    signal (SIGINT, SIG_IGN);
  40.     signal (SIGQUIT, SIG_IGN); */
  41. # endif OSK
  42.     rdinit();
  43.     wwflag = 0;
  44.     nomor = 0;
  45.     speak(29);
  46.     linout(" ", 1);
  47.     slflag = 0;
  48.     speak(gtext[1] + 1);
  49.     xindnt = 0;
  50.     for (i = 0; i < 9; i++)
  51.     marflg[i] = 0;
  52.     for (i = 0; i < 6; i++)
  53.     wirelc[i] = 0;
  54.     brfflg = 1;
  55.     deadf = 0;
  56.     dirty = 0;
  57.     turns = 0;
  58.     more = 0;
  59.     diesc = 0;
  60.     horflg = 0;
  61.     nonext = 0;
  62.     screef = 0;
  63.     spcloc = 0;
  64.     oldloc = 1;
  65.     oldlc2 = 1;
  66.     loc = 1;
  67.     xloc = 0;
  68.     oextim = 0;
  69.     rdietm = 0;
  70.     rvtim = 0;
  71.     gvtim = 0;
  72.     eattim = 0;
  73.     easttm = 0;
  74.     filmtm = 0;
  75.     filmst = 0;
  76.     machst = 0;
  77.     fimage = 0;
  78.     dial1x = -1;
  79.     dial2x = -1;
  80.     dial1 = 0;
  81.     dial2 = 0;
  82.     eastsc = 0;
  83.     cactsc = 0;
  84.     mxscor = 450;
  85.     bonus = 0;
  86.     jackpo = 0;
  87.     lpill = 0;
  88.     pbstat = 0;
  89.     dcombi = -1;
  90.     chaset = 0;
  91.     chaser = 0;
  92.     fshlif = 8;
  93.     noshoe = 8;
  94.     guardl = 0;
  95.     eolflg = 1;
  96.     linout(" ", 1);
  97.     /* the main command loop!!!!!  */
  98.  
  99. lab1:
  100.     if (eolflg) {
  101.     getln();
  102.     dotflg = 0;
  103.     clause = 1;
  104.     actor = 1;
  105.     lptr = 0;
  106.     }
  107.     succes = scan();
  108.     if (!succes)
  109.     eolflg = 1;
  110.     if (!succes)
  111.     goto lab1;
  112.     succes = parse();
  113.     clause += 1;
  114.     if (!succes)
  115.     eolflg = 1;
  116.     if (!succes)
  117.     goto lab1;
  118.     errflg = 0;
  119.     /******        for "tell someone" or "ask someone"  */
  120.  
  121.     if (actor != 1) {
  122.  
  123.     otheract();    /* perform verbs for other than player */
  124.  
  125.  
  126.     timer(xloc);
  127.     /* this goto is for permanent death due to radiation poisoning */
  128.  
  129.     {
  130.         if (rdietm == 50)
  131.         goto lab9000;
  132.         nonext = 1;
  133.         goto lab3000;
  134.     }
  135.     }
  136.     /******/
  137.  
  138.  
  139.  
  140.  
  141.     verb = wrdnum[0];
  142.  
  143.     playerv();    /* this does all the verbs for player */
  144.  
  145.  
  146.     if (errflg == 1)
  147.     goto lab9000;
  148.     if (errflg == 2)
  149.     goto lab9990;
  150.     {
  151.     if (deadf && loc >= 153)
  152.         goto lab9000;
  153.     }
  154.     timer(xloc);
  155.     /*
  156.      * this goto is for permanent death due to radiation poisoning or death
  157.      * in endgame 
  158.      */
  159.  
  160.     {
  161.     if (rdietm == 50 || (loc >= 153 && deadf))
  162.         goto lab9000;
  163.     }
  164.     h = 0;
  165.     {
  166.     if (loc != xloc) {
  167.         /* get out of any special locations (like on glass) */
  168.  
  169.         if (!(loc == 187 || loc == 184 || (loc >= 175
  170.                            && loc <= 181)))
  171.         spcloc = 0;
  172.         if (wirelc[5] == 1000 || obloc[ZWIRE] == 1000)
  173.         wdemon();
  174.         h = 1;
  175.     }
  176.     }
  177.     /* announce new location  */
  178.  
  179.     {
  180.     if (!nonext || (loc >= 7 && loc <= 11) ||
  181.         (loc >= 100 && loc <= 116)) {
  182.         linout(" ", 1);
  183.         if (loc >= 7 && loc <= 11)
  184.         h = 1;
  185.         vlocat(0, h);
  186.     }
  187.     if (loc >= 26 && loc <= 51) {
  188.         linout(" ", 1);
  189.         mdemon();
  190.     }
  191.     }
  192.  
  193.     /* cat function */
  194.  
  195. lab3000:
  196.     {
  197.     if (obloc[ZCAT] == 1000 || (obloc[ZCAT] == (2000 + ZKNAPS) &&
  198.              (obloc[ZKNAPS] == 3000 || obloc[ZKNAPS] == loc))) {
  199.         if (loc == 149 && obloc[ZCART] == 0) {
  200.         speak(290);
  201.         obloc[ZCAT] = loc;
  202.         obloc[ZCART] = loc;
  203.         } else if (obloc[ZCAT] == 2000 + ZKNAPS && obloc[ZKNAPS] == 3000
  204.                && pct(5)) {
  205.         speak(287);
  206.         obloc[ZCAT] = 1000;
  207.         } else if (pct(3))
  208.         speak(288);
  209.         else if (pct(3))
  210.         speak(289);
  211.     }
  212.     }
  213.     /* robot activation */
  214.  
  215.     {
  216.     if ((obimpr[RSLOT] & 8192) == 8192) {
  217.         obimpr[RSLOT] -= 8192;
  218.         if (obloc[ZCART] == 2000 + RSLOT)
  219.         speak(310);
  220.         else
  221.         speak(365);
  222.     }
  223.     }
  224.     /* give bonus for reaching cygnus or deneb */
  225.  
  226.     {
  227.     if (loc == 183) {
  228.         if ((locdat[183] & 16384) == 0) {
  229.         speak(549);
  230.         bonus += 5;
  231.         } else if (xloc != loc)
  232.         speak(550);
  233.     } else if (loc == 186) {
  234.         if ((locdat[186] & 16384) == 0)
  235.         speak(547);
  236.         else if (xloc != loc)
  237.         speak(548);
  238.     } else if (loc == 190) {
  239.         speak(551);
  240.         bonus += 5;
  241.         goto lab9000;
  242.     }
  243.     }
  244.     {
  245.     if (loc == xloc && loc == 171) {
  246.         speak(557);
  247.         vdead();
  248.         goto lab9000;
  249.     }
  250.     }
  251.     xloc = loc;
  252.     turns += 1;
  253.     nonext = 0;
  254.     /* we have visited this location  */
  255.  
  256.     locdat[loc] |= 16384;
  257.     linout(" ", 1);
  258.     goto lab1;
  259. lab9000:
  260.     linout(" ", 1);
  261.     scor = scorng() + bonus * 5;
  262.     scorpt(scor, mxscor);
  263.     goto lab9999;
  264. lab9990:
  265.     endsl();
  266. lab9999: ;
  267. # ifdef OSK
  268.     score_board (scor);
  269. # endif OSK
  270. #ifdef AMIGA
  271.     ttclose();
  272. #endif
  273. }
  274.  
  275. /* end of main program  */
  276.  
  277.  
  278. otheract()
  279. {
  280.     static int      actok;
  281.  
  282.     if (actor == MARTIA) {
  283.     if (martim == 7 && loc >= 27 && loc <= 51)
  284.         speak(167);
  285.     else
  286.         speak(168);
  287.     } else if (actor == ROBOT) {
  288.     {
  289.         if (chgact == 1)
  290.         actok = 1;
  291.     }
  292.     /* test to see if robot can "hear"  */
  293.  
  294.     if (chgact == 1 && obloc[CCART] == (2000 + RSLOT) &&
  295.         (loc == 146 || obloc[ZROBOT] == loc)) {
  296.         speak(366);
  297.         actok = 0;
  298.     } else if (chgact == 1 && !((loc == obloc[ZROBOT] ||
  299.                loc == 146) && obloc[ZCART] == (2000 + RSLOT))) {
  300.         speak(314);
  301.         actok = 0;
  302.     } else if (chgact == 0 && actok == 0);
  303.     else if (wrdnum[0] == GO) {
  304.         mloc = obloc[ZROBOT];
  305.         vgo();
  306.         {
  307.         if (obloc[ZROBOT] == 90)
  308.             obimpr[ZROBOT] = 2257;
  309.         }
  310.         {
  311.         if (rmove == 1 && (loc == mloc))
  312.             speak(316);
  313.         else if (rmove == 1 && mloc != loc && obloc[ZROBOT] == loc)
  314.             speak(317);
  315.         else if (rmove == 1 && loc == 146)
  316.             robdsc();
  317.         }
  318.         {
  319.         if (obloc[ZROBOT] == 90) {
  320.             if (obloc[ZORCHI] == 2000 + ZROBOT)
  321.             obloc[ZORCHI] = 0;
  322.             else if (obloc[ZFLYTR] == 2000 + ZROBOT)
  323.             obloc[ZFLYTR] = 0;
  324.         }
  325.         }
  326.     } else if (wrdnum[0] == TAKE || wrdnum[0] == DROP ||
  327.            wrdnum[0] == PUT || wrdnum[0] == IS || wrdnum[0] ==
  328.            TRANSL || wrdnum[0] == WASH || wrdnum[0] == QWATER
  329.            || wrdnum[0] == HOLD || wrdnum[0] == GIVE)
  330.         vrobot();
  331.     else
  332.         speak(315);
  333.     } else if (actor == FERRET) {
  334.     if (loc != 131 && loc != 99 && loc != 100)
  335.         speak(435);
  336.     else
  337.         speak(436);
  338.     } else if (actor == CACTUS) {
  339.     if (loc != 82)
  340.         speak(437);
  341.     else if (cactsc != 3)
  342.         speak(438);
  343.     /* cactus freezing scree sclope */
  344.  
  345.     else if ((wrdnum[0] == HOLD || wrdnum[0] == FREEZE) &&
  346.          dobjs[0] == GRAVEL) {
  347.         screef = 4;
  348.         speak(441);
  349.     } else
  350.         speak(237);
  351.     } else if (actor == GUARD) {
  352.     if (loc == guardl || loc == 171 || (chaset != 0 &&
  353.                         chaset <= 9))
  354.         speak(562);
  355.     else
  356.         speak(561);
  357.     } else
  358.     speak(251);
  359. }
  360.  
  361. playerv()
  362. {
  363.     if (verb < TAKE) {
  364.     vretrn = 1;
  365.     {
  366.         if (verb == RUN)
  367.         vretrn = vrun();
  368.         else if (verb == CRAWL)
  369.         vretrn = vcrawl();
  370.         else if (verb == CROSS)
  371.         vretrn = vcross();
  372.         else if (verb == JUMP)
  373.         vretrn = vjump();
  374.         else if (verb == ASCEND) {
  375.         prepdo = UP;
  376.         vretrn = vclimb();
  377.         } else if (verb == DESCEN) {
  378.         prepdo = DOWN;
  379.         vretrn = vclimb();
  380.         } else if (verb == CLIMB)
  381.         vretrn = vclimb();
  382.         else if (verb == SWIM)
  383.         vretrn = vswim();
  384.     }
  385.  
  386.     /*
  387.      * if vretrn=0, then the action is complete if vretrn=1, then a
  388.      * translation to "go" occured or the verb was actually "go" 
  389.          */
  390.  
  391.     {
  392.         if (vretrn == 1)
  393.         vgo();
  394.     }
  395.     } else if (verb == QUIT) {
  396.     if (yesx(101))
  397.         errflg = 1;    /* out after scoring */
  398.  
  399.     } else if (verb == DAMN)
  400.     dirty += 1;
  401.     else if (verb == SUSPEN)
  402.     if (chaset == 0)
  403.         vsuspe(0);
  404.     else
  405.         speak(559);
  406.     else if (verb == RESTOR) {
  407.     if (vsuspe(1)) {
  408.         eolflg = 1;
  409.         nonext = 0;
  410.         actor = 1;
  411.         xloc = loc;
  412.     }
  413.     } else if (verb == BRIEF)
  414.     brfflg = 1;
  415.     else if (verb == VERBOS)
  416.     brfflg = 2;
  417.     else if (verb == SUPERB)
  418.     brfflg = 0;
  419.     else if (verb == QMORE)
  420.     nomor = 0;
  421.     else if (verb == NOMORE)
  422.     nomor = 1;
  423.     else if (verb == SCORE) {
  424.     scor = scorng() + bonus * 5;
  425.     scorpt(scor, mxscor);
  426.     } else if (verb == HELP)
  427.     vhelp();
  428.     else if (verb == RETREA)
  429.     vretre();
  430.     else if (verb == PRAY) {
  431.     if (!deadf || loc != 61)
  432.         speak(44);
  433.     else {
  434.         deadf = 0;
  435.         speak(45);
  436.         nonext = 1;
  437.         noshoe = 8;
  438.     }
  439.     } else if (verb == DEBUG)
  440.     dbg();
  441.     else if (verb == LOCATE) {
  442.     vlocat(1, 1);
  443.     nonext = 1;
  444.     } else if (!deadf) {
  445.     if (verb == TAKE || verb == REMOVE || verb == CARRY ||
  446.         verb == HOLD)
  447.         vtake();
  448.     else if (verb == DROP)
  449.         vdrop();
  450.     else if (verb == THROW) {
  451.         if (!vthrow())
  452.         vdrop();
  453.     } else if (verb == SIT)
  454.         vsit();
  455.     else if (verb == STAND)
  456.         vstand();
  457.     else if (verb == GET) {
  458.         xretn = vget();
  459.         {
  460.         if (xretn == 1)
  461.             vtake();
  462.         }
  463.     } else if (verb == SHOOT)
  464.         vshoot();
  465.     else if (verb == OPEN)
  466.         vopen();
  467.     else if (verb == SHUT)
  468.         vshut();
  469.     else if (verb == LAND || verb == ACTIVA)
  470.         vship();
  471.     else if (verb == SCRATC)
  472.         vscrat();
  473.     else if (verb == TRANSL)
  474.         speak(71);
  475.     else if (verb == ATTACH)
  476.         vattac();
  477.     else if (verb == POUR || verb == QWATER) {
  478.         if (vpour() == 1)
  479.         vput();
  480.     } else if (verb == WASH)
  481.         vwash();
  482.     else if (verb == EAT)
  483.         veat();
  484.     else if (verb == DRINK)
  485.         vdrink();
  486.     else if (verb == FILL) {
  487.         if (vfill() == 1)
  488.         vpour();
  489.     } else if (verb == IGNITE)
  490.         speak(39);
  491.     else if (verb == TURN)
  492.         vturn();
  493.     else if (verb == READ)
  494.         vread();
  495.     else if (verb == BREAK)
  496.         vbreak();
  497.     else if (verb == FREEZE)
  498.         speak(442);
  499.     else if (verb == PICK) {
  500.         xretn = vpick();
  501.         {
  502.         if (xretn == 1)
  503.             vtake();
  504.         }
  505.     } else if (verb == WEAR)
  506.         vwear();
  507.     else if (verb == PUT) {
  508.         xretn = vput();
  509.         {
  510.         if (xretn == 1)
  511.             vwear();
  512.         if (xretn == 2)
  513.             vdrop();
  514.         if (xretn == 3)
  515.             vpour();
  516.         }
  517.     } else if (verb == LOCK || verb == UNLOCK)
  518.         vlocks();
  519.     else if (verb == LOOK || verb == EXAMIN)
  520.         vlooks();
  521.     else if (verb == PUSH || verb == KISS) {
  522.         {
  523.         if (verb == KISS)
  524.             yretn = vkiss();
  525.         }
  526.         if (yretn == 1 || verb == PUSH) {
  527.         xretn = vpush();
  528.         /* oops! the nova button */
  529.  
  530.         if (xretn == 1)
  531.             errflg = 2;    /* instant out */
  532.  
  533.         else if (xretn > 1) {
  534.             bonus = xretn * 2;
  535.             {
  536.             if (xretn < 5)
  537.                 errflg = 1;    /* out after scoring */
  538.  
  539.             }
  540.             /* change to the "endgame" */
  541.  
  542.             scor = scorng();
  543.             bonus += scor / 5;
  544.             loc = 153;
  545.             oldloc = 0;
  546.             oldlc2 = 0;
  547.             {
  548.             for (ikk = 1; ikk <= SCOIN; ikk++)
  549.                 if (obloc[ikk] != 1000 && obloc[ikk] != 3000)
  550.                 obloc[ikk] = 0;
  551.             }
  552.             obloc[ZKNAPS] = 0;
  553.         }
  554.         }
  555.     } else if (verb == PUNCH) {
  556.         if (vpunch() == 1)
  557.         vbreak();
  558.     } else if (verb == ATTACK)
  559.         vattak();
  560.     else if (verb == DIG)
  561.         vdig();
  562.     else if (verb == GIVE || verb == FEED)
  563.         vgive();
  564.     else if (verb == IS)
  565.         speak(467);
  566.     else if (verb == FUCK) {
  567.         dirty += 1;
  568.         vfuck();
  569.     } else if (loc == 127 && (verb == SHIT || verb == EXHALE
  570.                   || verb == PISS)) {
  571.         loc = 126;
  572.         oldloc = 0;
  573.         oldlc2 = 0;
  574.         speak(312);
  575.     } else if (verb == EXHALE)
  576.         speak(313);
  577.     else if (verb == PISS) 
  578.             vpiss();
  579.     else if (verb == SHIT) 
  580.             vshit();
  581.     else if (verb == INVENT)
  582.         vinven();
  583.     else;
  584.     }
  585.     else speak(46);
  586.  
  587. }
  588.