Moved static SIS variables to per-instance RACE_DESC; pre-configure SIS weapons

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3279 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2009-11-05 08:26:44 +00:00
parent d5230903d8
commit 897bc6a47e
+121 -92
View File
@@ -116,6 +116,17 @@ static RACE_DESC sis_desc =
0,
};
// Private per-instance SIS data
typedef struct
{
COUNT num_trackers;
COUNT num_blasters;
MISSILE_BLOCK MissileBlock[6];
} SIS_DATA;
static void InitWeaponSlots (RACE_DESC *RaceDescPtr,
const BYTE *ModuleSlots);
static void InitModuleSlots (RACE_DESC *RaceDescPtr,
const BYTE *ModuleSlots);
static void InitDriveSlots (RACE_DESC *RaceDescPtr,
@@ -124,7 +135,6 @@ static void InitJetSlots (RACE_DESC *RaceDescPtr,
const BYTE *JetSlots);
void uninit_sis (RACE_DESC *pRaceDesc);
static BYTE num_trackers = 0;
static void
sis_hyper_preprocess (ELEMENT *ElementPtr)
@@ -546,91 +556,29 @@ initialize_blasters (ELEMENT *ShipPtr, HELEMENT BlasterArray[])
#define SIS_HORZ_OFFSET 20
#define BLASTER_HITS 2
#define BLASTER_OFFSET 8
COUNT num_blasters;
BYTE nt;
COUNT i;
STARSHIP *StarShipPtr;
MISSILE_BLOCK MissileBlock[6];
MISSILE_BLOCK *lpMB;
SIS_DATA *SisData;
GetElementStarShip (ShipPtr, &StarShipPtr);
SisData = (SIS_DATA *) StarShipPtr->RaceDescPtr->data;
num_blasters = 0;
for (i = 0, lpMB = &MissileBlock[0]; i < NUM_MODULE_SLOTS; ++i)
nt = (BYTE)((4 - SisData->num_trackers) & 3);
for (i = 0; i < SisData->num_blasters; ++i)
{
BYTE which_gun;
MISSILE_BLOCK MissileBlock = SisData->MissileBlock[i];
if (i == 3)
i = NUM_MODULE_SLOTS - 1;
which_gun = GLOBAL_SIS (ModuleSlots[(NUM_MODULE_SLOTS - 1) - i]);
if (which_gun >= GUN_WEAPON && which_gun <= CANNON_WEAPON)
{
which_gun -= GUN_WEAPON - 1;
lpMB->cx = ShipPtr->next.location.x;
lpMB->cy = ShipPtr->next.location.y;
lpMB->farray = StarShipPtr->RaceDescPtr->ship_data.weapon;
lpMB->sender = ShipPtr->playerNr;
lpMB->flags = IGNORE_SIMILAR;
lpMB->blast_offs = BLASTER_OFFSET;
lpMB->speed = BLASTER_SPEED;
lpMB->preprocess_func = blaster_preprocess;
lpMB->hit_points = BLASTER_HITS * which_gun;
lpMB->damage = BLASTER_DAMAGE * which_gun;
lpMB->life = BLASTER_LIFE
+ ((BLASTER_LIFE >> 2) * (which_gun - 1));
MissileBlock.cx = ShipPtr->next.location.x;
MissileBlock.cy = ShipPtr->next.location.y;
MissileBlock.farray = StarShipPtr->RaceDescPtr->ship_data.weapon;
MissileBlock.sender = ShipPtr->playerNr;
MissileBlock.face = NORMALIZE_FACING (StarShipPtr->ShipFacing
+ MissileBlock.face);
if (which_gun == 1)
lpMB->index = 0;
else if (which_gun == 2)
lpMB->index = 9;
else
lpMB->index = 16;
switch (i)
{
case 0: /* NOSE WEAPON */
lpMB->pixoffs = SIS_VERT_OFFSET;
lpMB->face = StarShipPtr->ShipFacing;
break;
case 1: /* SPREAD WEAPON */
lpMB->pixoffs = SIS_VERT_OFFSET;
lpMB->face = NORMALIZE_FACING (
StarShipPtr->ShipFacing + 1);
lpMB[1] = lpMB[0];
++lpMB;
lpMB->face = NORMALIZE_FACING (
StarShipPtr->ShipFacing - 1);
break;
case 2: /* SIDE WEAPON */
lpMB->pixoffs = SIS_HORZ_OFFSET;
lpMB->face = NORMALIZE_FACING (
StarShipPtr->ShipFacing
+ ANGLE_TO_FACING (QUADRANT));
lpMB[1] = lpMB[0];
++lpMB;
lpMB->face = NORMALIZE_FACING (
StarShipPtr->ShipFacing
- ANGLE_TO_FACING (QUADRANT));
break;
case NUM_MODULE_SLOTS - 1: /* TAIL WEAPON */
lpMB->pixoffs = SIS_VERT_OFFSET;
lpMB->face = NORMALIZE_FACING (
StarShipPtr->ShipFacing
+ ANGLE_TO_FACING (HALF_CIRCLE));
break;
}
++lpMB;
}
}
nt = (BYTE)((4 - num_trackers) & 3);
num_blasters = lpMB - &MissileBlock[0];
for (i = 0, lpMB = &MissileBlock[0]; i < num_blasters; ++i, ++lpMB)
{
if ((BlasterArray[i] = initialize_missile (lpMB)))
BlasterArray[i] = initialize_missile (&MissileBlock);
if (BlasterArray[i])
{
ELEMENT *BlasterPtr;
@@ -639,9 +587,10 @@ initialize_blasters (ELEMENT *ShipPtr, HELEMENT BlasterArray[])
BlasterPtr->turn_wait = MAKE_BYTE (nt, nt);
UnlockElement (BlasterArray[i]);
}
}
return (num_blasters);
return SisData->num_blasters;
}
static void
@@ -650,8 +599,10 @@ sis_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern,
{
EVALUATE_DESC *lpEvalDesc;
STARSHIP *StarShipPtr;
SIS_DATA *SisData;
GetElementStarShip (ShipPtr, &StarShipPtr);
SisData = (SIS_DATA *) StarShipPtr->RaceDescPtr->data;
lpEvalDesc = &ObjectsOfConcern[ENEMY_WEAPON_INDEX];
if (lpEvalDesc->ObjectPtr)
@@ -683,7 +634,7 @@ sis_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern,
ship_intelligence (ShipPtr, ObjectsOfConcern, ConcernCounter);
lpEvalDesc = &ObjectsOfConcern[ENEMY_SHIP_INDEX];
if (num_trackers
if (SisData->num_trackers
&& StarShipPtr->weapon_counter == 0
&& !(StarShipPtr->ship_input_state & WEAPON)
&& lpEvalDesc->ObjectPtr
@@ -717,10 +668,95 @@ sis_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern,
}
}
static void
InitWeaponSlots (RACE_DESC *RaceDescPtr, const BYTE *ModuleSlots)
{
#define SIS_VERT_OFFSET 28
#define SIS_HORZ_OFFSET 20
#define BLASTER_HITS 2
#define BLASTER_OFFSET 8
COUNT i;
SIS_DATA *SisData = (SIS_DATA *) RaceDescPtr->data;
MISSILE_BLOCK *lpMB = SisData->MissileBlock;
SisData->num_blasters = 0;
for (i = 0; i < NUM_MODULE_SLOTS; ++i)
{
COUNT which_gun;
if (i == 3)
i = NUM_MODULE_SLOTS - 1;
which_gun = ModuleSlots[(NUM_MODULE_SLOTS - 1) - i];
if (which_gun < GUN_WEAPON || which_gun > CANNON_WEAPON)
continue; /* not a gun */
which_gun -= GUN_WEAPON - 1;
RaceDescPtr->characteristics.weapon_energy_cost +=
which_gun * 2;
lpMB->flags = IGNORE_SIMILAR;
lpMB->blast_offs = BLASTER_OFFSET;
lpMB->speed = BLASTER_SPEED;
lpMB->preprocess_func = blaster_preprocess;
lpMB->hit_points = BLASTER_HITS * which_gun;
lpMB->damage = BLASTER_DAMAGE * which_gun;
lpMB->life = BLASTER_LIFE + ((BLASTER_LIFE >> 2) * (which_gun - 1));
if (which_gun == 1)
lpMB->index = 0;
else if (which_gun == 2)
lpMB->index = 9;
else
lpMB->index = 16;
switch (i)
{
case 0: /* NOSE WEAPON */
RaceDescPtr->ship_info.ship_flags |= FIRES_FORE;
lpMB->pixoffs = SIS_VERT_OFFSET;
lpMB->face = 0;
break;
case 1: /* SPREAD WEAPON */
RaceDescPtr->ship_info.ship_flags |= FIRES_FORE;
lpMB->pixoffs = SIS_VERT_OFFSET;
lpMB->face = +1;
/* copy it because there are two */
lpMB[1] = lpMB[0];
++lpMB;
++SisData->num_blasters;
lpMB->face = NORMALIZE_FACING (-1);
break;
case 2: /* SIDE WEAPON */
RaceDescPtr->ship_info.ship_flags |=
FIRES_LEFT | FIRES_RIGHT;
lpMB->pixoffs = SIS_HORZ_OFFSET;
lpMB->face = ANGLE_TO_FACING (QUADRANT);
/* copy it because there are two */
lpMB[1] = lpMB[0];
++lpMB;
++SisData->num_blasters;
lpMB->face = NORMALIZE_FACING (-ANGLE_TO_FACING (QUADRANT));
break;
case NUM_MODULE_SLOTS - 1: /* TAIL WEAPON */
RaceDescPtr->ship_info.ship_flags |= FIRES_AFT;
lpMB->pixoffs = SIS_VERT_OFFSET;
lpMB->face = ANGLE_TO_FACING (HALF_CIRCLE);
break;
}
++lpMB;
++SisData->num_blasters;
}
}
static void
InitModuleSlots (RACE_DESC *RaceDescPtr, const BYTE *ModuleSlots)
{
COUNT i;
COUNT num_trackers;
SIS_DATA *SisData = (SIS_DATA *) RaceDescPtr->data;
RaceDescPtr->ship_info.max_crew = 0;
num_trackers = 0;
@@ -734,19 +770,6 @@ InitModuleSlots (RACE_DESC *RaceDescPtr, const BYTE *ModuleSlots)
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;
@@ -767,6 +790,7 @@ InitModuleSlots (RACE_DESC *RaceDescPtr, const BYTE *ModuleSlots)
if (num_trackers > MAX_TRACKING)
num_trackers = MAX_TRACKING;
RaceDescPtr->characteristics.weapon_energy_cost += num_trackers * 3;
SisData->num_trackers = num_trackers;
if (RaceDescPtr->characteristics.special_energy_cost)
{
RaceDescPtr->ship_info.ship_flags |= POINT_DEFENSE;
@@ -860,7 +884,9 @@ init_sis (void)
SET_GAME_STATE (BOMB_CARRIER, 1);
}
new_sis_desc.data = (intptr_t) HCalloc (sizeof (SIS_DATA));
InitModuleSlots (&new_sis_desc, GLOBAL_SIS (ModuleSlots));
InitWeaponSlots (&new_sis_desc, GLOBAL_SIS (ModuleSlots));
InitDriveSlots (&new_sis_desc, GLOBAL_SIS (DriveSlots));
InitJetSlots (&new_sis_desc, GLOBAL_SIS (JetSlots));
@@ -892,6 +918,9 @@ uninit_sis (RACE_DESC *pRaceDesc)
if (pRaceDesc->ship_info.ship_flags & PLAYER_CAPTAIN)
GLOBAL_SIS (CrewEnlisted)--;
}
HFree ((void *)pRaceDesc->data);
pRaceDesc->data = 0;
}