dso2.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* MOVETO- MOVE PLAYER TO NEW ROOM */
  2. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  3. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  4. /* WRITTEN BY R. M. SUPNIK */
  5. #include <stdio.h>
  6. #include "funcs.h"
  7. #include "vars.h"
  8. logical moveto_(nr, who)
  9. integer nr;
  10. integer who;
  11. {
  12. /* System generated locals */
  13. logical ret_val;
  14. /* Local variables */
  15. integer j;
  16. logical lhr;
  17. logical lnr, nlv;
  18. integer bits;
  19. ret_val = FALSE_;
  20. /* !ASSUME FAILS. */
  21. lhr = (rooms_1.rflag[play_1.here - 1] & RLAND) != 0;
  22. lnr = (rooms_1.rflag[nr - 1] & RLAND) != 0;
  23. j = advs_1.avehic[who - 1];
  24. /* !HIS VEHICLE */
  25. if (j != 0) {
  26. goto L100;
  27. }
  28. /* !IN VEHICLE? */
  29. if (lnr) {
  30. goto L500;
  31. }
  32. /* !NO, GOING TO LAND? */
  33. rspeak_(427);
  34. /* !CAN'T GO WITHOUT VEHICLE. */
  35. return ret_val;
  36. L100:
  37. bits = 0;
  38. /* !ASSUME NOWHERE. */
  39. if (j == oindex_1.rboat) {
  40. bits = RWATER;
  41. }
  42. /* !IN BOAT? */
  43. if (j == oindex_1.ballo) {
  44. bits = RAIR;
  45. }
  46. /* !IN BALLOON? */
  47. if (j == oindex_1.bucke) {
  48. bits = RBUCK;
  49. }
  50. /* !IN BUCKET? */
  51. nlv = (rooms_1.rflag[nr - 1] & bits) == 0;
  52. if (! lnr && nlv || lnr && lhr && nlv && bits != RLAND) {
  53. goto L800;
  54. }
  55. L500:
  56. ret_val = TRUE_;
  57. /* !MOVE SHOULD SUCCEED. */
  58. if ((rooms_1.rflag[nr - 1] & RMUNG) == 0) {
  59. goto L600;
  60. }
  61. rspeak_(rrand[nr - 1]);
  62. /* !YES, TELL HOW. */
  63. return ret_val;
  64. L600:
  65. if (who != aindex_1.player) {
  66. newsta_(advs_1.aobj[who - 1], 0, nr, 0, 0);
  67. }
  68. if (j != 0) {
  69. newsta_(j, 0, nr, 0, 0);
  70. }
  71. play_1.here = nr;
  72. advs_1.aroom[who - 1] = play_1.here;
  73. scrupd_(rooms_1.rval[nr - 1]);
  74. /* !SCORE ROOM */
  75. rooms_1.rval[nr - 1] = 0;
  76. return ret_val;
  77. L800:
  78. rspsub_(428, objcts_1.odesc2[j - 1]);
  79. /* !WRONG VEHICLE. */
  80. return ret_val;
  81. } /* moveto_ */
  82. /* SCORE-- PRINT OUT CURRENT SCORE */
  83. /* DECLARATIONS */
  84. void score_(flg)
  85. logical flg;
  86. {
  87. /* Initialized data */
  88. static const integer rank[10] = { 20,19,18,16,12,8,4,2,1,0 };
  89. static const integer erank[5] = { 20,15,10,5,0 };
  90. /* System generated locals */
  91. integer i__1;
  92. /* Local variables */
  93. integer i, as;
  94. as = advs_1.ascore[play_1.winner - 1];
  95. if (findex_1.endgmf) {
  96. goto L60;
  97. }
  98. /* !ENDGAME? */
  99. more_output(NULL);
  100. printf("Your score ");
  101. if (flg)
  102. printf("would be");
  103. else
  104. printf("is");
  105. printf(" %d [total of %d points], in %d move", as, state_1.mxscor,
  106. state_1.moves);
  107. if (state_1.moves != 1)
  108. printf("s");
  109. printf(".\n");
  110. for (i = 1; i <= 10; ++i) {
  111. if (as * 20 / state_1.mxscor >= rank[i - 1]) {
  112. goto L50;
  113. }
  114. /* L10: */
  115. }
  116. L50:
  117. i__1 = i + 484;
  118. rspeak_(i__1);
  119. return;
  120. L60:
  121. more_output(NULL);
  122. printf("Your score in the endgame ");
  123. if (flg)
  124. printf("would be");
  125. else
  126. printf("is");
  127. printf(" %d [total of %d points], in %d moves.\n", state_1.egscor,
  128. state_1.egmxsc, state_1.moves);
  129. for (i = 1; i <= 5; ++i) {
  130. if (state_1.egscor * 20 / state_1.egmxsc >= erank[i - 1]) {
  131. goto L80;
  132. }
  133. /* L70: */
  134. }
  135. L80:
  136. i__1 = i + 786;
  137. rspeak_(i__1);
  138. } /* score_ */
  139. /* SCRUPD- UPDATE WINNER'S SCORE */
  140. /* DECLARATIONS */
  141. void scrupd_(n)
  142. integer n;
  143. {
  144. if (findex_1.endgmf) {
  145. goto L100;
  146. }
  147. /* !ENDGAME? */
  148. advs_1.ascore[play_1.winner - 1] += n;
  149. /* !UPDATE SCORE */
  150. state_1.rwscor += n;
  151. /* !UPDATE RAW SCORE */
  152. if (advs_1.ascore[play_1.winner - 1] < state_1.mxscor - state_1.deaths *
  153. 10) {
  154. return;
  155. }
  156. cevent_1.cflag[cindex_1.cevegh - 1] = TRUE_;
  157. /* !TURN ON END GAME */
  158. cevent_1.ctick[cindex_1.cevegh - 1] = 15;
  159. return;
  160. L100:
  161. state_1.egscor += n;
  162. /* !UPDATE EG SCORE. */
  163. } /* scrupd_ */