From d5230903d8d2cb840fd9e5f9d731678f82ecd4ef Mon Sep 17 00:00:00 2001 From: avolkov Date: Thu, 5 Nov 2009 06:12:33 +0000 Subject: [PATCH] Moved static ship variables to per-instance RACE_DESC git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3278 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/src/uqm/races.h | 4 +- sc2/src/uqm/ships/androsyn/androsyn.c | 13 +++--- sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c | 60 ++++++++++++++++----------- sc2/src/uqm/ships/pkunk/pkunk.c | 6 +-- sc2/src/uqm/ships/umgah/umgah.c | 12 ++---- 5 files changed, 51 insertions(+), 44 deletions(-) diff --git a/sc2/src/uqm/races.h b/sc2/src/uqm/races.h index 5dc5bc783..7a17e4d73 100644 --- a/sc2/src/uqm/races.h +++ b/sc2/src/uqm/races.h @@ -217,6 +217,8 @@ struct race_desc POSTPROCESS_FUNC *postprocess_func; INIT_WEAPON_FUNC *init_weapon_func; + intptr_t data; // private ship data, ship code owns this + void *CodeRef; }; @@ -276,8 +278,6 @@ struct STARSHIP // -1: neutral; this should currently never happen (asserts) BYTE control; // HUMAN, COMPUTER or NETWORK control flags, see intel.h - - intptr_t data; // private ship data, ship code owns this }; #define RPG_PLAYER_NUM 0 diff --git a/sc2/src/uqm/ships/androsyn/androsyn.c b/sc2/src/uqm/ships/androsyn/androsyn.c index 392e6fe9f..23f8d078b 100644 --- a/sc2/src/uqm/ships/androsyn/androsyn.c +++ b/sc2/src/uqm/ships/androsyn/androsyn.c @@ -20,8 +20,6 @@ #include "resinst.h" #include "libs/mathlib.h" -#include "uqm/init.h" - // for NUM_PLAYERS #define MAX_CREW 20 @@ -324,8 +322,6 @@ androsynth_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern, } } -static CollisionFunc *ship_collision_func[NUM_PLAYERS]; - #define BLAZER_TURN_WAIT 1 static void @@ -357,8 +353,10 @@ androsynth_postprocess (ELEMENT *ElementPtr) ElementPtr->mass_points = BLAZER_MASS; StarShipPtr->RaceDescPtr->characteristics.turn_wait = BLAZER_TURN_WAIT; - ship_collision_func[StarShipPtr->playerNr] - = ElementPtr->collision_func; + /* Save the current collision func because we were not the + * ones who set it */ + StarShipPtr->RaceDescPtr->data = (intptr_t) + ElementPtr->collision_func; ElementPtr->collision_func = blazer_collision; } } @@ -426,7 +424,8 @@ androsynth_preprocess (ELEMENT *ElementPtr) StarShipPtr->RaceDescPtr->characteristics.special_wait; StarShipPtr->RaceDescPtr->characteristics.energy_regeneration = ENERGY_REGENERATION; ElementPtr->mass_points = SHIP_MASS; - ElementPtr->collision_func = ship_collision_func[StarShipPtr->playerNr]; + ElementPtr->collision_func = (CollisionFunc *) + StarShipPtr->RaceDescPtr->data; ElementPtr->next.image.farray = StarShipPtr->RaceDescPtr->ship_data.ship; ElementPtr->next.image.frame = diff --git a/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c b/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c index b7ce2ec24..941788975 100644 --- a/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c +++ b/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c @@ -19,9 +19,6 @@ #include "../ship.h" #include "resinst.h" -#include "uqm/init.h" - // for NUM_PLAYERS - #define MAX_CREW 20 #define MAX_ENERGY 10 @@ -51,7 +48,6 @@ #define MMRNMHRM_OFFSET 16 #define LASER_RANGE DISPLAY_TO_WORLD (125 + MMRNMHRM_OFFSET) -static CHARACTERISTIC_STUFF otherwing_desc[NUM_PLAYERS]; static RACE_DESC mmrnmhrm_desc = { @@ -366,6 +362,7 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr) if (ElementPtr->next.image.farray != ElementPtr->current.image.farray) { CHARACTERISTIC_STUFF t; + CHARACTERISTIC_STUFF *otherwing_desc; ProcessSound (SetAbsSoundIndex ( /* TRANSFORM */ @@ -373,8 +370,11 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr) StarShipPtr->weapon_counter = 0; - t = otherwing_desc[StarShipPtr->playerNr]; - otherwing_desc[StarShipPtr->playerNr] = StarShipPtr->RaceDescPtr->characteristics; + /* Swap characteristics descriptors around */ + otherwing_desc = (CHARACTERISTIC_STUFF *) + StarShipPtr->RaceDescPtr->data; + t = *otherwing_desc; + *otherwing_desc = StarShipPtr->RaceDescPtr->characteristics; StarShipPtr->RaceDescPtr->characteristics = t; StarShipPtr->RaceDescPtr->cyborg_control.ManeuverabilityIndex = 0; @@ -412,23 +412,7 @@ mmrnmhrm_preprocess (ELEMENT *ElementPtr) GetElementStarShip (ElementPtr, &StarShipPtr); - if (ElementPtr->state_flags & APPEARING) - { - // Set here because playerNr is unknown during init() - COUNT i = StarShipPtr->playerNr; - otherwing_desc[i].max_thrust = YWING_MAX_THRUST; - otherwing_desc[i].thrust_increment = YWING_THRUST_INCREMENT; - otherwing_desc[i].energy_regeneration = YWING_ENERGY_REGENERATION; - otherwing_desc[i].weapon_energy_cost = YWING_WEAPON_ENERGY_COST; - otherwing_desc[i].special_energy_cost = YWING_SPECIAL_ENERGY_COST; - otherwing_desc[i].energy_wait = YWING_ENERGY_WAIT; - otherwing_desc[i].turn_wait = YWING_TURN_WAIT; - otherwing_desc[i].thrust_wait = YWING_THRUST_WAIT; - otherwing_desc[i].weapon_wait = YWING_WEAPON_WAIT; - otherwing_desc[i].special_wait = YWING_SPECIAL_WAIT; - otherwing_desc[i].ship_mass = SHIP_MASS; - } - else + if (!(ElementPtr->state_flags & APPEARING)) { if ((StarShipPtr->cur_status_flags & SPECIAL) && StarShipPtr->special_counter == 0) @@ -455,17 +439,45 @@ mmrnmhrm_preprocess (ELEMENT *ElementPtr) } } +static void +uninit_mmrnmhrm (RACE_DESC *pRaceDesc) +{ + HFree ((void *)pRaceDesc->data); + pRaceDesc->data = 0; +} + RACE_DESC* init_mmrnmhrm (void) { RACE_DESC *RaceDescPtr; + static RACE_DESC new_mmrnmhrm_desc; + CHARACTERISTIC_STUFF *otherwing_desc; + + mmrnmhrm_desc.uninit_func = uninit_mmrnmhrm; mmrnmhrm_desc.preprocess_func = mmrnmhrm_preprocess; mmrnmhrm_desc.postprocess_func = mmrnmhrm_postprocess; mmrnmhrm_desc.init_weapon_func = initialize_dual_weapons; mmrnmhrm_desc.cyborg_control.intelligence_func = mmrnmhrm_intelligence; - RaceDescPtr = &mmrnmhrm_desc; + new_mmrnmhrm_desc = mmrnmhrm_desc; + + otherwing_desc = HMalloc (sizeof (*otherwing_desc)); + otherwing_desc->max_thrust = YWING_MAX_THRUST; + otherwing_desc->thrust_increment = YWING_THRUST_INCREMENT; + otherwing_desc->energy_regeneration = YWING_ENERGY_REGENERATION; + otherwing_desc->weapon_energy_cost = YWING_WEAPON_ENERGY_COST; + otherwing_desc->special_energy_cost = YWING_SPECIAL_ENERGY_COST; + otherwing_desc->energy_wait = YWING_ENERGY_WAIT; + otherwing_desc->turn_wait = YWING_TURN_WAIT; + otherwing_desc->thrust_wait = YWING_THRUST_WAIT; + otherwing_desc->weapon_wait = YWING_WEAPON_WAIT; + otherwing_desc->special_wait = YWING_SPECIAL_WAIT; + otherwing_desc->ship_mass = SHIP_MASS; + + new_mmrnmhrm_desc.data = (intptr_t) otherwing_desc; + + RaceDescPtr = &new_mmrnmhrm_desc; return (RaceDescPtr); } diff --git a/sc2/src/uqm/ships/pkunk/pkunk.c b/sc2/src/uqm/ships/pkunk/pkunk.c index ae46f16f2..67d47e8b8 100644 --- a/sc2/src/uqm/ships/pkunk/pkunk.c +++ b/sc2/src/uqm/ships/pkunk/pkunk.c @@ -187,12 +187,12 @@ pkunk_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern, HELEMENT hPhoenix; GetElementStarShip (ShipPtr, &StarShipPtr); - hPhoenix = (HELEMENT) StarShipPtr->data; + hPhoenix = (HELEMENT) StarShipPtr->RaceDescPtr->data; if (hPhoenix && (StarShipPtr->control & STANDARD_RATING)) { RemoveElement (hPhoenix); FreeElement (hPhoenix); - StarShipPtr->data = 0; + StarShipPtr->RaceDescPtr->data = 0; } if (StarShipPtr->RaceDescPtr->ship_info.energy_level < @@ -463,7 +463,7 @@ pkunk_preprocess (ELEMENT *ElementPtr) UnlockElement (hPhoenix); InsertElement (hPhoenix, GetHeadElement ()); } - StarShipPtr->data = (intptr_t) hPhoenix; + StarShipPtr->RaceDescPtr->data = (intptr_t) hPhoenix; if (ElementPtr->hTarget == 0) StarShipPtr->RaceDescPtr->preprocess_func = 0; diff --git a/sc2/src/uqm/ships/umgah/umgah.c b/sc2/src/uqm/ships/umgah/umgah.c index 8145e3d1d..ddf4ef988 100644 --- a/sc2/src/uqm/ships/umgah/umgah.c +++ b/sc2/src/uqm/ships/umgah/umgah.c @@ -20,8 +20,6 @@ #include "resinst.h" #include "libs/mathlib.h" -#include "uqm/init.h" - // for NUM_PLAYERS #define MAX_CREW 10 @@ -39,7 +37,6 @@ #define SHIP_MASS 1 -static FRAME LastShipFrame[NUM_PLAYERS]; static RACE_DESC umgah_desc = { @@ -286,9 +283,9 @@ initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[]) // This func is called every frame while the player is holding down WEAPON // Don't reset the cone FRAME to the first image every time - if (ShipPtr->next.image.frame != LastShipFrame[StarShipPtr->playerNr]) + if (ShipPtr->next.image.frame != (FRAME) StarShipPtr->RaceDescPtr->data) { - LastShipFrame[StarShipPtr->playerNr] = ShipPtr->next.image.frame; + StarShipPtr->RaceDescPtr->data = (intptr_t) ShipPtr->next.image.frame; StarShipPtr->RaceDescPtr->ship_data.special[0] = SetAbsFrameIndex ( @@ -341,9 +338,8 @@ umgah_preprocess (ELEMENT *ElementPtr) if (ElementPtr->state_flags & APPEARING) { - // Reset prevously set value, if any. It could only have been - // set by another ship of the same player, though. - LastShipFrame[StarShipPtr->playerNr] = 0; + // Reset the value just in case + StarShipPtr->RaceDescPtr->data = 0; } else {