#ifndef lint
static char *RCSid = "$Header: /usr/brule/guest/empire/empire/emprcs/lib/commands/rada.c,v 2.1 1995/09/26 18:41:00 empire Exp $";
#endif

/*
 * rada.c
 *
 * do radar from ship or sector
 *
 * from PSL Empire, 1985
 * XXX should give better error messages when radaring from bad ship/sect.
 */

#include <ctype.h>
#include "misc.h"
#include "player.h"
#include "xy.h"
#include "var.h"
#include "ship.h"
#include "land.h"
#include "sect.h"
#include "nsc.h"
#include "nat.h"
#include "file.h"

rada()
{
	s_char	*cp;
	int	type;
	double	tf;
	double	tech;
	struct	nstr_item ni;
	struct	nstr_sect ns;
	struct	shpstr ship;
	struct	lndstr land;
	struct	sctstr sect;
	int	from_unit;
	s_char	buf[1024];

	from_unit = (**player->argp == 'l');

	if (!from_unit)
		cp = getstarg(player->argp[1], "Radar from (ship # or sector(s)) : ", buf);
	else
		cp = getstarg(player->argp[1], "Radar from (unit # or sector(s)) : ", buf);
	if (cp == 0)
		return RET_SYN;
	type = sarg_type(cp);
	if (type == NS_AREA) {
		if (!snxtsct(&ns, cp))
			return RET_SYN;
		tech = tfact(player->cnum, 8.0);
		if (tech > ((double)WORLD_Y/4.0))
			tech = ((double)WORLD_Y/4.0);
		if (tech > ((double)WORLD_X/8.0))
			tech = ((double)WORLD_X/8.0);
		while (nxtsct(&ns, &sect)) {
			if (sect.sct_type != SCT_RADAR)
				continue;
			if (!player->owner)
				continue;
			radmap(sect.sct_x, sect.sct_y, (int)sect.sct_effic,
				(int) (tech * 2.0), 0.0);
		}
	} else if (type == NS_LIST || type == NS_GROUP) {
		if (!from_unit){
			/* assumes a NS_LIST return is a shipno */
			if (!snxtitem(&ni, EF_SHIP, cp)) {
				pr("Specify at least one ship\n");
				return RET_SYN;
			}
			while (nxtitem(&ni, (s_char *)&ship)) {
				if (!player->owner)
					continue;
				if (mchr[ship.shp_type].m_flags & M_SONAR)
					tf = techfact(ship.shp_tech, 1.0);
				else
					tf = 0.0;
				pr("%s at ", prship(&ship));
				tech = techfact(ship.shp_tech,
					(double) mchr[ship.shp_type].m_vrnge);
				if (tech > ((double)WORLD_Y/2.0))
					tech = ((double)WORLD_Y/2.0);
				if (tech > ((double)WORLD_X/4.0))
					tech = ((double)WORLD_X/4.0);
				radmap(ship.shp_x, ship.shp_y, ship.shp_effic,
					(int) tech, tf);
			}
		}else{
			/* from a land unit */
			if (!snxtitem(&ni, EF_LAND, cp)) {
				pr("Specify at least one unit\n");
				return RET_SYN;
			}
			while (nxtitem(&ni, (s_char *)&land)) {
				if (!player->owner)
					continue;
				if (!(lchr[land.lnd_type].l_flags & L_RADAR)){
					pr("%s can't use radar!\n",
					   prland(&land));
					continue;
				}
				if (land.lnd_ship >= 0){
					pr("Units on ships can't use radar!\n");
					continue;
				}
				tf = 0.0;
				pr("%s at ", prland(&land));
				tech = techfact(land.lnd_tech,
					(double) lchr[land.lnd_type].l_spy);
				if (tech > ((double)WORLD_Y/2.0))
					tech = ((double)WORLD_Y/2.0);
				if (tech > ((double)WORLD_X/4.0))
					tech = ((double)WORLD_X/4.0);
				radmap(land.lnd_x, land.lnd_y, land.lnd_effic,
					(int) tech, tf);
			}
		}
	} else {
		if (!from_unit)
			pr("Must use a ship or sector specifier\n");
		else
			pr("Must use a unit or sector specifier\n");
		return RET_SYN;
	}
	return RET_OK;
}
