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:
avolkov
2007-07-11 21:36:42 +00:00
parent a46b263929
commit 40fc446cd6
2 changed files with 36 additions and 12 deletions
+30 -12
View File
@@ -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);
+6
View File
@@ -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