3c94f83827e3c76974ca83e66f1936653498cf5e
[open-adventure.git] / score.c
1 #include <stdlib.h>
2 #include "advent.h"
3 #include "database.h"
4
5 /*
6  * scoring and wrap-up
7  */
8
9 void score(long mode)
10 /* mode is <0 if scoring, >0 if quitting, =0 if died or won */
11 {
12     long i, k, score = 0, mxscor = 0;
13
14     /*  The present scoring algorithm is as follows:
15      *     Objective:          Points:        Present total possible:
16      *  Getting well into cave   25                    25
17      *  Each treasure < chest    12                    60
18      *  Treasure chest itself    14                    14
19      *  Each treasure > chest    16                   224
20      *  Surviving             (MAX-NUM)*10             30
21      *  Not quitting              4                     4
22      *  Reaching "game.closng"   25                    25
23      *  "Closed": Quit/Killed    10
24      *            Klutzed        25
25      *            Wrong way      30
26      *            Success        45                    45
27      *  Came to Witt's End        1                     1
28      *  Round out the total       2                     2
29      *                                       TOTAL:   430
30      *  Points can also be deducted for using hints or too many turns, or for
31      *  saving intermediate positions. */
32
33     /*  First tally up the treasures.  Must be in building and not broken.
34      *  Give the poor guy 2 points just for finding each treasure. */
35     for (i=MINTRS; i<=MAXTRS; i++) {
36         if(PTEXT[i] != 0) {
37             k=12;
38             if(i == CHEST)k=14;
39             if(i > CHEST)k=16;
40             if(game.prop[i] >= 0)
41                 score=score+2;
42             if(game.place[i] == 3 && game.prop[i] == 0)
43                 score=score+k-2;
44             mxscor=mxscor+k;
45         }
46     }
47
48     /*  Now look at how he finished and how far he got.  MAXDIE and
49      *  game.numdie tell us how well he survived.  game.dflag will tell us
50      *  if he ever got suitably deep into the cave.  game.closng still
51      *  indicates whether he reached the endgame.  And if he got as far as
52      *  "cave closed" (indicated by "game.closed"), then bonus is zero for
53      *  mundane exits or 133, 134, 135 if he blew it (so to speak). */
54     score=score+(MAXDIE-game.numdie)*10;
55     mxscor=mxscor+MAXDIE*10;
56     if(mode == 0)score=score+4;
57     mxscor=mxscor+4;
58     if(game.dflag != 0)score=score+25;
59     mxscor=mxscor+25;
60     if(game.closng)score=score+25;
61     mxscor=mxscor+25;
62     if(game.closed) {
63         if(game.bonus == 0)
64             score=score+10;
65         if(game.bonus == 135)
66             score=score+25;
67         if(game.bonus == 134)
68             score=score+30;
69         if(game.bonus == 133)
70             score=score+45;
71     }
72     mxscor=mxscor+45;
73
74     /* Did he come to Witt's End as he should? */
75     if(game.place[MAGZIN] == 108)
76         score=score+1;
77     mxscor=mxscor+1;
78
79     /* Round it off. */
80     score=score+2;
81     mxscor=mxscor+2;
82
83     /* Deduct for hints/turns/saves. Hints < 4 are special; see database desc. */
84     for (i=1; i<=HNTMAX; i++) {
85         if(game.hinted[i])
86             score=score-HINTS[i][2];
87     }
88     if(game.novice)
89         score=score-5;
90     if(game.clshnt)
91         score=score-10;
92     score=score-game.trnluz-game.saved;
93
94     /* Return to score command if that's where we came from. */
95     if(mode < 0) {
96         SETPRM(1,score,mxscor);
97         SETPRM(3,game.turns,game.turns);
98         RSPEAK(259);
99         return;
100     }
101
102     /* that should be good enough.  Let's tell him all about it. */
103     if(score+game.trnluz+1 >= mxscor && game.trnluz != 0)
104         RSPEAK(242);
105     if(score+game.saved+1 >= mxscor && game.saved != 0)
106         RSPEAK(143);
107     SETPRM(1,score,mxscor);
108     SETPRM(3,game.turns,game.turns);
109     RSPEAK(262);
110     for (i=1; i<=CLSSES; i++) {
111         if(CVAL[i] >= score) {
112             SPEAK(CTEXT[i]);
113             i=CVAL[i]+1-score;
114             SETPRM(1,i,i);
115             RSPEAK(263);
116             exit(0);
117         }
118     }
119     RSPEAK(265);
120     RSPEAK(264);
121     exit(0);
122
123 }