Restructure fuelcen.c for merging
This commit is contained in:
parent
bcd6ea5eed
commit
7c1945345c
|
@ -131,9 +131,6 @@ void fuelcen_create( segment *segp)
|
||||||
Error( "Invalid station type %d in fuelcen.c\n", station_type );
|
Error( "Invalid station type %d in fuelcen.c\n", station_type );
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert( (segp != NULL) );
|
|
||||||
if ( segp == NULL ) return;
|
|
||||||
|
|
||||||
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
||||||
Assert( Num_fuelcenters > -1 );
|
Assert( Num_fuelcenters > -1 );
|
||||||
|
|
||||||
|
@ -162,9 +159,7 @@ static void matcen_create( segment *segp)
|
||||||
{
|
{
|
||||||
int station_type = segp->special;
|
int station_type = segp->special;
|
||||||
|
|
||||||
Assert( (segp != NULL) );
|
|
||||||
Assert(station_type == SEGMENT_IS_ROBOTMAKER);
|
Assert(station_type == SEGMENT_IS_ROBOTMAKER);
|
||||||
if ( segp == NULL ) return;
|
|
||||||
|
|
||||||
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
||||||
Assert( Num_fuelcenters > -1 );
|
Assert( Num_fuelcenters > -1 );
|
||||||
|
@ -260,6 +255,7 @@ void fuelcen_delete( segment * segp )
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
Restart: ;
|
Restart: ;
|
||||||
|
segp->special = 0;
|
||||||
|
|
||||||
for (i=0; i<Num_fuelcenters; i++ ) {
|
for (i=0; i<Num_fuelcenters; i++ ) {
|
||||||
if ( Station[i].segnum == segp-Segments ) {
|
if ( Station[i].segnum == segp-Segments ) {
|
||||||
|
@ -283,7 +279,6 @@ Restart: ;
|
||||||
Station[j] = Station[j+1];
|
Station[j] = Station[j+1];
|
||||||
Segments[Station[j].segnum].value = j;
|
Segments[Station[j].segnum].value = j;
|
||||||
}
|
}
|
||||||
segp->special = 0;
|
|
||||||
goto Restart;
|
goto Restart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -378,8 +373,13 @@ static void robotmaker_proc( FuelCenter * robotcen )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RobotCenters[matcen_num].robot_flags[0] == 0) {
|
matcen_info *mi = &RobotCenters[matcen_num];
|
||||||
|
for (unsigned i = 0;; ++i)
|
||||||
|
{
|
||||||
|
if (i >= (sizeof(mi->robot_flags) / sizeof(mi->robot_flags[0])))
|
||||||
return;
|
return;
|
||||||
|
if (mi->robot_flags[i])
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait until we have a free slot for this puppy...
|
// Wait until we have a free slot for this puppy...
|
||||||
|
@ -466,20 +466,23 @@ static void robotmaker_proc( FuelCenter * robotcen )
|
||||||
compute_segment_center(&cur_object_loc, &Segments[robotcen->segnum]);
|
compute_segment_center(&cur_object_loc, &Segments[robotcen->segnum]);
|
||||||
|
|
||||||
// If this is the first materialization, set to valid robot.
|
// If this is the first materialization, set to valid robot.
|
||||||
if (RobotCenters[matcen_num].robot_flags[0] != 0) {
|
{
|
||||||
int type;
|
int type;
|
||||||
uint flags;
|
ubyte legal_types[sizeof(mi->robot_flags) * 8]; // the width of robot_flags[].
|
||||||
sbyte legal_types[32]; // 32 bits in a word, the width of robot_flags.
|
int num_types;
|
||||||
int num_types, robot_index;
|
|
||||||
|
|
||||||
robot_index = 0;
|
|
||||||
num_types = 0;
|
num_types = 0;
|
||||||
flags = RobotCenters[matcen_num].robot_flags[0];
|
for (unsigned i = 0;; ++i)
|
||||||
while (flags) {
|
{
|
||||||
|
if (i >= (sizeof(mi->robot_flags) / sizeof(mi->robot_flags[0])))
|
||||||
|
break;
|
||||||
|
uint32_t flags = mi->robot_flags[i];
|
||||||
|
for (unsigned j = 0; flags && j < 8 * sizeof(flags); ++j)
|
||||||
|
{
|
||||||
if (flags & 1)
|
if (flags & 1)
|
||||||
legal_types[num_types++] = robot_index;
|
legal_types[num_types++] = (i * 32) + j;
|
||||||
flags >>= 1;
|
flags >>= 1;
|
||||||
robot_index++;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_types == 1)
|
if (num_types == 1)
|
||||||
|
@ -511,10 +514,6 @@ static void robotmaker_proc( FuelCenter * robotcen )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef M_PI
|
|
||||||
#define M_PI 3.14159
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//-------------------------------------------------------------
|
//-------------------------------------------------------------
|
||||||
// Called once per frame, replenishes fuel supply.
|
// Called once per frame, replenishes fuel supply.
|
||||||
void fuelcen_update_all()
|
void fuelcen_update_all()
|
||||||
|
@ -528,9 +527,6 @@ void fuelcen_update_all()
|
||||||
if ( Station[i].Type == SEGMENT_IS_ROBOTMAKER ) {
|
if ( Station[i].Type == SEGMENT_IS_ROBOTMAKER ) {
|
||||||
if (! (Game_suspended & SUSP_ROBOTS))
|
if (! (Game_suspended & SUSP_ROBOTS))
|
||||||
robotmaker_proc( &Station[i] );
|
robotmaker_proc( &Station[i] );
|
||||||
// } else if ( Station[i].Type == SEGMENT_IS_CONTROLCEN ) {
|
|
||||||
//controlcen_proc( &Station[i] );
|
|
||||||
//
|
|
||||||
} else if ( (Station[i].MaxCapacity > 0) && (PlayerSegment!=&Segments[Station[i].segnum]) ) {
|
} else if ( (Station[i].MaxCapacity > 0) && (PlayerSegment!=&Segments[Station[i].segnum]) ) {
|
||||||
if ( Station[i].Capacity < Station[i].MaxCapacity ) {
|
if ( Station[i].Capacity < Station[i].MaxCapacity ) {
|
||||||
Station[i].Capacity += AmountToreplenish;
|
Station[i].Capacity += AmountToreplenish;
|
||||||
|
@ -543,11 +539,11 @@ void fuelcen_update_all()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FUELCEN_SOUND_DELAY (F1_0/3)
|
||||||
//-------------------------------------------------------------
|
//-------------------------------------------------------------
|
||||||
fix fuelcen_give_fuel(segment *segp, fix MaxAmountCanTake )
|
fix fuelcen_give_fuel(segment *segp, fix MaxAmountCanTake )
|
||||||
{
|
{
|
||||||
static fix64 last_play_time = 0;
|
static fix64 last_play_time = 0;
|
||||||
#define REFUEL_SOUND_DELAY (F1_0/3)
|
|
||||||
|
|
||||||
Assert( segp != NULL );
|
Assert( segp != NULL );
|
||||||
|
|
||||||
|
@ -584,12 +580,10 @@ fix fuelcen_give_fuel(segment *segp, fix MaxAmountCanTake )
|
||||||
// Station[segp->value].Capacity -= amount;
|
// Station[segp->value].Capacity -= amount;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
if (last_play_time + FUELCEN_SOUND_DELAY < GameTime64 || last_play_time > GameTime64)
|
||||||
if (last_play_time + REFUEL_SOUND_DELAY < GameTime64 || last_play_time > GameTime64)
|
|
||||||
{
|
{
|
||||||
last_play_time = GameTime64;
|
last_play_time = GameTime64;
|
||||||
digi_play_sample( SOUND_REFUEL_STATION_GIVING_FUEL, F1_0/2 );
|
digi_play_sample( SOUND_REFUEL_STATION_GIVING_FUEL, F1_0/2 );
|
||||||
|
|
||||||
if (Game_mode & GM_MULTI)
|
if (Game_mode & GM_MULTI)
|
||||||
multi_send_play_sound(SOUND_REFUEL_STATION_GIVING_FUEL, F1_0/2);
|
multi_send_play_sound(SOUND_REFUEL_STATION_GIVING_FUEL, F1_0/2);
|
||||||
}
|
}
|
||||||
|
@ -671,8 +665,6 @@ static void matcen_info_swap(matcen_info *mi, int swap)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mi->robot_flags[0] = SWAPINT(mi->robot_flags[0]);
|
mi->robot_flags[0] = SWAPINT(mi->robot_flags[0]);
|
||||||
//if (version > 25)
|
|
||||||
/*mi->robot_flags2 = SWAPINT(mi->robot_flags2);*/
|
|
||||||
mi->hit_points = SWAPINT(mi->hit_points);
|
mi->hit_points = SWAPINT(mi->hit_points);
|
||||||
mi->interval = SWAPINT(mi->interval);
|
mi->interval = SWAPINT(mi->interval);
|
||||||
mi->segnum = SWAPSHORT(mi->segnum);
|
mi->segnum = SWAPSHORT(mi->segnum);
|
||||||
|
@ -686,7 +678,7 @@ void matcen_info_read_n_swap(matcen_info *mi, int n, int swap, PHYSFS_file *fp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
PHYSFS_read(fp, mi, sizeof(matcen_info), n);
|
PHYSFS_read(fp, mi, sizeof(*mi), n);
|
||||||
|
|
||||||
if (swap)
|
if (swap)
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
|
|
|
@ -51,9 +51,9 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
||||||
|
|
||||||
// The max number of fuel stations per mine.
|
// The max number of fuel stations per mine.
|
||||||
|
|
||||||
fix Fuelcen_refill_speed = i2f(1);
|
static const fix Fuelcen_refill_speed = i2f(1);
|
||||||
fix Fuelcen_give_amount = i2f(25);
|
static const fix Fuelcen_give_amount = i2f(25);
|
||||||
fix Fuelcen_max_amount = i2f(100);
|
static const fix Fuelcen_max_amount = i2f(100);
|
||||||
|
|
||||||
// Every time a robot is created in the morphing code, it decreases capacity of the morpher
|
// Every time a robot is created in the morphing code, it decreases capacity of the morpher
|
||||||
// by this amount... when capacity gets to 0, no more morphers...
|
// by this amount... when capacity gets to 0, no more morphers...
|
||||||
|
@ -88,8 +88,8 @@ void fuelcen_reset()
|
||||||
{
|
{
|
||||||
Num_fuelcenters = 0;
|
Num_fuelcenters = 0;
|
||||||
|
|
||||||
for(unsigned i=0; i<sizeof(Segment2s)/sizeof(Segment2s[0]); i++ )
|
for(unsigned i=0; i<sizeof(Segments)/sizeof(Segments[0]); i++ )
|
||||||
Segment2s[i].special = SEGMENT_IS_NOTHING;
|
Segments[i].special = SEGMENT_IS_NOTHING;
|
||||||
|
|
||||||
Num_robot_centers = 0;
|
Num_robot_centers = 0;
|
||||||
|
|
||||||
|
@ -103,9 +103,9 @@ static void reset_all_robot_centers()
|
||||||
|
|
||||||
// Remove all materialization centers
|
// Remove all materialization centers
|
||||||
for (i=0; i<Num_segments; i++)
|
for (i=0; i<Num_segments; i++)
|
||||||
if (Segment2s[i].special == SEGMENT_IS_ROBOTMAKER) {
|
if (Segments[i].special == SEGMENT_IS_ROBOTMAKER) {
|
||||||
Segment2s[i].special = SEGMENT_IS_NOTHING;
|
Segments[i].special = SEGMENT_IS_NOTHING;
|
||||||
Segment2s[i].matcen_num = -1;
|
Segments[i].matcen_num = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -114,11 +114,9 @@ static void reset_all_robot_centers()
|
||||||
// Turns a segment into a fully charged up fuel center...
|
// Turns a segment into a fully charged up fuel center...
|
||||||
void fuelcen_create( segment *segp)
|
void fuelcen_create( segment *segp)
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
|
||||||
|
|
||||||
int station_type;
|
int station_type;
|
||||||
|
|
||||||
station_type = seg2p->special;
|
station_type = segp->special;
|
||||||
|
|
||||||
switch( station_type ) {
|
switch( station_type ) {
|
||||||
case SEGMENT_IS_NOTHING:
|
case SEGMENT_IS_NOTHING:
|
||||||
|
@ -134,17 +132,14 @@ void fuelcen_create( segment *segp)
|
||||||
Error( "Invalid station type %d in fuelcen.c\n", station_type );
|
Error( "Invalid station type %d in fuelcen.c\n", station_type );
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert( (seg2p != NULL) );
|
|
||||||
if ( seg2p == NULL ) return;
|
|
||||||
|
|
||||||
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
||||||
Assert( Num_fuelcenters > -1 );
|
Assert( Num_fuelcenters > -1 );
|
||||||
|
|
||||||
seg2p->value = Num_fuelcenters;
|
segp->value = Num_fuelcenters;
|
||||||
Station[Num_fuelcenters].Type = station_type;
|
Station[Num_fuelcenters].Type = station_type;
|
||||||
Station[Num_fuelcenters].MaxCapacity = Fuelcen_max_amount;
|
Station[Num_fuelcenters].MaxCapacity = Fuelcen_max_amount;
|
||||||
Station[Num_fuelcenters].Capacity = Station[Num_fuelcenters].MaxCapacity;
|
Station[Num_fuelcenters].Capacity = Station[Num_fuelcenters].MaxCapacity;
|
||||||
Station[Num_fuelcenters].segnum = seg2p-Segment2s;
|
Station[Num_fuelcenters].segnum = segp-Segments;
|
||||||
Station[Num_fuelcenters].Timer = -1;
|
Station[Num_fuelcenters].Timer = -1;
|
||||||
Station[Num_fuelcenters].Flag = 0;
|
Station[Num_fuelcenters].Flag = 0;
|
||||||
// Station[Num_fuelcenters].NextRobotType = -1;
|
// Station[Num_fuelcenters].NextRobotType = -1;
|
||||||
|
@ -163,37 +158,33 @@ void fuelcen_create( segment *segp)
|
||||||
// This function is separate from other fuelcens because we don't want values reset.
|
// This function is separate from other fuelcens because we don't want values reset.
|
||||||
static void matcen_create( segment *segp)
|
static void matcen_create( segment *segp)
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
int station_type = segp->special;
|
||||||
|
|
||||||
int station_type = seg2p->special;
|
|
||||||
|
|
||||||
Assert( (seg2p != NULL) );
|
|
||||||
Assert(station_type == SEGMENT_IS_ROBOTMAKER);
|
Assert(station_type == SEGMENT_IS_ROBOTMAKER);
|
||||||
if ( seg2p == NULL ) return;
|
|
||||||
|
|
||||||
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
Assert( Num_fuelcenters < MAX_NUM_FUELCENS );
|
||||||
Assert( Num_fuelcenters > -1 );
|
Assert( Num_fuelcenters > -1 );
|
||||||
|
|
||||||
seg2p->value = Num_fuelcenters;
|
segp->value = Num_fuelcenters;
|
||||||
Station[Num_fuelcenters].Type = station_type;
|
Station[Num_fuelcenters].Type = station_type;
|
||||||
Station[Num_fuelcenters].Capacity = i2f(Difficulty_level + 3);
|
Station[Num_fuelcenters].Capacity = i2f(Difficulty_level + 3);
|
||||||
Station[Num_fuelcenters].MaxCapacity = Station[Num_fuelcenters].Capacity;
|
Station[Num_fuelcenters].MaxCapacity = Station[Num_fuelcenters].Capacity;
|
||||||
|
|
||||||
Station[Num_fuelcenters].segnum = seg2p-Segment2s;
|
Station[Num_fuelcenters].segnum = segp-Segments;
|
||||||
Station[Num_fuelcenters].Timer = -1;
|
Station[Num_fuelcenters].Timer = -1;
|
||||||
Station[Num_fuelcenters].Flag = 0;
|
Station[Num_fuelcenters].Flag = 0;
|
||||||
// Station[Num_fuelcenters].NextRobotType = -1;
|
// Station[Num_fuelcenters].NextRobotType = -1;
|
||||||
// Station[Num_fuelcenters].last_created_obj=NULL;
|
// Station[Num_fuelcenters].last_created_obj=NULL;
|
||||||
// Station[Num_fuelcenters].last_created_sig = -1;
|
// Station[Num_fuelcenters].last_created_sig = -1;
|
||||||
compute_segment_center(&Station[Num_fuelcenters].Center, &Segments[seg2p-Segment2s] );
|
compute_segment_center(&Station[Num_fuelcenters].Center, segp );
|
||||||
|
|
||||||
seg2p->matcen_num = Num_robot_centers;
|
segp->matcen_num = Num_robot_centers;
|
||||||
Num_robot_centers++;
|
Num_robot_centers++;
|
||||||
|
|
||||||
RobotCenters[seg2p->matcen_num].hit_points = MATCEN_HP_DEFAULT;
|
RobotCenters[segp->matcen_num].hit_points = MATCEN_HP_DEFAULT;
|
||||||
RobotCenters[seg2p->matcen_num].interval = MATCEN_INTERVAL_DEFAULT;
|
RobotCenters[segp->matcen_num].interval = MATCEN_INTERVAL_DEFAULT;
|
||||||
RobotCenters[seg2p->matcen_num].segnum = seg2p-Segment2s;
|
RobotCenters[segp->matcen_num].segnum = segp-Segments;
|
||||||
RobotCenters[seg2p->matcen_num].fuelcen_num = Num_fuelcenters;
|
RobotCenters[segp->matcen_num].fuelcen_num = Num_fuelcenters;
|
||||||
|
|
||||||
Num_fuelcenters++;
|
Num_fuelcenters++;
|
||||||
}
|
}
|
||||||
|
@ -202,11 +193,9 @@ static void matcen_create( segment *segp)
|
||||||
// Adds a segment that already is a special type into the Station array.
|
// Adds a segment that already is a special type into the Station array.
|
||||||
void fuelcen_activate( segment * segp, int station_type )
|
void fuelcen_activate( segment * segp, int station_type )
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
segp->special = station_type;
|
||||||
|
|
||||||
seg2p->special = station_type;
|
if (segp->special == SEGMENT_IS_ROBOTMAKER)
|
||||||
|
|
||||||
if (seg2p->special == SEGMENT_IS_ROBOTMAKER)
|
|
||||||
matcen_create( segp);
|
matcen_create( segp);
|
||||||
else
|
else
|
||||||
fuelcen_create( segp);
|
fuelcen_create( segp);
|
||||||
|
@ -222,17 +211,16 @@ void fuelcen_activate( segment * segp, int station_type )
|
||||||
// Trigger (enable) the materialization center in segment segnum
|
// Trigger (enable) the materialization center in segment segnum
|
||||||
void trigger_matcen(int segnum)
|
void trigger_matcen(int segnum)
|
||||||
{
|
{
|
||||||
// -- segment *segp = &Segments[segnum];
|
segment *segp = &Segments[segnum];
|
||||||
segment2 *seg2p = &Segment2s[segnum];
|
|
||||||
vms_vector pos, delta;
|
vms_vector pos, delta;
|
||||||
FuelCenter *robotcen;
|
FuelCenter *robotcen;
|
||||||
int objnum;
|
int objnum;
|
||||||
|
|
||||||
Assert(seg2p->special == SEGMENT_IS_ROBOTMAKER);
|
Assert(segp->special == SEGMENT_IS_ROBOTMAKER);
|
||||||
Assert(seg2p->matcen_num < Num_fuelcenters);
|
Assert(segp->matcen_num < Num_fuelcenters);
|
||||||
Assert((seg2p->matcen_num >= 0) && (seg2p->matcen_num <= Highest_segment_index));
|
Assert((segp->matcen_num >= 0) && (segp->matcen_num <= Highest_segment_index));
|
||||||
|
|
||||||
robotcen = &Station[RobotCenters[seg2p->matcen_num].fuelcen_num];
|
robotcen = &Station[RobotCenters[segp->matcen_num].fuelcen_num];
|
||||||
|
|
||||||
if (robotcen->Enabled == 1)
|
if (robotcen->Enabled == 1)
|
||||||
return;
|
return;
|
||||||
|
@ -268,28 +256,26 @@ void trigger_matcen(int segnum)
|
||||||
// Deletes the segment point entry in the FuelCenter list.
|
// Deletes the segment point entry in the FuelCenter list.
|
||||||
void fuelcen_delete( segment * segp )
|
void fuelcen_delete( segment * segp )
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
Restart: ;
|
Restart: ;
|
||||||
|
segp->special = 0;
|
||||||
seg2p->special = 0;
|
|
||||||
|
|
||||||
for (i=0; i<Num_fuelcenters; i++ ) {
|
for (i=0; i<Num_fuelcenters; i++ ) {
|
||||||
if ( Station[i].segnum == segp-Segments ) {
|
if ( Station[i].segnum == segp-Segments ) {
|
||||||
|
|
||||||
// If Robot maker is deleted, fix Segments and RobotCenters.
|
// If Robot maker is deleted, fix Segments and RobotCenters.
|
||||||
if (Station[i].Type == SEGMENT_IS_ROBOTMAKER) {
|
if (Station[i].Type == SEGMENT_IS_ROBOTMAKER) {
|
||||||
|
Assert(Num_robot_centers > 0);
|
||||||
Num_robot_centers--;
|
Num_robot_centers--;
|
||||||
Assert(Num_robot_centers >= 0);
|
|
||||||
|
|
||||||
for (j=seg2p->matcen_num; j<Num_robot_centers; j++)
|
for (j=segp->matcen_num; j<Num_robot_centers; j++)
|
||||||
RobotCenters[j] = RobotCenters[j+1];
|
RobotCenters[j] = RobotCenters[j+1];
|
||||||
|
|
||||||
for (j=0; j<Num_fuelcenters; j++) {
|
for (j=0; j<Num_fuelcenters; j++) {
|
||||||
if ( Station[j].Type == SEGMENT_IS_ROBOTMAKER )
|
if ( Station[j].Type == SEGMENT_IS_ROBOTMAKER )
|
||||||
if ( Segment2s[Station[j].segnum].matcen_num > seg2p->matcen_num )
|
if ( Segments[Station[j].segnum].matcen_num > segp->matcen_num )
|
||||||
Segment2s[Station[j].segnum].matcen_num--;
|
Segments[Station[j].segnum].matcen_num--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,11 +284,11 @@ Restart: ;
|
||||||
if (RobotCenters[j].fuelcen_num > i) //this robotcenter's fuelcen is changing
|
if (RobotCenters[j].fuelcen_num > i) //this robotcenter's fuelcen is changing
|
||||||
RobotCenters[j].fuelcen_num--;
|
RobotCenters[j].fuelcen_num--;
|
||||||
|
|
||||||
|
Assert(Num_fuelcenters > 0);
|
||||||
Num_fuelcenters--;
|
Num_fuelcenters--;
|
||||||
Assert(Num_fuelcenters >= 0);
|
|
||||||
for (j=i; j<Num_fuelcenters; j++ ) {
|
for (j=i; j<Num_fuelcenters; j++ ) {
|
||||||
Station[j] = Station[j+1];
|
Station[j] = Station[j+1];
|
||||||
Segment2s[Station[j].segnum].value = j;
|
Segments[Station[j].segnum].value = j;
|
||||||
}
|
}
|
||||||
goto Restart;
|
goto Restart;
|
||||||
}
|
}
|
||||||
|
@ -389,14 +375,19 @@ static void robotmaker_proc( FuelCenter * robotcen )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
matcen_num = Segment2s[robotcen->segnum].matcen_num;
|
matcen_num = Segments[robotcen->segnum].matcen_num;
|
||||||
|
|
||||||
if ( matcen_num == -1 ) {
|
if ( matcen_num == -1 ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RobotCenters[matcen_num].robot_flags[0]==0 && RobotCenters[matcen_num].robot_flags[1]==0) {
|
matcen_info *mi = &RobotCenters[matcen_num];
|
||||||
|
for (unsigned i = 0;; ++i)
|
||||||
|
{
|
||||||
|
if (i >= (sizeof(mi->robot_flags) / sizeof(mi->robot_flags[0])))
|
||||||
return;
|
return;
|
||||||
|
if (mi->robot_flags[i])
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait until we have a free slot for this puppy...
|
// Wait until we have a free slot for this puppy...
|
||||||
|
@ -483,21 +474,22 @@ static void robotmaker_proc( FuelCenter * robotcen )
|
||||||
compute_segment_center(&cur_object_loc, &Segments[robotcen->segnum]);
|
compute_segment_center(&cur_object_loc, &Segments[robotcen->segnum]);
|
||||||
|
|
||||||
// If this is the first materialization, set to valid robot.
|
// If this is the first materialization, set to valid robot.
|
||||||
if (RobotCenters[matcen_num].robot_flags[0] != 0 || RobotCenters[matcen_num].robot_flags[1] != 0) {
|
{
|
||||||
int type;
|
int type;
|
||||||
uint flags;
|
ubyte legal_types[sizeof(mi->robot_flags) * 8]; // the width of robot_flags[].
|
||||||
sbyte legal_types[64]; // 64 bits, the width of robot_flags[].
|
int num_types;
|
||||||
int num_types, robot_index, i;
|
|
||||||
|
|
||||||
num_types = 0;
|
num_types = 0;
|
||||||
for (i=0;i<2;i++) {
|
for (unsigned i = 0;; ++i)
|
||||||
robot_index = i*32;
|
{
|
||||||
flags = RobotCenters[matcen_num].robot_flags[i];
|
if (i >= (sizeof(mi->robot_flags) / sizeof(mi->robot_flags[0])))
|
||||||
while (flags) {
|
break;
|
||||||
|
uint32_t flags = mi->robot_flags[i];
|
||||||
|
for (unsigned j = 0; flags && j < 8 * sizeof(flags); ++j)
|
||||||
|
{
|
||||||
if (flags & 1)
|
if (flags & 1)
|
||||||
legal_types[num_types++] = robot_index;
|
legal_types[num_types++] = (i * 32) + j;
|
||||||
flags >>= 1;
|
flags >>= 1;
|
||||||
robot_index++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,7 +522,6 @@ static void robotmaker_proc( FuelCenter * robotcen )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------
|
//-------------------------------------------------------------
|
||||||
// Called once per frame, replenishes fuel supply.
|
// Called once per frame, replenishes fuel supply.
|
||||||
void fuelcen_update_all()
|
void fuelcen_update_all()
|
||||||
|
@ -544,9 +535,6 @@ void fuelcen_update_all()
|
||||||
if ( Station[i].Type == SEGMENT_IS_ROBOTMAKER ) {
|
if ( Station[i].Type == SEGMENT_IS_ROBOTMAKER ) {
|
||||||
if (! (Game_suspended & SUSP_ROBOTS))
|
if (! (Game_suspended & SUSP_ROBOTS))
|
||||||
robotmaker_proc( &Station[i] );
|
robotmaker_proc( &Station[i] );
|
||||||
} else if ( Station[i].Type == SEGMENT_IS_CONTROLCEN ) {
|
|
||||||
//controlcen_proc( &Station[i] );
|
|
||||||
|
|
||||||
} else if ( (Station[i].MaxCapacity > 0) && (PlayerSegment!=&Segments[Station[i].segnum]) ) {
|
} else if ( (Station[i].MaxCapacity > 0) && (PlayerSegment!=&Segments[Station[i].segnum]) ) {
|
||||||
if ( Station[i].Capacity < Station[i].MaxCapacity ) {
|
if ( Station[i].Capacity < Station[i].MaxCapacity ) {
|
||||||
Station[i].Capacity += AmountToreplenish;
|
Station[i].Capacity += AmountToreplenish;
|
||||||
|
@ -564,15 +552,13 @@ void fuelcen_update_all()
|
||||||
//-------------------------------------------------------------
|
//-------------------------------------------------------------
|
||||||
fix fuelcen_give_fuel(segment *segp, fix MaxAmountCanTake )
|
fix fuelcen_give_fuel(segment *segp, fix MaxAmountCanTake )
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
|
||||||
|
|
||||||
static fix64 last_play_time = 0;
|
static fix64 last_play_time = 0;
|
||||||
|
|
||||||
Assert( segp != NULL );
|
Assert( segp != NULL );
|
||||||
|
|
||||||
PlayerSegment = segp;
|
PlayerSegment = segp;
|
||||||
|
|
||||||
if ( (segp) && (seg2p->special==SEGMENT_IS_FUELCEN) ) {
|
if ( (segp) && (segp->special==SEGMENT_IS_FUELCEN) ) {
|
||||||
fix amount;
|
fix amount;
|
||||||
|
|
||||||
detect_escort_goal_accomplished(-4); // UGLY! Hack! -4 means went through fuelcen.
|
detect_escort_goal_accomplished(-4); // UGLY! Hack! -4 means went through fuelcen.
|
||||||
|
@ -613,7 +599,6 @@ fix fuelcen_give_fuel(segment *segp, fix MaxAmountCanTake )
|
||||||
multi_send_play_sound(SOUND_REFUEL_STATION_GIVING_FUEL, F1_0/2);
|
multi_send_play_sound(SOUND_REFUEL_STATION_GIVING_FUEL, F1_0/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//HUD_init_message(HM_DEFAULT, "Fuelcen %d has %d/%d fuel", segp->value,f2i(Station[segp->value].Capacity),f2i(Station[segp->value].MaxCapacity) );
|
//HUD_init_message(HM_DEFAULT, "Fuelcen %d has %d/%d fuel", segp->value,f2i(Station[segp->value].Capacity),f2i(Station[segp->value].MaxCapacity) );
|
||||||
return amount;
|
return amount;
|
||||||
|
|
||||||
|
@ -628,12 +613,11 @@ fix fuelcen_give_fuel(segment *segp, fix MaxAmountCanTake )
|
||||||
// use same values as fuel centers
|
// use same values as fuel centers
|
||||||
fix repaircen_give_shields(segment *segp, fix MaxAmountCanTake )
|
fix repaircen_give_shields(segment *segp, fix MaxAmountCanTake )
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
|
||||||
static fix last_play_time=0;
|
static fix last_play_time=0;
|
||||||
|
|
||||||
Assert( segp != NULL );
|
Assert( segp != NULL );
|
||||||
PlayerSegment = segp;
|
PlayerSegment = segp;
|
||||||
if ( (segp) && (seg2p->special==SEGMENT_IS_REPAIRCEN) ) {
|
if ( (segp) && (segp->special==SEGMENT_IS_REPAIRCEN) ) {
|
||||||
fix amount;
|
fix amount;
|
||||||
// detect_escort_goal_accomplished(-4); // UGLY! Hack! -4 means went through fuelcen.
|
// detect_escort_goal_accomplished(-4); // UGLY! Hack! -4 means went through fuelcen.
|
||||||
// if (Station[segp->value].MaxCapacity<=0) {
|
// if (Station[segp->value].MaxCapacity<=0) {
|
||||||
|
@ -724,12 +708,10 @@ void init_all_matcens(void)
|
||||||
|
|
||||||
void fuelcen_check_for_goal(segment *segp)
|
void fuelcen_check_for_goal(segment *segp)
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
|
||||||
|
|
||||||
Assert( segp != NULL );
|
Assert( segp != NULL );
|
||||||
Assert (game_mode_capture_flag());
|
Assert (game_mode_capture_flag());
|
||||||
|
|
||||||
if (seg2p->special==SEGMENT_IS_GOAL_BLUE ) {
|
if (segp->special==SEGMENT_IS_GOAL_BLUE ) {
|
||||||
|
|
||||||
if ((get_team(Player_num)==TEAM_BLUE) && (Players[Player_num].flags & PLAYER_FLAGS_FLAG))
|
if ((get_team(Player_num)==TEAM_BLUE) && (Players[Player_num].flags & PLAYER_FLAGS_FLAG))
|
||||||
{
|
{
|
||||||
|
@ -738,7 +720,7 @@ void fuelcen_check_for_goal(segment *segp)
|
||||||
maybe_drop_net_powerup (POW_FLAG_RED);
|
maybe_drop_net_powerup (POW_FLAG_RED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( seg2p->special==SEGMENT_IS_GOAL_RED) {
|
if ( segp->special==SEGMENT_IS_GOAL_RED) {
|
||||||
|
|
||||||
if ((get_team(Player_num)==TEAM_RED) && (Players[Player_num].flags & PLAYER_FLAGS_FLAG))
|
if ((get_team(Player_num)==TEAM_RED) && (Players[Player_num].flags & PLAYER_FLAGS_FLAG))
|
||||||
{
|
{
|
||||||
|
@ -751,15 +733,13 @@ void fuelcen_check_for_goal(segment *segp)
|
||||||
|
|
||||||
void fuelcen_check_for_hoard_goal(segment *segp)
|
void fuelcen_check_for_hoard_goal(segment *segp)
|
||||||
{
|
{
|
||||||
segment2 *seg2p = &Segment2s[segp-Segments];
|
|
||||||
|
|
||||||
Assert( segp != NULL );
|
Assert( segp != NULL );
|
||||||
Assert (game_mode_hoard());
|
Assert (game_mode_hoard());
|
||||||
|
|
||||||
if (Player_is_dead)
|
if (Player_is_dead)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (seg2p->special==SEGMENT_IS_GOAL_BLUE || seg2p->special==SEGMENT_IS_GOAL_RED )
|
if (segp->special==SEGMENT_IS_GOAL_BLUE || segp->special==SEGMENT_IS_GOAL_RED )
|
||||||
{
|
{
|
||||||
if (Players[Player_num].secondary_ammo[PROXIMITY_INDEX])
|
if (Players[Player_num].secondary_ammo[PROXIMITY_INDEX])
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue