From a5bea873135e9bcb24f45ea4c861505ab11aacbc Mon Sep 17 00:00:00 2001 From: meep-eep Date: Sat, 11 Mar 2006 08:11:53 +0000 Subject: [PATCH] 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 --- sc2/ChangeLog | 3 + sc2/src/sc2code/battle.c | 25 +-- sc2/src/sc2code/build.c | 8 +- sc2/src/sc2code/build.h | 7 +- sc2/src/sc2code/element.h | 3 +- sc2/src/sc2code/encount.c | 70 +++---- sc2/src/sc2code/globdata.c | 3 +- sc2/src/sc2code/globdata.h | 13 ++ sc2/src/sc2code/grpinfo.c | 16 +- sc2/src/sc2code/hyper.c | 8 +- sc2/src/sc2code/init.c | 30 ++- sc2/src/sc2code/libs/input/sdl/input.c | 2 +- sc2/src/sc2code/load.c | 43 +++- sc2/src/sc2code/pickmele.c | 31 +-- sc2/src/sc2code/pickship.c | 37 ++-- sc2/src/sc2code/planets/genchmmr.c | 2 +- sc2/src/sc2code/planets/gendru.c | 2 +- sc2/src/sc2code/planets/genilw.c | 2 +- sc2/src/sc2code/planets/genmyc.c | 3 +- sc2/src/sc2code/planets/genorz.c | 2 +- sc2/src/sc2code/planets/genpet.c | 2 +- sc2/src/sc2code/planets/genpku.c | 2 +- sc2/src/sc2code/planets/gensam.c | 2 +- sc2/src/sc2code/planets/genshof.c | 11 +- sc2/src/sc2code/planets/genspa.c | 2 +- sc2/src/sc2code/planets/gensup.c | 2 +- sc2/src/sc2code/planets/genthrad.c | 2 +- sc2/src/sc2code/planets/genutw.c | 2 +- sc2/src/sc2code/planets/genvux.c | 2 +- sc2/src/sc2code/planets/genyeh.c | 2 +- sc2/src/sc2code/planets/genzoq.c | 6 +- sc2/src/sc2code/process.c | 27 +-- sc2/src/sc2code/races.h | 50 ++++- sc2/src/sc2code/save.c | 57 +++++- sc2/src/sc2code/ship.c | 50 +++-- sc2/src/sc2code/ships/androsyn/androsyn.c | 16 +- sc2/src/sc2code/ships/arilou/arilou.c | 10 +- sc2/src/sc2code/ships/blackurq/blackurq.c | 10 +- sc2/src/sc2code/ships/chenjesu/chenjesu.c | 10 +- sc2/src/sc2code/ships/chmmr/chmmr.c | 10 +- sc2/src/sc2code/ships/druuge/druuge.c | 10 +- sc2/src/sc2code/ships/human/human.c | 10 +- sc2/src/sc2code/ships/ilwrath/ilwrath.c | 10 +- sc2/src/sc2code/ships/lastbat/lastbat.c | 10 +- sc2/src/sc2code/ships/melnorme/melnorme.c | 10 +- sc2/src/sc2code/ships/mmrnmhrm/mmrnmhrm.c | 10 +- sc2/src/sc2code/ships/mycon/mycon.c | 10 +- sc2/src/sc2code/ships/orz/orz.c | 10 +- sc2/src/sc2code/ships/pkunk/pkunk.c | 10 +- sc2/src/sc2code/ships/probe/probe.c | 10 +- sc2/src/sc2code/ships/shofixti/shofixti.c | 10 +- sc2/src/sc2code/ships/sis_ship/sis_ship.c | 226 ++++++++++++++-------- sc2/src/sc2code/ships/slylandr/slylandr.c | 10 +- sc2/src/sc2code/ships/spathi/spathi.c | 10 +- sc2/src/sc2code/ships/supox/supox.c | 10 +- sc2/src/sc2code/ships/syreen/syreen.c | 10 +- sc2/src/sc2code/ships/thradd/thradd.c | 10 +- sc2/src/sc2code/ships/umgah/umgah.c | 10 +- sc2/src/sc2code/ships/urquan/urquan.c | 10 +- sc2/src/sc2code/ships/utwig/utwig.c | 10 +- sc2/src/sc2code/ships/vux/vux.c | 10 +- sc2/src/sc2code/ships/yehat/yehat.c | 10 +- sc2/src/sc2code/ships/zoqfot/zoqfot.c | 10 +- sc2/src/sc2code/shipstat.c | 115 +++++------ sc2/src/sc2code/shipyard.c | 14 +- sc2/src/sc2code/sis.c | 16 +- sc2/src/sc2code/state.c | 17 +- sc2/src/sc2code/status.c | 22 ++- sc2/src/sc2code/tactrans.c | 11 +- sc2/src/sc2code/uqmdebug.c | 3 +- 70 files changed, 742 insertions(+), 487 deletions(-) diff --git a/sc2/ChangeLog b/sc2/ChangeLog index 1facb169e..dbe7c8fd7 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,7 @@ 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 - More documentation - SvdB. - RMPLIFIED PRECURSOR BOMB is now AMPLIFIED, from Vorn (bug #812) diff --git a/sc2/src/sc2code/battle.c b/sc2/src/sc2code/battle.c index e7478720a..7284eb6ba 100644 --- a/sc2/src/sc2code/battle.c +++ b/sc2/src/sc2code/battle.c @@ -66,19 +66,6 @@ ProcessInput (void) JournalInput (InputState); #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; if (CyborgDescPtr->RaceDescPtr->ship_info.crew_level) { @@ -94,12 +81,14 @@ if ((InputState & DEVICE_BUTTON3) if (InputState & BATTLE_SPECIAL) CyborgDescPtr->ship_input_state |= SPECIAL; - if (CanRunAway && cur_player == 0 && (InputState & BATTLE_ESCAPE)) + if (CanRunAway && cur_player == 0 && + (InputState & BATTLE_ESCAPE)) { ELEMENTPTR 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->state_flags & FINITE_LIFE) && ElementPtr->mass_points != MAX_SHIP_MASS * 10 @@ -118,8 +107,10 @@ if ((InputState & DEVICE_BUTTON3) ~(SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED); SetPrimColor (&DisplayArray[ElementPtr->PrimIndex], - BUILD_COLOR (MAKE_RGB15 (0xB, 0x00, 0x00), 0x2E)); - SetPrimType (&DisplayArray[ElementPtr->PrimIndex], STAMPFILL_PRIM); + BUILD_COLOR ( + MAKE_RGB15 (0xB, 0x00, 0x00), 0x2E)); + SetPrimType (&DisplayArray[ + ElementPtr->PrimIndex], STAMPFILL_PRIM); CyborgDescPtr->ship_input_state = 0; } diff --git a/sc2/src/sc2code/build.c b/sc2/src/sc2code/build.c index 9c7fd5c26..46fe36603 100644 --- a/sc2/src/sc2code/build.c +++ b/sc2/src/sc2code/build.c @@ -383,14 +383,16 @@ NameCaptain (PQUEUE pQueue, STARSHIPPTR StarShipPtr) return name_index; } +// crew_level can be set to INFINITE_FLEET for a ship which is to +// represent an infinite number of ships. HSTARSHIP -CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue, BYTE crew_level) +CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue, COUNT crew_level) { HSTARSHIP hStarShip, hBuiltShip; SHIP_FRAGMENTPTR TemplatePtr; - if ((hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), - shipIndex)) == 0) + hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), shipIndex); + if (hStarShip == 0) return 0; TemplatePtr = (SHIP_FRAGMENTPTR)LockStarShip ( diff --git a/sc2/src/sc2code/build.h b/sc2/src/sc2code/build.h index cbea2d1c5..a060d6524 100644 --- a/sc2/src/sc2code/build.h +++ b/sc2/src/sc2code/build.h @@ -45,8 +45,8 @@ extern HSTARSHIP Build (PQUEUE pQueue, DWORD RaceResIndex, COUNT which_player, BYTE captains_name_index); -extern HSTARSHIP CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue, BYTE - crew_level); +extern HSTARSHIP CloneShipFragment (COUNT shipIndex, PQUEUE pDstQueue, + COUNT crew_level); extern HSTARSHIP GetStarShipFromIndex (PQUEUE pShipQ, COUNT Index); 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 DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta, SIZE energy_delta); -extern void DrawBattleCrewAmount (STARSHIPPTR StarShipPtr, - BOOLEAN CountPlayer); +extern void DrawBattleCrewAmount (STARSHIPPTR StarShipPtr); #endif /* _BUILD_H */ diff --git a/sc2/src/sc2code/element.h b/sc2/src/sc2code/element.h index 3cc888bba..249735bfe 100644 --- a/sc2/src/sc2code/element.h +++ b/sc2/src/sc2code/element.h @@ -105,7 +105,8 @@ typedef struct element ELEMENT_FLAGS state_flags; COUNT life_span; - BYTE crew_level, mass_points; + COUNT crew_level; + BYTE mass_points; BYTE turn_wait, thrust_wait; VELOCITY_DESC velocity; INTERSECT_CONTROL IntersectControl; diff --git a/sc2/src/sc2code/encount.c b/sc2/src/sc2code/encount.c index 291e11bd0..e1f2acaaf 100644 --- a/sc2/src/sc2code/encount.c +++ b/sc2/src/sc2code/encount.c @@ -130,57 +130,37 @@ BuildBattle (COUNT which_player) hBuiltShip = Build (&race_q[which_player], GET_RACE_ID (FragPtr) == SAMATRA_SHIP ? SAMATRA_RES_INDEX : FragPtr->RaceResIndex, - 1 << which_player, - StarShipCaptain (FragPtr)); + 1 << which_player, StarShipCaptain (FragPtr)); if (hBuiltShip) { - BuiltShipPtr = LockStarShip ( - &race_q[which_player], - hBuiltShip - ); + BuiltShipPtr = LockStarShip (&race_q[which_player], hBuiltShip); BuiltShipPtr->captains_name_index = StarShipCaptain (BuiltShipPtr); BuiltShipPtr->cur_status_flags = StarShipPlayer (BuiltShipPtr); - if (FragPtr->ShipInfo.crew_level != (BYTE)~0) + if (FragPtr->ShipInfo.crew_level != INFINITE_FLEET) BuiltShipPtr->special_counter = FragPtr->ShipInfo.crew_level; else /* if infinite ships */ BuiltShipPtr->special_counter = FragPtr->ShipInfo.max_crew; - BuiltShipPtr->RaceDescPtr = - (RACE_DESCPTR)&FragPtr->ShipInfo; + BuiltShipPtr->RaceDescPtr = (RACE_DESCPTR)&FragPtr->ShipInfo; - UnlockStarShip ( - &race_q[which_player], - hBuiltShip - ); + UnlockStarShip (&race_q[which_player], hBuiltShip); } UnlockStarShip (pQueue, hStarShip); } if (which_player == 0 - && (hBuiltShip = Build (&race_q[0], - SIS_RES_INDEX, GOOD_GUY, 0))) + && (hBuiltShip = Build (&race_q[0], SIS_RES_INDEX, GOOD_GUY, 0))) { - BuiltShipPtr = LockStarShip ( - &race_q[0], - hBuiltShip - ); - BuiltShipPtr->captains_name_index = - StarShipCaptain (BuiltShipPtr); - 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 = LockStarShip (&race_q[0], hBuiltShip); + BuiltShipPtr->captains_name_index = StarShipCaptain (BuiltShipPtr); + BuiltShipPtr->cur_status_flags = StarShipPlayer (BuiltShipPtr); + BuiltShipPtr->special_counter = 0; + // Crew will be copied directly from + // GLOBAL_SIS (CrewEnlisted) later. BuiltShipPtr->energy_counter = MAX_ENERGY_SIZE; - UnlockStarShip ( - &race_q[0], - hBuiltShip - ); + UnlockStarShip (&race_q[0], hBuiltShip); } } @@ -273,15 +253,15 @@ InitEncounter (void) HSTARSHIP hStarShip, hNextShip; POINT display_pt[] = { - {10, 51}, - {-10, 51}, - {33, 40}, - {-33, 40}, - {49, 18}, - {-49, 18}, - {52, -6}, - {-52, -6}, - {44, -27}, + { 10, 51}, + {-10, 51}, + { 33, 40}, + {-33, 40}, + { 49, 18}, + {-49, 18}, + { 52, -6}, + {-52, -6}, + { 44, -27}, {-44, -27}, }; @@ -292,7 +272,8 @@ InitEncounter (void) STARSHIPPTR StarShipPtr; 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); else /* if infinite ships */ hNextShip = hStarShip; @@ -311,8 +292,7 @@ InitEncounter (void) s.origin.y = SINE (angle, radius); } s.frame = SetAbsFrameIndex ( - StarShipPtr->RaceDescPtr->ship_info.icons, 0 - ); + StarShipPtr->RaceDescPtr->ship_info.icons, 0); GetFrameRect (s.frame, &r); s.origin.x += (SIS_SCREEN_WIDTH >> 1) - (r.extent.width >> 1); s.origin.y += (SIS_SCREEN_HEIGHT >> 1) - (r.extent.height >> 1); diff --git a/sc2/src/sc2code/globdata.c b/sc2/src/sc2code/globdata.c index 802ffd2f0..e366a27a6 100644 --- a/sc2/src/sc2code/globdata.c +++ b/sc2/src/sc2code/globdata.c @@ -167,7 +167,7 @@ InitSIS (void) ship_ref = MAKE_RESOURCE (rp++, rt, ri++); else if (i == num_ships - 2) ship_ref = YEHAT_SHIP_INDEX; - else + else /* (i == num_ships - 1) */ ship_ref = PROBE_RES_INDEX; hStarShip = Build (&GLOBAL (avail_race_q), ship_ref, 0, 0); if (hStarShip) @@ -190,6 +190,7 @@ InitSIS (void) } else { + // Ur-Quan probe. load_ship ((STARSHIPPTR)FragPtr, FALSE); FragPtr->ShipInfo = FragPtr->RaceDescPtr->ship_info; FragPtr->RaceDescPtr->ship_info.melee_icon = 0; diff --git a/sc2/src/sc2code/globdata.h b/sc2/src/sc2code/globdata.h index bbaad2320..444a8d916 100644 --- a/sc2/src/sc2code/globdata.h +++ b/sc2/src/sc2code/globdata.h @@ -210,6 +210,11 @@ START_GAME_STATE */ ADD_GAME_STATE (PLANETARY_LANDING, 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 */ ADD_GAME_STATE (SPATHI_VISITS, 3) @@ -741,6 +746,14 @@ START_GAME_STATE ADD_GAME_STATE (UMGAH_MENTIONED_TRICKS, 2) 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_INTRO, 2) ADD_GAME_STATE (THRADD_DEMEANOR, 3) diff --git a/sc2/src/sc2code/grpinfo.c b/sc2/src/sc2code/grpinfo.c index 21934d4f2..2fc268c55 100644 --- a/sc2/src/sc2code/grpinfo.c +++ b/sc2/src/sc2code/grpinfo.c @@ -227,8 +227,8 @@ FoundHome: { if (Index <= LONIBBLE (EncounterMakeup[BestIndex]) || (COUNT)TFB_Random () % 100 < 50) - CloneShipFragment (BestIndex, &GLOBAL (npc_built_ship_q), - 0); + CloneShipFragment (BestIndex, + &GLOBAL (npc_built_ship_q), 0); } PutGroupInfo (0L, ++which_group); @@ -261,16 +261,14 @@ FlushGroupInfo (GROUP_HEADER *pGH, DWORD offset, BYTE which_group, PVOID fp) for (hStarShip = GetHeadLink (&temp_q); hStarShip; hStarShip = hNextShip) { - BYTE crew_level; + COUNT crew_level; FragPtr = (SHIP_FRAGMENTPTR)LockStarShip ( &temp_q, hStarShip); hNextShip = _GetSuccLink (FragPtr); crew_level = FragPtr->ShipInfo.crew_level; which_group = GET_GROUP_ID (FragPtr); - UnlockStarShip ( - &temp_q, hStarShip - ); + UnlockStarShip (&temp_q, hStarShip); if (crew_level == 0) { @@ -590,9 +588,7 @@ GetGroupInfo (DWORD offset, BYTE which_group) NAME_OFFSET + NUM_CAPTAINS_NAMES + 1; OwnStarShip (FragPtr, BAD_GUY, captains_name_index); } - UnlockStarShip ( - &GLOBAL (npc_built_ship_q), hStarShip - ); + UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); } else { @@ -631,6 +627,8 @@ PutGroupInfo (DWORD offset, BYTE which_group) GH.GroupOffset[0] = 0; SeekStateFile (fp, offset, SEEK_SET); WriteStateFile (&GH, sizeof (GH), 1, fp); + // XXX: It seems that GH is not completely initialised. + // Some garbage is saved. -- SvdB } if (which_group) diff --git a/sc2/src/sc2code/hyper.c b/sc2/src/sc2code/hyper.c index 3e7fa93a5..eeaf5d262 100644 --- a/sc2/src/sc2code/hyper.c +++ b/sc2/src/sc2code/hyper.c @@ -251,10 +251,7 @@ check_hyperspace_encounter (void) } } - UnlockStarShip ( - &GLOBAL (avail_race_q), - hStarShip - ); + UnlockStarShip (&GLOBAL (avail_race_q), hStarShip); } SET_GAME_STATE (USED_BROADCASTER, 0); @@ -952,8 +949,7 @@ AddEncounterElement (ENCOUNTERPTR EncounterPtr, EncounterPtr->SD.Index = MAKE_BYTE ( - NumShips, HINIBBLE (EncounterPtr->SD.Index) - ); + NumShips, HINIBBLE (EncounterPtr->SD.Index)); for (i = 0; i < NumShips; ++i) { HSTARSHIP hStarShip; diff --git a/sc2/src/sc2code/init.c b/sc2/src/sc2code/init.c index 162a26337..39ddd6c56 100644 --- a/sc2/src/sc2code/init.c +++ b/sc2/src/sc2code/init.c @@ -205,7 +205,19 @@ UninitShips (void) for (i = 0; i < NUM_PLAYERS; ++i) SPtr[i] = 0; + // Count the crew floating in space. 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 (); hElement != 0; hElement = hNextElement) { @@ -214,14 +226,20 @@ UninitShips (void) LockElement (hElement, &ElementPtr); hNextElement = GetSuccElement (ElementPtr); - if (ElementPtr->state_flags & CREW_OBJECT) - ++crew_retrieved; - else if ((ElementPtr->state_flags & PLAYER_SHIP) + if ((ElementPtr->state_flags & PLAYER_SHIP) || ElementPtr->death_func == new_ship) { STARSHIPPTR 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->RaceDescPtr->ship_info.var2; StarShipPtr->special_counter = @@ -243,12 +261,7 @@ UninitShips (void) for (i = NUM_PLAYERS - 1; i >= 0; --i) { if (SPtr[i]) - { - if (SPtr[i]->special_counter) - SPtr[i]->special_counter += crew_retrieved; - GetEncounterStarShip (SPtr[i], i); - } } } @@ -262,3 +275,4 @@ UninitShips (void) } } + diff --git a/sc2/src/sc2code/libs/input/sdl/input.c b/sc2/src/sc2code/libs/input/sdl/input.c index 346ded68c..56f665709 100644 --- a/sc2/src/sc2code/libs/input/sdl/input.c +++ b/sc2/src/sc2code/libs/input/sdl/input.c @@ -81,7 +81,7 @@ static VControl_NameBinding control_names[] = { { "Exit", (int *)&ImmediateInputState.key[KEY_EXIT] }, { "Abort", (int *)&ImmediateInputState.key[KEY_ABORT] }, { "Debug", (int *)&ImmediateInputState.key[KEY_DEBUG] }, - { "Illegal", NULL}}; + { "Illegal", NULL}}; static void diff --git a/sc2/src/sc2code/load.c b/sc2/src/sc2code/load.c index 2fabf56bb..643d5216e 100644 --- a/sc2/src/sc2code/load.c +++ b/sc2/src/sc2code/load.c @@ -74,6 +74,13 @@ LoadShipQueue (DECODE_REF fh, PQUEUE pQueue, BOOLEAN MakeQ) Ptr = ((PBYTE)&FragPtr->ShipInfo) - Offset; cread ((PBYTE)Ptr, ((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) { 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 LoadSummary (uio_Stream *in_fp) { @@ -211,7 +248,8 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) hEncounter = AllocEncounter (); LockEncounter (hEncounter, &EncounterPtr); - cread ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh); + //cread ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh); + LoadEncounter(EncounterPtr, fh); EncounterPtr->hElement = 0; NumShips = LONIBBLE (EncounterPtr->SD.Index); for (i = 0; i < NumShips; ++i) @@ -223,8 +261,7 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) &GLOBAL (avail_race_q), EncounterPtr->SD.ShipList[i].var1); TemplatePtr = (SHIP_FRAGMENTPTR)LockStarShip ( - &GLOBAL (avail_race_q), hStarShip - ); + &GLOBAL (avail_race_q), hStarShip); EncounterPtr->SD.ShipList[i].race_strings = TemplatePtr->ShipInfo.race_strings; EncounterPtr->SD.ShipList[i].icons = diff --git a/sc2/src/sc2code/pickmele.c b/sc2/src/sc2code/pickmele.c index 73796618e..ee364b305 100644 --- a/sc2/src/sc2code/pickmele.c +++ b/sc2/src/sc2code/pickmele.c @@ -110,7 +110,8 @@ DoGetMelee (GETMELEE_STATE *gms) 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; return FALSE; @@ -171,14 +172,17 @@ ChangeSelection: for (gms->hBattleShip = GetHeadLink (&race_q[which_player]); 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) { - UnlockStarShip (&race_q[which_player], gms->hBattleShip); + UnlockStarShip (&race_q[which_player], + gms->hBattleShip); break; } 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]); 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) { hNextShip = gms->hBattleShip; @@ -272,16 +277,15 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) t.pStr = buf; t.CharCount = (COUNT)~0; SetContextFont (TinyFont); - SetContextForeGroundColor (BUILD_COLOR ( - MAKE_RGB15 (0x13, 0x00, 0x00), 0x2C)); + SetContextForeGroundColor ( + BUILD_COLOR (MAKE_RGB15 (0x13, 0x00, 0x00), 0x2C)); font_DrawText (&t); } SetContext (SpaceContext); s.origin.x = PICK_X_OFFS - 3; - s.origin.y = PICK_Y_OFFS - 9 - + ((1 - which_player) * PICK_SIDE_OFFS); + s.origin.y = PICK_Y_OFFS - 9 + ((1 - which_player) * PICK_SIDE_OFFS); DrawStamp (&s); @@ -299,11 +303,13 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) SetContext (OldContext); 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 { 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) { PressState = ButtonState; @@ -323,8 +329,7 @@ GetMeleeStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) BYTE fade_buf[] = {FadeAllToColor}; SleepThreadUntil (XFormColorMap - ((COLORMAPPTR) fade_buf, ONE_SECOND / 2) - + ONE_SECOND / 60); + ((COLORMAPPTR) fade_buf, ONE_SECOND / 2) + ONE_SECOND / 60); FlushColorXForms (); } diff --git a/sc2/src/sc2code/pickship.c b/sc2/src/sc2code/pickship.c index 5beaed939..ffe43f0f1 100644 --- a/sc2/src/sc2code/pickship.c +++ b/sc2/src/sc2code/pickship.c @@ -197,8 +197,7 @@ ChangeSelection: locString = SetAbsStringTableIndex ( StarShipPtr->RaceDescPtr->ship_info.race_strings, - StarShipPtr->captains_name_index - ); + StarShipPtr->captains_name_index); t.pStr = (UNICODE *)GetStringAddress (locString); t.CharCount = GetStringLength (locString); crew_level = StarShipPtr->RaceDescPtr->ship_info.crew_level; @@ -206,7 +205,8 @@ ChangeSelection: } 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); SetContextForeGroundColor (BLACK_COLOR); } @@ -227,7 +227,8 @@ ChangeSelection: sprintf (buf, "%u", crew_level); else 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); } @@ -324,10 +325,12 @@ GetEncounterStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) { hStarShip = GetHeadLink (&GLOBAL (npc_built_ship_q)); FragPtr = (SHIP_FRAGMENTPTR)LockStarShip ( - &GLOBAL (npc_built_ship_q), hStarShip - ); - if (FragPtr->ShipInfo.crew_level == (BYTE)~0) + &GLOBAL (npc_built_ship_q), hStarShip); + if (FragPtr->ShipInfo.crew_level == INFINITE_FLEET) + { + // Infinite number of ships. battle_counter += MAKE_WORD (0, 1); + } UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); } } @@ -354,7 +357,7 @@ GetEncounterStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) FragPtr = (SHIP_FRAGMENTPTR)LockStarShip (pQueue, hStarShip); if (SPtr == LastStarShipPtr) { - if (FragPtr->ShipInfo.crew_level != (BYTE)~0) + if (FragPtr->ShipInfo.crew_level != INFINITE_FLEET) { FragPtr->ShipInfo.crew_level = SPtr->special_counter; SPtr->RaceDescPtr = (RACE_DESCPTR)&FragPtr->ShipInfo; @@ -391,8 +394,7 @@ GetEncounterStarShip (STARSHIPPTR LastStarShipPtr, COUNT which_player) #ifndef TESTING else if (GLOBAL_SIS (FuelOnBoard) > RUN_AWAY_FUEL_COST) - GLOBAL_SIS (FuelOnBoard) -= - RUN_AWAY_FUEL_COST; + GLOBAL_SIS (FuelOnBoard) -= RUN_AWAY_FUEL_COST; else GLOBAL_SIS (FuelOnBoard) = 0; #endif /* TESTING */ @@ -430,9 +432,7 @@ DrawArmadaPickShip (BOOLEAN draw_salvage_frame, PRECT pPickRect) hLastIndex = SetResourceIndex (hResIndex); OldContext = SetContext (SpaceContext); - PickFrame = CaptureDrawable ( - LoadGraphic (SC2_PICK_PMAP_ANIM) - ); + PickFrame = CaptureDrawable (LoadGraphic (SC2_PICK_PMAP_ANIM)); BatchGraphics (); @@ -469,7 +469,8 @@ DrawArmadaPickShip (BOOLEAN draw_salvage_frame, PRECT pPickRect) t.align = ALIGN_CENTER; t.pStr = GLOBAL_SIS (ShipName); t.CharCount = (COUNT)~0; -SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17)); + SetContextForeGroundColor ( + BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17)); SetContextFont (StarConFont); font_DrawText (&t); @@ -485,8 +486,7 @@ SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17)); COUNT ship_index; ship_index = (COUNT)LONIBBLE ( - StarShipPtr->RaceDescPtr->ship_info.var2 - ); + StarShipPtr->RaceDescPtr->ship_info.var2); s.origin.x = pick_r.corner.x + (5 + ((ICON_WIDTH + 4) @@ -515,8 +515,9 @@ SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x12, 0x12, 0x12), 0x17)); } else { - /* Ship ran away */ - SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); + /* Ship ran away */ + SetContextForeGroundColor (BUILD_COLOR ( + MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); DrawFilledStamp (&s); } } diff --git a/sc2/src/sc2code/planets/genchmmr.c b/sc2/src/sc2code/planets/genchmmr.c index f74c3d7ec..23a2f0ff4 100644 --- a/sc2/src/sc2code/planets/genchmmr.c +++ b/sc2/src/sc2code/planets/genchmmr.c @@ -82,7 +82,7 @@ GenerateChmmr (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (ILWRATH_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6); diff --git a/sc2/src/sc2code/planets/gendru.c b/sc2/src/sc2code/planets/gendru.c index 00dc11f60..d5d5a8d61 100644 --- a/sc2/src/sc2code/planets/gendru.c +++ b/sc2/src/sc2code/planets/gendru.c @@ -118,7 +118,7 @@ GenerateDruuge (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (DRUUGE_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/planets/genilw.c b/sc2/src/sc2code/planets/genilw.c index b4690778f..14b431de6 100644 --- a/sc2/src/sc2code/planets/genilw.c +++ b/sc2/src/sc2code/planets/genilw.c @@ -91,7 +91,7 @@ GenerateIlwrath (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (ILWRATH_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/planets/genmyc.c b/sc2/src/sc2code/planets/genmyc.c index 679006424..4f397b730 100644 --- a/sc2/src/sc2code/planets/genmyc.c +++ b/sc2/src/sc2code/planets/genmyc.c @@ -140,7 +140,8 @@ GenerateMycon (BYTE control) if (CurStarDescPtr->Index == MYCON_DEFINED || !GET_GAME_STATE (MYCON_FELL_FOR_AMBUSH)) CloneShipFragment (MYCON_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), + INFINITE_FLEET); else { COUNT i; diff --git a/sc2/src/sc2code/planets/genorz.c b/sc2/src/sc2code/planets/genorz.c index 55b4509ba..6b5fb6946 100644 --- a/sc2/src/sc2code/planets/genorz.c +++ b/sc2/src/sc2code/planets/genorz.c @@ -308,7 +308,7 @@ GenerateOrz (BYTE control) if (CurStarDescPtr->Index == ORZ_DEFINED) { 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); } else diff --git a/sc2/src/sc2code/planets/genpet.c b/sc2/src/sc2code/planets/genpet.c index 4ec5b867f..8a4cd0045 100644 --- a/sc2/src/sc2code/planets/genpet.c +++ b/sc2/src/sc2code/planets/genpet.c @@ -183,7 +183,7 @@ GenerateTalkingPet (BYTE control) if (!GET_GAME_STATE (UMGAH_ZOMBIE_BLOBBIES)) { CloneShipFragment (UMGAH_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); InitCommunication (UMGAH_CONVERSATION); } else diff --git a/sc2/src/sc2code/planets/genpku.c b/sc2/src/sc2code/planets/genpku.c index 5756ba3ca..ef975af1a 100644 --- a/sc2/src/sc2code/planets/genpku.c +++ b/sc2/src/sc2code/planets/genpku.c @@ -110,7 +110,7 @@ GeneratePkunk (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (PKUNK_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/planets/gensam.c b/sc2/src/sc2code/planets/gensam.c index b3e1a505d..221e068f4 100644 --- a/sc2/src/sc2code/planets/gensam.c +++ b/sc2/src/sc2code/planets/gensam.c @@ -252,7 +252,7 @@ GenerateSamatra (BYTE control) if (!GET_GAME_STATE (URQUAN_MESSED_UP)) CloneShipFragment (!GET_GAME_STATE (KOHR_AH_FRENZY) ? URQUAN_SHIP : BLACK_URQUAN_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); else { #define URQUAN_REMNANTS 3 diff --git a/sc2/src/sc2code/planets/genshof.c b/sc2/src/sc2code/planets/genshof.c index 6e37dd3e4..b2b559186 100644 --- a/sc2/src/sc2code/planets/genshof.c +++ b/sc2/src/sc2code/planets/genshof.c @@ -42,9 +42,7 @@ check_old_shofixti (void) FLEE | IGNORE_FLAGSHIP | (task & REFORM_GROUP)); SET_GROUP_DEST (FragPtr, 0); - UnlockStarShip ( - &GLOBAL (npc_built_ship_q), hStarShip - ); + UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); } } @@ -69,9 +67,7 @@ GenerateShofixti (BYTE control) MAKE_WORD (b0, b1), MAKE_WORD (b2, b3) ); if (GLOBAL (BattleGroupRef) == 0 - || !GetGroupInfo ( - GLOBAL (BattleGroupRef), (BYTE)~0 - )) + || !GetGroupInfo (GLOBAL (BattleGroupRef), (BYTE)~0)) { if (GLOBAL (BattleGroupRef) == 0) GLOBAL (BattleGroupRef) = ~0L; @@ -80,8 +76,7 @@ GenerateShofixti (BYTE control) &GLOBAL (npc_built_ship_q), 1); GLOBAL (BattleGroupRef) = PutGroupInfo ( - GLOBAL (BattleGroupRef), 1 - ); + GLOBAL (BattleGroupRef), 1); b0 = LOBYTE (LOWORD (GLOBAL (BattleGroupRef))); b1 = HIBYTE (LOWORD (GLOBAL (BattleGroupRef))); b2 = LOBYTE (HIWORD (GLOBAL (BattleGroupRef))); diff --git a/sc2/src/sc2code/planets/genspa.c b/sc2/src/sc2code/planets/genspa.c index 329b79412..0141ae628 100644 --- a/sc2/src/sc2code/planets/genspa.c +++ b/sc2/src/sc2code/planets/genspa.c @@ -163,7 +163,7 @@ GenerateSpathi (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (SPATHI_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7); diff --git a/sc2/src/sc2code/planets/gensup.c b/sc2/src/sc2code/planets/gensup.c index 7174aa9a4..3b18b1cf2 100644 --- a/sc2/src/sc2code/planets/gensup.c +++ b/sc2/src/sc2code/planets/gensup.c @@ -108,7 +108,7 @@ GenerateSupox (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (SUPOX_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/planets/genthrad.c b/sc2/src/sc2code/planets/genthrad.c index a412dd011..38a8ee56e 100644 --- a/sc2/src/sc2code/planets/genthrad.c +++ b/sc2/src/sc2code/planets/genthrad.c @@ -149,7 +149,7 @@ GenerateThradd (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (THRADDASH_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/planets/genutw.c b/sc2/src/sc2code/planets/genutw.c index 394f81476..eb604d5fb 100644 --- a/sc2/src/sc2code/planets/genutw.c +++ b/sc2/src/sc2code/planets/genutw.c @@ -150,7 +150,7 @@ GenerateUtwig (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (UTWIG_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/planets/genvux.c b/sc2/src/sc2code/planets/genvux.c index b5e1c9a73..99638a97a 100644 --- a/sc2/src/sc2code/planets/genvux.c +++ b/sc2/src/sc2code/planets/genvux.c @@ -163,7 +163,7 @@ GenerateVUX (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (VUX_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); if (CurStarDescPtr->Index == VUX_DEFINED) { SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7); diff --git a/sc2/src/sc2code/planets/genyeh.c b/sc2/src/sc2code/planets/genyeh.c index 2c765c43a..de3555d9c 100644 --- a/sc2/src/sc2code/planets/genyeh.c +++ b/sc2/src/sc2code/planets/genyeh.c @@ -92,7 +92,7 @@ GenerateYehat (BYTE control) ReinitQueue (&GLOBAL (npc_built_ship_q)); CloneShipFragment (YEHAT_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/planets/genzoq.c b/sc2/src/sc2code/planets/genzoq.c index 037d5b197..1f925561d 100644 --- a/sc2/src/sc2code/planets/genzoq.c +++ b/sc2/src/sc2code/planets/genzoq.c @@ -51,9 +51,7 @@ check_scout (void) SET_GROUP_DEST (FragPtr, 0); } - UnlockStarShip ( - &GLOBAL (npc_built_ship_q), hStarShip - ); + UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); } } @@ -201,7 +199,7 @@ GenerateZoqFotPik (BYTE control) } CloneShipFragment (ZOQFOTPIK_SHIP, - &GLOBAL (npc_built_ship_q), (BYTE)~0); + &GLOBAL (npc_built_ship_q), INFINITE_FLEET); pSolarSysState->MenuState.Initialized += 2; GLOBAL (CurrentActivity) |= START_INTERPLANETARY; diff --git a/sc2/src/sc2code/process.c b/sc2/src/sc2code/process.c index c3714321f..b66358aef 100644 --- a/sc2/src/sc2code/process.c +++ b/sc2/src/sc2code/process.c @@ -144,8 +144,8 @@ PreProcess (ELEMENTPTR ElementPtr) { (*ElementPtr->preprocess_func) (ElementPtr); - if (((state_flags = ElementPtr->state_flags) & CHANGING) - && CollidingElement (ElementPtr)) + state_flags = ElementPtr->state_flags; + if ((state_flags & CHANGING) && CollidingElement (ElementPtr)) InitIntersectFrame (ElementPtr); } @@ -170,8 +170,7 @@ PreProcess (ELEMENTPTR ElementPtr) --ElementPtr->life_span; } - ElementPtr->state_flags = (state_flags - & ~(POST_PROCESS | COLLISION)) + ElementPtr->state_flags = (state_flags & ~(POST_PROCESS | COLLISION)) | PRE_PROCESS; } @@ -845,7 +844,8 @@ PostProcessQueue (VIEW_STATE view_state, SIZE scroll_x, ProcessCollisions (GetHeadElement (), PostElementPtr, MAX_TIME_VALUE, PRE_PROCESS | POST_PROCESS); UnlockElement (hPostElement); - } while ((hPostElement = hNextElement) != 0); + hPostElement = hNextElement; + } while (hPostElement != 0); scroll_x = 0; scroll_y = 0; @@ -920,20 +920,20 @@ PostProcessQueue (VIEW_STATE view_state, SIZE scroll_x, ElementPtr->next.image.frame = #ifdef SAFE SetAbsFrameIndex ( - ElementPtr->next.image.farray - [index], + ElementPtr->next.image.farray[index], GetFrameIndex (ElementPtr->next.image.frame)); #else /* SAFE */ SetEquFrameIndex ( - ElementPtr->next.image.farray - [index], + ElementPtr->next.image.farray[index], ElementPtr->next.image.frame); #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 - // level image as mipmap, needed for trilinear scaling + // enqueues drawcommand to assign next + // (smaller) zoom level image as mipmap, + // needed for trilinear scaling PFRAME_DESC frame = SetAbsFrameIndex ( @@ -1027,7 +1027,8 @@ RedrawQueue (BOOLEAN clear) { 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)) { nth_frame += skip_frames; diff --git a/sc2/src/sc2code/races.h b/sc2/src/sc2code/races.h index 0b362e641..dcc959da7 100644 --- a/sc2/src/sc2code/races.h +++ b/sc2/src/sc2code/races.h @@ -57,9 +57,9 @@ #define FIRES_LEFT (1 << 10) #define SHIELD_DEFENSE (1 << 11) #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 { @@ -101,12 +101,24 @@ typedef struct { UWORD ship_flags; 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; 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; 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; typedef SHIP_INFO *PSHIP_INFO; #define SHIP_INFOPTR PSHIP_INFO @@ -152,13 +164,22 @@ typedef struct BYTE days_left; /* Days left before the fleet reachers 'dest_loc'. */ 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; POINT loc; /* Location of the fleet (center) */ STRING race_strings; + /* Race specific strings, see doc/devel/racestrings. */ 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; /* Measure for the size of the sphere of influence. @@ -195,17 +216,25 @@ typedef struct typedef DATA_STUFF *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 (POSTPROCESS_FUNC) (PELEMENT ElementPtr); 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; CHARACTERISTIC_STUFF characteristics _ALIGNED_ANY; DATA_STUFF ship_data _ALIGNED_ANY; INTEL_STUFF cyborg_control _ALIGNED_ANY; + UNINIT_FUNC *uninit_func + _ALIGNED_ON(sizeof (UNINIT_FUNC *)); PREPROCESS_FUNC *preprocess_func _ALIGNED_ON(sizeof (PREPROCESS_FUNC *)); POSTPROCESS_FUNC *postprocess_func @@ -214,9 +243,8 @@ typedef struct race_desc _ALIGNED_ON(sizeof (INIT_WEAPON_FUNC *)); PVOID CodeRef _ALIGNED_ON(sizeof (PVOID)); -} RACE_DESC; -typedef RACE_DESC *PRACE_DESC; -#define RACE_DESCPTR PRACE_DESC +}; + typedef QUEUE_HANDLE HSTARSHIP; @@ -251,6 +279,12 @@ typedef struct DWORD RaceResIndex; 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_FRAGMENT; typedef SHIP_FRAGMENT *PSHIP_FRAGMENT; diff --git a/sc2/src/sc2code/save.c b/sc2/src/sc2code/save.c index dfe850c1a..dd5181890 100644 --- a/sc2/src/sc2code/save.c +++ b/sc2/src/sc2code/save.c @@ -72,6 +72,12 @@ SaveShipQueue (DECODE_REF fh, PQUEUE pQueue) // See races.h; look for the enum containing NUM_AVAILABLE_RACES. 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 // GLOBAL(avail_race_q), and FragPtr->RaceDescPtr for other queues. // 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 PrepareSummary (SUMMARY_DESC *summary_desc) { @@ -259,6 +295,8 @@ SaveProblem (void) return; } +// This function first writes to a memory file, and then writes the whole +// lot to the actual save file at once. BOOLEAN SaveGame (COUNT which_game, SUMMARY_DESC *summary_desc) { @@ -320,7 +358,8 @@ RetrySave: & (START_ENCOUNTER | START_INTERPLANETARY))) 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 (ShipStamp.frame) = frame; @@ -330,8 +369,10 @@ RetrySave: SaveShipQueue (fh, &GLOBAL (npc_built_ship_q)); SaveShipQueue (fh, &GLOBAL (built_ship_q)); + // Save the number of game events (compressed). num_links = CountLinks (&GLOBAL (GameClock.event_q)); cwrite ((PBYTE)&num_links, sizeof (num_links), 1, fh); + // Save the game events themselves (compressed): { HEVENT hEvent; @@ -351,7 +392,9 @@ RetrySave: } } + // Save the number of encounters (black globes in HS/QS (compressed)) num_links = CountLinks (&GLOBAL (encounter_q)); + // Save the encounters themselves (compressed): cwrite ((PBYTE)&num_links, sizeof (num_links), 1, fh); { HENCOUNTER hEncounter; @@ -365,6 +408,8 @@ RetrySave: LockEncounter (hEncounter, &EncounterPtr); hNextEncounter = GetSuccEncounter (EncounterPtr); + //cwrite ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh); + SaveEncounter(EncounterPtr, fh); cwrite ((PBYTE)EncounterPtr, sizeof (*EncounterPtr), 1, fh); UnlockEncounter (hEncounter); @@ -372,10 +417,12 @@ RetrySave: } } + // Copy the star info file to the memory file (compressed). fp = OpenStateFile (STARINFO_FILE, "rb"); if (fp) { flen = LengthStateFile (fp); + // (DWORD) Write the uncompressed size. cwrite ((PBYTE)&flen, sizeof (flen), 1, fh); while (flen) { @@ -390,10 +437,12 @@ RetrySave: CloseStateFile (fp); } + // Copy the ? groupinfo file into the memory file (compressed). fp = OpenStateFile (DEFGRPINFO_FILE, "rb"); if (fp) { flen = LengthStateFile (fp); + // (DWORD) Write the uncompressed size. cwrite ((PBYTE)&flen, sizeof (flen), 1, fh); while (flen) { @@ -408,6 +457,7 @@ RetrySave: CloseStateFile (fp); } + // Copy the ? groupinfo file into the memory file (compressed). fp = OpenStateFile (RANDGRPINFO_FILE, "rb"); if (fp) { @@ -426,18 +476,23 @@ RetrySave: CloseStateFile (fp); } + // Write the current star desc into the memory file (compressed). cwrite ((PBYTE)&SD, sizeof (SD), 1, fh); flen = cclose (fh); + // Write the memory file to the actual savegame file. sprintf (file, "starcon2.%02u", which_game); // fprintf (stderr, "'%s' is %lu bytes long\n", file, flen + sizeof (*summary_desc)); if (flen && (out_fp = (PVOID)res_OpenResFile (saveDir, file, "wb"))) { PrepareSummary (summary_desc); + // First write the summary. success = (BOOLEAN)(WriteResFile ( 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, out_fp) == 0) success = FALSE; diff --git a/sc2/src/sc2code/ship.c b/sc2/src/sc2code/ship.c index 99c87b20d..0c0cb42c1 100644 --- a/sc2/src/sc2code/ship.c +++ b/sc2/src/sc2code/ship.c @@ -156,8 +156,7 @@ ship_preprocess (PELEMENT ElementPtr) & (LEFT | RIGHT | THRUST | WEAPON | SPECIAL); else { - ElementPtr->crew_level = - (BYTE)RDPtr->ship_info.crew_level; + ElementPtr->crew_level = RDPtr->ship_info.crew_level; if ((ElementPtr->state_flags & BAD_GUY) && LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) @@ -352,20 +351,19 @@ ship_postprocess (PELEMENT ElementPtr) } void -collision (PELEMENT - ElementPtr0, PPOINT - pPt0, PELEMENT - ElementPtr1, PPOINT - pPt1) +collision (PELEMENT ElementPtr0, PPOINT pPt0, + PELEMENT ElementPtr1, PPOINT pPt1) { if (!(ElementPtr1->state_flags & FINITE_LIFE)) { ElementPtr0->state_flags |= COLLISION; if (GRAVITY_MASS (ElementPtr1->mass_points)) { + // Collision with a planet. SIZE damage; - if ((damage = ElementPtr0->hit_points >> 2) == 0) + damage = ElementPtr0->hit_points >> 2; + if (damage == 0) damage = 1; do_damage ((ELEMENTPTR)ElementPtr0, damage); @@ -380,8 +378,7 @@ collision (PELEMENT } static BOOLEAN -spawn_ship (STARSHIPPTR - StarShipPtr) +spawn_ship (STARSHIPPTR StarShipPtr) { HELEMENT hShip; RACE_DESCPTR RDPtr; @@ -399,20 +396,32 @@ spawn_ship (STARSHIPPTR if (LOBYTE (GLOBAL (CurrentActivity)) == IN_ENCOUNTER || LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) { - if ((RDPtr->ship_info.crew_level = StarShipPtr->special_counter) > - RDPtr->ship_info.max_crew) + if (StarShipPtr->special_counter == 0) + { + // 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; } - StarShipPtr->energy_counter = - StarShipPtr->weapon_counter = - StarShipPtr->special_counter = 0; + StarShipPtr->energy_counter = 0; + StarShipPtr->weapon_counter = 0; + StarShipPtr->special_counter = 0; - if ((hShip = StarShipPtr->hShip) == 0 - && (hShip = AllocElement ()) != 0) - InsertElement (hShip, GetHeadElement ()); + hShip = StarShipPtr->hShip; + if (hShip == 0) + { + hShip = AllocElement (); + if (hShip != 0) + InsertElement (hShip, GetHeadElement ()); + } - if ((StarShipPtr->hShip = hShip) != 0) + StarShipPtr->hShip = hShip; + if (StarShipPtr->hShip != 0) { ELEMENTPTR ShipElementPtr; @@ -450,8 +459,7 @@ spawn_ship (STARSHIPPTR --facing; GLOBAL (ShipStamp.frame) = (FRAME)MAKE_DWORD ( - StarShipPtr->ShipFacing + 1, 0 - ); + StarShipPtr->ShipFacing + 1, 0); StarShipPtr->ShipFacing = facing; } ShipElementPtr->current.image.frame = diff --git a/sc2/src/sc2code/ships/androsyn/androsyn.c b/sc2/src/sc2code/ships/androsyn/androsyn.c index 60e29bf04..2c15c3a61 100644 --- a/sc2/src/sc2code/ships/androsyn/androsyn.c +++ b/sc2/src/sc2code/ships/androsyn/androsyn.c @@ -43,7 +43,7 @@ static RACE_DESC androsynth_desc = FIRES_FORE | SEEKING_WEAPON, 15, /* Super Melee cost */ ~0, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { MAX_X_UNIVERSE >> 1, MAX_Y_UNIVERSE >> 1, @@ -51,6 +51,7 @@ static RACE_DESC androsynth_desc = (STRING)ANDROSYNTH_RACE_STRINGS, (FRAME)ANDROSYNTH_ICON_MASK_PMAP_ANIM, (FRAME)ANDROSYNTH_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -96,9 +97,10 @@ static RACE_DESC androsynth_desc = LONG_RANGE_WEAPON >> 2, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; @@ -110,7 +112,7 @@ blazer_collision (PELEMENT ElementPtr0, PPOINT pPt0, PELEMENT ElementPtr1, PPOIN { #define BLAZER_OFFSET 10 BYTE old_offs; - BYTE old_crew_level; + COUNT old_crew_level; COUNT old_life; 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 || ((WEAPON_RANGE (&pEnemyStarShip->RaceDescPtr->cyborg_control) <= CLOSE_RANGE_WEAPON && 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)))) lpEvalDesc->MoveState = ENTICE; } @@ -271,7 +273,7 @@ androsynth_intelligence (PELEMENT ShipPtr, PEVALUATE_DESC ObjectsOfConcern, COUN || (lpEvalDesc->which_turn < 16 && (WEAPON_RANGE (&pEnemyStarShip->RaceDescPtr->cyborg_control) > CLOSE_RANGE_WEAPON || 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))))) StarShipPtr->ship_input_state |= SPECIAL; diff --git a/sc2/src/sc2code/ships/arilou/arilou.c b/sc2/src/sc2code/ships/arilou/arilou.c index c1b3c6ce9..be9691fc2 100644 --- a/sc2/src/sc2code/ships/arilou/arilou.c +++ b/sc2/src/sc2code/ships/arilou/arilou.c @@ -45,7 +45,7 @@ static RACE_DESC arilou_desc = /* FIRES_FORE | */ IMMEDIATE_WEAPON, 16, /* Super Melee cost */ 250 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 438, 6372, @@ -53,6 +53,7 @@ static RACE_DESC arilou_desc = (STRING)ARILOU_RACE_STRINGS, (FRAME)ARILOU_ICON_MASK_PMAP_ANIM, (FRAME)ARILOU_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -98,9 +99,10 @@ static RACE_DESC arilou_desc = LASER_RANGE >> 1, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/blackurq/blackurq.c b/sc2/src/sc2code/ships/blackurq/blackurq.c index cf69f6dce..8a40d8e83 100644 --- a/sc2/src/sc2code/ships/blackurq/blackurq.c +++ b/sc2/src/sc2code/ships/blackurq/blackurq.c @@ -47,7 +47,7 @@ static RACE_DESC black_urquan_desc = FIRES_FORE, 30, /* Super Melee cost */ 2666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 6000, 6250, @@ -55,6 +55,7 @@ static RACE_DESC black_urquan_desc = (STRING)KOHR_AH_RACE_STRINGS, (FRAME)KOHR_AH_ICON_MASK_PMAP_ANIM, (FRAME)KOHR_AH_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -100,9 +101,10 @@ static RACE_DESC black_urquan_desc = CLOSE_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/chenjesu/chenjesu.c b/sc2/src/sc2code/ships/chenjesu/chenjesu.c index 12f20e133..adbd73dd4 100644 --- a/sc2/src/sc2code/ships/chenjesu/chenjesu.c +++ b/sc2/src/sc2code/ships/chenjesu/chenjesu.c @@ -50,7 +50,7 @@ static RACE_DESC chenjesu_desc = FIRES_FORE | SEEKING_SPECIAL | SEEKING_WEAPON, 28, /* Super Melee cost */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 0, 0, @@ -58,6 +58,7 @@ static RACE_DESC chenjesu_desc = (STRING)CHENJESU_RACE_STRINGS, (FRAME)CHENJESU_ICON_MASK_PMAP_ANIM, (FRAME)CHENJESU_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -103,9 +104,10 @@ static RACE_DESC chenjesu_desc = LONG_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/chmmr/chmmr.c b/sc2/src/sc2code/ships/chmmr/chmmr.c index 311c4e078..555936184 100644 --- a/sc2/src/sc2code/ships/chmmr/chmmr.c +++ b/sc2/src/sc2code/ships/chmmr/chmmr.c @@ -47,7 +47,7 @@ static RACE_DESC chmmr_desc = FIRES_FORE | IMMEDIATE_WEAPON | SEEKING_SPECIAL | POINT_DEFENSE, 30, /* Super Melee cost */ 0, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 0, 0, @@ -55,6 +55,7 @@ static RACE_DESC chmmr_desc = (STRING)CHMMR_RACE_STRINGS, (FRAME)CHMMR_ICON_MASK_PMAP_ANIM, (FRAME)CHMMR_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -100,9 +101,10 @@ static RACE_DESC chmmr_desc = CLOSE_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/druuge/druuge.c b/sc2/src/sc2code/ships/druuge/druuge.c index abb5a4454..29d0281ae 100644 --- a/sc2/src/sc2code/ships/druuge/druuge.c +++ b/sc2/src/sc2code/ships/druuge/druuge.c @@ -43,7 +43,7 @@ static RACE_DESC druuge_desc = FIRES_FORE, 17, /* Super Melee cost */ 1400 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 9500, 2792, @@ -51,6 +51,7 @@ static RACE_DESC druuge_desc = (STRING)DRUUGE_RACE_STRINGS, (FRAME)DRUUGE_ICON_MASK_PMAP_ANIM, (FRAME)DRUUGE_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -96,9 +97,10 @@ static RACE_DESC druuge_desc = MISSILE_RANGE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/human/human.c b/sc2/src/sc2code/ships/human/human.c index d1be6df0c..27af62b86 100644 --- a/sc2/src/sc2code/ships/human/human.c +++ b/sc2/src/sc2code/ships/human/human.c @@ -47,7 +47,7 @@ static RACE_DESC human_desc = FIRES_FORE | SEEKING_WEAPON | POINT_DEFENSE, 11, /* Super Melee cost */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 1752, 1450, @@ -55,6 +55,7 @@ static RACE_DESC human_desc = (STRING)HUMAN_RACE_STRINGS, (FRAME)HUMAN_ICON_MASK_PMAP_ANIM, (FRAME)HUMAN_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -100,9 +101,10 @@ static RACE_DESC human_desc = LONG_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/ilwrath/ilwrath.c b/sc2/src/sc2code/ships/ilwrath/ilwrath.c index 7fde5e898..e051eadf4 100644 --- a/sc2/src/sc2code/ships/ilwrath/ilwrath.c +++ b/sc2/src/sc2code/ships/ilwrath/ilwrath.c @@ -45,7 +45,7 @@ static RACE_DESC ilwrath_desc = FIRES_FORE, 10, /* Super Melee cost */ 1410 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 48, 1700, @@ -53,6 +53,7 @@ static RACE_DESC ilwrath_desc = (STRING)ILWRATH_RACE_STRINGS, (FRAME)ILWRATH_ICON_MASK_PMAP_ANIM, (FRAME)ILWRATH_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -98,9 +99,10 @@ static RACE_DESC ilwrath_desc = CLOSE_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/lastbat/lastbat.c b/sc2/src/sc2code/ships/lastbat/lastbat.c index 49736a8bb..b63f2345d 100644 --- a/sc2/src/sc2code/ships/lastbat/lastbat.c +++ b/sc2/src/sc2code/ships/lastbat/lastbat.c @@ -50,7 +50,7 @@ static RACE_DESC samatra_desc = /* FIRES_FORE | */ IMMEDIATE_WEAPON | CREW_IMMUNE, 16, /* Super Melee cost */ 0, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 0, 0, @@ -58,6 +58,7 @@ static RACE_DESC samatra_desc = (STRING)0, (FRAME)0, (FRAME)0, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -103,9 +104,10 @@ static RACE_DESC samatra_desc = 0, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/melnorme/melnorme.c b/sc2/src/sc2code/ships/melnorme/melnorme.c index 7fcfbee21..11d33a0d5 100644 --- a/sc2/src/sc2code/ships/melnorme/melnorme.c +++ b/sc2/src/sc2code/ships/melnorme/melnorme.c @@ -46,7 +46,7 @@ static RACE_DESC melnorme_desc = FIRES_FORE, 18, /* Super Melee cost */ ~0, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { MAX_X_UNIVERSE >> 1, MAX_Y_UNIVERSE >> 1, @@ -54,6 +54,7 @@ static RACE_DESC melnorme_desc = (STRING)MELNORME_RACE_STRINGS, (FRAME)MELNORME_ICON_MASK_PMAP_ANIM, (FRAME)MELNORME_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -99,9 +100,10 @@ static RACE_DESC melnorme_desc = PUMPUP_SPEED * PUMPUP_LIFE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/mmrnmhrm/mmrnmhrm.c b/sc2/src/sc2code/ships/mmrnmhrm/mmrnmhrm.c index 8e24e6f8a..6b90bc3e6 100644 --- a/sc2/src/sc2code/ships/mmrnmhrm/mmrnmhrm.c +++ b/sc2/src/sc2code/ships/mmrnmhrm/mmrnmhrm.c @@ -58,7 +58,7 @@ static RACE_DESC mmrnmhrm_desc = FIRES_FORE | IMMEDIATE_WEAPON, 19, /* Super Melee cost */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 0, 0, @@ -66,6 +66,7 @@ static RACE_DESC mmrnmhrm_desc = (STRING)MMRNMHRM_RACE_STRINGS, (FRAME)MMRNMHRM_ICON_MASK_PMAP_ANIM, (FRAME)MMRNMHRM_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -111,9 +112,10 @@ static RACE_DESC mmrnmhrm_desc = CLOSE_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/mycon/mycon.c b/sc2/src/sc2code/ships/mycon/mycon.c index adefdd995..caa15e372 100644 --- a/sc2/src/sc2code/ships/mycon/mycon.c +++ b/sc2/src/sc2code/ships/mycon/mycon.c @@ -46,7 +46,7 @@ static RACE_DESC mycon_desc = FIRES_FORE | SEEKING_WEAPON, 21, /* Super Melee cost */ 1070 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 6392, 2200, @@ -54,6 +54,7 @@ static RACE_DESC mycon_desc = (STRING)MYCON_RACE_STRINGS, (FRAME)MYCON_ICON_MASK_PMAP_ANIM, (FRAME)MYCON_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -99,9 +100,10 @@ static RACE_DESC mycon_desc = DISPLAY_TO_WORLD (800), NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/orz/orz.c b/sc2/src/sc2code/ships/orz/orz.c index 9206f84d4..e0c27dc35 100644 --- a/sc2/src/sc2code/ships/orz/orz.c +++ b/sc2/src/sc2code/ships/orz/orz.c @@ -48,7 +48,7 @@ static RACE_DESC orz_desc = FIRES_FORE | SEEKING_SPECIAL, 23, /* Super Melee cost */ 333 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 3608, 2637, @@ -56,6 +56,7 @@ static RACE_DESC orz_desc = (STRING)ORZ_RACE_STRINGS, (FRAME)ORZ_ICON_MASK_PMAP_ANIM, (FRAME)ORZ_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -101,9 +102,10 @@ static RACE_DESC orz_desc = MISSILE_SPEED * MISSILE_LIFE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/pkunk/pkunk.c b/sc2/src/sc2code/ships/pkunk/pkunk.c index 3b21343ab..30db0ac57 100644 --- a/sc2/src/sc2code/ships/pkunk/pkunk.c +++ b/sc2/src/sc2code/ships/pkunk/pkunk.c @@ -46,7 +46,7 @@ static RACE_DESC pkunk_desc = FIRES_FORE | FIRES_LEFT | FIRES_RIGHT, 20, /* Super Melee cost */ 666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 502, 401, @@ -54,6 +54,7 @@ static RACE_DESC pkunk_desc = (STRING)PKUNK_RACE_STRINGS, (FRAME)PKUNK_ICON_MASK_PMAP_ANIM, (FRAME)PKUNK_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -99,9 +100,10 @@ static RACE_DESC pkunk_desc = CLOSE_RANGE_WEAPON + 1, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/probe/probe.c b/sc2/src/sc2code/ships/probe/probe.c index bd69905d5..d71b932b7 100644 --- a/sc2/src/sc2code/ships/probe/probe.c +++ b/sc2/src/sc2code/ships/probe/probe.c @@ -40,7 +40,7 @@ static RACE_DESC probe_desc = 0, 0, /* Super Melee cost */ 0, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 0, 0, @@ -48,6 +48,7 @@ static RACE_DESC probe_desc = 0, 0, (FRAME)PROBE_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -93,9 +94,10 @@ static RACE_DESC probe_desc = 0, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/shofixti/shofixti.c b/sc2/src/sc2code/ships/shofixti/shofixti.c index 138fd1b54..c1cfa0b16 100644 --- a/sc2/src/sc2code/ships/shofixti/shofixti.c +++ b/sc2/src/sc2code/ships/shofixti/shofixti.c @@ -46,7 +46,7 @@ static RACE_DESC shofixti_desc = FIRES_FORE, 5, /* Super Melee cost */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 0, 0, @@ -54,6 +54,7 @@ static RACE_DESC shofixti_desc = (STRING)SHOFIXTI_RACE_STRINGS, (FRAME)SHOFIXTI_ICON_MASK_PMAP_ANIM, (FRAME)SHOFIXTI_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -99,9 +100,10 @@ static RACE_DESC shofixti_desc = MISSILE_SPEED * MISSILE_LIFE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/sis_ship/sis_ship.c b/sc2/src/sc2code/ships/sis_ship/sis_ship.c index af30cf3ad..d2adba829 100644 --- a/sc2/src/sc2code/ships/sis_ship/sis_ship.c +++ b/sc2/src/sc2code/ships/sis_ship/sis_ship.c @@ -52,7 +52,7 @@ static RACE_DESC sis_desc = 0, 16, /* Super Melee cost */ 0 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 0, 0, @@ -60,6 +60,7 @@ static RACE_DESC sis_desc = 0, (FRAME)SIS_ICON_MASK_PMAP_ANIM, 0, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -105,12 +106,21 @@ static RACE_DESC sis_desc = BLASTER_SPEED * BLASTER_LIFE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 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 void @@ -445,7 +455,7 @@ sis_battle_preprocess (PELEMENT ElementPtr) static void sis_battle_postprocess (PELEMENT ElementPtr) { - SIZE crew_delta; +// SIZE crew_delta; STARSHIPPTR StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); @@ -456,6 +466,7 @@ sis_battle_postprocess (PELEMENT ElementPtr) spawn_point_defense (ElementPtr); } +#if 0 if (ElementPtr->crew_level > 0 && ElementPtr->crew_level < StarShipPtr->RaceDescPtr->ship_info.max_crew && ElementPtr->crew_level != (crew_delta = @@ -468,6 +479,7 @@ sis_battle_postprocess (PELEMENT ElementPtr) else DeltaCrew (ElementPtr, StarShipPtr->RaceDescPtr->ship_info.max_crew); } +#endif } #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 init_sis (void) { @@ -746,6 +854,8 @@ init_sis (void) /* copy initial ship settings to new_sis_desc */ new_sis_desc = sis_desc; + + new_sis_desc.uninit_func = uninit_sis; if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE) { @@ -760,7 +870,7 @@ init_sis (void) new_sis_desc.ship_data.victory_ditty = 0; new_sis_desc.ship_data.ship_sounds = 0; - new_sis_desc.ship_data.ship[0] = (FRAME)SIS_HYPER_MASK_PMAP_ANIM; + new_sis_desc.ship_data.ship[0] = (FRAME)SIS_HYPER_MASK_PMAP_ANIM; new_sis_desc.preprocess_func = sis_hyper_preprocess; new_sis_desc.postprocess_func = sis_hyper_postprocess; @@ -773,97 +883,32 @@ init_sis (void) new_sis_desc.postprocess_func = sis_battle_postprocess; new_sis_desc.init_weapon_func = initialize_blasters; new_sis_desc.cyborg_control.intelligence_func = - (void (*) (PVOID ShipPtr, PVOID ObjectsOfConcern, COUNT - ConcernCounter)) sis_intelligence; - - num_trackers = 0; - 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; - } + (void (*) (PVOID ShipPtr, PVOID ObjectsOfConcern, + COUNT ConcernCounter)) sis_intelligence; + InitModuleSlots(&new_sis_desc, GLOBAL_SIS (ModuleSlots)); + if (GET_GAME_STATE (CHMMR_BOMB_STATE) == 3) { SET_GAME_STATE (BOMB_CARRIER, 1); } } - new_sis_desc.characteristics.thrust_wait = 0; - for (i = 0; i < NUM_DRIVE_SLOTS; ++i) + InitDriveSlots(&new_sis_desc, GLOBAL_SIS (DriveSlots)); + InitJetSlots(&new_sis_desc, GLOBAL_SIS (JetSlots)); + + if (LOBYTE (GLOBAL (CurrentActivity)) == SUPER_MELEE) { - 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.ship_info.crew_level = new_sis_desc.ship_info.max_crew; } - 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) + else { - switch (GLOBAL_SIS (JetSlots[i])) - { - case TURNING_JETS: - new_sis_desc.characteristics.turn_wait -= 2; - break; - } + // 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; RaceDescPtr = &new_sis_desc; @@ -871,3 +916,12 @@ init_sis (void) 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)--; +} + + diff --git a/sc2/src/sc2code/ships/slylandr/slylandr.c b/sc2/src/sc2code/ships/slylandr/slylandr.c index e507bab0f..013eec964 100644 --- a/sc2/src/sc2code/ships/slylandr/slylandr.c +++ b/sc2/src/sc2code/ships/slylandr/slylandr.c @@ -45,7 +45,7 @@ static RACE_DESC slylandro_desc = SEEKING_WEAPON | CREW_IMMUNE, 17, /* Super Melee cost */ ~0, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 333, 9812, @@ -53,6 +53,7 @@ static RACE_DESC slylandro_desc = (STRING)SLYLANDRO_RACE_STRINGS, (FRAME)SLYLANDRO_ICON_MASK_PMAP_ANIM, (FRAME)SLYLANDRO_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -98,9 +99,10 @@ static RACE_DESC slylandro_desc = CLOSE_RANGE_WEAPON << 1, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/spathi/spathi.c b/sc2/src/sc2code/ships/spathi/spathi.c index 3022a14da..fed58fc05 100644 --- a/sc2/src/sc2code/ships/spathi/spathi.c +++ b/sc2/src/sc2code/ships/spathi/spathi.c @@ -43,7 +43,7 @@ static RACE_DESC spathi_desc = FIRES_FORE | FIRES_AFT | SEEKING_SPECIAL | DONT_CHASE, 18, /* Super Melee cost */ 1000 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 2549, 3600, @@ -51,6 +51,7 @@ static RACE_DESC spathi_desc = (STRING)SPATHI_RACE_STRINGS, (FRAME)SPATHI_ICON_MASK_PMAP_ANIM, (FRAME)SPATHI_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -96,9 +97,10 @@ static RACE_DESC spathi_desc = MISSILE_RANGE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/supox/supox.c b/sc2/src/sc2code/ships/supox/supox.c index e9bda751a..ab1790dd4 100644 --- a/sc2/src/sc2code/ships/supox/supox.c +++ b/sc2/src/sc2code/ships/supox/supox.c @@ -45,7 +45,7 @@ static RACE_DESC supox_desc = FIRES_FORE, 16, /* Super Melee cost */ 333 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 7468, 9246, @@ -53,6 +53,7 @@ static RACE_DESC supox_desc = (STRING)SUPOX_RACE_STRINGS, (FRAME)SUPOX_ICON_MASK_PMAP_ANIM, (FRAME)SUPOX_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -98,9 +99,10 @@ static RACE_DESC supox_desc = (MISSILE_SPEED * MISSILE_LIFE) >> 1, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/syreen/syreen.c b/sc2/src/sc2code/ships/syreen/syreen.c index 73f5cd8ad..c79583abd 100644 --- a/sc2/src/sc2code/ships/syreen/syreen.c +++ b/sc2/src/sc2code/ships/syreen/syreen.c @@ -46,7 +46,7 @@ static RACE_DESC syreen_desc = FIRES_FORE, 13, /* Super Melee cost */ 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, { 0, 0, @@ -54,6 +54,7 @@ static RACE_DESC syreen_desc = (STRING)SYREEN_RACE_STRINGS, (FRAME)SYREEN_ICON_MASK_PMAP_ANIM, (FRAME)SYREEN_MICON_MASK_PMAP_ANIM, + MAX_CREW, SYREEN_MAX_CREW_SIZE, }, { MAX_THRUST, @@ -99,9 +100,10 @@ static RACE_DESC syreen_desc = (MISSILE_SPEED * MISSILE_LIFE * 2 / 3), NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/thradd/thradd.c b/sc2/src/sc2code/ships/thradd/thradd.c index 2d3351ab2..aea6aef90 100644 --- a/sc2/src/sc2code/ships/thradd/thradd.c +++ b/sc2/src/sc2code/ships/thradd/thradd.c @@ -46,7 +46,7 @@ static RACE_DESC thraddash_desc = FIRES_FORE, 10, /* Super Melee cost */ 833 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 2535, 8358, @@ -54,6 +54,7 @@ static RACE_DESC thraddash_desc = (STRING)THRADDASH_RACE_STRINGS, (FRAME)THRADDASH_ICON_MASK_PMAP_ANIM, (FRAME)THRADDASH_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -99,9 +100,10 @@ static RACE_DESC thraddash_desc = (MISSILE_SPEED * MISSILE_LIFE) >> 1, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/umgah/umgah.c b/sc2/src/sc2code/ships/umgah/umgah.c index 5b4764c68..e07de2046 100644 --- a/sc2/src/sc2code/ships/umgah/umgah.c +++ b/sc2/src/sc2code/ships/umgah/umgah.c @@ -45,7 +45,7 @@ static RACE_DESC umgah_desc = FIRES_FORE | IMMEDIATE_WEAPON, 7, /* Super Melee cost */ 833 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 1798, 6000, @@ -53,6 +53,7 @@ static RACE_DESC umgah_desc = (STRING)UMGAH_RACE_STRINGS, (FRAME)UMGAH_ICON_MASK_PMAP_ANIM, (FRAME)UMGAH_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -98,9 +99,10 @@ static RACE_DESC umgah_desc = (LONG_RANGE_WEAPON << 2), NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/urquan/urquan.c b/sc2/src/sc2code/ships/urquan/urquan.c index e5b115259..a3da5f970 100644 --- a/sc2/src/sc2code/ships/urquan/urquan.c +++ b/sc2/src/sc2code/ships/urquan/urquan.c @@ -47,7 +47,7 @@ static RACE_DESC urquan_desc = FIRES_FORE | SEEKING_SPECIAL, 30, /* Super Melee cost */ 2666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 5750, 6000, @@ -55,6 +55,7 @@ static RACE_DESC urquan_desc = (STRING)URQUAN_RACE_STRINGS, (FRAME)URQUAN_ICON_MASK_PMAP_ANIM, (FRAME)URQUAN_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -100,9 +101,10 @@ static RACE_DESC urquan_desc = MISSILE_SPEED * MISSILE_LIFE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/utwig/utwig.c b/sc2/src/sc2code/ships/utwig/utwig.c index f5404acb2..b0407998f 100644 --- a/sc2/src/sc2code/ships/utwig/utwig.c +++ b/sc2/src/sc2code/ships/utwig/utwig.c @@ -47,7 +47,7 @@ static RACE_DESC utwig_desc = FIRES_FORE | POINT_DEFENSE | SHIELD_DEFENSE, 22, /* Super Melee cost */ 666 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY >> 1, MAX_ENERGY, { 8534, 8797, @@ -55,6 +55,7 @@ static RACE_DESC utwig_desc = (STRING)UTWIG_RACE_STRINGS, (FRAME)UTWIG_ICON_MASK_PMAP_ANIM, (FRAME)UTWIG_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -100,9 +101,10 @@ static RACE_DESC utwig_desc = CLOSE_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/vux/vux.c b/sc2/src/sc2code/ships/vux/vux.c index f982d7063..0be6bb9da 100644 --- a/sc2/src/sc2code/ships/vux/vux.c +++ b/sc2/src/sc2code/ships/vux/vux.c @@ -48,7 +48,7 @@ static RACE_DESC vux_desc = FIRES_FORE | SEEKING_SPECIAL | IMMEDIATE_WEAPON, 12, /* Super Melee cost */ 900 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 4412, 1558, @@ -56,6 +56,7 @@ static RACE_DESC vux_desc = (STRING)VUX_RACE_STRINGS, (FRAME)VUX_ICON_MASK_PMAP_ANIM, (FRAME)VUX_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -101,9 +102,10 @@ static RACE_DESC vux_desc = CLOSE_RANGE_WEAPON, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/yehat/yehat.c b/sc2/src/sc2code/ships/yehat/yehat.c index e1d913df7..0be0379ec 100644 --- a/sc2/src/sc2code/ships/yehat/yehat.c +++ b/sc2/src/sc2code/ships/yehat/yehat.c @@ -45,7 +45,7 @@ static RACE_DESC yehat_desc = FIRES_FORE | SHIELD_DEFENSE, 23, /* Super Melee cost */ 750 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 4970, 40, @@ -53,6 +53,7 @@ static RACE_DESC yehat_desc = (STRING)YEHAT_RACE_STRINGS, (FRAME)YEHAT_ICON_MASK_PMAP_ANIM, (FRAME)YEHAT_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -98,9 +99,10 @@ static RACE_DESC yehat_desc = MISSILE_SPEED * MISSILE_LIFE / 3, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/ships/zoqfot/zoqfot.c b/sc2/src/sc2code/ships/zoqfot/zoqfot.c index d6264736a..8eb8858dc 100644 --- a/sc2/src/sc2code/ships/zoqfot/zoqfot.c +++ b/sc2/src/sc2code/ships/zoqfot/zoqfot.c @@ -46,7 +46,7 @@ static RACE_DESC zoqfotpik_desc = FIRES_FORE, 6, /* Super Melee cost */ 320 / SPHERE_RADIUS_INCREMENT, /* Initial sphere of influence radius */ - MAX_CREW, MAX_CREW, + 0, 0, /* Hack; old crew field */ MAX_ENERGY, MAX_ENERGY, { 3761, 5333, @@ -54,6 +54,7 @@ static RACE_DESC zoqfotpik_desc = (STRING)ZOQFOTPIK_RACE_STRINGS, (FRAME)ZOQFOTPIK_ICON_MASK_PMAP_ANIM, (FRAME)ZOQFOTPIK_MICON_MASK_PMAP_ANIM, + MAX_CREW, MAX_CREW, }, { MAX_THRUST, @@ -99,9 +100,10 @@ static RACE_DESC zoqfotpik_desc = MISSILE_RANGE, NULL_PTR, }, - NULL_PTR, - NULL_PTR, - NULL_PTR, + (UNINIT_FUNC *) NULL, + (PREPROCESS_FUNC *) NULL, + (POSTPROCESS_FUNC *) NULL, + (INIT_WEAPON_FUNC *) NULL, 0, }; diff --git a/sc2/src/sc2code/shipstat.c b/sc2/src/sc2code/shipstat.c index 7017a8053..b393f7f03 100644 --- a/sc2/src/sc2code/shipstat.c +++ b/sc2/src/sc2code/shipstat.c @@ -152,9 +152,7 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect) r.extent.height += pClipRect->corner.y & 1; SetContextClipRect (&r); SetFrameHot (Screen, MAKE_HOT_SPOT ( - pClipRect->corner.x, - (pClipRect->corner.y & ~1) - )); + pClipRect->corner.x, (pClipRect->corner.y & ~1))); } BatchGraphics (); @@ -170,10 +168,13 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect) { 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; - 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.y = GAUGE_YOFFS + 1 + y; r.extent.width = STAT_WIDTH + 2; @@ -191,7 +192,8 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect) r.extent.width = 1; r.extent.height = crew_height; 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.y = GAUGE_YOFFS - crew_height + y; r.extent.width = STAT_WIDTH + 2; @@ -297,6 +299,8 @@ InitShipStatus (STARSHIPPTR StarShipPtr, PRECT pClipRect) SetContext (OldContext); } +// Pre: -crew_delta <= StarShipPtr->crew_level +// crew_delta <= StarShipPtr->max_crew - StarShipPtr->crew_level void DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta, SIZE energy_delta) @@ -311,96 +315,83 @@ DeltaStatistics (STARSHIPPTR StarShipPtr, SIZE crew_delta, SIZE ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info; x = 0; - y = GAUGE_YOFFS - + ((ShipInfoPtr->ship_flags & GOOD_GUY) ? + y = GAUGE_YOFFS + ((ShipInfoPtr->ship_flags & GOOD_GUY) ? GOOD_GUY_YOFFS : BAD_GUY_YOFFS); r.extent.width = UNIT_WIDTH; r.extent.height = UNIT_HEIGHT; + 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) { r.corner.y = (y + 1) - - (((ShipInfoPtr->crew_level + 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; - } - } - + (((oldNumBlocks + 1) >> 1) * (UNIT_HEIGHT + 1)); #define CREW_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02) #define ROBOT_UNIT_COLOR BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08) SetContextForeGroundColor ( (ShipInfoPtr->ship_flags & CREW_IMMUNE) ? ROBOT_UNIT_COLOR : CREW_UNIT_COLOR); - while (crew_delta--) + for (blockI = oldNumBlocks; blockI < newNumBlocks; blockI++) { r.corner.x = x + (CREW_XOFFS + 1); - if (!(ShipInfoPtr->crew_level & 1)) + if (!(blockI & 1)) { r.corner.x += UNIT_WIDTH + 1; r.corner.y -= UNIT_HEIGHT + 1; } DrawFilledRectangle (&r); - ++ShipInfoPtr->crew_level; } } 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); r.corner.y = (y + 1) - - (((ShipInfoPtr->crew_level + 2) >> 1) * (UNIT_HEIGHT + 1)); - do + (((oldNumBlocks + 2) >> 1) * (UNIT_HEIGHT + 1)); + for (blockI = oldNumBlocks; blockI > newNumBlocks; blockI--) { 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.y += UNIT_HEIGHT + 1; } 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); } } diff --git a/sc2/src/sc2code/shipyard.c b/sc2/src/sc2code/shipyard.c index e329ab3e4..882257bb9 100644 --- a/sc2/src/sc2code/shipyard.c +++ b/sc2/src/sc2code/shipyard.c @@ -149,6 +149,7 @@ SpinStarShip (HSTARSHIP hStarShip) } #endif +// Count the ships which can be built by the player. static COUNT GetAvailableRaceCount (void) { @@ -382,9 +383,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr) while (hStarShip) { StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip ( - &GLOBAL (built_ship_q), - hStarShip - ); + &GLOBAL (built_ship_q), hStarShip); if (GET_GROUP_LOC (StarShipPtr) > which_window) { UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); @@ -407,9 +406,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr) for (i = 0; i < num_ships; ++i) { StarShipPtr = (SHIP_FRAGMENTPTR)LockStarShip ( - &GLOBAL (built_ship_q), - hStarShip - ); + &GLOBAL (built_ship_q), hStarShip); hNextShip = _GetSuccLink (StarShipPtr); pship_win_info->StarShipPtr = StarShipPtr; @@ -435,10 +432,7 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENTPTR YankedStarShipPtr) (which_window / HANGAR_SHIPS_ROW)); ++pship_win_info; - UnlockStarShip ( - &GLOBAL (built_ship_q), - hStarShip - ); + UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); hStarShip = hNextShip; } } diff --git a/sc2/src/sc2code/sis.c b/sc2/src/sc2code/sis.c index f77551e42..3bcaaba42 100644 --- a/sc2/src/sc2code/sis.c +++ b/sc2/src/sc2code/sis.c @@ -1565,14 +1565,18 @@ SetFlashRect (PRECT pRect, FRAME f) SetContext (OldContext); } - void SaveFlagshipState (void) { 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; + // Find the flagship element. for (hElement = GetHeadElement (); hElement != 0; hElement = hNextElement) { @@ -1586,8 +1590,7 @@ SaveFlagshipState (void) GetElementStarShip (ElementPtr, &StarShipPtr); GLOBAL (ShipStamp.frame) = (FRAME)MAKE_DWORD ( - StarShipPtr->ShipFacing + 1, 0 - ); + StarShipPtr->ShipFacing + 1, 0); hNextElement = 0; } UnlockElement (hElement); @@ -1595,6 +1598,7 @@ SaveFlagshipState (void) } else if (pSolarSysState) { + // Player is in a solar system. UWORD index1, index2; FRAME frame; @@ -1604,7 +1608,9 @@ SaveFlagshipState (void) { index1 = GetFrameIndex (frame) + 1; if (pSolarSysState->pBaseDesc == pSolarSysState->PlanetDesc) + { index2 = 0; + } else { index2 = (UWORD)(pSolarSysState->pBaseDesc->pPrevDesc @@ -1615,6 +1621,9 @@ SaveFlagshipState (void) } else { + // In orbit around a planet. + + // Update the starinfo.dat file if necessary. if (GET_GAME_STATE (PLANETARY_CHANGE)) { PutPlanetInfo (); @@ -1635,3 +1644,4 @@ SaveFlagshipState (void) } } + diff --git a/sc2/src/sc2code/state.c b/sc2/src/sc2code/state.c index c686da499..333eacc7f 100644 --- a/sc2/src/sc2code/state.c +++ b/sc2/src/sc2code/state.c @@ -246,9 +246,10 @@ GetPlanetInfo (void) { PVOID fp; - pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] = - pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[MINERAL_SCAN] = - pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN] = 0; + pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] = 0; + pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[MINERAL_SCAN] = 0; + pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN] = 0; + fp = OpenStateFile (STARINFO_FILE, "rb"); if (fp) { @@ -269,19 +270,19 @@ GetPlanetInfo (void) if (offset) { - COUNT i; + COUNT i; - for (i = 0; i < planet_index; ++i) + for (i = 0; i < planet_index; ++i) offset += sizeof ( pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask ) * (pSolarSysState->PlanetDesc[i].NumPlanets + 1); - offset += sizeof ( + offset += sizeof ( pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask ) * moon_index; - SeekStateFile (fp, offset, SEEK_SET); - ReadStateFile (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask, + SeekStateFile (fp, offset, SEEK_SET); + ReadStateFile (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask, sizeof ( pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask ), 1, fp); diff --git a/sc2/src/sc2code/status.c b/sc2/src/sc2code/status.c index b2b751981..f5735c051 100644 --- a/sc2/src/sc2code/status.c +++ b/sc2/src/sc2code/status.c @@ -114,7 +114,7 @@ CaptainsWindow (CAPTAIN_STUFFPTR CSPtr, COORD y, ELEMENT_FLAGS } void -DrawBattleCrewAmount (STARSHIPPTR StarShipPtr, BOOLEAN CountPlayer) +DrawBattleCrewAmount (STARSHIPPTR StarShipPtr) { #define MAX_CREW_DIGITS 3 RECT r; @@ -136,7 +136,7 @@ DrawBattleCrewAmount (STARSHIPPTR StarShipPtr, BOOLEAN CountPlayer) r.extent.width = 6 * MAX_CREW_DIGITS + 6; r.extent.height = 5; - sprintf (buf, "%u", GLOBAL_SIS (CrewEnlisted) + (CountPlayer ? 1 : 0)); + sprintf (buf, "%u", StarShipPtr->RaceDescPtr->ship_info.crew_level); SetContextFont (StarConFont); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08)); @@ -247,6 +247,7 @@ DrawCaptainsWindow (STARSHIPPTR StarShipPtr) { if (RDPtr->ship_info.ship_flags & GOOD_GUY) { + // SIS TEXT t; t.baseline.x = STATUS_WIDTH >> 1; @@ -254,12 +255,19 @@ DrawCaptainsWindow (STARSHIPPTR StarShipPtr) t.align = ALIGN_CENTER; t.pStr = GLOBAL_SIS (CommanderName); t.CharCount = (COUNT)~0; - DrawBattleCrewAmount (StarShipPtr, TRUE); - SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02)); + SetContextForeGroundColor ( + BUILD_COLOR (MAKE_RGB15 (0x00, 0x14, 0x00), 0x02)); SetContextFont (TinyFont); 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 (); } @@ -322,7 +330,7 @@ DeltaCrew (ELEMENTPTR ElementPtr, SIZE crew_delta) ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info; - ElementPtr->crew_level += (BYTE)crew_delta; + ElementPtr->crew_level += crew_delta; if (ElementPtr->crew_level > ShipInfoPtr->max_crew) { crew_delta = ShipInfoPtr->max_crew - ShipInfoPtr->crew_level; @@ -331,8 +339,8 @@ DeltaCrew (ELEMENTPTR ElementPtr, SIZE crew_delta) } else if (crew_delta < 0) { - if (ElementPtr->crew_level > (BYTE)-crew_delta) - ElementPtr->crew_level += (BYTE)crew_delta; + if (ElementPtr->crew_level > (COUNT)-crew_delta) + ElementPtr->crew_level += crew_delta; else { crew_delta = -(SIZE)ElementPtr->crew_level; diff --git a/sc2/src/sc2code/tactrans.c b/sc2/src/sc2code/tactrans.c index f477ca9e5..e820fbc39 100644 --- a/sc2/src/sc2code/tactrans.c +++ b/sc2/src/sc2code/tactrans.c @@ -73,8 +73,14 @@ new_ship (PELEMENT DeadShipPtr) DeadStarShipPtr->RaceDescPtr->ship_info.crew_level; 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 (); - 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; @@ -144,6 +150,9 @@ new_ship (PELEMENT DeadShipPtr) SetElementStarShip (DeadShipPtr, 0); RestartMusic = OpponentAlive (DeadStarShipPtr); + if (DeadStarShipPtr->RaceDescPtr->uninit_func != NULL) + (*DeadStarShipPtr->RaceDescPtr->uninit_func) ( + DeadStarShipPtr->RaceDescPtr); free_ship (DeadStarShipPtr, TRUE); UnbatchGraphics (); if (GetNextStarShip (DeadStarShipPtr, diff --git a/sc2/src/sc2code/uqmdebug.c b/sc2/src/sc2code/uqmdebug.c index e250578a3..4ea886df8 100644 --- a/sc2/src/sc2code/uqmdebug.c +++ b/sc2/src/sc2code/uqmdebug.c @@ -1271,7 +1271,8 @@ resetCrewBattle(void) { COUNT delta; CONTEXT OldContext; - if (!(GLOBAL (CurrentActivity) & IN_BATTLE)) + if (!(GLOBAL (CurrentActivity) & IN_BATTLE) || + (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE)) return; StarShipPtr = findPlayerShip (GOOD_GUY);