root/games/trek/srscan.c
/*      $OpenBSD: srscan.c,v 1.9 2016/01/07 14:37:51 mestre Exp $       */
/*      $NetBSD: srscan.c,v 1.3 1995/04/22 10:59:31 cgd Exp $   */

/*
 * Copyright (c) 1980, 1993
 *      The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <stdio.h>

#include "getpar.h"
#include "trek.h"

/*
**  SHORT RANGE SENSOR SCAN
**
**      A short range scan is taken of the current quadrant.  If the
**      flag 'f' is one, it is an "auto srscan", which is not done
**      unless in 'fast' mode.  It does a status report and a srscan.
**      If 'f' is -1, you get a status report only.  If it is zero,
**      you get a srscan and an optional status report.  The status
**      report is taken if you enter "srscan yes"; for all srscans
**      thereafter you get a status report with your srscan until
**      you type "srscan no".  It defaults to on.
**
**      The current quadrant is filled in on the computer chart.
*/

const char      *const Color[4] =
{
        "GREEN",
        "DOCKED",
        "YELLOW",
        "RED"
};

void
srscan(int f)
{
        int             i, j;
        int             statinfo;
        const char      *s;
        int             percent;
        struct quad     *q = NULL;
        const struct cvntab     *p;

        if (f >= 0 && check_out(SRSCAN))
                return;
        if (f)
                statinfo = 1;
        else
        {
                if (!testnl())
                        Etc.statreport = getynpar("status report");
                statinfo = Etc.statreport;
        }
        if (f > 0)
                Etc.statreport = 1;
        if (f >= 0)
        {
                printf("\nShort range sensor scan\n");
                q = &Quad[Ship.quadx][Ship.quady];
                q->scanned = q->klings * 100 + q->bases * 10 + q->stars;
                printf("  ");
                for (i = 0; i < NSECTS; i++)
                {
                        printf("%d ", i);
                }
                printf("\n");
        }

        for (i = 0; i < NSECTS; i++)
        {
                if (f >= 0)
                {
                        printf("%d ", i);
                        for (j = 0; j < NSECTS; j++)
                                printf("%c ", Sect[i][j]);
                        printf("%d", i);
                        if (statinfo)
                                printf("   ");
                }
                if (statinfo)
                        switch (i)
                        {
                          case 0:
                                printf("stardate      %.2f", Now.date);
                                break;
                          case 1:
                                printf("condition     %s", Color[Ship.cond]);
                                if (Ship.cloaked)
                                        printf(", CLOAKED");
                                break;
                          case 2:
                                printf("position      %d,%d/%d,%d",Ship.quadx, Ship.quady, Ship.sectx, Ship.secty);
                                break;
                          case 3:
                                printf("warp factor   %.1f", Ship.warp);
                                break;
                          case 4:
                                printf("total energy  %d", Ship.energy);
                                break;
                          case 5:
                                printf("torpedoes     %d", Ship.torped);
                                break;
                          case 6:
                                s = "down";
                                if (Ship.shldup)
                                        s = "up";
                                if (damaged(SHIELD))
                                        s = "damaged";
                                percent = 100.0 * Ship.shield / Param.shield;
                                printf("shields       %s, %d%%", s, percent);
                                break;
                          case 7:
                                printf("Klingons left %d", Now.klings);
                                break;
                          case 8:
                                printf("time left     %.2f", Now.time);
                                break;
                          case 9:
                                printf("life support  ");
                                if (damaged(LIFESUP))
                                {
                                        printf("damaged, reserves = %.2f", Ship.reserves);
                                        break;
                                }
                                printf("active");
                                break;
                        }
                printf("\n");
        }
        if (f < 0)
        {
                printf("current crew  %d\n", Ship.crew);
                printf("brig space    %d\n", Ship.brigfree);
                printf("Klingon power %d\n", Param.klingpwr);
                p = &Lentab[Game.length - 1];
                if (Game.length > 2)
                        p--;
                printf("Length, Skill %s%s, ", p->abrev, p->full);
                p = &Skitab[Game.skill - 1];
                printf("%s%s\n", p->abrev, p->full);
                return;
        }
        printf("  ");
        for (i = 0; i < NSECTS; i++)
                printf("%d ", i);
        printf("\n");

        if (q->qsystemname & Q_DISTRESSED)
                printf("Distressed ");
        if (q->qsystemname)
                printf("Starsystem %s\n", systemname(q));
}