200 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						|
    SCORE
 | 
						|
 | 
						|
   Calculate what the player's score would be if he quit now.
 | 
						|
   This may be the end of the game, or he may just be wondering
 | 
						|
   how he is doing.
 | 
						|
 | 
						|
   The present scoring algorithm is as follows:
 | 
						|
   (treasure points are explained in a following comment)
 | 
						|
      objective:          points:        present total possible:
 | 
						|
   getting well into cave   25                    25
 | 
						|
   total possible for treasures (+mag)           426
 | 
						|
   reaching "closing"       20                    20
 | 
						|
   "closed": quit/killed    10
 | 
						|
             klutzed        20
 | 
						|
             wrong way      25
 | 
						|
             success        30                    30
 | 
						|
				total:   501
 | 
						|
   (points can also be deducted for using hints or deaths.)
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
#include 	<stdio.h>
 | 
						|
#include	"advent.h"
 | 
						|
#include	"advdec.h"
 | 
						|
 | 
						|
void score(scorng)
 | 
						|
boolean scorng;
 | 
						|
{
 | 
						|
    int cur_score, max_score, qk[3];
 | 
						|
    int obj, num_treas, k, i;
 | 
						|
    long t;
 | 
						|
    char *kk2c;
 | 
						|
 | 
						|
    cur_score = 0;
 | 
						|
    max_score = 0;
 | 
						|
    num_treas = 0;
 | 
						|
 | 
						|
/** First tally up the treasures.  Must be in building and not broken.
 | 
						|
   give the poor guy partial score just for finding each treasure.
 | 
						|
   Gets full score, qk[3], for obj if:
 | 
						|
        obj is at loc qk[1], and
 | 
						|
        obj has prop value of qk[2]
 | 
						|
 | 
						|
                weight          total possible
 | 
						|
   magazine     1 (absolute)            1
 | 
						|
 | 
						|
   all the following are multiplied by 5 (range 5-25):
 | 
						|
   book         2
 | 
						|
   cask         3 (with wine only)
 | 
						|
   chain        4 (must enter via styx)
 | 
						|
   chest        5
 | 
						|
   cloak        3
 | 
						|
   clover       1
 | 
						|
   coins        5
 | 
						|
   crown        2
 | 
						|
   crystal-ball 2
 | 
						|
   diamonds     2
 | 
						|
   eggs         3
 | 
						|
   emerald      3
 | 
						|
   grail        2
 | 
						|
   horn         2
 | 
						|
   jewels       1
 | 
						|
   lyre         1
 | 
						|
   nugget       2
 | 
						|
   pearl        4
 | 
						|
   pyramid      4
 | 
						|
   radium	4
 | 
						|
   ring         4
 | 
						|
   rug          3
 | 
						|
   sapphire     1
 | 
						|
   shoes        3
 | 
						|
   spices       1
 | 
						|
   sword        4
 | 
						|
   trident      2
 | 
						|
   vase         2
 | 
						|
   droplet	5
 | 
						|
   tree		5
 | 
						|
        total: 85 * 5 = 425 + 1 ==> 426
 | 
						|
*/
 | 
						|
 | 
						|
    for (obj = 1; obj < MAXOBJ; obj++) {
 | 
						|
	if (g.points[obj] == 0)
 | 
						|
	    continue;
 | 
						|
	t = g.points[obj];
 | 
						|
 	qk[0] = (int) (t < 0L ? -((t = -t) % 1000) : (t % 1000));
 | 
						|
 	t /= 1000;
 | 
						|
	qk[1] = (int) (t % 1000);
 | 
						|
	qk[2] = (int) (t / 1000);
 | 
						|
	k = 0;
 | 
						|
	if (treasr(obj)) {
 | 
						|
	    num_treas++;
 | 
						|
	    k = qk[2] * 2;
 | 
						|
	    if (g.prop[obj] >= 0)
 | 
						|
		cur_score += k;
 | 
						|
	    qk[2] *= 5;
 | 
						|
	}
 | 
						|
	if ((g.place[obj] == qk[0]) && (g.prop[obj] == qk[1])
 | 
						|
	    && ((g.place[obj] != -CHEST) || (g.place[CHEST] == 3))
 | 
						|
	  && ((g.place[obj] != -SHIELD) || (g.place[SHIELD] == -SAFE))
 | 
						|
	    )
 | 
						|
	    cur_score += qk[2] - k;
 | 
						|
	max_score += qk[2];
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
   Now look at how he finished and how far he got.  Maxdie and numdie tell us
 | 
						|
   how well he survived.  Gaveup says whether he exited via quit.  Dflag will
 | 
						|
   tell us if he ever got suitably deep into the cave.  Closing still indicates
 | 
						|
   whether he reached the endgame.  And if he got as far as "cave closed"
 | 
						|
   (indicated by "closed"), then bonus is zero for mundane exits or 133, 134,
 | 
						|
   135 if he blew it (so to speak).
 | 
						|
*/
 | 
						|
 | 
						|
    if (g.dflag)
 | 
						|
	cur_score += 25;
 | 
						|
    max_score += 25;
 | 
						|
    if (g.closing)
 | 
						|
	cur_score += 20;
 | 
						|
    max_score += 20;
 | 
						|
    if (g.closed) {
 | 
						|
	if (g.bonus == 0)
 | 
						|
	    cur_score += 10;
 | 
						|
	else if (g.bonus == 135)
 | 
						|
	    cur_score += 20;
 | 
						|
	else if (g.bonus == 134)
 | 
						|
	    cur_score += 25;
 | 
						|
	else if (g.bonus == 133)
 | 
						|
	    cur_score += 30;
 | 
						|
    }
 | 
						|
    max_score += 30;
 | 
						|
 | 
						|
/*  Deduct points for hints, deaths and quiting.
 | 
						|
    hints < hntmin are special; see database description
 | 
						|
*/
 | 
						|
    for (i = 1; i <= HNTMAX; i++)
 | 
						|
	if (g.hinted[i])
 | 
						|
	    cur_score -= g.hints[i][2];
 | 
						|
    cur_score -= g.numdie * 10;
 | 
						|
    if (gaveup)
 | 
						|
	cur_score -= 4;
 | 
						|
 | 
						|
    fprintf(stdout, "You have found   %3d out of %3d Treasures,",
 | 
						|
	    num_treas - g.tally, num_treas);
 | 
						|
    fprintf(stdout, " using %4d turns\n", g.turns);
 | 
						|
    fprintf(stdout, "For a score of: %4d", cur_score);
 | 
						|
    fprintf(stdout, " out of a possible %4d\n", max_score);
 | 
						|
 | 
						|
    if (cur_score < 110) {
 | 
						|
	fprintf(stdout, "You are obviously a rank amateur.");
 | 
						|
	if (!scorng)
 | 
						|
	    fprintf(stdout, "  Better luck next time.");
 | 
						|
	fputc('\n', stdout);
 | 
						|
	k = 110 - cur_score;
 | 
						|
    } else if (cur_score < 152) {
 | 
						|
	fprintf(stdout,
 | 
						|
	  "Your score qualifies you as a Novice Class Adventurer.\n");
 | 
						|
	k = 152 - cur_score;
 | 
						|
    } else if (cur_score < 200) {
 | 
						|
	fprintf(stdout,
 | 
						|
	"You have achieved the rating: \"Experienced Adventurer\".\n");
 | 
						|
	k = 200 - cur_score;
 | 
						|
    } else if (cur_score < 277) {
 | 
						|
	fprintf(stdout,
 | 
						|
	"You may now consider yourself a \"Seasoned Adventurer\".\n");
 | 
						|
	k = 277 - cur_score;
 | 
						|
    } else if (cur_score < 345) {
 | 
						|
	fprintf(stdout,
 | 
						|
		"You have reached \"Junior Master\" status.\n");
 | 
						|
	k = 345 - cur_score;
 | 
						|
    } else if (cur_score < 451) {
 | 
						|
	fprintf(stdout,
 | 
						|
		"Your score puts you in Master Adventurer Class C.\n");
 | 
						|
	k = 451 - cur_score;
 | 
						|
    } else if (cur_score < 471) {
 | 
						|
	fprintf(stdout,
 | 
						|
		"Your score puts you in Master Adventurer Class B.\n");
 | 
						|
	k = 471 - cur_score;
 | 
						|
    } else if (cur_score < 501) {
 | 
						|
	fprintf(stdout,
 | 
						|
		"Your score puts you in Master Adventurer Class A.\n");
 | 
						|
	k = 501 - cur_score;
 | 
						|
    } else {
 | 
						|
	fprintf(stdout,
 | 
						|
		"All of Adventuredom gives tribute to you, Adventurer Grandmaster!\n");
 | 
						|
	k = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!scorng) {
 | 
						|
	kk2c = (k == 1) ? "." : "s.";
 | 
						|
	printf("\nTo acheive the next higher rating,");
 | 
						|
	if (cur_score == 501)
 | 
						|
	    printf(" would be a neat trick!\n\n  CONGRATULATIONS!!\n");
 | 
						|
	else
 | 
						|
	    printf(" you need %3d more point%s\n", k, kk2c);
 | 
						|
    }
 | 
						|
    return;
 | 
						|
}
 |