A few cleanups.

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3399 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
Meep-Eep
2009-12-07 21:56:24 +00:00
parent 6e83a1df99
commit 7334ca7eea
2 changed files with 450 additions and 434 deletions
+224 -229
View File
@@ -56,7 +56,8 @@ MoveSIS (SIZE *pdx, SIZE *pdy)
SIZE new_dx, new_dy; SIZE new_dx, new_dy;
new_dx = *pdx; new_dx = *pdx;
if ((GLOBAL_SIS (log_x) -= new_dx) < 0) GLOBAL_SIS (log_x) -= new_dx;
if (GLOBAL_SIS (log_x) < 0)
{ {
new_dx += (SIZE)GLOBAL_SIS (log_x); new_dx += (SIZE)GLOBAL_SIS (log_x);
GLOBAL_SIS (log_x) = 0; GLOBAL_SIS (log_x) = 0;
@@ -68,7 +69,8 @@ MoveSIS (SIZE *pdx, SIZE *pdy)
} }
new_dy = *pdy; new_dy = *pdy;
if ((GLOBAL_SIS (log_y) -= new_dy) < 0) GLOBAL_SIS (log_y) -= new_dy;
if (GLOBAL_SIS (log_y) < 0)
{ {
new_dy += (SIZE)GLOBAL_SIS (log_y); new_dy += (SIZE)GLOBAL_SIS (log_y);
GLOBAL_SIS (log_y) = 0; GLOBAL_SIS (log_y) = 0;
@@ -106,8 +108,7 @@ MoveSIS (SIZE *pdx, SIZE *pdy)
} }
} }
if (GLOBAL_SIS (FuelOnBoard) if (GLOBAL_SIS (FuelOnBoard) && GET_GAME_STATE (ARILOU_SPACE_SIDE) <= 1)
&& GET_GAME_STATE (ARILOU_SPACE_SIDE) <= 1)
{ {
COUNT cur_fuel_ticks; COUNT cur_fuel_ticks;
COUNT hyper_dist; COUNT hyper_dist;
@@ -303,7 +304,9 @@ LoadHyperData (void)
BOOLEAN BOOLEAN
LoadHyperspace (void) LoadHyperspace (void)
{ {
hyper_dx = hyper_dy = hyper_extra = 0; hyper_dx = 0;
hyper_dy = 0;
hyper_extra = 0;
fuel_ticks = 1; fuel_ticks = 1;
GLOBAL (ShipStamp.origin.x) = -MAX_X_UNIVERSE; GLOBAL (ShipStamp.origin.x) = -MAX_X_UNIVERSE;
@@ -357,7 +360,7 @@ LoadHyperspace (void)
ClearSISRect (CLEAR_SIS_RADAR); ClearSISRect (CLEAR_SIS_RADAR);
return (TRUE); return TRUE;
} }
BOOLEAN BOOLEAN
@@ -372,7 +375,7 @@ FreeHyperspace (void)
} }
// FreeHyperData (); // FreeHyperData ();
return (TRUE); return TRUE;
} }
static void static void
@@ -429,35 +432,15 @@ typedef enum
} TRANSITION_TYPE; } TRANSITION_TYPE;
static void static void
unhyper_transition (ELEMENT *ElementPtr) InterplanetaryTransition (ELEMENT *ElementPtr)
{ {
COUNT frame_index;
ElementPtr->state_flags |= CHANGING;
frame_index = GetFrameIndex (ElementPtr->current.image.frame);
if (frame_index == 0)
frame_index += ANGLE_TO_FACING (FULL_CIRCLE);
else if (frame_index < ANGLE_TO_FACING (FULL_CIRCLE))
frame_index = NORMALIZE_FACING (frame_index + 1);
else if (++frame_index == GetFrameCount (ElementPtr->current.image.frame))
{
cleanup_hyperspace ();
GLOBAL (CurrentActivity) &= ~IN_BATTLE;
switch ((TRANSITION_TYPE) ElementPtr->turn_wait)
{
case RANDOM_ENCOUNTER_TRANSITION:
SaveSisHyperState ();
GLOBAL (CurrentActivity) |= START_ENCOUNTER;
break;
case INTERPLANETARY_TRANSITION:
GLOBAL (ip_planet) = 0; GLOBAL (ip_planet) = 0;
GLOBAL (in_orbit) = 0; GLOBAL (in_orbit) = 0;
GLOBAL (ShipFacing) = 0; /* Not reentering the system */ GLOBAL (ShipFacing) = 0; /* Not reentering the system */
SET_GAME_STATE (USED_BROADCASTER, 0); SET_GAME_STATE (USED_BROADCASTER, 0);
if (GET_GAME_STATE (ARILOU_SPACE_SIDE) <= 1) if (GET_GAME_STATE (ARILOU_SPACE_SIDE) <= 1)
{ {
// Enter a solar system from HyperSpace.
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
SET_GAME_STATE (ESCAPE_COUNTER, 0); SET_GAME_STATE (ESCAPE_COUNTER, 0);
} }
@@ -473,46 +456,31 @@ unhyper_transition (ELEMENT *ElementPtr)
if (CurStarDescPtr->star_pt.x == ARILOU_HOME_X if (CurStarDescPtr->star_pt.x == ARILOU_HOME_X
&& CurStarDescPtr->star_pt.y == ARILOU_HOME_Y) && CurStarDescPtr->star_pt.y == ARILOU_HOME_Y)
{ {
// Meet the Arilou.
GLOBAL (CurrentActivity) |= START_ENCOUNTER; GLOBAL (CurrentActivity) |= START_ENCOUNTER;
} }
else else
{ {
// Transition from QuasiSpace to HyperSpace through
// one of the permanent portals.
COUNT index; COUNT index;
POINT portal_pt[] = const POINT portal_pt[] = QUASISPACE_PORTALS_HYPERSPACE_ENDPOINTS;
{
{4091, 7748},
{3184, 4906},
{9211, 6104},
{5673, 1207},
{1910, 926},
{8607, 151},
{ 50, 1647},
{6117, 4131},
{5658, 9712},
{2302, 3988},
{ 112, 9409},
{7752, 8906},
{ 368, 6332},
{9735, 3153},
{5850, 6213},
};
index = CurStarDescPtr index = CurStarDescPtr - &star_array[NUM_SOLAR_SYSTEMS + 1];
- &star_array[NUM_SOLAR_SYSTEMS + 1]; GLOBAL_SIS (log_x) = UNIVERSE_TO_LOGX (portal_pt[index].x);
GLOBAL_SIS (log_x) = GLOBAL_SIS (log_y) = UNIVERSE_TO_LOGY (portal_pt[index].y);
UNIVERSE_TO_LOGX (portal_pt[index].x);
GLOBAL_SIS (log_y) =
UNIVERSE_TO_LOGY (portal_pt[index].y);
SET_GAME_STATE (ARILOU_SPACE_SIDE, 0); SET_GAME_STATE (ARILOU_SPACE_SIDE, 0);
} }
} }
break; }
case ARILOU_SPACE_TRANSITION:
/* Enter QuasiSpace from HyperSpace by any portal, /* Enter QuasiSpace from HyperSpace by any portal, or HyperSpace from
* or HyperSpace from QuasiSpace through the periodically * QuasiSpace through the periodically opening portal.
* opening portal.
*/ */
static void
ArilouSpaceTransition (void)
{
GLOBAL (ShipFacing) = 0; /* Not reentering the system */ GLOBAL (ShipFacing) = 0; /* Not reentering the system */
SET_GAME_STATE (USED_BROADCASTER, 0); SET_GAME_STATE (USED_BROADCASTER, 0);
GLOBAL (autopilot.x) = ~0; GLOBAL (autopilot.x) = ~0;
@@ -536,12 +504,42 @@ unhyper_transition (ELEMENT *ElementPtr)
} }
else else
{ {
// From QuasiSpace to HyperSpace through the // From QuasiSpace to HyperSpace through the periodically appearing
// periodically appearing portal. // portal.
GLOBAL_SIS (log_x) = UNIVERSE_TO_LOGX (ARILOU_SPACE_X); GLOBAL_SIS (log_x) = UNIVERSE_TO_LOGX (ARILOU_SPACE_X);
GLOBAL_SIS (log_y) = UNIVERSE_TO_LOGY (ARILOU_SPACE_Y); GLOBAL_SIS (log_y) = UNIVERSE_TO_LOGY (ARILOU_SPACE_Y);
SET_GAME_STATE (ARILOU_SPACE_SIDE, 0); SET_GAME_STATE (ARILOU_SPACE_SIDE, 0);
} }
}
static void
unhyper_transition (ELEMENT *ElementPtr)
{
COUNT frame_index;
ElementPtr->state_flags |= CHANGING;
frame_index = GetFrameIndex (ElementPtr->current.image.frame);
if (frame_index == 0)
frame_index += ANGLE_TO_FACING (FULL_CIRCLE);
else if (frame_index < ANGLE_TO_FACING (FULL_CIRCLE))
frame_index = NORMALIZE_FACING (frame_index + 1);
else if (++frame_index == GetFrameCount (ElementPtr->current.image.frame))
{
cleanup_hyperspace ();
GLOBAL (CurrentActivity) &= ~IN_BATTLE;
switch ((TRANSITION_TYPE) ElementPtr->turn_wait)
{
case RANDOM_ENCOUNTER_TRANSITION:
SaveSisHyperState ();
GLOBAL (CurrentActivity) |= START_ENCOUNTER;
break;
case INTERPLANETARY_TRANSITION:
InterplanetaryTransition (ElementPtr);
break;
case ARILOU_SPACE_TRANSITION:
ArilouSpaceTransition ();
break; break;
} }
@@ -557,7 +555,8 @@ static void
init_transition (ELEMENT *ElementPtr0, ELEMENT *ElementPtr1, init_transition (ELEMENT *ElementPtr0, ELEMENT *ElementPtr1,
TRANSITION_TYPE which_transition) TRANSITION_TYPE which_transition)
{ {
SIZE dx, dy, num_turns; SIZE dx, dy;
SIZE num_turns;
STARSHIP *StarShipPtr; STARSHIP *StarShipPtr;
dx = WORLD_TO_VELOCITY (ElementPtr0->next.location.x dx = WORLD_TO_VELOCITY (ElementPtr0->next.location.x
@@ -571,10 +570,11 @@ init_transition (ELEMENT *ElementPtr0, ELEMENT *ElementPtr1,
ElementPtr1->turn_wait = (BYTE) which_transition; ElementPtr1->turn_wait = (BYTE) which_transition;
GetElementStarShip (ElementPtr1, &StarShipPtr); GetElementStarShip (ElementPtr1, &StarShipPtr);
if ((num_turns = GetFrameCount (ElementPtr1->next.image.frame) num_turns = GetFrameCount (ElementPtr1->next.image.frame)
- ANGLE_TO_FACING (FULL_CIRCLE) - ANGLE_TO_FACING (FULL_CIRCLE)
+ NORMALIZE_FACING (ANGLE_TO_FACING (FULL_CIRCLE) + NORMALIZE_FACING (ANGLE_TO_FACING (FULL_CIRCLE)
- StarShipPtr->ShipFacing)) == 0) - StarShipPtr->ShipFacing);
if (num_turns == 0)
num_turns = 1; num_turns = 1;
SetVelocityComponents (&ElementPtr1->velocity, SetVelocityComponents (&ElementPtr1->velocity,
@@ -595,13 +595,12 @@ hyper_transition (ELEMENT *ElementPtr)
ElementPtr->state_flags |= DEFY_PHYSICS; ElementPtr->state_flags |= DEFY_PHYSICS;
return (FALSE); return FALSE;
} }
else else
{ {
ElementPtr->preprocess_func = ElementPtr->preprocess_func =
(void (*) (struct element (void (*) (struct element *ElementPtr)) hyper_transition;
*ElementPtr))hyper_transition;
ElementPtr->postprocess_func = NULL; ElementPtr->postprocess_func = NULL;
ElementPtr->state_flags |= NONSOLID; ElementPtr->state_flags |= NONSOLID;
ElementPtr->next.image.frame = ElementPtr->next.image.frame =
@@ -646,7 +645,7 @@ hyper_transition (ELEMENT *ElementPtr)
} }
} }
return (TRUE); return TRUE;
} }
static void static void
@@ -735,7 +734,8 @@ arilou_space_collision (ELEMENT *ElementPtr0,
} }
else else
{ {
init_transition (ElementPtr0, ElementPtr1, ARILOU_SPACE_TRANSITION); init_transition (ElementPtr0, ElementPtr1,
ARILOU_SPACE_TRANSITION);
} }
} }
@@ -764,24 +764,23 @@ AllocHyperElement (STAR_DESC *SDPtr)
long lx, ly; long lx, ly;
lx = UNIVERSE_TO_LOGX (SDPtr->star_pt.x) lx = UNIVERSE_TO_LOGX (SDPtr->star_pt.x)
+ (LOG_SPACE_WIDTH >> 1) + (LOG_SPACE_WIDTH >> 1) - GLOBAL_SIS (log_x);
- GLOBAL_SIS (log_x);
HyperSpaceElementPtr->current.location.x = WRAP_X (lx); HyperSpaceElementPtr->current.location.x = WRAP_X (lx);
ly = UNIVERSE_TO_LOGY (SDPtr->star_pt.y) ly = UNIVERSE_TO_LOGY (SDPtr->star_pt.y)
+ (LOG_SPACE_HEIGHT >> 1) + (LOG_SPACE_HEIGHT >> 1) - GLOBAL_SIS (log_y);
- GLOBAL_SIS (log_y);
HyperSpaceElementPtr->current.location.y = WRAP_Y (ly); HyperSpaceElementPtr->current.location.y = WRAP_Y (ly);
} }
SetPrimType (&DisplayArray[HyperSpaceElementPtr->PrimIndex], STAMP_PRIM); SetPrimType (&DisplayArray[HyperSpaceElementPtr->PrimIndex],
STAMP_PRIM);
HyperSpaceElementPtr->current.image.farray = HyperSpaceElementPtr->current.image.farray =
&hyperstars[1 + (GET_GAME_STATE (ARILOU_SPACE_SIDE) >> 1)]; &hyperstars[1 + (GET_GAME_STATE (ARILOU_SPACE_SIDE) >> 1)];
UnlockElement (hHyperSpaceElement); UnlockElement (hHyperSpaceElement);
} }
return (hHyperSpaceElement); return hHyperSpaceElement;
} }
static void static void
@@ -800,7 +799,8 @@ AddAmbientElement (void)
HyperSpaceElementPtr->playerNr = NEUTRAL_PLAYER_NUM; HyperSpaceElementPtr->playerNr = NEUTRAL_PLAYER_NUM;
HyperSpaceElementPtr->state_flags = HyperSpaceElementPtr->state_flags =
APPEARING | FINITE_LIFE | NONSOLID; APPEARING | FINITE_LIFE | NONSOLID;
SetPrimType (&DisplayArray[HyperSpaceElementPtr->PrimIndex], STAMP_PRIM); SetPrimType (&DisplayArray[HyperSpaceElementPtr->PrimIndex],
STAMP_PRIM);
HyperSpaceElementPtr->preprocess_func = animation_preprocess; HyperSpaceElementPtr->preprocess_func = animation_preprocess;
rand_val = TFB_Random (); rand_val = TFB_Random ();
@@ -896,11 +896,12 @@ static void
encounter_collision (ELEMENT *ElementPtr0, POINT *pPt0, encounter_collision (ELEMENT *ElementPtr0, POINT *pPt0,
ELEMENT *ElementPtr1, POINT *pPt1) ELEMENT *ElementPtr1, POINT *pPt1)
{ {
HENCOUNTER hEncounter;
HENCOUNTER hNextEncounter;
if ((ElementPtr1->state_flags & PLAYER_SHIP) if (!(ElementPtr1->state_flags & PLAYER_SHIP)
&& (GLOBAL (CurrentActivity) & IN_BATTLE)) || !(GLOBAL (CurrentActivity) & IN_BATTLE))
{ return;
HENCOUNTER hEncounter, hNextEncounter;
init_transition (ElementPtr0, ElementPtr1, RANDOM_ENCOUNTER_TRANSITION); init_transition (ElementPtr0, ElementPtr1, RANDOM_ENCOUNTER_TRANSITION);
@@ -916,9 +917,7 @@ encounter_collision (ELEMENT *ElementPtr0, POINT *pPt0,
ELEMENT *ElementPtr; ELEMENT *ElementPtr;
LockElement (EncounterPtr->hElement, &ElementPtr); LockElement (EncounterPtr->hElement, &ElementPtr);
ElementPtr->state_flags |= NONSOLID | IGNORE_SIMILAR; ElementPtr->state_flags |= NONSOLID | IGNORE_SIMILAR;
UnlockElement (EncounterPtr->hElement); UnlockElement (EncounterPtr->hElement);
} }
UnlockEncounter (hEncounter); UnlockEncounter (hEncounter);
@@ -929,7 +928,7 @@ encounter_collision (ELEMENT *ElementPtr0, POINT *pPt0,
// but that would be too hacky ;) // but that would be too hacky ;)
ElementPtr0->hTarget = getSisElement (); ElementPtr0->hTarget = getSisElement ();
ZeroVelocityComponents (&ElementPtr0->velocity); ZeroVelocityComponents (&ElementPtr0->velocity);
}
(void) pPt0; /* Satisfying compiler (unused parameter) */ (void) pPt0; /* Satisfying compiler (unused parameter) */
(void) pPt1; /* Satisfying compiler (unused parameter) */ (void) pPt1; /* Satisfying compiler (unused parameter) */
} }
@@ -941,9 +940,8 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
HELEMENT hElement; HELEMENT hElement;
STAR_DESC SD; STAR_DESC SD;
if (GET_GAME_STATE (ARILOU_SPACE_SIDE) >= 2) if (GET_GAME_STATE (ARILOU_SPACE_SIDE) >= 2)
return (0); return 0;
if (EncounterPtr->SD.Index & ENCOUNTER_REFORMING) if (EncounterPtr->SD.Index & ENCOUNTER_REFORMING)
{ {
@@ -952,7 +950,7 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
EncounterPtr->transition_state = 100; EncounterPtr->transition_state = 100;
if ((EncounterPtr->SD.Index & ONE_SHOT_ENCOUNTER) if ((EncounterPtr->SD.Index & ONE_SHOT_ENCOUNTER)
|| LONIBBLE (EncounterPtr->SD.Index) == 0) || LONIBBLE (EncounterPtr->SD.Index) == 0)
return (0); return 0;
} }
if (LONIBBLE (EncounterPtr->SD.Index)) if (LONIBBLE (EncounterPtr->SD.Index))
@@ -964,7 +962,8 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
{ {
BYTE Type; BYTE Type;
SIZE dx, dy; SIZE dx, dy;
COUNT i, NumShips; COUNT i;
COUNT NumShips;
DWORD radius_squared; DWORD radius_squared;
BYTE EncounterMakeup[] = BYTE EncounterMakeup[] =
{ {
@@ -987,16 +986,15 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
NumShips = MAX_HYPER_SHIPS; NumShips = MAX_HYPER_SHIPS;
EncounterPtr->SD.Index = MAKE_BYTE ( EncounterPtr->SD.Index =
NumShips, HINIBBLE (EncounterPtr->SD.Index)); MAKE_BYTE (NumShips, HINIBBLE (EncounterPtr->SD.Index));
for (i = 0; i < NumShips; ++i) for (i = 0; i < NumShips; ++i)
{ {
HFLEETINFO hStarShip;
FLEET_INFO *FleetPtr;
BRIEF_SHIP_INFO *BSIPtr = &EncounterPtr->ShipList[i]; BRIEF_SHIP_INFO *BSIPtr = &EncounterPtr->ShipList[i];
HFLEETINFO hStarShip =
hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), Type); GetStarShipFromIndex (&GLOBAL (avail_race_q), Type);
FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); FLEET_INFO *FleetPtr =
LockFleetInfo (&GLOBAL (avail_race_q), hStarShip);
BSIPtr->race_id = Type; BSIPtr->race_id = Type;
BSIPtr->crew_level = FleetPtr->crew_level; BSIPtr->crew_level = FleetPtr->crew_level;
BSIPtr->max_crew = FleetPtr->max_crew; BSIPtr->max_crew = FleetPtr->max_crew;
@@ -1004,7 +1002,6 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip);
} }
do do
{ {
DWORD rand_val; DWORD rand_val;
@@ -1041,7 +1038,8 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
LockElement (hElement, &ElementPtr); LockElement (hElement, &ElementPtr);
if ((i = EncounterPtr->transition_state) || NewEncounter) i = EncounterPtr->transition_state;
if (i || NewEncounter)
{ {
if (i < 0) if (i < 0)
{ {
@@ -1078,14 +1076,14 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
InsertElement (hElement, GetTailElement ()); InsertElement (hElement, GetTailElement ());
} }
return (EncounterPtr->hElement = hElement); EncounterPtr->hElement = hElement;
return hElement;
} }
#define GRID_OFFSET 200 #define GRID_OFFSET 200
static void static void
DrawHyperGrid (COORD ux, COORD uy, COORD ox, DrawHyperGrid (COORD ux, COORD uy, COORD ox, COORD oy)
COORD oy)
{ {
COORD sx, sy, ex, ey; COORD sx, sy, ex, ey;
RECT r; RECT r;
@@ -1094,18 +1092,22 @@ DrawHyperGrid (COORD ux, COORD uy, COORD ox,
SetContextForeGroundColor ( SetContextForeGroundColor (
BUILD_COLOR (MAKE_RGB15 (0x00, 0x10, 0x00), 0x6B)); BUILD_COLOR (MAKE_RGB15 (0x00, 0x10, 0x00), 0x6B));
if ((sx = ux - (RADAR_SCAN_WIDTH >> 1)) < 0) sx = ux - (RADAR_SCAN_WIDTH >> 1);
if (sx < 0)
sx = 0; sx = 0;
else else
sx -= sx % GRID_OFFSET; sx -= sx % GRID_OFFSET;
if ((ex = ux + (RADAR_SCAN_WIDTH >> 1)) > MAX_X_UNIVERSE + 1) ex = ux + (RADAR_SCAN_WIDTH >> 1);
if (ex > MAX_X_UNIVERSE + 1)
ex = MAX_X_UNIVERSE + 1; ex = MAX_X_UNIVERSE + 1;
if ((sy = uy - (RADAR_SCAN_HEIGHT >> 1)) < 0) sy = uy - (RADAR_SCAN_HEIGHT >> 1);
if (sy < 0)
sy = 0; sy = 0;
else else
sy -= sy % GRID_OFFSET; sy -= sy % GRID_OFFSET;
if ((ey = uy + (RADAR_SCAN_HEIGHT >> 1)) > MAX_Y_UNIVERSE + 1) ey = uy + (RADAR_SCAN_HEIGHT >> 1);
if (ey > MAX_Y_UNIVERSE + 1)
ey = MAX_Y_UNIVERSE + 1; ey = MAX_Y_UNIVERSE + 1;
r.corner.y = (COORD) ((long)(MAX_Y_UNIVERSE - ey) r.corner.y = (COORD) ((long)(MAX_Y_UNIVERSE - ey)
@@ -1115,75 +1117,53 @@ DrawHyperGrid (COORD ux, COORD uy, COORD ox,
* RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - oy) - r.corner.y + 1; * RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - oy) - r.corner.y + 1;
for (ux = sx; ux <= ex; ux += GRID_OFFSET) for (ux = sx; ux <= ex; ux += GRID_OFFSET)
{ {
r.corner.x = (COORD) ((long)ux r.corner.x = (COORD) ((long)ux * RADAR_WIDTH / RADAR_SCAN_WIDTH) - ox;
* RADAR_WIDTH / RADAR_SCAN_WIDTH) - ox;
DrawFilledRectangle (&r); DrawFilledRectangle (&r);
} while ((ux += GRID_OFFSET) < ex); }
r.corner.x = (COORD) ((long)sx * RADAR_WIDTH / RADAR_SCAN_WIDTH) - ox; r.corner.x = (COORD) ((long)sx * RADAR_WIDTH / RADAR_SCAN_WIDTH) - ox;
r.extent.width = ((COORD) ((long)ex r.extent.width = ((COORD) ((long)ex * RADAR_WIDTH / RADAR_SCAN_WIDTH)
* RADAR_WIDTH / RADAR_SCAN_WIDTH) - ox) - ox) - r.corner.x + 1;
- r.corner.x + 1;
r.extent.height = 1; r.extent.height = 1;
for (uy = sy; uy <= ey; uy += GRID_OFFSET) for (uy = sy; uy <= ey; uy += GRID_OFFSET)
{ {
r.corner.y = (COORD)((long)(MAX_Y_UNIVERSE - uy) r.corner.y = (COORD)((long)(MAX_Y_UNIVERSE - uy)
* RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - oy; * RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - oy;
DrawFilledRectangle (&r); DrawFilledRectangle (&r);
} while ((uy += GRID_OFFSET) < ey); }
} }
// Returns false iff the encounter is to be removed.
static void static bool
ProcessEncounters (POINT *puniverse, COORD ox, COORD oy) ProcessEncounter (ENCOUNTER *EncounterPtr, POINT *puniverse,
COORD ox, COORD oy, STAMP *stamp)
{ {
STAMP s; ELEMENT *ElementPtr;
HENCOUNTER hEncounter, hNextEncounter;
s.frame = SetAbsFrameIndex (stars_in_space, 91);
for (hEncounter = GetHeadEncounter ();
hEncounter; hEncounter = hNextEncounter)
{
COORD ex, ey; COORD ex, ey;
ENCOUNTER *EncounterPtr;
LockEncounter (hEncounter, &EncounterPtr);
hNextEncounter = GetSuccEncounter (EncounterPtr);
if (EncounterPtr->hElement == 0 if (EncounterPtr->hElement == 0
&& AddEncounterElement (EncounterPtr, puniverse) == 0) && AddEncounterElement (EncounterPtr, puniverse) == 0)
{ return false;
DeleteEncounter:
UnlockEncounter (hEncounter);
RemoveEncounter (hEncounter);
FreeEncounter (hEncounter);
continue;
}
{
ELEMENT *ElementPtr;
LockElement (EncounterPtr->hElement, &ElementPtr); LockElement (EncounterPtr->hElement, &ElementPtr);
if (ElementPtr->death_func) if (ElementPtr->death_func)
{ {
if (EncounterPtr->transition_state if (EncounterPtr->transition_state && ElementPtr->turn_wait == 0)
&& ElementPtr->turn_wait == 0)
{ {
--EncounterPtr->transition_state; --EncounterPtr->transition_state;
if (EncounterPtr->transition_state >= if (EncounterPtr->transition_state >= NUM_VORTEX_TRANSITIONS)
NUM_VORTEX_TRANSITIONS)
++ElementPtr->turn_wait; ++ElementPtr->turn_wait;
else if (EncounterPtr->transition_state == else if (EncounterPtr->transition_state ==
-NUM_VORTEX_TRANSITIONS) -NUM_VORTEX_TRANSITIONS)
{ {
ElementPtr->death_func = NULL; ElementPtr->death_func = NULL;
UnlockElement (EncounterPtr->hElement); UnlockElement (EncounterPtr->hElement);
goto DeleteEncounter; return false;
} }
else else
SetPrimType (&DisplayArray[ElementPtr->PrimIndex], STAMP_PRIM); SetPrimType (&DisplayArray[ElementPtr->PrimIndex],
STAMP_PRIM);
} }
} }
else else
@@ -1203,38 +1183,35 @@ DeleteEncounter:
cur_facing = ANGLE_TO_FACING ( cur_facing = ANGLE_TO_FACING (
GetVelocityTravelAngle (&ElementPtr->velocity)); GetVelocityTravelAngle (&ElementPtr->velocity));
delta_facing = NORMALIZE_FACING (cur_facing delta_facing = NORMALIZE_FACING (cur_facing - ANGLE_TO_FACING (
- ANGLE_TO_FACING (ARCTAN ( ARCTAN (puniverse->x - EncounterPtr->SD.star_pt.x,
puniverse->x - EncounterPtr->SD.star_pt.x,
puniverse->y - EncounterPtr->SD.star_pt.y))); puniverse->y - EncounterPtr->SD.star_pt.y)));
if (delta_facing || (delta_x == 0 && delta_y == 0)) if (delta_facing || (delta_x == 0 && delta_y == 0))
{ {
SIZE s, RaceHyperSpeed[] = SIZE speed;
const SIZE RaceHyperSpeed[] =
{ {
RACE_HYPER_SPEED RACE_HYPER_SPEED
}; };
#define ENCOUNTER_TRACK_WAIT 3 #define ENCOUNTER_TRACK_WAIT 3
s = RaceHyperSpeed[EncounterPtr->SD.Type]; speed = RaceHyperSpeed[EncounterPtr->SD.Type];
if (delta_facing < ANGLE_TO_FACING (HALF_CIRCLE)) if (delta_facing < ANGLE_TO_FACING (HALF_CIRCLE))
--cur_facing; --cur_facing;
else else
++cur_facing; ++cur_facing;
if (NORMALIZE_FACING (delta_facing if (NORMALIZE_FACING (delta_facing + ANGLE_TO_FACING (OCTANT))
+ ANGLE_TO_FACING (OCTANT)) > ANGLE_TO_FACING (QUADRANT)) > ANGLE_TO_FACING (QUADRANT))
{ {
if (delta_facing < ANGLE_TO_FACING (HALF_CIRCLE)) if (delta_facing < ANGLE_TO_FACING (HALF_CIRCLE))
--cur_facing; --cur_facing;
else else
++cur_facing; ++cur_facing;
s >>= 1; speed >>= 1;
} }
cur_facing = FACING_TO_ANGLE (cur_facing); cur_facing = FACING_TO_ANGLE (cur_facing);
SetVelocityComponents ( SetVelocityComponents (&ElementPtr->velocity,
&ElementPtr->velocity, COSINE (cur_facing, speed), SINE (cur_facing, speed));
COSINE (cur_facing, s),
SINE (cur_facing, s)
);
GetNextVelocityComponents (&ElementPtr->velocity, GetNextVelocityComponents (&ElementPtr->velocity,
&delta_x, &delta_y, 1); &delta_x, &delta_y, 1);
@@ -1243,17 +1220,15 @@ DeleteEncounter:
} }
EncounterPtr->log_x += delta_x; EncounterPtr->log_x += delta_x;
EncounterPtr->log_y -= delta_y; EncounterPtr->log_y -= delta_y;
EncounterPtr->SD.star_pt.x = EncounterPtr->SD.star_pt.x = LOGX_TO_UNIVERSE (EncounterPtr->log_x);
LOGX_TO_UNIVERSE (EncounterPtr->log_x); EncounterPtr->SD.star_pt.y = LOGY_TO_UNIVERSE (EncounterPtr->log_y);
EncounterPtr->SD.star_pt.y =
LOGY_TO_UNIVERSE (EncounterPtr->log_y);
encounter_radius = EncounterPtr->radius + (GRID_OFFSET >> 1); encounter_radius = EncounterPtr->radius + (GRID_OFFSET >> 1);
if ((delta_x = EncounterPtr->SD.star_pt.x delta_x = EncounterPtr->SD.star_pt.x - EncounterPtr->origin.x;
- EncounterPtr->origin.x) < 0) if (delta_x < 0)
delta_x = -delta_x; delta_x = -delta_x;
if ((delta_y = EncounterPtr->SD.star_pt.y delta_y = EncounterPtr->SD.star_pt.y - EncounterPtr->origin.y;
- EncounterPtr->origin.y) < 0) if (delta_y < 0)
delta_y = -delta_y; delta_y = -delta_y;
if ((COUNT)delta_x >= encounter_radius if ((COUNT)delta_x >= encounter_radius
|| (COUNT)delta_y >= encounter_radius || (COUNT)delta_y >= encounter_radius
@@ -1273,7 +1248,7 @@ DeleteEncounter:
{ {
ElementPtr->death_func = NULL; ElementPtr->death_func = NULL;
UnlockElement (EncounterPtr->hElement); UnlockElement (EncounterPtr->hElement);
goto DeleteEncounter; return false;
} }
} }
} }
@@ -1285,18 +1260,18 @@ DeleteEncounter:
&& ey - puniverse->y >= -UNIT_SCREEN_HEIGHT && ey - puniverse->y >= -UNIT_SCREEN_HEIGHT
&& ey - puniverse->y <= UNIT_SCREEN_HEIGHT) && ey - puniverse->y <= UNIT_SCREEN_HEIGHT)
{ {
ElementPtr->next.location.x = (SIZE)( ElementPtr->next.location.x =
EncounterPtr->log_x - GLOBAL_SIS (log_x) (SIZE)(EncounterPtr->log_x - GLOBAL_SIS (log_x))
) + (LOG_SPACE_WIDTH >> 1); + (LOG_SPACE_WIDTH >> 1);
ElementPtr->next.location.y = (SIZE)( ElementPtr->next.location.y =
EncounterPtr->log_y - GLOBAL_SIS (log_y) (SIZE)(EncounterPtr->log_y - GLOBAL_SIS (log_y))
) + (LOG_SPACE_HEIGHT >> 1); + (LOG_SPACE_HEIGHT >> 1);
if ((ElementPtr->state_flags & NONSOLID) if ((ElementPtr->state_flags & NONSOLID)
&& EncounterPtr->transition_state == 0) && EncounterPtr->transition_state == 0)
{ {
ElementPtr->current.location = ElementPtr->current.location = ElementPtr->next.location;
ElementPtr->next.location; SetPrimType (&DisplayArray[ElementPtr->PrimIndex],
SetPrimType (&DisplayArray[ElementPtr->PrimIndex], STAMP_PRIM); STAMP_PRIM);
if (ElementPtr->death_func == 0) if (ElementPtr->death_func == 0)
{ {
InitIntersectStartPoint (ElementPtr); InitIntersectStartPoint (ElementPtr);
@@ -1307,29 +1282,50 @@ DeleteEncounter:
else else
{ {
ElementPtr->state_flags |= NONSOLID; ElementPtr->state_flags |= NONSOLID;
if (ex - puniverse->x < -XOFFS if (ex - puniverse->x < -XOFFS || ex - puniverse->x > XOFFS
|| ex - puniverse->x > XOFFS || ey - puniverse->y < -YOFFS || ey - puniverse->y > YOFFS)
|| ey - puniverse->y < -YOFFS
|| ey - puniverse->y > YOFFS)
{ {
ElementPtr->life_span = 0; ElementPtr->life_span = 0;
ElementPtr->death_func = NULL; ElementPtr->death_func = NULL;
UnlockElement (EncounterPtr->hElement); UnlockElement (EncounterPtr->hElement);
return false;
goto DeleteEncounter;
} }
SetPrimType (&DisplayArray[ElementPtr->PrimIndex], NO_PRIM); SetPrimType (&DisplayArray[ElementPtr->PrimIndex], NO_PRIM);
} }
UnlockElement (EncounterPtr->hElement); UnlockElement (EncounterPtr->hElement);
}
s.origin.x = (COORD)((long)ex * RADAR_WIDTH stamp->origin.x = (COORD)((long)ex * RADAR_WIDTH / RADAR_SCAN_WIDTH) - ox;
/ RADAR_SCAN_WIDTH) - ox; stamp->origin.y = (COORD)((long)(MAX_Y_UNIVERSE - ey) * RADAR_HEIGHT
s.origin.y = (COORD)((long)(MAX_Y_UNIVERSE - ey) * RADAR_HEIGHT
/ RADAR_SCAN_HEIGHT) - oy; / RADAR_SCAN_HEIGHT) - oy;
DrawStamp (&s); DrawStamp (stamp);
return true;
}
static void
ProcessEncounters (POINT *puniverse, COORD ox, COORD oy)
{
STAMP stamp;
HENCOUNTER hEncounter, hNextEncounter;
stamp.frame = SetAbsFrameIndex (stars_in_space, 91);
for (hEncounter = GetHeadEncounter ();
hEncounter; hEncounter = hNextEncounter)
{
ENCOUNTER *EncounterPtr;
LockEncounter (hEncounter, &EncounterPtr);
hNextEncounter = GetSuccEncounter (EncounterPtr);
if (!ProcessEncounter (EncounterPtr, puniverse, ox, oy, &stamp))
{
UnlockEncounter (hEncounter);
RemoveEncounter (hEncounter);
FreeEncounter (hEncounter);
continue;
}
UnlockEncounter (hEncounter); UnlockEncounter (hEncounter);
} }
@@ -1356,20 +1352,15 @@ SeedUniverse (void)
SetContext (RadarContext); SetContext (RadarContext);
BatchGraphics (); BatchGraphics ();
ox = (COORD)((long)universe.x ox = (COORD)((long)universe.x * RADAR_WIDTH / RADAR_SCAN_WIDTH)
* RADAR_WIDTH / RADAR_SCAN_WIDTH)
- (RADAR_WIDTH >> 1); - (RADAR_WIDTH >> 1);
oy = (COORD)((long)(MAX_Y_UNIVERSE - universe.y) oy = (COORD)((long)(MAX_Y_UNIVERSE - universe.y)
* RADAR_HEIGHT / RADAR_SCAN_HEIGHT) * RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - (RADAR_HEIGHT >> 1);
- (RADAR_HEIGHT >> 1);
ex = (COORD)((long)GLOBAL (ShipStamp.origin.x) ex = (COORD)((long)GLOBAL (ShipStamp.origin.x)
* RADAR_WIDTH / RADAR_SCAN_WIDTH) * RADAR_WIDTH / RADAR_SCAN_WIDTH) - (RADAR_WIDTH >> 1);
- (RADAR_WIDTH >> 1); ey = (COORD)((long)(MAX_Y_UNIVERSE - GLOBAL (ShipStamp.origin.y))
ey = (COORD)((long)(MAX_Y_UNIVERSE * RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - (RADAR_HEIGHT >> 1);
- GLOBAL (ShipStamp.origin.y))
* RADAR_HEIGHT / RADAR_SCAN_HEIGHT)
- (RADAR_HEIGHT >> 1);
arilouSpaceCounter = GET_GAME_STATE (ARILOU_SPACE_COUNTER); arilouSpaceCounter = GET_GAME_STATE (ARILOU_SPACE_COUNTER);
arilouSpaceSide = GET_GAME_STATE (ARILOU_SPACE_SIDE); arilouSpaceSide = GET_GAME_STATE (ARILOU_SPACE_SIDE);
@@ -1393,8 +1384,8 @@ SeedUniverse (void)
s.origin.x = (COORD)((long)ex * RADAR_WIDTH s.origin.x = (COORD)((long)ex * RADAR_WIDTH
/ RADAR_SCAN_WIDTH) - ox; / RADAR_SCAN_WIDTH) - ox;
s.origin.y = (COORD)((long)(MAX_Y_UNIVERSE - ey) * RADAR_HEIGHT s.origin.y = (COORD)((long)(MAX_Y_UNIVERSE - ey)
/ RADAR_SCAN_HEIGHT) - oy; * RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - oy;
s.frame = SetRelFrameIndex (blip_frame, s.frame = SetRelFrameIndex (blip_frame,
star_type + 2); star_type + 2);
DrawStamp (&s); DrawStamp (&s);
@@ -1455,34 +1446,38 @@ SeedUniverse (void)
--i; --i;
sx = SD[i].star_pt.x - universe.x + XOFFS; sx = SD[i].star_pt.x - universe.x + XOFFS;
sy = SD[i].star_pt.y - universe.y + YOFFS; sy = SD[i].star_pt.y - universe.y + YOFFS;
if (sx >= 0 && sy >= 0 if (sx < 0 || sy < 0 || sx >= (XOFFS << 1) || sy >= (YOFFS << 1))
&& sx < (XOFFS << 1) && sy < (YOFFS << 1)) continue;
{
ex = SD[i].star_pt.x; ex = SD[i].star_pt.x;
ey = SD[i].star_pt.y; ey = SD[i].star_pt.y;
s.origin.x = (COORD)((long)ex * RADAR_WIDTH s.origin.x = (COORD)((long)ex * RADAR_WIDTH / RADAR_SCAN_WIDTH)
/ RADAR_SCAN_WIDTH) - ox; - ox;
s.origin.y = (COORD)((long)(MAX_Y_UNIVERSE - ey) s.origin.y = (COORD)((long)(MAX_Y_UNIVERSE - ey)
* RADAR_HEIGHT * RADAR_HEIGHT / RADAR_SCAN_HEIGHT) - oy;
/ RADAR_SCAN_HEIGHT) - oy;
s.frame = SetAbsFrameIndex (stars_in_space, 95); s.frame = SetAbsFrameIndex (stars_in_space, 95);
DrawStamp (&s); DrawStamp (&s);
if ((ex -= universe.x) < 0) ex -= universe.x;
if (ex < 0)
ex = -ex; ex = -ex;
if ((ey -= universe.y) < 0) ey -= universe.y;
if (ey < 0)
ey = -ey; ey = -ey;
if (ex <= (XOFFS / NUM_RADAR_SCREENS)
&& ey <= (YOFFS / NUM_RADAR_SCREENS) if (ex > (XOFFS / NUM_RADAR_SCREENS)
&& (hHyperSpaceElement = || ey > (YOFFS / NUM_RADAR_SCREENS))
AllocHyperElement (&SD[i])) != 0) continue;
{
hHyperSpaceElement = AllocHyperElement (&SD[i]);
if (hHyperSpaceElement == 0)
continue;
LockElement (hHyperSpaceElement, &HyperSpaceElementPtr); LockElement (hHyperSpaceElement, &HyperSpaceElementPtr);
HyperSpaceElementPtr->current.image.frame = SetAbsFrameIndex ( HyperSpaceElementPtr->current.image.frame = SetAbsFrameIndex (
hyperstars[1 + (GET_GAME_STATE (ARILOU_SPACE_SIDE) >> 1)], hyperstars[1 + (GET_GAME_STATE (ARILOU_SPACE_SIDE) >> 1)],
SD[i].Index SD[i].Index);
); HyperSpaceElementPtr->preprocess_func = NULL;
HyperSpaceElementPtr->preprocess_func =
HyperSpaceElementPtr->postprocess_func = NULL; HyperSpaceElementPtr->postprocess_func = NULL;
HyperSpaceElementPtr->collision_func = arilou_space_collision; HyperSpaceElementPtr->collision_func = arilou_space_collision;
@@ -1500,37 +1495,37 @@ SeedUniverse (void)
UnlockElement (hHyperSpaceElement); UnlockElement (hHyperSpaceElement);
InsertElement (hHyperSpaceElement, GetHeadElement ()); InsertElement (hHyperSpaceElement, GetHeadElement ());
}
}
} while (i); } while (i);
} }
{ {
SDPtr = 0; SDPtr = 0;
while ((SDPtr = FindStar (SDPtr, &universe, XOFFS, YOFFS))) while ((SDPtr = FindStar (SDPtr, &universe, XOFFS, YOFFS)))
{
ex = SDPtr->star_pt.x;
ey = SDPtr->star_pt.y;
if ((ex -= universe.x) < 0)
ex = -ex;
if ((ey -= universe.y) < 0)
ey = -ey;
if (ex <= (XOFFS / NUM_RADAR_SCREENS)
&& ey <= (YOFFS / NUM_RADAR_SCREENS)
&& (hHyperSpaceElement = AllocHyperElement (SDPtr)) != 0)
{ {
BYTE star_type; BYTE star_type;
ex = SDPtr->star_pt.x - universe.x;
if (ex < 0)
ex = -ex;
ey = SDPtr->star_pt.y - universe.y;
if (ey < 0)
ey = -ey;
if (ex > (XOFFS / NUM_RADAR_SCREENS)
|| ey > (YOFFS / NUM_RADAR_SCREENS))
continue;
hHyperSpaceElement = AllocHyperElement (SDPtr);
if (hHyperSpaceElement == 0)
continue;
star_type = SDPtr->Type; star_type = SDPtr->Type;
LockElement (hHyperSpaceElement, &HyperSpaceElementPtr); LockElement (hHyperSpaceElement, &HyperSpaceElementPtr);
HyperSpaceElementPtr->current.image.frame = SetAbsFrameIndex ( HyperSpaceElementPtr->current.image.frame = SetAbsFrameIndex (
hyperstars[1 + (GET_GAME_STATE (ARILOU_SPACE_SIDE) >> 1)], hyperstars[1 + (GET_GAME_STATE (ARILOU_SPACE_SIDE) >> 1)],
STAR_TYPE (star_type) STAR_TYPE (star_type) * NUM_STAR_COLORS
* NUM_STAR_COLORS + STAR_COLOR (star_type));
+ STAR_COLOR (star_type) HyperSpaceElementPtr->preprocess_func = NULL;
);
HyperSpaceElementPtr->preprocess_func =
HyperSpaceElementPtr->postprocess_func = NULL; HyperSpaceElementPtr->postprocess_func = NULL;
HyperSpaceElementPtr->collision_func = hyper_collision; HyperSpaceElementPtr->collision_func = hyper_collision;
@@ -1549,7 +1544,6 @@ SeedUniverse (void)
InsertElement (hHyperSpaceElement, GetHeadElement ()); InsertElement (hHyperSpaceElement, GetHeadElement ());
} }
}
ProcessEncounters (&universe, ox, oy); ProcessEncounters (&universe, ox, oy);
} }
@@ -1740,3 +1734,4 @@ SaveSisHyperState (void)
GLOBAL (ShipFacing) = StarShipPtr->ShipFacing + 1; GLOBAL (ShipFacing) = StarShipPtr->ShipFacing + 1;
UnlockElement (hSisElement); UnlockElement (hSisElement);
} }
+21
View File
@@ -40,6 +40,27 @@
#define ARILOU_HOME_X (QUASI_SPACE_X + ((RADAR_SCAN_WIDTH >> 1) * 3)) #define ARILOU_HOME_X (QUASI_SPACE_X + ((RADAR_SCAN_WIDTH >> 1) * 3))
#define ARILOU_HOME_Y (QUASI_SPACE_Y + ((RADAR_SCAN_HEIGHT >> 1) * 3)) #define ARILOU_HOME_Y (QUASI_SPACE_Y + ((RADAR_SCAN_HEIGHT >> 1) * 3))
// HyperSpace coordinates of the locations where the QuasiSpace portals
// take you.
#define QUASISPACE_PORTALS_HYPERSPACE_ENDPOINTS \
{ \
{4091, 7748}, \
{3184, 4906}, \
{9211, 6104}, \
{5673, 1207}, \
{1910, 926}, \
{8607, 151}, \
{ 50, 1647}, \
{6117, 4131}, \
{5658, 9712}, \
{2302, 3988}, \
{ 112, 9409}, \
{7752, 8906}, \
{ 368, 6332}, \
{9735, 3153}, \
{5850, 6213}, \
}
// Hyperspace coordinates of the Sol system // Hyperspace coordinates of the Sol system
// Should be the same as in plandata.c // Should be the same as in plandata.c
#define SOL_X 1752 #define SOL_X 1752