|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 8055 (0x1f77)
Types: TextFile
Names: »minisubs.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/X/Xtrek/minisubs.c«
static char sccsid[] = "@(#)minisubs.c 1.1";
#include <X11/Xlib.h>
#include "defs.h"
#include "data.h"
extern long isin[], icos[];
cool_weapons(who)
register struct player *who;
{
who->p_wtemp -= PWEAPCOOL;
if (who->p_wtemp < 0)
who->p_wtemp = 0;
if (who->p_flags & PFWEP) {
if (--who->p_wtime <= 0)
who->p_flags &= ~PFWEP;
} else if (who->p_wtemp > 1000) {
if (!(random() % 40)) {
who->p_flags |= PFWEP;
who->p_wtime = (random() % PWEAPLOCKVAR) + PWEAPLOCKMIN;
}
}
}
cool_engines(who)
register struct player *who;
{
who->p_etemp -= PENGCOOL;
if (who->p_etemp < 0)
who->p_etemp = 0;
if (who->p_flags & PFENG) {
if (--who->p_etime <= 0)
who->p_flags &= ~PFENG;
} else if (who->p_etemp > 1000) {
if (!(random() % 40)) {
who->p_flags |= PFENG;
who->p_etime = (random() % PENGLOCKVAR) + PENGLOCKMIN;
who->p_desspeed = 0;
}
}
}
add_fuel(who)
register struct player *who;
{
if ((who->p_flags & PFORBIT) && (planets[who->p_planet].pl_flags & PLFUEL) &&
(!(planets[who->p_planet].pl_owner & (who->p_swar | who->p_hostile)))) {
who->p_fuel += PREFUEL * 4 * who->p_ship.s_recharge;
} else
who->p_fuel += PREFUEL * who->p_ship.s_recharge;
if (who->p_fuel > who->p_ship.s_maxfuel)
who->p_fuel = who->p_ship.s_maxfuel;
if (who->p_fuel < 0) {
who->p_desspeed = 0;
who->p_flags &= ~PFCLOAK; /* should be cloak_off(). */
}
}
repair_shields(who)
register struct player *who;
{
if (who->p_shield < 100) {
if ((who->p_flags & PFREPAIR) && (who->p_speed == 0)) {
who->p_subshield += who->p_ship.s_repair * PREPAIR * 4;
if ((who->p_flags & PFORBIT) &&
(planets[who->p_planet].pl_flags & PLREPAIR) &&
(!(planets[who->p_planet].pl_owner
& (who->p_swar | who->p_hostile)))) {
who->p_subshield += who->p_ship.s_repair * PREPAIR * 4;
}
}
else
who->p_subshield += who->p_ship.s_repair * PREPAIR * 2;
if (who->p_subshield / 1000) {
who->p_shield += who->p_subshield / 1000;
who->p_subshield %= 1000;
}
if (who->p_shield > 100) {
who->p_shield = 100;
who->p_subshield = 0;
}
}
}
repair_damage(who)
register struct player *who;
{
if (who->p_damage && !(who->p_flags & PFSHIELD)) {
if ((who->p_flags & PFREPAIR) && (who->p_speed == 0)) {
who->p_subdamage += who->p_ship.s_repair * PREPAIR * 2;
if ((who->p_flags & PFORBIT) &&
(planets[who->p_planet].pl_flags & PLREPAIR) &&
(!(planets[who->p_planet].pl_owner
& (who->p_swar | who->p_hostile)))) {
who->p_subdamage += who->p_ship.s_repair * PREPAIR * 2;
}
}
else
who->p_subdamage += who->p_ship.s_repair * PREPAIR;
if (who->p_subdamage / 1000) {
who->p_damage -= who->p_subdamage / 1000;
who->p_subdamage %= 1000;
}
if (who->p_damage < 0) {
who->p_damage = 0;
who->p_subdamage = 0;
}
}
}
cloak_charge(who)
register struct player *who;
{
if (who->p_flags & PFCLOAK) {
who->p_fuel -= who->p_ship.s_cloakcost * PCLOAKRATE;
}
}
player_orbit(who)
register struct player *who;
{
if (who->p_flags & PFORBIT) {
who->p_dir += 2;
who->p_desdir = who->p_dir;
who->p_x = planets[who->p_planet].pl_x +
((ORBDIST * icos[(unsigned char) (who->p_dir - (unsigned char) 64)])
>> TRIGSCALE);
who->p_y = planets[who->p_planet].pl_y +
((ORBDIST * isin[(unsigned char) (who->p_dir - (unsigned char) 64)])
>> TRIGSCALE);
}
}
space_move(who)
register struct player *who;
{
if (!(who->p_flags & PFORBIT)) {
if (who->p_dir != who->p_desdir)
changedir(who);
/* Alter speed */
alter_speed(who);
/* Charge for speed */
charge_speed(who);
/* Move them... */
who->p_x += (who->p_speed * icos[who->p_dir] * WARP1) >> TRIGSCALE;
who->p_y += (who->p_speed * isin[who->p_dir] * WARP1) >> TRIGSCALE;
/* Bounce off the side of the galaxy */
if (who->p_x < 0) {
who->p_x = -who->p_x;
if (who->p_dir == 192)
who->p_dir = who->p_desdir = 64;
else
who->p_dir = who->p_desdir = 64 - (who->p_dir - 192);
} else if (who->p_x > GWIDTH) {
who->p_x = GWIDTH - (who->p_x - GWIDTH);
if (who->p_dir == 64)
who->p_dir = who->p_desdir = 192;
else
who->p_dir = who->p_desdir = 192 - (who->p_dir - 64);
}
if (who->p_y < 0) {
who->p_y = -who->p_y;
if (who->p_dir == 0)
who->p_dir = who->p_desdir = 128;
else
who->p_dir = who->p_desdir = 128 - who->p_dir;
} else if (who->p_y > GWIDTH) {
who->p_y = GWIDTH - (who->p_y - GWIDTH);
if (who->p_dir == 128)
who->p_dir = who->p_desdir = 0;
else
who->p_dir = who->p_desdir = 0 - (who->p_dir - 128);
}
}
}
#define YRANGE ((GWIDTH)/5)
#define RRANGE ((GWIDTH)/10)
adjust_alert(who)
register struct player *who;
{
register int k;
register int dx, dy, dist;
who->p_flags |= PFGREEN;
who->p_flags &= ~(PFRED|PFYELLOW);
for (k = 0; k < MAXPLAYER; k++) {
if ((players[k].p_status != PALIVE) ||
(!((who->p_swar | who->p_hostile) & players[k].p_team))) {
continue;
} else {
dx = who->p_x - players[k].p_x;
dy = who->p_y - players[k].p_y;
if (ABS(dx) > YRANGE || ABS(dy) > YRANGE)
continue;
dist = dx * dx + dy * dy;
if (dist < RRANGE * RRANGE) {
who->p_flags |= PFRED;
who->p_flags &= ~(PFGREEN|PFYELLOW);
} else if ((dist < YRANGE * YRANGE) &&
(!(who->p_flags & PFRED))) {
who->p_flags |= PFYELLOW;
who->p_flags &= ~(PFGREEN|PFRED);
}
}
}
}
alter_speed(who)
register struct player *who;
{
register int maxspeed;
maxspeed = 10 - who->p_damage/10;
if (who->p_speed > maxspeed && who->p_desspeed > maxspeed)
who->p_desspeed = maxspeed;
if (who->p_flags & PFENG)
who->p_desspeed = 0;
if (who->p_desspeed > who->p_speed) {
who->p_subspeed += who->p_ship.s_accint * PACCELRATE;
}
if (who->p_desspeed < who->p_speed) {
who->p_subspeed -= who->p_ship.s_decint * PACCELRATE;
}
if (who->p_subspeed / 1000) {
who->p_speed += who->p_subspeed / 1000;
who->p_subspeed /= 1000;
if (who->p_speed < 0)
who->p_speed = 0;
if (who->p_speed > who->p_ship.s_maxspeed)
who->p_speed = who->p_ship.s_maxspeed;
}
}
charge_speed(who)
register struct player *who;
{
who->p_fuel -= who->p_ship.s_warpcost * who->p_speed * PFUELRATE;
who->p_etemp += who->p_speed * PFUELRATE;
}
changedir(sp)
struct player *sp;
{
int ticks;
if (sp->p_speed == 0) {
sp->p_dir = sp->p_desdir;
sp->p_subdir = 0;
}
else {
sp->p_subdir += (sp->p_ship.s_turns * PTURNRATE) / (1 << sp->p_speed);
ticks = sp->p_subdir / 1000;
if (ticks) {
if (ticks > dirdiff(sp->p_dir, sp->p_desdir))
sp->p_dir = sp->p_desdir;
else if ((unsigned char) (sp->p_dir - sp->p_desdir) > 127)
sp->p_dir += ticks;
else
sp->p_dir -= ticks;
sp->p_subdir %= 1000;
}
}
}
dirdiff(a, b)
unsigned char a, b;
{
unsigned char diff = ABS(a - b);
return(diff > 128 ? 256 - diff : diff);
}