Fixed a semantical bug that arose out of ip_group_q split off (cleaner code); more comments
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2803 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+30
-12
@@ -57,6 +57,7 @@ typedef struct
|
|||||||
DWORD GroupOffset[NUM_SAVED_BATTLE_GROUPS + 1];
|
DWORD GroupOffset[NUM_SAVED_BATTLE_GROUPS + 1];
|
||||||
// Absolute offsets of group definitions in a state file
|
// Absolute offsets of group definitions in a state file
|
||||||
// Group 0 is a list of groups present in solarsys
|
// Group 0 is a list of groups present in solarsys
|
||||||
|
// (RANDGRPINFO_FILE only)
|
||||||
// Groups 1..max are definitions of actual battle groups
|
// Groups 1..max are definitions of actual battle groups
|
||||||
// containing ship makeup and status
|
// containing ship makeup and status
|
||||||
|
|
||||||
@@ -407,44 +408,47 @@ FlushGroupInfo (GROUP_HEADER* pGH, DWORD offset, BYTE which_group, void *fp)
|
|||||||
{
|
{
|
||||||
if (which_group == GROUP_LIST)
|
if (which_group == GROUP_LIST)
|
||||||
{
|
{
|
||||||
QUEUE temp_q;
|
|
||||||
HIPGROUP hGroup, hNextGroup;
|
HIPGROUP hGroup, hNextGroup;
|
||||||
|
|
||||||
/* If the group list was never written before, add it */
|
/* If the group list was never written before, add it */
|
||||||
if (pGH->GroupOffset[0] == 0)
|
if (pGH->GroupOffset[0] == 0)
|
||||||
pGH->GroupOffset[0] = LengthStateFile (fp);
|
pGH->GroupOffset[0] = LengthStateFile (fp);
|
||||||
|
|
||||||
|
// XXX: npc_built_ship_q must be empty because the wipe-out
|
||||||
|
// procedure is actually the writing of the npc_built_ship_q
|
||||||
|
// out as the group in question
|
||||||
|
assert (!GetHeadLink (&GLOBAL (npc_built_ship_q)));
|
||||||
|
|
||||||
/* Weed out the groups that left the system first */
|
/* Weed out the groups that left the system first */
|
||||||
// XXX: QUEUE struct copy!
|
for (hGroup = GetHeadLink (&GLOBAL (ip_group_q));
|
||||||
temp_q = GLOBAL (ip_group_q);
|
|
||||||
SetHeadLink (&GLOBAL (ip_group_q), 0);
|
|
||||||
SetTailLink (&GLOBAL (ip_group_q), 0);
|
|
||||||
for (hGroup = GetHeadLink (&temp_q);
|
|
||||||
hGroup; hGroup = hNextGroup)
|
hGroup; hGroup = hNextGroup)
|
||||||
{
|
{
|
||||||
BYTE in_system;
|
BYTE in_system;
|
||||||
BYTE group_id;
|
BYTE group_id;
|
||||||
IP_GROUP *GroupPtr;
|
IP_GROUP *GroupPtr;
|
||||||
|
|
||||||
GroupPtr = LockIpGroup (&temp_q, hGroup);
|
GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
hNextGroup = _GetSuccLink (GroupPtr);
|
hNextGroup = _GetSuccLink (GroupPtr);
|
||||||
in_system = GroupPtr->in_system;
|
in_system = GroupPtr->in_system;
|
||||||
group_id = GroupPtr->group_id;
|
group_id = GroupPtr->group_id;
|
||||||
UnlockIpGroup (&temp_q, hGroup);
|
UnlockIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
|
|
||||||
if (!in_system)
|
if (!in_system)
|
||||||
{
|
{
|
||||||
|
// The following 'if' is needed because GROUP_LIST is only
|
||||||
|
// ever flushed to RANDGRPINFO_FILE, but the current group
|
||||||
|
// may need to be updated in the DEFGRPINFO_FILE as well.
|
||||||
|
// In that case, PutGroupInfo() will update the correct file.
|
||||||
if (GLOBAL (BattleGroupRef))
|
if (GLOBAL (BattleGroupRef))
|
||||||
PutGroupInfo (GLOBAL (BattleGroupRef), group_id);
|
PutGroupInfo (GLOBAL (BattleGroupRef), group_id);
|
||||||
else
|
else
|
||||||
FlushGroupInfo (pGH, GROUPS_RANDOM, group_id, fp);
|
FlushGroupInfo (pGH, GROUPS_RANDOM, group_id, fp);
|
||||||
|
// This will also wipe the group out in the RANDGRPINFO_FILE
|
||||||
pGH->GroupOffset[group_id] = 0;
|
pGH->GroupOffset[group_id] = 0;
|
||||||
RemoveQueue (&temp_q, hGroup);
|
RemoveQueue (&GLOBAL (ip_group_q), hGroup);
|
||||||
FreeIpGroup (&temp_q, hGroup);
|
FreeIpGroup (&GLOBAL (ip_group_q), hGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// XXX: QUEUE struct copy!
|
|
||||||
GLOBAL (ip_group_q) = temp_q;
|
|
||||||
}
|
}
|
||||||
else if (which_group > pGH->NumGroups)
|
else if (which_group > pGH->NumGroups)
|
||||||
{ /* Group not present yet -- add it */
|
{ /* Group not present yet -- add it */
|
||||||
@@ -709,6 +713,10 @@ GetGroupInfo (DWORD offset, BYTE which_group)
|
|||||||
|
|
||||||
if (LastEncGroup)
|
if (LastEncGroup)
|
||||||
{
|
{
|
||||||
|
// The following 'if' is needed because GROUP_LIST is only
|
||||||
|
// ever read from RANDGRPINFO_FILE, but the LastEncGroup
|
||||||
|
// may need to be updated in the DEFGRPINFO_FILE as well.
|
||||||
|
// In that case, PutGroupInfo() will update the correct file.
|
||||||
if (GLOBAL (BattleGroupRef))
|
if (GLOBAL (BattleGroupRef))
|
||||||
PutGroupInfo (GLOBAL (BattleGroupRef), LastEncGroup);
|
PutGroupInfo (GLOBAL (BattleGroupRef), LastEncGroup);
|
||||||
else
|
else
|
||||||
@@ -774,6 +782,11 @@ GetGroupInfo (DWORD offset, BYTE which_group)
|
|||||||
// harder in the future, as special care will have to be taken
|
// harder in the future, as special care will have to be taken
|
||||||
// when loading a game into an encounter.
|
// when loading a game into an encounter.
|
||||||
LastEncGroup = which_group;
|
LastEncGroup = which_group;
|
||||||
|
// The following 'if' is needed because GROUP_LIST is only
|
||||||
|
// ever written to RANDGRPINFO_FILE, but the group we are reading
|
||||||
|
// may be in the DEFGRPINFO_FILE as well.
|
||||||
|
// In that case, PutGroupInfo() will update the correct file.
|
||||||
|
// Always calling PutGroupInfo() here would also be acceptable now.
|
||||||
if (offset != GROUPS_RANDOM)
|
if (offset != GROUPS_RANDOM)
|
||||||
PutGroupInfo (GROUPS_RANDOM, GROUP_LIST);
|
PutGroupInfo (GROUPS_RANDOM, GROUP_LIST);
|
||||||
else
|
else
|
||||||
@@ -829,6 +842,11 @@ PutGroupInfo (DWORD offset, BYTE which_group)
|
|||||||
WriteGroupHeader (fp, &GH);
|
WriteGroupHeader (fp, &GH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX: This is a bit dangerous. The assumption here is that we are
|
||||||
|
// only called to write GROUP_LIST in the GROUPS_RANDOM context,
|
||||||
|
// which is true right now and in which case we would seek to 0 anyway.
|
||||||
|
// The latter also makes guarding the seek with
|
||||||
|
// 'if (which_group != GROUP_LIST)' moot.
|
||||||
if (which_group != GROUP_LIST)
|
if (which_group != GROUP_LIST)
|
||||||
{
|
{
|
||||||
SeekStateFile (fp, offset, SEEK_SET);
|
SeekStateFile (fp, offset, SEEK_SET);
|
||||||
|
|||||||
@@ -36,8 +36,14 @@ extern DWORD PutGroupInfo (DWORD offset, BYTE which_group);
|
|||||||
#define GROUPS_ADD_NEW ((DWORD)(~0L))
|
#define GROUPS_ADD_NEW ((DWORD)(~0L))
|
||||||
#define GROUP_LIST ((BYTE)0)
|
#define GROUP_LIST ((BYTE)0)
|
||||||
#define GROUP_INIT_IP ((BYTE)~0)
|
#define GROUP_INIT_IP ((BYTE)~0)
|
||||||
|
// Initialize IP group list (ip_group_q) from the actual groups
|
||||||
|
// (not GROUP_LIST) in one of the state files
|
||||||
#define GROUP_LOAD_IP GROUP_LIST
|
#define GROUP_LOAD_IP GROUP_LIST
|
||||||
|
// Read IP group list into ip_group_q from the list entry
|
||||||
|
// (GROUP_LIST) in one of the state files
|
||||||
#define GROUP_SAVE_IP ((BYTE)~0)
|
#define GROUP_SAVE_IP ((BYTE)~0)
|
||||||
|
// Write IP group list from ip_group_q to the list entry
|
||||||
|
// (GROUP_LIST) in one of the state files
|
||||||
extern void BuildGroups (void);
|
extern void BuildGroups (void);
|
||||||
|
|
||||||
#define MAX_DESC_CHARS 60
|
#define MAX_DESC_CHARS 60
|
||||||
|
|||||||
Reference in New Issue
Block a user