SIS crew is handled in battle as other ships. It is no longer continuously

synchronised during melee, but only at the beginning and end of the battle.
This requires a change to the size of various crew_level fields, which
meant some hacks been necessary to keep the savegame format the same.
These hacks should go away when we move to a new savegame format.
Various other small cleanups.
Various documentation added.


git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2269 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
meep-eep
2006-03-11 08:11:53 +00:00
parent 22e364fa4e
commit a5bea87313
70 changed files with 742 additions and 487 deletions
+3
View File
@@ -1,4 +1,7 @@
Changes towards version 0.6: Changes towards version 0.6:
- Flagship crew numbers are no longer continuously synchronised during
melee, but only at the beginning and end of the battle. - SvdB
- Various small cleanups. - SvdB
- Debugging function to add crew during battle. - SvdB - Debugging function to add crew during battle. - SvdB
- More documentation - SvdB. - More documentation - SvdB.
- RMPLIFIED PRECURSOR BOMB is now AMPLIFIED, from Vorn (bug #812) - RMPLIFIED PRECURSOR BOMB is now AMPLIFIED, from Vorn (bug #812)
+8 -17
View File
@@ -66,19 +66,6 @@ ProcessInput (void)
JournalInput (InputState); JournalInput (InputState);
#endif /* CREATE_JOURNAL */ #endif /* CREATE_JOURNAL */
#ifdef TESTING
if ((InputState & DEVICE_BUTTON3)
&& LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE)
{
COUNT i;
for (i = ARILOU_SHIP; i <= BLACK_URQUAN_SHIP; ++i)
ActivateStarShip (i, SPHERE_TRACKING);
while (GLOBAL (GameClock.tick_count) > 1)
ClockTick ();
}
#endif /* TESTING */
CyborgDescPtr->ship_input_state = 0; CyborgDescPtr->ship_input_state = 0;
if (CyborgDescPtr->RaceDescPtr->ship_info.crew_level) if (CyborgDescPtr->RaceDescPtr->ship_info.crew_level)
{ {
@@ -94,12 +81,14 @@ if ((InputState & DEVICE_BUTTON3)
if (InputState & BATTLE_SPECIAL) if (InputState & BATTLE_SPECIAL)
CyborgDescPtr->ship_input_state |= SPECIAL; CyborgDescPtr->ship_input_state |= SPECIAL;
if (CanRunAway && cur_player == 0 && (InputState & BATTLE_ESCAPE)) if (CanRunAway && cur_player == 0 &&
(InputState & BATTLE_ESCAPE))
{ {
ELEMENTPTR ElementPtr; ELEMENTPTR ElementPtr;
LockElement (StarShipPtr->hShip, &ElementPtr); LockElement (StarShipPtr->hShip, &ElementPtr);
if (GetPrimType (&DisplayArray[ElementPtr->PrimIndex]) == STAMP_PRIM if (GetPrimType (&DisplayArray[
ElementPtr->PrimIndex]) == STAMP_PRIM
&& ElementPtr->life_span == NORMAL_LIFE && ElementPtr->life_span == NORMAL_LIFE
&& !(ElementPtr->state_flags & FINITE_LIFE) && !(ElementPtr->state_flags & FINITE_LIFE)
&& ElementPtr->mass_points != MAX_SHIP_MASS * 10 && ElementPtr->mass_points != MAX_SHIP_MASS * 10
@@ -118,8 +107,10 @@ if ((InputState & DEVICE_BUTTON3)
~(SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED); ~(SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED);
SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], SetPrimColor (&DisplayArray[ElementPtr->PrimIndex],
BUILD_COLOR (MAKE_RGB15 (0xB, 0x00, 0x00), 0x2E)); BUILD_COLOR (
SetPrimType (&DisplayArray[ElementPtr->PrimIndex], STAMPFILL_PRIM); MAKE_RGB15 (0xB, 0x00, 0x00), 0x2E));
SetPrimType (&DisplayArray[
ElementPtr->PrimIndex], STAMPFILL_PRIM);
CyborgDescPtr->ship_input_state = 0; CyborgDescPtr->ship_input_state = 0;
} }
+5 -3
View File
@@ -383,14 +383,16 @@ NameCaptain (PQUEUE pQueue, STARSHIPPTR StarShipPtr)
return name_index; return name_index;
} }
// crew_level can be set to INFINITE_FLEET for a ship which is to
// represent an infinite number of ships.
HSTARSHIP HSTARSHIP
CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue, BYTE crew_level) CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue, COUNT crew_level)
{ {
HSTARSHIP hStarShip, hBuiltShip; HSTARSHIP hStarShip, hBuiltShip;
SHIP_FRAGMENTPTR TemplatePtr; SHIP_FRAGMENTPTR TemplatePtr;
if ((hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), shipIndex);
shipIndex)) == 0) if (hStarShip == 0)
return 0; return 0;
TemplatePtr = (SHIP_FRAGMENTPTR)LockStarShip ( TemplatePtr = (SHIP_FRAGMENTPTR)LockStarShip (
+3 -4
View File
@@ -45,8 +45,8 @@
extern HSTARSHIP Build (PQUEUE pQueue, DWORD RaceResIndex, COUNT extern HSTARSHIP Build (PQUEUE pQueue, DWORD RaceResIndex, COUNT
which_player, BYTE captains_name_index); which_player, BYTE captains_name_index);
extern HSTARSHIP CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue, BYTE extern HSTARSHIP CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue,
crew_level); COUNT crew_level);
extern HSTARSHIP GetStarShipFromIndex (PQUEUE pShipQ, COUNT Index); extern HSTARSHIP GetStarShipFromIndex (PQUEUE pShipQ, COUNT Index);
extern BYTE NameCaptain (PQUEUE pQueue, STARSHIPPTR StarShipPtr); extern BYTE NameCaptain (PQUEUE pQueue, STARSHIPPTR StarShipPtr);
@@ -75,8 +75,7 @@ extern void OutlineShipStatus (COORD y);
extern void InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect); extern void InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect);
extern void DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta, extern void DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta,
SIZE energy_delta); SIZE energy_delta);
extern void DrawBattleCrewAmount (STARSHIPPTR StarShipPtr, extern void DrawBattleCrewAmount (STARSHIPPTR StarShipPtr);
BOOLEAN CountPlayer);
#endif /* _BUILD_H */ #endif /* _BUILD_H */
+2 -1
View File
@@ -105,7 +105,8 @@ typedef struct element
ELEMENT_FLAGS state_flags; ELEMENT_FLAGS state_flags;
COUNT life_span; COUNT life_span;
BYTE crew_level, mass_points; COUNT crew_level;
BYTE mass_points;
BYTE turn_wait, thrust_wait; BYTE turn_wait, thrust_wait;
VELOCITY_DESC velocity; VELOCITY_DESC velocity;
INTERSECT_CONTROL IntersectControl; INTERSECT_CONTROL IntersectControl;
+16 -36
View File
@@ -130,57 +130,37 @@ BuildBattle (COUNT which_player)
hBuiltShip = Build (&race_q[which_player], hBuiltShip = Build (&race_q[which_player],
GET_RACE_ID (FragPtr) == SAMATRA_SHIP ? GET_RACE_ID (FragPtr) == SAMATRA_SHIP ?
SAMATRA_RES_INDEX : FragPtr->RaceResIndex, SAMATRA_RES_INDEX : FragPtr->RaceResIndex,
1 << which_player, 1 << which_player, StarShipCaptain (FragPtr));
StarShipCaptain (FragPtr));
if (hBuiltShip) if (hBuiltShip)
{ {
BuiltShipPtr = LockStarShip ( BuiltShipPtr = LockStarShip (&race_q[which_player], hBuiltShip);
&race_q[which_player],
hBuiltShip
);
BuiltShipPtr->captains_name_index = BuiltShipPtr->captains_name_index =
StarShipCaptain (BuiltShipPtr); StarShipCaptain (BuiltShipPtr);
BuiltShipPtr->cur_status_flags = BuiltShipPtr->cur_status_flags =
StarShipPlayer (BuiltShipPtr); StarShipPlayer (BuiltShipPtr);
if (FragPtr->ShipInfo.crew_level != (BYTE)~0) if (FragPtr->ShipInfo.crew_level != INFINITE_FLEET)
BuiltShipPtr->special_counter = FragPtr->ShipInfo.crew_level; BuiltShipPtr->special_counter = FragPtr->ShipInfo.crew_level;
else /* if infinite ships */ else /* if infinite ships */
BuiltShipPtr->special_counter = FragPtr->ShipInfo.max_crew; BuiltShipPtr->special_counter = FragPtr->ShipInfo.max_crew;
BuiltShipPtr->RaceDescPtr = BuiltShipPtr->RaceDescPtr = (RACE_DESCPTR)&FragPtr->ShipInfo;
(RACE_DESCPTR)&FragPtr->ShipInfo;
UnlockStarShip ( UnlockStarShip (&race_q[which_player], hBuiltShip);
&race_q[which_player],
hBuiltShip
);
} }
UnlockStarShip (pQueue, hStarShip); UnlockStarShip (pQueue, hStarShip);
} }
if (which_player == 0 if (which_player == 0
&& (hBuiltShip = Build (&race_q[0], && (hBuiltShip = Build (&race_q[0], SIS_RES_INDEX, GOOD_GUY, 0)))
SIS_RES_INDEX, GOOD_GUY, 0)))
{ {
BuiltShipPtr = LockStarShip ( BuiltShipPtr = LockStarShip (&race_q[0], hBuiltShip);
&race_q[0], BuiltShipPtr->captains_name_index = StarShipCaptain (BuiltShipPtr);
hBuiltShip BuiltShipPtr->cur_status_flags = StarShipPlayer (BuiltShipPtr);
); BuiltShipPtr->special_counter = 0;
BuiltShipPtr->captains_name_index = // Crew will be copied directly from
StarShipCaptain (BuiltShipPtr); // GLOBAL_SIS (CrewEnlisted) later.
BuiltShipPtr->cur_status_flags =
StarShipPlayer (BuiltShipPtr);
if (GLOBAL_SIS (CrewEnlisted) >= MAX_CREW_SIZE - 1)
BuiltShipPtr->special_counter = MAX_CREW_SIZE;
else
BuiltShipPtr->special_counter = (BYTE)(
GLOBAL_SIS (CrewEnlisted) + 1
);
BuiltShipPtr->energy_counter = MAX_ENERGY_SIZE; BuiltShipPtr->energy_counter = MAX_ENERGY_SIZE;
UnlockStarShip ( UnlockStarShip (&race_q[0], hBuiltShip);
&race_q[0],
hBuiltShip
);
} }
} }
@@ -292,7 +272,8 @@ InitEncounter (void)
STARSHIPPTR StarShipPtr; STARSHIPPTR StarShipPtr;
StarShipPtr = LockStarShip (&race_q[1], hStarShip); StarShipPtr = LockStarShip (&race_q[1], hStarShip);
if (StarShipPtr->RaceDescPtr->ship_info.crew_level != (BYTE)~0) if (StarShipPtr->RaceDescPtr->ship_info.crew_level !=
INFINITE_FLEET)
hNextShip = _GetSuccLink (StarShipPtr); hNextShip = _GetSuccLink (StarShipPtr);
else /* if infinite ships */ else /* if infinite ships */
hNextShip = hStarShip; hNextShip = hStarShip;
@@ -311,8 +292,7 @@ InitEncounter (void)
s.origin.y = SINE (angle, radius); s.origin.y = SINE (angle, radius);
} }
s.frame = SetAbsFrameIndex ( s.frame = SetAbsFrameIndex (
StarShipPtr->RaceDescPtr->ship_info.icons, 0 StarShipPtr->RaceDescPtr->ship_info.icons, 0);
);
GetFrameRect (s.frame, &r); GetFrameRect (s.frame, &r);
s.origin.x += (SIS_SCREEN_WIDTH >> 1) - (r.extent.width >> 1); s.origin.x += (SIS_SCREEN_WIDTH >> 1) - (r.extent.width >> 1);
s.origin.y += (SIS_SCREEN_HEIGHT >> 1) - (r.extent.height >> 1); s.origin.y += (SIS_SCREEN_HEIGHT >> 1) - (r.extent.height >> 1);
+2 -1
View File
@@ -167,7 +167,7 @@ InitSIS (void)
ship_ref = MAKE_RESOURCE (rp++, rt, ri++); ship_ref = MAKE_RESOURCE (rp++, rt, ri++);
else if (i == num_ships - 2) else if (i == num_ships - 2)
ship_ref = YEHAT_SHIP_INDEX; ship_ref = YEHAT_SHIP_INDEX;
else else /* (i == num_ships - 1) */
ship_ref = PROBE_RES_INDEX; ship_ref = PROBE_RES_INDEX;
hStarShip = Build (&GLOBAL (avail_race_q), ship_ref, 0, 0); hStarShip = Build (&GLOBAL (avail_race_q), ship_ref, 0, 0);
if (hStarShip) if (hStarShip)
@@ -190,6 +190,7 @@ InitSIS (void)
} }
else else
{ {
// Ur-Quan probe.
load_ship ((STARSHIPPTR)FragPtr, FALSE); load_ship ((STARSHIPPTR)FragPtr, FALSE);
FragPtr->ShipInfo = FragPtr->RaceDescPtr->ship_info; FragPtr->ShipInfo = FragPtr->RaceDescPtr->ship_info;
FragPtr->RaceDescPtr->ship_info.melee_icon = 0; FragPtr->RaceDescPtr->ship_info.melee_icon = 0;
+13
View File
@@ -210,6 +210,11 @@ START_GAME_STATE
*/ */
ADD_GAME_STATE (PLANETARY_LANDING, 1) ADD_GAME_STATE (PLANETARY_LANDING, 1)
ADD_GAME_STATE (PLANETARY_CHANGE, 1) ADD_GAME_STATE (PLANETARY_CHANGE, 1)
/* Flag set to 1 when the planet information for the current
* world is changed since it was last saved to the starinfo.dat
* file. Set when picking up bio, mineral, or energy nodes.
* When there's no current world, it should be 0.
*/
/* Spathi states */ /* Spathi states */
ADD_GAME_STATE (SPATHI_VISITS, 3) ADD_GAME_STATE (SPATHI_VISITS, 3)
@@ -741,6 +746,14 @@ START_GAME_STATE
ADD_GAME_STATE (UMGAH_MENTIONED_TRICKS, 2) ADD_GAME_STATE (UMGAH_MENTIONED_TRICKS, 2)
ADD_GAME_STATE (BOMB_CARRIER, 1) ADD_GAME_STATE (BOMB_CARRIER, 1)
/* 0 when the flagship is not in battle, or it doesn't have the
* enhanced precursor bomb installed.
* 1 when the flagship is in battle and the bomb is installed.
* This determines whether you can flee (if the warp escape unit
* is installed at all), and whether taking the ship into the
* Sa-Matra defense structure will trigger the end of the game.
*/
ADD_GAME_STATE (THRADD_MANNER, 1) ADD_GAME_STATE (THRADD_MANNER, 1)
ADD_GAME_STATE (THRADD_INTRO, 2) ADD_GAME_STATE (THRADD_INTRO, 2)
ADD_GAME_STATE (THRADD_DEMEANOR, 3) ADD_GAME_STATE (THRADD_DEMEANOR, 3)
+7 -9
View File
@@ -227,8 +227,8 @@ FoundHome:
{ {
if (Index <= LONIBBLE (EncounterMakeup[BestIndex]) if (Index <= LONIBBLE (EncounterMakeup[BestIndex])
|| (COUNT)TFB_Random () % 100 < 50) || (COUNT)TFB_Random () % 100 < 50)
CloneShipFragment (BestIndex, &GLOBAL (npc_built_ship_q), CloneShipFragment (BestIndex,
0); &GLOBAL (npc_built_ship_q), 0);
} }
PutGroupInfo (0L, ++which_group); PutGroupInfo (0L, ++which_group);
@@ -261,16 +261,14 @@ FlushGroupInfo (GROUP_HEADER *pGH, DWORD offset, BYTE which_group, PVOID fp)
for (hStarShip = GetHeadLink (&temp_q); for (hStarShip = GetHeadLink (&temp_q);
hStarShip; hStarShip = hNextShip) hStarShip; hStarShip = hNextShip)
{ {
BYTE crew_level; COUNT crew_level;
FragPtr = (SHIP_FRAGMENTPTR)LockStarShip ( FragPtr = (SHIP_FRAGMENTPTR)LockStarShip (
&temp_q, hStarShip); &temp_q, hStarShip);
hNextShip = _GetSuccLink (FragPtr); hNextShip = _GetSuccLink (FragPtr);
crew_level = FragPtr->ShipInfo.crew_level; crew_level = FragPtr->ShipInfo.crew_level;
which_group = GET_GROUP_ID (FragPtr); which_group = GET_GROUP_ID (FragPtr);
UnlockStarShip ( UnlockStarShip (&temp_q, hStarShip);
&temp_q, hStarShip
);
if (crew_level == 0) if (crew_level == 0)
{ {
@@ -590,9 +588,7 @@ GetGroupInfo (DWORD offset, BYTE which_group)
NAME_OFFSET + NUM_CAPTAINS_NAMES + 1; NAME_OFFSET + NUM_CAPTAINS_NAMES + 1;
OwnStarShip (FragPtr, BAD_GUY, captains_name_index); OwnStarShip (FragPtr, BAD_GUY, captains_name_index);
} }
UnlockStarShip ( UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
&GLOBAL (npc_built_ship_q), hStarShip
);
} }
else else
{ {
@@ -631,6 +627,8 @@ PutGroupInfo (DWORD offset, BYTE which_group)
GH.GroupOffset[0] = 0; GH.GroupOffset[0] = 0;
SeekStateFile (fp, offset, SEEK_SET); SeekStateFile (fp, offset, SEEK_SET);
WriteStateFile (&GH, sizeof (GH), 1, fp); WriteStateFile (&GH, sizeof (GH), 1, fp);
// XXX: It seems that GH is not completely initialised.
// Some garbage is saved. -- SvdB
} }
if (which_group) if (which_group)
+2 -6
View File
@@ -251,10 +251,7 @@ check_hyperspace_encounter (void)
} }
} }
UnlockStarShip ( UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
&GLOBAL (avail_race_q),
hStarShip
);
} }
SET_GAME_STATE (USED_BROADCASTER, 0); SET_GAME_STATE (USED_BROADCASTER, 0);
@@ -952,8 +949,7 @@ AddEncounterElement (ENCOUNTERPTR EncounterPtr,
EncounterPtr->SD.Index = MAKE_BYTE ( EncounterPtr->SD.Index = MAKE_BYTE (
NumShips, HINIBBLE (EncounterPtr->SD.Index) NumShips, HINIBBLE (EncounterPtr->SD.Index));
);
for (i = 0; i < NumShips; ++i) for (i = 0; i < NumShips; ++i)
{ {
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
+22 -8
View File
@@ -205,7 +205,19 @@ UninitShips (void)
for (i = 0; i < NUM_PLAYERS; ++i) for (i = 0; i < NUM_PLAYERS; ++i)
SPtr[i] = 0; SPtr[i] = 0;
// Count the crew floating in space.
crew_retrieved = 0; crew_retrieved = 0;
for (hElement = GetHeadElement ();
hElement != 0; hElement = hNextElement)
{
ELEMENTPTR ElementPtr;
LockElement (hElement, &ElementPtr);
hNextElement = GetSuccElement (ElementPtr);
if (ElementPtr->state_flags & CREW_OBJECT)
++crew_retrieved;
UnlockElement (hElement);
}
for (hElement = GetHeadElement (); for (hElement = GetHeadElement ();
hElement != 0; hElement = hNextElement) hElement != 0; hElement = hNextElement)
{ {
@@ -214,14 +226,20 @@ UninitShips (void)
LockElement (hElement, &ElementPtr); LockElement (hElement, &ElementPtr);
hNextElement = GetSuccElement (ElementPtr); hNextElement = GetSuccElement (ElementPtr);
if (ElementPtr->state_flags & CREW_OBJECT) if ((ElementPtr->state_flags & PLAYER_SHIP)
++crew_retrieved;
else if ((ElementPtr->state_flags & PLAYER_SHIP)
|| ElementPtr->death_func == new_ship) || ElementPtr->death_func == new_ship)
{ {
STARSHIPPTR StarShipPtr; STARSHIPPTR StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr); GetElementStarShip (ElementPtr, &StarShipPtr);
// There should only be one ship left in battle.
// He gets the crew still floating in space.
if (StarShipPtr->RaceDescPtr->ship_info.crew_level)
StarShipPtr->RaceDescPtr->ship_info.crew_level +=
crew_retrieved;
if (StarShipPtr->RaceDescPtr->uninit_func != NULL)
(*StarShipPtr->RaceDescPtr->uninit_func) (
StarShipPtr->RaceDescPtr);
StarShipPtr->ShipFacing = StarShipPtr->ShipFacing =
StarShipPtr->RaceDescPtr->ship_info.var2; StarShipPtr->RaceDescPtr->ship_info.var2;
StarShipPtr->special_counter = StarShipPtr->special_counter =
@@ -243,14 +261,9 @@ UninitShips (void)
for (i = NUM_PLAYERS - 1; i >= 0; --i) for (i = NUM_PLAYERS - 1; i >= 0; --i)
{ {
if (SPtr[i]) if (SPtr[i])
{
if (SPtr[i]->special_counter)
SPtr[i]->special_counter += crew_retrieved;
GetEncounterStarShip (SPtr[i], i); GetEncounterStarShip (SPtr[i], i);
} }
} }
}
if (LOBYTE (GLOBAL (CurrentActivity)) != IN_ENCOUNTER) if (LOBYTE (GLOBAL (CurrentActivity)) != IN_ENCOUNTER)
{ {
@@ -262,3 +275,4 @@ UninitShips (void)
} }
} }
+40 -3
View File
@@ -74,6 +74,13 @@ LoadShipQueue (DECODE_REF fh, PQUEUE pQueue, BOOLEAN MakeQ)
Ptr = ((PBYTE)&FragPtr->ShipInfo) - Offset; Ptr = ((PBYTE)&FragPtr->ShipInfo) - Offset;
cread ((PBYTE)Ptr, cread ((PBYTE)Ptr,
((PBYTE)&FragPtr->ShipInfo.race_strings) - Ptr, 1, fh); ((PBYTE)&FragPtr->ShipInfo.race_strings) - Ptr, 1, fh);
// Hack to retain savegame backwards compatibility, after
// increasing crew_level and max_crew from BYTE to COUNT.
// For the queues that are saved here, a BYTE is large enough.
FragPtr->ShipInfo.max_crew = FragPtr->ShipInfo.dummy_max_crew;
FragPtr->ShipInfo.crew_level = FragPtr->ShipInfo.dummy_crew_level;
if (Offset == 0) if (Offset == 0)
{ {
EXTENDED_SHIP_FRAGMENTPTR ExtFragPtr; EXTENDED_SHIP_FRAGMENTPTR ExtFragPtr;
@@ -87,6 +94,36 @@ LoadShipQueue (DECODE_REF fh, PQUEUE pQueue, BOOLEAN MakeQ)
} }
} }
static void
LoadEncounter (ENCOUNTERPTR EncounterPtr, DECODE_REF fh)
{
COUNT i;
#define LOAD_BLOCK(file, start, end) \
cread((PBYTE) (start), (PBYTE) (end) - (PBYTE) start, \
1, (file))
// An ENCOUNTER structure (indirectly) contains an array of
// SHIP_INFO structure, which is bigger now because of the
// larger type for crew.
// This hack makes sure the savegames format is unchanged.
// The original code consisted of just one line:
// cread ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh);
// Load the stuff before the SHIP_INFO array:
LOAD_BLOCK(fh, EncounterPtr, EncounterPtr->SD.ShipList);
// Load each entry in the SHIP_INFO array:
for (i = 0; i < MAX_HYPER_SHIPS; i++)
{
SHIP_INFO *ShipInfo = &EncounterPtr->SD.ShipList[i];
LOAD_BLOCK(fh, ShipInfo, &ShipInfo->crew_level);
ShipInfo->crew_level = ShipInfo->dummy_crew_level;
ShipInfo->max_crew = ShipInfo->dummy_max_crew;
}
// Load the stuff after the SHIP_INFO array:
LOAD_BLOCK(fh, &EncounterPtr->log_x, &EncounterPtr[1]);
}
static BOOLEAN static BOOLEAN
LoadSummary (uio_Stream *in_fp) LoadSummary (uio_Stream *in_fp)
{ {
@@ -211,7 +248,8 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc)
hEncounter = AllocEncounter (); hEncounter = AllocEncounter ();
LockEncounter (hEncounter, &EncounterPtr); LockEncounter (hEncounter, &EncounterPtr);
cread ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh); //cread ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh);
LoadEncounter(EncounterPtr, fh);
EncounterPtr->hElement = 0; EncounterPtr->hElement = 0;
NumShips = LONIBBLE (EncounterPtr->SD.Index); NumShips = LONIBBLE (EncounterPtr->SD.Index);
for (i = 0; i < NumShips; ++i) for (i = 0; i < NumShips; ++i)
@@ -223,8 +261,7 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc)
&GLOBAL (avail_race_q), &GLOBAL (avail_race_q),
EncounterPtr->SD.ShipList[i].var1); EncounterPtr->SD.ShipList[i].var1);
TemplatePtr = (SHIP_FRAGMENTPTR)LockStarShip ( TemplatePtr = (SHIP_FRAGMENTPTR)LockStarShip (
&GLOBAL (avail_race_q), hStarShip &GLOBAL (avail_race_q), hStarShip);
);
EncounterPtr->SD.ShipList[i].race_strings = EncounterPtr->SD.ShipList[i].race_strings =
TemplatePtr->ShipInfo.race_strings; TemplatePtr->ShipInfo.race_strings;
EncounterPtr->SD.ShipList[i].icons = EncounterPtr->SD.ShipList[i].icons =
+18 -13
View File
@@ -110,7 +110,8 @@ DoGetMelee (GETMELEE_STATE *gms)
if (select) if (select)
{ {
if (gms->hBattleShip || (gms->col == NUM_MELEE_COLS_ORIG && ConfirmExit ())) if (gms->hBattleShip ||
(gms->col == NUM_MELEE_COLS_ORIG && ConfirmExit ()))
{ {
GLOBAL (CurrentActivity) &= ~CHECK_ABORT; GLOBAL (CurrentActivity) &= ~CHECK_ABORT;
return FALSE; return FALSE;
@@ -171,14 +172,17 @@ ChangeSelection:
for (gms->hBattleShip = GetHeadLink (&race_q[which_player]); for (gms->hBattleShip = GetHeadLink (&race_q[which_player]);
gms->hBattleShip != 0; gms->hBattleShip = hNextShip) gms->hBattleShip != 0; gms->hBattleShip = hNextShip)
{ {
STARSHIPPTR StarShipPtr = LockStarShip (&race_q[which_player], gms->hBattleShip); STARSHIPPTR StarShipPtr = LockStarShip (
&race_q[which_player], gms->hBattleShip);
if (StarShipPtr->RaceResIndex && ship_index-- == 0) if (StarShipPtr->RaceResIndex && ship_index-- == 0)
{ {
UnlockStarShip (&race_q[which_player], gms->hBattleShip); UnlockStarShip (&race_q[which_player],
gms->hBattleShip);
break; break;
} }
hNextShip = _GetSuccLink (StarShipPtr); hNextShip = _GetSuccLink (StarShipPtr);
UnlockStarShip (&race_q[which_player], gms->hBattleShip); UnlockStarShip (&race_q[which_player],
gms->hBattleShip);
} }
} }
} }
@@ -188,7 +192,8 @@ ChangeSelection:
for (gms->hBattleShip = GetHeadLink (&race_q[which_player]); for (gms->hBattleShip = GetHeadLink (&race_q[which_player]);
gms->hBattleShip != 0; gms->hBattleShip = hNextShip) gms->hBattleShip != 0; gms->hBattleShip = hNextShip)
{ {
STARSHIPPTR StarShipPtr = LockStarShip (&race_q[which_player], gms->hBattleShip); STARSHIPPTR StarShipPtr = LockStarShip (
&race_q[which_player], gms->hBattleShip);
if (StarShipPtr->ShipFacing == ship_index) if (StarShipPtr->ShipFacing == ship_index)
{ {
hNextShip = gms->hBattleShip; hNextShip = gms->hBattleShip;
@@ -272,16 +277,15 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player)
t.pStr = buf; t.pStr = buf;
t.CharCount = (COUNT)~0; t.CharCount = (COUNT)~0;
SetContextFont (TinyFont); SetContextFont (TinyFont);
SetContextForeGroundColor (BUILD_COLOR ( SetContextForeGroundColor (
MAKE_RGB15 (0x13, 0x00, 0x00), 0x2C)); BUILD_COLOR (MAKE_RGB15 (0x13, 0x00, 0x00), 0x2C));
font_DrawText (&t); font_DrawText (&t);
} }
SetContext (SpaceContext); SetContext (SpaceContext);
s.origin.x = PICK_X_OFFS - 3; s.origin.x = PICK_X_OFFS - 3;
s.origin.y = PICK_Y_OFFS - 9 s.origin.y = PICK_Y_OFFS - 9 + ((1 - which_player) * PICK_SIDE_OFFS);
+ ((1 - which_player) * PICK_SIDE_OFFS);
DrawStamp (&s); DrawStamp (&s);
@@ -299,11 +303,13 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player)
SetContext (OldContext); SetContext (OldContext);
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
PressState = PulsedInputState.key[KEY_MENU_SELECT] || PulsedInputState.key[KEY_MENU_CANCEL]; PressState = PulsedInputState.key[KEY_MENU_SELECT] ||
PulsedInputState.key[KEY_MENU_CANCEL];
do do
{ {
UpdateInputState (); UpdateInputState ();
ButtonState = PulsedInputState.key[KEY_MENU_SELECT] || PulsedInputState.key[KEY_MENU_CANCEL]; ButtonState = PulsedInputState.key[KEY_MENU_SELECT] ||
PulsedInputState.key[KEY_MENU_CANCEL];
if (PressState) if (PressState)
{ {
PressState = ButtonState; PressState = ButtonState;
@@ -323,8 +329,7 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player)
BYTE fade_buf[] = {FadeAllToColor}; BYTE fade_buf[] = {FadeAllToColor};
SleepThreadUntil (XFormColorMap SleepThreadUntil (XFormColorMap
((COLORMAPPTR) fade_buf, ONE_SECOND / 2) ((COLORMAPPTR) fade_buf, ONE_SECOND / 2) + ONE_SECOND / 60);
+ ONE_SECOND / 60);
FlushColorXForms (); FlushColorXForms ();
} }
+18 -17
View File
@@ -197,8 +197,7 @@ ChangeSelection:
locString = SetAbsStringTableIndex ( locString = SetAbsStringTableIndex (
StarShipPtr->RaceDescPtr->ship_info.race_strings, StarShipPtr->RaceDescPtr->ship_info.race_strings,
StarShipPtr->captains_name_index StarShipPtr->captains_name_index);
);
t.pStr = (UNICODE *)GetStringAddress (locString); t.pStr = (UNICODE *)GetStringAddress (locString);
t.CharCount = GetStringLength (locString); t.CharCount = GetStringLength (locString);
crew_level = StarShipPtr->RaceDescPtr->ship_info.crew_level; crew_level = StarShipPtr->RaceDescPtr->ship_info.crew_level;
@@ -206,7 +205,8 @@ ChangeSelection:
} }
UnlockStarShip (&race_q[0], hBattleShip); UnlockStarShip (&race_q[0], hBattleShip);
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x14, 0x0A, 0x00), 0x0C)); SetContextForeGroundColor (
BUILD_COLOR (MAKE_RGB15 (0x14, 0x0A, 0x00), 0x0C));
font_DrawText (&t); font_DrawText (&t);
SetContextForeGroundColor (BLACK_COLOR); SetContextForeGroundColor (BLACK_COLOR);
} }
@@ -227,7 +227,8 @@ ChangeSelection:
sprintf (buf, "%u", crew_level); sprintf (buf, "%u", crew_level);
else else
sprintf (buf, "%u/%u", crew_level, max_crew); sprintf (buf, "%u/%u", crew_level, max_crew);
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02)); SetContextForeGroundColor (
BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02));
font_DrawText (&t); font_DrawText (&t);
} }
@@ -324,10 +325,12 @@ GetEncounterStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player)
{ {
hStarShip = GetHeadLink (&GLOBAL (npc_built_ship_q)); hStarShip = GetHeadLink (&GLOBAL (npc_built_ship_q));
FragPtr = (SHIP_FRAGMENTPTR)LockStarShip ( FragPtr = (SHIP_FRAGMENTPTR)LockStarShip (
&GLOBAL (npc_built_ship_q), hStarShip &GLOBAL (npc_built_ship_q), hStarShip);
); if (FragPtr->ShipInfo.crew_level == INFINITE_FLEET)
if (FragPtr->ShipInfo.crew_level == (BYTE)~0) {
// Infinite number of ships.
battle_counter += MAKE_WORD (0, 1); battle_counter += MAKE_WORD (0, 1);
}
UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
} }
} }
@@ -354,7 +357,7 @@ GetEncounterStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player)
FragPtr = (SHIP_FRAGMENTPTR)LockStarShip (pQueue, hStarShip); FragPtr = (SHIP_FRAGMENTPTR)LockStarShip (pQueue, hStarShip);
if (SPtr == LastStarShipPtr) if (SPtr == LastStarShipPtr)
{ {
if (FragPtr->ShipInfo.crew_level != (BYTE)~0) if (FragPtr->ShipInfo.crew_level != INFINITE_FLEET)
{ {
FragPtr->ShipInfo.crew_level = SPtr->special_counter; FragPtr->ShipInfo.crew_level = SPtr->special_counter;
SPtr->RaceDescPtr = (RACE_DESCPTR)&FragPtr->ShipInfo; SPtr->RaceDescPtr = (RACE_DESCPTR)&FragPtr->ShipInfo;
@@ -391,8 +394,7 @@ GetEncounterStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player)
#ifndef TESTING #ifndef TESTING
else if (GLOBAL_SIS (FuelOnBoard) > else if (GLOBAL_SIS (FuelOnBoard) >
RUN_AWAY_FUEL_COST) RUN_AWAY_FUEL_COST)
GLOBAL_SIS (FuelOnBoard) -= GLOBAL_SIS (FuelOnBoard) -= RUN_AWAY_FUEL_COST;
RUN_AWAY_FUEL_COST;
else else
GLOBAL_SIS (FuelOnBoard) = 0; GLOBAL_SIS (FuelOnBoard) = 0;
#endif /* TESTING */ #endif /* TESTING */
@@ -430,9 +432,7 @@ DrawArmadaPickShip (BOOLEAN draw_salvage_frame, PRECT pPickRect)
hLastIndex = SetResourceIndex (hResIndex); hLastIndex = SetResourceIndex (hResIndex);
OldContext = SetContext (SpaceContext); OldContext = SetContext (SpaceContext);
PickFrame = CaptureDrawable ( PickFrame = CaptureDrawable (LoadGraphic (SC2_PICK_PMAP_ANIM));
LoadGraphic (SC2_PICK_PMAP_ANIM)
);
BatchGraphics (); BatchGraphics ();
@@ -469,7 +469,8 @@ DrawArmadaPickShip (BOOLEAN draw_salvage_frame, PRECT pPickRect)
t.align = ALIGN_CENTER; t.align = ALIGN_CENTER;
t.pStr = GLOBAL_SIS (ShipName); t.pStr = GLOBAL_SIS (ShipName);
t.CharCount = (COUNT)~0; t.CharCount = (COUNT)~0;
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17)); SetContextForeGroundColor (
BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17));
SetContextFont (StarConFont); SetContextFont (StarConFont);
font_DrawText (&t); font_DrawText (&t);
@@ -485,8 +486,7 @@ SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17));
COUNT ship_index; COUNT ship_index;
ship_index = (COUNT)LONIBBLE ( ship_index = (COUNT)LONIBBLE (
StarShipPtr->RaceDescPtr->ship_info.var2 StarShipPtr->RaceDescPtr->ship_info.var2);
);
s.origin.x = pick_r.corner.x s.origin.x = pick_r.corner.x
+ (5 + ((ICON_WIDTH + 4) + (5 + ((ICON_WIDTH + 4)
@@ -516,7 +516,8 @@ SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17));
else else
{ {
/* Ship ran away */ /* Ship ran away */
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); SetContextForeGroundColor (BUILD_COLOR (
MAKE_RGB15 (0x00, 0x00, 0x14), 0x01));
DrawFilledStamp (&s); DrawFilledStamp (&s);
} }
} }
+1 -1
View File
@@ -82,7 +82,7 @@ GenerateChmmr (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (ILWRATH_SHIP, CloneShipFragment (ILWRATH_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6); SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);
+1 -1
View File
@@ -118,7 +118,7 @@ GenerateDruuge (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (DRUUGE_SHIP, CloneShipFragment (DRUUGE_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+1 -1
View File
@@ -91,7 +91,7 @@ GenerateIlwrath (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (ILWRATH_SHIP, CloneShipFragment (ILWRATH_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+2 -1
View File
@@ -140,7 +140,8 @@ GenerateMycon (BYTE control)
if (CurStarDescPtr->Index == MYCON_DEFINED if (CurStarDescPtr->Index == MYCON_DEFINED
|| !GET_GAME_STATE (MYCON_FELL_FOR_AMBUSH)) || !GET_GAME_STATE (MYCON_FELL_FOR_AMBUSH))
CloneShipFragment (MYCON_SHIP, CloneShipFragment (MYCON_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q),
INFINITE_FLEET);
else else
{ {
COUNT i; COUNT i;
+1 -1
View File
@@ -308,7 +308,7 @@ GenerateOrz (BYTE control)
if (CurStarDescPtr->Index == ORZ_DEFINED) if (CurStarDescPtr->Index == ORZ_DEFINED)
{ {
CloneShipFragment (ORZ_SHIP, CloneShipFragment (ORZ_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7); SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
} }
else else
+1 -1
View File
@@ -183,7 +183,7 @@ GenerateTalkingPet (BYTE control)
if (!GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES)) if (!GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES))
{ {
CloneShipFragment (UMGAH_SHIP, CloneShipFragment (UMGAH_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
InitCommunication (UMGAH_CONVERSATION); InitCommunication (UMGAH_CONVERSATION);
} }
else else
+1 -1
View File
@@ -110,7 +110,7 @@ GeneratePkunk (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (PKUNK_SHIP, CloneShipFragment (PKUNK_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+1 -1
View File
@@ -252,7 +252,7 @@ GenerateSamatra (BYTE control)
if (!GET_GAME_STATE (URQUAN_MESSED_UP)) if (!GET_GAME_STATE (URQUAN_MESSED_UP))
CloneShipFragment (!GET_GAME_STATE (KOHR_AH_FRENZY) ? CloneShipFragment (!GET_GAME_STATE (KOHR_AH_FRENZY) ?
URQUAN_SHIP : BLACK_URQUAN_SHIP, URQUAN_SHIP : BLACK_URQUAN_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
else else
{ {
#define URQUAN_REMNANTS 3 #define URQUAN_REMNANTS 3
+3 -8
View File
@@ -42,9 +42,7 @@ check_old_shofixti (void)
FLEE | IGNORE_FLAGSHIP | (task & REFORM_GROUP)); FLEE | IGNORE_FLAGSHIP | (task & REFORM_GROUP));
SET_GROUP_DEST (FragPtr, 0); SET_GROUP_DEST (FragPtr, 0);
UnlockStarShip ( UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
&GLOBAL (npc_built_ship_q), hStarShip
);
} }
} }
@@ -69,9 +67,7 @@ GenerateShofixti (BYTE control)
MAKE_WORD (b0, b1), MAKE_WORD (b2, b3) MAKE_WORD (b0, b1), MAKE_WORD (b2, b3)
); );
if (GLOBAL (BattleGroupRef) == 0 if (GLOBAL (BattleGroupRef) == 0
|| !GetGroupInfo ( || !GetGroupInfo (GLOBAL (BattleGroupRef), (BYTE)~0))
GLOBAL (BattleGroupRef), (BYTE)~0
))
{ {
if (GLOBAL (BattleGroupRef) == 0) if (GLOBAL (BattleGroupRef) == 0)
GLOBAL (BattleGroupRef) = ~0L; GLOBAL (BattleGroupRef) = ~0L;
@@ -80,8 +76,7 @@ GenerateShofixti (BYTE control)
&GLOBAL (npc_built_ship_q), 1); &GLOBAL (npc_built_ship_q), 1);
GLOBAL (BattleGroupRef) = PutGroupInfo ( GLOBAL (BattleGroupRef) = PutGroupInfo (
GLOBAL (BattleGroupRef), 1 GLOBAL (BattleGroupRef), 1);
);
b0 = LOBYTE (LOWORD (GLOBAL (BattleGroupRef))); b0 = LOBYTE (LOWORD (GLOBAL (BattleGroupRef)));
b1 = HIBYTE (LOWORD (GLOBAL (BattleGroupRef))); b1 = HIBYTE (LOWORD (GLOBAL (BattleGroupRef)));
b2 = LOBYTE (HIWORD (GLOBAL (BattleGroupRef))); b2 = LOBYTE (HIWORD (GLOBAL (BattleGroupRef)));
+1 -1
View File
@@ -163,7 +163,7 @@ GenerateSpathi (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (SPATHI_SHIP, CloneShipFragment (SPATHI_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7); SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
+1 -1
View File
@@ -108,7 +108,7 @@ GenerateSupox (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (SUPOX_SHIP, CloneShipFragment (SUPOX_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+1 -1
View File
@@ -149,7 +149,7 @@ GenerateThradd (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (THRADDASH_SHIP, CloneShipFragment (THRADDASH_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+1 -1
View File
@@ -150,7 +150,7 @@ GenerateUtwig (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (UTWIG_SHIP, CloneShipFragment (UTWIG_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+1 -1
View File
@@ -163,7 +163,7 @@ GenerateVUX (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (VUX_SHIP, CloneShipFragment (VUX_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
if (CurStarDescPtr->Index == VUX_DEFINED) if (CurStarDescPtr->Index == VUX_DEFINED)
{ {
SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7); SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);
+1 -1
View File
@@ -92,7 +92,7 @@ GenerateYehat (BYTE control)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CloneShipFragment (YEHAT_SHIP, CloneShipFragment (YEHAT_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+2 -4
View File
@@ -51,9 +51,7 @@ check_scout (void)
SET_GROUP_DEST (FragPtr, 0); SET_GROUP_DEST (FragPtr, 0);
} }
UnlockStarShip ( UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
&GLOBAL (npc_built_ship_q), hStarShip
);
} }
} }
@@ -201,7 +199,7 @@ GenerateZoqFotPik (BYTE control)
} }
CloneShipFragment (ZOQFOTPIK_SHIP, CloneShipFragment (ZOQFOTPIK_SHIP,
&GLOBAL (npc_built_ship_q), (BYTE)~0); &GLOBAL (npc_built_ship_q), INFINITE_FLEET);
pSolarSysState->MenuState.Initialized += 2; pSolarSysState->MenuState.Initialized += 2;
GLOBAL (CurrentActivity) |= START_INTERPLANETARY; GLOBAL (CurrentActivity) |= START_INTERPLANETARY;
+14 -13
View File
@@ -144,8 +144,8 @@ PreProcess (ELEMENTPTR ElementPtr)
{ {
(*ElementPtr->preprocess_func) (ElementPtr); (*ElementPtr->preprocess_func) (ElementPtr);
if (((state_flags = ElementPtr->state_flags) & CHANGING) state_flags = ElementPtr->state_flags;
&& CollidingElement (ElementPtr)) if ((state_flags & CHANGING) && CollidingElement (ElementPtr))
InitIntersectFrame (ElementPtr); InitIntersectFrame (ElementPtr);
} }
@@ -170,8 +170,7 @@ PreProcess (ELEMENTPTR ElementPtr)
--ElementPtr->life_span; --ElementPtr->life_span;
} }
ElementPtr->state_flags = (state_flags ElementPtr->state_flags = (state_flags & ~(POST_PROCESS | COLLISION))
& ~(POST_PROCESS | COLLISION))
| PRE_PROCESS; | PRE_PROCESS;
} }
@@ -845,7 +844,8 @@ PostProcessQueue (VIEW_STATE view_state, SIZE scroll_x,
ProcessCollisions (GetHeadElement (), PostElementPtr, ProcessCollisions (GetHeadElement (), PostElementPtr,
MAX_TIME_VALUE, PRE_PROCESS | POST_PROCESS); MAX_TIME_VALUE, PRE_PROCESS | POST_PROCESS);
UnlockElement (hPostElement); UnlockElement (hPostElement);
} while ((hPostElement = hNextElement) != 0); hPostElement = hNextElement;
} while (hPostElement != 0);
scroll_x = 0; scroll_x = 0;
scroll_y = 0; scroll_y = 0;
@@ -920,20 +920,20 @@ PostProcessQueue (VIEW_STATE view_state, SIZE scroll_x,
ElementPtr->next.image.frame = ElementPtr->next.image.frame =
#ifdef SAFE #ifdef SAFE
SetAbsFrameIndex ( SetAbsFrameIndex (
ElementPtr->next.image.farray ElementPtr->next.image.farray[index],
[index],
GetFrameIndex (ElementPtr->next.image.frame)); GetFrameIndex (ElementPtr->next.image.frame));
#else /* SAFE */ #else /* SAFE */
SetEquFrameIndex ( SetEquFrameIndex (
ElementPtr->next.image.farray ElementPtr->next.image.farray[index],
[index],
ElementPtr->next.image.frame); ElementPtr->next.image.frame);
#endif /* SAFE */ #endif /* SAFE */
if (optMeleeScale == TFB_SCALE_TRILINEAR && index < 2 && scale != 256) if (optMeleeScale == TFB_SCALE_TRILINEAR &&
index < 2 && scale != 256)
{ {
// enqueues drawcommand to assign next (smaller) zoom // enqueues drawcommand to assign next
// level image as mipmap, needed for trilinear scaling // (smaller) zoom level image as mipmap,
// needed for trilinear scaling
PFRAME_DESC frame = PFRAME_DESC frame =
SetAbsFrameIndex ( SetAbsFrameIndex (
@@ -1027,7 +1027,8 @@ RedrawQueue (BOOLEAN clear)
{ {
BYTE skip_frames; BYTE skip_frames;
if ((skip_frames = HIBYTE (nth_frame)) != (BYTE)~0 skip_frames = HIBYTE (nth_frame);
if (skip_frames != (BYTE)~0
&& (skip_frames == 0 || (--nth_frame & 0x00FF) == 0)) && (skip_frames == 0 || (--nth_frame & 0x00FF) == 0))
{ {
nth_frame += skip_frames; nth_frame += skip_frames;
+42 -8
View File
@@ -57,9 +57,9 @@
#define FIRES_LEFT (1 << 10) #define FIRES_LEFT (1 << 10)
#define SHIELD_DEFENSE (1 << 11) #define SHIELD_DEFENSE (1 << 11)
#define DONT_CHASE (1 << 12) #define DONT_CHASE (1 << 12)
#define PLAYER_CAPTAIN (1 << 13)
/* The protagonist himself is on board. He gets a different color. */
#define MAX_SHAPES_ACTIVE 2
/* SHIP_SHAPE_ACTIVE && SPECIAL_SHAPE_ACTIVE */
typedef struct captain_stuff typedef struct captain_stuff
{ {
@@ -101,12 +101,24 @@ typedef struct
{ {
UWORD ship_flags; UWORD ship_flags;
BYTE var1, var2; BYTE var1, var2;
BYTE crew_level, max_crew; BYTE dummy_crew_level, dummy_max_crew;
/* Necessary for savegame backwards compatibility.
* Unused during the game, only used during save/load.
*/
BYTE energy_level, max_energy; BYTE energy_level, max_energy;
POINT loc; POINT loc;
/* The fields above this line are included in queues in savegames,
* All fields, including those below, are saved in ENCOUNTER structures
* in savegames. The latter was probably not supposed to happen.
*/
STRING race_strings; STRING race_strings;
FRAME icons, melee_icon; FRAME icons, melee_icon;
COUNT crew_level, max_crew;
/* For ships in npc_built_ship_q, the value INFINITE_FLEET for
* crew_level indicates an infinite number of ships. */
#define INFINITE_FLEET ((COUNT) ~0)
} SHIP_INFO; } SHIP_INFO;
typedef SHIP_INFO *PSHIP_INFO; typedef SHIP_INFO *PSHIP_INFO;
#define SHIP_INFOPTR PSHIP_INFO #define SHIP_INFOPTR PSHIP_INFO
@@ -152,13 +164,22 @@ typedef struct
BYTE days_left; BYTE days_left;
/* Days left before the fleet reachers 'dest_loc'. */ /* Days left before the fleet reachers 'dest_loc'. */
BYTE growth_fract; BYTE growth_fract;
BYTE crew_level, max_crew; BYTE dummy_crew_level, dummy_max_crew;
/* Necessary for savegame backwards compatibility.
* Unused during the game, only used during save/load.
*/
BYTE energy_level, max_energy; BYTE energy_level, max_energy;
POINT loc; POINT loc;
/* Location of the fleet (center) */ /* Location of the fleet (center) */
STRING race_strings; STRING race_strings;
/* Race specific strings, see doc/devel/racestrings. */
FRAME icons, melee_icon; FRAME icons, melee_icon;
COUNT crew_level, max_crew;
/* For ships in npc_built_ship_q, the value INFINITE_FLEET for
* crew_level indicates an infinite number of ships. */
/* -== The fields below this line are included in savegames. ==- */
COUNT actual_strength; COUNT actual_strength;
/* Measure for the size of the sphere of influence. /* Measure for the size of the sphere of influence.
@@ -195,17 +216,25 @@ typedef struct
typedef DATA_STUFF *PDATA_STUFF; typedef DATA_STUFF *PDATA_STUFF;
#define DATA_STUFFPTR PDATA_STUFF #define DATA_STUFFPTR PDATA_STUFF
typedef struct race_desc RACE_DESC;
typedef RACE_DESC *PRACE_DESC;
#define RACE_DESCPTR PRACE_DESC
typedef void (PREPROCESS_FUNC) (PELEMENT ElementPtr); typedef void (PREPROCESS_FUNC) (PELEMENT ElementPtr);
typedef void (POSTPROCESS_FUNC) (PELEMENT ElementPtr); typedef void (POSTPROCESS_FUNC) (PELEMENT ElementPtr);
typedef COUNT (INIT_WEAPON_FUNC) (PELEMENT ElementPtr, HELEMENT Weapon[]); typedef COUNT (INIT_WEAPON_FUNC) (PELEMENT ElementPtr, HELEMENT Weapon[]);
typedef void (UNINIT_FUNC) (RACE_DESCPTR pRaceDesc);
typedef struct race_desc struct race_desc
{ {
SHIP_INFO ship_info _ALIGNED_ANY; SHIP_INFO ship_info _ALIGNED_ANY;
CHARACTERISTIC_STUFF characteristics _ALIGNED_ANY; CHARACTERISTIC_STUFF characteristics _ALIGNED_ANY;
DATA_STUFF ship_data _ALIGNED_ANY; DATA_STUFF ship_data _ALIGNED_ANY;
INTEL_STUFF cyborg_control _ALIGNED_ANY; INTEL_STUFF cyborg_control _ALIGNED_ANY;
UNINIT_FUNC *uninit_func
_ALIGNED_ON(sizeof (UNINIT_FUNC *));
PREPROCESS_FUNC *preprocess_func PREPROCESS_FUNC *preprocess_func
_ALIGNED_ON(sizeof (PREPROCESS_FUNC *)); _ALIGNED_ON(sizeof (PREPROCESS_FUNC *));
POSTPROCESS_FUNC *postprocess_func POSTPROCESS_FUNC *postprocess_func
@@ -214,9 +243,8 @@ typedef struct race_desc
_ALIGNED_ON(sizeof (INIT_WEAPON_FUNC *)); _ALIGNED_ON(sizeof (INIT_WEAPON_FUNC *));
PVOID CodeRef _ALIGNED_ON(sizeof (PVOID)); PVOID CodeRef _ALIGNED_ON(sizeof (PVOID));
} RACE_DESC; };
typedef RACE_DESC *PRACE_DESC;
#define RACE_DESCPTR PRACE_DESC
typedef QUEUE_HANDLE HSTARSHIP; typedef QUEUE_HANDLE HSTARSHIP;
@@ -251,6 +279,12 @@ typedef struct
DWORD RaceResIndex; DWORD RaceResIndex;
RACE_DESCPTR RaceDescPtr; RACE_DESCPTR RaceDescPtr;
/* This field is abused to store other data when the ship
* is in GLOBAL(built_ship_q), GLOBDATA(npc_built_ship_q),
* or race_q[], namely the side this ship is on (accessed
* through StarShipPlayer()), and the captains name for
* the ship (accessed through StarShipCaptain()).
* These values are set using OwnStarShip(). */
SHIP_INFO ShipInfo; SHIP_INFO ShipInfo;
} SHIP_FRAGMENT; } SHIP_FRAGMENT;
typedef SHIP_FRAGMENT *PSHIP_FRAGMENT; typedef SHIP_FRAGMENT *PSHIP_FRAGMENT;
+56 -1
View File
@@ -72,6 +72,12 @@ SaveShipQueue (DECODE_REF fh, PQUEUE pQueue)
// See races.h; look for the enum containing NUM_AVAILABLE_RACES. // See races.h; look for the enum containing NUM_AVAILABLE_RACES.
cwrite ((PBYTE)&Index, sizeof (Index), 1, fh); cwrite ((PBYTE)&Index, sizeof (Index), 1, fh);
// Hack to retain savegame backwards compatibility, after
// increasing crew_level and max_crew from BYTE to COUNT.
// For the queues that are saved here, a BYTE is large enough.
FragPtr->ShipInfo.dummy_max_crew = FragPtr->ShipInfo.max_crew;
FragPtr->ShipInfo.dummy_crew_level = FragPtr->ShipInfo.crew_level;
// Write part of FragPtr, starting with FragPtr->ShipInfo for // Write part of FragPtr, starting with FragPtr->ShipInfo for
// GLOBAL(avail_race_q), and FragPtr->RaceDescPtr for other queues. // GLOBAL(avail_race_q), and FragPtr->RaceDescPtr for other queues.
// When FragPtr->RaceDescPtr is saved, it does not actually // When FragPtr->RaceDescPtr is saved, it does not actually
@@ -104,6 +110,36 @@ SaveShipQueue (DECODE_REF fh, PQUEUE pQueue)
} }
} }
static void
SaveEncounter (ENCOUNTERPTR EncounterPtr, DECODE_REF fh)
{
COUNT i;
#define SAVE_BLOCK(file, start, end) \
cwrite((PBYTE) (start), (PBYTE) (end) - (PBYTE) start, \
1, (file))
// An ENCOUNTER structure (indirectly) contains an array of
// SHIP_INFO structure, which is bigger now because of the
// larger type for crew.
// This hack makes sure the savegames format is unchanged.
// The original code consisted of jsut one line:
// cwrite ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh);
// Save the stuff before the SHIP_INFO array:
SAVE_BLOCK(fh, EncounterPtr, EncounterPtr->SD.ShipList);
// Save each entry in the SHIP_INFO array:
for (i = 0; i < MAX_HYPER_SHIPS; i++)
{
SHIP_INFO *ShipInfo = &EncounterPtr->SD.ShipList[i];
ShipInfo->dummy_crew_level = (BYTE) ShipInfo->crew_level;
ShipInfo->dummy_max_crew = (BYTE) ShipInfo->max_crew;
SAVE_BLOCK(fh, ShipInfo, &ShipInfo->crew_level);
}
// Save the stuff after the SHIP_INFO array:
SAVE_BLOCK(fh, &EncounterPtr->log_x, &EncounterPtr[1]);
}
static void static void
PrepareSummary (SUMMARY_DESC *summary_desc) PrepareSummary (SUMMARY_DESC *summary_desc)
{ {
@@ -259,6 +295,8 @@ SaveProblem (void)
return; return;
} }
// This function first writes to a memory file, and then writes the whole
// lot to the actual save file at once.
BOOLEAN BOOLEAN
SaveGame (COUNT which_game, SUMMARY_DESC *summary_desc) SaveGame (COUNT which_game, SUMMARY_DESC *summary_desc)
{ {
@@ -320,7 +358,8 @@ RetrySave:
& (START_ENCOUNTER | START_INTERPLANETARY))) & (START_ENCOUNTER | START_INTERPLANETARY)))
PutGroupInfo (0L, (BYTE)~0); PutGroupInfo (0L, (BYTE)~0);
cwrite ((PBYTE)&GlobData.Game_state, sizeof (GlobData.Game_state), 1, fh); cwrite ((PBYTE)&GlobData.Game_state, sizeof (GlobData.Game_state),
1, fh);
GLOBAL (ip_location) = pt; GLOBAL (ip_location) = pt;
GLOBAL (ShipStamp.frame) = frame; GLOBAL (ShipStamp.frame) = frame;
@@ -330,8 +369,10 @@ RetrySave:
SaveShipQueue (fh, &GLOBAL (npc_built_ship_q)); SaveShipQueue (fh, &GLOBAL (npc_built_ship_q));
SaveShipQueue (fh, &GLOBAL (built_ship_q)); SaveShipQueue (fh, &GLOBAL (built_ship_q));
// Save the number of game events (compressed).
num_links = CountLinks (&GLOBAL (GameClock.event_q)); num_links = CountLinks (&GLOBAL (GameClock.event_q));
cwrite ((PBYTE)&num_links, sizeof (num_links), 1, fh); cwrite ((PBYTE)&num_links, sizeof (num_links), 1, fh);
// Save the game events themselves (compressed):
{ {
HEVENT hEvent; HEVENT hEvent;
@@ -351,7 +392,9 @@ RetrySave:
} }
} }
// Save the number of encounters (black globes in HS/QS (compressed))
num_links = CountLinks (&GLOBAL (encounter_q)); num_links = CountLinks (&GLOBAL (encounter_q));
// Save the encounters themselves (compressed):
cwrite ((PBYTE)&num_links, sizeof (num_links), 1, fh); cwrite ((PBYTE)&num_links, sizeof (num_links), 1, fh);
{ {
HENCOUNTER hEncounter; HENCOUNTER hEncounter;
@@ -365,6 +408,8 @@ RetrySave:
LockEncounter (hEncounter, &EncounterPtr); LockEncounter (hEncounter, &EncounterPtr);
hNextEncounter = GetSuccEncounter (EncounterPtr); hNextEncounter = GetSuccEncounter (EncounterPtr);
//cwrite ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh);
SaveEncounter(EncounterPtr, fh);
cwrite ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh); cwrite ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh);
UnlockEncounter (hEncounter); UnlockEncounter (hEncounter);
@@ -372,10 +417,12 @@ RetrySave:
} }
} }
// Copy the star info file to the memory file (compressed).
fp = OpenStateFile (STARINFO_FILE, "rb"); fp = OpenStateFile (STARINFO_FILE, "rb");
if (fp) if (fp)
{ {
flen = LengthStateFile (fp); flen = LengthStateFile (fp);
// (DWORD) Write the uncompressed size.
cwrite ((PBYTE)&flen, sizeof (flen), 1, fh); cwrite ((PBYTE)&flen, sizeof (flen), 1, fh);
while (flen) while (flen)
{ {
@@ -390,10 +437,12 @@ RetrySave:
CloseStateFile (fp); CloseStateFile (fp);
} }
// Copy the ? groupinfo file into the memory file (compressed).
fp = OpenStateFile (DEFGRPINFO_FILE, "rb"); fp = OpenStateFile (DEFGRPINFO_FILE, "rb");
if (fp) if (fp)
{ {
flen = LengthStateFile (fp); flen = LengthStateFile (fp);
// (DWORD) Write the uncompressed size.
cwrite ((PBYTE)&flen, sizeof (flen), 1, fh); cwrite ((PBYTE)&flen, sizeof (flen), 1, fh);
while (flen) while (flen)
{ {
@@ -408,6 +457,7 @@ RetrySave:
CloseStateFile (fp); CloseStateFile (fp);
} }
// Copy the ? groupinfo file into the memory file (compressed).
fp = OpenStateFile (RANDGRPINFO_FILE, "rb"); fp = OpenStateFile (RANDGRPINFO_FILE, "rb");
if (fp) if (fp)
{ {
@@ -426,18 +476,23 @@ RetrySave:
CloseStateFile (fp); CloseStateFile (fp);
} }
// Write the current star desc into the memory file (compressed).
cwrite ((PBYTE)&SD, sizeof (SD), 1, fh); cwrite ((PBYTE)&SD, sizeof (SD), 1, fh);
flen = cclose (fh); flen = cclose (fh);
// Write the memory file to the actual savegame file.
sprintf (file, "starcon2.%02u", which_game); sprintf (file, "starcon2.%02u", which_game);
// fprintf (stderr, "'%s' is %lu bytes long\n", file, flen + sizeof (*summary_desc)); // fprintf (stderr, "'%s' is %lu bytes long\n", file, flen + sizeof (*summary_desc));
if (flen && (out_fp = (PVOID)res_OpenResFile (saveDir, file, "wb"))) if (flen && (out_fp = (PVOID)res_OpenResFile (saveDir, file, "wb")))
{ {
PrepareSummary (summary_desc); PrepareSummary (summary_desc);
// First write the summary.
success = (BOOLEAN)(WriteResFile ( success = (BOOLEAN)(WriteResFile (
summary_desc, sizeof (*summary_desc), 1, out_fp) != 0); summary_desc, sizeof (*summary_desc), 1, out_fp) != 0);
// Then write the rest of the data.
if (success && WriteResFile (mem_lock (h), (COUNT)flen, 1, if (success && WriteResFile (mem_lock (h), (COUNT)flen, 1,
out_fp) == 0) out_fp) == 0)
success = FALSE; success = FALSE;
+27 -19
View File
@@ -156,8 +156,7 @@ ship_preprocess (PELEMENT ElementPtr)
& (LEFT | RIGHT | THRUST | WEAPON | SPECIAL); & (LEFT | RIGHT | THRUST | WEAPON | SPECIAL);
else else
{ {
ElementPtr->crew_level = ElementPtr->crew_level = RDPtr->ship_info.crew_level;
(BYTE)RDPtr->ship_info.crew_level;
if ((ElementPtr->state_flags & BAD_GUY) if ((ElementPtr->state_flags & BAD_GUY)
&& LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) && LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE)
@@ -352,20 +351,19 @@ ship_postprocess (PELEMENT ElementPtr)
} }
void void
collision (PELEMENT collision (PELEMENT ElementPtr0, PPOINT pPt0,
ElementPtr0, PPOINT PELEMENT ElementPtr1, PPOINT pPt1)
pPt0, PELEMENT
ElementPtr1, PPOINT
pPt1)
{ {
if (!(ElementPtr1->state_flags & FINITE_LIFE)) if (!(ElementPtr1->state_flags & FINITE_LIFE))
{ {
ElementPtr0->state_flags |= COLLISION; ElementPtr0->state_flags |= COLLISION;
if (GRAVITY_MASS (ElementPtr1->mass_points)) if (GRAVITY_MASS (ElementPtr1->mass_points))
{ {
// Collision with a planet.
SIZE damage; SIZE damage;
if ((damage = ElementPtr0->hit_points >> 2) == 0) damage = ElementPtr0->hit_points >> 2;
if (damage == 0)
damage = 1; damage = 1;
do_damage ((ELEMENTPTR)ElementPtr0, damage); do_damage ((ELEMENTPTR)ElementPtr0, damage);
@@ -380,8 +378,7 @@ collision (PELEMENT
} }
static BOOLEAN static BOOLEAN
spawn_ship (STARSHIPPTR spawn_ship (STARSHIPPTR StarShipPtr)
StarShipPtr)
{ {
HELEMENT hShip; HELEMENT hShip;
RACE_DESCPTR RDPtr; RACE_DESCPTR RDPtr;
@@ -399,20 +396,32 @@ spawn_ship (STARSHIPPTR
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_ENCOUNTER if (LOBYTE (GLOBAL (CurrentActivity)) == IN_ENCOUNTER
|| LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) || LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE)
{ {
if ((RDPtr->ship_info.crew_level = StarShipPtr->special_counter) > if (StarShipPtr->special_counter == 0)
RDPtr->ship_info.max_crew) {
// SIS, already handled from sis_ship.c.
// RDPtr->ship_info.crew_level = GLOBAL_SIS (CrewEnlisted);
}
else
RDPtr->ship_info.crew_level = StarShipPtr->special_counter;
if (RDPtr->ship_info.crew_level > RDPtr->ship_info.max_crew)
RDPtr->ship_info.crew_level = RDPtr->ship_info.max_crew; RDPtr->ship_info.crew_level = RDPtr->ship_info.max_crew;
} }
StarShipPtr->energy_counter = StarShipPtr->energy_counter = 0;
StarShipPtr->weapon_counter = StarShipPtr->weapon_counter = 0;
StarShipPtr->special_counter = 0; StarShipPtr->special_counter = 0;
if ((hShip = StarShipPtr->hShip) == 0 hShip = StarShipPtr->hShip;
&& (hShip = AllocElement ()) != 0) if (hShip == 0)
{
hShip = AllocElement ();
if (hShip != 0)
InsertElement (hShip, GetHeadElement ()); InsertElement (hShip, GetHeadElement ());
}
if ((StarShipPtr->hShip = hShip) != 0) StarShipPtr->hShip = hShip;
if (StarShipPtr->hShip != 0)
{ {
ELEMENTPTR ShipElementPtr; ELEMENTPTR ShipElementPtr;
@@ -450,8 +459,7 @@ spawn_ship (STARSHIPPTR
--facing; --facing;
GLOBAL (ShipStamp.frame) = (FRAME)MAKE_DWORD ( GLOBAL (ShipStamp.frame) = (FRAME)MAKE_DWORD (
StarShipPtr->ShipFacing + 1, 0 StarShipPtr->ShipFacing + 1, 0);
);
StarShipPtr->ShipFacing = facing; StarShipPtr->ShipFacing = facing;
} }
ShipElementPtr->current.image.frame = ShipElementPtr->current.image.frame =
+9 -7
View File
@@ -43,7 +43,7 @@ static RACE_DESC androsynth_desc =
FIRES_FORE | SEEKING_WEAPON, FIRES_FORE | SEEKING_WEAPON,
15, /* Super Melee cost */ 15, /* Super Melee cost */
~0, /* Initial sphere of influence radius */ ~0, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
MAX_X_UNIVERSE >> 1, MAX_Y_UNIVERSE >> 1, MAX_X_UNIVERSE >> 1, MAX_Y_UNIVERSE >> 1,
@@ -51,6 +51,7 @@ static RACE_DESC androsynth_desc =
(STRING)ANDROSYNTH_RACE_STRINGS, (STRING)ANDROSYNTH_RACE_STRINGS,
(FRAME)ANDROSYNTH_ICON_MASK_PMAP_ANIM, (FRAME)ANDROSYNTH_ICON_MASK_PMAP_ANIM,
(FRAME)ANDROSYNTH_MICON_MASK_PMAP_ANIM, (FRAME)ANDROSYNTH_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -96,9 +97,10 @@ static RACE_DESC androsynth_desc =
LONG_RANGE_WEAPON >> 2, LONG_RANGE_WEAPON >> 2,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
@@ -110,7 +112,7 @@ blazer_collision (PELEMENT ElementPtr0, PPOINT pPt0, PELEMENT ElementPtr1, PPOIN
{ {
#define BLAZER_OFFSET 10 #define BLAZER_OFFSET 10
BYTE old_offs; BYTE old_offs;
BYTE old_crew_level; COUNT old_crew_level;
COUNT old_life; COUNT old_life;
old_crew_level = ElementPtr0->crew_level; old_crew_level = ElementPtr0->crew_level;
@@ -252,7 +254,7 @@ androsynth_intelligence (PELEMENT ShipPtr, PEVALUATE_DESC ObjectsOfConcern, COUN
|| StarShipPtr->RaceDescPtr->ship_info.energy_level < MAX_ENERGY / 3 || StarShipPtr->RaceDescPtr->ship_info.energy_level < MAX_ENERGY / 3
|| ((WEAPON_RANGE (&pEnemyStarShip->RaceDescPtr->cyborg_control) <= CLOSE_RANGE_WEAPON || ((WEAPON_RANGE (&pEnemyStarShip->RaceDescPtr->cyborg_control) <= CLOSE_RANGE_WEAPON
&& lpEvalDesc->ObjectPtr->crew_level > BLAZER_DAMAGE) && lpEvalDesc->ObjectPtr->crew_level > BLAZER_DAMAGE)
|| (lpEvalDesc->ObjectPtr->crew_level > (BYTE)(BLAZER_DAMAGE * 3) || (lpEvalDesc->ObjectPtr->crew_level > (BLAZER_DAMAGE * 3)
&& MANEUVERABILITY (&pEnemyStarShip->RaceDescPtr->cyborg_control) > SLOW_SHIP)))) && MANEUVERABILITY (&pEnemyStarShip->RaceDescPtr->cyborg_control) > SLOW_SHIP))))
lpEvalDesc->MoveState = ENTICE; lpEvalDesc->MoveState = ENTICE;
} }
@@ -271,7 +273,7 @@ androsynth_intelligence (PELEMENT ShipPtr, PEVALUATE_DESC ObjectsOfConcern, COUN
|| (lpEvalDesc->which_turn < 16 || (lpEvalDesc->which_turn < 16
&& (WEAPON_RANGE (&pEnemyStarShip->RaceDescPtr->cyborg_control) > CLOSE_RANGE_WEAPON && (WEAPON_RANGE (&pEnemyStarShip->RaceDescPtr->cyborg_control) > CLOSE_RANGE_WEAPON
|| lpEvalDesc->ObjectPtr->crew_level <= BLAZER_DAMAGE) || lpEvalDesc->ObjectPtr->crew_level <= BLAZER_DAMAGE)
&& (lpEvalDesc->ObjectPtr->crew_level <= (BYTE)(BLAZER_DAMAGE * 3) && (lpEvalDesc->ObjectPtr->crew_level <= (BLAZER_DAMAGE * 3)
|| MANEUVERABILITY (&pEnemyStarShip->RaceDescPtr->cyborg_control) <= || MANEUVERABILITY (&pEnemyStarShip->RaceDescPtr->cyborg_control) <=
SLOW_SHIP))))) SLOW_SHIP)))))
StarShipPtr->ship_input_state |= SPECIAL; StarShipPtr->ship_input_state |= SPECIAL;
+6 -4
View File
@@ -45,7 +45,7 @@ static RACE_DESC arilou_desc =
/* FIRES_FORE | */ IMMEDIATE_WEAPON, /* FIRES_FORE | */ IMMEDIATE_WEAPON,
16, /* Super Melee cost */ 16, /* Super Melee cost */
250 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 250 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
438, 6372, 438, 6372,
@@ -53,6 +53,7 @@ static RACE_DESC arilou_desc =
(STRING)ARILOU_RACE_STRINGS, (STRING)ARILOU_RACE_STRINGS,
(FRAME)ARILOU_ICON_MASK_PMAP_ANIM, (FRAME)ARILOU_ICON_MASK_PMAP_ANIM,
(FRAME)ARILOU_MICON_MASK_PMAP_ANIM, (FRAME)ARILOU_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -98,9 +99,10 @@ static RACE_DESC arilou_desc =
LASER_RANGE >> 1, LASER_RANGE >> 1,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -47,7 +47,7 @@ static RACE_DESC black_urquan_desc =
FIRES_FORE, FIRES_FORE,
30, /* Super Melee cost */ 30, /* Super Melee cost */
2666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 2666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
6000, 6250, 6000, 6250,
@@ -55,6 +55,7 @@ static RACE_DESC black_urquan_desc =
(STRING)KOHR_AH_RACE_STRINGS, (STRING)KOHR_AH_RACE_STRINGS,
(FRAME)KOHR_AH_ICON_MASK_PMAP_ANIM, (FRAME)KOHR_AH_ICON_MASK_PMAP_ANIM,
(FRAME)KOHR_AH_MICON_MASK_PMAP_ANIM, (FRAME)KOHR_AH_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -100,9 +101,10 @@ static RACE_DESC black_urquan_desc =
CLOSE_RANGE_WEAPON, CLOSE_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -50,7 +50,7 @@ static RACE_DESC chenjesu_desc =
FIRES_FORE | SEEKING_SPECIAL | SEEKING_WEAPON, FIRES_FORE | SEEKING_SPECIAL | SEEKING_WEAPON,
28, /* Super Melee cost */ 28, /* Super Melee cost */
0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -58,6 +58,7 @@ static RACE_DESC chenjesu_desc =
(STRING)CHENJESU_RACE_STRINGS, (STRING)CHENJESU_RACE_STRINGS,
(FRAME)CHENJESU_ICON_MASK_PMAP_ANIM, (FRAME)CHENJESU_ICON_MASK_PMAP_ANIM,
(FRAME)CHENJESU_MICON_MASK_PMAP_ANIM, (FRAME)CHENJESU_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -103,9 +104,10 @@ static RACE_DESC chenjesu_desc =
LONG_RANGE_WEAPON, LONG_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -47,7 +47,7 @@ static RACE_DESC chmmr_desc =
FIRES_FORE | IMMEDIATE_WEAPON | SEEKING_SPECIAL | POINT_DEFENSE, FIRES_FORE | IMMEDIATE_WEAPON | SEEKING_SPECIAL | POINT_DEFENSE,
30, /* Super Melee cost */ 30, /* Super Melee cost */
0, /* Initial sphere of influence radius */ 0, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -55,6 +55,7 @@ static RACE_DESC chmmr_desc =
(STRING)CHMMR_RACE_STRINGS, (STRING)CHMMR_RACE_STRINGS,
(FRAME)CHMMR_ICON_MASK_PMAP_ANIM, (FRAME)CHMMR_ICON_MASK_PMAP_ANIM,
(FRAME)CHMMR_MICON_MASK_PMAP_ANIM, (FRAME)CHMMR_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -100,9 +101,10 @@ static RACE_DESC chmmr_desc =
CLOSE_RANGE_WEAPON, CLOSE_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -43,7 +43,7 @@ static RACE_DESC druuge_desc =
FIRES_FORE, FIRES_FORE,
17, /* Super Melee cost */ 17, /* Super Melee cost */
1400 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 1400 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
9500, 2792, 9500, 2792,
@@ -51,6 +51,7 @@ static RACE_DESC druuge_desc =
(STRING)DRUUGE_RACE_STRINGS, (STRING)DRUUGE_RACE_STRINGS,
(FRAME)DRUUGE_ICON_MASK_PMAP_ANIM, (FRAME)DRUUGE_ICON_MASK_PMAP_ANIM,
(FRAME)DRUUGE_MICON_MASK_PMAP_ANIM, (FRAME)DRUUGE_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -96,9 +97,10 @@ static RACE_DESC druuge_desc =
MISSILE_RANGE, MISSILE_RANGE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -47,7 +47,7 @@ static RACE_DESC human_desc =
FIRES_FORE | SEEKING_WEAPON | POINT_DEFENSE, FIRES_FORE | SEEKING_WEAPON | POINT_DEFENSE,
11, /* Super Melee cost */ 11, /* Super Melee cost */
0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
1752, 1450, 1752, 1450,
@@ -55,6 +55,7 @@ static RACE_DESC human_desc =
(STRING)HUMAN_RACE_STRINGS, (STRING)HUMAN_RACE_STRINGS,
(FRAME)HUMAN_ICON_MASK_PMAP_ANIM, (FRAME)HUMAN_ICON_MASK_PMAP_ANIM,
(FRAME)HUMAN_MICON_MASK_PMAP_ANIM, (FRAME)HUMAN_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -100,9 +101,10 @@ static RACE_DESC human_desc =
LONG_RANGE_WEAPON, LONG_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -45,7 +45,7 @@ static RACE_DESC ilwrath_desc =
FIRES_FORE, FIRES_FORE,
10, /* Super Melee cost */ 10, /* Super Melee cost */
1410 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 1410 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
48, 1700, 48, 1700,
@@ -53,6 +53,7 @@ static RACE_DESC ilwrath_desc =
(STRING)ILWRATH_RACE_STRINGS, (STRING)ILWRATH_RACE_STRINGS,
(FRAME)ILWRATH_ICON_MASK_PMAP_ANIM, (FRAME)ILWRATH_ICON_MASK_PMAP_ANIM,
(FRAME)ILWRATH_MICON_MASK_PMAP_ANIM, (FRAME)ILWRATH_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -98,9 +99,10 @@ static RACE_DESC ilwrath_desc =
CLOSE_RANGE_WEAPON, CLOSE_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -50,7 +50,7 @@ static RACE_DESC samatra_desc =
/* FIRES_FORE | */ IMMEDIATE_WEAPON | CREW_IMMUNE, /* FIRES_FORE | */ IMMEDIATE_WEAPON | CREW_IMMUNE,
16, /* Super Melee cost */ 16, /* Super Melee cost */
0, /* Initial sphere of influence radius */ 0, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -58,6 +58,7 @@ static RACE_DESC samatra_desc =
(STRING)0, (STRING)0,
(FRAME)0, (FRAME)0,
(FRAME)0, (FRAME)0,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -103,9 +104,10 @@ static RACE_DESC samatra_desc =
0, 0,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -46,7 +46,7 @@ static RACE_DESC melnorme_desc =
FIRES_FORE, FIRES_FORE,
18, /* Super Melee cost */ 18, /* Super Melee cost */
~0, /* Initial sphere of influence radius */ ~0, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
MAX_X_UNIVERSE >> 1, MAX_Y_UNIVERSE >> 1, MAX_X_UNIVERSE >> 1, MAX_Y_UNIVERSE >> 1,
@@ -54,6 +54,7 @@ static RACE_DESC melnorme_desc =
(STRING)MELNORME_RACE_STRINGS, (STRING)MELNORME_RACE_STRINGS,
(FRAME)MELNORME_ICON_MASK_PMAP_ANIM, (FRAME)MELNORME_ICON_MASK_PMAP_ANIM,
(FRAME)MELNORME_MICON_MASK_PMAP_ANIM, (FRAME)MELNORME_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -99,9 +100,10 @@ static RACE_DESC melnorme_desc =
PUMPUP_SPEED * PUMPUP_LIFE, PUMPUP_SPEED * PUMPUP_LIFE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -58,7 +58,7 @@ static RACE_DESC mmrnmhrm_desc =
FIRES_FORE | IMMEDIATE_WEAPON, FIRES_FORE | IMMEDIATE_WEAPON,
19, /* Super Melee cost */ 19, /* Super Melee cost */
0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -66,6 +66,7 @@ static RACE_DESC mmrnmhrm_desc =
(STRING)MMRNMHRM_RACE_STRINGS, (STRING)MMRNMHRM_RACE_STRINGS,
(FRAME)MMRNMHRM_ICON_MASK_PMAP_ANIM, (FRAME)MMRNMHRM_ICON_MASK_PMAP_ANIM,
(FRAME)MMRNMHRM_MICON_MASK_PMAP_ANIM, (FRAME)MMRNMHRM_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -111,9 +112,10 @@ static RACE_DESC mmrnmhrm_desc =
CLOSE_RANGE_WEAPON, CLOSE_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -46,7 +46,7 @@ static RACE_DESC mycon_desc =
FIRES_FORE | SEEKING_WEAPON, FIRES_FORE | SEEKING_WEAPON,
21, /* Super Melee cost */ 21, /* Super Melee cost */
1070 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 1070 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
6392, 2200, 6392, 2200,
@@ -54,6 +54,7 @@ static RACE_DESC mycon_desc =
(STRING)MYCON_RACE_STRINGS, (STRING)MYCON_RACE_STRINGS,
(FRAME)MYCON_ICON_MASK_PMAP_ANIM, (FRAME)MYCON_ICON_MASK_PMAP_ANIM,
(FRAME)MYCON_MICON_MASK_PMAP_ANIM, (FRAME)MYCON_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -99,9 +100,10 @@ static RACE_DESC mycon_desc =
DISPLAY_TO_WORLD (800), DISPLAY_TO_WORLD (800),
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -48,7 +48,7 @@ static RACE_DESC orz_desc =
FIRES_FORE | SEEKING_SPECIAL, FIRES_FORE | SEEKING_SPECIAL,
23, /* Super Melee cost */ 23, /* Super Melee cost */
333 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 333 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
3608, 2637, 3608, 2637,
@@ -56,6 +56,7 @@ static RACE_DESC orz_desc =
(STRING)ORZ_RACE_STRINGS, (STRING)ORZ_RACE_STRINGS,
(FRAME)ORZ_ICON_MASK_PMAP_ANIM, (FRAME)ORZ_ICON_MASK_PMAP_ANIM,
(FRAME)ORZ_MICON_MASK_PMAP_ANIM, (FRAME)ORZ_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -101,9 +102,10 @@ static RACE_DESC orz_desc =
MISSILE_SPEED * MISSILE_LIFE, MISSILE_SPEED * MISSILE_LIFE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -46,7 +46,7 @@ static RACE_DESC pkunk_desc =
FIRES_FORE | FIRES_LEFT | FIRES_RIGHT, FIRES_FORE | FIRES_LEFT | FIRES_RIGHT,
20, /* Super Melee cost */ 20, /* Super Melee cost */
666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
502, 401, 502, 401,
@@ -54,6 +54,7 @@ static RACE_DESC pkunk_desc =
(STRING)PKUNK_RACE_STRINGS, (STRING)PKUNK_RACE_STRINGS,
(FRAME)PKUNK_ICON_MASK_PMAP_ANIM, (FRAME)PKUNK_ICON_MASK_PMAP_ANIM,
(FRAME)PKUNK_MICON_MASK_PMAP_ANIM, (FRAME)PKUNK_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -99,9 +100,10 @@ static RACE_DESC pkunk_desc =
CLOSE_RANGE_WEAPON + 1, CLOSE_RANGE_WEAPON + 1,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -40,7 +40,7 @@ static RACE_DESC probe_desc =
0, 0,
0, /* Super Melee cost */ 0, /* Super Melee cost */
0, /* Initial sphere of influence radius */ 0, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -48,6 +48,7 @@ static RACE_DESC probe_desc =
0, 0,
0, 0,
(FRAME)PROBE_MICON_MASK_PMAP_ANIM, (FRAME)PROBE_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -93,9 +94,10 @@ static RACE_DESC probe_desc =
0, 0,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -46,7 +46,7 @@ static RACE_DESC shofixti_desc =
FIRES_FORE, FIRES_FORE,
5, /* Super Melee cost */ 5, /* Super Melee cost */
0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -54,6 +54,7 @@ static RACE_DESC shofixti_desc =
(STRING)SHOFIXTI_RACE_STRINGS, (STRING)SHOFIXTI_RACE_STRINGS,
(FRAME)SHOFIXTI_ICON_MASK_PMAP_ANIM, (FRAME)SHOFIXTI_ICON_MASK_PMAP_ANIM,
(FRAME)SHOFIXTI_MICON_MASK_PMAP_ANIM, (FRAME)SHOFIXTI_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -99,9 +100,10 @@ static RACE_DESC shofixti_desc =
MISSILE_SPEED * MISSILE_LIFE, MISSILE_SPEED * MISSILE_LIFE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+137 -83
View File
@@ -52,7 +52,7 @@ static RACE_DESC sis_desc =
0, 0,
16, /* Super Melee cost */ 16, /* Super Melee cost */
0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -60,6 +60,7 @@ static RACE_DESC sis_desc =
0, 0,
(FRAME)SIS_ICON_MASK_PMAP_ANIM, (FRAME)SIS_ICON_MASK_PMAP_ANIM,
0, 0,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -105,12 +106,21 @@ static RACE_DESC sis_desc =
BLASTER_SPEED * BLASTER_LIFE, BLASTER_SPEED * BLASTER_LIFE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
static void InitModuleSlots (RACE_DESCPTR RaceDescPtr,
const BYTE *ModuleSlots);
static void InitDriveSlots (RACE_DESCPTR RaceDescPtr,
const BYTE *DriveSlots);
static void InitJetSlots (RACE_DESCPTR RaceDescPtr,
const BYTE *JetSlots);
void uninit_sis (RACE_DESCPTR pRaceDesc);
static BYTE num_trackers = 0; static BYTE num_trackers = 0;
static void static void
@@ -445,7 +455,7 @@ sis_battle_preprocess (PELEMENT ElementPtr)
static void static void
sis_battle_postprocess (PELEMENT ElementPtr) sis_battle_postprocess (PELEMENT ElementPtr)
{ {
SIZE crew_delta; // SIZE crew_delta;
STARSHIPPTR StarShipPtr; STARSHIPPTR StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr); GetElementStarShip (ElementPtr, &StarShipPtr);
@@ -456,6 +466,7 @@ sis_battle_postprocess (PELEMENT ElementPtr)
spawn_point_defense (ElementPtr); spawn_point_defense (ElementPtr);
} }
#if 0
if (ElementPtr->crew_level > 0 if (ElementPtr->crew_level > 0
&& ElementPtr->crew_level < StarShipPtr->RaceDescPtr->ship_info.max_crew && ElementPtr->crew_level < StarShipPtr->RaceDescPtr->ship_info.max_crew
&& ElementPtr->crew_level != (crew_delta = && ElementPtr->crew_level != (crew_delta =
@@ -468,6 +479,7 @@ sis_battle_postprocess (PELEMENT ElementPtr)
else else
DeltaCrew (ElementPtr, StarShipPtr->RaceDescPtr->ship_info.max_crew); DeltaCrew (ElementPtr, StarShipPtr->RaceDescPtr->ship_info.max_crew);
} }
#endif
} }
#define BLASTER_DAMAGE 2 #define BLASTER_DAMAGE 2
@@ -736,6 +748,102 @@ sis_intelligence (PELEMENT ShipPtr, PEVALUATE_DESC ObjectsOfConcern, COUNT Conce
} }
} }
static void
InitModuleSlots (RACE_DESCPTR RaceDescPtr, const BYTE *ModuleSlots) {
COUNT i;
RaceDescPtr->ship_info.max_crew = 0;
num_trackers = 0;
for (i = 0; i < NUM_MODULE_SLOTS; ++i)
{
BYTE which_mod;
which_mod = ModuleSlots[(NUM_MODULE_SLOTS - 1) - i];
switch (which_mod)
{
case CREW_POD:
RaceDescPtr->ship_info.max_crew += CREW_POD_CAPACITY;
break;
case GUN_WEAPON:
case BLASTER_WEAPON:
case CANNON_WEAPON:
RaceDescPtr->characteristics.weapon_energy_cost +=
(which_mod - GUN_WEAPON + 1) * 2;
if (i <= 1)
RaceDescPtr->ship_info.ship_flags |= FIRES_FORE;
else if (i == 2)
RaceDescPtr->ship_info.ship_flags |=
FIRES_LEFT | FIRES_RIGHT;
else
RaceDescPtr->ship_info.ship_flags |= FIRES_AFT;
break;
case TRACKING_SYSTEM:
++num_trackers;
break;
case ANTIMISSILE_DEFENSE:
++RaceDescPtr->characteristics.special_energy_cost;
break;
case SHIVA_FURNACE:
++RaceDescPtr->characteristics.energy_regeneration;
break;
case DYNAMO_UNIT:
RaceDescPtr->characteristics.energy_wait -= 2;
if (RaceDescPtr->characteristics.energy_wait < 4)
RaceDescPtr->characteristics.energy_wait = 4;
break;
}
}
if (num_trackers > MAX_TRACKING)
num_trackers = MAX_TRACKING;
RaceDescPtr->characteristics.weapon_energy_cost += num_trackers * 3;
if (RaceDescPtr->characteristics.special_energy_cost)
{
RaceDescPtr->ship_info.ship_flags |= POINT_DEFENSE;
if (RaceDescPtr->characteristics.special_energy_cost > MAX_DEFENSE)
RaceDescPtr->characteristics.special_energy_cost = MAX_DEFENSE;
}
}
static void
InitDriveSlots (RACE_DESCPTR RaceDescPtr, const BYTE *DriveSlots) {
COUNT i;
// NB. RaceDescPtr->characteristics.max_thrust is already initialised.
RaceDescPtr->characteristics.thrust_wait = 0;
for (i = 0; i < NUM_DRIVE_SLOTS; ++i)
{
switch (DriveSlots[i])
{
case FUSION_THRUSTER:
RaceDescPtr->characteristics.max_thrust += 2;
++RaceDescPtr->characteristics.thrust_wait;
break;
}
}
RaceDescPtr->characteristics.thrust_wait = (BYTE)(
THRUST_WAIT - (RaceDescPtr->characteristics.thrust_wait >> 1));
RaceDescPtr->characteristics.max_thrust =
((RaceDescPtr->characteristics.max_thrust /
RaceDescPtr->characteristics.thrust_increment) + 1)
* RaceDescPtr->characteristics.thrust_increment;
}
static void
InitJetSlots (RACE_DESCPTR RaceDescPtr, const BYTE *JetSlots) {
COUNT i;
for (i = 0; i < NUM_JET_SLOTS; ++i)
{
switch (JetSlots[i])
{
case TURNING_JETS:
RaceDescPtr->characteristics.turn_wait -= 2;
break;
}
}
}
RACE_DESCPTR RACE_DESCPTR
init_sis (void) init_sis (void)
{ {
@@ -747,6 +855,8 @@ init_sis (void)
/* copy initial ship settings to new_sis_desc */ /* copy initial ship settings to new_sis_desc */
new_sis_desc = sis_desc; new_sis_desc = sis_desc;
new_sis_desc.uninit_func = uninit_sis;
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE) if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE)
{ {
for (i = 0; i < NUM_VIEWS; ++i) for (i = 0; i < NUM_VIEWS; ++i)
@@ -773,56 +883,10 @@ init_sis (void)
new_sis_desc.postprocess_func = sis_battle_postprocess; new_sis_desc.postprocess_func = sis_battle_postprocess;
new_sis_desc.init_weapon_func = initialize_blasters; new_sis_desc.init_weapon_func = initialize_blasters;
new_sis_desc.cyborg_control.intelligence_func = new_sis_desc.cyborg_control.intelligence_func =
(void (*) (PVOID ShipPtr, PVOID ObjectsOfConcern, COUNT (void (*) (PVOID ShipPtr, PVOID ObjectsOfConcern,
ConcernCounter)) sis_intelligence; COUNT ConcernCounter)) sis_intelligence;
num_trackers = 0; InitModuleSlots(&new_sis_desc, GLOBAL_SIS (ModuleSlots));
for (i = 0; i < NUM_MODULE_SLOTS; ++i)
{
BYTE which_mod;
which_mod = GLOBAL_SIS (ModuleSlots[
(NUM_MODULE_SLOTS - 1) - i
]);
switch (which_mod)
{
case GUN_WEAPON:
case BLASTER_WEAPON:
case CANNON_WEAPON:
new_sis_desc.characteristics.weapon_energy_cost +=
(which_mod - GUN_WEAPON + 1) * 2;
if (i <= 1)
new_sis_desc.ship_info.ship_flags |= FIRES_FORE;
else if (i == 2)
new_sis_desc.ship_info.ship_flags |= FIRES_LEFT | FIRES_RIGHT;
else
new_sis_desc.ship_info.ship_flags |= FIRES_AFT;
break;
case TRACKING_SYSTEM:
++num_trackers;
break;
case ANTIMISSILE_DEFENSE:
++new_sis_desc.characteristics.special_energy_cost;
break;
case SHIVA_FURNACE:
++new_sis_desc.characteristics.energy_regeneration;
break;
case DYNAMO_UNIT:
if ((new_sis_desc.characteristics.energy_wait -= 2) < 4)
new_sis_desc.characteristics.energy_wait = 4;
break;
}
}
if (num_trackers > MAX_TRACKING)
num_trackers = MAX_TRACKING;
new_sis_desc.characteristics.weapon_energy_cost += num_trackers * 3;
if (new_sis_desc.characteristics.special_energy_cost)
{
new_sis_desc.ship_info.ship_flags |= POINT_DEFENSE;
if (new_sis_desc.characteristics.special_energy_cost > MAX_DEFENSE)
new_sis_desc.characteristics.special_energy_cost = MAX_DEFENSE;
}
if (GET_GAME_STATE (CHMMR_BOMB_STATE) == 3) if (GET_GAME_STATE (CHMMR_BOMB_STATE) == 3)
{ {
@@ -830,40 +894,21 @@ init_sis (void)
} }
} }
new_sis_desc.characteristics.thrust_wait = 0; InitDriveSlots(&new_sis_desc, GLOBAL_SIS (DriveSlots));
for (i = 0; i < NUM_DRIVE_SLOTS; ++i) InitJetSlots(&new_sis_desc, GLOBAL_SIS (JetSlots));
{
switch (GLOBAL_SIS (DriveSlots[i]))
{
case FUSION_THRUSTER:
new_sis_desc.characteristics.max_thrust += 2;
++new_sis_desc.characteristics.thrust_wait;
break;
}
}
new_sis_desc.characteristics.thrust_wait = (BYTE)(
THRUST_WAIT
- (new_sis_desc.characteristics.thrust_wait >> 1)
);
new_sis_desc.characteristics.max_thrust =
((new_sis_desc.characteristics.max_thrust /
new_sis_desc.characteristics.thrust_increment) + 1)
* new_sis_desc.characteristics.thrust_increment;
for (i = 0; i < NUM_JET_SLOTS; ++i) if (LOBYTE (GLOBAL (CurrentActivity)) == SUPER_MELEE)
{ {
switch (GLOBAL_SIS (JetSlots[i])) new_sis_desc.ship_info.crew_level = new_sis_desc.ship_info.max_crew;
{
case TURNING_JETS:
new_sis_desc.characteristics.turn_wait -= 2;
break;
} }
else
{
// Count the captain too.
new_sis_desc.ship_info.max_crew++;
new_sis_desc.ship_info.crew_level = GLOBAL_SIS (CrewEnlisted) + 1;
new_sis_desc.ship_info.ship_flags |= PLAYER_CAPTAIN;
} }
if (GLOBAL_SIS (CrewEnlisted) < MAX_CREW - 1)
new_sis_desc.ship_info.crew_level = (BYTE)(
GLOBAL_SIS (CrewEnlisted) + 1
);
new_sis_desc.ship_info.energy_level = new_sis_desc.ship_info.max_energy; new_sis_desc.ship_info.energy_level = new_sis_desc.ship_info.max_energy;
RaceDescPtr = &new_sis_desc; RaceDescPtr = &new_sis_desc;
@@ -871,3 +916,12 @@ init_sis (void)
return (RaceDescPtr); return (RaceDescPtr);
} }
void
uninit_sis (RACE_DESCPTR pRaceDesc)
{
GLOBAL_SIS (CrewEnlisted) = pRaceDesc->ship_info.crew_level;
if (pRaceDesc->ship_info.ship_flags & PLAYER_CAPTAIN)
GLOBAL_SIS (CrewEnlisted)--;
}
+6 -4
View File
@@ -45,7 +45,7 @@ static RACE_DESC slylandro_desc =
SEEKING_WEAPON | CREW_IMMUNE, SEEKING_WEAPON | CREW_IMMUNE,
17, /* Super Melee cost */ 17, /* Super Melee cost */
~0, /* Initial sphere of influence radius */ ~0, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
333, 9812, 333, 9812,
@@ -53,6 +53,7 @@ static RACE_DESC slylandro_desc =
(STRING)SLYLANDRO_RACE_STRINGS, (STRING)SLYLANDRO_RACE_STRINGS,
(FRAME)SLYLANDRO_ICON_MASK_PMAP_ANIM, (FRAME)SLYLANDRO_ICON_MASK_PMAP_ANIM,
(FRAME)SLYLANDRO_MICON_MASK_PMAP_ANIM, (FRAME)SLYLANDRO_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -98,9 +99,10 @@ static RACE_DESC slylandro_desc =
CLOSE_RANGE_WEAPON << 1, CLOSE_RANGE_WEAPON << 1,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -43,7 +43,7 @@ static RACE_DESC spathi_desc =
FIRES_FORE | FIRES_AFT | SEEKING_SPECIAL | DONT_CHASE, FIRES_FORE | FIRES_AFT | SEEKING_SPECIAL | DONT_CHASE,
18, /* Super Melee cost */ 18, /* Super Melee cost */
1000 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 1000 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
2549, 3600, 2549, 3600,
@@ -51,6 +51,7 @@ static RACE_DESC spathi_desc =
(STRING)SPATHI_RACE_STRINGS, (STRING)SPATHI_RACE_STRINGS,
(FRAME)SPATHI_ICON_MASK_PMAP_ANIM, (FRAME)SPATHI_ICON_MASK_PMAP_ANIM,
(FRAME)SPATHI_MICON_MASK_PMAP_ANIM, (FRAME)SPATHI_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -96,9 +97,10 @@ static RACE_DESC spathi_desc =
MISSILE_RANGE, MISSILE_RANGE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -45,7 +45,7 @@ static RACE_DESC supox_desc =
FIRES_FORE, FIRES_FORE,
16, /* Super Melee cost */ 16, /* Super Melee cost */
333 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 333 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
7468, 9246, 7468, 9246,
@@ -53,6 +53,7 @@ static RACE_DESC supox_desc =
(STRING)SUPOX_RACE_STRINGS, (STRING)SUPOX_RACE_STRINGS,
(FRAME)SUPOX_ICON_MASK_PMAP_ANIM, (FRAME)SUPOX_ICON_MASK_PMAP_ANIM,
(FRAME)SUPOX_MICON_MASK_PMAP_ANIM, (FRAME)SUPOX_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -98,9 +99,10 @@ static RACE_DESC supox_desc =
(MISSILE_SPEED * MISSILE_LIFE) >> 1, (MISSILE_SPEED * MISSILE_LIFE) >> 1,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -46,7 +46,7 @@ static RACE_DESC syreen_desc =
FIRES_FORE, FIRES_FORE,
13, /* Super Melee cost */ 13, /* Super Melee cost */
0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, SYREEN_MAX_CREW_SIZE, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
0, 0, 0, 0,
@@ -54,6 +54,7 @@ static RACE_DESC syreen_desc =
(STRING)SYREEN_RACE_STRINGS, (STRING)SYREEN_RACE_STRINGS,
(FRAME)SYREEN_ICON_MASK_PMAP_ANIM, (FRAME)SYREEN_ICON_MASK_PMAP_ANIM,
(FRAME)SYREEN_MICON_MASK_PMAP_ANIM, (FRAME)SYREEN_MICON_MASK_PMAP_ANIM,
MAX_CREW, SYREEN_MAX_CREW_SIZE,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -99,9 +100,10 @@ static RACE_DESC syreen_desc =
(MISSILE_SPEED * MISSILE_LIFE * 2 / 3), (MISSILE_SPEED * MISSILE_LIFE * 2 / 3),
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -46,7 +46,7 @@ static RACE_DESC thraddash_desc =
FIRES_FORE, FIRES_FORE,
10, /* Super Melee cost */ 10, /* Super Melee cost */
833 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 833 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
2535, 8358, 2535, 8358,
@@ -54,6 +54,7 @@ static RACE_DESC thraddash_desc =
(STRING)THRADDASH_RACE_STRINGS, (STRING)THRADDASH_RACE_STRINGS,
(FRAME)THRADDASH_ICON_MASK_PMAP_ANIM, (FRAME)THRADDASH_ICON_MASK_PMAP_ANIM,
(FRAME)THRADDASH_MICON_MASK_PMAP_ANIM, (FRAME)THRADDASH_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -99,9 +100,10 @@ static RACE_DESC thraddash_desc =
(MISSILE_SPEED * MISSILE_LIFE) >> 1, (MISSILE_SPEED * MISSILE_LIFE) >> 1,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -45,7 +45,7 @@ static RACE_DESC umgah_desc =
FIRES_FORE | IMMEDIATE_WEAPON, FIRES_FORE | IMMEDIATE_WEAPON,
7, /* Super Melee cost */ 7, /* Super Melee cost */
833 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 833 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
1798, 6000, 1798, 6000,
@@ -53,6 +53,7 @@ static RACE_DESC umgah_desc =
(STRING)UMGAH_RACE_STRINGS, (STRING)UMGAH_RACE_STRINGS,
(FRAME)UMGAH_ICON_MASK_PMAP_ANIM, (FRAME)UMGAH_ICON_MASK_PMAP_ANIM,
(FRAME)UMGAH_MICON_MASK_PMAP_ANIM, (FRAME)UMGAH_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -98,9 +99,10 @@ static RACE_DESC umgah_desc =
(LONG_RANGE_WEAPON << 2), (LONG_RANGE_WEAPON << 2),
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -47,7 +47,7 @@ static RACE_DESC urquan_desc =
FIRES_FORE | SEEKING_SPECIAL, FIRES_FORE | SEEKING_SPECIAL,
30, /* Super Melee cost */ 30, /* Super Melee cost */
2666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 2666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
5750, 6000, 5750, 6000,
@@ -55,6 +55,7 @@ static RACE_DESC urquan_desc =
(STRING)URQUAN_RACE_STRINGS, (STRING)URQUAN_RACE_STRINGS,
(FRAME)URQUAN_ICON_MASK_PMAP_ANIM, (FRAME)URQUAN_ICON_MASK_PMAP_ANIM,
(FRAME)URQUAN_MICON_MASK_PMAP_ANIM, (FRAME)URQUAN_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -100,9 +101,10 @@ static RACE_DESC urquan_desc =
MISSILE_SPEED * MISSILE_LIFE, MISSILE_SPEED * MISSILE_LIFE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -47,7 +47,7 @@ static RACE_DESC utwig_desc =
FIRES_FORE | POINT_DEFENSE | SHIELD_DEFENSE, FIRES_FORE | POINT_DEFENSE | SHIELD_DEFENSE,
22, /* Super Melee cost */ 22, /* Super Melee cost */
666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY >> 1, MAX_ENERGY, MAX_ENERGY >> 1, MAX_ENERGY,
{ {
8534, 8797, 8534, 8797,
@@ -55,6 +55,7 @@ static RACE_DESC utwig_desc =
(STRING)UTWIG_RACE_STRINGS, (STRING)UTWIG_RACE_STRINGS,
(FRAME)UTWIG_ICON_MASK_PMAP_ANIM, (FRAME)UTWIG_ICON_MASK_PMAP_ANIM,
(FRAME)UTWIG_MICON_MASK_PMAP_ANIM, (FRAME)UTWIG_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -100,9 +101,10 @@ static RACE_DESC utwig_desc =
CLOSE_RANGE_WEAPON, CLOSE_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -48,7 +48,7 @@ static RACE_DESC vux_desc =
FIRES_FORE | SEEKING_SPECIAL | IMMEDIATE_WEAPON, FIRES_FORE | SEEKING_SPECIAL | IMMEDIATE_WEAPON,
12, /* Super Melee cost */ 12, /* Super Melee cost */
900 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 900 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
4412, 1558, 4412, 1558,
@@ -56,6 +56,7 @@ static RACE_DESC vux_desc =
(STRING)VUX_RACE_STRINGS, (STRING)VUX_RACE_STRINGS,
(FRAME)VUX_ICON_MASK_PMAP_ANIM, (FRAME)VUX_ICON_MASK_PMAP_ANIM,
(FRAME)VUX_MICON_MASK_PMAP_ANIM, (FRAME)VUX_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -101,9 +102,10 @@ static RACE_DESC vux_desc =
CLOSE_RANGE_WEAPON, CLOSE_RANGE_WEAPON,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -45,7 +45,7 @@ static RACE_DESC yehat_desc =
FIRES_FORE | SHIELD_DEFENSE, FIRES_FORE | SHIELD_DEFENSE,
23, /* Super Melee cost */ 23, /* Super Melee cost */
750 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 750 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
4970, 40, 4970, 40,
@@ -53,6 +53,7 @@ static RACE_DESC yehat_desc =
(STRING)YEHAT_RACE_STRINGS, (STRING)YEHAT_RACE_STRINGS,
(FRAME)YEHAT_ICON_MASK_PMAP_ANIM, (FRAME)YEHAT_ICON_MASK_PMAP_ANIM,
(FRAME)YEHAT_MICON_MASK_PMAP_ANIM, (FRAME)YEHAT_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -98,9 +99,10 @@ static RACE_DESC yehat_desc =
MISSILE_SPEED * MISSILE_LIFE / 3, MISSILE_SPEED * MISSILE_LIFE / 3,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+6 -4
View File
@@ -46,7 +46,7 @@ static RACE_DESC zoqfotpik_desc =
FIRES_FORE, FIRES_FORE,
6, /* Super Melee cost */ 6, /* Super Melee cost */
320 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ 320 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */
MAX_CREW, MAX_CREW, 0, 0, /* Hack; old crew field */
MAX_ENERGY, MAX_ENERGY, MAX_ENERGY, MAX_ENERGY,
{ {
3761, 5333, 3761, 5333,
@@ -54,6 +54,7 @@ static RACE_DESC zoqfotpik_desc =
(STRING)ZOQFOTPIK_RACE_STRINGS, (STRING)ZOQFOTPIK_RACE_STRINGS,
(FRAME)ZOQFOTPIK_ICON_MASK_PMAP_ANIM, (FRAME)ZOQFOTPIK_ICON_MASK_PMAP_ANIM,
(FRAME)ZOQFOTPIK_MICON_MASK_PMAP_ANIM, (FRAME)ZOQFOTPIK_MICON_MASK_PMAP_ANIM,
MAX_CREW, MAX_CREW,
}, },
{ {
MAX_THRUST, MAX_THRUST,
@@ -99,9 +100,10 @@ static RACE_DESC zoqfotpik_desc =
MISSILE_RANGE, MISSILE_RANGE,
NULL_PTR, NULL_PTR,
}, },
NULL_PTR, (UNINIT_FUNC *) NULL,
NULL_PTR, (PREPROCESS_FUNC *) NULL,
NULL_PTR, (POSTPROCESS_FUNC *) NULL,
(INIT_WEAPON_FUNC *) NULL,
0, 0,
}; };
+53 -62
View File
@@ -152,9 +152,7 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect)
r.extent.height += pClipRect->corner.y & 1; r.extent.height += pClipRect->corner.y & 1;
SetContextClipRect (&r); SetContextClipRect (&r);
SetFrameHot (Screen, MAKE_HOT_SPOT ( SetFrameHot (Screen, MAKE_HOT_SPOT (
pClipRect->corner.x, pClipRect->corner.x, (pClipRect->corner.y & ~1)));
(pClipRect->corner.y & ~1)
));
} }
BatchGraphics (); BatchGraphics ();
@@ -170,10 +168,13 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect)
{ {
SIZE crew_height, energy_height; SIZE crew_height, energy_height;
crew_height = (((SIPtr->max_crew + 1) >> 1) << 1) + 1; #define MIN(a, b) (((a) <= (b)) ? (a) : (b))
crew_height = ((MIN(SIPtr->max_crew, MAX_CREW_SIZE) + 1) & ~1) + 1;
#undef MIN
energy_height = (((SIPtr->max_energy + 1) >> 1) << 1) + 1; energy_height = (((SIPtr->max_energy + 1) >> 1) << 1) + 1;
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x8, 0x8, 0x8), 0x1F)); SetContextForeGroundColor (
BUILD_COLOR (MAKE_RGB15 (0x8, 0x8, 0x8), 0x1F));
r.corner.x = CREW_XOFFS - 1; r.corner.x = CREW_XOFFS - 1;
r.corner.y = GAUGE_YOFFS + 1 + y; r.corner.y = GAUGE_YOFFS + 1 + y;
r.extent.width = STAT_WIDTH + 2; r.extent.width = STAT_WIDTH + 2;
@@ -191,7 +192,8 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect)
r.extent.width = 1; r.extent.width = 1;
r.extent.height = crew_height; r.extent.height = crew_height;
DrawFilledRectangle (&r); DrawFilledRectangle (&r);
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19)); SetContextForeGroundColor (
BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19));
r.corner.x = CREW_XOFFS - 1; r.corner.x = CREW_XOFFS - 1;
r.corner.y = GAUGE_YOFFS - crew_height + y; r.corner.y = GAUGE_YOFFS - crew_height + y;
r.extent.width = STAT_WIDTH + 2; r.extent.width = STAT_WIDTH + 2;
@@ -297,6 +299,8 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect)
SetContext (OldContext); SetContext (OldContext);
} }
// Pre: -crew_delta <= StarShipPtr->crew_level
// crew_delta <= StarShipPtr->max_crew - StarShipPtr->crew_level
void void
DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta, SIZE DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta, SIZE
energy_delta) energy_delta)
@@ -311,96 +315,83 @@ DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta, SIZE
ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info; ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info;
x = 0; x = 0;
y = GAUGE_YOFFS y = GAUGE_YOFFS + ((ShipInfoPtr->ship_flags & GOOD_GUY) ?
+ ((ShipInfoPtr->ship_flags & GOOD_GUY) ?
GOOD_GUY_YOFFS : BAD_GUY_YOFFS); GOOD_GUY_YOFFS : BAD_GUY_YOFFS);
r.extent.width = UNIT_WIDTH; r.extent.width = UNIT_WIDTH;
r.extent.height = UNIT_HEIGHT; r.extent.height = UNIT_HEIGHT;
if (crew_delta != 0) if (crew_delta != 0)
{ {
COUNT oldNumBlocks, newNumBlocks, blockI;
COUNT newCrewLevel;
#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
oldNumBlocks = MIN(ShipInfoPtr->crew_level, MAX_CREW_SIZE);
newCrewLevel = ShipInfoPtr->crew_level + crew_delta;
newNumBlocks = MIN(newCrewLevel, MAX_CREW_SIZE);
#undef MIN
if (crew_delta > 0) if (crew_delta > 0)
{ {
r.corner.y = (y + 1) - r.corner.y = (y + 1) -
(((ShipInfoPtr->crew_level + 1) >> 1) * (UNIT_HEIGHT + 1)); (((oldNumBlocks + 1) >> 1) * (UNIT_HEIGHT + 1));
if (StarShipPtr->captains_name_index == 0
&& (ShipInfoPtr->ship_flags & GOOD_GUY)
&& LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE)
{
// SIS in full game.
crew_delta = GLOBAL_SIS (CrewEnlisted);
if (crew_delta >= MAX_CREW_SIZE)
crew_delta = MAX_CREW_SIZE;
else /* if (crew_delta < MAX_CREW_SIZE) */
{
#define PLAYER_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0x1F), 0x09)
SetContextForeGroundColor (PLAYER_UNIT_COLOR);
r.corner.x = x + (CREW_XOFFS + 1);
if (!(ShipInfoPtr->crew_level & 1))
{
r.corner.x += UNIT_WIDTH + 1;
r.corner.y -= UNIT_HEIGHT + 1;
}
DrawFilledRectangle (&r);
++ShipInfoPtr->crew_level;
}
}
#define CREW_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02) #define CREW_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02)
#define ROBOT_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08) #define ROBOT_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08)
SetContextForeGroundColor ( SetContextForeGroundColor (
(ShipInfoPtr->ship_flags & CREW_IMMUNE) ? (ShipInfoPtr->ship_flags & CREW_IMMUNE) ?
ROBOT_UNIT_COLOR : CREW_UNIT_COLOR); ROBOT_UNIT_COLOR : CREW_UNIT_COLOR);
while (crew_delta--) for (blockI = oldNumBlocks; blockI < newNumBlocks; blockI++)
{ {
r.corner.x = x + (CREW_XOFFS + 1); r.corner.x = x + (CREW_XOFFS + 1);
if (!(ShipInfoPtr->crew_level & 1)) if (!(blockI & 1))
{ {
r.corner.x += UNIT_WIDTH + 1; r.corner.x += UNIT_WIDTH + 1;
r.corner.y -= UNIT_HEIGHT + 1; r.corner.y -= UNIT_HEIGHT + 1;
} }
DrawFilledRectangle (&r); DrawFilledRectangle (&r);
++ShipInfoPtr->crew_level;
} }
} }
else /* crew_delta < 0 */ else /* crew_delta < 0 */
{ {
if (StarShipPtr->captains_name_index == 0
&& (ShipInfoPtr->ship_flags & GOOD_GUY)
&& LOBYTE (GLOBAL (CurrentActivity)) != SUPER_MELEE)
{
COUNT death_count;
death_count = (COUNT)-crew_delta;
if (GLOBAL_SIS (CrewEnlisted) >= death_count)
{
GLOBAL_SIS (CrewEnlisted) -= death_count;
death_count = 0;
}
else
{
death_count -= GLOBAL_SIS (CrewEnlisted);
GLOBAL_SIS (CrewEnlisted) = 0;
}
DrawBattleCrewAmount (StarShipPtr,
(BOOLEAN)(death_count == 0));
}
SetContextForeGroundColor (BLACK_COLOR); SetContextForeGroundColor (BLACK_COLOR);
r.corner.y = (y + 1) - r.corner.y = (y + 1) -
(((ShipInfoPtr->crew_level + 2) >> 1) * (UNIT_HEIGHT + 1)); (((oldNumBlocks + 2) >> 1) * (UNIT_HEIGHT + 1));
do for (blockI = oldNumBlocks; blockI > newNumBlocks; blockI--)
{ {
r.corner.x = x + (CREW_XOFFS + 1 + UNIT_WIDTH + 1); r.corner.x = x + (CREW_XOFFS + 1 + UNIT_WIDTH + 1);
if (!(ShipInfoPtr->crew_level & 1)) if (!(blockI & 1))
{ {
r.corner.x -= UNIT_WIDTH + 1; r.corner.x -= UNIT_WIDTH + 1;
r.corner.y += UNIT_HEIGHT + 1; r.corner.y += UNIT_HEIGHT + 1;
} }
DrawFilledRectangle (&r); DrawFilledRectangle (&r);
--ShipInfoPtr->crew_level; }
} while (++crew_delta); }
if (ShipInfoPtr->ship_flags & PLAYER_CAPTAIN) {
if (((ShipInfoPtr->crew_level > MAX_CREW_SIZE) !=
(newCrewLevel > MAX_CREW_SIZE) ||
ShipInfoPtr->crew_level == 0) && newCrewLevel != 0)
{
// The block indicating the captain needs to change color.
#define PLAYER_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0x1F), 0x09)
SetContextForeGroundColor (
(newCrewLevel > MAX_CREW_SIZE) ?
CREW_UNIT_COLOR : PLAYER_UNIT_COLOR);
r.corner.x = x + (CREW_XOFFS + 1) + (UNIT_WIDTH + 1);
r.corner.y = y - UNIT_HEIGHT;
DrawFilledRectangle (&r);
}
}
ShipInfoPtr->crew_level = newCrewLevel;
if (ShipInfoPtr->max_crew > MAX_CREW_SIZE ||
ShipInfoPtr->ship_flags & PLAYER_CAPTAIN)
{
// All crew doesn't fit in the graphics; print a number.
// Always print a number for the SIS in the full game.
DrawBattleCrewAmount (StarShipPtr);
} }
} }
+4 -10
View File
@@ -149,6 +149,7 @@ SpinStarShip (HSTARSHIP hStarShip)
} }
#endif #endif
// Count the ships which can be built by the player.
static COUNT static COUNT
GetAvailableRaceCount (void) GetAvailableRaceCount (void)
{ {
@@ -382,9 +383,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr)
while (hStarShip) while (hStarShip)
{ {
StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip ( StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip (
&GLOBAL (built_ship_q), &GLOBAL (built_ship_q), hStarShip);
hStarShip
);
if (GET_GROUP_LOC (StarShipPtr) > which_window) if (GET_GROUP_LOC (StarShipPtr) > which_window)
{ {
UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
@@ -407,9 +406,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr)
for (i = 0; i < num_ships; ++i) for (i = 0; i < num_ships; ++i)
{ {
StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip ( StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip (
&GLOBAL (built_ship_q), &GLOBAL (built_ship_q), hStarShip);
hStarShip
);
hNextShip = _GetSuccLink (StarShipPtr); hNextShip = _GetSuccLink (StarShipPtr);
pship_win_info->StarShipPtr = StarShipPtr; pship_win_info->StarShipPtr = StarShipPtr;
@@ -435,10 +432,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr)
(which_window / HANGAR_SHIPS_ROW)); (which_window / HANGAR_SHIPS_ROW));
++pship_win_info; ++pship_win_info;
UnlockStarShip ( UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
&GLOBAL (built_ship_q),
hStarShip
);
hStarShip = hNextShip; hStarShip = hNextShip;
} }
} }
+13 -3
View File
@@ -1565,14 +1565,18 @@ SetFlashRect (PRECT pRect, FRAME f)
SetContext (OldContext); SetContext (OldContext);
} }
void void
SaveFlagshipState (void) SaveFlagshipState (void)
{ {
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE) if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE)
{ {
// Player is in HyperSpace or QuasiSpace.
// Update 'GLOBAL (ShipStamp.frame)' to the direction the flagship
// is facing.
HELEMENT hElement, hNextElement; HELEMENT hElement, hNextElement;
// Find the flagship element.
for (hElement = GetHeadElement (); for (hElement = GetHeadElement ();
hElement != 0; hElement = hNextElement) hElement != 0; hElement = hNextElement)
{ {
@@ -1586,8 +1590,7 @@ SaveFlagshipState (void)
GetElementStarShip (ElementPtr, &StarShipPtr); GetElementStarShip (ElementPtr, &StarShipPtr);
GLOBAL (ShipStamp.frame) = (FRAME)MAKE_DWORD ( GLOBAL (ShipStamp.frame) = (FRAME)MAKE_DWORD (
StarShipPtr->ShipFacing + 1, 0 StarShipPtr->ShipFacing + 1, 0);
);
hNextElement = 0; hNextElement = 0;
} }
UnlockElement (hElement); UnlockElement (hElement);
@@ -1595,6 +1598,7 @@ SaveFlagshipState (void)
} }
else if (pSolarSysState) else if (pSolarSysState)
{ {
// Player is in a solar system.
UWORD index1, index2; UWORD index1, index2;
FRAME frame; FRAME frame;
@@ -1604,7 +1608,9 @@ SaveFlagshipState (void)
{ {
index1 = GetFrameIndex (frame) + 1; index1 = GetFrameIndex (frame) + 1;
if (pSolarSysState->pBaseDesc == pSolarSysState->PlanetDesc) if (pSolarSysState->pBaseDesc == pSolarSysState->PlanetDesc)
{
index2 = 0; index2 = 0;
}
else else
{ {
index2 = (UWORD)(pSolarSysState->pBaseDesc->pPrevDesc index2 = (UWORD)(pSolarSysState->pBaseDesc->pPrevDesc
@@ -1615,6 +1621,9 @@ SaveFlagshipState (void)
} }
else else
{ {
// In orbit around a planet.
// Update the starinfo.dat file if necessary.
if (GET_GAME_STATE (PLANETARY_CHANGE)) if (GET_GAME_STATE (PLANETARY_CHANGE))
{ {
PutPlanetInfo (); PutPlanetInfo ();
@@ -1635,3 +1644,4 @@ SaveFlagshipState (void)
} }
} }
+3 -2
View File
@@ -246,9 +246,10 @@ GetPlanetInfo (void)
{ {
PVOID fp; PVOID fp;
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] = pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] = 0;
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[MINERAL_SCAN] = pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[MINERAL_SCAN] = 0;
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN] = 0; pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN] = 0;
fp = OpenStateFile (STARINFO_FILE, "rb"); fp = OpenStateFile (STARINFO_FILE, "rb");
if (fp) if (fp)
{ {
+15 -7
View File
@@ -114,7 +114,7 @@ CaptainsWindow (CAPTAIN_STUFFPTR CSPtr, COORD y, ELEMENT_FLAGS
} }
void void
DrawBattleCrewAmount (STARSHIPPTR StarShipPtr, BOOLEAN CountPlayer) DrawBattleCrewAmount (STARSHIPPTR StarShipPtr)
{ {
#define MAX_CREW_DIGITS 3 #define MAX_CREW_DIGITS 3
RECT r; RECT r;
@@ -136,7 +136,7 @@ DrawBattleCrewAmount (STARSHIPPTR StarShipPtr, BOOLEAN CountPlayer)
r.extent.width = 6 * MAX_CREW_DIGITS + 6; r.extent.width = 6 * MAX_CREW_DIGITS + 6;
r.extent.height = 5; r.extent.height = 5;
sprintf (buf, "%u", GLOBAL_SIS (CrewEnlisted) + (CountPlayer ? 1 : 0)); sprintf (buf, "%u", StarShipPtr->RaceDescPtr->ship_info.crew_level);
SetContextFont (StarConFont); SetContextFont (StarConFont);
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08)); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08));
@@ -247,6 +247,7 @@ DrawCaptainsWindow (STARSHIPPTR StarShipPtr)
{ {
if (RDPtr->ship_info.ship_flags & GOOD_GUY) if (RDPtr->ship_info.ship_flags & GOOD_GUY)
{ {
// SIS
TEXT t; TEXT t;
t.baseline.x = STATUS_WIDTH >> 1; t.baseline.x = STATUS_WIDTH >> 1;
@@ -254,12 +255,19 @@ DrawCaptainsWindow (STARSHIPPTR StarShipPtr)
t.align = ALIGN_CENTER; t.align = ALIGN_CENTER;
t.pStr = GLOBAL_SIS (CommanderName); t.pStr = GLOBAL_SIS (CommanderName);
t.CharCount = (COUNT)~0; t.CharCount = (COUNT)~0;
DrawBattleCrewAmount (StarShipPtr, TRUE); SetContextForeGroundColor (
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02)); BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02));
SetContextFont (TinyFont); SetContextFont (TinyFont);
font_DrawText (&t); font_DrawText (&t);
} }
} }
if (RDPtr->ship_info.max_crew > MAX_CREW_SIZE ||
RDPtr->ship_info.ship_flags & PLAYER_CAPTAIN)
{
// All crew doesn't fit in the graphics; print a number.
// Always print a number for the SIS in the full game.
DrawBattleCrewAmount (StarShipPtr);
}
UnbatchGraphics (); UnbatchGraphics ();
} }
@@ -322,7 +330,7 @@ DeltaCrew (ELEMENTPTR ElementPtr, SIZE crew_delta)
ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info; ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info;
ElementPtr->crew_level += (BYTE)crew_delta; ElementPtr->crew_level += crew_delta;
if (ElementPtr->crew_level > ShipInfoPtr->max_crew) if (ElementPtr->crew_level > ShipInfoPtr->max_crew)
{ {
crew_delta = ShipInfoPtr->max_crew - ShipInfoPtr->crew_level; crew_delta = ShipInfoPtr->max_crew - ShipInfoPtr->crew_level;
@@ -331,8 +339,8 @@ DeltaCrew (ELEMENTPTR ElementPtr, SIZE crew_delta)
} }
else if (crew_delta < 0) else if (crew_delta < 0)
{ {
if (ElementPtr->crew_level > (BYTE)-crew_delta) if (ElementPtr->crew_level > (COUNT)-crew_delta)
ElementPtr->crew_level += (BYTE)crew_delta; ElementPtr->crew_level += crew_delta;
else else
{ {
crew_delta = -(SIZE)ElementPtr->crew_level; crew_delta = -(SIZE)ElementPtr->crew_level;
+10 -1
View File
@@ -73,8 +73,14 @@ new_ship (PELEMENT DeadShipPtr)
DeadStarShipPtr->RaceDescPtr->ship_info.crew_level; DeadStarShipPtr->RaceDescPtr->ship_info.crew_level;
if (DeadStarShipPtr->special_counter) if (DeadStarShipPtr->special_counter)
{ {
// We've just warped out. new_ship() will still be called
// a few times, to process the trace left behind (I assume).
StopMusic (); StopMusic ();
DeadStarShipPtr->RaceDescPtr->ship_info.crew_level = 0;
// Even after much investigation, I could find no purpose for
// the next line, but with the crew management changes I need
// it not to be here. - SvdB
// DeadStarShipPtr->RaceDescPtr->ship_info.crew_level = 0;
} }
MusicStarted = FALSE; MusicStarted = FALSE;
@@ -144,6 +150,9 @@ new_ship (PELEMENT DeadShipPtr)
SetElementStarShip (DeadShipPtr, 0); SetElementStarShip (DeadShipPtr, 0);
RestartMusic = OpponentAlive (DeadStarShipPtr); RestartMusic = OpponentAlive (DeadStarShipPtr);
if (DeadStarShipPtr->RaceDescPtr->uninit_func != NULL)
(*DeadStarShipPtr->RaceDescPtr->uninit_func) (
DeadStarShipPtr->RaceDescPtr);
free_ship (DeadStarShipPtr, TRUE); free_ship (DeadStarShipPtr, TRUE);
UnbatchGraphics (); UnbatchGraphics ();
if (GetNextStarShip (DeadStarShipPtr, if (GetNextStarShip (DeadStarShipPtr,
+2 -1
View File
@@ -1271,7 +1271,8 @@ resetCrewBattle(void) {
COUNT delta; COUNT delta;
CONTEXT OldContext; CONTEXT OldContext;
if (!(GLOBAL (CurrentActivity) & IN_BATTLE)) if (!(GLOBAL (CurrentActivity) & IN_BATTLE) ||
(LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE))
return; return;
StarShipPtr = findPlayerShip (GOOD_GUY); StarShipPtr = findPlayerShip (GOOD_GUY);