Initial commit of Command & Conquer source code.
This commit is contained in:
parent
c81144a181
commit
41065b89ab
332 changed files with 228115 additions and 0 deletions
798
AADATA.CPP
Normal file
798
AADATA.CPP
Normal file
|
@ -0,0 +1,798 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\aadata.cpv 2.18 16 Oct 1995 16:49:50 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* name in *
|
||||
* File Name : AADATA.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : July 22, 1994 *
|
||||
* *
|
||||
* Last Update : August 7, 1995 [JLB] *
|
||||
* Determines *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* AircraftTypeClass::AircraftTypeClass -- Constructor for aircraft objects. *
|
||||
* AircraftTypeClass::Create_And_Place -- Creates and places aircraft using normal game syste*
|
||||
* AircraftTypeClass::Create_One_Of -- Creates an aircraft object of the appropriate type. *
|
||||
* AircraftTypeClass::Dimensions -- Fetches the graphic dimensions of the aircraft type. *
|
||||
* AircraftTypeClass::Display -- Displays a generic version of the aircraft type. *
|
||||
* AircraftTypeClass::From_Name -- Converts an ASCIIto an aircraft type number. *
|
||||
* AircraftTypeClass::Max_Pips -- Fetches the maximum number of pips allowed. *
|
||||
* AircraftTypeClass::Occupy_List -- Returns with occupation list for landed aircraft. *
|
||||
* AircraftTypeClass::One_Time -- Performs one time initialization of the aircraft type class.*
|
||||
* AircraftTypeClass::Overlap_List -- the overlap list for a landed aircraft. *
|
||||
* AircraftTypeClass::Prep_For_Add -- Prepares the scenario editor for adding an aircraft objec*
|
||||
* AircraftTypeClass::Repair_Cost -- Fetchs the cost per repair step. *
|
||||
* AircraftTypeClass::Repair_Step -- Fetches the number of health points per repair. *
|
||||
* AircraftTypeClass::Who_Can_Build_Me -- Determines which object can build the aircraft obje*
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
void const * AircraftTypeClass::LRotorData = NULL;
|
||||
void const * AircraftTypeClass::RRotorData = NULL;
|
||||
|
||||
// A-10 attack plane
|
||||
static AircraftTypeClass const AttackPlane(
|
||||
AIRCRAFT_A10, // What kind of aircraft is this.
|
||||
TXT_A10, // Translated text number for aircraft.
|
||||
"A10", // INI name of aircraft.
|
||||
99, // Build level.
|
||||
STRUCTF_NONE, // Building prerequisite.
|
||||
false, // Is a leader type?
|
||||
false, // Does it fire a pair of shots in quick succession?
|
||||
false, // Is this a typical transport vehicle?
|
||||
true, // Fixed wing aircraft?
|
||||
false, // Equipped with a rotor?
|
||||
false, // Custom rotor sets for each facing?
|
||||
false, // Can this aircraft land on clear terrain?
|
||||
false, // Can the aircraft be crushed by a tracked vehicle?
|
||||
true, // Is it invisible on radar?
|
||||
false, // Can the player select it so as to give it orders?
|
||||
true, // Can it be assigned as a target for attack.
|
||||
false, // Is it insignificant (won't be announced)?
|
||||
false, // Is it immune to normal combat damage?
|
||||
false, // Theater specific graphic image?
|
||||
false, // Can it be repaired in a repair facility?
|
||||
false, // Can the player construct or order this unit?
|
||||
true, // Is there a crew inside?
|
||||
3, // Number of shots it has (default).
|
||||
60, // The strength of this unit.
|
||||
0, // The range that it reveals terrain around itself.
|
||||
800, // Credit cost to construct.
|
||||
0, // The scenario this becomes available.
|
||||
10,1, // Risk, reward when calculating AI.
|
||||
HOUSEF_MULTI1|
|
||||
HOUSEF_MULTI2|
|
||||
HOUSEF_MULTI3|
|
||||
HOUSEF_MULTI4|
|
||||
HOUSEF_MULTI5|
|
||||
HOUSEF_MULTI6|
|
||||
HOUSEF_JP|
|
||||
HOUSEF_GOOD|
|
||||
HOUSEF_BAD, // Who can own this aircraft type.
|
||||
WEAPON_NAPALM,WEAPON_NONE,
|
||||
ARMOR_ALUMINUM, // Armor type of this aircraft.
|
||||
MPH_FAST, // Maximum speed of aircraft.
|
||||
5, // Rate of turn.
|
||||
MISSION_HUNT // Default mission for aircraft.
|
||||
);
|
||||
|
||||
// Transport helicopter.
|
||||
static AircraftTypeClass const TransportHeli(
|
||||
AIRCRAFT_TRANSPORT, // What kind of aircraft is this.
|
||||
TXT_TRANS, // Translated text number for aircraft.
|
||||
"TRAN", // INI name of aircraft.
|
||||
6, // Build level.
|
||||
STRUCTF_HELIPAD, // Building prerequisite.
|
||||
false, // Is a leader type?
|
||||
false, // Does it fire a pair of shots in quick succession?
|
||||
true, // Is this a typical transport vehicle?
|
||||
false, // Fixed wing aircraft?
|
||||
true, // Equipped with a rotor?
|
||||
true, // Custom rotor sets for each facing?
|
||||
true, // Can this aircraft land on clear terrain?
|
||||
false, // Can the aircraft be crushed by a tracked vehicle?
|
||||
true, // Is it invisible on radar?
|
||||
true, // Can the player select it so as to give it orders?
|
||||
true, // Can it be assigned as a target for attack.
|
||||
false, // Is it insignificant (won't be announced)?
|
||||
false, // Theater specific graphic image?
|
||||
false, // Is it equipped with a combat turret?
|
||||
false, // Can it be repaired in a repair facility?
|
||||
true, // Can the player construct or order this unit?
|
||||
true, // Is there a crew inside?
|
||||
0, // Number of shots it has (default).
|
||||
90, // The strength of this unit.
|
||||
0, // The range that it reveals terrain around itself.
|
||||
1500, // Credit cost to construct.
|
||||
98, // The scenario this becomes available.
|
||||
10,80, // Risk, reward when calculating AI.
|
||||
HOUSEF_MULTI1|
|
||||
HOUSEF_MULTI2|
|
||||
HOUSEF_MULTI3|
|
||||
HOUSEF_MULTI4|
|
||||
HOUSEF_MULTI5|
|
||||
HOUSEF_MULTI6|
|
||||
HOUSEF_JP|
|
||||
HOUSEF_BAD|
|
||||
HOUSEF_GOOD, // Who can own this aircraft type.
|
||||
WEAPON_NONE,WEAPON_NONE,
|
||||
ARMOR_ALUMINUM, // Armor type of this aircraft.
|
||||
MPH_MEDIUM_FAST, // Maximum speed of aircraft.
|
||||
5, // Rate of turn.
|
||||
MISSION_HUNT // Default mission for aircraft.
|
||||
);
|
||||
|
||||
// Apache attach helicopter.
|
||||
static AircraftTypeClass const AttackHeli(
|
||||
AIRCRAFT_HELICOPTER, // What kind of aircraft is this.
|
||||
TXT_HELI, // Translated text number for aircraft.
|
||||
"HELI", // INI name of aircraft.
|
||||
6, // Build level.
|
||||
STRUCTF_HELIPAD, // Building prerequisite.
|
||||
true, // Is a leader type?
|
||||
true, // Does it fire a pair of shots in quick succession?
|
||||
false, // Is this a typical transport vehicle?
|
||||
false, // Fixed wing aircraft?
|
||||
true, // Equipped with a rotor?
|
||||
false, // Custom rotor sets for each facing?
|
||||
false, // Can this aircraft land on clear terrain?
|
||||
false, // Can the aircraft be crushed by a tracked vehicle?
|
||||
true, // Is it invisible on radar?
|
||||
true, // Can the player select it so as to give it orders?
|
||||
true, // Can it be assigned as a target for attack.
|
||||
false, // Is it insignificant (won't be announced)?
|
||||
false, // Is it immune to normal combat damage?
|
||||
false, // Theater specific graphic image?
|
||||
false, // Can it be repaired in a repair facility?
|
||||
true, // Can the player construct or order this unit?
|
||||
true, // Is there a crew inside?
|
||||
15, // Number of shots it has (default).
|
||||
125, // The strength of this unit.
|
||||
0, // The range that it reveals terrain around itself.
|
||||
1200, // Credit cost to construct.
|
||||
10, // The scenario this becomes available.
|
||||
10,80, // Risk, reward when calculating AI.
|
||||
HOUSEF_MULTI1|
|
||||
HOUSEF_MULTI2|
|
||||
HOUSEF_MULTI3|
|
||||
HOUSEF_MULTI4|
|
||||
HOUSEF_MULTI5|
|
||||
HOUSEF_MULTI6|
|
||||
HOUSEF_JP|
|
||||
HOUSEF_BAD, // Who can own this aircraft type.
|
||||
WEAPON_CHAIN_GUN,WEAPON_NONE,
|
||||
ARMOR_STEEL, // Armor type of this aircraft.
|
||||
MPH_FAST, // Maximum speed of aircraft.
|
||||
4, // Rate of turn.
|
||||
MISSION_HUNT // Default mission for aircraft.
|
||||
);
|
||||
|
||||
|
||||
// Orca attack helicopter.
|
||||
static AircraftTypeClass const OrcaHeli(
|
||||
AIRCRAFT_ORCA, // What kind of aircraft is this.
|
||||
TXT_ORCA, // Translated text number for aircraft.
|
||||
"ORCA", // INI name of aircraft.
|
||||
6, // Build level.
|
||||
STRUCTF_HELIPAD, // Building prerequisite.
|
||||
true, // Is a leader type?
|
||||
true, // Does it fire a pair of shots in quick succession?
|
||||
false, // Is this a typical transport vehicle?
|
||||
false, // Fixed wing aircraft?
|
||||
false, // Equipped with a rotor?
|
||||
false, // Custom rotor sets for each facing?
|
||||
false, // Can this aircraft land on clear terrain?
|
||||
false, // Can the aircraft be crushed by a tracked vehicle?
|
||||
true, // Is it invisible on radar?
|
||||
true, // Can the player select it so as to give it orders?
|
||||
true, // Can it be assigned as a target for attack.
|
||||
false, // Is it insignificant (won't be announced)?
|
||||
false, // Is it immune to normal combat damage?
|
||||
false, // Theater specific graphic image?
|
||||
false, // Can it be repaired in a repair facility?
|
||||
true, // Can the player construct or order this unit?
|
||||
true, // Is there a crew inside?
|
||||
6, // Number of shots it has (default).
|
||||
125, // The strength of this unit.
|
||||
0, // The range that it reveals terrain around itself.
|
||||
1200, // Credit cost to construct.
|
||||
10, // The scenario this becomes available.
|
||||
10,80, // Risk, reward when calculating AI.
|
||||
HOUSEF_MULTI1|
|
||||
HOUSEF_MULTI2|
|
||||
HOUSEF_MULTI3|
|
||||
HOUSEF_MULTI4|
|
||||
HOUSEF_MULTI5|
|
||||
HOUSEF_MULTI6|
|
||||
HOUSEF_JP|
|
||||
HOUSEF_GOOD, // Who can own this aircraft type.
|
||||
WEAPON_DRAGON,WEAPON_NONE,
|
||||
ARMOR_STEEL, // Armor type of this aircraft.
|
||||
MPH_FAST, // Maximum speed of aircraft.
|
||||
4, // Rate of turn.
|
||||
MISSION_HUNT // Default mission for aircraft.
|
||||
);
|
||||
|
||||
|
||||
// C-17 transport plane.
|
||||
static AircraftTypeClass const CargoPlane(
|
||||
AIRCRAFT_CARGO, // What kind of aircraft is this.
|
||||
TXT_C17, // Translated text number for aircraft.
|
||||
"C17", // INI name of aircraft.
|
||||
99, // Build level.
|
||||
STRUCTF_NONE, // Building prerequisite.
|
||||
false, // Is a leader type?
|
||||
false, // Does it fire a pair of shots in quick succession?
|
||||
true, // Is this a typical transport vehicle?
|
||||
true, // Fixed wing aircraft?
|
||||
false, // Equipped with a rotor?
|
||||
false, // Custom rotor sets for each facing?
|
||||
false, // Can this aircraft land on clear terrain?
|
||||
false, // Can the aircraft be crushed by a tracked vehicle?
|
||||
true, // Is it invisible on radar?
|
||||
false, // Can the player select it so as to give it orders?
|
||||
false, // Can it be assigned as a target for attack.
|
||||
false, // Is it insignificant (won't be announced)?
|
||||
false, // Is it immune to normal combat damage?
|
||||
false, // Theater specific graphic image?
|
||||
false, // Can it be repaired in a repair facility?
|
||||
false, // Can the player construct or order this unit?
|
||||
true, // Is there a crew inside?
|
||||
0, // Number of shots it has (default).
|
||||
25, // The strength of this unit.
|
||||
0, // The range that it reveals terrain around itself.
|
||||
800, // Credit cost to construct.
|
||||
0, // The scenario this becomes available.
|
||||
10,1, // Risk, reward when calculating AI.
|
||||
HOUSEF_MULTI1|
|
||||
HOUSEF_MULTI2|
|
||||
HOUSEF_MULTI3|
|
||||
HOUSEF_MULTI4|
|
||||
HOUSEF_MULTI5|
|
||||
HOUSEF_MULTI6|
|
||||
HOUSEF_JP|
|
||||
HOUSEF_GOOD|
|
||||
HOUSEF_BAD, // Who can own this aircraft type.
|
||||
WEAPON_NONE,WEAPON_NONE,
|
||||
ARMOR_ALUMINUM, // Armor type of this aircraft.
|
||||
MPH_FAST, // Maximum speed of aircraft.
|
||||
5, // Rate of turn.
|
||||
MISSION_HUNT // Default mission for aircraft.
|
||||
);
|
||||
|
||||
|
||||
AircraftTypeClass const * const AircraftTypeClass::Pointers[AIRCRAFT_COUNT] = {
|
||||
&TransportHeli,
|
||||
&AttackPlane,
|
||||
&AttackHeli,
|
||||
&CargoPlane,
|
||||
&OrcaHeli,
|
||||
};
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::AircraftTypeClass -- Constructor for aircraft objects. *
|
||||
* *
|
||||
* This is the constructor for the aircraft object. *
|
||||
* *
|
||||
* INPUT: see below... *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
AircraftTypeClass::AircraftTypeClass(
|
||||
AircraftType airtype,
|
||||
int name,
|
||||
char const *ininame,
|
||||
unsigned char level,
|
||||
long pre,
|
||||
bool is_leader,
|
||||
bool is_twoshooter,
|
||||
bool is_transporter,
|
||||
bool is_fixedwing,
|
||||
bool is_rotorequipped,
|
||||
bool is_rotorcustom,
|
||||
bool is_landable,
|
||||
bool is_crushable,
|
||||
bool is_stealthy,
|
||||
bool is_selectable,
|
||||
bool is_legal_target,
|
||||
bool is_insignificant,
|
||||
bool is_immune,
|
||||
bool is_theater,
|
||||
bool is_repairable,
|
||||
bool is_buildable,
|
||||
bool is_crew,
|
||||
int ammo,
|
||||
unsigned short strength,
|
||||
int sightrange,
|
||||
int cost,
|
||||
int scenario,
|
||||
int risk,
|
||||
int reward,
|
||||
int ownable,
|
||||
WeaponType primary,
|
||||
WeaponType secondary,
|
||||
ArmorType armor,
|
||||
MPHType maxspeed,
|
||||
int rot,
|
||||
MissionType deforder) :
|
||||
TechnoTypeClass(name,
|
||||
ininame,
|
||||
level,
|
||||
pre,
|
||||
is_leader,
|
||||
false,
|
||||
false,
|
||||
is_transporter,
|
||||
false,
|
||||
is_crushable,
|
||||
is_stealthy,
|
||||
is_selectable,
|
||||
is_legal_target,
|
||||
is_insignificant,
|
||||
is_immune,
|
||||
is_theater,
|
||||
is_twoshooter,
|
||||
false,
|
||||
is_repairable,
|
||||
is_buildable,
|
||||
is_crew,
|
||||
ammo,
|
||||
strength,
|
||||
maxspeed,
|
||||
sightrange,
|
||||
cost,
|
||||
scenario,
|
||||
risk,
|
||||
reward,
|
||||
ownable,
|
||||
primary,
|
||||
secondary,
|
||||
armor)
|
||||
{
|
||||
IsRotorEquipped = is_rotorequipped;
|
||||
IsRotorCustom = is_rotorcustom;
|
||||
IsLandable = is_landable;
|
||||
IsFixedWing = is_fixedwing;
|
||||
Type = airtype;
|
||||
ROT = rot;
|
||||
Mission = deforder;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::From_Name -- Converts an ASCII name into an aircraft type number. *
|
||||
* *
|
||||
* This routine is used to convert an ASCII representation of an aircraft into the *
|
||||
* matching aircraft type number. This is used by the scenario INI reader code. *
|
||||
* *
|
||||
* INPUT: name -- Pointer to ASCII name to translate. *
|
||||
* *
|
||||
* OUTPUT: Returns the aircraft type number that matches the ASCII name provided. If no *
|
||||
* match could be found, then AIRCRAFT_NONE is returned. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
AircraftType AircraftTypeClass::From_Name(char const *name)
|
||||
{
|
||||
if (name) {
|
||||
for (AircraftType classid = AIRCRAFT_FIRST; classid < AIRCRAFT_COUNT; classid++) {
|
||||
if (stricmp(Pointers[classid]->IniName, name) == 0) {
|
||||
return(classid);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(AIRCRAFT_NONE);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::One_Time -- Performs one time initialization of the aircraft type class. *
|
||||
* *
|
||||
* This routine is used to perform the onetime initialization of the aircraft type. This *
|
||||
* includes primarily the shape and other graphic data loading. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: This goes to disk and also must only be called ONCE. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void AircraftTypeClass::One_Time(void)
|
||||
{
|
||||
AircraftType index;
|
||||
|
||||
for (index = AIRCRAFT_FIRST; index < AIRCRAFT_COUNT; index++) {
|
||||
char fullname[_MAX_FNAME+_MAX_EXT];
|
||||
AircraftTypeClass const & uclass = As_Reference(index);
|
||||
|
||||
/*
|
||||
** Fetch the supporting data files for the unit.
|
||||
*/
|
||||
char buffer[_MAX_FNAME];
|
||||
if ( Get_Resolution_Factor() ) {
|
||||
sprintf(buffer, "%sICNH", uclass.IniName);
|
||||
} else {
|
||||
sprintf(buffer, "%sICON", uclass.IniName);
|
||||
}
|
||||
_makepath(fullname, NULL, NULL, buffer, ".SHP");
|
||||
((void const *&)uclass.CameoData) = MixFileClass::Retrieve(fullname);
|
||||
|
||||
/*
|
||||
** Generic shape for all houses load method.
|
||||
*/
|
||||
_makepath(fullname, NULL, NULL, uclass.IniName, ".SHP");
|
||||
((void const *&)uclass.ImageData) = MixFileClass::Retrieve(fullname);
|
||||
}
|
||||
|
||||
LRotorData = MixFileClass::Retrieve("LROTOR.SHP");
|
||||
RRotorData = MixFileClass::Retrieve("RROTOR.SHP");
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Create_One_Of -- Creates an aircraft object of the appropriate type. *
|
||||
* *
|
||||
* This routine is used to create an aircraft object that matches the aircraft type. It *
|
||||
* serves as a shortcut to creating an object using the "new" operator and "if" checks. *
|
||||
* *
|
||||
* INPUT: house -- The house owner of the aircraft that is to be created. *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to the aircraft created. If the aircraft could not be *
|
||||
* created, then a NULL is returned. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
ObjectClass * AircraftTypeClass::Create_One_Of(HouseClass * house) const
|
||||
{
|
||||
return(new AircraftClass(Type, house->Class->House));
|
||||
}
|
||||
|
||||
|
||||
#ifdef SCENARIO_EDITOR
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Prep_For_Add -- Prepares the scenario editor for adding an aircraft objec*
|
||||
* *
|
||||
* This routine is used by the scenario editor to prepare for the adding operation. It *
|
||||
* builds a list of pointers to object types that can be added. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void AircraftTypeClass::Prep_For_Add(void)
|
||||
{
|
||||
for (AircraftType index = AIRCRAFT_FIRST; index < AIRCRAFT_COUNT; index++) {
|
||||
if (As_Reference(index).Get_Image_Data()) {
|
||||
Map.Add_To_List(&As_Reference(index));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Display -- Displays a generic version of the aircraft type. *
|
||||
* *
|
||||
* This routine is used by the scenario editor to display a generic version of the object *
|
||||
* type. This is displayed in the object selection dialog box. *
|
||||
* *
|
||||
* INPUT: x,y -- The coordinates to draw the aircraft at (centered). *
|
||||
* *
|
||||
* window -- The window to base the coordinates upon. *
|
||||
* *
|
||||
* house -- The owner of this generic aircraft. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void AircraftTypeClass::Display(int x, int y, WindowNumberType window, HousesType house) const
|
||||
{
|
||||
int shape = 0;
|
||||
void const * ptr = Get_Cameo_Data();
|
||||
if (!ptr) {
|
||||
ptr = Get_Image_Data();
|
||||
shape = 5;
|
||||
}
|
||||
CC_Draw_Shape(ptr, shape, x, y, window, SHAPE_CENTER|SHAPE_WIN_REL|SHAPE_FADING, HouseClass::As_Pointer(house)->Remap_Table(false, true));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Occupy_List -- Returns with occupation list for landed aircraft. *
|
||||
* *
|
||||
* This determines the occupation list for the aircraft (if it was landed). *
|
||||
* *
|
||||
* INPUT: placement -- Is this for placement legality checking only? The normal condition *
|
||||
* is for marking occupation flags. *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to a cell offset occupation list for the aircraft. *
|
||||
* *
|
||||
* WARNINGS: This occupation list is only valid if the aircraft is landed. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
short const * AircraftTypeClass::Occupy_List(bool) const
|
||||
{
|
||||
static short const _list[] = {0, REFRESH_EOL};
|
||||
return(_list);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Overlap_List -- Determines the overlap list for a landed aircraft. *
|
||||
* *
|
||||
* This routine figures out the overlap list for the aircraft as if it were landed. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the cell offset overlap list for the aircraft. *
|
||||
* *
|
||||
* WARNINGS: This overlap list is only valid when the aircraft is landed. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
short const * AircraftTypeClass::Overlap_List(void) const
|
||||
{
|
||||
static short const _list[] = {-(MAP_CELL_W-1), -MAP_CELL_W, -(MAP_CELL_W+1), -1, 1, (MAP_CELL_W-1), MAP_CELL_W, (MAP_CELL_W+1), REFRESH_EOL};
|
||||
return(_list);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Who_Can_Build_Me -- Determines which object can build the aircraft objec *
|
||||
* *
|
||||
* Use this routine to determine which object (factory) can build the aircraft. It *
|
||||
* determines this by scanning through the available factories, looking for one that is *
|
||||
* of the proper ownership and is available. *
|
||||
* *
|
||||
* INPUT: intheory -- When true, it doesn't consider if the factory is currently busy. It *
|
||||
* only considers that it is the right type. *
|
||||
* *
|
||||
* legal -- Should building prerequisite legality checks be performed as well? *
|
||||
* For building placements, this is usually false. For sidebar button *
|
||||
* adding, this is usually true. *
|
||||
* *
|
||||
* house -- The house of the desired aircraft to be built. *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to the object that can build the aircraft. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/30/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
BuildingClass * AircraftTypeClass::Who_Can_Build_Me(bool , bool legal, HousesType house) const
|
||||
{
|
||||
BuildingClass * anybuilding = NULL;
|
||||
for (int index = 0; index < Buildings.Count(); index++) {
|
||||
BuildingClass * building = Buildings.Ptr(index);
|
||||
|
||||
if (building &&
|
||||
!building->IsInLimbo &&
|
||||
building->House->Class->House == house &&
|
||||
building->Mission != MISSION_DECONSTRUCTION &&
|
||||
((1L << building->ActLike) & Ownable) &&
|
||||
(!legal || building->House->Can_Build(Type, building->ActLike)) &&
|
||||
building->Class->ToBuild == RTTI_AIRCRAFTTYPE) {
|
||||
|
||||
if (building->IsLeader) return(building);
|
||||
anybuilding = building;
|
||||
}
|
||||
}
|
||||
return(anybuilding);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Repair_Cost -- Fetchs the cost per repair step. *
|
||||
* *
|
||||
* This routine will return the cost for every repair step. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the credit expense for every repair step. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/26/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int AircraftTypeClass::Repair_Cost(void) const
|
||||
{
|
||||
return(Fixed_To_Cardinal(Cost/(MaxStrength/REPAIR_STEP), REPAIR_PERCENT));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Repair_Step -- Fetches the number of health points per repair. *
|
||||
* *
|
||||
* For every repair event, the returned number of health points is acquired. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the number of health points to recover each repair step. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/26/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int AircraftTypeClass::Repair_Step(void) const
|
||||
{
|
||||
return(REPAIR_STEP);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Max_Pips -- Fetches the maximum number of pips allowed. *
|
||||
* *
|
||||
* Use this routine to retrieve the maximum pip count allowed for this aircraft. This is *
|
||||
* the maximum number of passengers. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the maximum number of pips for this aircraft. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/26/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int AircraftTypeClass::Max_Pips(void) const
|
||||
{
|
||||
if (IsTransporter) {
|
||||
return(Max_Passengers());
|
||||
} else {
|
||||
if (Primary != WEAPON_NONE) {
|
||||
return(5);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Create_And_Place -- Creates and places aircraft using normal game system *
|
||||
* *
|
||||
* This routine is used to create and place an aircraft through the normal game system. *
|
||||
* Since creation of aircraft in this fashion is prohibited, this routine does nothing. *
|
||||
* *
|
||||
* INPUT: na *
|
||||
* *
|
||||
* OUTPUT: Always returns a failure code (false). *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/07/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool AircraftTypeClass::Create_And_Place(CELL, HousesType) const
|
||||
{
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* ATC::Init -- load up terrain set dependant sidebar icons *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: theater type *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 4/25/96 0:33AM ST : Created *
|
||||
*=============================================================================================*/
|
||||
|
||||
void AircraftTypeClass::Init(TheaterType theater)
|
||||
{
|
||||
if (theater != LastTheater){
|
||||
if ( Get_Resolution_Factor() ) {
|
||||
|
||||
AircraftType index;
|
||||
char buffer[_MAX_FNAME];
|
||||
char fullname[_MAX_FNAME+_MAX_EXT];
|
||||
void const * cameo_ptr;
|
||||
|
||||
for (index = AIRCRAFT_FIRST; index < AIRCRAFT_COUNT; index++) {
|
||||
AircraftTypeClass const & uclass = As_Reference(index);
|
||||
|
||||
((void const *&)uclass.CameoData) = NULL;
|
||||
|
||||
sprintf(buffer, "%.4sICNH", uclass.IniName);
|
||||
_makepath (fullname, NULL, NULL, buffer, Theaters[theater].Suffix);
|
||||
cameo_ptr = MixFileClass::Retrieve(fullname);
|
||||
if (cameo_ptr){
|
||||
((void const *&)uclass.CameoData) = cameo_ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AircraftTypeClass::Dimensions -- Fetches the graphic dimensions of the aircraft type. *
|
||||
* *
|
||||
* This routine will fetch the pixel dimensions of this aircraft type. These dimensions *
|
||||
* are used to control map refresh and select box rendering. *
|
||||
* *
|
||||
* INPUT: width -- Reference to variable that will be filled in with aircraft width. *
|
||||
* *
|
||||
* height -- Reference to variable that will be filled in with aircraft height. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/07/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void AircraftTypeClass::Dimensions(int &width, int &height) const
|
||||
{
|
||||
width = 21;
|
||||
height = 20;
|
||||
}
|
||||
|
||||
|
||||
RTTIType AircraftTypeClass::What_Am_I(void) const {return RTTI_AIRCRAFTTYPE;};
|
109
ABSTRACT.CPP
Normal file
109
ABSTRACT.CPP
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\abstract.cpv 2.20 16 Oct 1995 16:49:04 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : ABSTRACT.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 01/26/95 *
|
||||
* *
|
||||
* Last Update : May 22, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* AbstractClass::Distance -- Determines distance to target. *
|
||||
* AbstractTypeClass::AbstractTypeClass -- Constructor for abstract type objects. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AbstractClass::Distance -- Determines distance to target. *
|
||||
* *
|
||||
* This will determine the distance (direct line) to the target. The distance is in *
|
||||
* 'leptons'. This routine is typically used for weapon range checks. *
|
||||
* *
|
||||
* INPUT: target -- The target to determine range to. *
|
||||
* *
|
||||
* OUTPUT: Returns with the range to the specified target (in leptons). *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/17/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int AbstractClass::Distance(TARGET target) const
|
||||
{
|
||||
/*
|
||||
** Should subtract a fudge-factor distance for building targets.
|
||||
*/
|
||||
BuildingClass *obj = As_Building(target);
|
||||
int dist = Distance(As_Coord(target));
|
||||
|
||||
/*
|
||||
** If the object is a building the adjust it by the average radius
|
||||
** of the object.
|
||||
*/
|
||||
if (obj) {
|
||||
dist -= ((obj->Class->Width() + obj->Class->Height()) * (0x100 / 4));
|
||||
if (dist < 0) dist = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return the distance to the target
|
||||
*/
|
||||
return(dist);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* AbstractTypeClass::AbstractTypeClass -- Constructor for abstract type objects. *
|
||||
* *
|
||||
* This is the constructor for AbstractTypeClass objects. It initializes the INI name and *
|
||||
* the text name for this object type. *
|
||||
* *
|
||||
* INPUT: name -- Text number for the full name of the object. *
|
||||
* *
|
||||
* ini -- The ini name for this object type. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/22/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
AbstractTypeClass::AbstractTypeClass(int name, char const * ini)
|
||||
{
|
||||
Name = name;
|
||||
strncpy((char *)IniName, ini, sizeof(IniName));
|
||||
((char &)IniName[sizeof(IniName)-1]) = '\0';
|
||||
}
|
||||
|
||||
RTTIType AbstractTypeClass::What_Am_I(void) const {return RTTI_ABSTRACTTYPE;};
|
||||
COORDINATE AbstractTypeClass::Coord_Fixup(COORDINATE coord) const {return coord;}
|
||||
int AbstractTypeClass::Full_Name(void) const {return Name;};
|
||||
unsigned short AbstractTypeClass::Get_Ownable(void) const {return 0xffff;};
|
109
ABSTRACT.H
Normal file
109
ABSTRACT.H
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\abstract.h_v 2.20 16 Oct 1995 16:46:30 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : ABSTRACT.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 01/26/95 *
|
||||
* *
|
||||
* Last Update : January 26, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef ABSTRACT_H
|
||||
#define ABSTRACT_H
|
||||
|
||||
DirType Direction(CELL cell1, CELL cell2);
|
||||
DirType Direction(COORDINATE coord1, COORDINATE coord2);
|
||||
int Distance(COORDINATE coord1, COORDINATE coord2);
|
||||
int Distance(CELL coord1, CELL coord2);
|
||||
COORDINATE As_Coord(TARGET target);
|
||||
|
||||
class AbstractTypeClass;
|
||||
|
||||
class AbstractClass
|
||||
{
|
||||
public:
|
||||
|
||||
/*
|
||||
** The coordinate location of the unit. For vehicles, this is the center
|
||||
** point. For buildings, it is the upper left corner.
|
||||
*/
|
||||
COORDINATE Coord;
|
||||
|
||||
/*
|
||||
** The actual object ram-space is located in arrays in the data segment. This flag
|
||||
** is used to indicate which objects are free to be reused and which are currently
|
||||
** in use by the game.
|
||||
*/
|
||||
unsigned IsActive:1;
|
||||
|
||||
/*-----------------------------------------------------------------------------------
|
||||
** Constructor & destructors.
|
||||
*/
|
||||
AbstractClass(void) {Coord = 0L;};
|
||||
virtual ~AbstractClass(void) {};
|
||||
|
||||
/*
|
||||
** Query functions.
|
||||
*/
|
||||
virtual HousesType Owner(void) const {return HOUSE_NONE;};
|
||||
|
||||
/*
|
||||
** Coordinate query support functions.
|
||||
*/
|
||||
virtual COORDINATE Center_Coord(void) const {return Coord;};
|
||||
virtual COORDINATE Target_Coord(void) const {return Coord;};
|
||||
|
||||
/*
|
||||
** Coordinate inquiry functions. These are used for both display and
|
||||
** combat purposes.
|
||||
*/
|
||||
DirType Direction(AbstractClass const * object) const {return ::Direction(Center_Coord(), object->Target_Coord());};
|
||||
DirType Direction(COORDINATE coord) const {return ::Direction(Center_Coord(), coord);};
|
||||
DirType Direction(TARGET target) const {return ::Direction(Center_Coord(), As_Coord(target));};
|
||||
DirType Direction(CELL cell) const {return ::Direction(Coord_Cell(Center_Coord()), cell);};
|
||||
int Distance(TARGET target) const;
|
||||
int Distance(COORDINATE coord) const {return ::Distance(Center_Coord(), coord);};
|
||||
int Distance(CELL cell) const {return ::Distance(Coord_Cell(Center_Coord()), cell);};
|
||||
int Distance(AbstractClass const * object) const {return ::Distance(Center_Coord(), object->Target_Coord());};
|
||||
|
||||
/*
|
||||
** Object entry and exit from the game system.
|
||||
*/
|
||||
virtual MoveType Can_Enter_Cell(CELL , FacingType = FACING_NONE) const {return MOVE_OK;};
|
||||
|
||||
/*
|
||||
** AI.
|
||||
*/
|
||||
virtual void AI(void) {};
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
3495
AIRCRAFT.CPP
Normal file
3495
AIRCRAFT.CPP
Normal file
File diff suppressed because it is too large
Load diff
254
AIRCRAFT.H
Normal file
254
AIRCRAFT.H
Normal file
|
@ -0,0 +1,254 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\aircraft.h_v 2.17 16 Oct 1995 16:47:48 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : AIRCRAFT.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : July 22, 1994 *
|
||||
* *
|
||||
* Last Update : November 28, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef AIRCRAFT_H
|
||||
#define AIRCRAFT_H
|
||||
|
||||
#include "radio.h"
|
||||
#include "fly.h"
|
||||
#include "target.h"
|
||||
|
||||
|
||||
class AircraftClass : public FootClass, public FlyClass
|
||||
{
|
||||
public:
|
||||
/*
|
||||
** This is a pointer to the class control structure for the aircraft.
|
||||
*/
|
||||
AircraftTypeClass const * const Class;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void * operator new(size_t);
|
||||
void operator delete(void *);
|
||||
operator AircraftType(void) const {return Class->Type;};
|
||||
AircraftClass(void) : Class(0) {};
|
||||
AircraftClass(AircraftType classid, HousesType house);
|
||||
virtual ~AircraftClass(void);
|
||||
virtual RTTIType What_Am_I(void) const {return RTTI_AIRCRAFT;};
|
||||
|
||||
static void Init(void);
|
||||
enum {FLIGHT_LEVEL=24};
|
||||
|
||||
virtual int Mission_Attack(void);
|
||||
virtual int Mission_Unload(void);
|
||||
virtual int Mission_Hunt(void);
|
||||
virtual int Mission_Retreat(void);
|
||||
virtual int Mission_Move(void);
|
||||
virtual int Mission_Enter(void);
|
||||
virtual int Mission_Guard(void);
|
||||
virtual int Mission_Guard_Area(void);
|
||||
|
||||
/*
|
||||
** State machine support routines.
|
||||
*/
|
||||
bool Process_Take_Off(void);
|
||||
bool Process_Landing(void);
|
||||
int Process_Fly_To(bool slowdown);
|
||||
|
||||
/*
|
||||
** Query functions.
|
||||
*/
|
||||
virtual int Threat_Range(int control) const;
|
||||
virtual int Rearm_Delay(bool second) const;
|
||||
virtual MoveType Can_Enter_Cell(CELL cell, FacingType facing=FACING_NONE) const;
|
||||
virtual LayerType In_Which_Layer(void) const;
|
||||
virtual ObjectTypeClass const & Class_Of(void) const {return *Class;};
|
||||
virtual ActionType What_Action(ObjectClass * target) const;
|
||||
virtual ActionType What_Action(CELL cell) const;
|
||||
virtual DirType Desired_Load_Dir(ObjectClass * passenger, CELL & moveto) const;
|
||||
virtual int Pip_Count(void) const;
|
||||
TARGET Good_Fire_Location(TARGET target) const;
|
||||
bool Cell_Seems_Ok(CELL cell, bool landing=false) const;
|
||||
DirType Pose_Dir(void) const;
|
||||
TARGET Good_LZ(void) const;
|
||||
virtual DirType Fire_Direction(void) const;
|
||||
|
||||
/*
|
||||
** Landing zone support functionality.
|
||||
*/
|
||||
bool Is_LZ_Clear(TARGET target) const;
|
||||
TARGET New_LZ(TARGET oldlz) const;
|
||||
|
||||
/*
|
||||
** Coordinate inquiry functions. These are used for both display and
|
||||
** combat purposes.
|
||||
*/
|
||||
virtual COORDINATE Sort_Y(void) const;
|
||||
virtual COORDINATE Fire_Coord(int which) const;
|
||||
virtual COORDINATE Target_Coord(void) const;
|
||||
|
||||
/*
|
||||
** Object entry and exit from the game system.
|
||||
*/
|
||||
virtual bool Unlimbo(COORDINATE , DirType facing = DIR_N);
|
||||
|
||||
/*
|
||||
** Display and rendering support functionality. Supports imagery and how
|
||||
** object interacts with the map and thus indirectly controls rendering.
|
||||
*/
|
||||
virtual bool Exit_Object(TechnoClass *);
|
||||
virtual bool Mark(MarkType mark=MARK_CHANGE);
|
||||
virtual short const * Overlap_List(void) const;
|
||||
virtual void Draw_It(int x, int y, WindowNumberType window);
|
||||
virtual void Set_Speed(int speed);
|
||||
|
||||
/*
|
||||
** User I/O.
|
||||
*/
|
||||
virtual void Active_Click_With(ActionType action, ObjectClass * object);
|
||||
virtual void Active_Click_With(ActionType action, CELL cell);
|
||||
virtual void Player_Assign_Mission(MissionType mission, TARGET target=TARGET_NONE, TARGET destination=TARGET_NONE);
|
||||
virtual void Response_Select(void);
|
||||
virtual void Response_Move(void);
|
||||
virtual void Response_Attack(void);
|
||||
|
||||
/*
|
||||
** Combat related.
|
||||
*/
|
||||
// virtual bool Target_Something_Nearby(ThreatType threat=THREAT_NORMAL);
|
||||
virtual ResultType Take_Damage(int & damage, int distance, WarheadType warhead, TechnoClass * source);
|
||||
virtual BulletClass * Fire_At(TARGET target, int which);
|
||||
virtual TARGET As_Target(void) const;
|
||||
|
||||
/*
|
||||
** AI.
|
||||
*/
|
||||
virtual void AI(void);
|
||||
virtual void Enter_Idle_Mode(bool initial = false);
|
||||
virtual RadioMessageType Receive_Message(RadioClass * from, RadioMessageType message, long & param);
|
||||
virtual void Scatter(COORDINATE threat, bool forced=false);
|
||||
|
||||
/*
|
||||
** Scenario and debug support.
|
||||
*/
|
||||
#ifdef CHEAT_KEYS
|
||||
virtual void Debug_Dump(MonoClass *mono) const;
|
||||
#endif
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
static void Read_INI(char *buffer);
|
||||
static void Write_INI(char *buffer);
|
||||
static char * INI_Name(void) {return "AIRCRAFT";};
|
||||
bool Load(FileClass & file);
|
||||
bool Save(FileClass & file);
|
||||
virtual void Code_Pointers(void);
|
||||
virtual void Decode_Pointers(void);
|
||||
|
||||
/*
|
||||
** Dee-buggin' support.
|
||||
*/
|
||||
int Validate(void) const;
|
||||
|
||||
public:
|
||||
|
||||
/*
|
||||
** This is the facing used for the body of the aircraft. Typically, this is the same
|
||||
** as the PrimaryFacing, but in the case of helicopters, it can be different.
|
||||
*/
|
||||
FacingClass SecondaryFacing;
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
** Aircraft can be in either state of landing, taking off, or in steady altitude.
|
||||
** These flags are used to control transition between flying and landing. It is
|
||||
** necessary to handle the transition in this manner so that it occurs smoothly
|
||||
** during the graphic processing section.
|
||||
*/
|
||||
unsigned IsLanding:1;
|
||||
unsigned IsTakingOff:1;
|
||||
|
||||
/*
|
||||
** It is very common for aircraft to be homing in on a target. When this flag is
|
||||
** true, the aircraft will constantly adjust its facing toward the TarCom. When the
|
||||
** target is very close (one cell away or less), then this flag is automatically cleared.
|
||||
** This is because the homing algorithm is designed to get the aircraft to the destination
|
||||
** but no more. Checking when this flag is cleared is a way of flagging transition into
|
||||
** a new mode. Example: Transport helicopters go into a hovering into correct position
|
||||
** mode when the target is reached.
|
||||
*/
|
||||
unsigned IsHoming:1;
|
||||
|
||||
/*
|
||||
** Helicopters that are about to land must hover into a position exactly above the landing
|
||||
** zone. When this flag is true, the aircraft will be adjusted so that it is exactly over
|
||||
** the TarCom. The facing of the aircraft is not altered by this movement. The affect
|
||||
** like the helicopter is hovering and shifting sideways to position over the landing
|
||||
** zone. When the position is over the landing zone, then this flag is set to false.
|
||||
*/
|
||||
unsigned IsHovering:1;
|
||||
|
||||
/*
|
||||
** This is the jitter tracker to be used when the aircraft is a helicopter and
|
||||
** is flying. It is most noticable when the helicopter is hovering.
|
||||
*/
|
||||
unsigned char Jitter;
|
||||
|
||||
public:
|
||||
/*
|
||||
** This is the altitude of the aircraft. It is expressed in pixels that
|
||||
** the shadow is offset to the south. If the altitude reaches zero, then
|
||||
** the aircraft has landed. The altitude for normal aircraft is at
|
||||
** Flight_Level().
|
||||
*/
|
||||
int Altitude;
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
** This timer controls when the aircraft will reveal the terrain around itself.
|
||||
** When this timer expires and this aircraft has a sight range, then the
|
||||
** look around process will occur.
|
||||
*/
|
||||
TCountDownTimerClass SightTimer;
|
||||
|
||||
/*
|
||||
** Most attack aircraft can make several attack runs. This value contains the
|
||||
** number of attack runs the aircraft has left. When this value reaches
|
||||
** zero then the aircraft is technically out of ammo.
|
||||
*/
|
||||
char AttacksRemaining;
|
||||
|
||||
/*
|
||||
** This contains the value of the Virtual Function Table Pointer
|
||||
*/
|
||||
static void * VTable;
|
||||
};
|
||||
|
||||
#endif
|
590
ALLOC.CPP
Normal file
590
ALLOC.CPP
Normal file
|
@ -0,0 +1,590 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Westwood Library *
|
||||
* *
|
||||
* File Name : ALLOC.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : February 1, 1992 *
|
||||
* *
|
||||
* Last Update : March 9, 1995 [JLB] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Alloc -- Allocates system RAM. *
|
||||
* Ram_Free -- Determines the largest free chunk of RAM. *
|
||||
* Free -- Free an Alloc'ed block of RAM. *
|
||||
* Resize_Alloc -- Change the size of an allocated block. *
|
||||
* Heap_Size -- Size of the heap we have. *
|
||||
* Total_Ram_Free -- Total amount of free RAM. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <dos.h>
|
||||
#include <bios.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifndef WWMEM_H
|
||||
#include "wwmem.h"
|
||||
#endif
|
||||
|
||||
|
||||
extern "C" unsigned long Largest_Mem_Block ( void ) ;
|
||||
|
||||
//
|
||||
// use double-word alignment for allocs
|
||||
//
|
||||
#define LONG_ALIGNMENT 1
|
||||
|
||||
/*
|
||||
** Define the equates necessary to call a DPMI interrupt.
|
||||
*/
|
||||
#define DPMI_INT 0x0031
|
||||
#define DPMI_LOCK_MEM 0x0600
|
||||
#define DPMI_UNLOCK_MEM 0x0601
|
||||
#define LOGGING FALSE
|
||||
/*=========================================================================*/
|
||||
/* The following PRIVATE functions are in this file: */
|
||||
/*=========================================================================*/
|
||||
|
||||
|
||||
/*= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
|
||||
|
||||
unsigned long MinRam=0L; // Record of least memory at worst case.
|
||||
unsigned long MaxRam=0L; // Record of total allocated at worst case.
|
||||
static unsigned long TotalRam = 0L;
|
||||
static unsigned long Memory_Calls = 0L;
|
||||
static unsigned long RequestedSystemRam = 8*1024*1024;
|
||||
static unsigned long LargestRamBlock = 0L;
|
||||
|
||||
void (*Memory_Error)(void) = NULL;
|
||||
void (*Memory_Error_Exit)(char *string) = NULL;
|
||||
|
||||
/***************************************************************************
|
||||
* DPMI_LOCK -- handles locking a block of DPMI memory *
|
||||
* *
|
||||
* INPUT: *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/23/1995 PWG : Created. *
|
||||
*=========================================================================*/
|
||||
#include"mono.h"
|
||||
void DPMI_Lock(VOID const *ptr, long const size)
|
||||
{
|
||||
union REGS regs;
|
||||
struct SREGS sregs;
|
||||
|
||||
/*
|
||||
** Lock memory
|
||||
** AX = 0x600
|
||||
** BX:CX = starting linear address of memory to lock
|
||||
** SI:DI = size of region to lock (in bytes)
|
||||
** - If Failure, carry flag is set.
|
||||
*/
|
||||
memset (®s, 0 ,sizeof(regs));
|
||||
segread (&sregs);
|
||||
regs.x.eax = DPMI_LOCK_MEM;
|
||||
regs.x.ebx = ((long)ptr & 0xffff0000) >> 16;
|
||||
regs.x.ecx = ((long)ptr & 0x0000ffff);
|
||||
regs.x.esi = ((long)size & 0xffff0000) >> 16;
|
||||
regs.x.edi = ((long)size & 0x0000ffff);
|
||||
int386x (DPMI_INT, ®s, ®s, &sregs); // call DPMI
|
||||
// if (regs.x.cflag) {
|
||||
// }
|
||||
#if(0)
|
||||
char *temp = (char *)ptr;
|
||||
char hold;
|
||||
for (int lp = 0; lp < size; lp += 2048) {
|
||||
hold = *temp;
|
||||
temp += 2048;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* DPMI_UNLOCK -- Handles unlocking a locked block of DPMI *
|
||||
* *
|
||||
* INPUT: *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/23/1995 PWG : Created. *
|
||||
*=========================================================================*/
|
||||
void DPMI_Unlock(void const *ptr, long const size)
|
||||
{
|
||||
union REGS regs;
|
||||
struct SREGS sregs;
|
||||
|
||||
/*
|
||||
** Unlock the memory
|
||||
*/
|
||||
memset (®s, 0 ,sizeof(regs));
|
||||
segread (&sregs);
|
||||
regs.x.eax = DPMI_UNLOCK_MEM; // DPMI function to call
|
||||
regs.x.ebx = ((long)ptr & 0xffff0000) >> 16;
|
||||
regs.x.ecx = ((long)ptr & 0x0000ffff);
|
||||
regs.x.esi = ((long)size & 0xffff0000) >> 16;
|
||||
regs.x.edi = ((long)size & 0x0000ffff);
|
||||
int386x (DPMI_INT, ®s, ®s, &sregs); // call DPMI
|
||||
// if (regs.x.cflag) {
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Alloc -- Allocates system RAM. *
|
||||
* *
|
||||
* This is the basic RAM allocation function. It is used for all *
|
||||
* memory allocations needed by the system or the main program. *
|
||||
* *
|
||||
* INPUT: bytes_to_alloc -- LONG value of the number of bytes to alloc. *
|
||||
* *
|
||||
* flags -- Memory allocation control flags. *
|
||||
* MEM_NORMAL: No special flags. *
|
||||
* MEM_CLEAR: Zero out memory block. *
|
||||
* MEM_NEW: Called by a new. *
|
||||
* *
|
||||
* OUTPUT: Returns with pointer to allocated block. If NULL was returned *
|
||||
* it indicates a failure to allocate. Note: NULL will never be *
|
||||
* returned if the standard library allocation error routine is *
|
||||
* used. *
|
||||
* *
|
||||
* WARNINGS: If you replace the standard memory allocation error routine *
|
||||
* and make it so that Alloc CAN return with a NULL, be sure *
|
||||
* and check for this in your code. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 09/03/1991 JLB : Documented. *
|
||||
* 08/09/1993 JLB : Updated with EMS memory support. *
|
||||
* 04/28/1994 JAW : Updated to 32bit Protected mode. *
|
||||
* 03/09/1995 JLB : Fixed *
|
||||
*=========================================================================*/
|
||||
void *Alloc(unsigned long bytes_to_alloc, MemoryFlagType flags)
|
||||
{
|
||||
union REGS regs ;
|
||||
struct SREGS sregs ;
|
||||
unsigned char *retval=NULL; // Pointer to allocated block.
|
||||
unsigned long original_size; // Original allocation size.
|
||||
unsigned long bytesfree; // Number of free bytes.
|
||||
long *longptr=NULL; // Pointer used to store selector
|
||||
static unsigned char _allocinit=0;
|
||||
|
||||
|
||||
//
|
||||
// Init memory system by finding largest block to alloc
|
||||
// then allocate it to get one large heap and free it.
|
||||
// There may be more memory available from DPMI but we only are
|
||||
// for now allocating and freeing the first largest block.
|
||||
//
|
||||
if ( !_allocinit ) {
|
||||
unsigned long largestblock = Largest_Mem_Block();
|
||||
largestblock -= 1024; // subtract for heap header and misc
|
||||
largestblock &= 0xffff0000; // forcing to 64K boundary
|
||||
|
||||
if ( largestblock ) {
|
||||
LargestRamBlock = MIN( largestblock, RequestedSystemRam );
|
||||
unsigned char *lptr = (unsigned char *)malloc( LargestRamBlock );
|
||||
if ( lptr ) {
|
||||
free( (void *)lptr );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Initialize the total ram available value.
|
||||
*/
|
||||
TotalRam = Total_Ram_Free(MEM_NORMAL);
|
||||
|
||||
_allocinit = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
** Save the original allocated space size so that we can clear the
|
||||
** exact amount of RAM if they specified MEM_CLEAR.
|
||||
*/
|
||||
original_size = bytes_to_alloc;
|
||||
|
||||
/*
|
||||
** Reserve one byte for the header of the memory we allocated.
|
||||
** We will store the flags variable there for later use.
|
||||
*/
|
||||
#if (LONG_ALIGNMENT)
|
||||
bytes_to_alloc += (flags & MEM_LOCK) ? 8 : 4;
|
||||
#else
|
||||
bytes_to_alloc += (flags & MEM_LOCK) ? 5 : 1;
|
||||
#endif
|
||||
|
||||
|
||||
// Try to allocate the memory out of the protected mode memory
|
||||
// chain if we did not require a real mode allocation. If this
|
||||
// fails we will have to try to allocate it out of real mode memory.
|
||||
// Real mode memory is a last resort because some types of applications
|
||||
// require real mode memory.
|
||||
if (!(flags & MEM_REAL)) {
|
||||
retval = (unsigned char*)malloc(bytes_to_alloc);
|
||||
}
|
||||
|
||||
// Try to allocate the memory out of the real mode memory using DPMI
|
||||
// service 0x100. Note that retval will be null if we are requesting
|
||||
// real mode memory so that we do not have to explicitly check for the
|
||||
// real mode flag. Remember we need to reserve room for the dos
|
||||
// selector value at the beginning of our allocated block so rather than
|
||||
// adding fifteen and rounding, we need to add 19 and round.
|
||||
if (!retval) {
|
||||
flags = (MemoryFlagType)(flags | MEM_REAL);
|
||||
regs.x.eax = 0x100;
|
||||
regs.x.ebx = (bytes_to_alloc + 19) >> 4;
|
||||
if (regs.x.ebx & 0xFFFF0000) {
|
||||
retval = NULL;
|
||||
} else {
|
||||
segread ( & sregs ) ;
|
||||
int386x ( 0x31 , & regs, & regs , & sregs ) ;
|
||||
if (regs.x.cflag)
|
||||
retval = NULL;
|
||||
else {
|
||||
#if (LONG_ALIGNMENT)
|
||||
longptr = (long *)(((regs.x.eax & 0xFFFF) << 4)+ 4);
|
||||
#else
|
||||
longptr = (long *)(((regs.x.eax & 0xFFFF) << 4)+ 1);
|
||||
#endif
|
||||
*longptr++ = regs.x.edx & 0xFFFF;
|
||||
retval = (unsigned char *)longptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If the alloc failed then we need to signify a memory error.
|
||||
if (retval == NULL) {
|
||||
if (Memory_Error != NULL)
|
||||
Memory_Error();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// If the memory needs to be DPMI locked then we should store the
|
||||
// original size in the header before we store the flags.
|
||||
if (flags & MEM_LOCK) {
|
||||
longptr = (long *)retval;
|
||||
*longptr++ = original_size;
|
||||
retval = (unsigned char *)longptr;
|
||||
}
|
||||
|
||||
|
||||
// Now that we know the alloc was sucessful (and for an extra byte
|
||||
// more than the user wanted) we need to stick in the memory flags.
|
||||
#if (LONG_ALIGNMENT)
|
||||
if ( !(flags & (MEM_LOCK|MEM_REAL)) ) {
|
||||
//
|
||||
// WARNING!!!!!!!!!!
|
||||
// USE this only with the WATCOM malloc ALLOCATION!!!!!!!!!
|
||||
// it reads the actual block size before the ptr returned.
|
||||
// then eors and uses the upper word for a validation later on free.
|
||||
//
|
||||
longptr = (long *)retval;
|
||||
*longptr = ((*(longptr - 1)) ^ 0xffffffff) & 0xffff0000;
|
||||
*retval++ = flags;
|
||||
*retval++ = (unsigned char)(flags ^ 0xff);
|
||||
retval += 2;
|
||||
}
|
||||
else {
|
||||
*retval++ = flags;
|
||||
*retval++ = (unsigned char)(flags ^ 0xff);
|
||||
*retval++ = 0;
|
||||
*retval++ = 0;
|
||||
}
|
||||
#else
|
||||
*retval++ = (unsigned char)(flags | (((flags ^ 0x07) & 0x07) << 5));
|
||||
#endif
|
||||
|
||||
// If the memory needed to be DPMI locked then set it up so it
|
||||
// is locked.
|
||||
if (flags & MEM_LOCK) {
|
||||
DPMI_Lock(retval, original_size);
|
||||
}
|
||||
|
||||
/* Clear the space if they wanted it clear */
|
||||
|
||||
if (flags & MEM_CLEAR) {
|
||||
unsigned char *ptr; // Working memory block pointer.
|
||||
|
||||
ptr = retval;
|
||||
memset(ptr, '\0', original_size);
|
||||
}
|
||||
|
||||
bytesfree = Total_Ram_Free(MEM_NORMAL);
|
||||
if (bytesfree < MinRam) {
|
||||
MinRam = bytesfree;
|
||||
}
|
||||
if (TotalRam-bytesfree > MaxRam) {
|
||||
MaxRam = TotalRam-bytesfree;
|
||||
}
|
||||
|
||||
Memory_Calls++;
|
||||
|
||||
#if(LOGGING)
|
||||
int val = _heapchk();
|
||||
|
||||
FILE *file = fopen("mem.txt","at");
|
||||
fprintf(file, "%P Alloc size = %d, Actual Size = %d, flags = %d, heap = %d\n",
|
||||
retval,
|
||||
original_size,
|
||||
bytes_to_alloc,
|
||||
flags,
|
||||
val);
|
||||
fclose(file);
|
||||
#endif
|
||||
|
||||
return(retval);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Free -- Free an Alloc'ed block of RAM. *
|
||||
* *
|
||||
* FUNCTION: *
|
||||
* *
|
||||
* INPUT: A pointer to a block of RAM from Alloc. *
|
||||
* *
|
||||
* OUTPUT: None. *
|
||||
* *
|
||||
* WARNINGS: Don't use this for an Alloc_Block'ed RAM block. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/25/1990 : Created. *
|
||||
***************************************************************************/
|
||||
void Free(void const *pointer)
|
||||
{
|
||||
union REGS regs ;
|
||||
struct SREGS sregs ;
|
||||
|
||||
void const *original = pointer;
|
||||
char string[80];
|
||||
|
||||
if (pointer) {
|
||||
/*
|
||||
** Get a pointer to the flags that we stored off.
|
||||
*/
|
||||
#if (LONG_ALIGNMENT)
|
||||
unsigned char *byteptr = ((unsigned char *)pointer) - 4;
|
||||
|
||||
//
|
||||
// validate the flags with and eor of the flags
|
||||
//
|
||||
if ( *byteptr != ((*(byteptr + 1)) ^ 0xff) ) {
|
||||
if (Memory_Error_Exit != NULL) {
|
||||
sprintf( string, "Error freeing pointer %p. Header invalid!!!\n", pointer );
|
||||
Memory_Error_Exit( string );
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( !(*byteptr & (MEM_LOCK|MEM_REAL)) ) {
|
||||
unsigned short *wordptr = (unsigned short *)(byteptr - 2);
|
||||
|
||||
//
|
||||
// WARNING!!!!!!!!!!
|
||||
// USE this only with the WATCOM malloc ALLOCATION!!!!!!!!!
|
||||
// it reads the actual block size before the ptr to be freed.
|
||||
// then compares with the EOR to the value stored during allocation.
|
||||
//
|
||||
if ( *wordptr != ((*(wordptr + 2)) ^ 0xffff) ) {
|
||||
if (Memory_Error_Exit != NULL) {
|
||||
sprintf( string, "Error freeing pointer %p. Header invalid!!!\n", pointer );
|
||||
Memory_Error_Exit( string );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( *(byteptr + 2) || *(byteptr + 3) ) {
|
||||
if (Memory_Error_Exit != NULL) {
|
||||
sprintf( string, "Error freeing pointer %p. Header invalid!!!\n", pointer );
|
||||
Memory_Error_Exit( string );
|
||||
}
|
||||
}
|
||||
}
|
||||
// if ( *byteptr != (*(byteptr + 1) ^ 0xff) ||
|
||||
// *(byteptr + 2) || *(byteptr + 3) ) {
|
||||
// if (Memory_Error_Exit != NULL) {
|
||||
// sprintf( string, "Error freeing pointer %p. Header invalid!!!\n", pointer );
|
||||
// Memory_Error_Exit( string );
|
||||
// }
|
||||
// }
|
||||
#else
|
||||
unsigned char *byteptr = ((unsigned char *)pointer) - 1;
|
||||
|
||||
if ( (*byteptr & 0xe0) != (((*byteptr ^ 0x07) & 0x07) << 5) ) {
|
||||
if (Memory_Error_Exit != NULL) {
|
||||
sprintf( string, "Error freeing pointer %p. Header invalid!!!\n", pointer );
|
||||
Memory_Error_Exit( string );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Check to see if this was locked me and if it was unlock it.
|
||||
*/
|
||||
if (*byteptr & MEM_LOCK) {
|
||||
long *longptr = ((long *)byteptr) - 1;
|
||||
DPMI_Unlock(pointer, *longptr);
|
||||
pointer = (void *)longptr;
|
||||
} else
|
||||
pointer = (void *)byteptr;
|
||||
|
||||
#if(LOGGING)
|
||||
int val = _heapchk();
|
||||
FILE *file = fopen("mem.txt","at");
|
||||
fprintf(file, "%P Free flags = %d, Heap = %d\n",
|
||||
original,
|
||||
*byteptr,
|
||||
val);
|
||||
fclose(file);
|
||||
#endif
|
||||
|
||||
// If the pointer is a real mode pointer than it will point to the
|
||||
// first megabyte of system memory. If it does than we need to
|
||||
// use DPMI to free it.
|
||||
if (*byteptr & MEM_REAL) {
|
||||
regs.x.eax = 0x101;
|
||||
regs.x.edx = *(((long *)pointer) - 1);
|
||||
segread ( & sregs ) ;
|
||||
int386x(0x31, ®s, ®s, &sregs);
|
||||
} else {
|
||||
free((void *)pointer);
|
||||
}
|
||||
Memory_Calls--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Resize_Alloc -- Change the size of an allocated block. *
|
||||
* *
|
||||
* This routine will take a previously allocated block and change its *
|
||||
* size without unnecessarily altering its contents. *
|
||||
* *
|
||||
* INPUT: pointer -- Pointer to the original memory allocation. *
|
||||
* *
|
||||
* new_size -- Size in bytes that it will be converted to. *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to the new allocation. *
|
||||
* *
|
||||
* WARNINGS: ??? *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/01/1992 JLB : Commented. *
|
||||
*=========================================================================*/
|
||||
void *Resize_Alloc(void *original_ptr, unsigned long new_size_in_bytes)
|
||||
{
|
||||
|
||||
unsigned long *temp;
|
||||
// unsigned long diff, flags;
|
||||
|
||||
temp = (unsigned long*)original_ptr;
|
||||
|
||||
/* ReAlloc the space */
|
||||
temp = (unsigned long *)realloc(temp, new_size_in_bytes);
|
||||
if (temp == NULL) {
|
||||
if (Memory_Error != NULL)
|
||||
Memory_Error();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return(temp);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Ram_Free -- Determines the largest free chunk of RAM. *
|
||||
* *
|
||||
* Use this routine to determine the largest free chunk of available *
|
||||
* RAM for allocation. It also performs a check of the memory chain. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the size of the largest free chunk of RAM. *
|
||||
* *
|
||||
* WARNINGS: This does not return the TOTAL memory free, only the *
|
||||
* largest free chunk. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 09/03/1991 JLB : Commented. *
|
||||
*=========================================================================*/
|
||||
long Ram_Free(MemoryFlagType)
|
||||
{
|
||||
return(_memmax());
|
||||
// return Largest_Mem_Block();
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Heap_Size -- Size of the heap we have. *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/21/1994 SKB : Created. *
|
||||
*=========================================================================*/
|
||||
long Heap_Size(MemoryFlagType )
|
||||
{
|
||||
if (!TotalRam) {
|
||||
TotalRam = Total_Ram_Free(MEM_NORMAL);
|
||||
}
|
||||
return(TotalRam);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Total_Ram_Free -- Total amount of free RAM. *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/21/1994 SKB : Created. *
|
||||
* 03/09/1995 JLB : Uses prerecorded heap size maximum. *
|
||||
*=========================================================================*/
|
||||
long Total_Ram_Free(MemoryFlagType )
|
||||
{
|
||||
return(_memavl());
|
||||
// return Largest_Mem_Block () ;
|
||||
}
|
||||
|
174
ANIM.H
Normal file
174
ANIM.H
Normal file
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\anim.h_v 2.20 16 Oct 1995 16:45:40 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : ANIM.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : May 30, 1994 *
|
||||
* *
|
||||
* Last Update : May 30, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef ANIM_H
|
||||
#define ANIM_H
|
||||
|
||||
#include "type.h"
|
||||
|
||||
/**********************************************************************************************
|
||||
** This is the class that controls the shape animation objects. Shape animation objects are
|
||||
** displayed over the top of the game map. Typically, they are used for explosion and fire
|
||||
** effects.
|
||||
*/
|
||||
class AnimClass : public ObjectClass, private StageClass {
|
||||
public:
|
||||
|
||||
static void * AnimClass::operator new(size_t size);
|
||||
static void AnimClass::operator delete(void *ptr);
|
||||
AnimClass(void) : Class(0) {Owner=HOUSE_NONE;Object=0;}; // Default constructor does nothing.
|
||||
AnimClass(AnimType animnum, COORDINATE coord, unsigned char timedelay=0, unsigned char loop=1, bool alt=false);
|
||||
virtual ~AnimClass(void);
|
||||
operator AnimType(void) const {return Class->Type;};
|
||||
virtual RTTIType What_Am_I(void) const {return RTTI_ANIM;};
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Member function prototypes.
|
||||
*/
|
||||
static void Init(void);
|
||||
|
||||
void Attach_To(ObjectClass *obj);
|
||||
void Make_Invisible(void) {IsInvisible = true;};
|
||||
|
||||
virtual bool Can_Place_Here(COORDINATE ) const {return true;}
|
||||
virtual bool Mark(MarkType mark=MARK_CHANGE);
|
||||
virtual bool Render(bool forced);
|
||||
virtual COORDINATE Center_Coord(void) const;
|
||||
virtual COORDINATE Sort_Y(void) const;
|
||||
virtual LayerType In_Which_Layer(void) const;
|
||||
virtual ObjectTypeClass const & Class_Of(void) const {return *Class;};
|
||||
virtual short const * Occupy_List(void) const;
|
||||
virtual short const * Overlap_List(void) const;
|
||||
virtual void Draw_It(int x, int y, WindowNumberType window);
|
||||
virtual void AI(void);
|
||||
virtual TARGET As_Target(void) const;
|
||||
virtual void Detach(TARGET target, bool all);
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
bool Load(FileClass & file);
|
||||
bool Save(FileClass & file);
|
||||
virtual void Code_Pointers(void);
|
||||
virtual void Decode_Pointers(void);
|
||||
|
||||
/*
|
||||
** Dee-buggin' support.
|
||||
*/
|
||||
int Validate(void) const;
|
||||
|
||||
/*
|
||||
** If this animation is attached to an object, then this points to that object. An
|
||||
** animation that is attached will follow that object as it moves. This is important
|
||||
** for animations such as flames and smoke.
|
||||
*/
|
||||
ObjectClass * Object;
|
||||
|
||||
/*
|
||||
** If this animation has an owner, then it will be recorded here. An owner
|
||||
** is used when damage is caused by this animation during the middle of its
|
||||
** animation.
|
||||
*/
|
||||
HousesType Owner;
|
||||
|
||||
/*
|
||||
** This counter tells how many more times the animation should loop before it
|
||||
** terminates.
|
||||
*/
|
||||
unsigned char Loops;
|
||||
|
||||
protected:
|
||||
void Middle(void);
|
||||
void Start(void);
|
||||
|
||||
private:
|
||||
/*
|
||||
** Define a function to make adjustments for where special animations
|
||||
** are going to render.
|
||||
*/
|
||||
COORDINATE Adjust_Coord(COORDINATE coord);
|
||||
|
||||
/*
|
||||
** Delete this animation at the next opportunity. This is flagged when the
|
||||
** animation is to be prematurely ended as a result of some outside event.
|
||||
*/
|
||||
unsigned IsToDelete:1;
|
||||
|
||||
/*
|
||||
** If the animation has just been created, then don't do any animation
|
||||
** processing until it has been through the render loop at least once.
|
||||
*/
|
||||
unsigned IsBrandNew:1;
|
||||
|
||||
// Use alternate color when drawing?
|
||||
unsigned IsAlternate:1;
|
||||
|
||||
/*
|
||||
** If this animation is invisible, then this flag will be true. An invisible
|
||||
** animation is one that is created for the sole purpose of keeping all
|
||||
** machines syncronised. It will not be displayed.
|
||||
*/
|
||||
unsigned IsInvisible:1;
|
||||
|
||||
/*
|
||||
** This points to the type of animation object this is.
|
||||
*/
|
||||
AnimTypeClass const * const Class;
|
||||
|
||||
/*
|
||||
** Is this animation in a temporary suspended state? If so, then it won't
|
||||
** be rendered until this flag is false. The flag will be set to false
|
||||
** after the first countdown timer reaches 0.
|
||||
*/
|
||||
unsigned char Delay;
|
||||
|
||||
/*
|
||||
** If this is an animation that damages whatever it is attached to, then this
|
||||
** value holds the accumulation of fractional damage points. When the accumulated
|
||||
** fractions reach 256, then one damage point is applied to the attached object.
|
||||
*/
|
||||
unsigned char Accum;
|
||||
|
||||
/*
|
||||
** This contains the value of the Virtual Function Table Pointer
|
||||
*/
|
||||
static void * VTable;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
544
AUDIO.CPP
Normal file
544
AUDIO.CPP
Normal file
|
@ -0,0 +1,544 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\audio.cpv 2.17 16 Oct 1995 16:50:20 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : AUDIO.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : September 10, 1993 *
|
||||
* *
|
||||
* Last Update : May 4, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Is_Speaking -- Checks to see if the eva voice is still playing. *
|
||||
* Sound_Effect -- General purpose sound player. *
|
||||
* Sound_Effect -- Plays a sound effect in the tactical map. *
|
||||
* Speak -- Computer speaks to the player. *
|
||||
* Speak_AI -- Handles starting the EVA voices. *
|
||||
* Stop_Speaking -- Forces the EVA voice to stop talking. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** Controls what special effects may occur on the sound effect.
|
||||
*/
|
||||
typedef enum {
|
||||
IN_NOVAR, // No variation or alterations allowed.
|
||||
IN_JUV, // Juvenile sound effect alternate option.
|
||||
IN_VAR, // Infantry variance response modification.
|
||||
} ContextType;
|
||||
|
||||
static struct {
|
||||
char const *Name; // Digitized voice file name.
|
||||
int Priority; // Playback priority of this sample.
|
||||
ContextType Where; // In what game context does this sample exist.
|
||||
} SoundEffectName[VOC_COUNT] = {
|
||||
|
||||
/*
|
||||
** Special voices (typically associated with the commando).
|
||||
*/
|
||||
{"BOMBIT1", 20, IN_NOVAR}, // VOC_RAMBO_PRESENT "I've got a present for ya"
|
||||
{"CMON1", 20, IN_NOVAR}, // VOC_RAMBO_CMON "c'mon"
|
||||
{"GOTIT1", 20, IN_NOVAR}, // VOC_RAMBO_UGOTIT "you got it" *
|
||||
{"KEEPEM1", 20, IN_NOVAR}, // VOC_RAMBO_COMIN "keep 'em commin'"
|
||||
{"LAUGH1", 20, IN_NOVAR}, // VOC_RAMBO_LAUGH "hahaha"
|
||||
{"LEFTY1", 20, IN_NOVAR}, // VOC_RAMBO_LEFTY "that was left handed" *
|
||||
{"NOPRBLM1", 20, IN_NOVAR}, // VOC_RAMBO_NOPROB "no problem"
|
||||
// {"OHSH1", 20, IN_NOVAR}, // VOC_RAMBO_OHSH "oh shiiiiii...."
|
||||
{"ONIT1", 20, IN_NOVAR}, // VOC_RAMBO_ONIT "I'm on it"
|
||||
{"RAMYELL1", 20, IN_NOVAR}, // VOC_RAMBO_YELL "ahhhhhhh"
|
||||
{"ROKROLL1", 20, IN_NOVAR}, // VOC_RAMBO_ROCK "time to rock and roll"
|
||||
{"TUFFGUY1", 20, IN_NOVAR}, // VOC_RAMBO_TUFF "real tuff guy" *
|
||||
{"YEAH1", 20, IN_NOVAR}, // VOC_RAMBO_YEA "yea" *
|
||||
{"YES1", 20, IN_NOVAR}, // VOC_RAMBO_YES "yes" *
|
||||
{"YO1", 20, IN_NOVAR}, // VOC_RAMBO_YO "yo"
|
||||
|
||||
/*
|
||||
** Civilian voices (technicians too).
|
||||
*/
|
||||
{"GIRLOKAY", 20, IN_NOVAR}, // VOC_GIRL_OKAY
|
||||
{"GIRLYEAH", 20, IN_NOVAR}, // VOC_GIRL_YEAH
|
||||
{"GUYOKAY1", 20, IN_NOVAR}, // VOC_GUY_OKAY
|
||||
{"GUYYEAH1", 20, IN_NOVAR}, // VOC_GUY_YEAH
|
||||
|
||||
/*
|
||||
** Infantry and vehicle responses.
|
||||
*/
|
||||
{"2DANGR1", 10, IN_VAR}, // VOC_2DANGER "negative, too dangerous"
|
||||
{"ACKNO", 10, IN_VAR}, // VOC_ACKNOWL "acknowledged"
|
||||
{"AFFIRM1", 10, IN_VAR}, // VOC_AFFIRM "affirmative"
|
||||
{"AWAIT1", 10, IN_VAR}, // VOC_AWAIT1 "awaiting orders"
|
||||
// {"BACKUP", 10, IN_VAR}, // VOC_BACKUP "send backup"
|
||||
// {"HELP", 10, IN_VAR}, // VOC_HELP "send help"
|
||||
{"MOVOUT1", 10, IN_VAR}, // VOC_MOVEOUT "movin' out"
|
||||
{"NEGATV1", 10, IN_VAR}, // VOC_NEGATIVE "negative"
|
||||
{"NOPROB", 10, IN_VAR}, // VOC_NO_PROB "not a problem"
|
||||
{"READY", 10, IN_VAR}, // VOC_READY "ready and waiting"
|
||||
{"REPORT1", 10, IN_VAR}, // VOC_REPORT "reporting"
|
||||
{"RITWAWA", 10, IN_VAR}, // VOC_RIGHT_AWAY "right away sir"
|
||||
{"ROGER", 10, IN_VAR}, // VOC_ROGER "roger"
|
||||
// {"SIR1", 10, IN_VAR}, // VOC_SIR1 "sir?"
|
||||
// {"SQUAD1", 10, IN_VAR}, // VOC_SQUAD1 "squad reporting"
|
||||
// {"TARGET1", 10, IN_VAR}, // VOC_PRACTICE "target practice"
|
||||
{"UGOTIT", 10, IN_VAR}, // VOC_UGOTIT "you got it"
|
||||
{"UNIT1", 10, IN_VAR}, // VOC_UNIT1 "unit reporting"
|
||||
{"VEHIC1", 10, IN_VAR}, // VOC_VEHIC1 "vehicle reporting"
|
||||
{"YESSIR1", 10, IN_VAR}, // VOC_YESSIR "yes sir"
|
||||
|
||||
/*
|
||||
** Sound effects that have a juvenile counterpart.
|
||||
*/
|
||||
{"BAZOOK1", 1, IN_JUV}, // VOC_BAZOOKA Gunfire
|
||||
{"BLEEP2", 1, IN_JUV}, // VOC_BLEEP Clean metal bing
|
||||
{"BOMB1", 1, IN_JUV}, // VOC_BOMB1 Crunchy parachute bomb type explosion
|
||||
{"BUTTON", 1, IN_JUV}, // VOC_BUTTON Dungeon Master button click
|
||||
{"COMCNTR1", 10, IN_JUV}, // VOC_RADAR_ON Elecronic static with beeps
|
||||
{"CONSTRU2", 10, IN_JUV}, // VOC_CONSTRUCTION construction sounds
|
||||
{"CRUMBLE", 1, IN_JUV}, // VOC_CRUMBLE muffled crumble sound
|
||||
{"FLAMER2", 4, IN_JUV}, // VOC_FLAMER1 flame thrower
|
||||
{"GUN18", 4, IN_JUV}, // VOC_RIFLE rifle shot
|
||||
{"GUN19", 4, IN_JUV}, // VOC_M60 machine gun burst -- 6 rounds
|
||||
{"GUN20", 4, IN_JUV}, // VOC_GUN20 bat hitting heavy metal door
|
||||
{"GUN5", 4, IN_JUV}, // VOC_M60A medium machine gun burst
|
||||
{"GUN8", 4, IN_JUV}, // VOC_MINI mini gun burst
|
||||
{"GUNCLIP1", 1, IN_JUV}, // VOC_RELOAD gun clip reload
|
||||
{"HVYDOOR1", 5, IN_JUV}, // VOC_SLAM metal plates slamming together
|
||||
{"HVYGUN10", 1, IN_JUV}, // VOC_HVYGUN10 loud sharp cannon
|
||||
{"ION1", 1, IN_JUV}, // VOC_ION_CANNON partical beam
|
||||
{"MGUN11", 1, IN_JUV}, // VOC_MGUN11 alternate tripple burst
|
||||
{"MGUN2", 1, IN_JUV}, // VOC_MGUN2 M-16 tripple burst
|
||||
{"NUKEMISL", 1, IN_JUV}, // VOC_NUKE_FIRE long missile sound
|
||||
{"NUKEXPLO", 1, IN_JUV}, // VOC_NUKE_EXPLODE long but not loud explosion
|
||||
{"OBELRAY1", 1, IN_JUV}, // VOC_LASER humming star wars laser beam
|
||||
{"OBELPOWR", 1, IN_JUV}, // VOC_LASER_POWER warming-up sound of star wars laser beam
|
||||
{"POWRDN1", 1, IN_JUV}, // VOC_RADAR_OFF doom door slide
|
||||
{"RAMGUN2", 1, IN_JUV}, // VOC_SNIPER silenced rifle fire
|
||||
{"ROCKET1", 1, IN_JUV}, // VOC_ROCKET1 rocket launch variation #1
|
||||
{"ROCKET2", 1, IN_JUV}, // VOC_ROCKET2 rocket launch variation #2
|
||||
{"SAMMOTR2", 1, IN_JUV}, // VOC_MOTOR dentists drill
|
||||
{"SCOLD2", 1, IN_JUV}, // VOC_SCOLD cannot perform action feedback tone
|
||||
{"SIDBAR1C", 1, IN_JUV}, // VOC_SIDEBAR_OPEN xylophone clink
|
||||
{"SIDBAR2C", 1, IN_JUV}, // VOC_SIDEBAR_CLOSE xylophone clink
|
||||
{"SQUISH2", 1, IN_JUV}, // VOC_SQUISH2 crushing infantry
|
||||
{"TNKFIRE2", 1, IN_JUV}, // VOC_TANK1 sharp tank fire with recoil
|
||||
{"TNKFIRE3", 1, IN_JUV}, // VOC_TANK2 sharp tank fire
|
||||
{"TNKFIRE4", 1, IN_JUV}, // VOC_TANK3 sharp tank fire
|
||||
{"TNKFIRE6", 1, IN_JUV}, // VOC_TANK4 big gun tank fire
|
||||
{"TONE15", 0, IN_JUV}, // VOC_UP credits counting up
|
||||
{"TONE16", 0, IN_JUV}, // VOC_DOWN credits counting down
|
||||
{"TONE2", 1, IN_JUV}, // VOC_TARGET target sound
|
||||
{"TONE5", 10, IN_JUV}, // VOC_SONAR sonar echo
|
||||
{"TOSS", 1, IN_JUV}, // VOC_TOSS air swish
|
||||
{"TRANS1", 1, IN_JUV}, // VOC_CLOAK stealth tank
|
||||
{"TREEBRN1", 1, IN_JUV}, // VOC_BURN burning crackle
|
||||
{"TURRFIR5", 1, IN_JUV}, // VOC_TURRET muffled gunfire
|
||||
{"XPLOBIG4", 5, IN_JUV}, // VOC_XPLOBIG4 very long muffled explosion
|
||||
{"XPLOBIG6", 5, IN_JUV}, // VOC_XPLOBIG6 very long muffled explosion
|
||||
{"XPLOBIG7", 5, IN_JUV}, // VOC_XPLOBIG7 very long muffled explosion
|
||||
{"XPLODE", 1, IN_JUV}, // VOC_XPLODE long soft muffled explosion
|
||||
{"XPLOS", 4, IN_JUV}, // VOC_XPLOS short crunchy explosion
|
||||
{"XPLOSML2", 5, IN_JUV}, // VOC_XPLOSML2 muffled mechanical explosion
|
||||
|
||||
/*
|
||||
** Generic sound effects (no variations).
|
||||
*/
|
||||
{"NUYELL1", 10, IN_NOVAR}, // VOC_SCREAM1 short infantry scream
|
||||
{"NUYELL3", 10, IN_NOVAR}, // VOC_SCREAM3 short infantry scream
|
||||
{"NUYELL4", 10, IN_NOVAR}, // VOC_SCREAM4 short infantry scream
|
||||
{"NUYELL5", 10, IN_NOVAR}, // VOC_SCREAM5 short infantry scream
|
||||
{"NUYELL6", 10, IN_NOVAR}, // VOC_SCREAM6 short infantry scream
|
||||
{"NUYELL7", 10, IN_NOVAR}, // VOC_SCREAM7 short infantry scream
|
||||
{"NUYELL10", 10, IN_NOVAR}, // VOC_SCREAM10 short infantry scream
|
||||
{"NUYELL11", 10, IN_NOVAR}, // VOC_SCREAM11 short infantry scream
|
||||
{"NUYELL12", 10, IN_NOVAR}, // VOC_SCREAM12 short infantry scream
|
||||
{"YELL1", 1, IN_NOVAR}, // VOC_YELL1 long infantry scream
|
||||
|
||||
{"MYES1", 10, IN_NOVAR}, // VOC_YES "Yes?"
|
||||
{"MCOMND1", 10, IN_NOVAR}, // VOC_COMMANDER "Commander?"
|
||||
{"MHELLO1", 10, IN_NOVAR}, // VOC_HELLO "Hello?"
|
||||
{"MHMMM1", 10, IN_NOVAR}, // VOC_HMMM "Hmmm?"
|
||||
// {"MHASTE1", 10, IN_NOVAR}, // VOC_PROCEED1 "I will proceed, post haste."
|
||||
// {"MONCE1", 10, IN_NOVAR}, // VOC_PROCEED2 "I will proceed, at once."
|
||||
// {"MIMMD1", 10, IN_NOVAR}, // VOC_PROCEED3 "I will proceed, immediately."
|
||||
// {"MPLAN1", 10, IN_NOVAR}, // VOC_EXCELLENT1 "That is an excellent plan."
|
||||
// {"MPLAN2", 10, IN_NOVAR}, // VOC_EXCELLENT2 "Yes, that is an excellent plan."
|
||||
{"MPLAN3", 10, IN_NOVAR}, // VOC_EXCELLENT3 "A wonderful plan."
|
||||
// {"MACTION1", 10, IN_NOVAR}, // VOC_EXCELLENT4 "Astounding plan of action commander."
|
||||
// {"MREMARK1", 10, IN_NOVAR}, // VOC_EXCELLENT5 "Remarkable contrivance."
|
||||
{"MCOURSE1", 10, IN_NOVAR}, // VOC_OF_COURSE "Of course."
|
||||
{"MYESYES1", 10, IN_NOVAR}, // VOC_YESYES "Yes yes yes."
|
||||
{"MTIBER1", 10, IN_NOVAR}, // VOC_QUIP1 "Mind the Tiberium."
|
||||
// {"MMG1", 10, IN_NOVAR}, // VOC_QUIP2 "A most remarkable Metasequoia Glyptostroboides."
|
||||
{"MTHANKS1", 10, IN_NOVAR}, // VOC_THANKS "Thank you."
|
||||
|
||||
{"CASHTURN", 1, IN_NOVAR}, // VOC_CASHTURN Sound of money being piled up.
|
||||
{"BLEEP2", 10, IN_NOVAR}, // VOC_BLEEPY3 Clean computer bleep sound.
|
||||
{"DINOMOUT", 10, IN_NOVAR}, // VOC_DINOMOUT Movin' out in dino-speak.
|
||||
{"DINOYES", 10, IN_NOVAR}, // VOC_DINOYES Yes Sir in dino-speak.
|
||||
{"DINOATK1", 10, IN_NOVAR}, // VOC_DINOATK1 Dino attack sound.
|
||||
{"DINODIE1", 10, IN_NOVAR}, // VOC_DINODIE1 Dino die sound.
|
||||
};
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Sound_Effect -- Plays a sound effect in the tactical map. *
|
||||
* *
|
||||
* This routine is used when a sound effect occurs in the game world. It handles fading *
|
||||
* the sound according to distance. *
|
||||
* *
|
||||
* INPUT: voc -- The sound effect number to play. *
|
||||
* *
|
||||
* coord -- The world location that the sound originates from. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/12/1994 JLB : Created. *
|
||||
* 01/05/1995 JLB : Reduces sound more dramatically when off screen. *
|
||||
*=============================================================================================*/
|
||||
void Sound_Effect(VocType voc, COORDINATE coord, int variation)
|
||||
{
|
||||
unsigned distance;
|
||||
CELL cell_pos;
|
||||
int pan_value;
|
||||
|
||||
if (!Options.Volume || voc == VOC_NONE || !SoundOn || SampleType == SAMPLE_NONE) {
|
||||
return;
|
||||
}
|
||||
if (coord) {
|
||||
cell_pos = Coord_Cell(coord);
|
||||
}
|
||||
|
||||
distance = 0xFF;
|
||||
pan_value = 0;
|
||||
if (coord && !Map.In_View(cell_pos)) {
|
||||
distance = Map.Cell_Distance(cell_pos, Coord_Cell(Map.TacticalCoord));
|
||||
distance = (unsigned int)MIN((int)distance, (int)MAP_CELL_W);
|
||||
distance = Cardinal_To_Fixed(MAP_CELL_W, distance);
|
||||
distance = MIN(distance, 0xFFu);
|
||||
distance ^= 0xFF;
|
||||
|
||||
distance /= 2;
|
||||
distance = MAX(distance, 25);
|
||||
|
||||
pan_value = Cell_X(cell_pos);
|
||||
pan_value -= Coord_XCell(Map.TacticalCoord) + (Lepton_To_Cell(Map.TacLeptonWidth) >> 1);
|
||||
if (ABS(pan_value) > Lepton_To_Cell(Map.TacLeptonWidth >> 1)) {
|
||||
pan_value *= 0x8000;
|
||||
pan_value /= (MAP_CELL_W >> 2);
|
||||
pan_value = Bound(pan_value, -0x7FFF, 0x7FFF);
|
||||
// pan_value = MAX((int)pan_value, (int)-0x7FFF);
|
||||
// pan_value = MIN((int)pan_value, 0x7FFF);
|
||||
} else {
|
||||
pan_value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Sound_Effect(voc, (VolType)Fixed_To_Cardinal(distance, Options.Volume), variation, pan_value);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Sound_Effect -- General purpose sound player. *
|
||||
* *
|
||||
* This is used for general purpose sound effects. These are sounds that occur outside *
|
||||
* of the game world. They do not have a corresponding game world location as their source. *
|
||||
* *
|
||||
* INPUT: voc -- The sound effect number to play. *
|
||||
* *
|
||||
* volume -- The volume to assign to this sound effect. *
|
||||
* *
|
||||
* OUTPUT: Returns with the sound handle (-1 if no sound was played). *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/12/1994 JLB : Created. *
|
||||
* 11/12/1994 JLB : Handles cache logic. *
|
||||
* 05/04/1995 JLB : Variation adjustments. *
|
||||
*=============================================================================================*/
|
||||
int Sound_Effect(VocType voc, VolType volume, int variation, signed short pan_value)
|
||||
{
|
||||
char name[_MAX_FNAME+_MAX_EXT]; // Working filename of sound effect.
|
||||
|
||||
if (!Options.Volume || voc == VOC_NONE || !SoundOn || SampleType == SAMPLE_NONE) {
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
** Fetch a pointer to the sound effect data. Modify the sound as appropriate and desired.
|
||||
*/
|
||||
char const * ext = ".AUD";
|
||||
if (Special.IsJuvenile && SoundEffectName[voc].Where == IN_JUV) {
|
||||
ext = ".JUV";
|
||||
} else {
|
||||
if (SoundEffectName[voc].Where == IN_VAR) {
|
||||
|
||||
/*
|
||||
** For infantry, use a variation on the response. For vehicles, always
|
||||
** use the vehicle response table.
|
||||
*/
|
||||
if (variation < 0) {
|
||||
if (ABS(variation) % 2) {
|
||||
ext = ".V00";
|
||||
} else {
|
||||
ext = ".V02";
|
||||
}
|
||||
} else {
|
||||
if (variation % 2) {
|
||||
ext = ".V01";
|
||||
} else {
|
||||
ext = ".V03";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_makepath(name, NULL, NULL, SoundEffectName[voc].Name, ext);
|
||||
void const * ptr = MixFileClass::Retrieve(name);
|
||||
|
||||
/*
|
||||
** If the sound data pointer is not null, then presume that it is valid.
|
||||
*/
|
||||
if (ptr) {
|
||||
return(Play_Sample(ptr, Fixed_To_Cardinal(SoundEffectName[voc].Priority, (int)volume), (int)volume, pan_value));
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** This elaborates all the EVA speech voices.
|
||||
*/
|
||||
char const * Speech[VOX_COUNT] = {
|
||||
"ACCOM1", // mission accomplished
|
||||
"FAIL1", // your mission has failed
|
||||
"BLDG1", // unable to comply, building in progress
|
||||
"CONSTRU1", // construction complete
|
||||
"UNITREDY", // unit ready
|
||||
"NEWOPT1", // new construction options
|
||||
"DEPLOY1", // cannot deploy here
|
||||
"GDIDEAD1", // GDI unit destroyed
|
||||
"NODDEAD1", // Nod unit destroyed
|
||||
"CIVDEAD1", // civilian killed
|
||||
// "EVAYES1", // affirmative
|
||||
// "EVANO1", // negative
|
||||
// "UPUNIT1", // upgrade complete, new unit available
|
||||
// "UPSTRUC1", // upgrade complete, new structure available
|
||||
"NOCASH1", // insufficient funds
|
||||
"BATLCON1", // battle control terminated
|
||||
"REINFOR1", // reinforcements have arrived
|
||||
"CANCEL1", // canceled
|
||||
"BLDGING1", // building
|
||||
"LOPOWER1", // low power
|
||||
"NOPOWER1", // insufficient power
|
||||
"MOCASH1", // need more funds
|
||||
"BASEATK1", // our base is under attack
|
||||
"INCOME1", // incoming missile
|
||||
"ENEMYA", // enemy planes approaching
|
||||
"NUKE1", // nuclear warhead approaching
|
||||
// "RADOK1", // radiation levels are acceptable
|
||||
// "RADFATL1", // radiation levels are fatal
|
||||
"NOBUILD1", // unable to build more
|
||||
"PRIBLDG1", // primary building selected
|
||||
// "REPDONE1", // repairs completed
|
||||
"NODCAPT1", // Nod building captured
|
||||
"GDICAPT1", // GDI building captured
|
||||
// "SOLD1", // structure sold
|
||||
"IONCHRG1", // ion cannon charging
|
||||
"IONREDY1", // ion cannon ready
|
||||
"NUKAVAIL", // nuclear weapon available
|
||||
"NUKLNCH1", // nuclear weapon launched
|
||||
"UNITLOST", // unit lost
|
||||
"STRCLOST", // structure lost
|
||||
"NEEDHARV", // need harvester
|
||||
"SELECT1", // select target
|
||||
"AIRREDY1", // airstrike ready
|
||||
"NOREDY1", // not ready
|
||||
"TRANSSEE", // Nod transport sighted
|
||||
"TRANLOAD", // Nod transport loaded
|
||||
"ENMYAPP1", // enemy approaching
|
||||
"SILOS1", // silos needed
|
||||
"ONHOLD1", // on hold
|
||||
"REPAIR1", // repairing
|
||||
"ESTRUCX", // enemy structure destroyed
|
||||
"GSTRUC1", // GDI structure destroyed
|
||||
"NSTRUC1", // NOD structure destroyed
|
||||
"ENMYUNIT", // Enemy unit destroyed
|
||||
// "GUKILL1", // gold unit destroyed
|
||||
// "GSTRUD1", // gold structure destroyed
|
||||
// "GONLINE1", // gold player online
|
||||
// "GLEFT1", // gold player has departed
|
||||
// "GOLDKILT", // gold player destroyed
|
||||
// "GOLDWIN", // gold player is victorious
|
||||
// "RUKILL1", // red unit destroyed
|
||||
// "RSTRUD1", // red structure destroyed
|
||||
// "RONLINE1", // red player online
|
||||
// "RLEFT1", // red player has departed
|
||||
// "REDKILT", // red player destroyed
|
||||
// "REDWIN", // red player is victorious
|
||||
// "GYUKILL1", // grey unit destroyed
|
||||
// "GYSTRUD1", // grey structure destroyed
|
||||
// "GYONLINE", // grey player online
|
||||
// "GYLEFT1", // grey player has departed
|
||||
// "GREYKILT", // grey player destroyed
|
||||
// "GREYWIN", // grey player is victorious
|
||||
// "OUKILL1", // orange unit destroyed
|
||||
// "OSTRUD1", // orange structure destroyed
|
||||
// "OONLINE1", // orange player online
|
||||
// "OLEFT1", // orange player has departed
|
||||
// "ORANKILT", // orange player destroyed
|
||||
// "ORANWIN", // orange player is victorious
|
||||
// "GNUKILL1", // green unit destroyed
|
||||
// "GNSTRUD1", // green structure destroyed
|
||||
// "GNONLINE", // green player online
|
||||
// "GNLEFT1", // green player has departed
|
||||
// "GRENKILT", // green player destroyed
|
||||
// "GRENWIN", // green player is victorious
|
||||
// "BUKILL1", // blue unit destroyed
|
||||
// "BSTRUD1", // blue structure destroyed
|
||||
// "BONLINE1", // blue player online
|
||||
// "BLEFT1", // blue player has departed
|
||||
// "BLUEKILT", // blue player destroyed
|
||||
// "BLUEWIN" // blue player is victorious
|
||||
};
|
||||
static VoxType CurrentVoice = VOX_NONE;
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Speak -- Computer speaks to the player. *
|
||||
* *
|
||||
* This routine is used to have the game computer (EVA) speak to the player. *
|
||||
* *
|
||||
* INPUT: voice -- The voice number to speak (see defines.h). *
|
||||
* *
|
||||
* OUTPUT: Returns with the handle of the playing speech (-1 if no voice started). *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/12/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void Speak(VoxType voice)
|
||||
{
|
||||
if (Options.Volume && SampleType != 0 && voice != VOX_NONE && voice != SpeakQueue && voice != CurrentVoice && SpeakQueue == VOX_NONE) {
|
||||
SpeakQueue = voice;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Speak_AI -- Handles starting the EVA voices. *
|
||||
* *
|
||||
* This starts the EVA voice talking as well. If there is any speech request in the queue, *
|
||||
* it will be started when the current voice is finished. Call this routine as often as *
|
||||
* possible (once per game tick is sufficient). *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void Speak_AI(void)
|
||||
{
|
||||
static VoxType _last = VOX_NONE;
|
||||
if (SampleType == 0) return;
|
||||
|
||||
if (!Is_Sample_Playing(SpeechBuffer)) {
|
||||
CurrentVoice = VOX_NONE;
|
||||
if (SpeakQueue != VOX_NONE) {
|
||||
if (SpeakQueue != _last) {
|
||||
char name[_MAX_FNAME+_MAX_EXT];
|
||||
|
||||
_makepath(name, NULL, NULL, Speech[SpeakQueue], ".AUD");
|
||||
if (CCFileClass(name).Read(SpeechBuffer, SPEECH_BUFFER_SIZE)) {
|
||||
Play_Sample(SpeechBuffer, 254, Options.Volume);
|
||||
}
|
||||
_last = SpeakQueue;
|
||||
} else {
|
||||
Play_Sample(SpeechBuffer, 254, Options.Volume);
|
||||
}
|
||||
SpeakQueue = VOX_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Stop_Speaking -- Forces the EVA voice to stop talking. *
|
||||
* *
|
||||
* Use this routine to immediately stop the EVA voice from speaking. It also clears out *
|
||||
* the pending voice queue. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void Stop_Speaking(void)
|
||||
{
|
||||
SpeakQueue = VOX_NONE;
|
||||
if (SampleType != 0) {
|
||||
Stop_Sample_Playing(SpeechBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Is_Speaking -- Checks to see if the eva voice is still playing. *
|
||||
* *
|
||||
* Call this routine when the EVA voice being played needs to be checked. A typical use *
|
||||
* of this would be when some action needs to be delayed until the voice has finished -- *
|
||||
* say the end of the game. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Is the EVA voice still playing? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/12/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool Is_Speaking(void)
|
||||
{
|
||||
Speak_AI();
|
||||
if (SampleType != 0 && (SpeakQueue != VOX_NONE || Is_Sample_Playing(SpeechBuffer))) {
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
99
AUDIO.H
Normal file
99
AUDIO.H
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\audio.h_v 2.18 16 Oct 1995 16:45:34 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : AUDIO.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : June 21, 1994 *
|
||||
* *
|
||||
* Last Update : June 21, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef AUDIO_H
|
||||
#define AUDIO_H
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
class AudioClass {
|
||||
char const * Name; // Name of audio asset.
|
||||
void const * Data; // Loaded audio data.
|
||||
int Handle; // Handle of asset (as it is playing).
|
||||
MemoryClass *Mem; // Pointer to memory handler class.
|
||||
unsigned IsMIDI:1; // Is this a midi file?
|
||||
|
||||
public:
|
||||
AudioClass(void);
|
||||
AudioClass(char const *name, MemoryClass &mem);
|
||||
virtual ~AudioClass(void);
|
||||
|
||||
bool Load(char const *name = 0);
|
||||
bool Free(void);
|
||||
bool Play(int volume = 0xFF);
|
||||
bool Stop(void);
|
||||
bool Pause(void);
|
||||
bool Resume(void);
|
||||
bool Set_Name(char const *name);
|
||||
bool Is_Playing(void) const;
|
||||
bool Is_Loaded(void) const;
|
||||
bool Is_MIDI(void) const;
|
||||
};
|
||||
|
||||
inline AudioClass::AudioClass(void)
|
||||
{
|
||||
Name = 0;
|
||||
Data = 0;
|
||||
Mem = 0;
|
||||
Handle = -1;
|
||||
};
|
||||
|
||||
inline AudioClass::AudioClass(char const *name, MemoryClass &mem)
|
||||
{
|
||||
if (mem) {
|
||||
Mem = &mem;
|
||||
} else {
|
||||
Mem = &::Mem; // Uses global default memory handler.
|
||||
}
|
||||
Name = strdup(name);
|
||||
Data = 0;
|
||||
Handle = -1;
|
||||
};
|
||||
|
||||
inline AudioClass::~AudioClass(void)
|
||||
{
|
||||
if (GameActive) {
|
||||
if (Name) free(Name);
|
||||
if (Data) Mem->Free(Data);
|
||||
Name = 0;
|
||||
Data = 0;
|
||||
Handle = -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif
|
524
BASE.CPP
Normal file
524
BASE.CPP
Normal file
|
@ -0,0 +1,524 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\base.cpv 1.9 16 Oct 1995 16:48:56 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : BASE.CPP *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : 03/27/95 *
|
||||
* *
|
||||
* Last Update : March 27, 1995 *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* BaseClass::Get_Building -- Returns ptr to the built building for the given node *
|
||||
* BaseClass::Get_Node -- Returns ptr to the node corresponding to given object *
|
||||
* BaseClass::Is_Built -- Tells if given item in the list has been built yet *
|
||||
* BaseClass::Is_Node -- Tells if the given building is part of our base list *
|
||||
* BaseClass::Load -- loads from a saved game file *
|
||||
* BaseClass::Next_Buildable -- returns ptr to the next node that needs to be built *
|
||||
* BaseClass::Read_INI -- INI reading routine *
|
||||
* BaseClass::Save -- saves to a saved game file *
|
||||
* BaseClass::Write_INI -- INI writing routine *
|
||||
* BaseNodeClass::operator != -- inequality operator *
|
||||
* BaseNodeClass::operator == -- equality operator *
|
||||
* BaseNodeClass::operator > -- greater-than operator *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseNodeClass::operator == -- equality operator *
|
||||
* *
|
||||
* INPUT: *
|
||||
* node node to test against *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = equal, false = not equal *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
int BaseNodeClass::operator == (BaseNodeClass const & node)
|
||||
{
|
||||
return(Type == node.Type && Coord == node.Coord);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseNodeClass::operator != -- inequality operator *
|
||||
* *
|
||||
* INPUT: *
|
||||
* node node to test against *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* comparison result *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
int BaseNodeClass::operator !=(BaseNodeClass const & node)
|
||||
{
|
||||
return(Type != node.Type || Coord != node.Coord);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseNodeClass::operator > -- greater-than operator *
|
||||
* *
|
||||
* INPUT: *
|
||||
* node node to test against *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* comparison result *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
int BaseNodeClass::operator > (BaseNodeClass const & )
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Read_INI -- INI reading routine *
|
||||
* *
|
||||
* INI entry format: *
|
||||
* BLDG=COORD *
|
||||
* BLDG=COORD *
|
||||
* ... *
|
||||
* *
|
||||
* INPUT: *
|
||||
* buffer pointer to loaded INI file *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* This routines assumes there is only one base defined for the scenario. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
void BaseClass::Read_INI(char *buffer)
|
||||
{
|
||||
char buf[128];
|
||||
char uname[10];
|
||||
BaseNodeClass node; // node to add to list
|
||||
|
||||
/*
|
||||
** First, determine the house of the human player, and set the Base's house
|
||||
** accordingly.
|
||||
*/
|
||||
WWGetPrivateProfileString("BASIC", "Player", "GoodGuy", buf, 20, buffer);
|
||||
if (HouseTypeClass::From_Name(buf) == HOUSE_GOOD) {
|
||||
House = HOUSE_BAD;
|
||||
} else {
|
||||
House = HOUSE_GOOD;
|
||||
}
|
||||
|
||||
/*
|
||||
** Read the number of buildings that will go into the base node list
|
||||
*/
|
||||
int count = WWGetPrivateProfileInt (INI_Name(),"Count",0,buffer);
|
||||
|
||||
/*
|
||||
** Read each entry in turn, in the same order they were written out.
|
||||
*/
|
||||
for (int i = 0; i < count; i++) {
|
||||
|
||||
/*
|
||||
** Get an INI entry
|
||||
*/
|
||||
sprintf(uname,"%03d",i);
|
||||
WWGetPrivateProfileString(INI_Name(), uname, NULL, buf, sizeof(buf)-1, buffer);
|
||||
|
||||
/*
|
||||
** Set the node's building type
|
||||
*/
|
||||
node.Type = BuildingTypeClass::From_Name(strtok(buf,","));
|
||||
|
||||
/*
|
||||
** Read & set the node's coordinate
|
||||
*/
|
||||
node.Coord = atol(strtok(NULL,","));
|
||||
|
||||
/*
|
||||
** Add this node to the Base's list
|
||||
*/
|
||||
Nodes.Add(node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Write_INI -- INI writing routine *
|
||||
* *
|
||||
* INI entry format: *
|
||||
* BLDG=COORD *
|
||||
* BLDG=COORD *
|
||||
* ... *
|
||||
* *
|
||||
* INPUT: *
|
||||
* buffer pointer to loaded INI file staging area *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* This routines assumes there is only one base defined for the scenario. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
void BaseClass::Write_INI(char *buffer)
|
||||
{
|
||||
char buf[128];
|
||||
char uname[10];
|
||||
|
||||
/*
|
||||
** Clear out all existing teamtype data from the INI file.
|
||||
*/
|
||||
WWWritePrivateProfileString(INI_Name(), NULL, NULL, buffer);
|
||||
|
||||
/*
|
||||
** Save the # of buildings in the Nodes list. This is essential because
|
||||
** they must be read in the same order they were created, so "000" must be
|
||||
** read first, etc.
|
||||
*/
|
||||
WWWritePrivateProfileInt (INI_Name(),"Count",Nodes.Count(),buffer);
|
||||
|
||||
/*
|
||||
** Write each entry into the INI
|
||||
*/
|
||||
for (int i = 0; i < Nodes.Count(); i++) {
|
||||
sprintf(uname,"%03d",i);
|
||||
sprintf(buf,"%s,%d",
|
||||
BuildingTypeClass::As_Reference(Nodes[i].Type).IniName,
|
||||
Nodes[i].Coord);
|
||||
|
||||
WWWritePrivateProfileString(INI_Name(), uname, buf, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Load -- loads from a saved game file *
|
||||
* *
|
||||
* INPUT: *
|
||||
* file open file *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = success, false = failure *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
bool BaseClass::Load(FileClass &file)
|
||||
{
|
||||
int num_struct;
|
||||
int i;
|
||||
BaseNodeClass node;
|
||||
|
||||
/*
|
||||
** Read in & check the size of this class
|
||||
*/
|
||||
if (file.Read(&i, sizeof(i)) != sizeof(i)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
if (i != sizeof(*this)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
/*
|
||||
** Read in the House & the number of structures in the base
|
||||
*/
|
||||
if (file.Read(&House,sizeof(House)) != sizeof(House)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
if (file.Read(&num_struct,sizeof(num_struct)) != sizeof(num_struct)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
/*
|
||||
** Read each node entry & add it to the list
|
||||
*/
|
||||
for (i = 0; i < num_struct; i++) {
|
||||
if (file.Read(&node,sizeof(node)) != sizeof(node)) {
|
||||
return(false);
|
||||
}
|
||||
Nodes.Add(node);
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Save -- saves to a saved game file *
|
||||
* *
|
||||
* INPUT: *
|
||||
* file open file *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = success, false = failure *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
bool BaseClass::Save(FileClass &file)
|
||||
{
|
||||
int num_struct;
|
||||
int i;
|
||||
BaseNodeClass node;
|
||||
|
||||
/*
|
||||
** Write the size of this class
|
||||
*/
|
||||
i = sizeof(*this);
|
||||
if (file.Write(&i,sizeof(i)) != sizeof(i)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
/*
|
||||
** Write the House & the number of structures in the base
|
||||
*/
|
||||
if (file.Write(&House,sizeof(House)) != sizeof(House)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
num_struct = Nodes.Count();
|
||||
if (file.Write(&num_struct,sizeof(num_struct)) != sizeof(num_struct)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
/*
|
||||
** Write each node entry
|
||||
*/
|
||||
for (i = 0; i < num_struct; i++) {
|
||||
node = Nodes[i];
|
||||
if (file.Write(&node,sizeof(node)) != sizeof(node)) {
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Is_Built -- Tells if given item in the list has been built yet *
|
||||
* *
|
||||
* INPUT: *
|
||||
* index index into base list *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = yes, false = no *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
bool BaseClass::Is_Built(int index)
|
||||
{
|
||||
if (Get_Building(index) != NULL) {
|
||||
return(true);
|
||||
} else {
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Get_Building -- Returns ptr to the built building for the given node *
|
||||
* *
|
||||
* INPUT: *
|
||||
* obj pointer to building to test *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* ptr to already-built building, NULL if none *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
BuildingClass * BaseClass::Get_Building(int index)
|
||||
{
|
||||
BuildingClass *bldg;
|
||||
ObjectClass *obj[4];
|
||||
|
||||
/*
|
||||
** Check the location on the map where this building should be; if it's
|
||||
** there, return a pointer to it.
|
||||
*/
|
||||
CELL cell = Coord_Cell(Nodes[index].Coord);
|
||||
|
||||
obj[0] = Map[cell].Cell_Building();
|
||||
obj[1] = Map[cell].Overlapper[0];
|
||||
obj[2] = Map[cell].Overlapper[1];
|
||||
obj[3] = Map[cell].Overlapper[2];
|
||||
|
||||
bldg = NULL;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (obj[i] &&
|
||||
obj[i]->Coord == Nodes[index].Coord &&
|
||||
obj[i]->What_Am_I() == RTTI_BUILDING &&
|
||||
((BuildingClass *)obj[i])->Class->Type == Nodes[index].Type) {
|
||||
|
||||
bldg = (BuildingClass *)obj[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return(bldg);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Is_Node -- Tells if the given building is part of our base list *
|
||||
* *
|
||||
* INPUT: *
|
||||
* obj pointer to building to test *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = building is a node in the list, false = isn't *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
bool BaseClass::Is_Node(BuildingClass *obj)
|
||||
{
|
||||
if (Get_Node(obj) != NULL) {
|
||||
return(true);
|
||||
} else {
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Get_Node -- Returns ptr to the node corresponding to given object *
|
||||
* *
|
||||
* INPUT: *
|
||||
* obj pointer to building to test *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* ptr to node *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
BaseNodeClass * BaseClass::Get_Node(BuildingClass *obj)
|
||||
{
|
||||
for (int i = 0; i < Nodes.Count(); i++) {
|
||||
if (obj->Class->Type == Nodes[i].Type && obj->Coord == Nodes[i].Coord) {
|
||||
return(&Nodes[i]);
|
||||
}
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BaseClass::Next_Buildable -- returns ptr to the next node that needs to be built *
|
||||
* *
|
||||
* If 'type' is not NONE, returns ptr to the next "hole" in the list of the given type. *
|
||||
* Otherwise, returns ptr to the next hole in the list of any type. *
|
||||
* *
|
||||
* INPUT: *
|
||||
* type type of building to check for *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* ptr to a BaseNodeClass, NULL if none *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/24/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
BaseNodeClass * BaseClass::Next_Buildable(StructType type)
|
||||
{
|
||||
/*
|
||||
** Loop through all node entries, returning a pointer to the first
|
||||
** un-built one that matches the requested type.
|
||||
*/
|
||||
for (int i = 0; i < Nodes.Count(); i++) {
|
||||
|
||||
/*
|
||||
** For STRUCT_NONE, return the first hole found
|
||||
*/
|
||||
if (type == STRUCT_NONE) {
|
||||
if (!Is_Built(i)) {
|
||||
return(&Nodes[i]);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/*
|
||||
** For a "real" building type, return the first hold for that type
|
||||
*/
|
||||
if (Nodes[i].Type==type && !Is_Built(i)) {
|
||||
return(&Nodes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If no entry could be found, then create a fake one that will allow
|
||||
// placement of the building. Make it static and reuse the next time this
|
||||
// routine is called.
|
||||
|
||||
return(NULL);
|
||||
}
|
127
BASE.H
Normal file
127
BASE.H
Normal file
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\base.h_v 1.12 16 Oct 1995 16:46:38 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : BASE.H *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : 03/27/95 *
|
||||
* *
|
||||
* Last Update : March 27, 1995 *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef BASE_H
|
||||
#define BASE_H
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
** This class defines one "node" in the pre-built base list. Each node
|
||||
** contains a type of building to build, and the COORD to build it at.
|
||||
*/
|
||||
class BaseNodeClass
|
||||
{
|
||||
public:
|
||||
BaseNodeClass(void) {};
|
||||
int operator == (BaseNodeClass const & node);
|
||||
int operator != (BaseNodeClass const & node);
|
||||
int operator > (BaseNodeClass const & node);
|
||||
|
||||
StructType Type;
|
||||
COORDINATE Coord;
|
||||
};
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
** This is the class that defines a pre-built base for the computer AI.
|
||||
** (Despite its name, this is NOT the "base" class for C&C's class hierarchy!)
|
||||
*/
|
||||
class BaseClass
|
||||
{
|
||||
public:
|
||||
|
||||
/**********************************************************************
|
||||
** Constructor/Destructor
|
||||
*/
|
||||
BaseClass(void) {};
|
||||
virtual ~BaseClass() {Nodes.Clear();}
|
||||
|
||||
/**********************************************************************
|
||||
** Initialization
|
||||
*/
|
||||
void Init(void) {Nodes.Clear();}
|
||||
|
||||
/**********************************************************************
|
||||
** The standard suite of load/save support routines
|
||||
*/
|
||||
void Read_INI(char *buffer);
|
||||
void Write_INI(char *buffer);
|
||||
static char *INI_Name(void) {return "Base";}
|
||||
bool Load(FileClass & file);
|
||||
bool Save(FileClass & file);
|
||||
virtual void Code_Pointers(void) {};
|
||||
virtual void Decode_Pointers(void) {};
|
||||
|
||||
/**********************************************************************
|
||||
** Tells if the given node has been built or not
|
||||
*/
|
||||
bool Is_Built(int index);
|
||||
|
||||
/**********************************************************************
|
||||
** Returns a pointer to the object for the given node
|
||||
*/
|
||||
BuildingClass * Get_Building(int index);
|
||||
|
||||
/**********************************************************************
|
||||
** Tells if the given building ptr is a node in this base's list.
|
||||
*/
|
||||
bool Is_Node (BuildingClass *obj);
|
||||
|
||||
/**********************************************************************
|
||||
** Returns a pointer to the requested node.
|
||||
*/
|
||||
BaseNodeClass * Get_Node(BuildingClass *obj);
|
||||
BaseNodeClass * Get_Node(int index) { return (&Nodes[index]); }
|
||||
|
||||
/**********************************************************************
|
||||
** Returns a pointer to the next "hole" in the Nodes list.
|
||||
*/
|
||||
BaseNodeClass * Next_Buildable(StructType type = STRUCT_NONE);
|
||||
|
||||
/**********************************************************************
|
||||
** This is the list of "nodes" that define the base. Portions of this
|
||||
** list can be pre-built by simply saving those buildings in the INI
|
||||
** along with non-base buildings, so Is_Built will return true for them.
|
||||
*/
|
||||
DynamicVectorClass<BaseNodeClass> Nodes;
|
||||
|
||||
/**********************************************************************
|
||||
** This is the house this base belongs to.
|
||||
*/
|
||||
HousesType House;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
608
BBDATA.CPP
Normal file
608
BBDATA.CPP
Normal file
|
@ -0,0 +1,608 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\bbdata.cpv 2.17 16 Oct 1995 16:49:46 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : BBDATA.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : May 23, 1994 *
|
||||
* *
|
||||
* Last Update : October 17, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* BulletTypeClass::BulletTypeClass -- Constructor for bullet type objects. *
|
||||
* BulletTypeClass::Load_Shapes -- Load shape data for bullet types. *
|
||||
* BulletTypeClass::One_Time -- Performs the one time processing for bullets. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
/***************************************************************************
|
||||
** Detailed information about each class of bullet (projectile) in the game.
|
||||
*/
|
||||
static BulletTypeClass const ClassSniper(
|
||||
BULLET_BULLET,
|
||||
"50cal", // NAME: Text name of this unit type.
|
||||
false, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_LIGHT_SPEED, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HOLLOW_POINT, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_PIFF // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassBullet(
|
||||
BULLET_BULLET,
|
||||
"50cal", // NAME: Text name of this unit type.
|
||||
false, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_LIGHT_SPEED, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_SA, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_PIFF // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassSpreadfire(
|
||||
BULLET_SPREADFIRE,
|
||||
"50cal", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_LIGHT_SPEED, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_PIFFPIFF // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassAPDS(
|
||||
BULLET_APDS,
|
||||
"120mm", // NAME: Text name of this unit type.
|
||||
false, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_VERY_FAST, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_AP, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_VEH_HIT3 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const Class120mm(
|
||||
BULLET_HE,
|
||||
"120mm", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
true, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
true, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_MEDIUM_FAST, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_ART_EXP1 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassMissile(
|
||||
BULLET_SSM,
|
||||
"DRAGON", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
true, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
true, // Will it blow up even if it gets just NEAR to target?
|
||||
true, // Does it have flickering flame animation?
|
||||
true, // Can it run out of fuel?
|
||||
false, // Is there no visual difference between projectile facings?
|
||||
true, // Is projectile inherently inaccurate?
|
||||
true, // Translucent colors are used?
|
||||
true, // Good against aircraft?
|
||||
7, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_ROCKET, // SPEED: Miles per hour.
|
||||
5, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_FRAG1 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassMissile2(
|
||||
BULLET_SSM2,
|
||||
"DRAGON", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
true, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
true, // Will it blow up even if it gets just NEAR to target?
|
||||
true, // Does it have flickering flame animation?
|
||||
true, // Can it run out of fuel?
|
||||
false, // Is there no visual difference between projectile facings?
|
||||
true, // Is projectile inherently inaccurate?
|
||||
true, // Translucent colors are used?
|
||||
true, // Good against aircraft?
|
||||
9, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_ROCKET, // SPEED: Miles per hour.
|
||||
7, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_FRAG1 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassPatriot(
|
||||
BULLET_SAM,
|
||||
"MISSILE", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
true, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
true, // Will it blow up even if it gets just NEAR to target?
|
||||
true, // Does it have flickering flame animation?
|
||||
true, // Can it run out of fuel?
|
||||
false, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
true, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_VERY_FAST, // SPEED: Miles per hour.
|
||||
10, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_AP, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_VEH_HIT1 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassDragon(
|
||||
BULLET_TOW,
|
||||
"DRAGON", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
true, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
true, // Will it blow up even if it gets just NEAR to target?
|
||||
true, // Does it have flickering flame animation?
|
||||
true, // Can it run out of fuel?
|
||||
false, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
true, // Translucent colors are used?
|
||||
true, // Good against aircraft?
|
||||
3, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_ROCKET, // SPEED: Miles per hour.
|
||||
5, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_AP, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_VEH_HIT2 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassFlame(
|
||||
BULLET_FLAME,
|
||||
"FLAME", // NAME: Text name of this unit type.
|
||||
false, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
true, // Can it run out of fuel?
|
||||
false, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
12, // ARMING: Time to arm projectile after launch.
|
||||
12, // RANGE: Inherent override range factor.
|
||||
MPH_FAST, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_FIRE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_NONE // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassChem(
|
||||
BULLET_CHEMSPRAY,
|
||||
"FLAME", // NAME: Text name of this unit type.
|
||||
false, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
true, // Can it run out of fuel?
|
||||
false, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
12, // ARMING: Time to arm projectile after launch.
|
||||
12, // RANGE: Inherent override range factor.
|
||||
MPH_FAST, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_NONE // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassNapalm(
|
||||
BULLET_NAPALM,
|
||||
"BOMBLET", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
true, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
true, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
24, // ARMING: Time to arm projectile after launch.
|
||||
24, // RANGE: Inherent override range factor.
|
||||
MPH_MEDIUM_SLOW, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_FIRE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_NAPALM2 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassGrenade(
|
||||
BULLET_GRENADE,
|
||||
"BOMB", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
true, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
true, // Is projectile inherently inaccurate?
|
||||
true, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_MEDIUM_SLOW, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_VEH_HIT2 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassLaser(
|
||||
BULLET_LASER,
|
||||
"Laser", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_LIGHT_SPEED, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_LASER, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_NONE // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassNukeUp(
|
||||
BULLET_NUKE_UP,
|
||||
"ATOMICUP", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
true, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_VERY_FAST, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_FRAG1 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassNukeDown(
|
||||
BULLET_NUKE_DOWN,
|
||||
"ATOMICDN", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
true, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_VERY_FAST, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_ATOM_BLAST // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassHonestJohn(
|
||||
BULLET_HONEST_JOHN,
|
||||
"MISSILE", // NAME: Text name of this unit type.
|
||||
true, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
false, // Is this projectile invisible?
|
||||
true, // Will it blow up even if it gets just NEAR to target?
|
||||
true, // Does it have flickering flame animation?
|
||||
true, // Can it run out of fuel?
|
||||
false, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
10, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_FAST, // SPEED: Miles per hour.
|
||||
10, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_FIRE, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_NAPALM3 // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassHeadButt(
|
||||
BULLET_HEADBUTT,
|
||||
"GORE", // NAME: Text name of this unit type.
|
||||
false, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_LIGHT_SPEED, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_HEADBUTT, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_NONE // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
static BulletTypeClass const ClassTRexBite(
|
||||
BULLET_TREXBITE,
|
||||
"CHEW", // NAME: Text name of this unit type.
|
||||
false, // Flies over tall walls?
|
||||
false, // Homes in on target?
|
||||
false, // Projectile arcs to the target?
|
||||
false, // Is this a dropping bomb-like object?
|
||||
true, // Is this projectile invisible?
|
||||
false, // Will it blow up even if it gets just NEAR to target?
|
||||
false, // Does it have flickering flame animation?
|
||||
false, // Can it run out of fuel?
|
||||
true, // Is there no visual difference between projectile facings?
|
||||
false, // Is projectile inherently inaccurate?
|
||||
false, // Translucent colors are used?
|
||||
false, // Good against aircraft?
|
||||
0, // ARMING: Time to arm projectile after launch.
|
||||
0, // RANGE: Inherent override range factor.
|
||||
MPH_LIGHT_SPEED, // SPEED: Miles per hour.
|
||||
0, // ROT: Rate of turn (degrees per tick).
|
||||
WARHEAD_FEEDME, // WARHEAD: If fires weapon, warhead type
|
||||
ANIM_NONE // Explosion to use upon impact.
|
||||
);
|
||||
|
||||
|
||||
/*
|
||||
** This is the array of pointers to the static data associated with
|
||||
** each bullet (projectile) type.
|
||||
*/
|
||||
BulletTypeClass const * const BulletTypeClass::Pointers[BULLET_COUNT] = {
|
||||
&ClassSniper, // BULLET_SNIPER
|
||||
&ClassBullet, // BULLET_BULLET
|
||||
&ClassAPDS, // BULLET_APDS
|
||||
&Class120mm, // BULLET_HE
|
||||
&ClassMissile, // BULLET_SSM
|
||||
&ClassMissile2, // BULLET_SSM2
|
||||
&ClassPatriot, // BULLET_SAM
|
||||
&ClassDragon, // BULLET_TOW
|
||||
&ClassFlame, // BULLET_FLAME
|
||||
&ClassChem, // BULLET_CHEMSPRAY
|
||||
&ClassNapalm, // BULLET_NAPALM
|
||||
&ClassGrenade, // BULLET_GRENADE
|
||||
&ClassLaser, // BULLET_LASER
|
||||
&ClassNukeUp, // BULLET_NUKE_UP
|
||||
&ClassNukeDown, // BULLET_NUKE_DOWN
|
||||
&ClassHonestJohn, // BULLET_HONEST_JOHN
|
||||
&ClassSpreadfire, // BULLET_SPREADFIRE
|
||||
&ClassHeadButt, // BULLET_HEADBUTT
|
||||
&ClassTRexBite, // BULLET_TREXBITE
|
||||
};
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletTypeClass::BulletTypeClass -- Constructor for bullet type objects. *
|
||||
* *
|
||||
* This is basically a constructor for static type objects used by bullets. All bullets *
|
||||
* are of a type constructed by this routine at game initialization time. *
|
||||
* *
|
||||
* INPUT: see below... *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/17/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
BulletTypeClass::BulletTypeClass(
|
||||
BulletType type,
|
||||
char const *ininame,
|
||||
bool is_high,
|
||||
bool is_homing,
|
||||
bool is_arcing,
|
||||
bool is_dropping,
|
||||
bool is_invisible,
|
||||
bool is_proximity_armed,
|
||||
bool is_flame_equipped,
|
||||
bool is_fueled,
|
||||
bool is_faceless,
|
||||
bool is_inaccurate,
|
||||
bool is_translucent,
|
||||
bool is_antiaircraft,
|
||||
int arming, int range, MPHType maxspeed, unsigned rot,
|
||||
WarheadType warhead, AnimType explosion) :
|
||||
ObjectTypeClass(true, false, false, true, false, false, true, true, TXT_NONE, ininame, ARMOR_NONE, 0)
|
||||
{
|
||||
Explosion = explosion;
|
||||
IsHigh = is_high;
|
||||
IsAntiAircraft = is_antiaircraft;
|
||||
IsTranslucent = is_translucent;
|
||||
IsArcing = is_arcing;
|
||||
IsHoming = is_homing;
|
||||
IsDropping = is_dropping;
|
||||
IsInvisible = is_invisible;
|
||||
IsProximityArmed = is_proximity_armed;
|
||||
IsFlameEquipped = is_flame_equipped;
|
||||
IsFueled = is_fueled;
|
||||
IsFaceless = is_faceless;
|
||||
IsInaccurate = is_inaccurate;
|
||||
Type = type;
|
||||
Warhead = warhead;
|
||||
MaxSpeed = maxspeed;
|
||||
ROT = rot;
|
||||
Arming = arming;
|
||||
Range = range;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletTypeClass::One_Time -- Performs the one time processing for bullets. *
|
||||
* *
|
||||
* This routine is used to perform any one time processing for the bullet type class. It *
|
||||
* handles loading of the shape files. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: This routine must be called before any rendering of bullets occurs and should *
|
||||
* only be called once. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/28/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void BulletTypeClass::One_Time(void)
|
||||
{
|
||||
BulletType index;
|
||||
|
||||
/*
|
||||
** Load the bullet shapes.
|
||||
*/
|
||||
for (index = BULLET_FIRST; index < BULLET_COUNT; index++) {
|
||||
BulletTypeClass const & bullet = As_Reference(index);
|
||||
char fullname[_MAX_FNAME+_MAX_EXT];
|
||||
|
||||
if (!bullet.IsInvisible) {
|
||||
_makepath(fullname, NULL, NULL, bullet.IniName, ".SHP");
|
||||
|
||||
RawFileClass file(fullname);
|
||||
|
||||
if (file.Is_Available()) {
|
||||
((void const *&)bullet.ImageData) = Load_Alloc_Data(file);
|
||||
} else {
|
||||
((void const *&)bullet.ImageData) = MixFileClass::Retrieve(fullname);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
4960
BUILDING.CPP
Normal file
4960
BUILDING.CPP
Normal file
File diff suppressed because it is too large
Load diff
304
BUILDING.H
Normal file
304
BUILDING.H
Normal file
|
@ -0,0 +1,304 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\building.h_v 2.20 16 Oct 1995 16:47:54 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : BUILDING.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 14, 1994 *
|
||||
* *
|
||||
* Last Update : April 14, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef BUILDING_H
|
||||
#define BUILDING_H
|
||||
|
||||
#include "tarcom.h"
|
||||
#include "radio.h"
|
||||
#include "cargo.h"
|
||||
#include "mission.h"
|
||||
#include "bullet.h"
|
||||
#include "target.h"
|
||||
#include "factory.h"
|
||||
|
||||
#define MAX_DOOR_STAGE 18 // # of frames of door opening on weapons factory
|
||||
#define DOOR_OPEN_STAGE 9 // frame on which the door is entirely open
|
||||
#define MAX_REPAIR_ANIM_STAGE 5 // # of stages of anim for repair center cycling
|
||||
|
||||
/****************************************************************************
|
||||
** For each instance of a building in the game, there is one of
|
||||
** these structures. This structure holds information that is specific
|
||||
** and dynamic for a particular building.
|
||||
*/
|
||||
class BuildingClass : public TechnoClass
|
||||
{
|
||||
public:
|
||||
BuildingTypeClass const * const Class;
|
||||
operator StructType(void) const {return Class->Type;};
|
||||
|
||||
/*
|
||||
** If this building is in the process of producing something, then this
|
||||
** will point to the factory manager.
|
||||
*/
|
||||
FactoryClass * Factory;
|
||||
|
||||
/*
|
||||
** This is the house that originally owned this factory. Objects buildable
|
||||
** by this house type will be produced from this factory regardless of who
|
||||
** the current owner is.
|
||||
*/
|
||||
HousesType ActLike;
|
||||
|
||||
/*
|
||||
** If the building is at a good point to change orders, then this
|
||||
** flag will be set to true.
|
||||
*/
|
||||
unsigned IsReadyToCommence:1;
|
||||
|
||||
/*
|
||||
** If this building is currently spending money to repair itself, then
|
||||
** this flag is true. It will automatically be set to false when the building
|
||||
** has reached full strength, when money is exhausted, or if the player
|
||||
** specifically stops the repair process.
|
||||
*/
|
||||
unsigned IsRepairing:1;
|
||||
|
||||
/*
|
||||
** If repair is currently in progress and this flag is true, then a wrench graphic
|
||||
** will be overlaid on the building to give visual feedback for the repair process.
|
||||
*/
|
||||
unsigned IsWrenchVisible:1;
|
||||
|
||||
/*
|
||||
** This flag is set when a commando has raided the building and planted
|
||||
** plastic explosives. When the CommandoCountDown timer expires, the
|
||||
** building takes massive damage.
|
||||
*/
|
||||
unsigned IsGoingToBlow:1;
|
||||
|
||||
/*
|
||||
** If this building was destroyed by some method that would prevent
|
||||
** survivors, then this flag will be true.
|
||||
*/
|
||||
unsigned IsSurvivorless:1;
|
||||
|
||||
/*
|
||||
** These state control variables are used by the oblisk for the charging
|
||||
** animation.
|
||||
*/
|
||||
unsigned IsCharging:1;
|
||||
unsigned IsCharged:1;
|
||||
|
||||
/*
|
||||
** A building that has been captured will not contain the full compliment
|
||||
** of crew. This is true even if it subsiquently gets captured back.
|
||||
*/
|
||||
unsigned IsCaptured:1;
|
||||
|
||||
/*
|
||||
** Special countdown to destruction value. If the building is destroyed,
|
||||
** it won't actually be removed from the map until this value reaches
|
||||
** zero. This delay is for cosmetic reasons.
|
||||
*/
|
||||
TCountDownTimerClass CountDown;
|
||||
|
||||
/*
|
||||
** This is the current animation processing state that the building is
|
||||
** in.
|
||||
*/
|
||||
BStateType BState;
|
||||
BStateType QueueBState;
|
||||
|
||||
/*
|
||||
** For multiplayer games, this keeps track of the last house to damage
|
||||
** this building, so if it burns to death or otherwise gradually dies,
|
||||
** proper credit can be given for the kill.
|
||||
*/
|
||||
HousesType WhoLastHurtMe;
|
||||
|
||||
/*
|
||||
** This is the saboteur responsible for this building's destruction.
|
||||
*/
|
||||
TARGET WhomToRepay;
|
||||
|
||||
/*
|
||||
** This is a record of the last strength of the building. Every so often,
|
||||
** it will compare this strength to the current strength. If there is a
|
||||
** discrepency, then the owner power is adjusted accordingly.
|
||||
*/
|
||||
int LastStrength;
|
||||
|
||||
/*
|
||||
** This is the countdown timer that regulates placement retry logic
|
||||
** for factory type buildings.
|
||||
*/
|
||||
TCountDownTimerClass PlacementDelay;
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Constructors, Destructors, and overloaded operators.
|
||||
*/
|
||||
static void * BuildingClass::operator new(size_t size);
|
||||
static void BuildingClass::operator delete(void *ptr);
|
||||
BuildingClass(void) : Class(0) {};
|
||||
BuildingClass(StructType type, HousesType house);
|
||||
virtual ~BuildingClass(void);
|
||||
virtual RTTIType What_Am_I(void) const {return RTTI_BUILDING;};
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Member function prototypes.
|
||||
*/
|
||||
static void Init(void);
|
||||
|
||||
TARGET Target_Scan(void);
|
||||
BuildingTypeClass::AnimControlType const * Fetch_Anim_Control(void) {return (&Class->Anims[BState]);};
|
||||
|
||||
/*
|
||||
** Query functions.
|
||||
*/
|
||||
virtual CELL Find_Exit_Cell(TechnoClass const * techno) const;
|
||||
virtual InfantryType Crew_Type(void) const;
|
||||
virtual int Pip_Count(void) const;
|
||||
virtual bool Can_Player_Move(void) const {return(false);};
|
||||
virtual ActionType What_Action(ObjectClass * target) const;
|
||||
virtual ActionType What_Action(CELL cell) const;
|
||||
virtual bool Can_Demolish(void) const;
|
||||
virtual ObjectTypeClass const & Class_Of(void) const {return *Class;};
|
||||
virtual int Refund_Amount(void) const;
|
||||
virtual DirType Fire_Direction(void) const;
|
||||
int Power_Output(void) const;
|
||||
|
||||
/*
|
||||
** Coordinate inquiry functions. These are used for both display and
|
||||
** combat purposes.
|
||||
*/
|
||||
virtual COORDINATE Docking_Coord(void) const;
|
||||
virtual COORDINATE Fire_Coord(int which) const;
|
||||
virtual COORDINATE Center_Coord(void) const;
|
||||
virtual COORDINATE Sort_Y(void) const;
|
||||
virtual COORDINATE Target_Coord(void) const {return Center_Coord();};
|
||||
|
||||
/*
|
||||
** Object entry and exit from the game system.
|
||||
*/
|
||||
virtual void Detach(TARGET target, bool all);
|
||||
virtual void Detach_All(bool all=true);
|
||||
virtual void Grand_Opening(bool captured = false);
|
||||
virtual void Update_Buildables(void);
|
||||
virtual MoveType Can_Enter_Cell(CELL cell, FacingType = FACING_NONE) const;
|
||||
virtual bool Unlimbo(COORDINATE , DirType dir = DIR_N);
|
||||
virtual bool Limbo(void);
|
||||
bool Passes_Proximity_Check(CELL homecell);
|
||||
|
||||
/*
|
||||
** Display and rendering support functionality. Supports imagery and how
|
||||
** object interacts with the map and thus indirectly controls rendering.
|
||||
*/
|
||||
virtual void const * Remap_Table(void);
|
||||
virtual int Exit_Object(TechnoClass * base);
|
||||
virtual void Draw_It(int x, int y, WindowNumberType window);
|
||||
virtual bool Mark(MarkType mark);
|
||||
virtual void Look(bool incremental=false);
|
||||
virtual void Fire_Out(void);
|
||||
void Begin_Mode(BStateType bstate);
|
||||
|
||||
/*
|
||||
** User I/O.
|
||||
*/
|
||||
virtual void Active_Click_With(ActionType action, ObjectClass * object);
|
||||
virtual void Active_Click_With(ActionType action, CELL cell);
|
||||
|
||||
/*
|
||||
** Combat related.
|
||||
*/
|
||||
virtual void Death_Announcement(TechnoClass const * source=0) const;
|
||||
virtual FireErrorType Can_Fire(TARGET, int which) const;
|
||||
virtual TARGET Greatest_Threat(ThreatType threat) const;
|
||||
virtual ResultType Take_Damage(int & damage, int distance, WarheadType warhead, TechnoClass * source=0);
|
||||
virtual TARGET As_Target(void) const;
|
||||
virtual bool Captured(HouseClass * newowner);
|
||||
|
||||
/*
|
||||
** AI.
|
||||
*/
|
||||
virtual void Hidden(void);
|
||||
virtual bool Revealed(HouseClass * house);
|
||||
virtual void Repair(int control);
|
||||
virtual void Sell_Back(int control);
|
||||
virtual RadioMessageType Receive_Message(RadioClass * from, RadioMessageType message, long & param);
|
||||
virtual void AI(void);
|
||||
virtual void Assign_Target(TARGET target);
|
||||
virtual bool Toggle_Primary(void);
|
||||
bool Flush_For_Placement(TechnoClass * techno, CELL cell);
|
||||
|
||||
virtual int Mission_Unload(void);
|
||||
virtual int Mission_Repair(void);
|
||||
virtual int Mission_Attack(void);
|
||||
virtual int Mission_Harvest(void);
|
||||
virtual int Mission_Guard(void);
|
||||
virtual int Mission_Construction(void);
|
||||
virtual int Mission_Deconstruction(void);
|
||||
virtual int Mission_Missile(void);
|
||||
virtual void Enter_Idle_Mode(bool initial=false);
|
||||
|
||||
/*
|
||||
** Scenario and debug support.
|
||||
*/
|
||||
#ifdef CHEAT_KEYS
|
||||
virtual void Debug_Dump(MonoClass *mono) const;
|
||||
#endif
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
static void Read_INI(char *buffer);
|
||||
static void Write_INI(char *buffer);
|
||||
static char *INI_Name(void) {return "STRUCTURES";};
|
||||
bool Load(FileClass & file);
|
||||
bool Save(FileClass & file);
|
||||
virtual void Code_Pointers(void);
|
||||
virtual void Decode_Pointers(void);
|
||||
void Update_Specials(void);
|
||||
|
||||
/*
|
||||
** Dee-buggin' support.
|
||||
*/
|
||||
int Validate(void) const;
|
||||
|
||||
private:
|
||||
void Drop_Debris(TARGET source = TARGET_NONE);
|
||||
virtual BulletClass * Fire_At(TARGET target, int which);
|
||||
|
||||
static COORDINATE const CenterOffset[BSIZE_COUNT];
|
||||
|
||||
/*
|
||||
** This contains the value of the Virtual Function Table Pointer
|
||||
*/
|
||||
static void * VTable;
|
||||
};
|
||||
|
||||
#endif
|
786
BULLET.CPP
Normal file
786
BULLET.CPP
Normal file
|
@ -0,0 +1,786 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\bullet.cpv 2.18 16 Oct 1995 16:50:00 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : BULLET.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 23, 1994 *
|
||||
* *
|
||||
* Last Update : March 18, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* BulletClass::AI -- Logic processing for bullet. *
|
||||
* BulletClass::As_Target -- Converts the bullet into a target value. *
|
||||
* BulletClass::BulletClass -- Bullet constructor. *
|
||||
* BulletClass::BulletClass -- Default constructor for bullet objects. *
|
||||
* BulletClass::Detach -- Removes specified target from this bullet's targeting system. *
|
||||
* BulletClass::Draw_It -- Displays the bullet at location specified. *
|
||||
* BulletClass::Init -- Clears the bullets array for scenario preparation. *
|
||||
* BulletClass::Mark -- Performs related map refreshing under bullet. *
|
||||
* BulletClass::Occupy_List -- Determines the bullet occupation list. *
|
||||
* BulletClass::Unlimbo -- Transitions a bullet object into the game render/logic system. *
|
||||
* BulletClass::delete -- Bullet memory delete. *
|
||||
* BulletClass::new -- Allocates memory for bullet object. *
|
||||
* BulletClass::Validate -- validates bullet pointer *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
#define GRAVITY 3
|
||||
|
||||
/*
|
||||
** This contains the value of the Virtual Function Table Pointer
|
||||
*/
|
||||
void * BulletClass::VTable;
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::Validate -- validates bullet pointer *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* 1 = ok, 0 = error *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/09/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
#ifdef CHEAT_KEYS
|
||||
int BulletClass::Validate(void) const
|
||||
{
|
||||
int num;
|
||||
|
||||
num = Bullets.ID(this);
|
||||
if (num < 0 || num >= BULLET_MAX) {
|
||||
Validate_Error("BULLET");
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
return (1);
|
||||
}
|
||||
#else
|
||||
#define Validate()
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::BulletClass -- Default constructor for bullet objects. *
|
||||
* *
|
||||
* This is the default constructor for bullet objects. A bullet constructed by this routine *
|
||||
* is not in a usable state for game purposes. It must be constructed by the full *
|
||||
* (parameterized) constructor -- usually called as part of the overloaded "new" operator. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: Do not use bullets that were constructed solely by this routine. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 09/24/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
BulletClass::BulletClass(void) :
|
||||
Class(0)
|
||||
{
|
||||
Payback = NULL;
|
||||
IsToAnimate = false;
|
||||
Altitude = 0;
|
||||
Riser = 0;
|
||||
TarCom = TARGET_NONE;
|
||||
Strength = 0;
|
||||
IsLocked = true;
|
||||
IsInaccurate = false;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::new -- Allocates memory for bullet object. *
|
||||
* *
|
||||
* This function will "allocate" a block of memory for a bullet object. *
|
||||
* This memory block is merely lifted from a fixed pool of blocks. *
|
||||
* *
|
||||
* INPUT: size -- The size of the memory block needed. *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to an available bullet object block. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/02/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void * BulletClass::operator new(size_t )
|
||||
{
|
||||
void * ptr = Bullets.Allocate();
|
||||
if (ptr) {
|
||||
((BulletClass *)ptr)->IsActive = true;
|
||||
}
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::delete -- Bullet memory delete. *
|
||||
* *
|
||||
* Since bullets memory is merely "allocated" out of a pool, it never *
|
||||
* actually gets deleted. *
|
||||
* *
|
||||
* INPUT: ptr -- Generic pointer to bullet object. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/02/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void BulletClass::operator delete(void *ptr)
|
||||
{
|
||||
if (ptr) {
|
||||
((BulletClass *)ptr)->IsActive = false;
|
||||
}
|
||||
Bullets.Free((BulletClass *)ptr);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::BulletClass -- Bullet constructor. *
|
||||
* *
|
||||
* This is the constructor for the bullet class. It handles all *
|
||||
* initialization of the bullet and starting it in motion toward its *
|
||||
* target. *
|
||||
* *
|
||||
* INPUT: id -- The type of bullet this is (could be missile). *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/02/1994 JLB : Created. *
|
||||
* 06/20/1994 JLB : Firer is a base class pointer. *
|
||||
* 12/10/1994 JLB : Auto calculate range optional. *
|
||||
* 12/12/1994 JLB : Handles small arms as an instantaneous effect. *
|
||||
* 12/23/1994 JLB : Fixed scatter algorithm for non-homing projectiles. *
|
||||
* 12/31/1994 JLB : Removed range parameter (not needed). *
|
||||
*=============================================================================================*/
|
||||
BulletClass::BulletClass(BulletType id) :
|
||||
Class(&BulletTypeClass::As_Reference(id))
|
||||
{
|
||||
Altitude = 0;
|
||||
IsInaccurate = false;
|
||||
IsLocked = true;
|
||||
// IsLocked = false;
|
||||
IsToAnimate = false;
|
||||
Payback = 0;
|
||||
Riser = 0;
|
||||
Strength = Class->MaxStrength;
|
||||
TarCom = TARGET_NONE;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::Occupy_List -- Determines the bullet occupation list. *
|
||||
* *
|
||||
* This function will determine the cell occupation list and return a pointer to it. Most *
|
||||
* bullets are small and the list is usually short, but on occasion, it can be a list that *
|
||||
* rivals the size of regular vehicles. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to the cell offset list that covers all the cells a bullet *
|
||||
* is over. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/20/1994 JLB : Created. *
|
||||
* 01/05/1995 JLB : Handles projectiles with altitude. *
|
||||
*=============================================================================================*/
|
||||
short const *BulletClass::Occupy_List(void) const
|
||||
{
|
||||
Validate();
|
||||
switch (*this) {
|
||||
case BULLET_FLAME:
|
||||
return(Coord_Spillage_List(Coord, 25));
|
||||
|
||||
case BULLET_NUKE_UP:
|
||||
case BULLET_NUKE_DOWN:
|
||||
return(Coord_Spillage_List(Coord, 48));
|
||||
|
||||
default:
|
||||
if (Altitude) {
|
||||
static CELL _list[10];
|
||||
const short * ptr = Coord_Spillage_List(Coord, 5);
|
||||
int index = 0;
|
||||
CELL cell1 = Coord_Cell(Coord);
|
||||
|
||||
while (ptr[index] != REFRESH_EOL) {
|
||||
_list[index] = ptr[index];
|
||||
index++;
|
||||
}
|
||||
|
||||
COORDINATE coord = XY_Coord(0, Altitude);
|
||||
coord = Coord_Sub(Coord, coord);
|
||||
CELL cell2 = Coord_Cell(coord);
|
||||
ptr = Coord_Spillage_List(coord, 5);
|
||||
while (*ptr != REFRESH_EOL) {
|
||||
_list[index++] = (*ptr++) + (cell2 - cell1);
|
||||
}
|
||||
_list[index] = REFRESH_EOL;
|
||||
return(_list);
|
||||
}
|
||||
}
|
||||
return(Coord_Spillage_List(Coord, 10));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::Mark -- Performs related map refreshing under bullet. *
|
||||
* *
|
||||
* This routine marks the objects under the bullet so that they will *
|
||||
* be redrawn. This is necessary as the bullet moves -- objects under *
|
||||
* its path need to be restored. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/02/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool BulletClass::Mark(MarkType mark)
|
||||
{
|
||||
Validate();
|
||||
if (ObjectClass::Mark(mark)) {
|
||||
if (!Class->IsInvisible) {
|
||||
Map.Refresh_Cells(Coord_Cell(Coord), Occupy_List());
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::AI -- Logic processing for bullet. *
|
||||
* *
|
||||
* This routine will perform all logic (flight) logic on the bullet. *
|
||||
* Primarily this is motion, fuse tracking, and detonation logic. Call *
|
||||
* this routine no more than once per bullet per game tick. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/02/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void BulletClass::AI(void)
|
||||
{
|
||||
Validate();
|
||||
COORDINATE coord;
|
||||
|
||||
ObjectClass::AI();
|
||||
|
||||
/*
|
||||
** Balistic objects are handled here.
|
||||
*/
|
||||
bool forced = false; // Forced explosion.
|
||||
if (Class->IsArcing) {
|
||||
Altitude += Riser;
|
||||
|
||||
if (Altitude <= 0) {
|
||||
forced = true;
|
||||
}
|
||||
if (Riser > -100) {
|
||||
Riser -= GRAVITY;
|
||||
}
|
||||
}
|
||||
if (Class->IsDropping) {
|
||||
Altitude += Riser;
|
||||
|
||||
if (Altitude <= 0) {
|
||||
forced = true;
|
||||
}
|
||||
if (Riser > -100) {
|
||||
Riser -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Homing projectiles constantly change facing to face toward the target but
|
||||
** they only do so every other game frame (improves game speed and makes
|
||||
** missiles not so deadly).
|
||||
*/
|
||||
if ((Frame & 0x01) && Class->IsHoming && Target_Legal(TarCom)) {
|
||||
PrimaryFacing.Set_Desired(Direction256(Coord, ::As_Coord(TarCom)));
|
||||
}
|
||||
|
||||
/*
|
||||
** Move the projectile forward according to its speed
|
||||
** and direction.
|
||||
*/
|
||||
coord = Coord;
|
||||
if (Class->IsFlameEquipped) {
|
||||
if (IsToAnimate) {
|
||||
new AnimClass(ANIM_SMOKE_PUFF, coord, 1);
|
||||
}
|
||||
IsToAnimate = !IsToAnimate;
|
||||
}
|
||||
|
||||
/*
|
||||
** Handle any body rotation at this time. This process must
|
||||
** occur every game fame in order to achieve smooth rotation.
|
||||
*/
|
||||
if (PrimaryFacing.Is_Rotating()) {
|
||||
PrimaryFacing.Rotation_Adjust(Class->ROT);
|
||||
}
|
||||
|
||||
switch (Physics(coord, PrimaryFacing)) {
|
||||
|
||||
/*
|
||||
** When a projectile reaches the edge of the world, it
|
||||
** vanishes from existence -- presumed to explode off
|
||||
** map.
|
||||
*/
|
||||
case IMPACT_EDGE:
|
||||
// if (IsLocked) {
|
||||
Mark();
|
||||
delete this;
|
||||
// }
|
||||
break;
|
||||
|
||||
default:
|
||||
case IMPACT_NONE:
|
||||
|
||||
/*
|
||||
** The projectile has moved. Check its fuse. If detonation
|
||||
** is signaled, then do so. Otherwise, just move.
|
||||
*/
|
||||
case IMPACT_NORMAL:
|
||||
Mark();
|
||||
// IsLocked = true;
|
||||
if (!Class->IsHigh) {
|
||||
CellClass * cellptr = &Map[Coord_Cell(coord)];
|
||||
if (cellptr->Overlay != OVERLAY_NONE && OverlayTypeClass::As_Reference(cellptr->Overlay).IsHigh) {
|
||||
forced = true;
|
||||
Coord = coord = Cell_Coord(Coord_Cell(coord));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Bullets are generaly more effective when they are fired at aircraft.
|
||||
*/
|
||||
if (Class->IsAntiAircraft && As_Aircraft(TarCom) && Distance(TarCom) < 0x0080) {
|
||||
forced = true;
|
||||
|
||||
if (*this == BULLET_TOW) {
|
||||
Strength += Strength/3;
|
||||
} else {
|
||||
Strength += Strength/2;
|
||||
}
|
||||
}
|
||||
|
||||
if (!forced && (Class->IsDropping || !Fuse_Checkup(coord))) {
|
||||
Coord = coord;
|
||||
Mark();
|
||||
|
||||
/*
|
||||
** Certain projectiles loose strength when they travel.
|
||||
*/
|
||||
if (*this == BULLET_BULLET) {
|
||||
if (Strength > 5) Strength--;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/*
|
||||
** When the target is reached, explode and do the damage
|
||||
** required of it. For homing objects, don't force the explosion to
|
||||
** match the target position. Non-homing projectiles adjust position so
|
||||
** that they hit the target. This compensates for the error in line of
|
||||
** flight logic.
|
||||
*/
|
||||
Mark();
|
||||
if (!forced && !Class->IsArcing && !Class->IsHoming && Fuse_Target()) {
|
||||
Coord = Fuse_Target();
|
||||
}
|
||||
|
||||
/*
|
||||
** Non-aircraft targets apply damage to the ground.
|
||||
*/
|
||||
if (!Is_Target_Aircraft(TarCom) || As_Aircraft(TarCom)->In_Which_Layer() == LAYER_GROUND) {
|
||||
Explosion_Damage(Coord, Strength, Payback, Class->Warhead);
|
||||
} else {
|
||||
|
||||
/*
|
||||
** Special damage apply for SAM missiles. This is the only way that missile
|
||||
** damage affects the aircraft target.
|
||||
*/
|
||||
if (Distance(TarCom) < 0x0080) {
|
||||
AircraftClass * object = As_Aircraft(TarCom);
|
||||
|
||||
int str = Strength;
|
||||
if (object) object->Take_Damage(str, 0, Class->Warhead, Payback);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** For projectiles that are invisible while travelling toward the target,
|
||||
** allow scatter effect for the impact animation.
|
||||
*/
|
||||
if (Class->IsInvisible) {
|
||||
Coord = Coord_Scatter(Coord, 0x0020);
|
||||
}
|
||||
if (Class->Explosion != ANIM_NONE) {
|
||||
new AnimClass(Class->Explosion, Coord);
|
||||
}
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::Draw_It -- Displays the bullet at location specified. *
|
||||
* *
|
||||
* This routine displays the bullet visual at the location specified. *
|
||||
* *
|
||||
* INPUT: x,y -- The center coordinate to render the bullet at. *
|
||||
* *
|
||||
* window -- The window to clip to. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/20/1994 JLB : Created. *
|
||||
* 06/27/1994 JLB : Takes a window clipping parameter. *
|
||||
* 01/08/1995 JLB : Handles translucent colors if necessary. *
|
||||
*=============================================================================================*/
|
||||
void BulletClass::Draw_It(int x, int y, WindowNumberType window)
|
||||
{
|
||||
Validate();
|
||||
int facing = Facing_To_32(PrimaryFacing);
|
||||
|
||||
/*
|
||||
** Certain projectiles aren't visible. This includes small bullets (which are actually
|
||||
** invisible) and flame thrower flames (which are rendered as an animation instead of a projectile).
|
||||
*/
|
||||
if (Class->IsInvisible) return;
|
||||
|
||||
/*
|
||||
** If there is no shape loaded for this object, then
|
||||
** it obviously can't be rendered -- just bail.
|
||||
*/
|
||||
void const * shapeptr = Class->Get_Image_Data();
|
||||
if (!shapeptr) return;
|
||||
|
||||
/*
|
||||
** Get the basic shape number for this projectile.
|
||||
*/
|
||||
int shapenum = 0;
|
||||
if (!Class->IsFaceless) {
|
||||
shapenum = UnitClass::BodyShape[facing];
|
||||
}
|
||||
|
||||
/*
|
||||
** For tumbling projectiles, fetch offset stage.
|
||||
*/
|
||||
if (*this == BULLET_NAPALM) {
|
||||
shapenum += Frame % 6;
|
||||
}
|
||||
|
||||
if (*this == BULLET_GRENADE) {
|
||||
shapenum += Frame % 8;
|
||||
// Timer++;
|
||||
}
|
||||
|
||||
/*
|
||||
** For flying projectiles, draw the shadow and adjust the actual projectile body
|
||||
** render position.
|
||||
*/
|
||||
if (Altitude) {
|
||||
CC_Draw_Shape(shapeptr, shapenum, x, y, window, SHAPE_PREDATOR|SHAPE_CENTER|SHAPE_WIN_REL|SHAPE_FADING, NULL, Map.FadingShade);
|
||||
y -= Lepton_To_Pixel(Altitude);
|
||||
}
|
||||
|
||||
/*
|
||||
** Draw the main body of the projectile.
|
||||
*/
|
||||
ShapeFlags_Type flags = SHAPE_NORMAL;
|
||||
if (Class->IsTranslucent) {
|
||||
flags = SHAPE_GHOST;
|
||||
}
|
||||
CC_Draw_Shape(shapeptr, shapenum, x, y, window, flags|SHAPE_CENTER|SHAPE_WIN_REL, NULL, Map.UnitShadow);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::Init -- Clears the bullets array for scenario preparation. *
|
||||
* *
|
||||
* This routine will zero out the bullet tracking list and object array in preparation for *
|
||||
* the start of a new scenario. All bullets cease to exists after this function is *
|
||||
* called. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/15/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void BulletClass::Init(void)
|
||||
{
|
||||
BulletClass *ptr;
|
||||
|
||||
Bullets.Free_All();
|
||||
|
||||
ptr = new BulletClass();
|
||||
VTable = ((void **)(((char *)ptr) + sizeof(AbstractClass) - 4))[0];
|
||||
delete ptr;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::Detach -- Removes specified target from this bullet's targeting system. *
|
||||
* *
|
||||
* When an object is removed from the game system, it must be removed all targeting and *
|
||||
* tracking systems as well. This routine is used to remove the specified object from the *
|
||||
* bullet. If the object isn't part of this bullet's tracking system, then no action is *
|
||||
* performed. *
|
||||
* *
|
||||
* INPUT: target -- The target to remove from this tracking system. *
|
||||
* *
|
||||
* all -- Is the target going away for good as opposed to just cloaking/hiding? *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 09/24/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void BulletClass::Detach(TARGET target, bool all)
|
||||
{
|
||||
Validate();
|
||||
ObjectClass * obj = As_Object(target);
|
||||
|
||||
if (obj == Payback) {
|
||||
Payback = 0;
|
||||
}
|
||||
|
||||
if (all && target == TarCom) {
|
||||
TarCom = TARGET_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::Unlimbo -- Transitions a bullet object into the game render/logic system. *
|
||||
* *
|
||||
* This routine is used to take a bullet object that is in limbo and transition it to the *
|
||||
* game system. A bullet object so transitioned, will be drawn and logic processing *
|
||||
* performed. In effect, it comes into existance. *
|
||||
* *
|
||||
* INPUT: coord -- The location where the bullet object is to appear. *
|
||||
* *
|
||||
* dir -- The initial facing for the bullet object. *
|
||||
* *
|
||||
* OUTPUT: bool; Was the unlimbo successful? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/10/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool BulletClass::Unlimbo(COORDINATE coord, DirType dir)
|
||||
{
|
||||
Validate();
|
||||
/*
|
||||
** Try to unlimbo the bullet as far as the base class is concerned. Use the already
|
||||
** set direction and strength if the "punt" values were passed in. This allows a bullet
|
||||
** to be setup prior to being launched.
|
||||
*/
|
||||
if (ObjectClass::Unlimbo(coord)) {
|
||||
COORDINATE tcoord = As_Coord(TarCom);
|
||||
|
||||
/*
|
||||
** Homing projectiles (missiles) do NOT override facing. They just fire in the
|
||||
** direction specified and let the chips fall where they may.
|
||||
*/
|
||||
if (!Class->IsHoming && !Class->IsDropping) {
|
||||
dir = Direction(tcoord);
|
||||
}
|
||||
|
||||
/*
|
||||
** Possibly adjust the target if this projectile is inaccurate. This occurs whenever
|
||||
** certain weapons are trained upon targets they were never designed to attack. Example: when
|
||||
** turrets or anti-tank missiles are fired at infantry. Indirect
|
||||
** fire is inherently inaccurate.
|
||||
*/
|
||||
if (IsInaccurate || Class->IsInaccurate ||
|
||||
((Is_Target_Cell(TarCom) || Is_Target_Infantry(TarCom)) && (Class->Warhead == WARHEAD_AP || Class->IsFueled))) {
|
||||
|
||||
/*
|
||||
** Inaccuracy for low velocity or homing projectiles manifests itself as a standard
|
||||
** Cicular Error of Probability (CEP) algorithm. High speed projectiles usually
|
||||
** just overshoot the target by extending the straight line flight.
|
||||
*/
|
||||
if (Class->IsHoming || Class->IsArcing) {
|
||||
int scatterdist = ::Distance(coord, tcoord)/3;
|
||||
scatterdist = MIN(scatterdist, 0x0200);
|
||||
|
||||
if (*this == BULLET_GRENADE) {
|
||||
scatterdist = ::Distance(coord, tcoord)/4;
|
||||
scatterdist = MIN(scatterdist, 0x0080);
|
||||
}
|
||||
|
||||
dir = (DirType)((dir + (Random_Pick(0, 10)-5)) & 0x00FF);
|
||||
tcoord = Coord_Scatter(tcoord, Random_Pick(0, scatterdist));
|
||||
} else {
|
||||
tcoord = Coord_Move(tcoord, dir, Random_Pick(0, 0x0100));
|
||||
}
|
||||
|
||||
/*
|
||||
** Limit scatter to the weapon range of the firer.
|
||||
*/
|
||||
if (Payback) {
|
||||
if (!Payback->In_Range(tcoord, 0) && !Payback->In_Range(tcoord, 1)) {
|
||||
tcoord = Coord_Move(tcoord, ::Direction(tcoord, Coord), Distance(tcoord) - MAX(Payback->Weapon_Range(0), Payback->Weapon_Range(1)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** For very fast and invisible projectiles, just make the projectile exist at the target
|
||||
** location and dispense with the actual flight.
|
||||
*/
|
||||
if (Class->MaxSpeed == MPH_LIGHT_SPEED && Class->IsInvisible) {
|
||||
Coord = tcoord;
|
||||
}
|
||||
|
||||
/*
|
||||
** Set the range equal to either the class defined range or the calculated
|
||||
** number of game frames it would take for the projectile to reach the target.
|
||||
*/
|
||||
int range = 0xFF;
|
||||
if (!Class->Range) {
|
||||
if (!Class->IsDropping) {
|
||||
range = (::Distance(tcoord, Coord) / Class->MaxSpeed) + 4;
|
||||
}
|
||||
} else {
|
||||
range = Class->Range;
|
||||
}
|
||||
|
||||
/*
|
||||
** Projectile speed is usually the default value for that projectile, but
|
||||
** certian projectiles alter speed according to the distance to the
|
||||
** target.
|
||||
*/
|
||||
int speed = Class->MaxSpeed;
|
||||
if (speed == MPH_LIGHT_SPEED) speed = MPH_IMMOBILE;
|
||||
if (Class->IsArcing) {
|
||||
speed = Class->MaxSpeed + (Distance(tcoord)>>5);
|
||||
|
||||
/*
|
||||
** Set minimum speed (i.e., distance) for arcing projectiles.
|
||||
*/
|
||||
speed = MAX(speed, 25);
|
||||
}
|
||||
if (!Class->IsDropping) {
|
||||
Fly_Speed(255, (MPHType)speed);
|
||||
}
|
||||
|
||||
/*
|
||||
** Arm the fuse.
|
||||
*/
|
||||
Arm_Fuse(Coord, tcoord, range, ((As_Aircraft(TarCom)!=0) ? 0 : Class->Arming));
|
||||
|
||||
/*
|
||||
** Projectiles that make a ballistic flight to impact point must determine a
|
||||
** vertical component for the projectile launch. This is crudely simulated
|
||||
** by biasing ground speed according to target distance and then giving
|
||||
** enough vertical velocity to keep the projectile airborne for the
|
||||
** desired amount of time. The mathematically correct solution would be to
|
||||
** calculate launch angle (given fixed projectile velocity) and then derive
|
||||
** the vertical and horizontal components. This solution would require a
|
||||
** of square root and an arcsine lookup table. OUCH!
|
||||
*/
|
||||
Altitude = 0;
|
||||
Riser = 0;
|
||||
if (Class->IsArcing) {
|
||||
Altitude = 1;
|
||||
Riser = ((Distance(tcoord)/2) / (speed+1))*GRAVITY;
|
||||
Riser = MAX(Riser, 10);
|
||||
}
|
||||
if (Class->IsDropping) {
|
||||
Altitude = Pixel_To_Lepton(24);
|
||||
Riser = 0;
|
||||
}
|
||||
|
||||
PrimaryFacing = dir;
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* BulletClass::As_Target -- Converts the bullet into a target value. *
|
||||
* *
|
||||
* This support routine is used to convert the bullet (as a pointer) into a target *
|
||||
* value (which is a number). *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns the bullet as a target value. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 09/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
TARGET BulletClass::As_Target(void) const
|
||||
{
|
||||
Validate();
|
||||
return(Build_Target(KIND_BULLET, Bullets.ID(this)));
|
||||
}
|
||||
|
153
BULLET.H
Normal file
153
BULLET.H
Normal file
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\bullet.h_v 2.18 16 Oct 1995 16:47:40 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : BULLET.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 23, 1994 *
|
||||
* *
|
||||
* Last Update : April 23, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef BULLET_H
|
||||
#define BULLET_H
|
||||
|
||||
#include "object.h"
|
||||
#include "fly.h"
|
||||
#include "fuse.h"
|
||||
|
||||
|
||||
class BulletClass : public ObjectClass,
|
||||
public FlyClass,
|
||||
public FuseClass
|
||||
{
|
||||
public:
|
||||
|
||||
/*
|
||||
** This specifies exactly what kind of bullet this is. All of the static attributes
|
||||
** for this bullet is located in the BulletTypeClass pointed to by this variable.
|
||||
*/
|
||||
BulletTypeClass const * const Class;
|
||||
operator BulletType(void) const {return Class->Type;};
|
||||
|
||||
/*
|
||||
** Records who sent this "present" so that an appropriate "thank you" can
|
||||
** be returned.
|
||||
*/
|
||||
TechnoClass * Payback;
|
||||
|
||||
/*
|
||||
** This is the facing that the projectile is travelling.
|
||||
*/
|
||||
FacingClass PrimaryFacing;
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Constructors, Destructors, and overloaded operators.
|
||||
*/
|
||||
static void * BulletClass::operator new(size_t size);
|
||||
static void BulletClass::operator delete(void *ptr);
|
||||
BulletClass(void);
|
||||
BulletClass(BulletType id);
|
||||
virtual ~BulletClass(void) {if (GameActive) BulletClass::Limbo();};
|
||||
virtual RTTIType What_Am_I(void) const {return RTTI_BULLET;};
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Member function prototypes.
|
||||
*/
|
||||
static void Init(void);
|
||||
|
||||
virtual void Assign_Target(TARGET target) {TarCom = target;};
|
||||
virtual bool Unlimbo(COORDINATE , DirType facing = DIR_N);
|
||||
virtual LayerType In_Which_Layer(void) const {return LAYER_TOP;};
|
||||
virtual ObjectTypeClass const & Class_Of(void) const {return *Class;};
|
||||
virtual void Detach(TARGET target, bool all);
|
||||
virtual void Draw_It(int x, int y, WindowNumberType window);
|
||||
virtual bool Mark(MarkType mark=MARK_CHANGE);
|
||||
virtual void AI(void);
|
||||
virtual short const * Occupy_List(void) const;
|
||||
virtual short const * Overlap_List(void) const {return Occupy_List();};
|
||||
virtual TARGET As_Target(void) const;
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
bool Load(FileClass & file);
|
||||
bool Save(FileClass & file);
|
||||
virtual void Code_Pointers(void);
|
||||
virtual void Decode_Pointers(void);
|
||||
|
||||
/*
|
||||
** Dee-buggin' support.
|
||||
*/
|
||||
int Validate(void) const;
|
||||
|
||||
/*
|
||||
** If this bullet is forced to be inaccurate because of some outside means. A tank
|
||||
** firing while moving is a good example.
|
||||
*/
|
||||
unsigned IsInaccurate:1;
|
||||
|
||||
private:
|
||||
|
||||
// Crude animation flag.
|
||||
unsigned IsToAnimate:1;
|
||||
|
||||
/*
|
||||
** This is the height of the projectile. It starts at a low height, rises to an
|
||||
** apogee and then drops to explode upon impact. The height is used to render
|
||||
** the bullet's vertical offset.
|
||||
*/
|
||||
int Altitude;
|
||||
|
||||
/*
|
||||
** This is a modifier for the altitude that rises and falls in order to simulate
|
||||
** the arc of the projectile. This value is added to the height every game tick
|
||||
** while simultaneously being reduced itself. The net effect, is a rising
|
||||
** projectile that slows and then eventually drops.
|
||||
*/
|
||||
signed char Riser;
|
||||
|
||||
/*
|
||||
** This is the target of the projectile. It is especially significant for those projectiles
|
||||
** that home in on a target.
|
||||
*/
|
||||
TARGET TarCom;
|
||||
|
||||
/*
|
||||
** Is this missle allowed to come in from out of bounds?
|
||||
*/
|
||||
unsigned IsLocked:1;
|
||||
|
||||
/*
|
||||
** This contains the value of the Virtual Function Table Pointer
|
||||
*/
|
||||
static void * VTable;
|
||||
};
|
||||
|
||||
#endif
|
183
CARGO.CPP
Normal file
183
CARGO.CPP
Normal file
|
@ -0,0 +1,183 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\cargo.cpv 2.18 16 Oct 1995 16:49:50 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CARGO.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 23, 1994 *
|
||||
* *
|
||||
* Last Update : 10/31/94 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* CargoClass::Attach -- Add unit to cargo hold. *
|
||||
* CargoClass::Attached_Object -- Determine attached unit pointer. *
|
||||
* CargoClass::Detach_Object -- Removes a unit from the cargo hold. *
|
||||
* CargoClass::Debug_Dump -- Displays the cargo value to the monochrome screen. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
#ifdef CHEAT_KEYS
|
||||
/***********************************************************************************************
|
||||
* CargoClass::Debug_Dump -- Displays the cargo value to the monochrome screen. *
|
||||
* *
|
||||
* This routine is used to dump the current cargo value to the monochrome monitor. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/02/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void CargoClass::Debug_Dump(MonoClass * mono) const
|
||||
{
|
||||
if (How_Many()) {
|
||||
mono->Set_Cursor(63, 3);
|
||||
mono->Printf("(%d)%04X", How_Many(), Attached_Object());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CargoClass::Attach -- Add unit to cargo hold. *
|
||||
* *
|
||||
* This routine will add the specified unit to the cargo hold. The *
|
||||
* unit will chain to any existing units in the hold. The chaining is *
|
||||
* in a LIFO order. *
|
||||
* *
|
||||
* INPUT: object-- Pointer to the object to attach to the cargo hold. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/23/1994 JLB : Created. *
|
||||
* 10/31/94 JLB : Handles chained objects. *
|
||||
*=============================================================================================*/
|
||||
void CargoClass::Attach(FootClass * object)
|
||||
{
|
||||
/*
|
||||
** If there is no object, then no action is necessary.
|
||||
*/
|
||||
if (!object) return;
|
||||
|
||||
object->Limbo();
|
||||
|
||||
/*
|
||||
** Attach any existing cargo hold object to the end of the list as indicated by the
|
||||
** object pointer passed into this routine. This is necessary because several objects may
|
||||
** be attached at one time or several objects may be attached as a result of several calls
|
||||
** to this routine. Either case must be handled properly.
|
||||
*/
|
||||
ObjectClass * o = object->Next;
|
||||
while (o) {
|
||||
if (!o->Next) break;
|
||||
o = o->Next;
|
||||
}
|
||||
if (o) {
|
||||
o->Next = CargoHold;
|
||||
} else {
|
||||
object->Next = CargoHold;
|
||||
}
|
||||
|
||||
/*
|
||||
** Finally, assign the object pointer as the first object attached to this cargo hold.
|
||||
*/
|
||||
CargoHold = object;
|
||||
Quantity = 0;
|
||||
object = CargoHold;
|
||||
while (object) {
|
||||
Quantity++;
|
||||
object = (FootClass *)object->Next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CargoClass::Detach_Object -- Removes a unit from the cargo hold. *
|
||||
* *
|
||||
* This routine will take a unit from the cargo hold and extract it. *
|
||||
* The unit extracted is the last unit added to the hold. If there *
|
||||
* is no unit in the hold or the occupant is not a unit, then NULL is *
|
||||
* returned. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to the unit that has been extracted. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/23/1994 JLB : Created. *
|
||||
* 06/07/1994 JLB : Handles generic object types. *
|
||||
*=============================================================================================*/
|
||||
FootClass * CargoClass::Detach_Object(void)
|
||||
{
|
||||
FootClass * unit = Attached_Object();
|
||||
|
||||
if (unit) {
|
||||
CargoHold = (FootClass *)unit->Next;
|
||||
unit->Next = 0;
|
||||
Quantity--;
|
||||
}
|
||||
return(unit);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CargoClass::Attached_Object -- Determine attached unit pointer. *
|
||||
* *
|
||||
* This routine will return with a pointer to the attached unit if one *
|
||||
* is present. One would need to know this if this is a transport *
|
||||
* unit and it needs to unload. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns a pointer to the attached unit. If there is no *
|
||||
* attached unit, then return NULL. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 09/07/1992 JLB : Created. *
|
||||
* 06/07/1994 JLB : Handles generic object types. *
|
||||
*=============================================================================================*/
|
||||
FootClass * CargoClass::Attached_Object(void) const
|
||||
{
|
||||
if (Is_Something_Attached()) {
|
||||
return(CargoHold);
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
91
CARGO.H
Normal file
91
CARGO.H
Normal file
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\cargo.h_v 2.20 16 Oct 1995 16:45:14 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CARGO.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 23, 1994 *
|
||||
* *
|
||||
* Last Update : April 23, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CARGO_H
|
||||
#define CARGO_H
|
||||
|
||||
class FootClass;
|
||||
|
||||
/****************************************************************************
|
||||
** This class handles the basic cargo logic.
|
||||
*/
|
||||
class CargoClass {
|
||||
public:
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Constructors, Destructors, and overloaded operators.
|
||||
*/
|
||||
CargoClass(void) {Quantity = 0;CargoHold = 0;};
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Member function prototypes.
|
||||
*/
|
||||
|
||||
#ifdef CHEAT_KEYS
|
||||
void Debug_Dump(MonoClass *mono) const;
|
||||
#endif
|
||||
void AI(void) {};
|
||||
|
||||
int How_Many(void) const {return Quantity;};
|
||||
bool Is_Something_Attached(void) const {return (CargoHold != 0);};
|
||||
FootClass * Attached_Object(void) const;
|
||||
FootClass * Detach_Object(void);
|
||||
void Attach(FootClass * object);
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
void Code_Pointers(void);
|
||||
void Decode_Pointers(void);
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
** This is the number of objects attached to this cargo hold. For transporter
|
||||
** objects, they might contain more than one object.
|
||||
*/
|
||||
unsigned char Quantity;
|
||||
|
||||
/*
|
||||
** This is the target value of any attached object. A value of zero indicates
|
||||
** that no object is attached.
|
||||
*/
|
||||
FootClass * CargoHold;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
422
CCDDE.CPP
Normal file
422
CCDDE.CPP
Normal file
|
@ -0,0 +1,422 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer - Red Alert *
|
||||
* *
|
||||
* File Name : CCDDE.CPP *
|
||||
* *
|
||||
* Programmer : Steve Tall *
|
||||
* *
|
||||
* Start Date : 10/04/95 *
|
||||
* *
|
||||
* Last Update : August 5th, 1996 [ST] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Overview: *
|
||||
* C&C's interface to the DDE class *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* *
|
||||
* Functions: *
|
||||
* DDE_Callback -- DDE server callback function *
|
||||
* DDEServerClass::DDEServerClass -- class constructor *
|
||||
* DDEServerClass::Enable -- Enables the DDE callback *
|
||||
* DDEServerClass::Disable -- Disables the DDE callback *
|
||||
* DDEServerClass::~DDEServerClass -- class destructor *
|
||||
* DDESC::Callback -- callback function. Called from the DDE_Callback wrapper function *
|
||||
* DDESC::Get_MPlayer_Game_Info -- returns a pointer to the multiplayer setup info from wchat *
|
||||
* DDESC::Delete_MPlayer_Game_Info -- clears out multi player game setup info *
|
||||
* DDESC::Time_Since_Heartbeat -- returns the time in ticks since the last heartbeat from wchat*
|
||||
* *
|
||||
* Send_Data_To_DDE_Server -- sends a packet to WChat *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
|
||||
#define WIN32
|
||||
#include <WINDOWS.H>
|
||||
#include "ccdde.h"
|
||||
#include <stdio.h>
|
||||
#include <timer.h>
|
||||
|
||||
DDEServerClass DDEServer; //Instance of the DDE Server class
|
||||
|
||||
Instance_Class *DDE_Class = NULL; // pointer for client callback
|
||||
// this *must* be called DDE_Class
|
||||
|
||||
BOOL CC95AlreadyRunning = FALSE; //Was there an instance of C&C 95 already running when we started?
|
||||
|
||||
extern HWND MainWindow;
|
||||
extern TimerClass GameTimer;
|
||||
extern BOOL GameTimerInUse;
|
||||
extern void CCDebugString (char *string);
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDE_Callback -- DDE server callback function *
|
||||
* *
|
||||
* Just acts as a wrapper for the DDEServerClass callback function *
|
||||
* *
|
||||
* INPUT: ptr to data from client *
|
||||
* length of data *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/8/96 3:19PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
BOOL CALLBACK DDE_Callback (unsigned char *data, long length)
|
||||
{
|
||||
return (DDEServer.Callback(data, length));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDEServerClass::DDEServerClass -- class constructor *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/8/96 3:20PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
DDEServerClass::DDEServerClass(void)
|
||||
{
|
||||
MPlayerGameInfo = NULL; //Flag that we havnt received a start game info packet yet
|
||||
|
||||
DDE_Class = new Instance_Class ("CONQUER", "WCHAT");
|
||||
|
||||
DDE_Class->Enable_Callback( TRUE );
|
||||
IsEnabled = TRUE;
|
||||
|
||||
if (DDE_Class->Test_Server_Running(DDE_Class->local_name)){
|
||||
CC95AlreadyRunning = TRUE;
|
||||
}else{
|
||||
DDE_Class->Register_Server( DDE_Callback );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DDEServerClass::Enable(void)
|
||||
{
|
||||
if (!IsEnabled){
|
||||
DDE_Class->Enable_Callback( TRUE );
|
||||
IsEnabled = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDEServerClass::Disable -- Disables the DDE callback *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 8/5/96 9:44PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
void DDEServerClass::Disable(void)
|
||||
{
|
||||
if (IsEnabled){
|
||||
DDE_Class->Enable_Callback( FALSE );
|
||||
IsEnabled = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDEServerClass::~DDEServerClass -- class destructor *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/8/96 3:20PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
DDEServerClass::~DDEServerClass(void)
|
||||
{
|
||||
Delete_MPlayer_Game_Info();
|
||||
delete( DDE_Class );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDESC::Callback -- callback function. Called from the DDE_Callback wrapper function *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: data from DDE client *
|
||||
* length of data *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: Data has length and type as first 2 ints *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/8/96 3:21PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
BOOL DDEServerClass::Callback(unsigned char *data, long length)
|
||||
{
|
||||
|
||||
/*
|
||||
** If the packet length < 0 then this is a special advisory packet
|
||||
*/
|
||||
if ( length<0 ) {
|
||||
|
||||
switch( length ) {
|
||||
|
||||
case DDE_ADVISE_CONNECT:
|
||||
CCDebugString("C&C95 - DDE advisory: client connect detected.");
|
||||
return TRUE;
|
||||
|
||||
case DDE_ADVISE_DISCONNECT:
|
||||
CCDebugString("C&C95 - DDE advisory: client disconnect detected.");
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
CCDebugString("C&C95 - DDE advisory: Unknown DDE advise type.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
/*
|
||||
** Packet must be at least the length of the packet type & size fields to be valid
|
||||
*/
|
||||
if (length < 2*sizeof(int)) {
|
||||
CCDebugString ("C&C95 - Received invalid packet.");
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
** Find out what kind of packet this is and its length.
|
||||
*/
|
||||
int *packet_pointer = (int *)data;
|
||||
int actual_length = ntohl(*packet_pointer++);
|
||||
int packet_type = ntohl(*packet_pointer++);
|
||||
|
||||
/*
|
||||
** Strip the ID int from the start of the packet
|
||||
*/
|
||||
data += 2*sizeof (int);
|
||||
length -= 2*sizeof (int);
|
||||
actual_length -= 2*sizeof (int);
|
||||
|
||||
/*
|
||||
** Take the appropriate action for the packet type
|
||||
*/
|
||||
switch ( packet_type ){
|
||||
|
||||
/*
|
||||
** This is a packet with the info required for starting a new internet game. This is really
|
||||
* just C&CSPAWN.INI sent from WChat instead of read from disk.
|
||||
*/
|
||||
case DDE_PACKET_START_MPLAYER_GAME:
|
||||
CCDebugString("C&C95 - Received start game packet.");
|
||||
Delete_MPlayer_Game_Info();
|
||||
MPlayerGameInfo = new char [actual_length + 1];
|
||||
memcpy (MPlayerGameInfo, data, actual_length);
|
||||
*(MPlayerGameInfo + actual_length) = 0; //Terminator in case we treat it as a string
|
||||
MPlayerGameInfoLength = actual_length;
|
||||
LastHeartbeat = 0;
|
||||
break;
|
||||
|
||||
case DDE_TICKLE:
|
||||
CCDebugString("C&C95 - Received 'tickle' packet.");
|
||||
//SetForegroundWindow ( MainWindow );
|
||||
//ShowWindow ( MainWindow, SW_SHOWMAXIMIZED );
|
||||
break;
|
||||
|
||||
case DDE_PACKET_HEART_BEAT:
|
||||
CCDebugString("C&C95 - Received heart beat packet.");
|
||||
if (GameTimerInUse){
|
||||
LastHeartbeat = GameTimer.Time();
|
||||
}else{
|
||||
LastHeartbeat = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
CCDebugString("C&C95 - Received unrecognised packet.");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDESC::Get_MPlayer_Game_Info -- returns a pointer to the multiplayer setup info from wchat *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: ptr to data in .INI file format *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/8/96 3:23PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
char *DDEServerClass::Get_MPlayer_Game_Info (void)
|
||||
{
|
||||
return (MPlayerGameInfo);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDESC::Delete_MPlayer_Game_Info -- clears out multi player game setup info *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/8/96 3:24PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
void DDEServerClass::Delete_MPlayer_Game_Info(void)
|
||||
{
|
||||
if (MPlayerGameInfo){
|
||||
delete [] MPlayerGameInfo;
|
||||
MPlayerGameInfo = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DDESC::Time_Since_Heartbeat -- returns the time in ticks since the last heartbeat from wchat*
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: time since heartbeat *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/9/96 11:05PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
int DDEServerClass::Time_Since_Heartbeat(void)
|
||||
{
|
||||
return (GameTimer.Time() - LastHeartbeat);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Send_Data_To_DDE_Server -- sends a packet to WChat *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: ptr to the data to send *
|
||||
* length of data *
|
||||
* packet type identifier *
|
||||
* *
|
||||
* OUTPUT: true if packet successfully sent *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/9/96 11:07PM ST : Created *
|
||||
*=============================================================================================*/
|
||||
BOOL Send_Data_To_DDE_Server (char *data, int length, int packet_type)
|
||||
{
|
||||
#if (0)
|
||||
BOOL app_exists;
|
||||
|
||||
app_exists = DDE_Class->Test_Server_Running(DDE_Class->remote_name);
|
||||
|
||||
if (app_exists != TRUE) {
|
||||
CCDebugString("Connection to server failed!");
|
||||
return(FALSE);
|
||||
}
|
||||
#endif //(0)
|
||||
|
||||
if( DDE_Class->Open_Poke_Connection(DDE_Class->remote_name) == FALSE) {
|
||||
CCDebugString("C&C95 - Failed to connect for POKE!");
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
char *poke_data = new char [length + 2*sizeof(int)];
|
||||
|
||||
int *poke_data_int = (int*)poke_data;
|
||||
|
||||
*poke_data_int = htonl (length + 2*sizeof(int));
|
||||
*(poke_data_int+1)= htonl (packet_type);
|
||||
|
||||
memcpy (poke_data + 8, data, length);
|
||||
|
||||
|
||||
if(DDE_Class->Poke_Server( (LPBYTE) poke_data, ntohl(*poke_data_int) ) == FALSE) {
|
||||
CCDebugString("C&C95 - POKE failed!\n");
|
||||
DDE_Class->Close_Poke_Connection(); // close down the link
|
||||
delete poke_data;
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
DDE_Class->Close_Poke_Connection(); // close down the link
|
||||
|
||||
delete poke_data;
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
88
CCDDE.H
Normal file
88
CCDDE.H
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer - Red Alert *
|
||||
* *
|
||||
* File Name : CCDDE.H *
|
||||
* *
|
||||
* Programmer : Steve Tall *
|
||||
* *
|
||||
* Start Date : 10/04/95 *
|
||||
* *
|
||||
* Last Update : August 5th, 1996 [ST] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Overview: *
|
||||
* C&C's interface to the DDE class *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* *
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#include "dde.h"
|
||||
|
||||
class DDEServerClass {
|
||||
|
||||
public:
|
||||
|
||||
DDEServerClass (void);
|
||||
~DDEServerClass (void);
|
||||
|
||||
|
||||
char *Get_MPlayer_Game_Info (void); //Returns pointer to game info
|
||||
int Get_MPlayer_Game_Info_Length(){return(MPlayerGameInfoLength);}; //Len of game info
|
||||
BOOL Callback(unsigned char *data, long length); //DDE callback function
|
||||
void Delete_MPlayer_Game_Info(void); //release the game info memory
|
||||
void Enable(void); //Enable the DDE callback
|
||||
void Disable(void); //Disable the DDE callback
|
||||
int Time_Since_Heartbeat(void); //Returns the time since the last hearbeat from WChat
|
||||
|
||||
/*
|
||||
** Enumeration for DDE packet types from WChat
|
||||
*/
|
||||
enum {
|
||||
DDE_PACKET_START_MPLAYER_GAME, //Start game packet. This includes game options
|
||||
DDE_PACKET_GAME_RESULTS, //Game results packet. The game statistics.
|
||||
DDE_PACKET_HEART_BEAT, //Heart beat packet so we know WChat is still there.
|
||||
DDE_TICKLE, //Message to prompt other app to take focus.
|
||||
DDE_CONNECTION_FAILED
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
|
||||
char *MPlayerGameInfo; //Pointer to game start packet
|
||||
int MPlayerGameInfoLength; //Length of game start packet.
|
||||
BOOL IsEnabled; //Flag for DDE callback enable
|
||||
int LastHeartbeat; // Time since last heartbeat packet was received from WChat
|
||||
|
||||
};
|
||||
|
||||
|
||||
extern DDEServerClass DDEServer;
|
||||
extern BOOL Send_Data_To_DDE_Server (char *data, int length, int packet_type);
|
||||
|
||||
|
||||
#endif //WIN32
|
626
CCFILE.CPP
Normal file
626
CCFILE.CPP
Normal file
|
@ -0,0 +1,626 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CCFILE.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : August 8, 1994 *
|
||||
* *
|
||||
* Last Update : March 20, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* CCFileClass::CCFileClass -- Default constructor for file object. *
|
||||
* CCFileClass::CCFileClass -- Filename based constructor for C&C file. *
|
||||
* CCFileClass::Close -- Closes the file. *
|
||||
* CCFileClass::Is_Available -- Checks for existence of file on disk or in mixfile. *
|
||||
* CCFileClass::Is_Open -- Determines if the file is open. *
|
||||
* CCFileClass::Open -- Opens a file from either the mixfile system or the rawfile system. *
|
||||
* CCFileClass::Read -- Reads data from the file. *
|
||||
* CCFileClass::Seek -- Moves the current file pointer in the file. *
|
||||
* CCFileClass::Size -- Determines the size of the file. *
|
||||
* CCFileClass::Write -- Writes data to the file (non mixfile files only). *
|
||||
* CCFileClass::Error -- Handles displaying a file error message. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
|
||||
#include "function.h"
|
||||
//#include <direct.h>
|
||||
//#include <fcntl.h>
|
||||
//#include <io.h>
|
||||
//#include <dos.h>
|
||||
//#include <errno.h>
|
||||
//#include <share.h>
|
||||
//#include "ccfile.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Error -- Handles displaying a file error message. *
|
||||
* *
|
||||
* Display an error message as indicated. If it is allowed to retry, then pressing a key *
|
||||
* will return from this function. Otherwise, it will exit the program with "exit()". *
|
||||
* *
|
||||
* INPUT: error -- The error number (same as the DOSERR.H error numbers). *
|
||||
* *
|
||||
* canretry -- Can this routine exit normally so that retrying can occur? If this is *
|
||||
* false, then the program WILL exit in this routine. *
|
||||
* *
|
||||
* filename -- Optional filename to report with this error. If no filename is *
|
||||
* supplied, then no filename is listed in the error message. *
|
||||
* *
|
||||
* OUTPUT: none, but this routine might not return at all if the "canretry" parameter is *
|
||||
* false or the player pressed ESC. *
|
||||
* *
|
||||
* WARNINGS: This routine may not return at all. It handles being in text mode as well as *
|
||||
* if in a graphic mode. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/17/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void CCFileClass::Error(int , int , char const * )
|
||||
{
|
||||
#ifdef DEMO
|
||||
if (strstr(File_Name(), "\\")) {
|
||||
if (!Force_CD_Available(-1)) {
|
||||
Prog_End();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (!Force_CD_Available(RequiredCD)) {
|
||||
Prog_End();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::CCFileClass -- Filename based constructor for C&C file. *
|
||||
* *
|
||||
* Use this constructor for a file when the filename is known at construction time. *
|
||||
* *
|
||||
* INPUT: filename -- Pointer to the filename to use for this file object. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: The filename pointer is presumed to be inviolate throughout the duration of *
|
||||
* the file object. If this is not guaranteed, then use the default constructor *
|
||||
* and then set the name manually. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/20/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
CCFileClass::CCFileClass(char const *filename) :
|
||||
CDFileClass(),
|
||||
FromDisk(false),
|
||||
Pointer(0),
|
||||
Position(0),
|
||||
Length(0),
|
||||
Start(0)
|
||||
{
|
||||
Set_Name(filename);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::CCFileClass -- Default constructor for file object. *
|
||||
* *
|
||||
* This is the default constructor for a C&C file object. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/20/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
CCFileClass::CCFileClass(void)
|
||||
{
|
||||
FromDisk = false;
|
||||
Pointer = 0;
|
||||
Position = 0;
|
||||
Length = 0;
|
||||
Start = 0;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Write -- Writes data to the file (non mixfile files only). *
|
||||
* *
|
||||
* This routine will write data to the file, but NOT to a file that is part of a mixfile. *
|
||||
* *
|
||||
* INPUT: buffer -- Pointer to the buffer that holds the data to be written. *
|
||||
* *
|
||||
* size -- The number of bytes to write. *
|
||||
* *
|
||||
* OUTPUT: Returns the number of bytes actually written. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
long CCFileClass::Write(void const *buffer, long size)
|
||||
{
|
||||
|
||||
/*
|
||||
** If this is part of a mixfile, then writing is not allowed. Error out with a fatal
|
||||
** message.
|
||||
*/
|
||||
if (Pointer || FromDisk) {
|
||||
Error(EACCES, false, File_Name());
|
||||
}
|
||||
|
||||
return(CDFileClass::Write(buffer, size));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Read -- Reads data from the file. *
|
||||
* *
|
||||
* This routine determines if the file is part of the mixfile system. If it is, then *
|
||||
* the file is copied from RAM if it is located there. Otherwise it is read from disk *
|
||||
* according to the correct position of the file within the parent mixfile. *
|
||||
* *
|
||||
* INPUT: buffer -- Pointer to the buffer to place the read data. *
|
||||
* *
|
||||
* size -- The number of bytes to read. *
|
||||
* *
|
||||
* OUTPUT: Returns the actual number of bytes read (this could be less than requested). *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
long CCFileClass::Read(void *buffer, long size)
|
||||
{
|
||||
int opened = false;
|
||||
|
||||
if (!Is_Open()) {
|
||||
if (Open()) {
|
||||
opened = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** If the file is part of a loaded mixfile, then a mere copy is
|
||||
** all that is required for the read.
|
||||
*/
|
||||
if (Pointer) {
|
||||
long maximum = Length - Position;
|
||||
|
||||
size = MIN(maximum, size);
|
||||
if (size) {
|
||||
Mem_Copy(Add_Long_To_Pointer(Pointer, Position), buffer, size);
|
||||
Position += size;
|
||||
}
|
||||
if (opened) Close();
|
||||
return(size);
|
||||
}
|
||||
|
||||
/*
|
||||
** If the file is part of a mixfile, but the mixfile is located
|
||||
** on disk, then a special read operation is necessary.
|
||||
*/
|
||||
if (FromDisk) {
|
||||
long maximum = Length - Position;
|
||||
|
||||
size = MIN(maximum, size);
|
||||
if (size > 0) {
|
||||
CDFileClass::Seek(Start + Position, SEEK_SET);
|
||||
size = CDFileClass::Read(buffer, size);
|
||||
Position += size;
|
||||
}
|
||||
if (opened) Close();
|
||||
return(size);
|
||||
}
|
||||
|
||||
long s = CDFileClass::Read(buffer, size);
|
||||
if (opened) Close();
|
||||
return(s);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Seek -- Moves the current file pointer in the file. *
|
||||
* *
|
||||
* This routine will change the current file pointer to the position specified. It follows *
|
||||
* the same rules the a normal Seek() does, but if the file is part of the mixfile system, *
|
||||
* then only the position value needs to be updated. *
|
||||
* *
|
||||
* INPUT: pos -- The position to move the file to relative to the position indicated *
|
||||
* by the "dir" parameter. *
|
||||
* *
|
||||
* dir -- The direction to affect the position change against. This can be *
|
||||
* either SEEK_CUR, SEEK_END, or SEEK_SET. *
|
||||
* *
|
||||
* OUTPUT: Returns with the position of the new location. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
long CCFileClass::Seek(long pos, int dir)
|
||||
{
|
||||
if (Pointer || FromDisk) {
|
||||
switch (dir) {
|
||||
case SEEK_END:
|
||||
Position = Length;
|
||||
break;
|
||||
|
||||
case SEEK_SET:
|
||||
Position = 0;
|
||||
break;
|
||||
|
||||
case SEEK_CUR:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
Position += pos;
|
||||
if (Position < 0) Position = 0;
|
||||
if (Position > Length) Position = Length;
|
||||
return(Position);
|
||||
}
|
||||
return(CDFileClass::Seek(pos, dir));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Size -- Determines the size of the file. *
|
||||
* *
|
||||
* If the file is part of the mixfile system, then the size of the file is already *
|
||||
* determined and available. Otherwise, go to the low level system to find the file *
|
||||
* size. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the size of the file in bytes. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
long CCFileClass::Size(void)
|
||||
{
|
||||
if (Pointer || FromDisk) return(Length);
|
||||
|
||||
return(CDFileClass::Size());
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Is_Available -- Checks for existence of file on disk or in mixfile. *
|
||||
* *
|
||||
* This routine will examine the mixfile system looking for the file. If the file could *
|
||||
* not be found there, then the disk is examined directly. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Is the file available for opening? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int CCFileClass::Is_Available(int )
|
||||
{
|
||||
if (MixFileClass::Offset(File_Name())) {
|
||||
return(true);
|
||||
}
|
||||
return(CDFileClass::Is_Available());
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Is_Open -- Determines if the file is open. *
|
||||
* *
|
||||
* A mixfile is open if there is a pointer to the mixfile data. In absence of this, *
|
||||
* the the file is open if the file handle is valid. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Is the file open? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int CCFileClass::Is_Open(void) const
|
||||
{
|
||||
|
||||
/*
|
||||
** If the file is part of a cached file, then return that it is opened. A closed file
|
||||
** doesn't have a valid pointer.
|
||||
*/
|
||||
if (Pointer) return(true);
|
||||
return(CDFileClass::Is_Open());
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Close -- Closes the file. *
|
||||
* *
|
||||
* If this is a mixfile file, then only the pointers need to be adjusted. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void CCFileClass::Close(void)
|
||||
{
|
||||
FromDisk = false;
|
||||
Pointer = 0;
|
||||
Position = 0; // Starts at beginning offset.
|
||||
Start = 0;
|
||||
Length = 0;
|
||||
CDFileClass::Close();
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CCFileClass::Open -- Opens a file from either the mixfile system or the rawfile system. *
|
||||
* *
|
||||
* This routine will open the specified file. It examines the mixfile system to find a *
|
||||
* match. If one is found then the file is "opened" in a special cached way. Otherwise *
|
||||
* it is opened as a standard DOS file. *
|
||||
* *
|
||||
* INPUT: rights -- The access rights desired. *
|
||||
* *
|
||||
* OUTPUT: bool; Was the file opened successfully? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/08/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int CCFileClass::Open(int rights)
|
||||
{
|
||||
/*
|
||||
** Always close the file if it was open.
|
||||
*/
|
||||
Close();
|
||||
|
||||
/*
|
||||
** Perform a preliminary check to see if the specified file
|
||||
** exists on the disk. If it does, then open this file regardless
|
||||
** of whether it also exists in RAM. This is slower, but allows
|
||||
** upgrade files to work.
|
||||
*/
|
||||
if ((rights & WRITE) || CDFileClass::Is_Available()) {
|
||||
return(CDFileClass::Open(rights));
|
||||
}
|
||||
|
||||
/*
|
||||
** Check to see if file is part of a mixfile and that mixfile is currently loaded
|
||||
** into RAM.
|
||||
*/
|
||||
MixFileClass *mixfile = 0;
|
||||
if (MixFileClass::Offset(File_Name(), &Pointer, &mixfile, &Start, &Length)) {
|
||||
|
||||
/*
|
||||
** If the mixfile is located on disk, then fake out the file system to read from
|
||||
** the mixfile, but think it is reading from a solitary file.
|
||||
*/
|
||||
if (!Pointer) {
|
||||
long start = Start;
|
||||
long length = Length;
|
||||
|
||||
/*
|
||||
** This is a legitimate open to the file. All access to the file through this
|
||||
** file object will be appropriately adjusted for mixfile support however. Also
|
||||
** note that the filename attached to this object is NOT the same as the file
|
||||
** attached to the file handle.
|
||||
*/
|
||||
char const * dupfile = strdup(File_Name());
|
||||
Open(mixfile->Filename, READ);
|
||||
Searching(false); // Disable multi-drive search.
|
||||
Set_Name(dupfile);
|
||||
Searching(true);
|
||||
if (dupfile) free((void *)dupfile);
|
||||
Start = start;
|
||||
Length = length;
|
||||
FromDisk = true;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/*
|
||||
** The file cannot be found in any mixfile, so it must reside as
|
||||
** an individual file on the disk. Or else it is just plain missing.
|
||||
*/
|
||||
return(CDFileClass::Open(rights));
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************
|
||||
** Backward compatibility section.
|
||||
*/
|
||||
//extern "C" {
|
||||
|
||||
static CCFileClass Handles[10];
|
||||
|
||||
#ifdef NEVER
|
||||
bool __cdecl Set_Search_Drives(char const *)
|
||||
{
|
||||
CCFileClass::Set_Search_Path(path);
|
||||
return(true);
|
||||
}
|
||||
#endif
|
||||
|
||||
int __cdecl Open_File(char const *file_name, int mode)
|
||||
{
|
||||
for (int index = 0; index < sizeof(Handles)/sizeof(Handles[0]); index++) {
|
||||
if (!Handles[index].Is_Open()) {
|
||||
Handles[index].Set_Name(file_name);
|
||||
if (Handles[index].Open(mode)) {
|
||||
// if (Handles[index].Open(file_name, mode)) {
|
||||
return(index);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return(WW_ERROR);
|
||||
}
|
||||
|
||||
VOID __cdecl Close_File(int handle)
|
||||
{
|
||||
if (handle != WW_ERROR && Handles[handle].Is_Open()) {
|
||||
Handles[handle].Close();
|
||||
}
|
||||
}
|
||||
|
||||
LONG __cdecl Read_File(int handle, VOID *buf, ULONG bytes)
|
||||
{
|
||||
if (handle != WW_ERROR && Handles[handle].Is_Open()) {
|
||||
return(Handles[handle].Read(buf, bytes));
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
LONG __cdecl Write_File(int handle, VOID const *buf, ULONG bytes)
|
||||
{
|
||||
if (handle != WW_ERROR && Handles[handle].Is_Open()) {
|
||||
return(Handles[handle].Write(buf, bytes));
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
int __cdecl Find_File(char const *file_name)
|
||||
{
|
||||
CCFileClass file(file_name);
|
||||
return(file.Is_Available());
|
||||
}
|
||||
|
||||
#ifdef NEVER
|
||||
int __cdecl Delete_File(char const *file_name)
|
||||
{
|
||||
return(CCFileClass(file_name).Delete());
|
||||
}
|
||||
|
||||
int __cdecl Create_File(char const *file_name)
|
||||
{
|
||||
return(CCFileClass(file_name).Create());
|
||||
}
|
||||
|
||||
ULONG __cdecl Load_Data(char const *name, VOID *ptr, ULONG size)
|
||||
{
|
||||
return(CCFileClass(name).Read(ptr, size));
|
||||
}
|
||||
#endif
|
||||
|
||||
VOID * __cdecl Load_Alloc_Data(char const *name, int )
|
||||
{
|
||||
CCFileClass file(name);
|
||||
|
||||
return(Load_Alloc_Data(file));
|
||||
}
|
||||
|
||||
ULONG __cdecl File_Size(int handle)
|
||||
{
|
||||
if (handle != WW_ERROR && Handles[handle].Is_Open()) {
|
||||
return(Handles[handle].Size());
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
#ifdef NEVER
|
||||
ULONG __cdecl Write_Data(char const *name, VOID const *ptr, ULONG size)
|
||||
{
|
||||
return(CCFileClass(name).Write(ptr, size));
|
||||
}
|
||||
#endif
|
||||
|
||||
ULONG __cdecl Seek_File(int handle, LONG offset, int starting)
|
||||
{
|
||||
if (handle != WW_ERROR && Handles[handle].Is_Open()) {
|
||||
return(Handles[handle].Seek(offset, starting));
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
void WWDOS_Shutdown(void)
|
||||
{
|
||||
for (int index = 0; index < 10; index++) {
|
||||
Handles[index].Set_Name(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NEVER
|
||||
bool __cdecl Multi_Drive_Search(bool on)
|
||||
{
|
||||
// return(CCFileClass::Multi_Drive_Search(on));
|
||||
return(on);
|
||||
}
|
||||
|
||||
VOID __cdecl WWDOS_Init(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
VOID __cdecl WWDOS_Shutdown(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
int __cdecl Find_Disk_Number(char const *)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
//ULONG cdecl Load_Uncompress(BYTE const *file, BuffType uncomp_buff, BuffType dest_buff, VOID *reserved_data)
|
||||
//{
|
||||
// return(Load_Uncompress(CCFileClass(file), uncomp_buff, dest_buff, reserved_data));
|
||||
// return(CCFileClass(file).Load_Uncompress(uncomp_buff, dest_buff, reserved_data));
|
||||
//}
|
||||
|
||||
//extern "C" {
|
||||
//int MaxDevice;
|
||||
//int DefaultDrive;
|
||||
//char CallingDOSInt;
|
||||
|
||||
//}
|
||||
|
||||
|
||||
void Unfragment_File_Cache(void)
|
||||
{
|
||||
}
|
||||
|
114
CCFILE.H
Normal file
114
CCFILE.H
Normal file
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\ccfile.h_v 2.18 16 Oct 1995 16:45:28 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CCFILE.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : October 17, 1994 *
|
||||
* *
|
||||
* Last Update : October 17, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CCFILE_H
|
||||
#define CCFILE_H
|
||||
|
||||
#include <wwlib32.h>
|
||||
#include <limits.h>
|
||||
#include "mixfile.h"
|
||||
#include "cdfile.h"
|
||||
|
||||
|
||||
/*
|
||||
** This derived class for file access knows about mixfiles (packed files). It can handle opening
|
||||
** a file that is embedded within a mixfile. This is true if the mixfile is cached or resides on
|
||||
** disk. It is functionally similar to pakfiles, except much faster and less RAM intensive.
|
||||
*/
|
||||
class CCFileClass : public CDFileClass
|
||||
{
|
||||
public:
|
||||
CCFileClass(char const *filename);
|
||||
CCFileClass(void);
|
||||
virtual ~CCFileClass(void) {};
|
||||
|
||||
// Delete should be overloaded here as well. Don't allow deletes of mixfiles.
|
||||
|
||||
virtual int Open(char const *filename, int rights=READ) {Set_Name(filename);return Open(rights);};
|
||||
virtual int Open(int rights=READ);
|
||||
virtual int Is_Open(void) const;
|
||||
virtual int Is_Available(int forced=false);
|
||||
virtual long Read(void *buffer, long size);
|
||||
virtual long Seek(long pos, int dir=SEEK_CUR);
|
||||
virtual long Size(void);
|
||||
virtual long Write(void const *buffer, long size);
|
||||
virtual void Close(void);
|
||||
virtual void Error(int error, int canretry = false, char const * filename=NULL);
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
** This flag indicates that the file is part of a mixfile and the mixfile resides on
|
||||
** disk. The file handle for this file is a legitimate DOS handle, although special
|
||||
** handling is necessary that takes into account the embedded nature of the file.
|
||||
*/
|
||||
bool FromDisk;
|
||||
|
||||
/*
|
||||
** This indicates the file is actually part of a resident image of the mixfile
|
||||
** itself. In this case, the embedded file handle is invalid. All file access actually
|
||||
** gets routed through the cached version of the file. This is a pointer to the start
|
||||
** of the RAM image of the file.
|
||||
*/
|
||||
void * Pointer;
|
||||
|
||||
/*
|
||||
** This is the starting offset of the beginning of the file. This value is only valid
|
||||
** if the file is part of a mixfile that resides on disk. It serves as the counterpart
|
||||
** to the "Pointer" variable.
|
||||
*/
|
||||
long Start;
|
||||
|
||||
/*
|
||||
** This is the current seek position of the file. It is duplicated here if the file is
|
||||
** part of a mixfile since the DOS seek position is not accurate. This value will
|
||||
** range from zero to the size of the file in bytes.
|
||||
*/
|
||||
long Position;
|
||||
|
||||
/*
|
||||
** This is the size of the file if it was embedded in a mixfile. The size must be manually
|
||||
** kept track of because the DOS file size is invalid.
|
||||
*/
|
||||
long Length;
|
||||
|
||||
// Force these to never be invoked.
|
||||
CCFileClass const operator = (CCFileClass const & c);
|
||||
CCFileClass (CCFileClass const & ) {};
|
||||
};
|
||||
|
||||
#endif
|
16
CC_ICON.RC
Normal file
16
CC_ICON.RC
Normal file
|
@ -0,0 +1,16 @@
|
|||
/****************************************************************************
|
||||
|
||||
|
||||
CC_ICON.RC
|
||||
|
||||
produced by Borland Resource Workshop
|
||||
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include "cc_icon.rh"
|
||||
|
||||
|
||||
|
||||
ICON_1 ICON "conquer.ico"
|
||||
|
1
CC_ICON.RH
Normal file
1
CC_ICON.RH
Normal file
|
@ -0,0 +1 @@
|
|||
#define ICON_1 1
|
508
CDFILE.CPP
Normal file
508
CDFILE.CPP
Normal file
|
@ -0,0 +1,508 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\cdfile.cpv 2.18 16 Oct 1995 16:48:10 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Westwood Library *
|
||||
* *
|
||||
* File Name : CDFILE.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : October 18, 1994 *
|
||||
* *
|
||||
* Last Update : October 18, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* CDFileClass::Clear_Search_Drives -- Removes all record of a search path. *
|
||||
* CDFileClass::Open -- Opens the file object -- with path search. *
|
||||
* CDFileClass::Open -- Opens the file wherever it can be found. *
|
||||
* CDFileClass::Set_Name -- Performs a multiple directory scan to set the filename. *
|
||||
* CDFileClass::Set_Search_Drives -- Sets a list of search paths for file access. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
//#include "cdfile.h"
|
||||
|
||||
/*
|
||||
** Pointer to the first search path record.
|
||||
*/
|
||||
CDFileClass::SearchDriveType * CDFileClass::First = 0;
|
||||
|
||||
int CDFileClass::CurrentCDDrive = 0;
|
||||
int CDFileClass::LastCDDrive = 0;
|
||||
char CDFileClass::RawPath[512];
|
||||
|
||||
|
||||
|
||||
int __cdecl Is_Disk_Inserted(int disk)
|
||||
{
|
||||
struct find_t fb;
|
||||
char scan[] = "?:\\*.*";
|
||||
|
||||
scan[0] = 'A' + disk;
|
||||
return(_dos_findfirst(scan, _A_SUBDIR, &fb) == 0);
|
||||
}
|
||||
|
||||
|
||||
CDFileClass::CDFileClass(char const *filename) :
|
||||
IsDisabled(false)
|
||||
{
|
||||
Set_Name(filename);
|
||||
memset (RawPath, 0, sizeof(RawPath));
|
||||
}
|
||||
|
||||
|
||||
CDFileClass::CDFileClass(void) :
|
||||
IsDisabled(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFileClass::Open -- Opens the file object -- with path search. *
|
||||
* *
|
||||
* This will open the file object, but since the file object could have been constructed *
|
||||
* with a pathname, this routine will try to find the file first. For files opened for *
|
||||
* writing, then use the existing filename without performing a path search. *
|
||||
* *
|
||||
* INPUT: rights -- The access rights to use when opening the file *
|
||||
* *
|
||||
* OUTPUT: bool; Was the open successful? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/18/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int CDFileClass::Open(int rights)
|
||||
{
|
||||
return(RawFileClass::Open(rights));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFC::Refresh_Search_Drives -- Updates the search path when a CD changes or is added *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 5/22/96 9:01AM ST : Created *
|
||||
*=============================================================================================*/
|
||||
void CDFileClass::Refresh_Search_Drives (void)
|
||||
{
|
||||
Clear_Search_Drives();
|
||||
Set_Search_Drives(RawPath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFileClass::Set_Search_Drives -- Sets a list of search paths for file access. *
|
||||
* *
|
||||
* This routine sets up a list of search paths to use when accessing files. The path list *
|
||||
* is scanned if the file could not be found in the current directory. This is the primary *
|
||||
* method of supporting CD-ROM drives, but is also useful for scanning network and other *
|
||||
* directories. The pathlist as passed to this routine is of the same format as the path *
|
||||
* list used by DOS -- paths are separated by semicolons and need not end in an antivirgule.*
|
||||
* *
|
||||
* If a path entry begins with "?:" then the question mark will be replaced with the first *
|
||||
* CD-ROM drive letter available. If there is no CD-ROM driver detected, then this path *
|
||||
* entry will be ignored. By using this feature, you can always pass the CD-ROM path *
|
||||
* specification to this routine and it will not break if the CD-ROM is not loaded (as in *
|
||||
* the case during development). *
|
||||
* *
|
||||
* Here is an example path specification: *
|
||||
* *
|
||||
* Set_Search_Drives("DATA;?:\DATA;F:\PROJECT\DATA"); *
|
||||
* *
|
||||
* In this example, the current directory will be searched first, followed by a the *
|
||||
* subdirectory "DATA" located off of the current directory. If not found, then the CD-ROM *
|
||||
* will be searched in a directory called "\DATA". If not found or the CD-ROM is not *
|
||||
* present, then it will look to the hard coded path of "F:\PROJECTS\DATA" (maybe a *
|
||||
* network?). If all of these searches fail, the file system will default to the current *
|
||||
* directory and let the normal file error system take over. *
|
||||
* *
|
||||
* INPUT: pathlist -- Pointer to string of path specifications (separated by semicolons) *
|
||||
* that will be used to search for files. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/18/1994 JLB : Created. *
|
||||
* 05/21/1996 ST : Modified to recognise multiple CD drives *
|
||||
*=============================================================================================*/
|
||||
int CDFileClass::Set_Search_Drives(char * pathlist)
|
||||
{
|
||||
int found = FALSE;
|
||||
int empty = FALSE;
|
||||
/*
|
||||
** If there is no pathlist to add, then just return.
|
||||
*/
|
||||
if (!pathlist) return(0);
|
||||
|
||||
/*
|
||||
** Save the path as it was passed in so we can parse it again later.
|
||||
** Check for the case where RawPath was passed in.
|
||||
*/
|
||||
if (pathlist != RawPath){
|
||||
strcat (RawPath, ";");
|
||||
strcat (RawPath, pathlist);
|
||||
}
|
||||
|
||||
char const * ptr = strtok(pathlist, ";");
|
||||
while (ptr) {
|
||||
if (strlen(ptr)){
|
||||
|
||||
char path[PATH_MAX]; // Working path buffer.
|
||||
|
||||
/*
|
||||
** Fixup the path to be legal. Legal is defined as all that is necessary to
|
||||
** create a pathname is to append the actual filename submitted to the
|
||||
** file system. This means that it must have either a trailing ':' or '\'
|
||||
** character.
|
||||
*/
|
||||
strcpy(path, ptr);
|
||||
switch (path[strlen(path)-1]) {
|
||||
case ':':
|
||||
case '\\':
|
||||
break;
|
||||
|
||||
default:
|
||||
strcat(path, "\\");
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
** If there is a drive letter specified, and this drive letter is '?', then it should
|
||||
** be substituted with the CD-ROM drive letter. In the case of no CD-ROM attached, then
|
||||
** merely ignore this path entry.
|
||||
*/
|
||||
if (strncmp(path, "?:", 2) == 0) {
|
||||
if (CurrentCDDrive){
|
||||
found = TRUE;
|
||||
/*
|
||||
** If the drive has a C&C CD in it then add it to the path
|
||||
*/
|
||||
if (Get_CD_Index(CurrentCDDrive, 2*60) >= 0){
|
||||
path[0] = CurrentCDDrive + 'A';
|
||||
Add_Search_Drive(path);
|
||||
}
|
||||
}
|
||||
/*
|
||||
** Find the next path string and resubmit.
|
||||
*/
|
||||
ptr = strtok(NULL, ";");
|
||||
continue;
|
||||
}
|
||||
|
||||
found = TRUE;
|
||||
Add_Search_Drive(path);
|
||||
}
|
||||
|
||||
/*
|
||||
** Find the next path string and resubmit.
|
||||
*/
|
||||
ptr = strtok(NULL, ";");
|
||||
}
|
||||
if (!found) return(1);
|
||||
if (empty) return(2);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFC::Set_CD_Drive -- sets the current CD drive letter *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 5/22/96 9:39AM ST : Created *
|
||||
*=============================================================================================*/
|
||||
|
||||
void CDFileClass::Set_CD_Drive (int drive)
|
||||
{
|
||||
LastCDDrive = CurrentCDDrive;
|
||||
CurrentCDDrive = drive;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFC::Add_Search_Drive -- Add a new path to the search path list *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: path *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 5/22/96 10:12AM ST : Created *
|
||||
*=============================================================================================*/
|
||||
|
||||
void CDFileClass::Add_Search_Drive(char *path)
|
||||
{
|
||||
SearchDriveType *srch; // Working pointer to path object.
|
||||
/*
|
||||
** Allocate a record structure.
|
||||
*/
|
||||
srch = new SearchDriveType;
|
||||
|
||||
/*
|
||||
** Attach the path to this structure.
|
||||
*/
|
||||
srch->Path = strdup(path);
|
||||
srch->Next = NULL;
|
||||
|
||||
/*
|
||||
** Attach this path record to the end of the path chain.
|
||||
*/
|
||||
if (!First) {
|
||||
First = srch;
|
||||
} else {
|
||||
SearchDriveType * chain = First;
|
||||
|
||||
while (chain->Next) {
|
||||
chain = (SearchDriveType *)chain->Next;
|
||||
}
|
||||
chain->Next = srch;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFileClass::Clear_Search_Drives -- Removes all record of a search path. *
|
||||
* *
|
||||
* Use this routine to clear out any previous path(s) set with Set_Search_Drives() *
|
||||
* function. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/18/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void CDFileClass::Clear_Search_Drives(void)
|
||||
{
|
||||
SearchDriveType * chain; // Working pointer to path chain.
|
||||
|
||||
chain = First;
|
||||
while (chain) {
|
||||
SearchDriveType *next;
|
||||
|
||||
next = (SearchDriveType *)chain->Next;
|
||||
if (chain->Path) {
|
||||
free((char *)chain->Path);
|
||||
}
|
||||
delete chain;
|
||||
|
||||
chain = next;
|
||||
}
|
||||
First = 0;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFileClass::Set_Name -- Performs a multiple directory scan to set the filename. *
|
||||
* *
|
||||
* This routine will scan all the directories specified in the path list and if the file *
|
||||
* was found in one of the directories, it will set the filename to a composite of the *
|
||||
* correct directory and the filename. It is used to allow path searching when searching *
|
||||
* for files. Typical use is to support CD-ROM drives. This routine examines the current *
|
||||
* directory first before scanning through the path list. If after scanning the entire *
|
||||
* path list, the file still could not be found, then the file object's name is set with *
|
||||
* just the raw filename as passed to this routine. *
|
||||
* *
|
||||
* INPUT: filename -- Pointer to the filename to set as the name of this file object. *
|
||||
* *
|
||||
* OUTPUT: Returns a pointer to the final and complete filename of this file object. This *
|
||||
* may have a path attached to the file. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/18/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
char const * CDFileClass::Set_Name(char const *filename)
|
||||
{
|
||||
/*
|
||||
** Try to find the file in the current directory first. If it can be found, then
|
||||
** just return with the normal file name setting process. Do the same if there is
|
||||
** no multi-drive search path.
|
||||
*/
|
||||
RawFileClass::Set_Name(filename);
|
||||
if (IsDisabled || !First || RawFileClass::Is_Available()) {
|
||||
return(File_Name());
|
||||
}
|
||||
|
||||
/*
|
||||
** Attempt to find the file first. Check the current directory. If not found there, then
|
||||
** search all the path specifications available. If it still can't be found, then just
|
||||
** fall into the normal raw file filename setting system.
|
||||
*/
|
||||
SearchDriveType * srch = First;
|
||||
|
||||
while (srch) {
|
||||
char path[_MAX_PATH];
|
||||
|
||||
/*
|
||||
** Build a pathname to search for.
|
||||
*/
|
||||
strcpy(path, srch->Path);
|
||||
strcat(path, filename);
|
||||
|
||||
/*
|
||||
** Check to see if the file could be found. The low level Is_Available logic will
|
||||
** prompt if necessary when the CD-ROM drive has been removed. In all other cases,
|
||||
** it will return false and the search process will continue.
|
||||
*/
|
||||
RawFileClass::Set_Name(path);
|
||||
if (RawFileClass::Is_Available()) {
|
||||
return(File_Name());
|
||||
}
|
||||
|
||||
/*
|
||||
** It wasn't found, so try the next path entry.
|
||||
*/
|
||||
srch = (SearchDriveType *)srch->Next;
|
||||
}
|
||||
|
||||
/*
|
||||
** At this point, all path searching has failed. Just set the file name to the
|
||||
** plain text passed to this routine and be done with it.
|
||||
*/
|
||||
RawFileClass::Set_Name(filename);
|
||||
return(File_Name());
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CDFileClass::Open -- Opens the file wherever it can be found. *
|
||||
* *
|
||||
* This routine is similar to the RawFileClass open except that if the file is being *
|
||||
* opened only for READ access, it will search all specified directories looking for the *
|
||||
* file. If after a complete search the file still couldn't be found, then it is opened *
|
||||
* using the normal RawFileClass system -- resulting in normal error procedures. *
|
||||
* *
|
||||
* INPUT: filename -- Pointer to the override filename to supply for this file object. It *
|
||||
* would be the base filename (sans any directory specification). *
|
||||
* *
|
||||
* rights -- The access rights to use when opening the file. *
|
||||
* *
|
||||
* OUTPUT: bool; Was the file opened successfully? If so then the filename may be different *
|
||||
* than requested. The location of the file can be determined by examining the *
|
||||
* filename of this file object. The filename will contain the complete *
|
||||
* pathname used to open the file. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/18/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int CDFileClass::Open(char const *filename, int rights)
|
||||
{
|
||||
Close();
|
||||
|
||||
/*
|
||||
** Verify that there is a filename associated with this file object. If not, then this is a
|
||||
** big error condition.
|
||||
*/
|
||||
if (!filename) {
|
||||
Error(ENOENT, false);
|
||||
}
|
||||
|
||||
/*
|
||||
** If writing is requested, then multiple drive searching is not performed.
|
||||
*/
|
||||
if (IsDisabled || rights == WRITE) {
|
||||
return(RawFileClass::Open(filename, rights));
|
||||
}
|
||||
|
||||
/*
|
||||
** Perform normal multiple drive searching for the filename and open
|
||||
** using the normal procedure.
|
||||
*/
|
||||
Set_Name(filename);
|
||||
return(RawFileClass::Open(rights));
|
||||
}
|
||||
|
||||
|
||||
#ifdef NEVER
|
||||
/* Get the drive letters if the CD's online */
|
||||
WORD __cdecl GetCDDrive(VOID)
|
||||
{
|
||||
_ES = FP_SEG(&cdDrive[0]);
|
||||
_BX = FP_OFF(&cdDrive[0]);
|
||||
_AX = 0x150d;
|
||||
geninterrupt(0x2F);
|
||||
return((WORD)(*cdDrive));
|
||||
}
|
||||
#endif
|
||||
|
||||
int Get_CD_Drive(void)
|
||||
{
|
||||
#ifdef NEVER
|
||||
for (int index = 0; index < 26; index++) {
|
||||
union REGS regs;
|
||||
|
||||
regs.w.ax = 0x150B;
|
||||
regs.w.bx = 0;
|
||||
regs.w.cx = index;
|
||||
int386(0x2F, ®s, ®s);
|
||||
if (regs.w.bx == 0xADAD) {
|
||||
return(index);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
#else
|
||||
|
||||
// GetCDClass temp;
|
||||
// return(temp.GetCDDrive());
|
||||
return (0);
|
||||
#endif
|
||||
|
||||
}
|
115
CDFILE.H
Normal file
115
CDFILE.H
Normal file
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\cdfile.h_v 2.20 16 Oct 1995 16:45:58 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Westwood LIbrary *
|
||||
* *
|
||||
* File Name : CDFILE.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : October 18, 1994 *
|
||||
* *
|
||||
* Last Update : October 18, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CDFILE_H
|
||||
#define CDFILE_H
|
||||
|
||||
#include <dos.h>
|
||||
#include "rawfile.h"
|
||||
|
||||
/*
|
||||
** This class is derived from the raw file class. This class adds the functionality of searching
|
||||
** across multiple directories or drives. It is designed for the typical case of a CD-ROM game
|
||||
** were some data exists in the current directory (hard drive) and the rest exists on the CD-ROM.
|
||||
** Searching for the file occurs by first examining the current directory. If the file does not
|
||||
** exist there, then all the paths available are examined in turn until the file can be found.
|
||||
** For opening files to write, only the current directory is examined. The directory search order
|
||||
** is controlled by the path list as submitted to Set_Search_Drives(). The format of the path
|
||||
** string is the same as the DOS path string.
|
||||
*/
|
||||
class CDFileClass : public RawFileClass
|
||||
{
|
||||
public:
|
||||
CDFileClass(char const *filename);
|
||||
CDFileClass(void);
|
||||
virtual ~CDFileClass(void) {};
|
||||
|
||||
virtual char const * Set_Name(char const *filename);
|
||||
virtual int Open(char const *filename, int rights=READ);
|
||||
virtual int Open(int rights=READ);
|
||||
|
||||
void Searching(int on) {IsDisabled = !on;};
|
||||
|
||||
static bool Is_There_Search_Drives(void) {return(First != NULL);};
|
||||
static int Set_Search_Drives(char * pathlist);
|
||||
static void Add_Search_Drive(char *path);
|
||||
static void Clear_Search_Drives(void);
|
||||
static void Refresh_Search_Drives(void);
|
||||
static void Set_CD_Drive(int drive);
|
||||
static int Get_CD_Drive(void) {return(CurrentCDDrive);};
|
||||
static int Get_Last_CD_Drive(void) {return(LastCDDrive);};
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
** Is multi-drive searching disabled for this file object?
|
||||
*/
|
||||
unsigned IsDisabled:1;
|
||||
|
||||
/*
|
||||
** This is the control record for each of the drives specified in the search
|
||||
** path. There can be many such search paths available.
|
||||
*/
|
||||
typedef struct {
|
||||
void * Next; // Pointer to next search record.
|
||||
char const * Path; // Pointer to path string.
|
||||
} SearchDriveType;
|
||||
|
||||
/*
|
||||
** This points to the first path record.
|
||||
*/
|
||||
static SearchDriveType * First;
|
||||
|
||||
/*
|
||||
** This is a copy of the unparsed search path list
|
||||
*/
|
||||
static char RawPath[512];
|
||||
|
||||
/*
|
||||
** The drive letter of the current cd drive
|
||||
*/
|
||||
static int CurrentCDDrive;
|
||||
|
||||
/*
|
||||
** The drive letter of the last used CD drive
|
||||
*/
|
||||
static int LastCDDrive;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
253
CELL.H
Normal file
253
CELL.H
Normal file
|
@ -0,0 +1,253 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\cell.h_v 2.20 16 Oct 1995 16:45:36 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CELL.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 29, 1994 *
|
||||
* *
|
||||
* Last Update : April 29, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CELL_H
|
||||
#define CELL_H
|
||||
|
||||
#include "building.h"
|
||||
#include "unit.h"
|
||||
#include "template.h"
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
** Each cell on the map is controlled by the following structure.
|
||||
*/
|
||||
class CellClass
|
||||
{
|
||||
public:
|
||||
/*
|
||||
** Does this cell need to be updated on the radar map? If something changes in the cell
|
||||
** that might change the radar map imagery, then this flag will be set. It gets cleared
|
||||
** when the cell graphic is updated to the radar map.
|
||||
*/
|
||||
unsigned IsPlot:1;
|
||||
|
||||
/*
|
||||
** Does this cell contain the special placement cursor graphic? This graphic is
|
||||
** present when selecting a site for building placement.
|
||||
*/
|
||||
unsigned IsCursorHere:1;
|
||||
|
||||
/*
|
||||
** Is this cell mapped by the player? A mapped cell is visible. An unmapped cell
|
||||
** is covered in a dark shroud. In addition to visibility, mapped cells are the only
|
||||
** legal place for transports to land.
|
||||
*/
|
||||
unsigned IsMapped:1;
|
||||
|
||||
/*
|
||||
** If any part of this cell is visible (even just peeking out from under the shadow),
|
||||
** this this flag will be true. Mapped cells always have this flag set, but unmapped
|
||||
** cells might not -- it depends on where the shadow edge is located.
|
||||
*/
|
||||
unsigned IsVisible:1;
|
||||
|
||||
/*
|
||||
** Every cell can be assigned a trigger. The same trigger can be assigned to
|
||||
** multiple cells. This bitflag indicates whether this cell has a trigger.
|
||||
** The trigger pointers for all cells must be stored elsewhere.
|
||||
*/
|
||||
unsigned IsTrigger:1;
|
||||
|
||||
/*
|
||||
** Every cell can be assigned a waypoint. A waypoint can only be assigned
|
||||
** to one cell, and vice-versa. This bit simply indicates whether this
|
||||
** cell is assigned a waypoint or not.
|
||||
*/
|
||||
unsigned IsWaypoint:1;
|
||||
|
||||
/*
|
||||
** Is this cell currently under the radar map cursor? If so then it
|
||||
** needs to be updated whenever the map is updated.
|
||||
*/
|
||||
unsigned IsRadarCursor:1;
|
||||
|
||||
/*
|
||||
** If this cell contains a house flag, then this will be true. The actual house
|
||||
** flag it contains is specified by the Owner field.
|
||||
*/
|
||||
unsigned IsFlagged:1;
|
||||
|
||||
/*
|
||||
** This contains the icon number and set to use for the base
|
||||
** of the terrain. All rendering on an icon occurs AFTER the icon
|
||||
** specified by this element is rendered. It is the lowest of the low.
|
||||
*/
|
||||
TemplateType TType;
|
||||
unsigned char TIcon;
|
||||
|
||||
/*
|
||||
** The second layer of 'terrain' icons is represented by a simple
|
||||
** type number and a value byte. This is sufficient for handling
|
||||
** concrete and walls.
|
||||
*/
|
||||
OverlayType Overlay;
|
||||
unsigned char OverlayData;
|
||||
|
||||
/*
|
||||
** This is used to specify any special 'stain' overlay icon. This
|
||||
** typically includes infantry bodies or other temporary marks.
|
||||
*/
|
||||
SmudgeType Smudge;
|
||||
unsigned char SmudgeData;
|
||||
|
||||
/*
|
||||
** Smudges and walls need to record ownership values. For walls, this
|
||||
** allows adjacent building placement logic to work. For smudges, it
|
||||
** allows building over smudges that are no longer attached to buildings
|
||||
** in addition to fixing the adjacent placement logic.
|
||||
*/
|
||||
HousesType Owner;
|
||||
|
||||
/*
|
||||
** This flag tells you what type of infantry currently occupy the
|
||||
** cell or are moving into it.
|
||||
*/
|
||||
HousesType InfType;
|
||||
|
||||
/*
|
||||
** These point to the object(s) that are located in this cell or overlap
|
||||
** this cell.
|
||||
*/
|
||||
ObjectClass *OccupierPtr;
|
||||
ObjectClass *Overlapper[3];
|
||||
|
||||
/*
|
||||
** This array of bit flags is used to indicate which sub positions
|
||||
** within the cell are either occupied or are soon going to be
|
||||
** occupied. For vehicles, the cells that the vehicle is passing over
|
||||
** will be flagged with the vehicle bit. For infantry, the the sub
|
||||
** position the infantry is stopped at or headed toward will be marked.
|
||||
** The sub positions it passes over will NOT be marked.
|
||||
*/
|
||||
union {
|
||||
struct {
|
||||
unsigned Center:1;
|
||||
unsigned NW:1;
|
||||
unsigned NE:1;
|
||||
unsigned SW:1;
|
||||
unsigned SE:1;
|
||||
unsigned Vehicle:1; // Reserved for vehicle occupation.
|
||||
unsigned Monolith:1; // Some immovable blockage is in cell.
|
||||
unsigned Building:1; // A building of some time (usually blocks movement).
|
||||
} Occupy;
|
||||
unsigned char Composite;
|
||||
} Flag;
|
||||
|
||||
//----------------------------------------------------------------
|
||||
CellClass(void);
|
||||
~CellClass(void) {};
|
||||
|
||||
int operator == (CellClass const & cell) const {return &cell == this;};
|
||||
|
||||
/*
|
||||
** Query functions.
|
||||
*/
|
||||
ObjectClass * Cell_Occupier(void) const;
|
||||
static int Spot_Index(COORDINATE coord);
|
||||
bool Is_Spot_Free(int spot_index) const {return (! (Flag.Composite & (1 << spot_index)) ); }
|
||||
COORDINATE Closest_Free_Spot(COORDINATE coord, bool any=false) const;
|
||||
COORDINATE Free_Spot(void) const {return Closest_Free_Spot(Cell_Coord());};
|
||||
bool Is_Generally_Clear(void) const;
|
||||
TARGET As_Target(void) const {return ::As_Target(Cell_Number());};
|
||||
BuildingClass * Cell_Building(void) const;
|
||||
CellClass const & Adjacent_Cell(FacingType face) const;
|
||||
CellClass & Adjacent_Cell(FacingType face) {return (CellClass &)((*((CellClass const *)this)).Adjacent_Cell(face));};
|
||||
COORDINATE Cell_Coord(void) const;
|
||||
int Cell_Color(bool override=false) const;
|
||||
CELL Cell_Number(void) const;
|
||||
LandType Land_Type(void) const {return Land;};
|
||||
ObjectClass * Cell_Find_Object(RTTIType rtti) const;
|
||||
ObjectClass * Cell_Object(int x=0, int y=0) const;
|
||||
TechnoClass * Cell_Techno(int x=0, int y=0) const;
|
||||
TerrainClass * Cell_Terrain(void) const;
|
||||
UnitClass * Cell_Unit(void) const;
|
||||
InfantryClass * Cell_Infantry(void) const;
|
||||
TriggerClass * Get_Trigger(void) const;
|
||||
int Clear_Icon(void) const;
|
||||
bool Goodie_Check(FootClass * object);
|
||||
ObjectClass * Fetch_Occupier(void) const;
|
||||
|
||||
/*
|
||||
** Object placement and removal flag operations.
|
||||
*/
|
||||
void Occupy_Down(ObjectClass * object);
|
||||
void Occupy_Up(ObjectClass * object);
|
||||
void Overlap_Down(ObjectClass * object);
|
||||
void Overlap_Up(ObjectClass * object);
|
||||
bool Flag_Place(HousesType house);
|
||||
bool Flag_Remove(void);
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
bool Should_Save(void) const;
|
||||
bool Save(FileClass & file);
|
||||
bool Load(FileClass & file);
|
||||
void Code_Pointers(void);
|
||||
void Decode_Pointers(void);
|
||||
|
||||
/*
|
||||
** Display and rendering controls.
|
||||
*/
|
||||
void Draw_It(int x, int y, int draw_flags = 0) const;
|
||||
void Redraw_Objects(bool forced=false);
|
||||
void Shimmer(void);
|
||||
|
||||
/*
|
||||
** Maintenance calculation support.
|
||||
*/
|
||||
long Tiberium_Adjust(bool pregame=false);
|
||||
void Wall_Update(void);
|
||||
void Concrete_Calc(void);
|
||||
void Recalc_Attributes(void);
|
||||
int Reduce_Tiberium(int levels);
|
||||
int Reduce_Wall(int damage);
|
||||
void Incoming(COORDINATE threat=0, bool forced = false);
|
||||
void Adjust_Threat(HousesType house, int threat_value);
|
||||
|
||||
int operator != (CellClass const &) const {return 0;};
|
||||
|
||||
int Validate(void) const;
|
||||
|
||||
private:
|
||||
CellClass (CellClass const &) {};
|
||||
|
||||
LandType Land; // The land type of this cell.
|
||||
};
|
||||
|
||||
#endif
|
72
CHECKBOX.CPP
Normal file
72
CHECKBOX.CPP
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\checkbox.cpv 1.6 16 Oct 1995 16:49:36 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CHECKBOX.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 05/26/95 *
|
||||
* *
|
||||
* Last Update : July 1, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* CheckBoxClass::Draw_Me -- Draws the checkbox imagery. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
#include "checkbox.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CheckBoxClass::Draw_Me -- Draws the checkbox imagery. *
|
||||
* *
|
||||
* This routine will draw the checkbox either filled or empty as necessary. *
|
||||
* *
|
||||
* INPUT: forced -- Should the check box be drawn even if it doesn't think it needs to? *
|
||||
* *
|
||||
* OUTPUT: Was the check box rendered? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/01/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int CheckBoxClass::Draw_Me(int forced)
|
||||
{
|
||||
if (ToggleClass::Draw_Me(forced)) {
|
||||
|
||||
Hide_Mouse();
|
||||
Draw_Box(X, Y, Width, Height, BOXSTYLE_GREEN_DOWN, false);
|
||||
LogicPage->Fill_Rect(X+1, Y+1, X+Width-2, Y+Height-2, DKGREY);
|
||||
if (IsOn) {
|
||||
LogicPage->Draw_Line(X+1, Y+1, X+Width-2, Y+Height-2, BLACK);
|
||||
LogicPage->Draw_Line(X+Width-2, Y+1, X+1, Y+Height-2, BLACK);
|
||||
}
|
||||
Show_Mouse();
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
55
CHECKBOX.H
Normal file
55
CHECKBOX.H
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\checkbox.h_v 1.6 16 Oct 1995 16:46:00 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CHECKBOX.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 05/26/95 *
|
||||
* *
|
||||
* Last Update : May 26, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CHECKBOX_H
|
||||
#define CHECKBOX_H
|
||||
|
||||
#include "toggle.h"
|
||||
|
||||
class CheckBoxClass : public ToggleClass
|
||||
{
|
||||
public:
|
||||
CheckBoxClass(unsigned id, int x, int y) :
|
||||
ToggleClass(id, x, y, 7, 7)
|
||||
{};
|
||||
|
||||
virtual int Draw_Me(int forced=false);
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
#endif
|
168
CHEKLIST.CPP
Normal file
168
CHEKLIST.CPP
Normal file
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\cheklist.cpv 2.18 16 Oct 1995 16:48:36 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CHEKLIST.CPP *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : February 16, 1995 *
|
||||
* *
|
||||
* Last Update : February 16, 1995 [BR] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* CheckListClass::Action -- action function for this class *
|
||||
* CheckListClass::CheckListClass -- constructor *
|
||||
* CheckListClass::Check_Item -- [un]checks an items *
|
||||
* CheckListClass::~CheckListClass -- destructor *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* CheckListClass::CheckListClass -- constructor *
|
||||
* *
|
||||
* INPUT: *
|
||||
* id control ID for this list box *
|
||||
* x x-coord *
|
||||
* y y-coord *
|
||||
* w width *
|
||||
* h height *
|
||||
* flags mouse event flags *
|
||||
* up ptr to Up-arrow shape *
|
||||
* down ptr to Down-arrow shape *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/16/1995 BR : Created. *
|
||||
*=========================================================================*/
|
||||
CheckListClass::CheckListClass(int id, int x, int y, int w, int h, TextPrintType flags,
|
||||
void const * up, void const * down) :
|
||||
ListClass (id, x, y, w, h, flags, up, down)
|
||||
{
|
||||
IsReadOnly = false;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* CheckListClass::Check_Item -- [un]checks an items *
|
||||
* *
|
||||
* INPUT: *
|
||||
* index index of item to check or uncheck *
|
||||
* checked 0 = uncheck, non-zero = check *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/16/1995 BR : Created. *
|
||||
*=========================================================================*/
|
||||
void CheckListClass::Check_Item(int index, int checked)
|
||||
{
|
||||
if (List[index]) {
|
||||
((char &)List[index][0]) = checked ? CHECK_CHAR : UNCHECK_CHAR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* CheckListClass::Is_Checked -- returns checked state of an item *
|
||||
* *
|
||||
* INPUT: *
|
||||
* index index of item to query *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* 0 = item is unchecked, 1 = item is checked *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/16/1995 BR : Created. *
|
||||
*=========================================================================*/
|
||||
int CheckListClass::Is_Checked(int index) const
|
||||
{
|
||||
if (List[index]) {
|
||||
return(List[index][0] == CHECK_CHAR);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* CheckListClass::Action -- action function for this class *
|
||||
* *
|
||||
* INPUT: *
|
||||
* flags the reason we're being called *
|
||||
* key the KN_number that was pressed *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = event was processed, false = event not processed *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/16/1995 BR : Created. *
|
||||
*=========================================================================*/
|
||||
int CheckListClass::Action(unsigned flags, KeyNumType &key)
|
||||
{
|
||||
int rc;
|
||||
|
||||
/*
|
||||
** If this is a read-only list, it's a display-only device
|
||||
*/
|
||||
if (IsReadOnly) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
/*
|
||||
** Invoke parents Action first, so it can set the SelectedIndex if needed.
|
||||
*/
|
||||
rc = ListClass::Action(flags, key);
|
||||
|
||||
/*
|
||||
** Now, if this event was a left-press, toggle the checked state of the
|
||||
** current item.
|
||||
*/
|
||||
if (flags & LEFTPRESS) {
|
||||
if (Is_Checked(SelectedIndex)) {
|
||||
Check_Item(SelectedIndex,0);
|
||||
} else {
|
||||
Check_Item(SelectedIndex,1);
|
||||
}
|
||||
}
|
||||
|
||||
return(rc);
|
||||
}
|
86
CHEKLIST.H
Normal file
86
CHEKLIST.H
Normal file
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\cheklist.h_v 2.19 16 Oct 1995 16:46:20 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CHEKLIST.H *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : February 16, 1995 *
|
||||
* *
|
||||
* Last Update : February 16, 1995 [BR] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* This class behaves just like the standard list box, except that if the *
|
||||
* first character of a list entry is a space, clicking on it toggles the *
|
||||
* space with a check-mark ('\3'). This makes each entry in the list box *
|
||||
* "toggle-able". *
|
||||
*-------------------------------------------------------------------------*
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CHEKLIST_H
|
||||
#define CHEKLIST_H
|
||||
|
||||
#include "list.h"
|
||||
|
||||
|
||||
class CheckListClass : public ListClass
|
||||
{
|
||||
public:
|
||||
/*---------------------------------------------------------------------
|
||||
Constructor/Destructor
|
||||
---------------------------------------------------------------------*/
|
||||
CheckListClass(int id, int x, int y, int w, int h, TextPrintType flags,
|
||||
void const * up, void const * down);
|
||||
~CheckListClass(void) {};
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
Checkmark utility functions
|
||||
---------------------------------------------------------------------*/
|
||||
void Check_Item(int index, int checked); // sets checked state of item
|
||||
int Is_Checked(int index) const; // gets checked state of item
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
This defines the ASCII value of the checkmark character & non-checkmark
|
||||
character.
|
||||
---------------------------------------------------------------------*/
|
||||
enum CheckListClassEnum {
|
||||
CHECK_CHAR = '\3',
|
||||
UNCHECK_CHAR = ' ',
|
||||
};
|
||||
|
||||
void Set_Read_Only(int rdonly) {IsReadOnly = rdonly;}
|
||||
|
||||
protected:
|
||||
virtual int Action(unsigned flags, KeyNumType &key);
|
||||
|
||||
private:
|
||||
bool IsReadOnly;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
/************************** end of cheklist.h ******************************/
|
67
CO-WC32.LNT
Normal file
67
CO-WC32.LNT
Normal file
|
@ -0,0 +1,67 @@
|
|||
// Compiler Options for Watcom C, C++ 32 bit
|
||||
|
||||
-cwc
|
||||
|
||||
// This file contains options to allow PC-lint to process source
|
||||
// files for your compiler. It is used as follows:
|
||||
//
|
||||
// lint co-wc32.lnt source-file(s)
|
||||
//
|
||||
-d_M_IX86=200 // assume Intel 80286 architecture -- modify to suit
|
||||
-d__declspec()= // ignore this construct
|
||||
|
||||
// additional reserve words needed
|
||||
+rw(_loadds,_export)
|
||||
+rw(__interrupt,__near,__far,__huge,__fortran,__pascal,__cdecl)
|
||||
+rw(__export,__loadds,__saveregs,__asm,__fastcall,__stdcall)
|
||||
+rw(_export)
|
||||
|
||||
+fcd // makes cdecl significant -- used for proto generation
|
||||
+fcu // chars are by default unsigned
|
||||
+fsu // so are strings
|
||||
-d__386__ // pre-defined macro for 386 version, not set by -cwc
|
||||
-d__FLAT__ // not set by -cwc
|
||||
-si4 // sizeof(int) is 4
|
||||
-spN4 // sizeof(near pointer) is 4
|
||||
-spF6 // sizeof( far pointer) is 6
|
||||
-sld10 // sizeof(long double) is 10.
|
||||
-function(exit,_exit) // _exit() is like exit()
|
||||
-emacro(734,putc) // don't complain about items being too large.
|
||||
-emacro(506,putc) // don't complain about constant Boolean
|
||||
-emacro(???,va_arg) // the va_arg() macro can yield 415, 416, 661, 662
|
||||
// 796 and 797 (out-of-bounds errors).
|
||||
|
||||
// While processing compiler (library) header files ...
|
||||
-elib(46) // an unsigned short bit field is used as __FILLER__
|
||||
-elib(522) // function return value ignored
|
||||
-elib(537) // repeated include file (ios.h)
|
||||
-elib(641) // converting enum to int
|
||||
-elib(652) // suppress message about #define of earlier declared symbols
|
||||
-elib(655) // ORing enum's
|
||||
-elib(726) // extraneous comma in enumeration
|
||||
-elib(760) // suppress message about multiple identical macro defs
|
||||
-elib(762) // suppress message about multiple identical declarations and
|
||||
-elib(806) // small bit field is signed
|
||||
-elib(1053) // prototypes cannot be distinguished
|
||||
-elib(1511) // member (rdbuf) hides nonvirtual member
|
||||
-elib(1704) // private copy constructor
|
||||
-elib(1712) // default constructor missing
|
||||
-elib(1717) // empty prototypes
|
||||
-elib(1720) // strange argument to assignment operator
|
||||
-elib(1721) // unusual operator =() declaration
|
||||
-elib(1722) // assignment operator does not return ref to class
|
||||
-elib(1724) // strange argument to copy constructor
|
||||
|
||||
-esym(1702,operator<<,operator>>)
|
||||
|
||||
// The following functions exhibit variable return modes.
|
||||
// That is, they may equally-usefully be called for a value
|
||||
// as called just for their effects. Accordingly we inhibit
|
||||
// Warning 534 for these functions.
|
||||
// Feel free to add to or subtract from this list.
|
||||
|
||||
-esym(534,close,creat,fclose,fflush,fprintf,fputc)
|
||||
-esym(534,fputs,fscanf,fseek,fwrite,lseek,memcpy,memmove,memset)
|
||||
-esym(534,printf,puts,scanf,sprintf,sscanf,strcat,strcpy)
|
||||
-esym(534,strncat,strncpy,unlink,write)
|
||||
|
283
COLRLIST.CPP
Normal file
283
COLRLIST.CPP
Normal file
|
@ -0,0 +1,283 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\colrlist.cpv 1.9 16 Oct 1995 16:50:02 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : LIST.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 01/15/95 *
|
||||
* *
|
||||
* Last Update : April 19, 1995 [BRR] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* ColorListClass::Add_Item -- Adds an item to the list *
|
||||
* ColorListClass::ColorListClass -- Class constructor *
|
||||
* ColorListClass::Draw_Entry -- Draws one text line *
|
||||
* ColorListClass::Remove_Item -- Removes an item from the list *
|
||||
* ColorListClass::Set_Selected_Style -- tells how to draw selected item *
|
||||
* ColorListClass::~ColorListClass -- Class destructor *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ColorListClass::ColorListClass -- class constructor *
|
||||
* *
|
||||
* INPUT: *
|
||||
* id button ID *
|
||||
* x,y upper-left corner, in pixels *
|
||||
* w,h width, height, in pixels *
|
||||
* list ptr to array of char strings to list *
|
||||
* flags flags for mouse, style of listbox *
|
||||
* up,down pointers to shapes for up/down buttons *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: 01/05/1995 MML : Created. *
|
||||
*=========================================================================*/
|
||||
ColorListClass::ColorListClass (int id, int x, int y, int w, int h,
|
||||
TextPrintType flags, void const * up, void const * down) :
|
||||
ListClass (id, x, y, w, h, flags, up, down)
|
||||
{
|
||||
Style = SELECT_HIGHLIGHT;
|
||||
SelectColor = -1;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ColorListClass::~ColorListClass -- Class destructor *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/19/1995 BRR : Created. *
|
||||
*=========================================================================*/
|
||||
ColorListClass::~ColorListClass(void)
|
||||
{
|
||||
Colors.Clear();
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ColorListClass::Add_Item -- Adds an item to the list *
|
||||
* *
|
||||
* INPUT: *
|
||||
* text text to add to list *
|
||||
* color color for item *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* position of item in the list *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/19/1995 BRR : Created. *
|
||||
*=========================================================================*/
|
||||
int ColorListClass::Add_Item(char const * text, char color)
|
||||
{
|
||||
Colors.Add(color);
|
||||
return(ListClass::Add_Item(text));
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ColorListClass::Add_Item -- Adds an item to the list *
|
||||
* *
|
||||
* INPUT: *
|
||||
* text text to add to list *
|
||||
* color color for item *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* position of item in the list *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/19/1995 BRR : Created. *
|
||||
*=========================================================================*/
|
||||
int ColorListClass::Add_Item(int text, char color)
|
||||
{
|
||||
Colors.Add(color);
|
||||
return(ListClass::Add_Item(text));
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ColorListClass::Remove_Item -- Removes an item from the list *
|
||||
* *
|
||||
* INPUT: *
|
||||
* text ptr to item to remove *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/19/1995 BRR : Created. *
|
||||
*=========================================================================*/
|
||||
void ColorListClass::Remove_Item(char const * text)
|
||||
{
|
||||
int index = List.ID(text);
|
||||
if (index != -1) {
|
||||
Colors.Delete(index);
|
||||
ListClass::Remove_Item(text);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ColorListClass::Set_Selected_Style -- tells how to draw selected item *
|
||||
* *
|
||||
* INPUT: *
|
||||
* style style to draw *
|
||||
* color color to draw the special style in; -1 = use item's color*
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/19/1995 BRR : Created. *
|
||||
*=========================================================================*/
|
||||
void ColorListClass::Set_Selected_Style(SelectStyleType style, int color)
|
||||
{
|
||||
Style = style;
|
||||
SelectColor = color;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ColorListClass::Draw_Entry -- Draws one text line *
|
||||
* *
|
||||
* INPUT: *
|
||||
* index index into List of item to draw *
|
||||
* x,y x,y coords to draw at *
|
||||
* width maximum width allowed for text *
|
||||
* selected true = this item is selected *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/19/1995 BRR : Created. *
|
||||
*=========================================================================*/
|
||||
void ColorListClass::Draw_Entry(int index, int x, int y, int width, int selected)
|
||||
{
|
||||
int color;
|
||||
|
||||
/*
|
||||
** Draw a non-selected item in its color
|
||||
*/
|
||||
if (!selected) {
|
||||
Conquer_Clip_Text_Print(List[index], x, y, Colors[index], TBLACK, TextFlags, width, Tabs);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
** For selected items, choose the right color & style:
|
||||
*/
|
||||
if (SelectColor==-1) {
|
||||
color = Colors[index];
|
||||
} else {
|
||||
color = SelectColor;
|
||||
}
|
||||
|
||||
switch (Style) {
|
||||
/*
|
||||
** NONE: Just print the string in its native color
|
||||
*/
|
||||
case SELECT_NONE:
|
||||
Conquer_Clip_Text_Print(List[index], x, y, Colors[index], TBLACK, TextFlags, width, Tabs);
|
||||
break;
|
||||
|
||||
/*
|
||||
** HIGHLIGHT: Draw the string in the highlight color (SelectColor must
|
||||
** be set)
|
||||
*/
|
||||
case SELECT_HIGHLIGHT:
|
||||
if (TextFlags & TPF_6PT_GRAD) {
|
||||
Conquer_Clip_Text_Print(List[index], x, y, color, TBLACK, TextFlags | TPF_BRIGHT_COLOR, width, Tabs);
|
||||
} else {
|
||||
Conquer_Clip_Text_Print(List[index], x, y, color, TBLACK, TextFlags, width, Tabs);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** BOX: Draw a box around the item in the current select color
|
||||
*/
|
||||
case SELECT_BOX:
|
||||
LogicPage->Draw_Rect (x, y, x + width - 2, y + LineHeight - 2, color);
|
||||
Conquer_Clip_Text_Print(List[index], x, y, Colors[index], TBLACK, TextFlags, width, Tabs);
|
||||
break;
|
||||
|
||||
/*
|
||||
** BAR: draw a color bar under the text
|
||||
*/
|
||||
case SELECT_BAR:
|
||||
if (TextFlags & TPF_6PT_GRAD) {
|
||||
LogicPage->Fill_Rect (x, y, x + width - 1, y + LineHeight - 1, SelectColor);
|
||||
Conquer_Clip_Text_Print(List[index], x, y, Colors[index], TBLACK, TextFlags | TPF_BRIGHT_COLOR, width, Tabs);
|
||||
} else {
|
||||
LogicPage->Fill_Rect (x, y, x + width - 2, y + LineHeight - 2, SelectColor);
|
||||
Conquer_Clip_Text_Print(List[index], x, y, Colors[index], TBLACK, TextFlags, width, Tabs);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** INVERT: Draw text as the background color on foreground color
|
||||
*/
|
||||
case SELECT_INVERT:
|
||||
if (TextFlags & TPF_6PT_GRAD) {
|
||||
LogicPage->Fill_Rect (x, y, x + width - 1, y + LineHeight - 1, Colors[index]);
|
||||
Conquer_Clip_Text_Print(List[index], x, y, BLACK, TBLACK, TextFlags, width, Tabs);
|
||||
} else {
|
||||
LogicPage->Fill_Rect (x, y, x + width - 2, y + LineHeight - 2, Colors[index]);
|
||||
Conquer_Clip_Text_Print(List[index], x, y, LTGREY, TBLACK, TextFlags, width, Tabs);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
87
COLRLIST.H
Normal file
87
COLRLIST.H
Normal file
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\colrlist.h_v 1.10 16 Oct 1995 16:47:16 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : COLRLIST.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 01/15/95 *
|
||||
* *
|
||||
* Last Update : January 15, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef COLORLIST_H
|
||||
#define COLORLIST_H
|
||||
|
||||
#include "list.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** This class adds the ability for every list item to have a different color.
|
||||
*/
|
||||
class ColorListClass : public ListClass
|
||||
{
|
||||
public:
|
||||
/*********************************************************************
|
||||
** These enums are the ways a selected item can be drawn
|
||||
*/
|
||||
typedef enum SelectEnum {
|
||||
SELECT_NONE, // selected items aren't drawn differently
|
||||
SELECT_HIGHLIGHT, // item is highlighted
|
||||
SELECT_BOX, // draw a box around the item
|
||||
SELECT_BAR, // draw a bar behind the item
|
||||
SELECT_INVERT, // draw the string inverted
|
||||
} SelectStyleType;
|
||||
|
||||
ColorListClass(int id, int x, int y, int w, int h, TextPrintType flags,
|
||||
void const * up, void const * down);
|
||||
virtual ~ColorListClass(void);
|
||||
|
||||
virtual int Add_Item(char const * text, char color = WHITE);
|
||||
virtual int Add_Item(int text, char color = WHITE);
|
||||
virtual void Remove_Item(char const * text);
|
||||
|
||||
virtual void Set_Selected_Style(SelectStyleType style, int color = -1);
|
||||
|
||||
/*
|
||||
** This is the list of colors for each item.
|
||||
*/
|
||||
DynamicVectorClass<char> Colors;
|
||||
|
||||
protected:
|
||||
virtual void Draw_Entry(int index, int x, int y, int width, int selected);
|
||||
|
||||
/*
|
||||
** This tells how to draw the selected item.
|
||||
*/
|
||||
SelectStyleType Style;
|
||||
int SelectColor;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
235
COMBAT.CPP
Normal file
235
COMBAT.CPP
Normal file
|
@ -0,0 +1,235 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\combat.cpv 2.17 16 Oct 1995 16:48:32 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : COMBAT.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : September 19, 1994 *
|
||||
* *
|
||||
* Last Update : January 1, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Explosion_Damage -- Inflict an explosion damage affect. *
|
||||
* Modify_Damage -- Adjusts damage to reflect the nature of the target. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
int Modify_Damage(int damage, WarheadType warhead, ArmorType armor);
|
||||
void Explosion_Damage(COORDINATE coord, unsigned strength, TechnoClass *source, WarheadType warhead);
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Modify_Damage -- Adjusts damage to reflect the nature of the target. *
|
||||
* *
|
||||
* This routine is the core of combat tactics. It implements the *
|
||||
* affect various armor types have against various weapon types. By *
|
||||
* careful exploitation of this table, tactical advantage can be *
|
||||
* obtained. *
|
||||
* *
|
||||
* INPUT: damage -- The damage points to process. *
|
||||
* *
|
||||
* warhead -- The source of the damage points. *
|
||||
* *
|
||||
* armor -- The type of armor defending against the damage. *
|
||||
* *
|
||||
* distance -- The distance (in leptons) from the source of the damage. *
|
||||
* *
|
||||
* OUTPUT: Returns with the adjusted damage points to inflict upon the *
|
||||
* target. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 04/16/1994 JLB : Created. *
|
||||
* 04/17/1994 JLB : Always does a minimum of damage. *
|
||||
* 01/01/1995 JLB : Takes into account distance from damage source. *
|
||||
*=============================================================================================*/
|
||||
int Modify_Damage(int damage, WarheadType warhead, ArmorType armor, int distance)
|
||||
{
|
||||
/*
|
||||
** If there is no raw damage value to start with, then
|
||||
** there can be no modified damage either.
|
||||
*/
|
||||
if (Special.IsInert || !damage || warhead == WARHEAD_NONE) return(0);
|
||||
|
||||
WarheadTypeClass const * whead = &Warheads[warhead];
|
||||
|
||||
damage = Fixed_To_Cardinal(damage, whead->Modifier[armor]);
|
||||
|
||||
/*
|
||||
** Reduce damage according to the distance from the impact point.
|
||||
*/
|
||||
if (damage) {
|
||||
// if (distance < 0x0010) damage *= 2; // Double damage for direct hits.
|
||||
distance >>= whead->SpreadFactor;
|
||||
distance = Bound(distance, 0, 16);
|
||||
damage >>= distance;
|
||||
}
|
||||
|
||||
/*
|
||||
** If damage was indicated, then it should never drop below one damage point regardless
|
||||
** of modifiers. This allows a very weak attacker to eventually destroy anything it
|
||||
** fires upon, given enough time.
|
||||
*/
|
||||
return(damage);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Explosion_Damage -- Inflict an explosion damage affect. *
|
||||
* *
|
||||
* Processes the collateral damage affects typically caused by an *
|
||||
* explosion. *
|
||||
* *
|
||||
* INPUT: coord -- The coordinate of ground zero. *
|
||||
* *
|
||||
* strength -- Raw damage points at ground zero. *
|
||||
* *
|
||||
* source -- Source of the explosion (who is responsible). *
|
||||
* *
|
||||
* warhead -- The kind of explosion to process. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: This routine can consume some time and will affect the AI *
|
||||
* of nearby enemy units (possibly). *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/16/1991 JLB : Created. *
|
||||
* 11/30/1991 JLB : Uses coordinate system. *
|
||||
* 12/27/1991 JLB : Radius of explosion damage effect. *
|
||||
* 04/13/1994 JLB : Streamlined. *
|
||||
* 04/16/1994 JLB : Warhead damage type modifier. *
|
||||
* 04/17/1994 JLB : Cleaned up. *
|
||||
* 06/20/1994 JLB : Uses object pointers to distribute damage. *
|
||||
* 06/20/1994 JLB : Source is a pointer. *
|
||||
*=============================================================================================*/
|
||||
void Explosion_Damage(COORDINATE coord, unsigned strength, TechnoClass * source, WarheadType warhead)
|
||||
{
|
||||
CELL cell; // Cell number under explosion.
|
||||
ObjectClass * object; // Working object pointer.
|
||||
ObjectClass * objects[32]; // Maximum number of objects that can be damaged.
|
||||
int distance; // Distance to unit.
|
||||
int range; // Damage effect radius.
|
||||
int index;
|
||||
int count; // Number of vehicle IDs in list.
|
||||
|
||||
if (!strength || Special.IsInert || warhead == WARHEAD_NONE) return;
|
||||
|
||||
WarheadTypeClass const * whead = &Warheads[warhead];
|
||||
range = ICON_LEPTON_W + (ICON_LEPTON_W >> 1);
|
||||
cell = Coord_Cell(coord);
|
||||
if ((unsigned)cell >= MAP_CELL_TOTAL) return;
|
||||
// if (!Map.In_Radar(cell)) return;
|
||||
|
||||
CellClass * cellptr = &Map[cell];
|
||||
ObjectClass * impacto = cellptr->Cell_Occupier();
|
||||
|
||||
/*
|
||||
** Fill the list of unit IDs that will have damage
|
||||
** assessed upon them. The units can be lifted from
|
||||
** the cell data directly.
|
||||
*/
|
||||
count = 0;
|
||||
for (FacingType i = FACING_NONE; i < FACING_COUNT; i++) {
|
||||
/*
|
||||
** Fetch a pointer to the cell to examine. This is either
|
||||
** an adjacent cell or the center cell. Damage never spills
|
||||
** further than one cell away.
|
||||
*/
|
||||
if (i != FACING_NONE) {
|
||||
cellptr = &Map[cell].Adjacent_Cell(i);
|
||||
}
|
||||
|
||||
/*
|
||||
** Add all objects in this cell to the list of objects to possibly apply
|
||||
** damage to. The list stops building when the object pointer list becomes
|
||||
** full. Do not include overlapping objects; selection state can affect
|
||||
** the overlappers, and this causes multiplayer games to go out of sync.
|
||||
*/
|
||||
object = cellptr->Cell_Occupier();
|
||||
while (object) {
|
||||
if (!object->IsToDamage && object != source) {
|
||||
object->IsToDamage = true;
|
||||
objects[count++] = object;
|
||||
if (count >= (sizeof(objects)/sizeof(objects[0]))) break;
|
||||
}
|
||||
object = object->Next;
|
||||
}
|
||||
if (count >= (sizeof(objects)/sizeof(objects[0]))) break;
|
||||
}
|
||||
|
||||
/*
|
||||
** Sweep through the units to be damaged and damage them. When damaging
|
||||
** buildings, consider a hit on any cell the building occupies as if it
|
||||
** were a direct hit on the building's center.
|
||||
*/
|
||||
for (index = 0; index < count; index++) {
|
||||
object = objects[index];
|
||||
|
||||
object->IsToDamage = false;
|
||||
if (object->What_Am_I() == RTTI_BUILDING && impacto == object) {
|
||||
distance = 0;
|
||||
} else {
|
||||
distance = Distance(coord, object->Center_Coord());
|
||||
}
|
||||
if (object->IsDown && !object->IsInLimbo && distance < range) {
|
||||
int damage = strength;
|
||||
|
||||
/*
|
||||
** High explosive does double damage against aircraft.
|
||||
*/
|
||||
if (warhead == WARHEAD_HE && object->What_Am_I() == RTTI_AIRCRAFT) {
|
||||
damage *= 2;
|
||||
}
|
||||
|
||||
/*
|
||||
** Apply the damage to the object.
|
||||
*/
|
||||
if (damage) {
|
||||
object->Take_Damage(damage, distance, warhead, source);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** If there is a wall present at this location, it may be destroyed. Check to
|
||||
** make sure that the warhead is of the kind that can destroy walls.
|
||||
*/
|
||||
cellptr = &Map[cell];
|
||||
cellptr->Reduce_Tiberium(strength / 10);
|
||||
if (cellptr->Overlay != OVERLAY_NONE) {
|
||||
OverlayTypeClass const * optr = &OverlayTypeClass::As_Reference(cellptr->Overlay);
|
||||
|
||||
if (optr->IsWall) {
|
||||
if (whead->IsWallDestroyer || (whead->IsWoodDestroyer && optr->IsWooden)) {
|
||||
Map[cell].Reduce_Wall(strength);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
1039
COMBUF.CPP
Normal file
1039
COMBUF.CPP
Normal file
File diff suppressed because it is too large
Load diff
181
COMBUF.H
Normal file
181
COMBUF.H
Normal file
|
@ -0,0 +1,181 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\combuf.h_v 1.6 16 Oct 1995 16:46:00 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : COMBUF.H *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : December 19, 1994 *
|
||||
* *
|
||||
* Last Update : April 1, 1995 [BR] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* *
|
||||
* This class's job is to store outgoing messages & incoming messages, *
|
||||
* and serves as a storage area for various flags for ACK & Retry logic. *
|
||||
* *
|
||||
* This class stores buffers in a non-sequenced order; it allows freeing *
|
||||
* any entry, so the buffers can be kept clear, even if packets come in *
|
||||
* out of order. *
|
||||
* *
|
||||
* The class also contains routines to maintain a cumulative response time *
|
||||
* for this queue. It's up to the caller to call Add_Delay() whenever *
|
||||
* it detects that an outgoing message has been ACK'd; this class adds *
|
||||
* that delay into a computed average delay over the last few message *
|
||||
* delays. *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef COMBUF_H
|
||||
#define COMBUF_H
|
||||
|
||||
|
||||
/*
|
||||
********************************** Defines **********************************
|
||||
*/
|
||||
/*---------------------------------------------------------------------------
|
||||
This is one output queue entry
|
||||
---------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
unsigned int IsActive : 1; // 1 = this entry is ready to be processed
|
||||
unsigned int IsACK : 1; // 1 = ACK received for this packet
|
||||
unsigned long FirstTime; // time this packet was first sent
|
||||
unsigned long LastTime; // time this packet was last sent
|
||||
unsigned long SendCount; // # of times this packet has been sent
|
||||
int BufLen; // size of the packet stored in this entry
|
||||
char *Buffer; // the data packet
|
||||
} SendQueueType;
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
This is one input queue entry
|
||||
---------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
unsigned int IsActive : 1; // 1 = this entry is ready to be processed
|
||||
unsigned int IsRead : 1; // 1 = caller has read this entry
|
||||
unsigned int IsACK : 1; // 1 = ACK sent for this packet
|
||||
int BufLen; // size of the packet stored in this entry
|
||||
char *Buffer; // the data packet
|
||||
} ReceiveQueueType;
|
||||
|
||||
/*
|
||||
***************************** Class Declaration *****************************
|
||||
*/
|
||||
class CommBufferClass
|
||||
{
|
||||
/*
|
||||
---------------------------- Public Interface ----------------------------
|
||||
*/
|
||||
public:
|
||||
/*
|
||||
....................... Constructor/Destructor ........................
|
||||
*/
|
||||
CommBufferClass(int numsend, int numrecieve, int maxlen);
|
||||
virtual ~CommBufferClass();
|
||||
void Init(void);
|
||||
void Init_Send_Queue(void);
|
||||
|
||||
/*
|
||||
......................... Send Queue routines .........................
|
||||
*/
|
||||
int Queue_Send(void *buf, int buflen); // add to Send queue
|
||||
int UnQueue_Send(void *buf, int *buflen, int index); // remove from Send queue
|
||||
int Num_Send(void) {return (SendCount);} // # entries in queue
|
||||
int Max_Send(void) { return (MaxSend);} // max # send queue entries
|
||||
SendQueueType * Get_Send(int index); // random access to queue
|
||||
unsigned long Send_Total(void) {return (SendTotal);}
|
||||
|
||||
/*
|
||||
....................... Receive Queue routines ........................
|
||||
*/
|
||||
int Queue_Receive(void *buf, int buflen); // add to Receive queue
|
||||
int UnQueue_Receive(void *buf, int *buflen, int index); // remove from Receive queue
|
||||
int Num_Receive(void) {return (ReceiveCount);} // # entries in queue
|
||||
int Max_Receive(void) { return (MaxReceive); } // max # recv queue entries
|
||||
ReceiveQueueType * Get_Receive(int index); // random access to queue
|
||||
unsigned long Receive_Total(void) {return (ReceiveTotal);}
|
||||
|
||||
/*
|
||||
....................... Response time routines ........................
|
||||
*/
|
||||
void Add_Delay(unsigned long delay); // accumulates response time
|
||||
unsigned long Avg_Response_Time(void); // gets mean response time
|
||||
unsigned long Max_Response_Time(void); // gets max response time
|
||||
void Reset_Response_Time(void); // resets computations
|
||||
|
||||
/*
|
||||
........................ Debug output routines ........................
|
||||
*/
|
||||
void Configure_Debug(int offset, int size, char **names, int maxnames);
|
||||
void Mono_Debug_Print(int refresh = 0);
|
||||
void Mono_Debug_Print2(int refresh = 0);
|
||||
|
||||
/*
|
||||
--------------------------- Private Interface ----------------------------
|
||||
*/
|
||||
private:
|
||||
/*
|
||||
.......................... Limiting variables .........................
|
||||
*/
|
||||
int MaxSend; // max # send queue entries
|
||||
int MaxReceive; // max # receive queue entries
|
||||
int MaxPacketSize; // max size of a packet, in bytes
|
||||
|
||||
/*
|
||||
....................... Response time variables .......................
|
||||
*/
|
||||
unsigned long DelaySum; // sum of last 4 delay times
|
||||
unsigned long NumDelay; // current # delay times summed
|
||||
unsigned long MeanDelay; // current average delay time
|
||||
unsigned long MaxDelay; // max delay ever for this queue
|
||||
|
||||
/*
|
||||
........................ Send Queue variables .........................
|
||||
*/
|
||||
SendQueueType * SendQueue; // incoming packets
|
||||
int SendCount; // # packets in the queue
|
||||
unsigned long SendTotal; // total # added to send queue
|
||||
int *SendIndex; // array of Send entry indices
|
||||
|
||||
/*
|
||||
....................... Receive Queue variables .......................
|
||||
*/
|
||||
ReceiveQueueType * ReceiveQueue; // outgoing packets
|
||||
int ReceiveCount; // # packets in the queue
|
||||
unsigned long ReceiveTotal; // total # added to receive queue
|
||||
int *ReceiveIndex; // array of Receive entry indices
|
||||
|
||||
/*
|
||||
......................... Debugging Variables .........................
|
||||
*/
|
||||
int DebugOffset; // offset into app's packet for ID
|
||||
int DebugSize; // size of app's ID
|
||||
char **DebugNames; // ptr to array of app-specific names
|
||||
int DebugMaxNames; // max # of names in array
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/**************************** end of combuf.h ******************************/
|
||||
|
170
COMPAT.H
Normal file
170
COMPAT.H
Normal file
|
@ -0,0 +1,170 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\compat.h_v 2.19 16 Oct 1995 16:46:02 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : COMPAT.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 03/02/95 *
|
||||
* *
|
||||
* Last Update : March 2, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef COMPAT_H
|
||||
#define COMPAT_H
|
||||
|
||||
|
||||
#include "i86.h"
|
||||
|
||||
#define KeyNumType int
|
||||
#define KeyASCIIType int
|
||||
|
||||
|
||||
|
||||
#define BuffType BufferClass
|
||||
#define movmem(a,b,c) memmove(b,a,c)
|
||||
#define ShapeBufferSize _ShapeBufferSize
|
||||
extern "C" {
|
||||
extern long ShapeBufferSize;
|
||||
extern char *ShapeBuffer;
|
||||
}
|
||||
|
||||
/*=========================================================================*/
|
||||
/* Define some equates for the different graphic routines we will install */
|
||||
/* later. */
|
||||
/*=========================================================================*/
|
||||
#define HIDBUFF ((void *)(0xA0000))
|
||||
//#define Size_Of_Region(a, b) a*b
|
||||
|
||||
/*=========================================================================*/
|
||||
/* Define some Graphic Routines which will only be fixed by these defines */
|
||||
/*=========================================================================*/
|
||||
#define Set_Font_Palette(a) Set_Font_Palette_Range(a, 0, 15)
|
||||
|
||||
/*
|
||||
** These are the Open_File, Read_File, and Seek_File constants.
|
||||
*/
|
||||
#define READ 1 // Read access.
|
||||
#define WRITE 2 // Write access.
|
||||
|
||||
#ifndef SEEK_SET
|
||||
#define SEEK_SET 0 // Seek from start of file.
|
||||
#define SEEK_CUR 1 // Seek relative from current location.
|
||||
#define SEEK_END 2 // Seek from end of file.
|
||||
#endif
|
||||
|
||||
#define ERROR_WINDOW 1
|
||||
#define ErrorWindow 1
|
||||
|
||||
|
||||
extern unsigned char *Palette;
|
||||
extern unsigned char MDisabled; // Is mouse disabled?
|
||||
extern WORD Hard_Error_Occured;
|
||||
|
||||
/*
|
||||
** This is the menu control structures.
|
||||
*/
|
||||
typedef enum MenuIndexType {
|
||||
MENUX,
|
||||
MENUY,
|
||||
ITEMWIDTH,
|
||||
ITEMSHIGH,
|
||||
MSELECTED,
|
||||
NORMCOL,
|
||||
HILITE,
|
||||
MENUPADDING=0x1000
|
||||
} MenuIndexType;
|
||||
|
||||
|
||||
#define BITSPERBYTE 8
|
||||
#define MAXSHORT 0x7fff
|
||||
#define HIBITS 0x8000
|
||||
//#define MAXLONG 0x7fffffffL
|
||||
#define HIBITL 0x80000000
|
||||
|
||||
#define MAXINT MAXLONG
|
||||
#define HIBITI HIBITL
|
||||
|
||||
#define DMAXEXP 308
|
||||
#define FMAXEXP 38
|
||||
#define DMINEXP -307
|
||||
#define FMINEXP -37
|
||||
|
||||
#define MAXDOUBLE 1.797693E+308
|
||||
#define MAXFLOAT 3.37E+38F
|
||||
#define MINDOUBLE 2.225074E-308
|
||||
#define MINFLOAT 8.43E-37F
|
||||
|
||||
#define DSIGNIF 53
|
||||
#define FSIGNIF 24
|
||||
|
||||
#define DMAXPOWTWO 0x3FF
|
||||
#define FMAXPOWTWO 0x7F
|
||||
#define DEXPLEN 11
|
||||
#define FEXPLEN 8
|
||||
#define EXPBASE 2
|
||||
#define IEEE 1
|
||||
#define LENBASE 1
|
||||
#define HIDDENBIT 1
|
||||
#define LN_MAXDOUBLE 7.0978E+2
|
||||
#define LN_MINDOUBLE -7.0840E+2
|
||||
|
||||
/* These defines handle the various names given to the same color. */
|
||||
#define DKGREEN GREEN
|
||||
#define DKBLUE BLUE
|
||||
#define GRAY GREY
|
||||
#define DKGREY GREY
|
||||
#define DKGRAY GREY
|
||||
#define LTGRAY LTGREY
|
||||
|
||||
#if 0
|
||||
typedef struct {
|
||||
short Width; // Width of icons (pixels).
|
||||
short Height; // Height of icons (pixels).
|
||||
short Count; // Number of (logical) icons in this set.
|
||||
short Allocated; // Was this iconset allocated?
|
||||
long Size; // Size of entire iconset memory block.
|
||||
unsigned char * Icons; // Offset from buffer start to icon data.
|
||||
long Palettes; // Offset from buffer start to palette data.
|
||||
long Remaps; // Offset from buffer start to remap index data.
|
||||
long TransFlag; // Offset for transparency flag table.
|
||||
unsigned char * Map; // Icon map offset (if present).
|
||||
} IControl_Type;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
void Stuff_Key_Num ( int );
|
||||
|
||||
|
||||
extern "C"{
|
||||
extern int MouseQX;
|
||||
extern int MouseQY;
|
||||
}
|
||||
|
||||
#endif
|
1006
COMQUEUE.CPP
Normal file
1006
COMQUEUE.CPP
Normal file
File diff suppressed because it is too large
Load diff
193
COMQUEUE.H
Normal file
193
COMQUEUE.H
Normal file
|
@ -0,0 +1,193 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\comqueue.h_v 1.12 16 Oct 1995 16:45:08 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : COMQUEUE.H *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : December 19, 1994 *
|
||||
* *
|
||||
* Last Update : April 1, 1995 [BR] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* *
|
||||
* This class's job is to queue up outgoing messages & incoming messages, *
|
||||
* and serves as a storage area for various flags for ACK & Retry logic. *
|
||||
* It allows the application to keep track of how many messages have *
|
||||
* passed through this queue, in & out, so packets can use this as a *
|
||||
* unique ID. (If packets have a unique ID, the application can use this *
|
||||
* to detect re-sends.) *
|
||||
* *
|
||||
* The queues act as FIFO buffers (First-In, First-Out). The first entry *
|
||||
* placed in a queue is the first one read from it, and so on. The *
|
||||
* controlling application must ensure it places the entries on the queue *
|
||||
* in the order it wants to access them. *
|
||||
* *
|
||||
* The queue is implemented as an array of Queue Entries. Index 0 is the *
|
||||
* first element placed on the queue, and is the first retrieved. Index *
|
||||
* 1 is the next, and so on. When Index 0 is retrieved, the next-available*
|
||||
* entry becomes Index 1. The array is circular; when the end is reached, *
|
||||
* the indices wrap around to the beginning. *
|
||||
* *
|
||||
* The class also contains routines to maintain a cumulative response time *
|
||||
* for this queue. It's up to the caller to call Add_Delay() whenever *
|
||||
* it detects that an outgoing message has been ACK'd; this class adds *
|
||||
* that delay into a computed average delay over the last few message *
|
||||
* delays. *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef COMQUEUE_H
|
||||
#define COMQUEUE_H
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
This is one output queue entry
|
||||
---------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
unsigned int IsActive : 1; // 1 = this entry is ready to be processed
|
||||
unsigned int IsACK : 1; // 1 = ACK received for this packet
|
||||
unsigned long FirstTime; // time this packet was first sent
|
||||
unsigned long LastTime; // time this packet was last sent
|
||||
unsigned long SendCount; // # of times this packet has been sent
|
||||
int BufLen; // size of the packet stored in this entry
|
||||
char *Buffer; // the data packet
|
||||
} SendQueueType;
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
This is one input queue entry
|
||||
---------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
unsigned int IsActive : 1; // 1 = this entry is ready to be processed
|
||||
unsigned int IsRead : 1; // 1 = caller has read this entry
|
||||
unsigned int IsACK : 1; // 1 = ACK sent for this packet
|
||||
int BufLen; // size of the packet stored in this entry
|
||||
char *Buffer; // the data packet
|
||||
} ReceiveQueueType;
|
||||
|
||||
/*
|
||||
***************************** Class Declaration *****************************
|
||||
*/
|
||||
class CommQueueClass
|
||||
{
|
||||
/*
|
||||
---------------------------- Public Interface ----------------------------
|
||||
*/
|
||||
public:
|
||||
/*
|
||||
....................... Constructor/Destructor ........................
|
||||
*/
|
||||
CommQueueClass(int numsend, int numrecieve, int maxlen);
|
||||
virtual ~CommQueueClass();
|
||||
void Init(void);
|
||||
|
||||
/*
|
||||
......................... Send Queue routines .........................
|
||||
*/
|
||||
int Queue_Send(void *buf, int buflen); // add to Send queue
|
||||
int UnQueue_Send(void *buf, int *buflen); // remove from Send queue
|
||||
SendQueueType * Next_Send(void); // ptr to next avail entry
|
||||
int Num_Send(void) {return (SendCount);} // # entries in queue
|
||||
int Max_Send(void) { return (MaxSend);} // max # send queue entries
|
||||
SendQueueType * Get_Send(int index); // random access to queue
|
||||
unsigned long Send_Total(void) {return (SendTotal);}
|
||||
|
||||
/*
|
||||
....................... Receive Queue routines ........................
|
||||
*/
|
||||
int Queue_Receive(void *buf, int buflen); // add to Receive queue
|
||||
int UnQueue_Receive(void *buf, int *buflen); // remove from Receive queue
|
||||
ReceiveQueueType * Next_Receive(void); // ptr to next avail entry
|
||||
int Num_Receive(void) {return (ReceiveCount);} // # entries in queue
|
||||
int Max_Receive(void) { return (MaxReceive); } // max # recv queue entries
|
||||
ReceiveQueueType * Get_Receive(int index); // random access to queue
|
||||
unsigned long Receive_Total(void) {return (ReceiveTotal);}
|
||||
|
||||
/*
|
||||
....................... Response time routines ........................
|
||||
*/
|
||||
void Add_Delay(unsigned long delay); // accumulates response time
|
||||
unsigned long Avg_Response_Time(void); // gets mean response time
|
||||
unsigned long Max_Response_Time(void); // gets max response time
|
||||
void Reset_Response_Time(void); // resets computations
|
||||
|
||||
/*
|
||||
........................ Debug output routines ........................
|
||||
*/
|
||||
void Configure_Debug(int offset, int size, char **names, int maxnames);
|
||||
void Mono_Debug_Print(int refresh = 0);
|
||||
void Mono_Debug_Print2(int refresh = 0);
|
||||
|
||||
/*
|
||||
--------------------------- Private Interface ----------------------------
|
||||
*/
|
||||
private:
|
||||
/*
|
||||
.......................... Limiting variables .........................
|
||||
*/
|
||||
int MaxSend; // max # send queue entries
|
||||
int MaxReceive; // max # receive queue entries
|
||||
int MaxPacketSize; // max size of a packet, in bytes
|
||||
|
||||
/*
|
||||
....................... Response time variables .......................
|
||||
*/
|
||||
unsigned long DelaySum; // sum of last 4 delay times
|
||||
unsigned long NumDelay; // current # delay times summed
|
||||
unsigned long MeanDelay; // current average delay time
|
||||
unsigned long MaxDelay; // max delay ever for this queue
|
||||
|
||||
/*
|
||||
........................ Send Queue variables .........................
|
||||
*/
|
||||
SendQueueType * SendQueue; // incoming packets
|
||||
int SendCount; // # packets in the queue
|
||||
int SendNext; // next entry read from queue
|
||||
int SendEmpty; // next empty spot in queue
|
||||
unsigned long SendTotal; // total # added to send queue
|
||||
|
||||
/*
|
||||
....................... Receive Queue variables .......................
|
||||
*/
|
||||
ReceiveQueueType * ReceiveQueue; // outgoing packets
|
||||
int ReceiveCount; // # packets in the queue
|
||||
int ReceiveNext; // next entry read from queue
|
||||
int ReceiveEmpty; // next empty spot in queue
|
||||
unsigned long ReceiveTotal; // total # added to receive queue
|
||||
|
||||
/*
|
||||
......................... Debugging Variables .........................
|
||||
*/
|
||||
int DebugOffset; // offset into app's packet for ID
|
||||
int DebugSize; // size of app's ID
|
||||
char **DebugNames; // ptr to array of app-specific names
|
||||
int DebugMaxNames; // max # of names in array
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/*************************** end of comqueue.h *****************************/
|
||||
|
250
CONFDLG.CPP
Normal file
250
CONFDLG.CPP
Normal file
|
@ -0,0 +1,250 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\confdlg.cpv 2.17 16 Oct 1995 16:49:52 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONFDLG.CPP *
|
||||
* *
|
||||
* Programmer : Maria del Mar McCready Legg *
|
||||
* Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : Jan 30, 1995 *
|
||||
* *
|
||||
* Last Update : Jan 30, 1995 [MML] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* ConfirmationClass::Process -- Handles all the options graphic interface. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
#include "confdlg.h"
|
||||
|
||||
|
||||
bool ConfirmationClass::Process(int text)
|
||||
{
|
||||
return(Process(Text_String(text)));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* ConfirmationClass::Process -- Handles all the options graphic interface. *
|
||||
* *
|
||||
* This dialog uses an edit box to confirm a deletion. *
|
||||
* *
|
||||
* INPUT: char *string - display in edit box. *
|
||||
* OUTPUT: none *
|
||||
* WARNINGS: none *
|
||||
* HISTORY: 12/31/1994 MML : Created. *
|
||||
*=============================================================================================*/
|
||||
bool ConfirmationClass::Process(char const * string)
|
||||
{
|
||||
int factor = (SeenBuff.Get_Width() == 320) ? 1 : 2;
|
||||
|
||||
enum {
|
||||
NUM_OF_BUTTONS = 2
|
||||
};
|
||||
|
||||
char buffer[80*3];
|
||||
int result = true;
|
||||
int width;
|
||||
int bwidth, bheight; // button width and height
|
||||
int height;
|
||||
int selection;
|
||||
bool pressed;
|
||||
int curbutton;
|
||||
TextButtonClass *buttons[NUM_OF_BUTTONS];
|
||||
|
||||
/*
|
||||
** Set up the window. Window x-coords are in bytes not pixels.
|
||||
*/
|
||||
strcpy(buffer, string);
|
||||
Fancy_Text_Print(TXT_NONE,0,0,TBLACK,TBLACK,TPF_6PT_GRAD | TPF_NOSHADOW);
|
||||
Format_Window_String(buffer, 200*factor, width, height);
|
||||
width += 60*factor;
|
||||
height += 60*factor;
|
||||
int x = (320*factor - width) / 2;
|
||||
int y = (200*factor - height) / 2;
|
||||
|
||||
Set_Logic_Page(SeenBuff);
|
||||
|
||||
/*
|
||||
** Create Buttons. Button coords are in pixels, but are window-relative.
|
||||
*/
|
||||
|
||||
bheight = FontHeight + FontYSpacing + 2;
|
||||
bwidth = MAX( (String_Pixel_Width( Text_String( TXT_YES ) ) + 8), 30);
|
||||
|
||||
TextButtonClass yesbtn(BUTTON_YES, TXT_YES,
|
||||
TPF_6PT_GRAD | TPF_USE_GRAD_PAL | TPF_NOSHADOW,
|
||||
x + 10*factor, y + height - (bheight + 5*factor), bwidth );
|
||||
|
||||
TextButtonClass nobtn(BUTTON_NO, TXT_NO,
|
||||
TPF_6PT_GRAD | TPF_USE_GRAD_PAL | TPF_NOSHADOW,
|
||||
x + width - (bwidth + 10*factor),
|
||||
y + height - (bheight + 5*factor), bwidth );
|
||||
|
||||
nobtn.Add_Tail(yesbtn);
|
||||
|
||||
curbutton = 1;
|
||||
buttons[0] = &yesbtn;
|
||||
buttons[1] = &nobtn;
|
||||
buttons[curbutton]->Turn_On();
|
||||
|
||||
/*
|
||||
** This causes left mouse button clicking within the confines of the dialog to
|
||||
** be ignored if it wasn't recognized by any other button or slider.
|
||||
*/
|
||||
GadgetClass dialog(x, y, width, height, GadgetClass::LEFTPRESS);
|
||||
dialog.Add_Tail(yesbtn);
|
||||
|
||||
/*
|
||||
** This causes a right click anywhere or a left click outside the dialog region
|
||||
** to be equivalent to clicking on the return to options dialog.
|
||||
*/
|
||||
ControlClass background(BUTTON_NO, 0, 0, SeenBuff.Get_Width(), SeenBuff.Get_Height(), GadgetClass::LEFTPRESS|GadgetClass::RIGHTPRESS);
|
||||
background.Add_Tail(yesbtn);
|
||||
|
||||
/*
|
||||
** Main Processing Loop.
|
||||
*/
|
||||
bool display = true;
|
||||
bool process = true;
|
||||
pressed = false;
|
||||
while (process) {
|
||||
|
||||
/*
|
||||
** Invoke game callback.
|
||||
*/
|
||||
if (GameToPlay == GAME_NORMAL) {
|
||||
Call_Back();
|
||||
} else {
|
||||
if (Main_Loop()) {
|
||||
process = false;
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** If we have just received input focus again after running in the background then
|
||||
** we need to redraw.
|
||||
*/
|
||||
if (AllSurfaces.SurfacesRestored){
|
||||
AllSurfaces.SurfacesRestored=FALSE;
|
||||
display=TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
** Refresh display if needed.
|
||||
*/
|
||||
if (display) {
|
||||
Hide_Mouse();
|
||||
|
||||
/*
|
||||
** Draw the background.
|
||||
*/
|
||||
Dialog_Box(x, y, width, height);
|
||||
Draw_Caption(TXT_CONFIRMATION, x, y, width);
|
||||
Fancy_Text_Print(buffer, x+20*factor, y+30*factor, CC_GREEN, TBLACK, TPF_6PT_GRAD|TPF_USE_GRAD_PAL|TPF_NOSHADOW);
|
||||
|
||||
/*
|
||||
** Draw the titles.
|
||||
*/
|
||||
yesbtn.Draw_All();
|
||||
Show_Mouse();
|
||||
display = false;
|
||||
}
|
||||
|
||||
/*
|
||||
** Get user input.
|
||||
*/
|
||||
KeyNumType input = yesbtn.Input();
|
||||
|
||||
/*
|
||||
** Process Input.
|
||||
*/
|
||||
switch (input) {
|
||||
case (BUTTON_YES | KN_BUTTON):
|
||||
selection = BUTTON_YES;
|
||||
pressed = true;
|
||||
break;
|
||||
|
||||
case (KN_ESC):
|
||||
case (BUTTON_NO | KN_BUTTON):
|
||||
selection = BUTTON_NO;
|
||||
pressed = true;
|
||||
break;
|
||||
|
||||
case (KN_LEFT):
|
||||
buttons[curbutton]->Turn_Off();
|
||||
buttons[curbutton]->Flag_To_Redraw();
|
||||
|
||||
curbutton--;
|
||||
if (curbutton < 0) {
|
||||
curbutton = NUM_OF_BUTTONS - 1;
|
||||
}
|
||||
|
||||
buttons[curbutton]->Turn_On();
|
||||
buttons[curbutton]->Flag_To_Redraw();
|
||||
break;
|
||||
|
||||
case (KN_RIGHT):
|
||||
buttons[curbutton]->Turn_Off();
|
||||
buttons[curbutton]->Flag_To_Redraw();
|
||||
|
||||
curbutton++;
|
||||
if (curbutton > (NUM_OF_BUTTONS - 1) ) {
|
||||
curbutton = 0;
|
||||
}
|
||||
|
||||
buttons[curbutton]->Turn_On();
|
||||
buttons[curbutton]->Flag_To_Redraw();
|
||||
break;
|
||||
|
||||
case (KN_RETURN):
|
||||
selection = curbutton + BUTTON_YES;
|
||||
pressed = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (pressed) {
|
||||
switch (selection) {
|
||||
case (BUTTON_YES):
|
||||
result = true;
|
||||
process = false;
|
||||
break;
|
||||
|
||||
case (BUTTON_NO):
|
||||
result = false;
|
||||
process = false;
|
||||
break;
|
||||
}
|
||||
|
||||
pressed = false;
|
||||
}
|
||||
}
|
||||
return(result);
|
||||
}
|
56
CONFDLG.H
Normal file
56
CONFDLG.H
Normal file
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\confdlg.h_v 2.18 16 Oct 1995 16:46:06 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONFDLG.H *
|
||||
* *
|
||||
* Programmer : Maria del Mar McCready Legg *
|
||||
* Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : Jan 30, 1995 *
|
||||
* *
|
||||
* Last Update : Jan 30, 1995 [MML] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef CONFDLG_H
|
||||
#define CONFDLG_H
|
||||
|
||||
#include "gadget.h"
|
||||
|
||||
class ConfirmationClass
|
||||
{
|
||||
private:
|
||||
enum ConfirmationClassEnum {
|
||||
BUTTON_YES=1, // Button number for "Options menu"
|
||||
BUTTON_NO, // Button number for "Options menu"
|
||||
};
|
||||
|
||||
public:
|
||||
ConfirmationClass(void) { };
|
||||
bool Process(char const * string);
|
||||
bool Process(int text);
|
||||
};
|
||||
|
||||
#endif
|
247
CONNECT.CPP
Normal file
247
CONNECT.CPP
Normal file
|
@ -0,0 +1,247 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\connect.cpv 1.9 16 Oct 1995 16:48:56 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONNECT.CPP *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : December 20, 1994 *
|
||||
* *
|
||||
* Last Update : May 31, 1995 [BRR] *
|
||||
*-------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* ConnectionClass::ConnectionClass -- class constructor *
|
||||
* ConnectionClass::~ConnectionClass -- class destructor *
|
||||
* ConnectionClass::Service -- main polling routine; services packets *
|
||||
* ConnectionClass::Time -- gets current time *
|
||||
* ConnectionClass::Command_Name -- returns name for a packet command *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
#ifdef WWLIB32_H
|
||||
#else
|
||||
#include <sys\timeb.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
********************************* Globals ***********************************
|
||||
*/
|
||||
static char *ConnectionClass::Commands[PACKET_COUNT] = {
|
||||
"ADATA",
|
||||
"NDATA",
|
||||
"ACK"
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ConnectionClass::ConnectionClass -- class constructor *
|
||||
* *
|
||||
* If either max_retries or timeout is -1, that parameter is ignored in *
|
||||
* timeout computations. If both are -1, the connection will just keep *
|
||||
* retrying forever. *
|
||||
* *
|
||||
* INPUT: *
|
||||
* numsend desired # of entries for the send queue *
|
||||
* numreceive desired # of entries for the recieve queue *
|
||||
* maxlen max length of an application packet *
|
||||
* magicnum the packet "magic number" for this connection *
|
||||
* retry_delta the time to wait between sends *
|
||||
* max_retries the max # of retries allowed for a packet *
|
||||
* (-1 means retry forever, based on this parameter) *
|
||||
* timeout the max amount of time before we give up on a packet *
|
||||
* (-1 means retry forever, based on this parameter) *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/20/1994 BR : Created. *
|
||||
*=========================================================================*/
|
||||
ConnectionClass::ConnectionClass (int maxlen, unsigned short magicnum,
|
||||
unsigned long retry_delta, unsigned long max_retries, unsigned long timeout)
|
||||
{
|
||||
/*------------------------------------------------------------------------
|
||||
Compute our maximum packet length
|
||||
------------------------------------------------------------------------*/
|
||||
MaxPacketLen = maxlen + sizeof(CommHeaderType);
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
Assign the magic number
|
||||
------------------------------------------------------------------------*/
|
||||
MagicNum = magicnum;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
Initialize the retry time. This is the time that t2 - t1 must be greater
|
||||
than before a retry will occur.
|
||||
------------------------------------------------------------------------*/
|
||||
RetryDelta = retry_delta;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
Set the maximum allowable retries.
|
||||
------------------------------------------------------------------------*/
|
||||
MaxRetries = max_retries;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
Set the timeout for this connection.
|
||||
------------------------------------------------------------------------*/
|
||||
Timeout = timeout;
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
Allocate the packet staging buffer. This will be used to
|
||||
------------------------------------------------------------------------*/
|
||||
PacketBuf = new char[ MaxPacketLen ];
|
||||
|
||||
} /* end of ConnectionClass */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ConnectionClass::~ConnectionClass -- class destructor *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/20/1994 BR : Created. *
|
||||
*=========================================================================*/
|
||||
ConnectionClass::~ConnectionClass ()
|
||||
{
|
||||
/*------------------------------------------------------------------------
|
||||
Free memory.
|
||||
------------------------------------------------------------------------*/
|
||||
delete [] PacketBuf;
|
||||
|
||||
} /* end of ~ConnectionClass */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ConnectionClass::Service -- main polling routine; services packets *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* 1 = OK, 0 = error (connection is broken!) *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/20/1994 BR : Created. *
|
||||
*=========================================================================*/
|
||||
int ConnectionClass::Service (void)
|
||||
{
|
||||
/*------------------------------------------------------------------------
|
||||
Service the Send Queue. This [re]sends packets in the Send Queue which
|
||||
haven't been ACK'd yet, and if their retry timeout has expired, and
|
||||
updates the FirstTime, LastTime & SendCount values in the Queue entry.
|
||||
Entries that have been ACK'd should be removed.
|
||||
------------------------------------------------------------------------*/
|
||||
// if (!Service_Send_Queue())
|
||||
// return(0);
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
Service the Receive Queue. This sends ACKs for packets that haven't
|
||||
been ACK'd yet. Entries that the app has read, and have been ACK'd,
|
||||
should be removed.
|
||||
------------------------------------------------------------------------*/
|
||||
// if (!Service_Receive_Queue())
|
||||
// return(0);
|
||||
|
||||
// return(1);
|
||||
|
||||
if ( Service_Send_Queue() && Service_Receive_Queue() ) {
|
||||
return(1);
|
||||
} else {
|
||||
return(0);
|
||||
}
|
||||
|
||||
} /* end of Service */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ConnectionClass::Time -- gets current time *
|
||||
* *
|
||||
* INPUT: *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/20/1994 BR : Created. *
|
||||
*=========================================================================*/
|
||||
unsigned long ConnectionClass::Time (void)
|
||||
{
|
||||
#ifdef WWLIB32_H
|
||||
return(TickCount.Time()); // Westwood Library time
|
||||
#else
|
||||
static struct timeb mytime; // DOS time
|
||||
unsigned long msec;
|
||||
|
||||
ftime(&mytime);
|
||||
msec = (unsigned long)mytime.time * 1000L + (unsigned long)mytime.millitm;
|
||||
return((msec / 100) * 6);
|
||||
#endif
|
||||
|
||||
} /* end of Time */
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* ConnectionClass::Command_Name -- returns name for given packet command *
|
||||
* *
|
||||
* INPUT: *
|
||||
* command packet Command value to get name for *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* ptr to command name, NULL if invalid *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/31/1995 BRR : Created. *
|
||||
*=========================================================================*/
|
||||
char *ConnectionClass::Command_Name(int command)
|
||||
{
|
||||
if (command >= 0 && command < PACKET_COUNT) {
|
||||
return(Commands[command]);
|
||||
} else {
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
343
CONNECT.H
Normal file
343
CONNECT.H
Normal file
|
@ -0,0 +1,343 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\connect.h_v 1.12 16 Oct 1995 16:46:04 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONNECT.H *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : December 19, 1994 *
|
||||
* *
|
||||
* Last Update : April 1, 1995 [BR] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* *
|
||||
* DESCRIPTION: *
|
||||
* This class represents a single "connection" with another system. It's *
|
||||
* a pure virtual base class that acts as a framework for other classes. *
|
||||
* *
|
||||
* This class contains a CommQueueClass member, which stores received *
|
||||
* & transmitted packets. The ConnectionClass has virtual functions to *
|
||||
* handle adding packets to the queue, reading them from the queue, *
|
||||
* a Send routine for actually sending data, and a Receive_Packet function *
|
||||
* which is used to tell the connection that a new packet has come in. *
|
||||
* *
|
||||
* The virtual Service routine will handle all ACK & Retry logic for *
|
||||
* communicating between this system & another. Thus, any class derived *
|
||||
* from this class must provide the basic ACK/Retry logic. *
|
||||
* *
|
||||
* THE HEADER: *
|
||||
* The Connection Classes prefix every packet sent with a header that's *
|
||||
* local to this class. The header contains a "Magic Number" which should *
|
||||
* be unique for each product, and Packet "Code", which will tell the *
|
||||
* receiving end if this is DATA, or an ACK packet, and a packet ID, which *
|
||||
* is a unique numerical ID for this packet (useful for detecting resends).*
|
||||
* The header is stored with each packet in the send & receive Queues; *
|
||||
* it's removed before it's passed back to the application, via *
|
||||
* Get_Packet() *
|
||||
* *
|
||||
* THE CONNECTION MANAGER: *
|
||||
* It is assumed that there will be a "Connection Manager" class which *
|
||||
* will handle parsing incoming packets; it will then tell the connection *
|
||||
* that new packets have come in, and the connection will process them in *
|
||||
* whatever way it needs to for its protocol (check for resends, handle *
|
||||
* ACK packets, etc). The job of the connection manager is to parse *
|
||||
* incoming packets & distribute them to the connections that need to *
|
||||
* store them (for multi-connection protocols). *
|
||||
* *
|
||||
* NOTES ON ACK/RETRY: *
|
||||
* The packet's ID is used to check for re-sends. The ID is set to the *
|
||||
* Queue's total Send Count; if the receiving system checks this value, *
|
||||
* and it's less than that system's Receive Count, this is a resend. *
|
||||
* (ie packet 0 will be the 1st packet sent, since the Send Queue's count *
|
||||
* is 0 when it's sent; as soon as it's received, the Receive Count goes *
|
||||
* up to 1, and an ID of 0 then means a resend.) This scheme keeps the *
|
||||
* application from seeing the same packet twice. All the Connection *
|
||||
* Manager has to do is mark the resent packet as non-ACK'd. Of course, *
|
||||
* the Manager doesn't have to use this value at all. *
|
||||
* *
|
||||
* Both DATA_ACK packets and DATA_NOACK packets must go through the Send *
|
||||
* Queue when "sent", so that the SendTotal value for this system *
|
||||
* will still match the ReceiveTotal value for the other system; this is *
|
||||
* why a NOACK packet can't just be sent immediately; it must go through *
|
||||
* the queue. *
|
||||
* *
|
||||
* If the protocol being used already guarantees delivery of packets, *
|
||||
* no ACK is required for the packets. In this case, the connection *
|
||||
* class for this protocol can overload the Service routine to avoid *
|
||||
* sending ACK packets, or the Connection Manager can just mark the *
|
||||
* packet as ACK'd when it adds it to the Receive Queue for the connection.*
|
||||
* *
|
||||
* Derived classes must provide: *
|
||||
* - Init a version of Init that gives the connection *
|
||||
* access to any hardware-specific values it needs *
|
||||
* Must chain to the parent's Init routine. *
|
||||
* - Send_Packet adds the CommHeaderType header, adds the packet *
|
||||
* to the out-going queue *
|
||||
* - Receive_Packet processes incoming ACK packets, detects resends,*
|
||||
* adds new packets to the in-coming queue *
|
||||
* - Get_Packet reads the next-available packet from the *
|
||||
* receive queue *
|
||||
* - Send the hardware-dependent data-sending routine *
|
||||
* - Service_Send_Queue services the send queue; handles re-sends, *
|
||||
* detects when outgoing packets have been ACK'd; *
|
||||
* cleans out the queue of old packets *
|
||||
* - Service_Receive_Queue services the receive queue; handles sending *
|
||||
* ACK's for new or re-sent packets; cleans out *
|
||||
* the queue of old packets *
|
||||
* *
|
||||
* Any other routines can be overloaded as the derived class needs. *
|
||||
* *
|
||||
* CLASS HIERARCHY: *
|
||||
* ConnectionClass *
|
||||
* | *
|
||||
* | *
|
||||
* -------------------------------------- *
|
||||
* | | *
|
||||
* | | *
|
||||
* SequencedConnClass NonSequencedConnClass *
|
||||
* | | *
|
||||
* | | *
|
||||
* IPXConnClass ------------------------ *
|
||||
* | | | *
|
||||
* | | | *
|
||||
* IPXGlobalConnClass NullModemConnClass ModemConnClass *
|
||||
* *
|
||||
* *
|
||||
* ConnectionClass: *
|
||||
* Abstract base class. *
|
||||
* Provides: Queue for sent/recv'd packets *
|
||||
* PacketBuf for preparing packets *
|
||||
* Timeout variables *
|
||||
* Service() routine *
|
||||
* *
|
||||
* SequencedConnClass: *
|
||||
* Abstract base class *
|
||||
* Provides: * "Sequenced" ACK/Retry logic, in Service_Send_Queue() & *
|
||||
* Service_Receive_Queue() routines *
|
||||
* * Send_Packet(): adds header to packet, adds it to Queue *
|
||||
* * Receive_Packet(): adds incoming packet to receive Queue, *
|
||||
* handles incoming ACK's & resends *
|
||||
* * Get_Packet(): gets packet from the receive queue *
|
||||
* *
|
||||
* NonSequencedConnClass: *
|
||||
* Abstract base class *
|
||||
* Provides: * "Non-Sequenced" ACK/Retry logic, in Service_Send_Queue() *
|
||||
* & Service_Receive_Queue() routines *
|
||||
* * Send_Packet(): adds header to packet, adds it to Queue *
|
||||
* * Receive_Packet(): adds incoming packet to receive Queue, *
|
||||
* handles incoming ACK's & resends *
|
||||
* * Get_Packet(): gets packet from the receive queue *
|
||||
* *
|
||||
* IPXConnClass: *
|
||||
* Provides: * Hardware-dependent IPX interface routines, which allow *
|
||||
* Service_Send_Queue() & Service_Receive_Queue() to do *
|
||||
* their job *
|
||||
* * Ability to associate an IPX Address, a numerical ID, and *
|
||||
* a character-string Name with a connection *
|
||||
* Inherits: * Sequenced ACK/Retry logic, Service routines, Queue & *
|
||||
* PacketBuf, timeout variables *
|
||||
* *
|
||||
* IPXGlobalConnClass: *
|
||||
* Special type of IPX Connection; supports receiving packets from *
|
||||
* multiple systems at once, and sending packets via Broadcast or *
|
||||
* to a specific address. *
|
||||
* Provides: * Specialized Receive_Packet() routine, which handles *
|
||||
* receiving packets from multiple systems *
|
||||
* * Specialized Send_Packet() & Get_Packet() routines, *
|
||||
* which pass IPX address of destination through to *
|
||||
* the application, giving the application control over *
|
||||
* whether the packet will be Broadcast or sent to a *
|
||||
* specific destination (embeds destination address within *
|
||||
* the packet itself) *
|
||||
* * Specialized Send routine, which extracts the destination *
|
||||
* address from the packet *
|
||||
* Inherits: * Sequenced ACK/Retry logic, Service routines, Queue & *
|
||||
* PacketBuf, timeout variables, IPX-specific routines *
|
||||
* *
|
||||
* NullModemConnClass: *
|
||||
* Provides: * Hardware-dependent Serial-communication routines, which *
|
||||
* allow Service_Send_Queue() & Service_Receive_Queue() to *
|
||||
* do their job *
|
||||
* Inherits: * Non-Sequenced ACK/Retry logic, Service routines, Queue & *
|
||||
* PacketBuf, timeout variables *
|
||||
* *
|
||||
* ModemConnClass: *
|
||||
* Provides: * Hardware-dependent Modem-communication routines, which *
|
||||
* allow Service_Send_Queue() & Service_Receive_Queue() to *
|
||||
* do their job *
|
||||
* Inherits: * Non-Sequenced ACK/Retry logic, Service routines, Queue & *
|
||||
* PacketBuf, timeout variables *
|
||||
* *
|
||||
* So, do ya think this header is long enough, or what? *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CONNECTION_H
|
||||
#define CONNECTION_H
|
||||
|
||||
#define CONN_DEBUG 0
|
||||
|
||||
/*
|
||||
********************************** Defines **********************************
|
||||
*/
|
||||
/*---------------------------------------------------------------------------
|
||||
This structure is the header prefixed to any packet sent by the application.
|
||||
MagicNumber: This is a number unique to the application; it's up to the
|
||||
Receive_Packet routine to check this value, to be sure we're
|
||||
not getting data from some other product. This value should
|
||||
be unique for each application.
|
||||
Code: This will be one of the below-defined codes.
|
||||
PacketID: This is a unique numerical ID for this packet. The Connection
|
||||
sets this ID on all packets sent out.
|
||||
---------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
unsigned short MagicNumber;
|
||||
unsigned char Code;
|
||||
unsigned long PacketID;
|
||||
} CommHeaderType;
|
||||
|
||||
|
||||
/*
|
||||
***************************** Class Declaration *****************************
|
||||
*/
|
||||
class ConnectionClass
|
||||
{
|
||||
/*
|
||||
---------------------------- Public Interface ----------------------------
|
||||
*/
|
||||
public:
|
||||
/*.....................................................................
|
||||
These are the possible values for the Code field of the CommHeaderType:
|
||||
.....................................................................*/
|
||||
enum ConnectionEnum {
|
||||
PACKET_DATA_ACK, // this is a data packet requiring an ACK
|
||||
PACKET_DATA_NOACK, // this is a data packet not requiring an ACK
|
||||
PACKET_ACK, // this is an ACK for a packet
|
||||
PACKET_COUNT, // for computational purposes
|
||||
};
|
||||
|
||||
/*.....................................................................
|
||||
Constructor/destructor.
|
||||
.....................................................................*/
|
||||
ConnectionClass (int maxlen, unsigned short magicnum,
|
||||
unsigned long retry_delta, unsigned long max_retries,
|
||||
unsigned long timeout);
|
||||
virtual ~ConnectionClass ();
|
||||
|
||||
/*.....................................................................
|
||||
Initialization.
|
||||
.....................................................................*/
|
||||
virtual void Init (void) {};
|
||||
|
||||
/*.....................................................................
|
||||
Send/Receive routines.
|
||||
.....................................................................*/
|
||||
virtual int Send_Packet (void * buf, int buflen, int ack_req) = 0;
|
||||
virtual int Receive_Packet (void * buf, int buflen) = 0;
|
||||
virtual int Get_Packet (void * buf, int * buflen) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
The main polling routine for the connection. Should be called as often
|
||||
as possible.
|
||||
.....................................................................*/
|
||||
virtual int Service (void);
|
||||
|
||||
/*.....................................................................
|
||||
This routine is used by the retry logic; returns the current time in
|
||||
60ths of a second.
|
||||
.....................................................................*/
|
||||
static unsigned long Time (void);
|
||||
|
||||
/*.....................................................................
|
||||
Utility routines.
|
||||
.....................................................................*/
|
||||
unsigned short Magic_Num (void) { return (MagicNum); }
|
||||
unsigned long Retry_Delta (void) { return (RetryDelta); }
|
||||
void Set_Retry_Delta (unsigned long delta) { RetryDelta = delta;}
|
||||
unsigned long Max_Retries (void) { return (MaxRetries); }
|
||||
void Set_Max_Retries (unsigned long retries) { MaxRetries = retries;}
|
||||
unsigned long Time_Out (void) { return (Timeout); }
|
||||
void Set_TimeOut (unsigned long t) { Timeout = t;}
|
||||
unsigned long Max_Packet_Len (void) { return (MaxPacketLen); }
|
||||
static char * Command_Name(int command);
|
||||
|
||||
/*
|
||||
-------------------------- Protected Interface ---------------------------
|
||||
*/
|
||||
protected:
|
||||
/*.....................................................................
|
||||
Routines to service the Send & Receive queues.
|
||||
.....................................................................*/
|
||||
virtual int Service_Send_Queue(void) = 0;
|
||||
virtual int Service_Receive_Queue(void) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
This routine actually performs a hardware-dependent data send. It's
|
||||
pure virtual, so it >must< be defined by a derived class.
|
||||
.....................................................................*/
|
||||
virtual int Send(char *buf, int buflen) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
This is the maximum packet length, including our own internal header.
|
||||
.....................................................................*/
|
||||
int MaxPacketLen;
|
||||
|
||||
/*.....................................................................
|
||||
Packet staging area; this is where the CommHeaderType gets tacked onto
|
||||
the application's packet before it's sent.
|
||||
.....................................................................*/
|
||||
char *PacketBuf;
|
||||
|
||||
/*.....................................................................
|
||||
This is the magic number assigned to this connection. It is the first
|
||||
few bytes of any transmission.
|
||||
.....................................................................*/
|
||||
unsigned short MagicNum;
|
||||
|
||||
/*.....................................................................
|
||||
This value determines the time delay before a packet is re-sent.
|
||||
.....................................................................*/
|
||||
unsigned long RetryDelta;
|
||||
|
||||
/*.....................................................................
|
||||
This is the maximum number of retries allowed for a packet; if this
|
||||
value is exceeded, the connection is probably broken.
|
||||
.....................................................................*/
|
||||
unsigned long MaxRetries;
|
||||
|
||||
/*.....................................................................
|
||||
This is the total timeout for this connection; if this time is exceeded
|
||||
on a packet, the connection is probably broken.
|
||||
.....................................................................*/
|
||||
unsigned long Timeout;
|
||||
|
||||
/*.....................................................................
|
||||
Names of all packet commands
|
||||
.....................................................................*/
|
||||
static char *ConnectionClass::Commands[PACKET_COUNT];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
151
CONNMGR.H
Normal file
151
CONNMGR.H
Normal file
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c0\vcs\code\connmgr.h_v 1.25 02 Jan 1996 11:14:54 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONNMGR.H *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : December 19, 1994 *
|
||||
* *
|
||||
* Last Update : April 3, 1995 [BR] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* *
|
||||
* This is the Connection Manager base class. This is an abstract base *
|
||||
* class that's just a shell for more functional derived classes. *
|
||||
* The main job of the Connection Manager classes is to parse a "pool" of *
|
||||
* incoming packets, which may be from different computers, and distribute *
|
||||
* those packets to Connection Classes via their Receive_Packet function. *
|
||||
* *
|
||||
* This class should be the only access to the network/modem for the *
|
||||
* application, so if the app needs any functions to access the *
|
||||
* connections or the queue's, the derived versions of this class should *
|
||||
* provide them. *
|
||||
* *
|
||||
* It's up to the derived class to define: *
|
||||
* - Service: polling routine; should Service each connection *
|
||||
* - Init: initialization; should perform hardware-dependent *
|
||||
* initialization, then Init each connection; this function *
|
||||
* isn't defined in this class, since the parameters will *
|
||||
* be highly protocol-dependent) *
|
||||
* - Send_Message:sends a packet across the connection (this function *
|
||||
* isn't defined in this class, since the parameters will *
|
||||
* be highly protocol-dependent) *
|
||||
* - Get_Message: gets a message from the connection (this function *
|
||||
* isn't defined in this class, since the parameters will *
|
||||
* be highly protocol-dependent) *
|
||||
* *
|
||||
* If the derived class supports multiple connections, it should provide *
|
||||
* functions for creating the connections, associating them with a name *
|
||||
* or ID or both, destroying them, and sending data through all or any *
|
||||
* connection. *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CONNMGR_H
|
||||
#define CONNMGR_H
|
||||
|
||||
|
||||
/*
|
||||
***************************** Class Declaration *****************************
|
||||
*/
|
||||
class ConnManClass
|
||||
{
|
||||
/*
|
||||
---------------------------- Public Interface ----------------------------
|
||||
*/
|
||||
public:
|
||||
/*.....................................................................
|
||||
Various useful enums:
|
||||
.....................................................................*/
|
||||
enum IPXConnTag {
|
||||
CONNECTION_NONE = -1, // value of an invalid connection ID
|
||||
};
|
||||
|
||||
/*.....................................................................
|
||||
Constructor/Destructor. These currently do nothing.
|
||||
.....................................................................*/
|
||||
ConnManClass (void) {};
|
||||
virtual ~ConnManClass () {};
|
||||
|
||||
/*.....................................................................
|
||||
The Service routine:
|
||||
- Parses incoming packets, and adds them to the Receive Queue for the
|
||||
Connection Class(s) for this protocol
|
||||
- Invokes each connection's Service routine; returns an error if the
|
||||
connection's Service routine indicates an error.
|
||||
.....................................................................*/
|
||||
virtual int Service (void) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
Sending & receiving data
|
||||
.....................................................................*/
|
||||
virtual int Send_Private_Message (void *buf, int buflen,
|
||||
int ack_req = 1, int conn_id = CONNECTION_NONE) = 0;
|
||||
virtual int Get_Private_Message (void *buf, int *buflen,
|
||||
int *conn_id) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
Connection management
|
||||
.....................................................................*/
|
||||
virtual int Num_Connections(void) = 0;
|
||||
virtual int Connection_ID(int index) = 0;
|
||||
virtual int Connection_Index(int id) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
Queue utility routines
|
||||
.....................................................................*/
|
||||
virtual int Global_Num_Send(void) = 0;
|
||||
virtual int Global_Num_Receive(void) = 0;
|
||||
virtual int Private_Num_Send(int id = CONNECTION_NONE) = 0;
|
||||
virtual int Private_Num_Receive(int id = CONNECTION_NONE) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
Timing management
|
||||
.....................................................................*/
|
||||
virtual void Reset_Response_Time(void) = 0;
|
||||
virtual unsigned long Response_Time(void) = 0;
|
||||
virtual void Set_Timing (unsigned long retrydelta,
|
||||
unsigned long maxretries, unsigned long timeout) = 0;
|
||||
|
||||
/*.....................................................................
|
||||
Debugging
|
||||
.....................................................................*/
|
||||
virtual void Configure_Debug(int index, int type_offset, int type_size,
|
||||
char **names, int maxnames) = 0;
|
||||
virtual void Mono_Debug_Print(int index, int refresh) = 0;
|
||||
/*
|
||||
--------------------------- Private Interface ----------------------------
|
||||
*/
|
||||
private:
|
||||
/*.....................................................................
|
||||
This abstract class contains no data members; but a derived class
|
||||
will contain:
|
||||
- An instance of one or more derived Connection Classes
|
||||
- A buffer to store incoming packets
|
||||
.....................................................................*/
|
||||
};
|
||||
|
||||
#endif
|
4013
CONQUER.CPP
Normal file
4013
CONQUER.CPP
Normal file
File diff suppressed because it is too large
Load diff
11
CONQUER.DEF
Normal file
11
CONQUER.DEF
Normal file
|
@ -0,0 +1,11 @@
|
|||
NAME CONQUER
|
||||
DESCRIPTION 'Command and Conquer for Windows 95'
|
||||
EXETYPE WINDOWS
|
||||
|
||||
IMPORTS
|
||||
DirectDrawCreate=DDRAW.DirectDrawCreate
|
||||
IID_IDirectDraw2=DDRAW.IID_IDirectDraw2
|
||||
DirectSoundCreate=DSOUND.DirectSoundCreate
|
||||
DirectPlayEnumerate=DPLAY.DirectPlayEnumerate
|
||||
DirectPlayCreate=DPLAY.DirectPlayCreate
|
||||
|
773
CONQUER.H
Normal file
773
CONQUER.H
Normal file
|
@ -0,0 +1,773 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define TXT_NONE 0 //
|
||||
#define TXT_CREDIT_FORMAT 1 // %3d.%02d
|
||||
#define TXT_BUTTON_UPGRADE 2 // Upgrade
|
||||
#define TXT_UPGRADE 3 // Upgrade Structure
|
||||
#define TXT_UPGRADE_BUTTON 4 // Upgrade
|
||||
#define TXT_BUTTON_SELL 5 // Sell
|
||||
#define TXT_SELL 6 // Sell Structure
|
||||
#define TXT_DEMOLISH 7 // Demolish Structure
|
||||
#define TXT_BUTTON_REPAIR 8 // Repair
|
||||
#define TXT_REPAIR 9 // Repair Structure
|
||||
#define TXT_REPAIR_BUTTON 10 // Repair
|
||||
#define TXT_YOU 11 // You:
|
||||
#define TXT_ENEMY 12 // Enemy:
|
||||
#define TXT_BUILD_DEST 13 // Buildings Destroyed By
|
||||
#define TXT_UNIT_DEST 14 // Units Destroyed By
|
||||
#define TXT_TIB_HARV 15 // Tiberium Harvested By
|
||||
#define TXT_SCORE_1 16 // Score: %d
|
||||
#define TXT_RANK_OF 17 // You have attained the rank
|
||||
#define TXT_YES 18 // Yes
|
||||
#define TXT_NO 19 // No
|
||||
#define TXT_READY 20 // Ready
|
||||
#define TXT_HOLDING 21 // Holding
|
||||
#define TXT_SCENARIO_WON 22 // Accomplished
|
||||
#define TXT_SCENARIO_LOST 23 // Failed
|
||||
#define TXT_CHOOSE_SIDE 24 // Choose Your Side
|
||||
#define TXT_START_NEW_GAME 25 // Start New Game
|
||||
#define TXT_INTRO 26 // Intro & Sneak Peek
|
||||
#define TXT_CANCEL 27 // Cancel
|
||||
#define TXT_ROCK 28 // Rock
|
||||
#define TXT_CHOAM_RESUME 29 // Resume Game
|
||||
#define TXT_CHOAM_BUILD_THIS 30 // Build This
|
||||
#define TXT_THANK_YOU 31 // Thank you for playing
|
||||
#define TXT_FAME 32 // Hall of Fame
|
||||
#define TXT_GDI 33 // Global Defense Initiative
|
||||
#define TXT_NOD 34 // Brotherhood of Nod
|
||||
#define TXT_CIVILIAN 35 // Civilian
|
||||
#define TXT_JP 36 // Containment Team
|
||||
#define TXT_OK 37 // OK
|
||||
#define TXT_TREE 38 // Tree
|
||||
#define TXT_LEFT 39 //
|
||||
#define TXT_RIGHT 40 //
|
||||
#define TXT_UP 41 //
|
||||
#define TXT_DOWN 42 //
|
||||
#define TXT_CLEAR_MAP 43 // Clear the map
|
||||
#define TXT_INHERIT_MAP 44 // Inherit previous map
|
||||
#define TXT_CLEAR 45 // Clear
|
||||
#define TXT_WATER 46 // Water
|
||||
#define TXT_ROAD 47 // Road
|
||||
#define TXT_TILE 48 // Tile Object
|
||||
#define TXT_SLOPE 49 // Slope
|
||||
#define TXT_BRUSH 50 // Brush
|
||||
#define TXT_PATCH 51 // Patch
|
||||
#define TXT_RIVER 52 // River
|
||||
#define TXT_LOAD_MISSION 53 // Load Mission
|
||||
#define TXT_SAVE_MISSION 54 // Save Mission
|
||||
#define TXT_DELETE_MISSION 55 // Delete Mission
|
||||
#define TXT_LOAD_BUTTON 56 // Load
|
||||
#define TXT_SAVE_BUTTON 57 // Save
|
||||
#define TXT_DELETE_BUTTON 58 // Delete
|
||||
#define TXT_GAME_CONTROLS 59 // Game Controls
|
||||
#define TXT_SOUND_CONTROLS 60 // Sound Controls
|
||||
#define TXT_RESUME_MISSION 61 // Resume Mission
|
||||
#define TXT_VISUAL_CONTROLS 62 // Visual Controls
|
||||
#define TXT_QUIT_MISSION 63 // Abort Mission
|
||||
#define TXT_EXIT_GAME 64 // Exit Game
|
||||
#define TXT_OPTIONS 65 // Options
|
||||
#define TXT_TIBERIUM 66 // Tiberium
|
||||
#define TXT_TIBERIUM_ON 67 // Tiberium On
|
||||
#define TXT_TIBERIUM_OFF 68 // Tiberium Off
|
||||
#define TXT_SQUISH 69 // Squish mark
|
||||
#define TXT_CRATER 70 // Crater
|
||||
#define TXT_SCORCH 71 // Scorch Mark
|
||||
#define TXT_BRIGHTNESS 72 // BRIGHTNESS:
|
||||
#define TXT_MUSIC 73 // MUSIC VOLUME
|
||||
#define TXT_VOLUME 74 // SOUND VOLUME
|
||||
#define TXT_TINT 75 // TINT:
|
||||
#define TXT_CONTRAST 76 // CONTRAST:
|
||||
#define TXT_SPEED 77 // GAME SPEED:
|
||||
#define TXT_SCROLLRATE 78 // SCROLL RATE:
|
||||
#define TXT_COLOR 79 // COLOR:
|
||||
#define TXT_RETURN_TO_GAME 80 // Return to game
|
||||
#define TXT_ENEMY_SOLDIER 81 // Enemy Soldier
|
||||
#define TXT_ENEMY_VEHICLE 82 // Enemy Vehicle
|
||||
#define TXT_ENEMY_STRUCTURE 83 // Enemy Structure
|
||||
#define TXT_FTANK 84 // Flame Tank
|
||||
#define TXT_STANK 85 // Stealth Tank
|
||||
#define TXT_LTANK 86 // Light Tank
|
||||
#define TXT_MTANK 87 // Med. Tank
|
||||
#define TXT_HTANK 88 // Mammoth Tank
|
||||
#define TXT_DUNE_BUGGY 89 // Nod Buggy
|
||||
#define TXT_SAM 90 // SAM Site
|
||||
#define TXT_EYE 91 // Advanced Com. Center
|
||||
#define TXT_MLRS 92 // Rocket Launcher
|
||||
#define TXT_MHQ 93 // Mobile HQ
|
||||
#define TXT_JEEP 94 // Hum-vee
|
||||
#define TXT_TRANS 95 // Transport Helicopter
|
||||
#define TXT_A10 96 // A10
|
||||
#define TXT_C17 97 // C17
|
||||
#define TXT_HARVESTER 98 // Harvester
|
||||
#define TXT_ARTY 99 // Artillery
|
||||
#define TXT_MSAM 100 // S.S.M. Launcher
|
||||
#define TXT_E1 101 // Minigunner
|
||||
#define TXT_E2 102 // Grenadier
|
||||
#define TXT_E3 103 // Bazooka
|
||||
#define TXT_E4 104 // Flamethrower
|
||||
#define TXT_E5 105 // Chem-warrior
|
||||
#define TXT_RAMBO 106 // Commando
|
||||
#define TXT_HOVER 107 // Hovercraft
|
||||
#define TXT_HELI 108 // Attack Helicopter
|
||||
#define TXT_ORCA 109 // Orca
|
||||
#define TXT_APC 110 // APC
|
||||
#define TXT_GUARD_TOWER 111 // Guard Tower
|
||||
#define TXT_COMMAND 112 // Communications Center
|
||||
#define TXT_HELIPAD 113 // Helicopter Pad
|
||||
#define TXT_AIRSTRIP 114 // Airstrip
|
||||
#define TXT_STORAGE 115 // Tiberium Silo
|
||||
#define TXT_CONST_YARD 116 // Construction Yard
|
||||
#define TXT_REFINERY 117 // Tiberium Refinery
|
||||
#define TXT_CIV1 118 // Church
|
||||
#define TXT_CIV2 119 // Han's and Gretel's
|
||||
#define TXT_CIV3 120 // Hewitt's Manor
|
||||
#define TXT_CIV4 121 // Ricktor's House
|
||||
#define TXT_CIV5 122 // Gretchin's House
|
||||
#define TXT_CIV6 123 // The Barn
|
||||
#define TXT_CIV7 124 // Damon's pub
|
||||
#define TXT_CIV8 125 // Fran's House
|
||||
#define TXT_CIV9 126 // Music Factory
|
||||
#define TXT_CIV10 127 // Toymaker's
|
||||
#define TXT_CIV11 128 // Ludwig's House
|
||||
#define TXT_CIV12 129 // Haystacks
|
||||
#define TXT_CIV13 130 // Haystack
|
||||
#define TXT_CIV14 131 // Wheat Field
|
||||
#define TXT_CIV15 132 // Fallow Field
|
||||
#define TXT_CIV16 133 // Corn Field
|
||||
#define TXT_CIV17 134 // Celery Field
|
||||
#define TXT_CIV18 135 // Potato Field
|
||||
#define TXT_CIV20 136 // Sala's House
|
||||
#define TXT_CIV21 137 // Abdul's House
|
||||
#define TXT_CIV22 138 // Pablo's Wicked Pub
|
||||
#define TXT_CIV23 139 // Village Well
|
||||
#define TXT_CIV24 140 // Camel Trader
|
||||
#define TXT_CIV25 141 // Church
|
||||
#define TXT_CIV26 142 // Ali's House
|
||||
#define TXT_CIV27 143 // Trader Ted's
|
||||
#define TXT_CIV28 144 // Menelik's House
|
||||
#define TXT_CIV29 145 // Prestor John's House
|
||||
#define TXT_CIV30 146 // Village Well
|
||||
#define TXT_CIV31 147 // Witch Doctor's Hut
|
||||
#define TXT_CIV32 148 // Rikitikitembo's Hut
|
||||
#define TXT_CIV33 149 // Roarke's Hut
|
||||
#define TXT_CIV34 150 // Mubasa's Hut
|
||||
#define TXT_CIV35 151 // Aksum's Hut
|
||||
#define TXT_CIV36 152 // Mambo's Hut
|
||||
#define TXT_CIV37 153 // The Studio
|
||||
#define TXT_CIVMISS 154 // Technology Center
|
||||
#define TXT_TURRET 155 // Gun Turret
|
||||
#define TXT_GUNBOAT 156 // Gun Boat
|
||||
#define TXT_MCV 157 // Mobile Construction Yard
|
||||
#define TXT_BIKE 158 // Recon Bike
|
||||
#define TXT_POWER 159 // Power Plant
|
||||
#define TXT_ADVANCED_POWER 160 // Advanced Power Plant
|
||||
#define TXT_HOSPITAL 161 // Hospital
|
||||
#define TXT_BARRACKS 162 // Barracks
|
||||
#define TXT_CONCRETE 163 // Concrete
|
||||
#define TXT_PUMP 164 // Oil Pump
|
||||
#define TXT_TANKER 165 // Oil Tanker
|
||||
#define TXT_SANDBAG_WALL 166 // Sandbag Wall
|
||||
#define TXT_CYCLONE_WALL 167 // Chain Link Fence
|
||||
#define TXT_BRICK_WALL 168 // Concrete Wall
|
||||
#define TXT_BARBWIRE_WALL 169 // Barbwire Fence
|
||||
#define TXT_WOOD_WALL 170 // Wood Fence
|
||||
#define TXT_WEAPON_FACTORY 171 // Weapons Factory
|
||||
#define TXT_AGUARD_TOWER 172 // Advanced Guard Tower
|
||||
#define TXT_OBELISK 173 // Obelisk Guard Tower
|
||||
#define TXT_BIO_LAB 174 // Bio-Research Laboratory
|
||||
#define TXT_HAND 175 // Hand of Nod
|
||||
#define TXT_TEMPLE 176 // Temple of Nod
|
||||
#define TXT_FIX_IT 177 // Repair Bay
|
||||
#define TXT_TAB_SIDEBAR 178 // Sidebar
|
||||
#define TXT_TAB_BUTTON_CONTROLS 179 // Options
|
||||
#define TXT_TAB_BUTTON_DATABASE 180 // Database
|
||||
#define TXT_SHADOW 181 // Unrevealed Terrain
|
||||
#define TXT_OPTIONS_MENU 182 // Options Menu
|
||||
#define TXT_STOP 183 // STOP
|
||||
#define TXT_PLAY 184 // PLAY
|
||||
#define TXT_SHUFFLE 185 // SHUFFLE
|
||||
#define TXT_REPEAT 186 // REPEAT
|
||||
#define TXT_MUSIC_VOLUME 187 // Music volume:
|
||||
#define TXT_SOUND_VOLUME 188 // Sound volume:
|
||||
#define TXT_ON 189 // On
|
||||
#define TXT_OFF 190 // Off
|
||||
#define TXT_THEME_AOI 191 // Act On Instinct
|
||||
#define TXT_THEME_TROUBLE 192 // Looks Like Trouble
|
||||
#define TXT_THEME_IND 193 // Industrial
|
||||
#define TXT_THEME_ROUT 194 // Reaching Out
|
||||
#define TXT_THEME_OTP 195 // On The Prowl
|
||||
#define TXT_THEME_PRP 196 // Prepare For Battle
|
||||
#define TXT_THEME_JUSTDOIT 197 // Just Do It!
|
||||
#define TXT_THEME_LINEFIRE 198 // In The Line Of Fire
|
||||
#define TXT_THEME_MARCH 199 // March To Doom
|
||||
#define TXT_THEME_STOPTHEM 200 // Deception
|
||||
#define TXT_THEME_CCTHANG 201 // C&C Thang
|
||||
#define TXT_THEME_BEFEARED 202 // Enemies To Be Feared
|
||||
#define TXT_THEME_WARFARE 203 // Warfare
|
||||
#define TXT_THEME_FWP 204 // Fight, Win, Prevail
|
||||
#define TXT_THEME_DIE 205 // Die!!
|
||||
#define TXT_THEME_NOMERCY 206 // No Mercy
|
||||
#define TXT_THEME_TARGET 207 // Mechanical Man
|
||||
#define TXT_THEME_IAM 208 // I Am
|
||||
#define TXT_THEME_WIN1 209 // Great Shot!
|
||||
#define TXT_MULTIPLAYER_GAME 210 // Multiplayer Game
|
||||
#define TXT_NO_FILES 211 // No files available
|
||||
#define TXT_DELETE_SINGLE_FILE 212 // Do you want to delete this
|
||||
#define TXT_DELETE_MULTIPLE_FILES 213 // Do you want to delete %d
|
||||
#define TXT_RESET_MENU 214 // Reset Values
|
||||
#define TXT_CONFIRMATION 215 // Confirmation
|
||||
#define TXT_CONFIRM_EXIT 216 // Do you want to abort the
|
||||
#define TXT_MISSION_DESCRIPTION 217 // Mission Description
|
||||
#define TXT_C1 218 // Joe
|
||||
#define TXT_C2 219 // Bill
|
||||
#define TXT_C3 220 // Shelly
|
||||
#define TXT_C4 221 // Maria
|
||||
#define TXT_C5 222 // Eydie
|
||||
#define TXT_C6 223 // Dave
|
||||
#define TXT_C7 224 // Phil
|
||||
#define TXT_C8 225 // Dwight
|
||||
#define TXT_C9 226 // Erik
|
||||
#define TXT_MOEBIUS 227 // Dr. Moebius
|
||||
#define TXT_BIB 228 // Road Bib
|
||||
#define TXT_FASTER 229 // Faster
|
||||
#define TXT_SLOWER 230 // Slower
|
||||
#define TXT_ION_CANNON 231 // Ion Cannon
|
||||
#define TXT_NUKE_STRIKE 232 // Nuclear Strike
|
||||
#define TXT_AIR_STRIKE 233 // Air Strike
|
||||
#define TXT_TREX 234 // Tyrannosaurus Rex
|
||||
#define TXT_TRIC 235 // Triceratops
|
||||
#define TXT_RAPT 236 // Velociraptor
|
||||
#define TXT_STEG 237 // Stegasaurus
|
||||
#define TXT_STEEL_CRATE 238 // Steel Crate
|
||||
#define TXT_WOOD_CRATE 239 // Wood Crate
|
||||
#define TXT_FLAG_SPOT 240 // Flag Location
|
||||
#define TXT_G_D_I 241 // GDI
|
||||
#define TXT_N_O_D 242 // NOD
|
||||
#define TXT_UNABLE_READ_SCENARIO 243 // Unable to read scenario!
|
||||
#define TXT_ERROR_LOADING_GAME 244 // Error loading game!
|
||||
#define TXT_OBSOLETE_SAVEGAME 245 // Obsolete saved game.
|
||||
#define TXT_MUSTENTER_DESCRIPTION 246 // You must enter a
|
||||
#define TXT_ERROR_SAVING_GAME 247 // Error saving game!
|
||||
#define TXT_DELETE_FILE_QUERY 248 // Delete this file?
|
||||
#define TXT_EMPTY_SLOT 249 // [EMPTY SLOT]
|
||||
#define TXT_SELECT_MPLAYER_GAME 250 // Select Multiplayer Game
|
||||
#define TXT_MODEM_SERIAL 251 // Modem/Serial
|
||||
#define TXT_NETWORK 252 // Network
|
||||
#define TXT_INIT_NET_ERROR 253 // Unable to initialize
|
||||
#define TXT_JOIN_NETWORK_GAME 254 // Join Network Game
|
||||
#define TXT_NEW 255 // New
|
||||
#define TXT_JOIN 256 // Join
|
||||
#define TXT_SEND_MESSAGE 257 // Send Message
|
||||
#define TXT_YOUR_NAME 258 // Your Name:
|
||||
#define TXT_SIDE_COLON 259 // Side:
|
||||
#define TXT_COLOR_COLON 260 // Color:
|
||||
#define TXT_GAMES 261 // Games
|
||||
#define TXT_PLAYERS 262 // Players
|
||||
#define TXT_SCENARIO_COLON 263 // Scenario:
|
||||
#define TXT_NOT_FOUND 264 // >> NOT FOUND <<
|
||||
#define TXT_START_CREDITS_COLON 265 // Starting Credits:
|
||||
#define TXT_BASES_COLON 266 // Bases:
|
||||
#define TXT_TIBERIUM_COLON 267 // Tiberium:
|
||||
#define TXT_CRATES_COLON 268 // Crates:
|
||||
#define TXT_AI_PLAYERS_COLON 269 // AI Players:
|
||||
#define TXT_REQUEST_DENIED 270 // Request denied.
|
||||
#define TXT_UNABLE_PLAY_WAAUGH 271 // Unable to play; scenario
|
||||
#define TXT_NOTHING_TO_JOIN 272 // Nothing to join!
|
||||
#define TXT_NAME_ERROR 273 // You must enter a name!
|
||||
#define TXT_DUPENAMES_NOTALLOWED 274 // Duplicate names are not
|
||||
#define TXT_YOURGAME_OUTDATED 275 // Your game version is
|
||||
#define TXT_DESTGAME_OUTDATED 276 // Destination game version is
|
||||
#define TXT_THATGUYS_GAME 277 // %s's Game
|
||||
#define TXT_THATGUYS_GAME_BRACKET 278 // [%s's Game]
|
||||
#define TXT_NETGAME_SETUP 279 // Network Game Setup
|
||||
#define TXT_REJECT 280 // Reject
|
||||
#define TXT_CANT_REJECT_SELF 281 // You can't reject yourself!
|
||||
#define TXT_SELECT_PLAYER_REJECT 282 // You must select a player to
|
||||
#define TXT_BASES_ON 283 // Bases On
|
||||
#define TXT_BASES_OFF 284 // Bases Off
|
||||
#define TXT_CRATES_ON 285 // Crates On
|
||||
#define TXT_CRATES_OFF 286 // Crates Off
|
||||
#define TXT_AI_PLAYERS_ON 287 // AI Players On
|
||||
#define TXT_AI_PLAYERS_OFF 288 // AI Players Off
|
||||
#define TXT_SCENARIOS 289 // Scenarios
|
||||
#define TXT_START_CREDITS 290 // Starting Credits
|
||||
#define TXT_ONLY_ONE 291 // Only one player?
|
||||
#define TXT_OOPS 292 // Oops!
|
||||
#define TXT_TO 293 // To %s:
|
||||
#define TXT_TO_ALL 294 // To All:
|
||||
#define TXT_MESSAGE 295 // Message:
|
||||
#define TXT_CONNECTION_LOST 296 // Connection to %s lost!
|
||||
#define TXT_LEFT_GAME 297 // %s has left the game.
|
||||
#define TXT_PLAYER_DEFEATED 298 // %s has been defeated!
|
||||
#define TXT_WAITING_CONNECT 299 // Waiting to Connect...
|
||||
#define TXT_NULL_CONNERR_CHECK_CABLES 300 // Connection error! Check
|
||||
#define TXT_MODEM_CONNERR_REDIALING 301 // Connection
|
||||
#define TXT_MODEM_CONNERR_WAITING 302 // Connection error! Waiting
|
||||
#define TXT_SELECT_SERIAL_GAME 303 // Select Serial Game
|
||||
#define TXT_DIAL_MODEM 304 // Dial Modem
|
||||
#define TXT_ANSWER_MODEM 305 // Answer Modem
|
||||
#define TXT_NULL_MODEM 306 // Null Modem
|
||||
#define TXT_SETTINGS 307 // Settings
|
||||
#define TXT_PORT_COLON 308 // Port:
|
||||
#define TXT_IRQ_COLON 309 // IRQ:
|
||||
#define TXT_BAUD_COLON 310 // Baud:
|
||||
#define TXT_INIT_STRING 311 // Init String:
|
||||
#define TXT_CWAIT_STRING 312 // Call Waiting String:
|
||||
#define TXT_TONE_BUTTON 313 // Tone Dialing
|
||||
#define TXT_PULSE_BUTTON 314 // Pulse Dialing
|
||||
#define TXT_HOST_SERIAL_GAME 315 // Host Serial Game
|
||||
#define TXT_OPPONENT_COLON 316 // Opponent:
|
||||
#define TXT_USER_SIGNED_OFF 317 // User signed off!
|
||||
#define TXT_JOIN_SERIAL_GAME 318 // Join Serial Game
|
||||
#define TXT_PHONE_LIST 319 // Phone List
|
||||
#define TXT_ADD 320 // Add
|
||||
#define TXT_EDIT 321 // Edit
|
||||
#define TXT_DIAL 322 // Dial
|
||||
#define TXT_DEFAULT 323 // Default
|
||||
#define TXT_DEFAULT_SETTINGS 324 // Default Settings
|
||||
#define TXT_CUSTOM_SETTINGS 325 // Custom Settings
|
||||
#define TXT_PHONE_LISTING 326 // Phone Listing
|
||||
#define TXT_NAME_COLON 327 // Name:
|
||||
#define TXT_NUMBER_COLON 328 // Number:
|
||||
#define TXT_UNABLE_FIND_MODEM 329 // Unable to find modem. Check
|
||||
#define TXT_NO_CARRIER 330 // No carrier.
|
||||
#define TXT_LINE_BUSY 331 // Line busy.
|
||||
#define TXT_NUMBER_INVALID 332 // Number invalid.
|
||||
#define TXT_SYSTEM_NOT_RESPONDING 333 // Other system not
|
||||
#define TXT_OUT_OF_SYNC 334 // Games are out of sync!
|
||||
#define TXT_PACKET_TOO_LATE 335 // Packet received too late!
|
||||
#define TXT_PLAYER_LEFT_GAME 336 // Other player has left the
|
||||
#define TXT_FROM 337 // From %s:%s
|
||||
#define TXT_MAP_P01 338 // 2,728,000
|
||||
#define TXT_MAP_P02 339 // 38,385,000
|
||||
#define TXT_MAP_P03 340 // 10,373,000
|
||||
#define TXT_MAP_P04 341 // 51,994,000
|
||||
#define TXT_MAP_P05 342 // 80,387,000
|
||||
#define TXT_MAP_P06 343 // 10,400,000
|
||||
#define TXT_MAP_P07 344 // 5,300,000
|
||||
#define TXT_MAP_P08 345 // 7,867,000
|
||||
#define TXT_MAP_P09 346 // 10,333,000
|
||||
#define TXT_MAP_P10 347 // 1,974,000
|
||||
#define TXT_MAP_P11 348 // 23,169,000
|
||||
#define TXT_MAP_P12 349 // 10,064,000
|
||||
#define TXT_MAP_P13 350 // 3,285,000
|
||||
#define TXT_MAP_P14 351 // 8,868,000
|
||||
#define TXT_MAP_P15 352 // 10,337,000
|
||||
#define TXT_MAP_P16 353 // 4,365,000
|
||||
#define TXT_MAP_P17 354 // 1,607,000
|
||||
#define TXT_MAP_P18 355 // 4,485,000
|
||||
#define TXT_MAP_P19 356 // 56,386,000
|
||||
#define TXT_MAP_P20 357 // 28,305,000
|
||||
#define TXT_MAP_P21 358 // 5,238,000
|
||||
#define TXT_MAP_P22 359 // 2,059,000
|
||||
#define TXT_MAP_P23 360 // 13,497,000
|
||||
#define TXT_MAP_P24 361 // 4,997,000
|
||||
#define TXT_MAP_P25 362 // 88,500,000
|
||||
#define TXT_MAP_P26 363 // 1,106,000
|
||||
#define TXT_MAP_P27 364 // 12,658,000
|
||||
#define TXT_MAP_P28 365 // 3,029,000
|
||||
#define TXT_MAP_P29 366 // 39,084,000
|
||||
#define TXT_MAP_P30 367 // 23,154,000
|
||||
#define TXT_MAP_P31 368 // 8,902,000
|
||||
#define TXT_MAP_P32 369 // 27,791,000
|
||||
#define TXT_MAP_P33 370 // 1,574,000
|
||||
#define TXT_MAP_P34 371 // 15,469,000
|
||||
#define TXT_MAP_P35 372 // 1,300,000
|
||||
#define TXT_MAP_P36 373 // 41,688,000
|
||||
#define TXT_MAP_A00 374 // 24,900 SQ. MI.
|
||||
#define TXT_MAP_A01 375 // 120,727 SQ. MI.
|
||||
#define TXT_MAP_A02 376 // 80,134 SQ. MI.
|
||||
#define TXT_MAP_A03 377 // 233,100 SQ. MI.
|
||||
#define TXT_MAP_A04 378 // 137,838 SQ. MI.
|
||||
#define TXT_MAP_A05 379 // 30,449 SQ. MI.
|
||||
#define TXT_MAP_A06 380 // 18,932 SQ. MI.
|
||||
#define TXT_MAP_A07 381 // 32,377 SQ. MI.
|
||||
#define TXT_MAP_A08 382 // 35,919 SQ. MI.
|
||||
#define TXT_MAP_A09 383 // 7,819 SQ. MI.
|
||||
#define TXT_MAP_A10 384 // 91,699 SQ. MI.
|
||||
#define TXT_MAP_A11 385 // 51,146 SQ. MI.
|
||||
#define TXT_MAP_A12 386 // 11,100 SQ. MI.
|
||||
#define TXT_MAP_A13 387 // 44,365 SQ. MI.
|
||||
#define TXT_MAP_A14 388 // 39,449 SQ. MI.
|
||||
#define TXT_MAP_A15 389 // 19,741 SQ. MI.
|
||||
#define TXT_MAP_A16 390 // 17,413 SQ. MI.
|
||||
#define TXT_MAP_C00 391 // RIGA
|
||||
#define TXT_MAP_C01 392 // WARSAW
|
||||
#define TXT_MAP_C02 393 // MINSK
|
||||
#define TXT_MAP_C03 394 // KIEV
|
||||
#define TXT_MAP_C04 395 // BERLIN
|
||||
#define TXT_MAP_C05 396 // PRAGUE
|
||||
#define TXT_MAP_C06 397 // BRATISLAVA
|
||||
#define TXT_MAP_C07 398 // VIENNA
|
||||
#define TXT_MAP_C08 399 // BUDAPEST
|
||||
#define TXT_MAP_C09 400 // LJUBLJANA
|
||||
#define TXT_MAP_C10 401 // BUCHAREST
|
||||
#define TXT_MAP_C11 402 // ATHENS
|
||||
#define TXT_MAP_C12 403 // TIRANA
|
||||
#define TXT_MAP_C13 404 // SOFIA
|
||||
#define TXT_MAP_C14 405 // BELGRADE
|
||||
#define TXT_MAP_C15 406 // SARAJEVO
|
||||
#define TXT_MAP_C16 407 // TALLINN
|
||||
#define TXT_MAP_C17 408 // TRIPOLI
|
||||
#define TXT_MAP_C18 409 // CAIRO
|
||||
#define TXT_MAP_C19 410 // KHARTOUM
|
||||
#define TXT_MAP_C20 411 // N'DJAMENA
|
||||
#define TXT_MAP_C21 412 // NOUAKCHOTT
|
||||
#define TXT_MAP_C22 413 // YAMOUSSOUKRO
|
||||
#define TXT_MAP_C23 414 // PORTO-NOVO
|
||||
#define TXT_MAP_C24 415 // ABUJA
|
||||
#define TXT_MAP_C25 416 // LIBREVILLE
|
||||
#define TXT_MAP_C26 417 // YAOUNDE
|
||||
#define TXT_MAP_C27 418 // BANGUI
|
||||
#define TXT_MAP_C28 419 // KINSHASA
|
||||
#define TXT_MAP_C29 420 // CAIRO
|
||||
#define TXT_MAP_C30 421 // LUANDA
|
||||
#define TXT_MAP_C31 422 // DAR-ES-SALAAM
|
||||
#define TXT_MAP_C32 423 // WINDHOEK
|
||||
#define TXT_MAP_C33 424 // MAPUTO
|
||||
#define TXT_MAP_C34 425 // GABARONE
|
||||
#define TXT_MAP_C35 426 // CAPE TOWN
|
||||
#define TXT_MAP_GDP00 427 // NEGLIGIBLE
|
||||
#define TXT_MAP_GDP01 428 // $162.7 BLN
|
||||
#define TXT_MAP_GDP02 429 // $47.6 BLN
|
||||
#define TXT_MAP_GDP03 430 // $1,131 BLN
|
||||
#define TXT_MAP_GDP04 431 // $120 BLN
|
||||
#define TXT_MAP_GDP05 432 // $164 BLN
|
||||
#define TXT_MAP_GDP06 433 // $60.1 BLN
|
||||
#define TXT_MAP_GDP07 434 // $21 BLN
|
||||
#define TXT_MAP_GDP08 435 // $71.9 BLN
|
||||
#define TXT_MAP_GDP09 436 // $77 BLN
|
||||
#define TXT_MAP_GDP10 437 // $4.0 BLN
|
||||
#define TXT_MAP_GDP11 438 // $47.3 BLN
|
||||
#define TXT_MAP_GDP12 439 // $120.1 BLN
|
||||
#define TXT_MAP_GDP13 440 // $14.0 BLN
|
||||
#define TXT_MAP_GDP14 441 // $28.9 BLN
|
||||
#define TXT_MAP_GDP15 442 // $39.2 BLN
|
||||
#define TXT_MAP_GDP16 443 // $12.1 BLN
|
||||
#define TXT_MAP_GDP17 444 // $1.0 BLN
|
||||
#define TXT_MAP_GDP18 445 // $10.0 BLN
|
||||
#define TXT_MAP_GDP19 446 // $1.7 BLN
|
||||
#define TXT_MAP_GDP20 447 // $28.0 BLN
|
||||
#define TXT_MAP_GDP21 448 // $5.3 BLN
|
||||
#define TXT_MAP_GDP22 449 // $11.6 BLN
|
||||
#define TXT_MAP_GDP23 450 // $1.3 BLN
|
||||
#define TXT_MAP_GDP24 451 // $6.6 BLN
|
||||
#define TXT_MAP_GDP25 452 // $8.3 BLN
|
||||
#define TXT_MAP_GDP26 453 // $6.9 BLN
|
||||
#define TXT_MAP_GDP27 454 // $2.0 BLN
|
||||
#define TXT_MAP_GDP28 455 // $3.1 BLN
|
||||
#define TXT_MAP_GDP29 456 // $104.0 BLN
|
||||
#define TXT_MAP_PC00 457 // JELGAVA
|
||||
#define TXT_MAP_PC01 458 // GDANSK
|
||||
#define TXT_MAP_PC02 459 // BYELISTOK
|
||||
#define TXT_MAP_PC03 460 // BOBYRUSK
|
||||
#define TXT_MAP_PC04 461 // IVANO-FRANKOVSK
|
||||
#define TXT_MAP_PC05 462 // HANOVER
|
||||
#define TXT_MAP_PC06 463 // DRESDEN
|
||||
#define TXT_MAP_PC07 464 // OSTRAVA
|
||||
#define TXT_MAP_PC08 465 // BRATISLAVA
|
||||
#define TXT_MAP_PC09 466 // SALZBURG
|
||||
#define TXT_MAP_PC10 467 // BUDAPEST
|
||||
#define TXT_MAP_PC11 468 // TRIESTE
|
||||
#define TXT_MAP_PC12 469 // ARAD
|
||||
#define TXT_MAP_PC13 470 // CORINTH
|
||||
#define TXT_MAP_PC14 471 // SHKODER
|
||||
#define TXT_MAP_PC15 472 // SOFIA
|
||||
#define TXT_MAP_PC16 473 // NIS
|
||||
#define TXT_MAP_PC17 474 // BELGRADE
|
||||
#define TXT_MAP_PC18 475 // ?
|
||||
#define TXT_MAP_PC19 476 // PARNU
|
||||
#define TXT_MAP_PC20 477 // TMASSAH
|
||||
#define TXT_MAP_PC21 478 // AL-ALAMYN
|
||||
#define TXT_MAP_PC22 479 // AL-KHARIJAH
|
||||
#define TXT_MAP_PC23 480 // AL-UBAYYID
|
||||
#define TXT_MAP_PC24 481 // KAFIA-KINGI
|
||||
#define TXT_MAP_PC25 482 // OUM HADJER
|
||||
#define TXT_MAP_PC26 483 // MAO
|
||||
#define TXT_MAP_PC27 484 // TIDJIKDJA
|
||||
#define TXT_MAP_PC28 485 // ABIDJAN
|
||||
#define TXT_MAP_PC29 486 // PORTO-NOVO
|
||||
#define TXT_MAP_PC30 487 // ABUJA
|
||||
#define TXT_MAP_PC31 488 // KOULA-MOUTOU
|
||||
#define TXT_MAP_PC32 489 // BERTOUA
|
||||
#define TXT_MAP_PC33 490 // BANGASSOU
|
||||
#define TXT_MAP_PC34 491 // LODJA
|
||||
#define TXT_MAP_PC35 492 // KINSHASA
|
||||
#define TXT_MAP_PC36 493 // LUXOR
|
||||
#define TXT_MAP_PC37 494 // CAIUNDO
|
||||
#define TXT_MAP_PC38 495 // MZUZU
|
||||
#define TXT_MAP_PC39 496 // KEETMANSHOOP
|
||||
#define TXT_MAP_PC40 497 // XAI-XAI
|
||||
#define TXT_MAP_PC41 498 // GHANZI
|
||||
#define TXT_MAP_PC42 499 // CAPE TOWN
|
||||
#define TXT_MAP_GDI 500 // GDI PROGRESSION
|
||||
#define TXT_MAP_NOD 501 // NOD PROGRESSION
|
||||
#define TXT_MAP_LOCATE 502 // LOCATING COORDINATES
|
||||
#define TXT_MAP_NEXT_MISSION 503 // OF NEXT MISSION
|
||||
#define TXT_MAP_SELECT 504 // SELECT TERRITORY
|
||||
#define TXT_MAP_TO_ATTACK 505 // TO ATTACK
|
||||
#define TXT_MAP_GDISTAT0 506 // POPULATION:
|
||||
#define TXT_MAP_GDISTAT1 507 // GEOGRAPHIC AREA:
|
||||
#define TXT_MAP_GDISTAT2 508 // CAPITAL:
|
||||
#define TXT_MAP_GDISTAT3 509 // GOVERNMENT:
|
||||
#define TXT_MAP_GDISTAT4 510 // GROSS DOMESTIC PRODUCT:
|
||||
#define TXT_MAP_GDISTAT5 511 // POINT OF CONFLICT:
|
||||
#define TXT_MAP_GDISTAT6 512 // MILITARY POWER:
|
||||
#define TXT_MAP_NODSTAT0 513 // EXPENDABILITY:
|
||||
#define TXT_MAP_NODSTAT1 514 // GOVT CORRUPTABILITY:
|
||||
#define TXT_MAP_NODSTAT2 515 // NET WORTH:
|
||||
#define TXT_MAP_NODSTAT3 516 // MILITARY STRENGTH:
|
||||
#define TXT_MAP_NODSTAT4 517 // MILITARY RESISTANCE:
|
||||
#define TXT_MAP_COUNTRYNAME0 518 // LATVIA
|
||||
#define TXT_MAP_COUNTRYNAME1 519 // POLAND
|
||||
#define TXT_MAP_COUNTRYNAME2 520 // BELARUS
|
||||
#define TXT_MAP_COUNTRYNAME3 521 // UKRAINE
|
||||
#define TXT_MAP_COUNTRYNAME4 522 // GERMANY
|
||||
#define TXT_MAP_COUNTRYNAME5 523 // CZECH REPUBLIC
|
||||
#define TXT_MAP_COUNTRYNAME6 524 // SLOVAKIA
|
||||
#define TXT_MAP_COUNTRYNAME7 525 // AUSTRIA
|
||||
#define TXT_MAP_COUNTRYNAME8 526 // HUNGARY
|
||||
#define TXT_MAP_COUNTRYNAME9 527 // SLOVENIA
|
||||
#define TXT_MAP_COUNTRYNAME10 528 // ROMANIA
|
||||
#define TXT_MAP_COUNTRYNAME11 529 // GREECE
|
||||
#define TXT_MAP_COUNTRYNAME12 530 // ALBANIA
|
||||
#define TXT_MAP_COUNTRYNAME13 531 // BULGARIA
|
||||
#define TXT_MAP_COUNTRYNAME14 532 // YUGOSLAVIA
|
||||
#define TXT_MAP_COUNTRYNAME15 533 // BOSNIA/HERZOGOVINA
|
||||
#define TXT_MAP_COUNTRYNAME16 534 // LIBYA
|
||||
#define TXT_MAP_COUNTRYNAME17 535 // EGYPT
|
||||
#define TXT_MAP_COUNTRYNAME18 536 // SUDAN
|
||||
#define TXT_MAP_COUNTRYNAME19 537 // CHAD
|
||||
#define TXT_MAP_COUNTRYNAME20 538 // MAURITANIA
|
||||
#define TXT_MAP_COUNTRYNAME21 539 // IVORY COAST
|
||||
#define TXT_MAP_COUNTRYNAME22 540 // BENIN
|
||||
#define TXT_MAP_COUNTRYNAME23 541 // NIGERIA
|
||||
#define TXT_MAP_COUNTRYNAME24 542 // GABON
|
||||
#define TXT_MAP_COUNTRYNAME25 543 // CAMEROON
|
||||
#define TXT_MAP_COUNTRYNAME26 544 // CENTRAL AFRICAN REPUBLIC
|
||||
#define TXT_MAP_COUNTRYNAME27 545 // ZAIRE
|
||||
#define TXT_MAP_COUNTRYNAME28 546 // ANGOLA
|
||||
#define TXT_MAP_COUNTRYNAME29 547 // TANZANIA
|
||||
#define TXT_MAP_COUNTRYNAME30 548 // NAMIBIA
|
||||
#define TXT_MAP_COUNTRYNAME31 549 // MOZAMBIQUE
|
||||
#define TXT_MAP_COUNTRYNAME32 550 // BOTSWANA
|
||||
#define TXT_MAP_COUNTRYNAME33 551 // SOUTH AFRICA
|
||||
#define TXT_MAP_COUNTRYNAME34 552 // ESTONIA
|
||||
#define TXT_MAP_GOVT0 553 // REPUBLIC
|
||||
#define TXT_MAP_GOVT1 554 // DEMOCRATIC STATE
|
||||
#define TXT_MAP_GOVT2 555 // FEDERAL REPUBLIC
|
||||
#define TXT_MAP_GOVT3 556 // CONST. REPUBLIC
|
||||
#define TXT_MAP_GOVT4 557 // PARL. DEMOCRACY
|
||||
#define TXT_MAP_GOVT5 558 // PRES. PARL. REPUBLIC
|
||||
#define TXT_MAP_GOVT6 559 // DEMOCRACY
|
||||
#define TXT_MAP_GOVT7 560 // IN TRANSITION
|
||||
#define TXT_MAP_GOVT8 561 // ISLAMIC SOCIALIST
|
||||
#define TXT_MAP_GOVT9 562 // MILITARY
|
||||
#define TXT_MAP_GOVT10 563 // ISLAMIC REPUBLIC
|
||||
#define TXT_MAP_GOVT11 564 // PARL. REPUBLIC
|
||||
#define TXT_MAP_ARMY0 565 // LOCAL MILITIA
|
||||
#define TXT_MAP_ARMY1 566 // STATE MILITIA
|
||||
#define TXT_MAP_ARMY2 567 // NATIONAL GUARD
|
||||
#define TXT_MAP_ARMY3 568 // FREE STANDING ARMY
|
||||
#define TXT_MAP_ARMY4 569 // ?
|
||||
#define TXT_MAP_ARMY5 570 // NATIONAL POWER
|
||||
#define TXT_MAP_MILITARY0 571 // RESPECTABLE
|
||||
#define TXT_MAP_MILITARY1 572 // FORMIDABLE
|
||||
#define TXT_MAP_MILITARY2 573 // LAUGHABLE
|
||||
#define TXT_MAP_MILITARY3 574 // REASONABLE
|
||||
#define TXT_MAP_MILITARY4 575 // INSIGNIFICANT
|
||||
#define TXT_MAP_CLICK2 576 // CLICK TO CONTINUE
|
||||
#define TXT_MAP_LMH0 577 // LOW
|
||||
#define TXT_MAP_LMH1 578 // MEDIUM
|
||||
#define TXT_MAP_LMH2 579 // HIGH
|
||||
#define TXT_SCORE_TIME 580 // TIME:
|
||||
#define TXT_SCORE_LEAD 581 // LEADERSHIP:
|
||||
#define TXT_SCORE_EFFI 582 // EFFICIENCY:
|
||||
#define TXT_SCORE_TOTA 583 // TOTAL SCORE:
|
||||
#define TXT_SCORE_CASU 584 // CASUALTIES:
|
||||
#define TXT_SCORE_NEUT 585 // NEUTRAL:
|
||||
#define TXT_SCORE_GDI 586 // GDI:
|
||||
#define TXT_SCORE_BUIL 587 // BUILDINGS LOST
|
||||
#define TXT_SCORE_BUIL1 588 // BUILDINGS
|
||||
#define TXT_SCORE_BUIL2 589 // LOST:
|
||||
#define TXT_SCORE_TOP 590 // TOP SCORES
|
||||
#define TXT_SCORE_ENDCRED 591 // ENDING CREDITS:
|
||||
#define TXT_SCORE_TIMEFORMAT1 592 // %dh %dm
|
||||
#define TXT_SCORE_TIMEFORMAT2 593 // %dm
|
||||
#define TXT_SCORE_NOD 594 // NOD:
|
||||
#define TXT_DIALING 595 // Dialing...
|
||||
#define TXT_DIALING_CANCELED 596 // Dialing Canceled
|
||||
#define TXT_WAITING_FOR_CALL 597 // Waiting for Call...
|
||||
#define TXT_ANSWERING_CANCELED 598 // Answering Canceled
|
||||
#define TXT_E7 599 // Engineer
|
||||
#define TXT_SPECIAL_OPTIONS 600 // Special Options
|
||||
#define TXT_VISIBLE_TARGET 601 // Targeting flash visible to
|
||||
#define TXT_TREE_TARGET 602 // Allow targeting of trees.
|
||||
#define TXT_MCV_DEPLOY 603 // Allow undeploy of
|
||||
#define TXT_SMART_DEFENCE 604 // Employ smarter self defense
|
||||
#define TXT_SLOW_BUILD 605 // Moderate production speed.
|
||||
#define TXT_THREE_POINT 606 // Use three point turn logic.
|
||||
#define TXT_TIBERIUM_GROWTH 607 // Tiberium will grow.
|
||||
#define TXT_TIBERIUM_SPREAD 608 // Tiberium will spread.
|
||||
#define TXT_ROAD_PIECES 609 // Disable building "bib"
|
||||
#define TXT_SCATTER 610 // Allow running from
|
||||
#define TXT_MODEM_OR_LOOPBACK 611 // Not a Null Modem Cable
|
||||
#define TXT_MAP 612 // Map
|
||||
#define TXT_FROM_COMPUTER 613 // From Computer:
|
||||
#define TXT_COMP_MSG1 614 // Prepare to die!
|
||||
#define TXT_COMP_MSG2 615 // How about a bullet
|
||||
#define TXT_COMP_MSG3 616 // Incoming!
|
||||
#define TXT_COMP_MSG4 617 // I see you!
|
||||
#define TXT_COMP_MSG5 618 // Hey, I'm over here!
|
||||
#define TXT_COMP_MSG6 619 // Come get some!
|
||||
#define TXT_COMP_MSG7 620 // I got you!
|
||||
#define TXT_COMP_MSG8 621 // You humans are never a
|
||||
#define TXT_COMP_MSG9 622 // Abort, Retry, Ignore? (Ha
|
||||
#define TXT_COMP_MSG10 623 // Format another? (Just
|
||||
#define TXT_COMP_MSG11 624 // Beat me and I'll reboot!
|
||||
#define TXT_COMP_MSG12 625 // You're artificial
|
||||
#define TXT_COMP_MSG13 626 // My AI is better than your
|
||||
#define TXT_THEME_AIRSTRIKE 627 // Air Strike
|
||||
#define TXT_THEME_HEAVYG 628 // Demolition
|
||||
#define TXT_THEME_J1 629 // Untamed Land
|
||||
#define TXT_THEME_JDI_V2 630 // Take 'em Out
|
||||
#define TXT_THEME_RADIO 631 // Radio
|
||||
#define TXT_THEME_RAIN 632 // Rain In The Night
|
||||
#define TXT_THEME_IND2 633 // Canyon Chase
|
||||
#define TXT_THEME_HEART 634 // Heartbreak
|
||||
#define TXT_BLOSSOM_TREE 635 // Blossom Tree
|
||||
#define TXT_RESTATE_MISSION 636 // Restate
|
||||
#define TXT_COMPUTER 637 // Computer
|
||||
#define TXT_COUNT 638 // Unit Count:
|
||||
#define TXT_LEVEL 639 // Tech Level:
|
||||
#define TXT_OPPONENT 640 // Opponent
|
||||
#define TXT_KILLS_COLON 641 // Kills:
|
||||
#define TXT_VIDEO 642 // Video
|
||||
#define TXT_C10 643 // Nikoomba
|
||||
#define TXT_CAPTURE_THE_FLAG 644 // Capture The Flag
|
||||
#define TXT_THEME_VALK 645 // Ride of the Valkyries
|
||||
#define TXT_OBJECTIVE 646 // Mission Objective
|
||||
#define TXT_MISSION 647 // Mission
|
||||
#define TXT_NO_SAVES 648 // No saved games available.
|
||||
#define TXT_CIVILIAN_BUILDING 649 // Civilian Building
|
||||
#define TXT_TECHNICIAN 650 // Technician
|
||||
#define TXT_VISCEROID 651 // Visceroid
|
||||
#define TXT_NO_SAVELOAD 652 // Save game options are not
|
||||
#define TXT_DEFENDER_ADVANTAGE 653 // Defender has the advantage.
|
||||
#define TXT_SHOW_NAMES 654 // Show true object names.
|
||||
#define TXT_DELPHI 655 // Agent Delphi
|
||||
#define TXT_TO_REPLAY 656 // Would you like to replay
|
||||
#define TXT_RECONN_TO 657 // Reconnecting to %s.
|
||||
#define TXT_PLEASE_WAIT 658 // Please wait %02d seconds.
|
||||
#define TXT_SURRENDER 659 // Do you wish to surrender?
|
||||
#define TXT_GDI_NAME 660 // GLOBAL DEFENSE INITIATIVE
|
||||
#define TXT_NOD_NAME 661 // BROTHERHOOD OF NOD
|
||||
#define TXT_SEL_TRANS 662 // SELECT TRANSMISSION
|
||||
#define TXT_GAMENAME_MUSTBE_UNIQUE 663 // Your game name must be
|
||||
#define TXT_GAME_IS_CLOSED 664 // Game is closed.
|
||||
#define TXT_NAME_MUSTBE_UNIQUE 665 // Your name must be unique.
|
||||
#define TXT_RECONNECTING_TO 666 // Reconnecting to %s
|
||||
#define TXT_WAITING_FOR_CONNECTIONS 667 // Waiting for connections...
|
||||
#define TXT_TIME_ALLOWED 668 // Time allowed: %02d seconds
|
||||
#define TXT_PRESS_ESC 669 // Press ESC to cancel.
|
||||
#define TXT_JUST_YOU_AND_ME 670 // From Computer: It's just
|
||||
#define TXT_CAPTURE_THE_FLAG_COLON 671 // Capture the Flag:
|
||||
#define TXT_CHAN 672 // Dr. Chan
|
||||
#define TXT_HAS_ALLIED 673 // %s has allied with %s
|
||||
#define TXT_AT_WAR 674 // %s declares war on %s
|
||||
#define TXT_SEL_TARGET 675 // Select a target
|
||||
#define TXT_SEPARATE_HELIPAD 676 // Allow separate helipad
|
||||
#define TXT_RESIGN 677 // Resign Game
|
||||
#define TXT_TIBERIUM_FAST 678 // Tiberium grows quickly.
|
||||
#define TXT_ANSWERING 679 // Answering...
|
||||
#define TXT_INITIALIZING_MODEM 680 // Initializing Modem...
|
||||
#define TXT_SCENARIOS_DO_NOT_MATCH 681 // Scenarios don't match.
|
||||
#define TXT_POWER_OUTPUT 682 // Power Output
|
||||
#define TXT_POWER_OUTPUT_LOW 683 // Power Output (low)
|
||||
#define TXT_CONTINUE 684 // Continue
|
||||
#define TXT_QUEUE_FULL 685 // Data Queue Overflow
|
||||
#define TXT_SPECIAL_WARNING 686 // %s changed game options!
|
||||
#define TXT_CD_DIALOG_1 687 // Please insert a Command &
|
||||
#define TXT_CD_DIALOG_2 688 // Please insert CD %d (%s)
|
||||
#define TXT_CD_ERROR1 689 // Command & Conquer is unable
|
||||
#define TXT_NO_SOUND_CARD 690 // No Sound Card Detected
|
||||
#define TXT_UNKNOWN 691 // UNKNOWN
|
||||
#define TXT_OLD_GAME 692 // (old)
|
||||
#define TXT_NO_SPACE 693 // Insufficient Disk Space to
|
||||
#define TXT_MUST_HAVE_SPACE 694 // You must have %d megabytes
|
||||
#define TXT_RUN_SETUP 695 // Run SETUP program first.
|
||||
#define TXT_WAITING_FOR_OPPONENT 696 // Waiting for Opponent
|
||||
#define TXT_SELECT_SETTINGS 697 // Please select 'Settings' to
|
||||
#define TXT_PRISON 698 // Prison
|
||||
#define TXT_GAME_WAS_SAVED 699 // Game Saved
|
||||
#define TXT_SPACE_CANT_SAVE 700 // Insufficient disk space to
|
||||
#define TXT_INVALID_PORT_ADDRESS 701 // Invalid Port/Address. COM
|
||||
#define TXT_INVALID_SETTINGS 702 // Invalid Port and/or IRQ
|
||||
#define TXT_IRQ_ALREADY_IN_USE 703 // IRQ already in use
|
||||
#define TXT_ABORT 704 // Abort
|
||||
#define TXT_RESTART 705 // Restart
|
||||
#define TXT_RESTARTING 706 // Mission is
|
||||
#define TXT_LOADING 707 // Mission is loading. Please
|
||||
#define TXT_ERROR_IN_INITSTRING 708 // Error in the InitString
|
||||
#define TXT_ORDER_INFO 709 // Order Info
|
||||
#define TXT_SCENES 710 // Scenes
|
||||
#define TXT_NEW_MISSIONS 711 // New Missions
|
||||
#define TXT_THEME_CHRG 712 // Depth Charge
|
||||
#define TXT_THEME_DRON 713 // Drone
|
||||
#define TXT_THEME_FIST 714 // Iron Fist
|
||||
#define TXT_THEME_CREP 715 // Creeping Upon
|
||||
#define TXT_THEME_80MX 716 // C&C 80's Mix
|
||||
#define TXT_THEME_DRIL 717 // Drill
|
||||
#define TXT_CD_DIALOG_3 718 // Please insert the Covert
|
||||
#define TXT_THEME_RECON 719 // Recon
|
||||
#define TXT_THEME_VOICE 720 // Voice Rhythm
|
||||
#define TXT_ERROR_NO_INIT 721 // Error - modem did not
|
||||
#define TXT_NO_FLOW_CONTROL_RESPONSE 722 // Error - Modem failed to
|
||||
#define TXT_NO_COMPRESSION_RESPONSE 723 // Error - Modem failed to
|
||||
#define TXT_NO_ERROR_CORRECTION_RESPONSE 724 // Error - Modem failed to
|
||||
#define TXT_ERROR_NO_DISABLE 725 // Error - unable to disable
|
||||
#define TXT_ERROR_TOO_MANY 726 // Error - Too many errors
|
||||
#define TXT_IGNORE 727 // Ignore
|
||||
#define TXT_CONNECTING 728 // Connecting... Please Wait.
|
||||
#define TXT_EXPLAIN_REGISTRATION 729 // To play Command & Conquer
|
||||
#define TXT_REGISTER 730 // Register
|
||||
#define TXT_ERROR_UNABLE_TO_RUN_WCHAT 731 // Wchat not installed. Please
|
||||
#define TXT_INTERNET 732 // Internet Game
|
||||
#define TXT_UNABLE_TO_SET_VIDEO_MODE 733 // Error - Unable to set the
|
||||
#define TXT_UNABLE_TO_ALLOCATE_PRIMARY_VIDEO_BUFFER 734 // Error - Unable to allocate
|
||||
#define TXT_NO_DIAL_TONE 735 // No dial tone. Ensure your
|
||||
#define TXT_MODEM_INITIALISATION 736 // Modem Initialization
|
||||
#define TXT_DATA_COMPRESSION 737 // Data Compression
|
||||
#define TXT_ERROR_CORRECTION 738 // Error Correction
|
||||
#define TXT_HARDWARE_FLOW_CONTROL 739 // Hardware Flow Control
|
||||
#define TXT_ADVANCED 740 // Advanced
|
||||
#define TXT_JUST_INTRO 741 // Intro
|
||||
#define TXT_READING_IMAGE_DATA 742 // READING IMAGE DATA
|
||||
#define TXT_ANALYZING 743 // ANALYZING
|
||||
#define TXT_ENHANCING_IMAGE_DATA 744 // ENHANCING IMAGE DATA
|
||||
#define TXT_ISOLATING_OPERATIONAL_THEATER 745 // ISOLATING OPERATIONAL
|
||||
#define TXT_ESTABLISHING_TRADITIONAL_BOUNDARIES 746 // ESTABLISHING TRADITIONAL
|
||||
#define TXT_FOR_VISUAL_REFERENCE 747 // FOR VISUAL REFERENCE
|
||||
#define TXT_ENHANCING_IMAGE 748 // ENHANCING IMAGE
|
||||
#define TXT_BONUS_MISSIONS 749 // Bonus Missions
|
||||
#define TXT_BONUS_MISSION_1 750 // Bonus Mission 1
|
||||
#define TXT_BONUS_MISSION_2 751 // Bonus Mission 2
|
||||
#define TXT_BONUS_MISSION_3 752 // Bonus Mission 3
|
||||
#define TXT_BONUS_MISSION_4 753 // Bonus Mission 4
|
||||
#define TXT_BONUS_MISSION_5 754 // Bonus Mission 5
|
BIN
CONQUER.ICO
Normal file
BIN
CONQUER.ICO
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.9 KiB |
BIN
CONQUER.IDE
Normal file
BIN
CONQUER.IDE
Normal file
Binary file not shown.
79
CONQUER.LNT
Normal file
79
CONQUER.LNT
Normal file
|
@ -0,0 +1,79 @@
|
|||
// Watcom C, C++ (32 bit), -si4 -sp4,
|
||||
// Standard lint options
|
||||
|
||||
// Compiler Options for Watcom C, C++ 32 bit
|
||||
|
||||
-cwc
|
||||
|
||||
// This file contains options to allow PC-lint to process source
|
||||
// files for your compiler. It is used as follows:
|
||||
//
|
||||
// lint co-wc32.lnt source-file(s)
|
||||
//
|
||||
-d_M_IX86=200 // assume Intel 80286 architecture -- modify to suit
|
||||
-d__declspec()= // ignore this construct
|
||||
|
||||
// additional reserve words needed
|
||||
+rw(_loadds,_export)
|
||||
+rw(__interrupt,__near,__far,__huge,__fortran,__pascal,__cdecl)
|
||||
+rw(__export,__loadds,__saveregs,__asm,__fastcall,__stdcall)
|
||||
+rw(_export)
|
||||
|
||||
+fcd // makes cdecl significant -- used for proto generation
|
||||
+fcu // chars are by default unsigned
|
||||
+fsu // so are strings
|
||||
-d__386__ // pre-defined macro for 386 version, not set by -cwc
|
||||
-d__FLAT__ // not set by -cwc
|
||||
-si4 // sizeof(int) is 4
|
||||
-spN4 // sizeof(near pointer) is 4
|
||||
-spF6 // sizeof( far pointer) is 6
|
||||
-sld10 // sizeof(long double) is 10.
|
||||
-function(exit,_exit) // _exit() is like exit()
|
||||
-emacro(734,putc) // don't complain about items being too large.
|
||||
-emacro(506,putc) // don't complain about constant Boolean
|
||||
-emacro(???,va_arg) // the va_arg() macro can yield 415, 416, 661, 662
|
||||
// 796 and 797 (out-of-bounds errors).
|
||||
|
||||
// While processing compiler (library) header files ...
|
||||
-elib(46) // an unsigned short bit field is used as __FILLER__
|
||||
-elib(522) // function return value ignored
|
||||
-elib(537) // repeated include file (ios.h)
|
||||
-elib(641) // converting enum to int
|
||||
-elib(652) // suppress message about #define of earlier declared symbols
|
||||
-elib(655) // ORing enum's
|
||||
-elib(726) // extraneous comma in enumeration
|
||||
-elib(760) // suppress message about multiple identical macro defs
|
||||
-elib(762) // suppress message about multiple identical declarations and
|
||||
-elib(806) // small bit field is signed
|
||||
-elib(1053) // prototypes cannot be distinguished
|
||||
-elib(1511) // member (rdbuf) hides nonvirtual member
|
||||
-elib(1704) // private copy constructor
|
||||
-elib(1712) // default constructor missing
|
||||
-elib(1717) // empty prototypes
|
||||
-elib(1720) // strange argument to assignment operator
|
||||
-elib(1721) // unusual operator =() declaration
|
||||
-elib(1722) // assignment operator does not return ref to class
|
||||
-elib(1724) // strange argument to copy constructor
|
||||
|
||||
-esym(1702,operator<<,operator>>)
|
||||
|
||||
// The following functions exhibit variable return modes.
|
||||
// That is, they may equally-usefully be called for a value
|
||||
// as called just for their effects. Accordingly we inhibit
|
||||
// Warning 534 for these functions.
|
||||
// Feel free to add to or subtract from this list.
|
||||
|
||||
-esym(534,close,creat,fclose,fflush,fprintf,fputc)
|
||||
-esym(534,fputs,fscanf,fseek,fwrite,lseek,memcpy,memmove,memset)
|
||||
-esym(534,printf,puts,scanf,sprintf,sscanf,strcat,strcpy)
|
||||
-esym(534,strncat,strncpy,unlink,write)
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
||||
-width(0,0) // don't break up message lines
|
||||
|
||||
// 32 bit integer and pointer size is four bytes.
|
||||
-si4 -sp4
|
||||
|
||||
// Include directories
|
||||
-ic:\projects\c&czero\code\watcom\h;..\vq\include;..\gcl510\h
|
864
CONQUER.PRO
Normal file
864
CONQUER.PRO
Normal file
|
@ -0,0 +1,864 @@
|
|||
|
||||
Page 1
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Main_Program 1 | 2618 2618 97.11 | 1020 1020 37.83 |
|
||||
_Edit_Unit_Offsets | | |
|
||||
1 | 1021 1021 37.87 | 941 941 34.90 |
|
||||
display.c_NONPUB_Refresh_M | | |
|
||||
ap 1090 | 206 0 7.64 | 200 0 7.42 |
|
||||
_Self_Regulate 41213 | 122 0 4.53 | 122 0 4.53 |
|
||||
scenario.c_NONPUB_Do_Brief | | |
|
||||
ing 1 | 91 91 3.38 | 91 91 3.38 |
|
||||
_Fancy_Text_Print 938 | 80 0 2.97 | 80 0 2.97 |
|
||||
_main 1 | 2694 2694 99.93 | 76 76 2.82 |
|
||||
_Init_Game 1 | 241 241 8.94 | 54 54 2.00 |
|
||||
_Check_Menu 40124 | 47 0 1.74 | 47 0 1.74 |
|
||||
_Load_Map 1 | 16 16 0.59 | 16 16 0.59 |
|
||||
map.c_NONPUB_Smooth_Shadow | | |
|
||||
21775 | 11 0 0.41 | 10 0 0.37 |
|
||||
_Load_A_Icon_Set 3 | 9 3 0.33 | 9 3 0.33 |
|
||||
_Call_Back 41213 | 126 0 4.67 | 4 0 0.15 |
|
||||
_Coord_Cell 77858 | 4 0 0.15 | 4 0 0.15 |
|
||||
_Draw_Map 1090 | 209 0 7.75 | 3 0 0.11 |
|
||||
_Anim_Update 2179 | 2 0 0.07 | 2 0 0.07 |
|
||||
_Game_Screen 1 | 3 3 0.11 | 2 2 0.07 |
|
||||
_Load_System_Strings | | |
|
||||
2 | 2 1 0.07 | 2 1 0.07 |
|
||||
_Map_Cell 4355 | 13 0 0.48 | 2 0 0.07 |
|
||||
_Shape_Ptr 1685 | 2 0 0.07 | 2 0 0.07 |
|
||||
_Load_Brains 3 | 1 0 0.04 | 1 0 0.04 |
|
||||
_Process_Logic 1089 | 5 0 0.19 | 1 0 0.04 |
|
||||
_Unit_From_ID 2603 | 1 0 0.04 | 1 0 0.04 |
|
||||
_Unit_Next 8519 | 1 0 0.04 | 1 0 0.04 |
|
||||
_Unit_Revealed 12676 | 1 0 0.04 | 1 0 0.04 |
|
||||
__cleanup 1 | 1 1 0.04 | 1 1 0.04 |
|
||||
scenario.c_NONPUB_Clear_Sc | | |
|
||||
enario 1 | 1 1 0.04 | 1 1 0.04 |
|
||||
DGROUP@ 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Adjacent_Cell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Adjacent_Free_Cell | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Assign_Destination | | |
|
||||
22 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Assign_Order 47 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Assign_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Attached_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Attached_Unit 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Base_Under_Attack | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bldg_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bldg_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bound_Cursor 59 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Break_Contact_With | | |
|
||||
106 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 2
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Break_Radio_Contact | | |
|
||||
53 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Building 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Cancel 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Custom_Render | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Doit_Render 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Enter 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Enter_Render | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Mode 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_OrderSelect 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Repair 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Return 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Buildables 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Alloc 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Create 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Damage 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Delete 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Destroy 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_First 6 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Free 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_From_ID 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Logic 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Look 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Next 6 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Render 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Scan 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Spec 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_System_Calibrate | | |
|
||||
1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_System_Startup | | |
|
||||
2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Threat 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Unlimbo 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Untarget | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Calculated_Cell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Can_Unit_Enter_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Can_Unit_Enter_Cell | | |
|
||||
49 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Can_Upgrade 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cardinal_To_Fixed | | |
|
||||
20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_CellXY_Coord 463 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Building 4700 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Coord 199 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 3
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Cell_Distance 28 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Facing 16 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Object 15 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Unit 5201 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_X 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Y 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Center_Map 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Change_State 30 | 3 0 0.11 | 0 0 0.00 |
|
||||
_Class_From_Name 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Attached 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Available_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Class_Count | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Dialog 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Display_Message | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Distance 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Is_Clear 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Is_Enemy 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Is_Friendly | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Mono_Print | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Nearest_Spice | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Pause 181 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Pause_Random | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Play_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Random 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Scenario 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Distance | | |
|
||||
283 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Facing | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Kind | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Type | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Tutor_Message | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Add 208 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Cell_Distance | | |
|
||||
454 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Distance 1429 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Facing16 5 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Facing256 1373 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Facing8 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 4
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Coord_Mid 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Move 472 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Scatter 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Snap 712 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Spillage_Number | | |
|
||||
1100 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Sub 454 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_XCell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_XPixel 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_YCell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_YPixel 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coordinates_In_Region | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cursor 1175 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cursor_Move 57 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cursor_Size 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Debug_Callback 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Debug_Key 96 | 1021 11 37.87 | 0 0 0.00 |
|
||||
_Desired_Facing256 | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Destroy_Wall 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Dialog_Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Display_Selected_Terrain | | |
|
||||
9 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Display_Status 1089 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Button_Setup 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Explosion 20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Gas 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Lose 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Win 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Draw_Box 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Draw_Radar 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_End_Game 1089 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Establish_Contact_With | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Establish_Origin 20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Establish_Radio_Contact | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fetch_Text_String | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fill_In_Data 1 | 13 13 0.48 | 0 0 0.00 |
|
||||
_Find_Brain_Size 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Find_Path 5 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Find_Waypoint 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fire_Bullet 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fire_Weapon 107 | 1 0 0.04 | 0 0 0.00 |
|
||||
_Fixed_To_Cardinal | | |
|
||||
48 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Format_Window_String | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 5
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Free_Brains 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_GetPrivateProfileInt | | |
|
||||
16 | 0 0 0.00 | 0 0 0.00 |
|
||||
_GetPrivateProfileString | | |
|
||||
41 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Connection_Info | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Connection_Num | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Internet_Address | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Local_Connection_Numb | | |
|
||||
er 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Greatest_Building_Threat | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Greatest_Threat 8 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Greatest_Unit_Noise | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Greatest_Unit_Threat | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Harvester_Check 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_House_From_Name 10 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Cancel_Event 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Close_Socket 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Get_Local_Target | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Listen_For_Packet | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Open_Socket 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Relinquish_Control | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Schedule_IPX_Event | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Send_Packet 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Icon_Install 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Icon_Remove 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Icon_Update 1090 | 0 0 0.00 | 0 0 0.00 |
|
||||
_In_Radar 75 | 0 0 0.00 | 0 0 0.00 |
|
||||
_In_Radio_Contact 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_In_View 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Info_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Info_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Init_Shapes 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Init_Thread 109 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Interrupt_Thread 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Is_Allied 1224 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Is_Lined_Up 668 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Is_Mapped 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Language_Name 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Launch_GoldenBB 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 6
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Launch_Special 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Legal_Placement 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_Samples 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_MO_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Make_Button 11 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Map_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Map_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Map_Edit 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Mouse_Coord 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Nearest_Spice 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Novell_Detect 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Order_From_Name 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Phrase_CallBack 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Pixel_Coordinate 2348 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Play_Theme 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Alloc 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_First 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Free 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_From_ID 2428 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Logic 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Next 12 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_System_Startup | | |
|
||||
2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Plot_Radar_Pixel 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Plyr_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Plyr_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Power_Effects 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Production_Needs 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Production_Start 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Radar_Checkup 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Radar_Cursor 1090 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Radar_Pixel 4965 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Radio_Contact 97 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Read_Scenario 1 | 34 34 1.26 | 0 0 0.00 |
|
||||
_Read_Scenario_Ini | | |
|
||||
1 | 20 20 0.74 | 0 0 0.00 |
|
||||
_Read_Scenario_Raw | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Recalc_Storage 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Redistribute_Power | | |
|
||||
3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Redraw_Objects 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Refresh_Cell 5007 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Repair_On 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Request_Transport | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Run_Thread 9080 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sample_Effect 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 7
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Say_Phrase 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Scroll_Tactical 48 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Select_House 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Select_Next 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Send_Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Set_Unit_Movement | | |
|
||||
42 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Set_Unit_Rotation | | |
|
||||
1187 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Setup_Menu 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sight_From 14 | 1 0 0.04 | 0 0 0.00 |
|
||||
_Sound_Effect 31 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Special_Discovery | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Speed_Adjust 35 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Speed_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Spew_Spice 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Spice_Adjust 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Spice_Discovery 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Start_Scenario 1 | 125 125 4.64 | 0 0 0.00 |
|
||||
_Start_Thread 38 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Struct_From_Name 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_System_Error 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Build 277 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Building 22 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Cell 27 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Coord 1222 | 1 0 0.04 | 0 0 0.00 |
|
||||
_Target_Distance 331 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Kind 2070 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Legal 437 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Object 53 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Unit 91 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Value 22 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Alloc 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Create 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_First 31 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Free 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_From_ID 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Logic 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Next 31 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_System_Calibrate | | |
|
||||
1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_System_Startup | | |
|
||||
2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Terrain_Cost 32 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Terrain_Type 65 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 8
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Text_Input 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Text_String 70 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Track_Func 1089 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Tutor_Message 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Alloc 22 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Available 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Brainwash 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Check 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Create 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Damage 38 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Delete 20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Enters_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_First 3316 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Free 20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Hidden 31 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_House 1379 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Joins_Team 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Leaves_Team 32 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Limbo 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Loaner 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Look 29 | 1 0 0.04 | 0 0 0.00 |
|
||||
_Unit_Mark 1144 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Physics 2295 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Rally 18 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Select 29 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Sort 1090 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Stun 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_System_Calibrate | | |
|
||||
1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_System_Startup | | |
|
||||
2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Threat 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_UnTarget 31 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Unlimbo 11 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Units_Team 8 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Upgrade_On 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Valid_Thread 1918 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Wall_Flags 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Window_Box 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_WritePrivateProfileInt | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_WritePrivateProfileString | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Write_Scenario 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Write_Scenario_Ini | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 9
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Write_Scenario_Raw | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_XYPixel_Coord 20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_XY_Cell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
__MMODEL 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
__checknull 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
__restorezero 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
__terminate 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_abort 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_strtrim 33 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Anim_Remove | | |
|
||||
20 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Animation_In | | |
|
||||
stall 20 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Crash | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Crater | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Illegal | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Normal | | |
|
||||
640 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_RTimer | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Repeat | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Reverse | | |
|
||||
1280 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Shake | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_ShiftX | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_ShiftY | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Stop | | |
|
||||
640 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Timer | | |
|
||||
1920 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Trigger_ | | |
|
||||
Bloom 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
audio.c_NONPUB_Dune_Load_S | | |
|
||||
ample 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Abort_ | | |
|
||||
Transport 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Busy_S | | |
|
||||
tate 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Change | | |
|
||||
_Facing_One 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 10
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
blogic.c_NONPUB_Cmd_Check_ | | |
|
||||
Up 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Direct | | |
|
||||
ion 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Fire_A | | |
|
||||
t 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Image | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Launch | | |
|
||||
_Unit 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Look | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Neares | | |
|
||||
t_Enemy 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Play_S | | |
|
||||
ound 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Reques | | |
|
||||
t_Transport 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Self_E | | |
|
||||
xplode 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Termin | | |
|
||||
ate_Self 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Unload | | |
|
||||
_Harvester 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
conquer.c_NONPUB_Keyboard_ | | |
|
||||
Process 97 | 1021 11 37.87 | 0 0 0.00 |
|
||||
conquer.c_NONPUB_MT32_Init | | |
|
||||
1 | 0 0 0.00 | 0 0 0.00 |
|
||||
cursor.c_NONPUB_Cursor_Mar | | |
|
||||
k 324 | 0 0 0.00 | 0 0 0.00 |
|
||||
findpath.c_NONPUB_Follow_E | | |
|
||||
dge 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
findpath.c_NONPUB_Optimize | | |
|
||||
_Moves 5 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_IconSet | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Illegal | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Loop | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Map | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Normal | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Repeat | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 11
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
icon.c_NONPUB_Cmd_Stop | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Term | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Timer | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
init.c_NONPUB_Init_Globals | | |
|
||||
1 | 0 0 0.00 | 0 0 0.00 |
|
||||
init.c_NONPUB_Load_A_Brain | | |
|
||||
3 | 1 0 0.04 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_BYTE_In | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_LONG_In | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_Struct_I | | |
|
||||
n 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_Thread_G | | |
|
||||
ameize 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_WORD_In | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_End_Of_Mo | | |
|
||||
ve 14 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_Momentum_ | | |
|
||||
Physics 938 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_Rotation_ | | |
|
||||
Physics 237 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_Start_Of_ | | |
|
||||
Move 64 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_While_Mov | | |
|
||||
ing 930 | 0 0 0.00 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Harves | | |
|
||||
ter_Check 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Unit_C | | |
|
||||
reate 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_BYTE_Out | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_LONG_Out | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_Struct_O | | |
|
||||
ut 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_Thread_N | | |
|
||||
ormalize 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_WORD_Out | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
scenario.c_NONPUB_Typical_ | | |
|
||||
Briefing 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 12
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
strinput.c_NONPUB_Input_Cu | | |
|
||||
rsor 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Attack | | |
|
||||
_Team_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Change | | |
|
||||
_MO 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Displa | | |
|
||||
y_Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Find_T | | |
|
||||
eam_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Recrui | | |
|
||||
t 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Regrou | | |
|
||||
p 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Restor | | |
|
||||
e_MO 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_C | | |
|
||||
ount 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_M | | |
|
||||
in 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_S | | |
|
||||
pread 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_T | | |
|
||||
arget 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Abort_ | | |
|
||||
Transport 14 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_All_St | | |
|
||||
op 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Altern | | |
|
||||
ate_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Animat | | |
|
||||
e 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Call_F | | |
|
||||
or_Landing 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Cargo | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Change | | |
|
||||
_Facing 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Change | | |
|
||||
_Order 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Death_ | | |
|
||||
Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Deploy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Dock | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 13
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
ulogic.c_NONPUB_Cmd_Eject | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Explos | | |
|
||||
ion 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Face_M | | |
|
||||
ove_Toward 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Face_T | | |
|
||||
arCom 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Flash | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Greate | | |
|
||||
st_Threat 8 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Hot_LZ | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Idle | | |
|
||||
6 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Inq_Un | | |
|
||||
it 862 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Is_Clo | | |
|
||||
se_To_NavCom 181 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Is_Clo | | |
|
||||
se_To_TarCom 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Load | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Loaded | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Lock_O | | |
|
||||
n_To_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Look | | |
|
||||
27 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Mine_S | | |
|
||||
pice 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_MultiE | | |
|
||||
xplosion 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Noisie | | |
|
||||
st_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Reques | | |
|
||||
t_Transport 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Rest | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Hu | | |
|
||||
lk 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Na | | |
|
||||
vCom 8 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Sp | | |
|
||||
eed 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Ta | | |
|
||||
rCom 16 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Spew_B | | |
|
||||
odies 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 14
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 12/13/1993
|
||||
Phase: 1 Time: 22:19:33
|
||||
Total Ticks: 2696
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
ulogic.c_NONPUB_Cmd_Target | | |
|
||||
_Dir 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Termin | | |
|
||||
ate_Self 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Threat | | |
|
||||
_Value 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Travel | | |
|
||||
_To 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Unload | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Unload | | |
|
||||
ed_Struct 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Verify | | |
|
||||
_Contact 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
|
||||
Total Logical Percentage : 362.39
|
||||
Total Physical Percentage : 99.93
|
880
CONQUER.REP
Normal file
880
CONQUER.REP
Normal file
|
@ -0,0 +1,880 @@
|
|||
|
||||
Page 1
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
display.c_NONPUB_Refresh_M | | |
|
||||
ap 790 | 630 1 30.27 | 620 1 29.79 |
|
||||
_Call_Back 450547 | 626 0 30.08 | 541 0 26.00 |
|
||||
_Main_Program 0 | 2071 0 99.52 | 521 0 25.04 |
|
||||
_Self_Regulate 790 | 156 0 7.50 | 156 0 7.50 |
|
||||
_Sound_Callback 450547 | 85 0 4.08 | 85 0 4.08 |
|
||||
_Draw_Map 790 | 667 1 32.05 | 37 0 1.78 |
|
||||
_Process_Logic 790 | 100 0 4.81 | 21 0 1.01 |
|
||||
_Icon_Update 790 | 18 0 0.86 | 18 0 0.86 |
|
||||
_Refresh_Cell 5464 | 9 0 0.43 | 9 0 0.43 |
|
||||
_Anim_Update 790 | 14 0 0.67 | 7 0 0.34 |
|
||||
_Unit_Mark 1319 | 15 0 0.72 | 7 0 0.34 |
|
||||
physics.c_NONPUB_Momentum_ | | |
|
||||
Physics 570 | 26 0 1.25 | 7 0 0.34 |
|
||||
_Unit_Physics 1636 | 36 0 1.73 | 5 0 0.24 |
|
||||
_Coord_Cell 55104 | 4 0 0.19 | 4 0 0.19 |
|
||||
_Draw_Vehicle 493 | 4 0 0.19 | 4 0 0.19 |
|
||||
physics.c_NONPUB_While_Mov | | |
|
||||
ing 553 | 4 0 0.19 | 4 0 0.19 |
|
||||
anim.c_NONPUB_Cmd_Normal | | |
|
||||
256 | 3 0 0.14 | 3 0 0.14 |
|
||||
$$VMGETPAGE 1 | 2 2 0.10 | 2 2 0.10 |
|
||||
_Map_Cell 168 | 2 0 0.10 | 2 0 0.10 |
|
||||
_Unit_First 2054 | 2 0 0.10 | 2 0 0.10 |
|
||||
_main 1 | 2073 2073 99.62 | 2 2 0.10 |
|
||||
anim.c_NONPUB_Anim_Remove | | |
|
||||
8 | 2 0 0.10 | 2 0 0.10 |
|
||||
_Can_Unit_Enter_Cell | | |
|
||||
540 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Coord_Distance 1376 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Coord_Facing256 822 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Coord_Spillage_Number | | |
|
||||
1291 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Greatest_Threat 8 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Radio_Contact 45 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Run_Thread 2430 | 4 0 0.19 | 1 0 0.05 |
|
||||
_Shape_Ptr 689 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Target_Coord 773 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Target_Legal 298 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Unit_Damage 13 | 1 0 0.05 | 1 0 0.05 |
|
||||
_Unit_From_ID 1424 | 1 0 0.05 | 1 0 0.05 |
|
||||
__cleanup 1 | 1 1 0.05 | 1 1 0.05 |
|
||||
anim.c_NONPUB_Cmd_Reverse | | |
|
||||
512 | 2 0 0.10 | 1 0 0.05 |
|
||||
DGROUP@ 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Adjacent_Cell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Adjacent_Free_Cell | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Assign_Destination | | |
|
||||
5 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 2
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Assign_Order 15 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Assign_Target 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Attached_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Attached_Unit 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Base_Under_Attack | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bldg_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bldg_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bound_Cursor 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Break_Contact_With | | |
|
||||
40 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Break_Radio_Contact | | |
|
||||
20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Building 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Cancel 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Custom_Render | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Doit_Render 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Enter 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Enter_Render | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Mode 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_OrderSelect 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Repair 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Bttn_Return 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Buildables 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Alloc 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Create 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Damage 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Delete 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Destroy 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_First 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Free 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_From_ID 369 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Logic 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Look 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Next 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Render 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Scan 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Spec 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_System_Calibrate | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_System_Startup | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Threat 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Unlimbo 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Building_Untarget | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 3
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Calculated_Cell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Can_Unit_Enter_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Can_Upgrade 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cardinal_To_Fixed | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_CellXY_Coord 281 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Building 28 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Coord 46 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Distance 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Facing 28 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Object 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Unit 1104 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_X 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cell_Y 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Center_Map 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Change_State 10 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Check_Menu 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Class_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Attached 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Available_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Class_Count | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Dialog 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Display_Message | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Distance 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Is_Clear 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Is_Enemy 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Is_Friendly | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Mono_Print | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Nearest_Spice | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Pause 128 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Pause_Random | | |
|
||||
6 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Play_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Random 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Scenario 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Distance | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Facing | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Kind | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Common_Target_Type | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 4
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Common_Tutor_Message | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Add 18 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Cell_Distance | | |
|
||||
274 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Facing16 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Facing8 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Mid 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Move 570 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Scatter 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Snap 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_Sub 730 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_XCell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_XPixel 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_YCell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coord_YPixel 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Coordinates_In_Region | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cursor 239 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cursor_Move 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Cursor_Size 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Debug_Key 40 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Desired_Facing256 | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Destroy_Wall 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Dialog_Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Display_Selected_Terrain | | |
|
||||
10 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Display_Status 790 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Button_Setup 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Explosion 8 | 3 0 0.14 | 0 0 0.00 |
|
||||
_Do_Gas 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Lose 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Do_Win 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Draw_Box 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Edit_Unit_Offsets | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_End_Game 790 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Establish_Contact_With | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Establish_Origin 9 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Establish_Radio_Contact | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fancy_Text_Print 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fetch_Text_String | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_File_Stream_Sample | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fill_In_Data 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Find_Brain_Size 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 5
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Find_Path 5 | 1 0 0.05 | 0 0 0.00 |
|
||||
_Find_Waypoint 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fire_Bullet 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Fire_Weapon 267 | 3 0 0.14 | 0 0 0.00 |
|
||||
_Fixed_To_Cardinal | | |
|
||||
20 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Format_Window_String | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Free_Brains 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Free_Sample 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Game_Screen 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_GetPrivateProfileInt | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_GetPrivateProfileString | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Connection_Info | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Connection_Num | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Internet_Address | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Get_Local_Connection_Numb | | |
|
||||
er 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Greatest_Building_Threat | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Greatest_Unit_Noise | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Greatest_Unit_Threat | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Harvester_Check 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_House_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Cancel_Event 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Close_Socket 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Get_Local_Target | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Listen_For_Packet | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Open_Socket 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Relinquish_Control | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Schedule_IPX_Event | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_IPX_Send_Packet 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Icon_Install 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Icon_Remove 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_In_Radar 547 | 0 0 0.00 | 0 0 0.00 |
|
||||
_In_Radio_Contact 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_In_View 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Info_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Info_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 6
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Init_Game 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Init_Shapes 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Init_Thread 46 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Interrupt_Thread 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Is_Allied 860 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Is_Lined_Up 273 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Is_Mapped 11 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Language_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Launch_GoldenBB 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Launch_Special 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Legal_Placement 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_Brains 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_Map 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_Sample 9 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_Sample_Into_Buffer | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_Samples 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_System_Strings | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Load_Terrain_Icons | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_MO_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Make_Button 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Map_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Map_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Map_Edit 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Mouse_Coord 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Nearest_Spice 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Novell_Detect 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Order_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Phrase_CallBack 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Pixel_Coordinate 1389 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Play_Sample 9 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Play_Sample_Vol 9 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Play_Theme 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Alloc 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_First 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Free 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_From_ID 1663 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Logic 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_Next 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Player_System_Startup | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Plyr_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Plyr_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Power_Effects 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Production_Needs 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Production_Start 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 7
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Radar_Checkup 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Radar_Cursor 790 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Radar_Pixel 1053 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Read_Scenario 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Read_Scenario_Ini | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Read_Scenario_Raw | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Recalc_Storage 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Redistribute_Power | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Redraw_Objects 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Repair_On 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Request_Transport | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sample_Effect 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sample_Read 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sample_Status 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Say_Phrase 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Scroll_Tactical 128 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Select_House 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Select_Next 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Send_Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Set_Unit_Movement | | |
|
||||
18 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Set_Unit_Rotation | | |
|
||||
532 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Setup_Menu 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sight_From 7 | 2 0 0.10 | 0 0 0.00 |
|
||||
_Sound_Effect 7 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sound_End 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Sound_Init 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Special_Discovery | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Speed_Adjust 16 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Speed_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Spew_Spice 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Spice_Adjust 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Spice_Discovery 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Start_Scenario 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Start_Thread 14 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Stop_Sample 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Stream_Sample 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Struct_From_Name 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Build 92 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Building 5 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Cell 25 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Distance 151 | 1 0 0.05 | 0 0 0.00 |
|
||||
_Target_Kind 1265 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Object 20 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 8
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Target_Unit 24 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Target_Value 299 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Alloc 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Create 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_First 15 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Free 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_From_ID 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Logic 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_Next 15 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_System_Calibrate | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Team_System_Startup | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Terrain_Cost 516 | 1 0 0.05 | 0 0 0.00 |
|
||||
_Terrain_Type 356 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Text_Input 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Text_String 51 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Track_Func 790 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Tutor_Message 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Alloc 9 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Available 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Brainwash 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Check 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Chunk_In 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Chunk_Out 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Create 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Delete 8 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Enters_Building | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Free 8 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Hidden 15 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_House 91 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Joins_Team 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Leaves_Team 15 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Limbo 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Loaner 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Look 7 | 2 0 0.10 | 0 0 0.00 |
|
||||
_Unit_Next 5013 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Rally 5 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Revealed 168 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Select 10 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Sort 790 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Stun 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_System_Calibrate | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_System_Shutdown | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 9
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
_Unit_System_Startup | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_Threat 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Unit_UnTarget 15 | 1 0 0.05 | 0 0 0.00 |
|
||||
_Unit_Unlimbo 7 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Units_Team 2 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Upgrade_On 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Valid_Thread 882 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Vehicle_Edit 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Window_Box 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_WritePrivateProfileInt | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_WritePrivateProfileString | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Write_Scenario 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Write_Scenario_Ini | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_Write_Scenario_Raw | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_XYPixel_Coord 9 | 0 0 0.00 | 0 0 0.00 |
|
||||
_XY_Cell 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
__MMODEL 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
__checknull 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
__restorezero 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
__terminate 1 | 0 0 0.00 | 0 0 0.00 |
|
||||
_abort 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
_strtrim 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Animation_In | | |
|
||||
stall 8 | 2 0 0.10 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Crash | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Crater | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Illegal | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_RTimer | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Repeat | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Shake | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_ShiftX | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_ShiftY | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Stop | | |
|
||||
256 | 2 0 0.10 | 0 0 0.00 |
|
||||
anim.c_NONPUB_Cmd_Timer | | |
|
||||
768 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 10
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
anim.c_NONPUB_Cmd_Trigger_ | | |
|
||||
Bloom 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
audio.c_NONPUB_Dune_Load_S | | |
|
||||
ample 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Abort_ | | |
|
||||
Transport 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Busy_S | | |
|
||||
tate 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Change | | |
|
||||
_Facing_One 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Check_ | | |
|
||||
Up 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Direct | | |
|
||||
ion 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Fire_A | | |
|
||||
t 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Image | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Launch | | |
|
||||
_Unit 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Look | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Neares | | |
|
||||
t_Enemy 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Play_S | | |
|
||||
ound 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Reques | | |
|
||||
t_Transport 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Self_E | | |
|
||||
xplode 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Termin | | |
|
||||
ate_Self 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
blogic.c_NONPUB_Cmd_Unload | | |
|
||||
_Harvester 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
conquer.c_NONPUB_Keyboard_ | | |
|
||||
Process 40 | 0 0 0.00 | 0 0 0.00 |
|
||||
cursor.c_NONPUB_Cursor_Mar | | |
|
||||
k 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
findpath.c_NONPUB_Follow_E | | |
|
||||
dge 10 | 1 0 0.05 | 0 0 0.00 |
|
||||
findpath.c_NONPUB_Optimize | | |
|
||||
_Moves 14 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_IconSet | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Illegal | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Loop | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 11
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
icon.c_NONPUB_Cmd_Map | | |
|
||||
130 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Normal | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Repeat | | |
|
||||
16 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Stop | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Term | | |
|
||||
1 | 0 0 0.00 | 0 0 0.00 |
|
||||
icon.c_NONPUB_Cmd_Timer | | |
|
||||
129 | 0 0 0.00 | 0 0 0.00 |
|
||||
init.c_NONPUB_Init_Globals | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
init.c_NONPUB_Load_A_Brain | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_BYTE_In | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_LONG_In | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_Struct_I | | |
|
||||
n 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_Thread_G | | |
|
||||
ameize 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
loadgame.c_NONPUB_WORD_In | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
map.c_NONPUB_Smooth_Shadow | | |
|
||||
840 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_End_Of_Mo | | |
|
||||
ve 17 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_Rotation_ | | |
|
||||
Physics 318 | 0 0 0.00 | 0 0 0.00 |
|
||||
physics.c_NONPUB_Start_Of_ | | |
|
||||
Move 78 | 1 0 0.05 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Harves | | |
|
||||
ter_Check 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Sound | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
plogic.c_NONPUB_Cmd_Unit_C | | |
|
||||
reate 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_BYTE_Out | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_LONG_Out | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_Struct_O | | |
|
||||
ut 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 12
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
savegame.c_NONPUB_Thread_N | | |
|
||||
ormalize 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
savegame.c_NONPUB_WORD_Out | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
scenario.c_NONPUB_Clear_Sc | | |
|
||||
enario 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
scenario.c_NONPUB_Do_Brief | | |
|
||||
ing 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
scenario.c_NONPUB_Typical_ | | |
|
||||
Briefing 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
soundio.c_NONPUB_DigiCallb | | |
|
||||
ack 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
soundio.c_NONPUB_File_Call | | |
|
||||
back 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
strinput.c_NONPUB_Input_Cu | | |
|
||||
rsor 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Attack | | |
|
||||
_Team_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Change | | |
|
||||
_MO 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Displa | | |
|
||||
y_Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Find_T | | |
|
||||
eam_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Recrui | | |
|
||||
t 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Regrou | | |
|
||||
p 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Restor | | |
|
||||
e_MO 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_C | | |
|
||||
ount 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_M | | |
|
||||
in 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_S | | |
|
||||
pread 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
tlogic.c_NONPUB_Cmd_Team_T | | |
|
||||
arget 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Abort_ | | |
|
||||
Transport 3 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_All_St | | |
|
||||
op 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Altern | | |
|
||||
ate_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Animat | | |
|
||||
e 8 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Call_F | | |
|
||||
or_Landing 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 13
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
ulogic.c_NONPUB_Cmd_Cargo | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Change | | |
|
||||
_Facing 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Change | | |
|
||||
_Order 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Death_ | | |
|
||||
Message 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Deploy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Dock | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Dummy | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Eject | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Explos | | |
|
||||
ion 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Face_M | | |
|
||||
ove_Toward 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Face_T | | |
|
||||
arCom 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Flash | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Greate | | |
|
||||
st_Threat 8 | 1 0 0.05 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Hot_LZ | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Idle | | |
|
||||
2 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Inq_Un | | |
|
||||
it 127 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Is_Clo | | |
|
||||
se_To_NavCom 21 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Is_Clo | | |
|
||||
se_To_TarCom 96 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Load | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Loaded | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Lock_O | | |
|
||||
n_To_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Look | | |
|
||||
7 | 2 0 0.10 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Mine_S | | |
|
||||
pice 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_MultiE | | |
|
||||
xplosion 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Noisie | | |
|
||||
st_Target 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Page 14
|
||||
.RTProfiler Performance Report
|
||||
|
||||
Program: CONQUER.EXE Date: 01/20/1994
|
||||
Phase: 1 Time: 17:04:46
|
||||
Total Ticks: 2081
|
||||
|
||||
---------- Logical --------------- Physical --------
|
||||
| Total Average Pct | Total Average Pct |
|
||||
Total | Clock No. of Total | Clock No. of Total|
|
||||
Symbol Name Calls | Ticks Ticks Time | Ticks Ticks Time |
|
||||
-------------------------------------------------------------------------------
|
||||
ulogic.c_NONPUB_Cmd_Reques | | |
|
||||
t_Transport 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Rest | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Hu | | |
|
||||
lk 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Na | | |
|
||||
vCom 87 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Sp | | |
|
||||
eed 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Set_Ta | | |
|
||||
rCom 10 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Spew_B | | |
|
||||
odies 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Target | | |
|
||||
_Dir 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Termin | | |
|
||||
ate_Self 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Threat | | |
|
||||
_Value 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Travel | | |
|
||||
_To 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Unload | | |
|
||||
0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Unload | | |
|
||||
ed_Struct 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
ulogic.c_NONPUB_Cmd_Verify | | |
|
||||
_Contact 0 | 0 0 0.00 | 0 0 0.00 |
|
||||
|
||||
Total Logical Percentage : 316.67
|
||||
Total Physical Percentage : 99.62
|
1417
CONQUER.TXT
Normal file
1417
CONQUER.TXT
Normal file
File diff suppressed because it is too large
Load diff
425
CONST.CPP
Normal file
425
CONST.CPP
Normal file
|
@ -0,0 +1,425 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\const.cpv 2.17 16 Oct 1995 16:52:24 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONST.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : September 20, 1993 *
|
||||
* *
|
||||
* Last Update : September 20, 1993 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
char const * SourceName[SOURCE_COUNT] =
|
||||
{
|
||||
"North",
|
||||
"East",
|
||||
"South",
|
||||
"West",
|
||||
"Shipping",
|
||||
"Beach",
|
||||
"Air",
|
||||
"Visible",
|
||||
"EnemyBase",
|
||||
"HomeBase",
|
||||
"Ocean",
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** Relative coordinate offsets from the center of a cell for each
|
||||
** of the legal positions that an object in a cell may stop at. Only infantry
|
||||
** are allowed to stop at other than the center of the cell.
|
||||
*/
|
||||
COORDINATE const StoppingCoordAbs[5] = {
|
||||
0x00800080L, // center
|
||||
0x00400040L, // upper left
|
||||
0x004000C0L, // upper right
|
||||
0x00C00040L, // lower left
|
||||
0x00C000C0L // lower right
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** These are the various weapons and their characteristics.
|
||||
**
|
||||
** bullet type dmg, rof, range, sound
|
||||
*/
|
||||
WeaponTypeClass const Weapons[WEAPON_COUNT] = {
|
||||
{BULLET_SNIPER, 125, 40, 0x0580, VOC_SNIPER, ANIM_NONE}, // WEAPON_RIFLE
|
||||
{BULLET_SPREADFIRE, 25, 50, 0x0400, VOC_MINI, ANIM_GUN_N}, // WEAPON_CHAIN_GUN
|
||||
{BULLET_BULLET, 1, 7, 0x01C0, VOC_RIFLE, ANIM_NONE}, // WEAPON_PISTOL
|
||||
{BULLET_BULLET, 15, 20, 0x0200, VOC_MGUN2, ANIM_NONE}, // WEAPON_M16
|
||||
{BULLET_TOW, 30, 60, 0x0400, VOC_BAZOOKA,ANIM_NONE}, // WEAPON_DRAGON
|
||||
{BULLET_FLAME, 35, 50, 0x0200, VOC_FLAMER1,ANIM_FLAME_N}, // WEAPON_FLAMETHROWER
|
||||
{BULLET_FLAME, 50, 50, 0x0200, VOC_FLAMER1,ANIM_FLAME_N}, // WEAPON_FLAME_TONGUE
|
||||
{BULLET_CHEMSPRAY, 80, 70, 0x0200, VOC_FLAMER1,ANIM_CHEM_N}, // WEAPON_CHEMSPRAY
|
||||
{BULLET_GRENADE, 50, 60, 0x0340, VOC_TOSS, ANIM_NONE}, // WEAPON_GRENADE
|
||||
{BULLET_APDS, 25, 60, 0x0400, VOC_TANK2, ANIM_MUZZLE_FLASH}, // WEAPON_75MM
|
||||
{BULLET_APDS, 30, 50, 0x04C0, VOC_TANK3, ANIM_MUZZLE_FLASH}, // WEAPON_105MM
|
||||
{BULLET_APDS, 40, 80, 0x04C0, VOC_TANK4, ANIM_MUZZLE_FLASH}, // WEAPON_120MM
|
||||
{BULLET_APDS, 40, 60, 0x0600, VOC_TANK4, ANIM_MUZZLE_FLASH}, // WEAPON_TURRET_GUN
|
||||
{BULLET_SSM, 75, 80, 0x0500, VOC_ROCKET1,ANIM_NONE}, // WEAPON_MAMMOTH_TUSK
|
||||
{BULLET_SSM2, 75, 80, 0x0600, VOC_ROCKET1,ANIM_NONE}, // WEAPON_MLRS
|
||||
{BULLET_HE, 150, 65, 0x0600, VOC_TANK1, ANIM_MUZZLE_FLASH}, // WEAPON_155MM
|
||||
{BULLET_BULLET, 15, 30, 0x0400, VOC_MGUN11, ANIM_GUN_N}, // WEAPON_M60MG
|
||||
{BULLET_SSM, 60, 35, 0x0780, VOC_ROCKET2,ANIM_NONE}, // WEAPON_TOMAHAWK
|
||||
{BULLET_SSM, 60, 40, 0x0680, VOC_ROCKET2,ANIM_NONE}, // WEAPON_TOW_TWO
|
||||
{BULLET_NAPALM, 100, 20, 0x0480, VOC_NONE, ANIM_NONE}, // WEAPON_NAPALM
|
||||
{BULLET_LASER, 200, 90, 0x0780, VOC_LASER, ANIM_NONE}, // WEAPON_OBELISK_LASER
|
||||
{BULLET_SAM, 50, 50, 0x0780, VOC_ROCKET2,ANIM_NONE}, // WEAPON_NIKE
|
||||
{BULLET_HONEST_JOHN, 100, 200, 0x0A00, VOC_ROCKET1,ANIM_NONE}, // WEAPON_HONEST_JOHN
|
||||
{BULLET_HEADBUTT, 100, 30, 0x0180, VOC_DINOATK1,ANIM_NONE}, // WEAPON_STEG
|
||||
{BULLET_TREXBITE, 155, 30, 0x0180, VOC_DINOATK1,ANIM_NONE}, // WEAPON_TREX
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** These are the various warheads.
|
||||
**
|
||||
** spread factor, destroys walls, destroys wood, destroys Tiberium, {armor defense table}
|
||||
** -vs- {none, wood, aluminum, steel, concrete}
|
||||
*/
|
||||
WarheadTypeClass const Warheads[WARHEAD_COUNT] = {
|
||||
{ 2,false,false,false,{0xFF, 0x80, 0x90, 0x40, 0x40}}, // WARHEAD_SA Small arms -- good against infantry.
|
||||
{ 6,true,true,true,{0xE0, 0xC0, 0x90, 0x40, 0xFF}}, // WARHEAD_HE High explosive -- good against buildings & infantry.
|
||||
{ 6,true,true,false,{0x40, 0xC0, 0xC0, 0xFF, 0x80}}, // WARHEAD_AP Armor piercing -- good against armor.
|
||||
{ 8,false,true,true,{0xE0, 0xFF, 0xB0, 0x40, 0x80}}, // WARHEAD_FIRE Incendiary -- Good against flammables.
|
||||
{ 4,false,false,false,{0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, // WARHEAD_LASER Light Amplification of Stimulated Emission by Radiation.
|
||||
{ 7,true,true,true,{0xFF, 0xFF, 0xC0, 0xC0, 0xC0}}, // WARHEAD_PB Particle beam (neutron beam).
|
||||
{ 4,false,false,false,{0xFF, 0x20, 0x20, 0x10, 0x10}}, // WARHEAD_FIST Punching in hand-to-hand combat.
|
||||
{ 4,false,false,false,{0xFF, 0x20, 0x20, 0x10, 0x10}}, // WARHEAD_FOOT Kicking in hand-to-hand combat.
|
||||
{ 4,false,false,false,{0xFF, 0x08, 0x08, 0x08, 0x08}}, // WARHEAD_HOLLOW_POINT Sniper bullet type.
|
||||
{255,false,false,false,{0xFF, 0x01, 0x01, 0x01, 0x01}}, // WARHEAD_SPORE
|
||||
{ 1, true,true,false,{0xFF, 0xC0, 0x80, 0x20, 0x08}}, // WARHEAD_HEADBUTT
|
||||
{ 1, true,true,false,{0xFF, 0xC0, 0x80, 0x20, 0x08}}, // WARHEAD_FEEDME
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** Converts pixel values (cell relative) into the appropriate lepton (sub cell)
|
||||
** value. This is used to convert pixel (screen) coordinates into the underlying
|
||||
** coordinate system.
|
||||
*/
|
||||
unsigned char const Pixel2Lepton[24] = {
|
||||
0x00,0x0B,0x15,0x20,0x2B,0x35,0x40,0x4B,
|
||||
0x55,0x60,0x6B,0x75,0x80,0x8B,0x95,0xA0,
|
||||
0xAB,0xB5,0xC0,0xCB,0xD5,0xE0,0xEB,0xF5
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** This array is used to index a facing in order to retrieve a cell
|
||||
** offset that, when added to another cell, will achieve the adjacent cell
|
||||
** in the indexed direction.
|
||||
*/
|
||||
CELL const AdjacentCell[FACING_COUNT] = {
|
||||
-(MAP_CELL_W), // North
|
||||
-(MAP_CELL_W-1), // North East
|
||||
1, // East
|
||||
MAP_CELL_W+1, // South East
|
||||
MAP_CELL_W, // South
|
||||
MAP_CELL_W-1, // South West
|
||||
-1, // West
|
||||
-(MAP_CELL_W+1) // North West
|
||||
};
|
||||
|
||||
COORDINATE const AdjacentCoord[FACING_COUNT] = {
|
||||
0xFF000000L,
|
||||
0xFF000100L,
|
||||
0x00000100L,
|
||||
0x01000100L,
|
||||
0x01000000L,
|
||||
0x0100FF00L,
|
||||
0x0000FF00L,
|
||||
0xFF00FF00L
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** This converts 0..255 facing values into either 8, 16, or 32 facing values.
|
||||
** Note: a simple shift won't suffice because 0..255 facing values should
|
||||
** be converted to the CLOSEST appropriate facing, NOT rounded down to the
|
||||
** nearest facing.
|
||||
*/
|
||||
unsigned char const Facing8[256] = {
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
};
|
||||
|
||||
#ifdef NEVER
|
||||
unsigned char const Facing16[256] = {
|
||||
0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
|
||||
2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,
|
||||
4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,
|
||||
6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,
|
||||
8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,
|
||||
10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,
|
||||
12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,
|
||||
14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
** This table incorporates a compensating factor for the distortion caused
|
||||
** by 3D-Studio when it tries to render 45% angles.
|
||||
*/
|
||||
unsigned char const Facing32[256] = {
|
||||
0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,
|
||||
3,4,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,
|
||||
8,8,8,9,9,9,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,
|
||||
13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,
|
||||
16,16,16,16,16,17,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,
|
||||
19,20,20,20,20,20,20,21,21,21,21,21,21,21,22,22,22,22,22,22,22,23,23,23,23,23,23,23,24,24,24,24,
|
||||
24,24,24,25,25,25,25,25,25,25,26,26,26,26,26,26,26,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,
|
||||
29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,30,31,31,31,31,31,31,31,31,31,0,0,0,0,0,0
|
||||
};
|
||||
|
||||
#ifdef OBSOLETE
|
||||
unsigned char const Facing32[256] = {
|
||||
0,0,0,0,
|
||||
1,1,1,1,1,1,1,1,
|
||||
2,2,2,2,2,2,2,2,
|
||||
3,3,3,3,3,3,3,3,
|
||||
4,4,4,4,4,4,4,4,
|
||||
5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7,
|
||||
8,8,8,8,8,8,8,8,
|
||||
9,9,9,9,9,9,9,9,
|
||||
10,10,10,10,10,10,10,10,
|
||||
11,11,11,11,11,11,11,11,
|
||||
12,12,12,12,12,12,12,12,
|
||||
13,13,13,13,13,13,13,13,
|
||||
14,14,14,14,14,14,14,14,
|
||||
15,15,15,15,15,15,15,15,
|
||||
16,16,16,16,16,16,16,16,
|
||||
17,17,17,17,17,17,17,17,
|
||||
18,18,18,18,18,18,18,18,
|
||||
19,19,19,19,19,19,19,19,
|
||||
20,20,20,20,20,20,20,20,
|
||||
21,21,21,21,21,21,21,21,
|
||||
22,22,22,22,22,22,22,22,
|
||||
23,23,23,23,23,23,23,23,
|
||||
24,24,24,24,24,24,24,24,
|
||||
25,25,25,25,25,25,25,25,
|
||||
26,26,26,26,26,26,26,26,
|
||||
27,27,27,27,27,27,27,27,
|
||||
28,28,28,28,28,28,28,28,
|
||||
29,29,29,29,29,29,29,29,
|
||||
30,30,30,30,30,30,30,30,
|
||||
31,31,31,31,31,31,31,31,
|
||||
0,0,0,0
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** These are the movement costs (in ticks at fastest speed) to enter each
|
||||
** of the given terrain cells.
|
||||
*/
|
||||
#define S1 0x00
|
||||
#define S2 0x40
|
||||
#define S3 0x70
|
||||
#define S4 0xA0
|
||||
#define S5 0xC0
|
||||
#define S6 0xFF
|
||||
GroundType const Ground[LAND_COUNT] = {
|
||||
// Foot
|
||||
// | Tracked
|
||||
// | | Harvester
|
||||
// | | | Wheeled
|
||||
// | | | | Winged
|
||||
// | | | | | Hover
|
||||
// | | | | | | float build
|
||||
{66, {S3, S3, S3, S4, S6, S5, S1 }, true}, // LAND_CLEAR
|
||||
{68, {S5, S4, S4, S4, S6, S5, S1 }, true}, // LAND_ROAD
|
||||
{BLUE, {S1, S1, S1, S1, S6, S5, S6 }, false}, // LAND_WATER
|
||||
{DKGREY, {S1, S1, S1, S1, S6, S1, S1 }, false}, // LAND_ROCK
|
||||
{DKGREY, {S1, S1, S1, S1, S6, S1, S1 }, false}, // LAND_WALL
|
||||
{143, {S3, S3, S3, S4, S6, S5, S1 }, false}, // LAND_TIBERIUM
|
||||
{66, {S3, S3, S3, S4, S6, S5, S1 }, false}, // LAND_BEACH
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** These are the names of the theaters.
|
||||
*/
|
||||
TheaterDataType const Theaters[THEATER_COUNT] = {
|
||||
{"DESERT","DESERT","DES"},
|
||||
{"JUNGLE","JUNGLE","JUN"},
|
||||
{"TEMPERATE","TEMPERAT","TEM"},
|
||||
{"WINTER","WINTER","WIN"}
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
** These are the remap tables that are used to convert the units/buildings
|
||||
** into the other color schemes.
|
||||
*/
|
||||
unsigned char const RemapYellow[256] = {
|
||||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // 0..15
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, // 16..31
|
||||
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, // 32..47
|
||||
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, // 48..63
|
||||
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 64..79
|
||||
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, // 80..95
|
||||
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, // 96..111
|
||||
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, // 112..127
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 128..143
|
||||
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 144..159
|
||||
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // 160..175
|
||||
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, // 176..191
|
||||
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // 192..207
|
||||
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // 208..223
|
||||
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 224..239
|
||||
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 240..255
|
||||
};
|
||||
|
||||
unsigned char const RemapRed[256] = {
|
||||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // 0..15
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, // 16..31
|
||||
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, // 32..47
|
||||
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, // 48..63
|
||||
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 64..79
|
||||
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, // 80..95
|
||||
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, // 96..111
|
||||
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, // 112..127
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 128..143
|
||||
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 144..159
|
||||
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // 160..175
|
||||
127,126,125,124,122,46,120,47,125,124,123,122,42,121,120,120, // 176..191
|
||||
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // 192..207
|
||||
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // 208..223
|
||||
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 224..239
|
||||
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 240..255
|
||||
};
|
||||
|
||||
unsigned char const RemapBlueGreen[256] = {
|
||||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // 0..15
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, // 16..31
|
||||
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, // 32..47
|
||||
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, // 48..63
|
||||
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 64..79
|
||||
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, // 80..95
|
||||
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, // 96..111
|
||||
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, // 112..127
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 128..143
|
||||
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 144..159
|
||||
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // 160..175
|
||||
2,119,118,135,136,138,112,12,118,135,136,137,138,139,114,112, // 176..191
|
||||
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // 192..207
|
||||
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // 208..223
|
||||
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 224..239
|
||||
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 240..255
|
||||
};
|
||||
|
||||
unsigned char const RemapOrange[256] = {
|
||||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // 0..15
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, // 16..31
|
||||
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, // 32..47
|
||||
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, // 48..63
|
||||
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 64..79
|
||||
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, // 80..95
|
||||
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, // 96..111
|
||||
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, // 112..127
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 128..143
|
||||
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 144..159
|
||||
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // 160..175
|
||||
24,25,26,27,29,31,46,47,26,27,28,29,30,31,43,47, // 176..191
|
||||
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // 192..207
|
||||
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // 208..223
|
||||
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 224..239
|
||||
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 240..255
|
||||
};
|
||||
|
||||
unsigned char const RemapGreen[256] = {
|
||||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // 0..15
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, // 16..31
|
||||
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, // 32..47
|
||||
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, // 48..63
|
||||
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 64..79
|
||||
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, // 80..95
|
||||
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, // 96..111
|
||||
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, // 112..127
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 128..143
|
||||
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 144..159
|
||||
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // 160..175
|
||||
5,165,166,167,159,142,140,199,166,167,157,3,159,143,142,141, // 176..191
|
||||
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // 192..207
|
||||
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // 208..223
|
||||
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 224..239
|
||||
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 240..255
|
||||
};
|
||||
|
||||
unsigned char const RemapBlue[256] = {
|
||||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // 0..15
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, // 16..31
|
||||
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, // 32..47
|
||||
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, // 48..63
|
||||
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 64..79
|
||||
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, // 80..95
|
||||
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, // 96..111
|
||||
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, // 112..127
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 128..143
|
||||
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 144..159
|
||||
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // 160..175
|
||||
161,200,201,202,204,205,206,12,201,202,203,204,205,115,198,114, // 176..191
|
||||
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // 192..207
|
||||
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // 208..223
|
||||
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 224..239
|
||||
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 240..255
|
||||
};
|
||||
|
||||
unsigned char const RemapNone[256] = {
|
||||
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // 0..15
|
||||
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, // 16..31
|
||||
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, // 32..47
|
||||
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, // 48..63
|
||||
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, // 64..79
|
||||
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, // 80..95
|
||||
96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, // 96..111
|
||||
112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, // 112..127
|
||||
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 128..143
|
||||
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 144..159
|
||||
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // 160..175
|
||||
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, // 176..191
|
||||
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // 192..207
|
||||
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // 208..223
|
||||
224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // 224..239
|
||||
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // 240..255
|
||||
};
|
202
CONTROL.CPP
Normal file
202
CONTROL.CPP
Normal file
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\control.cpv 2.18 16 Oct 1995 16:51:38 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONTROL.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 01/15/95 *
|
||||
* *
|
||||
* Last Update : January 19, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* ControlClass::Action -- Normal action for control gaget objects. *
|
||||
* ControlClass::ControlClass -- Constructor for control class objects. *
|
||||
* ControlClass::Draw_Me -- Draw logic for the control class object. *
|
||||
* ControlClass::Get_ID -- Gets the ID number for this gadget. *
|
||||
* ControlClass::Make_Peer -- Assigns a peer gadget to this gadget. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* ControlClass::ControlClass -- Constructor for control class objects. *
|
||||
* *
|
||||
* This is the normal constructor for control class objects. At this level, it only needs *
|
||||
* to record the ID number assigned to this button. *
|
||||
* *
|
||||
* INPUT: id -- The ID number for this gadget. If the ID number specified is 0, then *
|
||||
* this tells the system that no special ID code should be returned. *
|
||||
* *
|
||||
* x,y -- Pixel coordinate of upper left corner of gadget's region. *
|
||||
* *
|
||||
* w,h -- Pixel dimensions of the gadget's region. *
|
||||
* *
|
||||
* flags -- The input event flags that this gadget recognizes. *
|
||||
* *
|
||||
* sticky-- This this a "sticky" gadget? A sticky gadget is one that takes over the *
|
||||
* gadget list while the mouse button is held down, if the mouse button was *
|
||||
* initially clicked over its region. This is the behavior of "normal" *
|
||||
* buttons in Windows. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/15/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
ControlClass::ControlClass(unsigned id, int x, int y, int w, int h, unsigned flags, int sticky)
|
||||
: GadgetClass(x, y, w, h, flags, sticky)
|
||||
{
|
||||
ID = id;
|
||||
Peer = 0;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* ControlClass::Action -- Normal action for control gaget objects. *
|
||||
* *
|
||||
* This function gets called when the input event that this control gadget is looking for *
|
||||
* occurs. In such a case, the return key code value is changed to the gaget's ID number *
|
||||
* with the special button bit flag attached. *
|
||||
* *
|
||||
* INPUT: flags -- The event that triggered this function call. If this value is NULL, then *
|
||||
* this is a forced (probably due to the sticky flag) call and the key code *
|
||||
* is not altered. *
|
||||
* *
|
||||
* key -- Reference to the key code that will be returned by the controlling *
|
||||
* Input() function. *
|
||||
* *
|
||||
* OUTPUT: bool; Should futher list processing be aborted? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/15/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int ControlClass::Action(unsigned flags, KeyNumType & key)
|
||||
{
|
||||
/*
|
||||
** If there is a peer link established, inform that gadget of this
|
||||
** action call.
|
||||
*/
|
||||
if (Peer) {
|
||||
Peer->Peer_To_Peer(flags, key, *this);
|
||||
}
|
||||
|
||||
/*
|
||||
** Only if the flags indicate that a recognized action has occured, do the
|
||||
** normal processing of this gadget and set return value to the gadget ID.
|
||||
*/
|
||||
if (flags) {
|
||||
if (ID) {
|
||||
key = (KeyNumType)(ID | KN_BUTTON);
|
||||
} else {
|
||||
key = KN_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
return(GadgetClass::Action(flags, key));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* ControlClass::Make_Peer -- Assigns a peer gadget to this gadget. *
|
||||
* *
|
||||
* This function will assign another gadget to this one. That other gadget will receive *
|
||||
* notification of any Action() call to this gadget. Presumably, this is how one gadget *
|
||||
* can automatically adapt to changes in another. Say for example, a slider bar can affect *
|
||||
* the list box it is attached to. *
|
||||
* *
|
||||
* INPUT: gadget -- The gadget to inform when any Action() function is called. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/16/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void ControlClass::Make_Peer(GadgetClass & gadget)
|
||||
{
|
||||
Peer = &gadget;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* ControlClass::Get_ID -- Gets the ID number for this gadget. *
|
||||
* *
|
||||
* This function will query and return with the ID number for this gadget. It is primarily *
|
||||
* used by the Extract_Gadget() function. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the ID number for this gadget. If zero is returned, this means that *
|
||||
* no ID was assigned to this gadget. This is a special case since a zero value will *
|
||||
* never be returned as a pseudo-key as is done with non-zero values. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/16/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
unsigned ControlClass::Get_ID(void) const
|
||||
{
|
||||
return(ID);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* ControlClass::Draw_Me -- Draw logic for the control class object. *
|
||||
* *
|
||||
* This is called when the control object might need to be redrawn or when redrawing is *
|
||||
* necessary. Since at this level of the class heirarchy, no actual drawing occurs, this *
|
||||
* routine doesn't perform any rendering. It does, however, inform any peer attached *
|
||||
* object that a Draw_Me function has been called. Presumably, the attached peer gadget *
|
||||
* might very well need to be redrawn as a result of some action by this gadget. Since this *
|
||||
* gadget might, more than likely, be of the "sticky" variety, a normal call to Draw_Me *
|
||||
* for the other gadget will not occur. It must rely on the call by this routine in order *
|
||||
* to update correctly. A typical example of this would be a slider that is attached to *
|
||||
* a list box. As the slider is being drug around, the attached list box must be redrawn. *
|
||||
* *
|
||||
* INPUT: forced -- Should the redraw be forced regardless of the redraw flag? *
|
||||
* *
|
||||
* OUTPUT: bool; Was the gadget redrawn? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/16/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int ControlClass::Draw_Me(int forced)
|
||||
{
|
||||
if (Peer) {
|
||||
Peer->Draw_Me();
|
||||
}
|
||||
return(GadgetClass::Draw_Me(forced));
|
||||
}
|
89
CONTROL.H
Normal file
89
CONTROL.H
Normal file
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\control.h_v 2.18 16 Oct 1995 16:46:08 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CONTROL.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 01/15/95 *
|
||||
* *
|
||||
* Last Update : January 15, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CONTROL_H
|
||||
#define CONTROL_H
|
||||
|
||||
#include "gadget.h"
|
||||
|
||||
/***************************************************************************
|
||||
* ControlClass -- Region tracking class *
|
||||
* *
|
||||
* INPUT: int x -- x position of gadget *
|
||||
* int y -- y position of gadget *
|
||||
* int w -- width of gadget *
|
||||
* int h -- height of gadget *
|
||||
* UWORD flags -- see enumeration choices *
|
||||
* *
|
||||
* OUTPUT: 0 = new scenario created, -1 = not *
|
||||
* WARNINGS: This class is Abstract (cannot make an instance of it) *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/03/1995 MML : Created. *
|
||||
*=========================================================================*/
|
||||
class ControlClass : public GadgetClass
|
||||
{
|
||||
public:
|
||||
ControlClass(unsigned id, int x, int y, int w, int h, unsigned flags=LEFTPRESS|RIGHTPRESS, int sticky=false);
|
||||
// static ControlClass * Create_One_Of(unsigned id, int x, int y, int w, int h, unsigned flags=LEFTPRESS|RIGHTPRESS, int sticky=false);
|
||||
|
||||
virtual void Make_Peer(GadgetClass & gadget);
|
||||
|
||||
/*
|
||||
** Render support function.
|
||||
*/
|
||||
virtual int Draw_Me(int forced=false);
|
||||
|
||||
/*
|
||||
** This is the ID number for this control gadget. This number is used to generate
|
||||
** a special pseudo-key when the gadget detects valid input.
|
||||
*/
|
||||
unsigned ID;
|
||||
|
||||
protected:
|
||||
virtual unsigned Get_ID(void) const;
|
||||
virtual int Action(unsigned flags, KeyNumType & key);
|
||||
|
||||
/*
|
||||
** This points to the peer button to inform when something happens to this
|
||||
** gadget.
|
||||
*/
|
||||
GadgetClass * Peer;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
545
COORD.CPP
Normal file
545
COORD.CPP
Normal file
|
@ -0,0 +1,545 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\coord.cpv 2.18 16 Oct 1995 16:51:24 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : COORD.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : September 10, 1993 *
|
||||
* *
|
||||
* Last Update : January 7, 1995 [JLB] *
|
||||
* *
|
||||
* Support code to handle the coordinate system is located in this module. *
|
||||
* Routines here will be called QUITE frequently during play and must be *
|
||||
* as efficient as possible. *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Cardinal_To_Fixed -- Converts cardinal numbers into a fixed point number. *
|
||||
* Coord_Move -- Moves a coordinate an arbitrary direction for an arbitrary distance *
|
||||
* Coord_Scatter -- Determines a random coordinate from an anchor point. *
|
||||
* Coord_Spillage_List -- Determines the offset list for cell spillage/occupation. *
|
||||
* Fixed_To_Cardinal -- Converts a fixed point number into a cardinal number. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Coord_Spillage_List -- Determines the offset list for cell spillage/occupation. *
|
||||
* *
|
||||
* This routine will take an arbitrary position and object size and return with a list of *
|
||||
* cell offsets from the current cell for all cells that are overlapped by the object. The *
|
||||
* first cell offset is always zero, so to just get the adjacent spill cell list, add one *
|
||||
* to the return pointer. *
|
||||
* *
|
||||
* INPUT: coord -- The coordinate to examine. *
|
||||
* *
|
||||
* maxsize -- The maximum width/height of the object (pixels). *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to a spillage list. *
|
||||
* *
|
||||
* WARNINGS: The algorithm is limited to working with a maxsize of 48 or less. Larger values *
|
||||
* will generate an incomplete overlap list. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/06/1993 JLB : Created. *
|
||||
* 03/25/1994 JLB : Added width optimization. *
|
||||
* 04/29/1994 JLB : Converted to C. *
|
||||
* 06/03/1994 JLB : Converted to general purpose spillage functionality. *
|
||||
* 01/07/1995 JLB : Manually calculates spillage list for large objects. *
|
||||
*=============================================================================================*/
|
||||
short const * Coord_Spillage_List(COORDINATE coord, int maxsize)
|
||||
{
|
||||
static short const _MoveSpillage[(int)FACING_COUNT+1][5] = {
|
||||
{0, -MAP_CELL_W, REFRESH_EOL, 0, 0}, // N
|
||||
{0, -MAP_CELL_W, 1, -(MAP_CELL_W-1), REFRESH_EOL}, // NE
|
||||
{0, 1, REFRESH_EOL, 0, 0}, // E
|
||||
{0, 1, MAP_CELL_W, MAP_CELL_W+1, REFRESH_EOL}, // SE
|
||||
{0, MAP_CELL_W, REFRESH_EOL, 0, 0}, // S
|
||||
{0, -1, MAP_CELL_W, MAP_CELL_W-1, REFRESH_EOL}, // SW
|
||||
{0, -1, REFRESH_EOL, 0, 0}, // W
|
||||
{0, -1, -MAP_CELL_W, -(MAP_CELL_W+1), REFRESH_EOL}, // NW
|
||||
{0, REFRESH_EOL, 0, 0, 0} // non-moving.
|
||||
// {0, -MAP_CELL_W, -(MAP_CELL_W-1), 1, MAP_CELL_W+1, MAP_CELL_W, MAP_CELL_W-1, -1, -(MAP_CELL_W+1), REFRESH_EOL}
|
||||
};
|
||||
static short _manual[10];
|
||||
//; 00 = on axis
|
||||
//; 01 = below axis
|
||||
//; 10 = above axis
|
||||
//; 11 = undefined
|
||||
static char const _SpillTable[16] = {8,6,2,-1,0,7,1,-1,4,5,3,-1,-1,-1,-1,-1};
|
||||
int index=0;
|
||||
int x,y;
|
||||
|
||||
/*
|
||||
** For mondo-enourmo-gigundo objects, use a prebuilt mammoth table
|
||||
** that covers a 5x5 square region.
|
||||
*/
|
||||
if (maxsize > ICON_PIXEL_W * 2) {
|
||||
static short const _gigundo[] = {
|
||||
-((2*MAP_CELL_W)-2),-((2*MAP_CELL_W)-1),-((2*MAP_CELL_W)),-((2*MAP_CELL_W)+1),-((2*MAP_CELL_W)+2),
|
||||
-((1*MAP_CELL_W)-2),-((1*MAP_CELL_W)-1),-((1*MAP_CELL_W)),-((1*MAP_CELL_W)+1),-((1*MAP_CELL_W)+2),
|
||||
-((0*MAP_CELL_W)-2),-((0*MAP_CELL_W)-1),-((0*MAP_CELL_W)),-((0*MAP_CELL_W)+1),-((0*MAP_CELL_W)+2),
|
||||
((1*MAP_CELL_W)-2),((1*MAP_CELL_W)-1),((1*MAP_CELL_W)),((1*MAP_CELL_W)+1),((1*MAP_CELL_W)+2),
|
||||
+((2*MAP_CELL_W)-2),+((2*MAP_CELL_W)-1),+((2*MAP_CELL_W)),+((2*MAP_CELL_W)+1),+((2*MAP_CELL_W)+2),
|
||||
REFRESH_EOL
|
||||
};
|
||||
return(&_gigundo[0]);
|
||||
}
|
||||
|
||||
/*
|
||||
** For very large objects, build the overlap list by hand. This is time consuming, but
|
||||
** not nearly as time consuming as drawing even a single cell unnecessarily.
|
||||
*/
|
||||
if (maxsize > ICON_PIXEL_W) {
|
||||
maxsize = MIN(maxsize, (ICON_PIXEL_W*2))/2;
|
||||
|
||||
x = Fixed_To_Cardinal(ICON_PIXEL_W, Coord_XLepton(coord));
|
||||
y = Fixed_To_Cardinal(ICON_PIXEL_H, Coord_YLepton(coord));
|
||||
int left = x-maxsize;
|
||||
int right = x+maxsize;
|
||||
int top = y-maxsize;
|
||||
int bottom = y+maxsize;
|
||||
|
||||
_manual[index++] = 0;
|
||||
if (left < 0) _manual[index++] = -1;
|
||||
if (right >= ICON_PIXEL_W) _manual[index++] = 1;
|
||||
if (top < 0) _manual[index++] = -MAP_CELL_W;
|
||||
if (bottom >= ICON_PIXEL_H) _manual[index++] = MAP_CELL_W;
|
||||
if (left < 0 && top < 0) _manual[index++] = -(MAP_CELL_W+1);
|
||||
if (right >= ICON_PIXEL_W && bottom >= ICON_PIXEL_H) _manual[index++] = MAP_CELL_W+1;
|
||||
if (left < 0 && bottom >= ICON_PIXEL_H) _manual[index++] = MAP_CELL_W-1;
|
||||
if (right >= ICON_PIXEL_H && top < 0) _manual[index++] = -(MAP_CELL_W-1);
|
||||
_manual[index] = REFRESH_EOL;
|
||||
return(&_manual[0]);
|
||||
}
|
||||
|
||||
/*
|
||||
** Determine the number of leptons "leeway" allowed this unit.
|
||||
*/
|
||||
int posval = Pixel2Lepton[(ICON_PIXEL_W-maxsize)/2];
|
||||
|
||||
x = Coord_XLepton(coord) - 0x0080;
|
||||
y = Coord_YLepton(coord) - 0x0080;
|
||||
if (y > posval) index |= 0x08; // Spilling South.
|
||||
if (y < -posval) index |= 0x04; // Spilling North.
|
||||
if (x > posval) index |= 0x02; // Spilling East.
|
||||
if (x < -posval) index |= 0x01; // Spilling West.
|
||||
|
||||
return(&_MoveSpillage[_SpillTable[index]][0]);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Coord_Move -- Moves a coordinate an arbitrary direction for an arbitrary distance *
|
||||
* *
|
||||
* This function will move a coordinate in a using SIN and COS arithmetic. *
|
||||
* *
|
||||
* INPUT: start -- The starting coordinate. *
|
||||
* *
|
||||
* dir -- The direction to move the coordinate. *
|
||||
* *
|
||||
* distance -- The distance to move the coordinate position (in leptons). *
|
||||
* *
|
||||
* OUTPUT: Returns the new coordinate position. *
|
||||
* *
|
||||
* WARNINGS: This routine uses multiplies -- use with caution. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
COORDINATE Coord_Move(COORDINATE start, register DirType dir, unsigned short distance)
|
||||
{
|
||||
short x = Coord_X(start);
|
||||
short y = Coord_Y(start);
|
||||
|
||||
Move_Point(x, y, dir, distance);
|
||||
return(XY_Coord(x,y));
|
||||
#ifdef NEVER
|
||||
static char const CosTable[256] = {
|
||||
0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x15,
|
||||
0x18,0x1b,0x1e,0x21,0x24,0x27,0x2a,0x2d,
|
||||
0x30,0x33,0x36,0x39,0x3b,0x3e,0x41,0x43,
|
||||
0x46,0x49,0x4b,0x4e,0x50,0x52,0x55,0x57,
|
||||
0x59,0x5b,0x5e,0x60,0x62,0x64,0x65,0x67,
|
||||
0x69,0x6b,0x6c,0x6e,0x6f,0x71,0x72,0x74,
|
||||
0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7b,
|
||||
0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7e,0x7e,
|
||||
|
||||
0x7f,0x7e,0x7e,0x7e,0x7e,0x7e,0x7d,0x7d,
|
||||
0x7c,0x7b,0x7b,0x7a,0x79,0x78,0x77,0x76,
|
||||
0x75,0x74,0x72,0x71,0x70,0x6e,0x6c,0x6b,
|
||||
0x69,0x67,0x66,0x64,0x62,0x60,0x5e,0x5b,
|
||||
0x59,0x57,0x55,0x52,0x50,0x4e,0x4b,0x49,
|
||||
0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,
|
||||
0x30,0x2d,0x2a,0x27,0x24,0x21,0x1e,0x1b,
|
||||
0x18,0x15,0x12,0x0f,0x0c,0x09,0x06,0x03,
|
||||
|
||||
0x00,0xfd,0xfa,0xf7,0xf4,0xf1,0xee,0xeb,
|
||||
0xe8,0xe5,0xe2,0xdf,0xdc,0xd9,0xd6,0xd3,
|
||||
0xd0,0xcd,0xca,0xc7,0xc5,0xc2,0xbf,0xbd,
|
||||
0xba,0xb7,0xb5,0xb2,0xb0,0xae,0xab,0xa9,
|
||||
0xa7,0xa5,0xa2,0xa0,0x9e,0x9c,0x9a,0x99,
|
||||
0x97,0x95,0x94,0x92,0x91,0x8f,0x8e,0x8c,
|
||||
0x8b,0x8a,0x89,0x88,0x87,0x86,0x85,0x85,
|
||||
0x84,0x83,0x83,0x82,0x82,0x82,0x82,0x82,
|
||||
|
||||
0x82,0x82,0x82,0x82,0x82,0x82,0x83,0x83,
|
||||
0x84,0x85,0x85,0x86,0x87,0x88,0x89,0x8a,
|
||||
0x8b,0x8c,0x8e,0x8f,0x90,0x92,0x94,0x95,
|
||||
0x97,0x99,0x9a,0x9c,0x9e,0xa0,0xa2,0xa5,
|
||||
0xa7,0xa9,0xab,0xae,0xb0,0xb2,0xb5,0xb7,
|
||||
0xba,0xbd,0xbf,0xc2,0xc5,0xc7,0xca,0xcd,
|
||||
0xd0,0xd3,0xd6,0xd9,0xdc,0xdf,0xe2,0xe5,
|
||||
0xe8,0xeb,0xee,0xf1,0xf4,0xf7,0xfa,0xfd,
|
||||
};
|
||||
|
||||
static char const SinTable[256] = {
|
||||
0x7f,0x7e,0x7e,0x7e,0x7e,0x7e,0x7d,0x7d,
|
||||
0x7c,0x7b,0x7b,0x7a,0x79,0x78,0x77,0x76,
|
||||
0x75,0x74,0x72,0x71,0x70,0x6e,0x6c,0x6b,
|
||||
0x69,0x67,0x66,0x64,0x62,0x60,0x5e,0x5b,
|
||||
0x59,0x57,0x55,0x52,0x50,0x4e,0x4b,0x49,
|
||||
0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,
|
||||
0x30,0x2d,0x2a,0x27,0x24,0x21,0x1e,0x1b,
|
||||
0x18,0x15,0x12,0x0f,0x0c,0x09,0x06,0x03,
|
||||
|
||||
0x00,0xfd,0xfa,0xf7,0xf4,0xf1,0xee,0xeb,
|
||||
0xe8,0xe5,0xe2,0xdf,0xdc,0xd9,0xd6,0xd3,
|
||||
0xd0,0xcd,0xca,0xc7,0xc5,0xc2,0xbf,0xbd,
|
||||
0xba,0xb7,0xb5,0xb2,0xb0,0xae,0xab,0xa9,
|
||||
0xa7,0xa5,0xa2,0xa0,0x9e,0x9c,0x9a,0x99,
|
||||
0x97,0x95,0x94,0x92,0x91,0x8f,0x8e,0x8c,
|
||||
0x8b,0x8a,0x89,0x88,0x87,0x86,0x85,0x85,
|
||||
0x84,0x83,0x83,0x82,0x82,0x82,0x82,0x82,
|
||||
|
||||
0x82,0x82,0x82,0x82,0x82,0x82,0x83,0x83,
|
||||
0x84,0x85,0x85,0x86,0x87,0x88,0x89,0x8a,
|
||||
0x8b,0x8c,0x8e,0x8f,0x90,0x92,0x94,0x95,
|
||||
0x97,0x99,0x9a,0x9c,0x9e,0xa0,0xa2,0xa5,
|
||||
0xa7,0xa9,0xab,0xae,0xb0,0xb2,0xb5,0xb7,
|
||||
0xba,0xbd,0xbf,0xc2,0xc5,0xc7,0xca,0xcd,
|
||||
0xd0,0xd3,0xd6,0xd9,0xdc,0xdf,0xe2,0xe5,
|
||||
0xe8,0xeb,0xee,0xf1,0xf4,0xf7,0xfa,0xfd,
|
||||
|
||||
0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x15,
|
||||
0x18,0x1b,0x1e,0x21,0x24,0x27,0x2a,0x2d,
|
||||
0x30,0x33,0x36,0x39,0x3b,0x3e,0x41,0x43,
|
||||
0x46,0x49,0x4b,0x4e,0x50,0x52,0x55,0x57,
|
||||
0x59,0x5b,0x5e,0x60,0x62,0x64,0x65,0x67,
|
||||
0x69,0x6b,0x6c,0x6e,0x6f,0x71,0x72,0x74,
|
||||
0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7b,
|
||||
0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7e,0x7e,
|
||||
};
|
||||
distance = distance; // Keep LINT quiet.
|
||||
|
||||
/*
|
||||
** Calculate and add in the X component of the move.
|
||||
*/
|
||||
_AX = CosTable[dir];
|
||||
asm imul word ptr distance
|
||||
asm shl ax,1
|
||||
asm rcl dx,1
|
||||
asm mov al,ah
|
||||
asm mov ah,dl
|
||||
_DX = _AX;
|
||||
*((int*)&start) += _DX;
|
||||
// asm add [word ptr start],ax
|
||||
|
||||
/*
|
||||
** Calculate and add in the Y component of the move.
|
||||
*/
|
||||
_AX = SinTable[dir];
|
||||
asm imul word ptr distance
|
||||
asm shl ax,1
|
||||
asm rcl dx,1
|
||||
asm mov al,ah
|
||||
asm mov ah,dl
|
||||
asm neg ax // Subtraction needed because of inverted sine table.
|
||||
_DX = _AX;
|
||||
*(((int*)&start)+1) += _DX;
|
||||
// asm add [word ptr start+2],ax
|
||||
|
||||
return(start);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef OBSOLETE
|
||||
//BG: Note, this routine is replaced by assembly in COORDA.ASM
|
||||
/***********************************************************************************************
|
||||
* Cardinal_To_Fixed -- Converts cardinal numbers into a fixed point number. *
|
||||
* *
|
||||
* This utility function will convert cardinal numbers into a fixed point fraction. The *
|
||||
* use of fixed point numbers occurs throughout the product -- since it is a convenient *
|
||||
* tool. The fixed point number is based on the formula: *
|
||||
* *
|
||||
* result = cardinal / base *
|
||||
* *
|
||||
* The accuracy of the fixed point number is limited to 1/256 as the lowest and up to *
|
||||
* 256 as the largest. *
|
||||
* *
|
||||
* INPUT: base -- The key number to base the fraction about. *
|
||||
* *
|
||||
* cardinal -- The other number (hey -- what do you call it?) *
|
||||
* *
|
||||
* OUTPUT: Returns with the fixed point number of the "cardinal" parameter as it relates *
|
||||
* to the "base" parameter. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
unsigned Cardinal_To_Fixed(unsigned base, unsigned cardinal)
|
||||
{
|
||||
long temp = 0;
|
||||
|
||||
if (base) {
|
||||
*(unsigned*)(((char*)&temp)+1) = cardinal; // Shift up by 8 bits.
|
||||
_DX = FP_SEG(temp);
|
||||
_AX = FP_OFF(temp);
|
||||
asm div word ptr base
|
||||
return(_AX);
|
||||
}
|
||||
return(0xFFFF);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OBSOLETE
|
||||
//BG: Note, this routine is replaced by assembly in COORDA.ASM
|
||||
/***********************************************************************************************
|
||||
* Fixed_To_Cardinal -- Converts a fixed point number into a cardinal number. *
|
||||
* *
|
||||
* Use this routine to convert a fixed point number into a cardinal number. *
|
||||
* *
|
||||
* INPUT: base -- The base number that the original fixed point number was created from. *
|
||||
* *
|
||||
* fixed -- The fixed point number to convert. *
|
||||
* *
|
||||
* OUTPUT: Returns with the reconverted number. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
unsigned Fixed_To_Cardinal(unsigned base, unsigned fixed)
|
||||
{
|
||||
unsigned long temp;
|
||||
|
||||
_AX = base;
|
||||
asm mul word ptr fixed
|
||||
_CX = _AX;
|
||||
temp = ((unsigned long)MK_FP(_DX, _CX)) + 0x80;
|
||||
if ( *((char*)&temp+3) ) {
|
||||
return(0xFFFF);
|
||||
}
|
||||
return(*(unsigned*)(((char*)&temp)+1));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Coord_Scatter -- Determines a random coordinate from an anchor point. *
|
||||
* *
|
||||
* This routine will perform a scatter algorithm on the specified *
|
||||
* anchor point in order to return with another coordinate that is *
|
||||
* randomly nearby the original. Typical use of this would be for *
|
||||
* missile targeting. *
|
||||
* *
|
||||
* INPUT: coord -- This is the anchor coordinate. *
|
||||
* *
|
||||
* distance -- This is the distance in pixels that the scatter *
|
||||
* should fall within. *
|
||||
* *
|
||||
* lock -- bool; Convert the new coordinate into a center *
|
||||
* cell based coordinate? *
|
||||
* *
|
||||
* OUTPUT: Returns with a new coordinate that is nearby the original. *
|
||||
* *
|
||||
* WARNINGS: Maximum pixel scatter distance is 255. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/01/1992 JLB : Created. *
|
||||
* 05/13/1992 JLB : Only uses Random(). *
|
||||
*=============================================================================================*/
|
||||
COORDINATE Coord_Scatter(COORDINATE coord, unsigned distance, bool lock)
|
||||
{
|
||||
COORDINATE newcoord;
|
||||
|
||||
newcoord = Coord_Move(coord, Random_Pick(DIR_N, DIR_MAX), distance);
|
||||
|
||||
if (newcoord & 0xC000C000L) newcoord = coord;
|
||||
|
||||
if (lock) {
|
||||
newcoord = Coord_Snap(newcoord);
|
||||
}
|
||||
|
||||
return(newcoord);
|
||||
}
|
||||
|
||||
extern int calcx(signed short, short distance);
|
||||
#pragma aux calcx parm [ax] [bx] \
|
||||
modify [eax dx] \
|
||||
value [eax] = \
|
||||
"imul bx" \
|
||||
"shl ax,1" \
|
||||
"rcl dx,1" \
|
||||
"mov al,ah" \
|
||||
"mov ah,dl" \
|
||||
"cwd" \
|
||||
// "and eax,0FFFFh";
|
||||
|
||||
extern int calcy(signed short, short distance);
|
||||
#pragma aux calcy parm [ax] [bx] \
|
||||
modify [eax dx] \
|
||||
value [eax] = \
|
||||
"imul bx" \
|
||||
"shl ax,1" \
|
||||
"rcl dx,1" \
|
||||
"mov al,ah" \
|
||||
"mov ah,dl" \
|
||||
"cwd" \
|
||||
"neg eax";
|
||||
// "and eax,0FFFFh" \
|
||||
|
||||
void Move_Point(short &x, short &y, register DirType dir, unsigned short distance)
|
||||
{
|
||||
// static char const CosTable[256] = {
|
||||
static char const CosTable[256] = {
|
||||
0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x15,
|
||||
0x18,0x1b,0x1e,0x21,0x24,0x27,0x2a,0x2d,
|
||||
0x30,0x33,0x36,0x39,0x3b,0x3e,0x41,0x43,
|
||||
0x46,0x49,0x4b,0x4e,0x50,0x52,0x55,0x57,
|
||||
0x59,0x5b,0x5e,0x60,0x62,0x64,0x65,0x67,
|
||||
0x69,0x6b,0x6c,0x6e,0x6f,0x71,0x72,0x74,
|
||||
0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7b,
|
||||
0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7e,0x7e,
|
||||
|
||||
0x7f,0x7e,0x7e,0x7e,0x7e,0x7e,0x7d,0x7d,
|
||||
0x7c,0x7b,0x7b,0x7a,0x79,0x78,0x77,0x76,
|
||||
0x75,0x74,0x72,0x71,0x70,0x6e,0x6c,0x6b,
|
||||
0x69,0x67,0x66,0x64,0x62,0x60,0x5e,0x5b,
|
||||
0x59,0x57,0x55,0x52,0x50,0x4e,0x4b,0x49,
|
||||
0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,
|
||||
0x30,0x2d,0x2a,0x27,0x24,0x21,0x1e,0x1b,
|
||||
0x18,0x15,0x12,0x0f,0x0c,0x09,0x06,0x03,
|
||||
|
||||
0x00,0xfd,0xfa,0xf7,0xf4,0xf1,0xee,0xeb,
|
||||
0xe8,0xe5,0xe2,0xdf,0xdc,0xd9,0xd6,0xd3,
|
||||
0xd0,0xcd,0xca,0xc7,0xc5,0xc2,0xbf,0xbd,
|
||||
0xba,0xb7,0xb5,0xb2,0xb0,0xae,0xab,0xa9,
|
||||
0xa7,0xa5,0xa2,0xa0,0x9e,0x9c,0x9a,0x99,
|
||||
0x97,0x95,0x94,0x92,0x91,0x8f,0x8e,0x8c,
|
||||
0x8b,0x8a,0x89,0x88,0x87,0x86,0x85,0x85,
|
||||
0x84,0x83,0x83,0x82,0x82,0x82,0x82,0x82,
|
||||
|
||||
0x82,0x82,0x82,0x82,0x82,0x82,0x83,0x83,
|
||||
0x84,0x85,0x85,0x86,0x87,0x88,0x89,0x8a,
|
||||
0x8b,0x8c,0x8e,0x8f,0x90,0x92,0x94,0x95,
|
||||
0x97,0x99,0x9a,0x9c,0x9e,0xa0,0xa2,0xa5,
|
||||
0xa7,0xa9,0xab,0xae,0xb0,0xb2,0xb5,0xb7,
|
||||
0xba,0xbd,0xbf,0xc2,0xc5,0xc7,0xca,0xcd,
|
||||
0xd0,0xd3,0xd6,0xd9,0xdc,0xdf,0xe2,0xe5,
|
||||
0xe8,0xeb,0xee,0xf1,0xf4,0xf7,0xfa,0xfd,
|
||||
};
|
||||
|
||||
// static char const SinTable[256] = {
|
||||
static char const SinTable[256] = {
|
||||
0x7f,0x7e,0x7e,0x7e,0x7e,0x7e,0x7d,0x7d,
|
||||
0x7c,0x7b,0x7b,0x7a,0x79,0x78,0x77,0x76,
|
||||
0x75,0x74,0x72,0x71,0x70,0x6e,0x6c,0x6b,
|
||||
0x69,0x67,0x66,0x64,0x62,0x60,0x5e,0x5b,
|
||||
0x59,0x57,0x55,0x52,0x50,0x4e,0x4b,0x49,
|
||||
0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,
|
||||
0x30,0x2d,0x2a,0x27,0x24,0x21,0x1e,0x1b,
|
||||
0x18,0x15,0x12,0x0f,0x0c,0x09,0x06,0x03,
|
||||
|
||||
0x00,0xfd,0xfa,0xf7,0xf4,0xf1,0xee,0xeb,
|
||||
0xe8,0xe5,0xe2,0xdf,0xdc,0xd9,0xd6,0xd3,
|
||||
0xd0,0xcd,0xca,0xc7,0xc5,0xc2,0xbf,0xbd,
|
||||
0xba,0xb7,0xb5,0xb2,0xb0,0xae,0xab,0xa9,
|
||||
0xa7,0xa5,0xa2,0xa0,0x9e,0x9c,0x9a,0x99,
|
||||
0x97,0x95,0x94,0x92,0x91,0x8f,0x8e,0x8c,
|
||||
0x8b,0x8a,0x89,0x88,0x87,0x86,0x85,0x85,
|
||||
0x84,0x83,0x83,0x82,0x82,0x82,0x82,0x82,
|
||||
|
||||
0x82,0x82,0x82,0x82,0x82,0x82,0x83,0x83,
|
||||
0x84,0x85,0x85,0x86,0x87,0x88,0x89,0x8a,
|
||||
0x8b,0x8c,0x8e,0x8f,0x90,0x92,0x94,0x95,
|
||||
0x97,0x99,0x9a,0x9c,0x9e,0xa0,0xa2,0xa5,
|
||||
0xa7,0xa9,0xab,0xae,0xb0,0xb2,0xb5,0xb7,
|
||||
0xba,0xbd,0xbf,0xc2,0xc5,0xc7,0xca,0xcd,
|
||||
0xd0,0xd3,0xd6,0xd9,0xdc,0xdf,0xe2,0xe5,
|
||||
0xe8,0xeb,0xee,0xf1,0xf4,0xf7,0xfa,0xfd,
|
||||
|
||||
0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x15,
|
||||
0x18,0x1b,0x1e,0x21,0x24,0x27,0x2a,0x2d,
|
||||
0x30,0x33,0x36,0x39,0x3b,0x3e,0x41,0x43,
|
||||
0x46,0x49,0x4b,0x4e,0x50,0x52,0x55,0x57,
|
||||
0x59,0x5b,0x5e,0x60,0x62,0x64,0x65,0x67,
|
||||
0x69,0x6b,0x6c,0x6e,0x6f,0x71,0x72,0x74,
|
||||
0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7b,
|
||||
0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7e,0x7e,
|
||||
};
|
||||
distance = distance; // Keep LINT quiet.
|
||||
|
||||
#ifdef OBSOLETE
|
||||
/*
|
||||
** Calculate and add in the X component of the move.
|
||||
*/
|
||||
_AX = CosTable[dir];
|
||||
asm imul word ptr distance
|
||||
asm shl ax,1
|
||||
asm rcl dx,1
|
||||
asm mov al,ah
|
||||
asm mov ah,dl
|
||||
_DX = _AX;
|
||||
x += _DX;
|
||||
#else
|
||||
x += calcx(CosTable[dir], distance);
|
||||
#endif
|
||||
// asm add [word ptr start],ax
|
||||
|
||||
#ifdef OBSOLETE
|
||||
/*
|
||||
** Calculate and add in the Y component of the move.
|
||||
*/
|
||||
_AX = SinTable[dir];
|
||||
asm imul word ptr distance
|
||||
asm shl ax,1
|
||||
asm rcl dx,1
|
||||
asm mov al,ah
|
||||
asm mov ah,dl
|
||||
asm neg ax // Subtraction needed because of inverted sine table.
|
||||
_DX = _AX;
|
||||
y += _DX;
|
||||
#else
|
||||
y += calcy(SinTable[dir], distance);
|
||||
#endif
|
||||
// asm add [word ptr start+2],ax
|
||||
|
||||
}
|
134
COORDA.ASM
Normal file
134
COORDA.ASM
Normal file
|
@ -0,0 +1,134 @@
|
|||
;
|
||||
; Command & Conquer(tm)
|
||||
; Copyright 2025 Electronic Arts Inc.
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU General Public License as published by
|
||||
; the Free Software Foundation, either version 3 of the License, or
|
||||
; (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
|
||||
;***************************************************************************
|
||||
;** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S I N C **
|
||||
;***************************************************************************
|
||||
;* *
|
||||
;* Project Name : Command & Conquer *
|
||||
;* *
|
||||
;* File Name : COORDA.ASM *
|
||||
;* *
|
||||
;* Programmer : Barry W. Green *
|
||||
;* *
|
||||
;* Start Date : February 17, 1995 *
|
||||
;* *
|
||||
;* Last Update : February 17, 1995 [BWG] *
|
||||
;* *
|
||||
;*-------------------------------------------------------------------------*
|
||||
;* Functions: *
|
||||
;* Cardinal_To_Fixed -- Converts cardinal numbers into a fixed point number. *
|
||||
;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
|
||||
|
||||
|
||||
IDEAL
|
||||
P386
|
||||
MODEL USE32 FLAT
|
||||
|
||||
global C Cardinal_To_Fixed :NEAR
|
||||
global C Fixed_To_Cardinal :NEAR
|
||||
|
||||
CODESEG
|
||||
|
||||
;***********************************************************************************************
|
||||
;* Cardinal_To_Fixed -- Converts cardinal numbers into a fixed point number. *
|
||||
;* *
|
||||
;* This utility function will convert cardinal numbers into a fixed point fraction. The *
|
||||
;* use of fixed point numbers occurs throughout the product -- since it is a convenient *
|
||||
;* tool. The fixed point number is based on the formula: *
|
||||
;* *
|
||||
;* result = cardinal / base *
|
||||
;* *
|
||||
;* The accuracy of the fixed point number is limited to 1/256 as the lowest and up to *
|
||||
;* 256 as the largest. *
|
||||
;* *
|
||||
;* INPUT: base -- The key number to base the fraction about. *
|
||||
;* *
|
||||
;* cardinal -- The other number (hey -- what do you call it?) *
|
||||
;* *
|
||||
;* OUTPUT: Returns with the fixed point number of the "cardinal" parameter as it relates *
|
||||
;* to the "base" parameter. *
|
||||
;* *
|
||||
;* WARNINGS: none *
|
||||
;* *
|
||||
;* HISTORY: *
|
||||
;* 02/17/1995 BWG : Created. *
|
||||
;*=============================================================================================*/
|
||||
;unsigned int Cardinal_To_Fixed(unsigned base, unsigned cardinal);
|
||||
|
||||
PROC Cardinal_To_Fixed C near
|
||||
USES ebx, edx
|
||||
|
||||
ARG base:DWORD
|
||||
ARG cardinal:DWORD
|
||||
|
||||
mov eax,0FFFFh ; establish default return value
|
||||
|
||||
mov ebx,[base]
|
||||
or ebx,ebx
|
||||
jz near ??retneg1 ; if base==0, return 65535
|
||||
|
||||
mov eax,[cardinal] ; otherwise, return (cardinal*256)/base
|
||||
shl eax,8
|
||||
xor edx,edx
|
||||
div ebx
|
||||
|
||||
??retneg1:
|
||||
ret
|
||||
|
||||
ENDP Cardinal_To_Fixed
|
||||
|
||||
|
||||
;***********************************************************************************************
|
||||
;* Fixed_To_Cardinal -- Converts a fixed point number into a cardinal number. *
|
||||
;* *
|
||||
;* Use this routine to convert a fixed point number into a cardinal number. *
|
||||
;* *
|
||||
;* INPUT: base -- The base number that the original fixed point number was created from. *
|
||||
;* *
|
||||
;* fixed -- The fixed point number to convert. *
|
||||
;* *
|
||||
;* OUTPUT: Returns with the reconverted number. *
|
||||
;* *
|
||||
;* WARNINGS: none *
|
||||
;* *
|
||||
;* HISTORY: *
|
||||
;* 02/17/1995 BWG : Created. *
|
||||
;*=============================================================================================*/
|
||||
;unsigned int Fixed_To_Cardinal(unsigned base, unsigned fixed);
|
||||
PROC Fixed_To_Cardinal C near
|
||||
USES edx
|
||||
|
||||
ARG base:DWORD
|
||||
ARG fixed:DWORD
|
||||
|
||||
mov eax,[base]
|
||||
mul [fixed]
|
||||
add eax,080h ; eax = (base * fixed) + 0x80
|
||||
|
||||
test eax,0FF000000h ; if high byte set, return FFFF
|
||||
jnz ??rneg1
|
||||
shr eax,8 ; else, return eax/256
|
||||
ret
|
||||
??rneg1 :
|
||||
mov eax,0FFFFh ; establish default return value
|
||||
ret
|
||||
|
||||
ENDP Fixed_To_Cardinal
|
||||
|
||||
END
|
176
CREDITS.CPP
Normal file
176
CREDITS.CPP
Normal file
|
@ -0,0 +1,176 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\credits.cpv 2.17 16 Oct 1995 16:51:28 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CREDITS.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 17, 1994 *
|
||||
* *
|
||||
* Last Update : March 13, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* CreditClass::AI -- Handles updating the credit display. *
|
||||
* CreditClass::Graphic_Logic -- Handles the credit redraw logic. *
|
||||
* CreditClass::CreditClass -- Default constructor for the credit class object. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CreditClass::CreditClass -- Default constructor for the credit class object. *
|
||||
* *
|
||||
* This is the constructor for the credit class object. It merely sets the credit display *
|
||||
* state to null. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/13/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
CreditClass::CreditClass(void)
|
||||
{
|
||||
IsToRedraw = false;
|
||||
IsUp = false;
|
||||
IsAudible = false;
|
||||
Credits = 0;
|
||||
Current = 0;
|
||||
Countdown = 0;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CreditClass::Graphic_Logic -- Handles the credit redraw logic. *
|
||||
* *
|
||||
* This routine should be called whenever the main game screen is to be updated. It will *
|
||||
* check to see if the credit display should be redrawn. If so, it will redraw it. *
|
||||
* *
|
||||
* INPUT: forced -- Should the credit display be redrawn regardless of whether the redraw *
|
||||
* flag is set? This is typically the case when the screen needs to be *
|
||||
* redrawn from scratch. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/13/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
#define XX (320-120)
|
||||
#define WW 50
|
||||
void CreditClass::Graphic_Logic(bool forced)
|
||||
{
|
||||
int factor = Get_Resolution_Factor();
|
||||
int xx = SeenBuff.Get_Width() - (120 << factor);
|
||||
if (forced || IsToRedraw) {
|
||||
|
||||
/*
|
||||
** Play a sound effect when the money display changes, but only if a sound
|
||||
** effect was requested.
|
||||
*/
|
||||
if (IsAudible) {
|
||||
if (IsUp) {
|
||||
Sound_Effect(VOC_UP, VOL_1);
|
||||
} else {
|
||||
Sound_Effect(VOC_DOWN, VOL_1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Display the new current value.
|
||||
*/
|
||||
//LogicPage->Fill_Rect(xx-(20 << factor), 1 << factor, xx+(20 << factor), 6 << factor, LTGREY);
|
||||
TabClass::Draw_Credits_Tab();
|
||||
Fancy_Text_Print("%ld", xx, 0, 11, TBLACK, TPF_GREEN12_GRAD|TPF_CENTER | TPF_USE_GRAD_PAL, Current);
|
||||
|
||||
IsToRedraw = false;
|
||||
IsAudible = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* CreditClass::AI -- Handles updating the credit display. *
|
||||
* *
|
||||
* This routine handles the logic that controls the rate of credit change in the credit *
|
||||
* display. It doesn't actually redraw the credit display, but will flag it to be redrawn *
|
||||
* if it detects that a change is to occur. *
|
||||
* *
|
||||
* INPUT: forced -- Should the credit display immediately reflect the current credit *
|
||||
* total for the player? This is usually desired when initially loading *
|
||||
* a scenario or saved game. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/13/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void CreditClass::AI(bool forced)
|
||||
{
|
||||
Credits = PlayerPtr->Available_Money();
|
||||
|
||||
/*
|
||||
** Make sure that the credit counter doesn't drop below zero.
|
||||
*/
|
||||
Credits = MAX(Credits, 0L);
|
||||
|
||||
if (Current == Credits) return;
|
||||
|
||||
if (forced) {
|
||||
IsAudible = false;
|
||||
Current = Credits;
|
||||
} else {
|
||||
|
||||
if (Countdown) Countdown--;
|
||||
if (Countdown) return;
|
||||
|
||||
/*
|
||||
** Determine the amount to change the display toward the
|
||||
** desired value.
|
||||
*/
|
||||
long adder = Credits - Current;
|
||||
adder = ABS(adder);
|
||||
adder >>= 5;
|
||||
adder = Bound(adder, 1L, 71+72);
|
||||
if (Current > Credits) adder = -adder;
|
||||
Current += adder;
|
||||
Countdown = 1;
|
||||
|
||||
if (Current-adder != Current) {
|
||||
IsAudible = true;
|
||||
IsUp = (adder > 0);
|
||||
}
|
||||
}
|
||||
IsToRedraw = true;
|
||||
Map.Flag_To_Redraw(false);
|
||||
}
|
72
CREDITS.H
Normal file
72
CREDITS.H
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\credits.h_v 2.18 16 Oct 1995 16:47:26 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CREDIT.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 19, 1994 *
|
||||
* *
|
||||
* Last Update : April 19, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CREDITS_H
|
||||
#define CREDITS_H
|
||||
|
||||
/****************************************************************************
|
||||
** The animating credit counter display is controlled by this class.
|
||||
*/
|
||||
class CreditClass {
|
||||
public:
|
||||
long Credits; // Value of credits trying to update display to.
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Constructors, Destructors, and overloaded operators.
|
||||
*/
|
||||
CreditClass(void);
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Member function prototypes.
|
||||
*/
|
||||
void Update(bool forced=false, bool redraw=false);
|
||||
|
||||
void Graphic_Logic(bool forced=false);
|
||||
void AI(bool forced=false);
|
||||
|
||||
long Current; // Credit value currently displayed.
|
||||
|
||||
unsigned IsToRedraw:1;
|
||||
unsigned IsUp:1;
|
||||
unsigned IsAudible:1;
|
||||
|
||||
private:
|
||||
int Countdown; // Delay between ticks.
|
||||
};
|
||||
|
||||
#endif
|
||||
|
38
CREW.CPP
Normal file
38
CREW.CPP
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\crew.cpv 2.18 16 Oct 1995 16:50:50 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CREW.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 23, 1994 *
|
||||
* *
|
||||
* Last Update : April 23, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
65
CREW.H
Normal file
65
CREW.H
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\crew.h_v 2.18 16 Oct 1995 16:47:56 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : CREW.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 23, 1994 *
|
||||
* *
|
||||
* Last Update : April 23, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef CREW_H
|
||||
#define CREW_H
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
** This class handles the basic crew logic. This includes hero tracking,
|
||||
** crew bail-out, and attached object logic.
|
||||
*/
|
||||
class CrewClass
|
||||
{
|
||||
public:
|
||||
/*
|
||||
** This keeps track of the number of "kills" the unit as accumulated.
|
||||
** When it reaches a certain point, the unit improves.
|
||||
*/
|
||||
unsigned short Kills;
|
||||
|
||||
/*
|
||||
** Constructors, Destructors, and overloaded operators.
|
||||
*/
|
||||
CrewClass(void) {Kills = 0;};
|
||||
|
||||
int Made_A_Kill(void) {Kills++;return(Kills);};
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
#endif
|
71
CWSTUB.C
Normal file
71
CWSTUB.C
Normal file
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <process.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
char *dos4g_path()
|
||||
{
|
||||
static char *paths_to_check[] = {
|
||||
"DOS4GPATH",
|
||||
"PATH"
|
||||
};
|
||||
static char fullpath[80];
|
||||
char *dos4gpath;
|
||||
int i;
|
||||
|
||||
/* If DOS4GPATH points to an executable file name, don't bother
|
||||
searching any paths for DOS4GW.EXE.
|
||||
*/
|
||||
if (dos4gpath = getenv("DOS4GPATH")) {
|
||||
strlwr(strcpy(fullpath, dos4gpath));
|
||||
if (strstr(fullpath, ".exe")) {
|
||||
return(fullpath);
|
||||
}
|
||||
}
|
||||
for( i = 0; i < sizeof(paths_to_check) / sizeof(paths_to_check[0]); i++ ) {
|
||||
_searchenv("dos4gw.exe", paths_to_check[i], fullpath);
|
||||
if (fullpath[0]) {
|
||||
return( &fullpath );
|
||||
}
|
||||
}
|
||||
return("dos4gw.exe");
|
||||
}
|
||||
|
||||
main( int argc, char *argv[] )
|
||||
{
|
||||
char *av[4];
|
||||
auto char cmdline[128];
|
||||
|
||||
av[0] = dos4g_path(); /* Locate the DOS/4GW loader */
|
||||
av[1] = argv[0]; /* name of executable to run */
|
||||
av[2] = getcmd(cmdline); /* command line */
|
||||
av[3] = NULL; /* end of list */
|
||||
#ifdef VMM
|
||||
putenv("DOS4GVM=MINMEM#2000 MAXMEM#16000 SWAPMIN#4096 SWAPINC#1024 VIRTUALSIZE#10000 SWAPFILE#CONQUER.SWP DELETESWAP @CONQUER.VMC");
|
||||
#endif
|
||||
#ifdef QUIET
|
||||
putenv("DOS4G=QUIET"); /* disables DOS/4GW Copyright banner */
|
||||
#endif
|
||||
execvp(av[0], av);
|
||||
perror(av[0]);
|
||||
exit(1); /* indicate error */
|
||||
}
|
450
DDE.CPP
Normal file
450
DDE.CPP
Normal file
|
@ -0,0 +1,450 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Dynamic Data Encapsulation *
|
||||
* *
|
||||
* File Name : DDE.CPP *
|
||||
* *
|
||||
* Programmer : Steve Wetherill *
|
||||
* *
|
||||
* Start Date : June 1, 1996 *
|
||||
* *
|
||||
* Last Update : June 8, 1996 [SW] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Instance_Class::InstanceClass -- class constructor *
|
||||
* Instance_Class::InstanceClass -- class destructor *
|
||||
* Instance_Class::Enable_Callback -- enables local processing of pokes *
|
||||
* Instance_Class::Register_Servers -- registers a local DDE DNS service *
|
||||
* Instance_Class::Cleanup_App -- currently does nothing *
|
||||
* Instance_Class::Test_Server_Running -- does a trial connect to remote *
|
||||
* Instance_Class::Open_Poke_Connection -- pokes some data to server *
|
||||
* Instance_Class::Close_Poke_Connectionp -- closes connection to remote *
|
||||
* Instance_Class::Poke_Server -- sends a chunk of data to remote *
|
||||
* Instance_Class::dde_callback -- processes DDE transactions *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#define WIN32
|
||||
#include <windows.h>
|
||||
#include "dde.h"
|
||||
|
||||
/***************************************************************************
|
||||
* These are static members of Instance_Class
|
||||
*=========================================================================*/
|
||||
|
||||
static DWORD Instance_Class::id_inst; // instance identifier set by DdeInitialize
|
||||
static BOOL Instance_Class::process_pokes; // controls response to pokes
|
||||
static char Instance_Class::ascii_name[32]; // name of server
|
||||
|
||||
static BOOL CALLBACK (*Instance_Class::callback) (
|
||||
LPBYTE pointer, // pointer to received data
|
||||
long length // length of received data or advisory flag
|
||||
) = NULL;
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::InstanceClass -- class constructor *
|
||||
* *
|
||||
* INPUT: *
|
||||
* name1 null terminated ASCII client name *
|
||||
* name1 null terminated ASCII server name *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* dde_error = TRUE if error occurs when initializing DDE *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
Instance_Class::Instance_Class( LPSTR name1, LPSTR name2 )
|
||||
{
|
||||
|
||||
dde_error = FALSE; // no errors
|
||||
process_pokes = FALSE; // disable pokes in callback
|
||||
|
||||
id_inst = 0; // set to 0 for first time through
|
||||
conv_handle = 0; // conversation handle reset
|
||||
|
||||
lstrcpy( ascii_name, name1 ); // keep a record of ASCII name
|
||||
|
||||
if ( DdeInitialize(
|
||||
(LPDWORD) &id_inst, // instance identifier
|
||||
dde_callback,
|
||||
APPCLASS_STANDARD | // filter server messages
|
||||
CBF_FAIL_SELFCONNECTIONS, // prevent from connecting with self
|
||||
0) != DMLERR_NO_ERROR) { // reserved
|
||||
dde_error = TRUE; // flag an error
|
||||
}
|
||||
|
||||
local_name = DdeCreateStringHandle(
|
||||
id_inst, // instance identifier
|
||||
name1, // string to register
|
||||
CP_WINANSI); // Windows ANSI code page
|
||||
|
||||
remote_name = DdeCreateStringHandle(
|
||||
id_inst, // instance identifier
|
||||
name2, // string to register
|
||||
CP_WINANSI); // Windows ANSI code page
|
||||
|
||||
poke_topic = DdeCreateStringHandle(
|
||||
id_inst, // instance identifier
|
||||
"POKE TOPIC", // System topic
|
||||
CP_WINANSI); // Windows ANSI code page
|
||||
|
||||
poke_item = DdeCreateStringHandle(
|
||||
id_inst, // instance identifier
|
||||
"POKE ITEM", // System topic
|
||||
CP_WINANSI); // Windows ANSI code page
|
||||
|
||||
system_topic = DdeCreateStringHandle(
|
||||
id_inst, // instance identifier
|
||||
SZDDESYS_TOPIC, // System topic
|
||||
CP_WINANSI); // Windows ANSI code page
|
||||
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::~Instance_Class -- class destructor *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
Instance_Class::~Instance_Class()
|
||||
{
|
||||
DdeUninitialize( id_inst );
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::Enable_Callback -- enables user callback *
|
||||
* *
|
||||
* INPUT: *
|
||||
* TRUE = enable poke processing *
|
||||
* FALSE = disable poke processing *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* echos the input *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* user callback must be explicitly enabled. Disbabled by default. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
BOOL Instance_Class::Enable_Callback( BOOL flag ) // enable or disable callback
|
||||
{
|
||||
return (process_pokes = flag);
|
||||
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::Register_Server -- registers a local DDE DNS service *
|
||||
* *
|
||||
* INPUT: *
|
||||
* BOOL CALLBACK ( *callback_fnc) ( LPBYTE, DWORD) = user poke callbacl *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* TRUE == success *
|
||||
* FALSE == failed *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
BOOL Instance_Class::Register_Server( BOOL CALLBACK ( *callback_fnc) (LPBYTE, long) )
|
||||
{
|
||||
|
||||
if (DdeNameService( id_inst, local_name, 0L, DNS_REGISTER ) != 0L) {
|
||||
callback = callback_fnc;
|
||||
return ( TRUE );
|
||||
} else {
|
||||
return ( FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::Test_Server_Running -- does a trial connect to remote *
|
||||
* *
|
||||
* INPUT: *
|
||||
* name = HSZ string handle of server name. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* TRUE == successfully connected to remote *
|
||||
* FALSE == failed to connect *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* - Can be called for local or remote server but of course will *
|
||||
* fail if a called for local and local server is not "up". *
|
||||
* - Disconects before exiting. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
BOOL Instance_Class::Test_Server_Running( HSZ name )
|
||||
{
|
||||
|
||||
if( Open_Poke_Connection( name ) == TRUE) {
|
||||
Close_Poke_Connection();
|
||||
return( TRUE );
|
||||
} else {
|
||||
return( FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::Open_Poke_Connection -- open a connection to server *
|
||||
* *
|
||||
* INPUT: *
|
||||
* name = HSZ server name. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* TRUE == successfully opened connection *
|
||||
* FALSE == failed to connect *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* Can be called for local or remote server but of course will *
|
||||
* fail if a called for local and local server is not "up". *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
BOOL Instance_Class::Open_Poke_Connection( HSZ name )
|
||||
{
|
||||
conv_handle = DdeConnect(
|
||||
id_inst, // instance identifier
|
||||
name, // service name string handle
|
||||
poke_topic, // topic string handle
|
||||
(PCONVCONTEXT) NULL);// use default context
|
||||
|
||||
if (conv_handle == NULL) {
|
||||
return FALSE;
|
||||
} else {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::Close_Poke_Connection -- closes poke connection *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* TRUE == successfully closed connection *
|
||||
* FALSE == failed to close connection for some reason *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
BOOL Instance_Class::Close_Poke_Connection( void )
|
||||
{
|
||||
if( conv_handle ) {
|
||||
HCONV temp_handle = conv_handle;
|
||||
conv_handle = NULL;
|
||||
return( DdeDisconnect( temp_handle ));
|
||||
} else {
|
||||
return( TRUE );
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::Poke_Server -- pokes some data to server *
|
||||
* *
|
||||
* INPUT: *
|
||||
* poke_data points to data to send to remote *
|
||||
* poke_length length of buffer to send *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* TRUE == successfully poked the data *
|
||||
* FALSE == failed to connect *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* has a 3 second timeout (change POKE_TIMEOUT, in milliseconds) *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
#define POKE_TIMEOUT 60*1000 // 60 sec timeout
|
||||
|
||||
BOOL Instance_Class::Poke_Server( LPBYTE poke_data, DWORD poke_length )
|
||||
{
|
||||
|
||||
if( DdeClientTransaction(
|
||||
|
||||
poke_data, // address of data to pass to server
|
||||
poke_length, // length of data
|
||||
conv_handle, // handle of conversation
|
||||
poke_topic, // handle of item name string
|
||||
CF_TEXT, // no special clipboard data format
|
||||
XTYP_POKE, // transaction type
|
||||
POKE_TIMEOUT, // time-out duration (millisecs)
|
||||
(LPDWORD) NULL // address of transaction result (don't check)
|
||||
) == 0) {
|
||||
|
||||
return( FALSE);
|
||||
} else {
|
||||
return( TRUE );
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Instance_Class::dde_callback -- callback dde event handler *
|
||||
* *
|
||||
* INPUT: *
|
||||
* dde_event transaction type *
|
||||
* uFmt clipboard data format *
|
||||
* hconv handle of the conversation *
|
||||
* hsz1 handle of a string *
|
||||
* hsz2 handle of a string *
|
||||
* hdata handle of a global memory object *
|
||||
* dwData1 transaction-specific data *
|
||||
* dwData2 transaction-specific data *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* context specific HDDEDATA object *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* NOTE: declared as HDDEDATA CALLBACK which means PASCAL parameters *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 6/1/1996 SW : Created. *
|
||||
*=========================================================================*/
|
||||
|
||||
HDDEDATA CALLBACK Instance_Class::dde_callback(
|
||||
|
||||
UINT dde_event, // transaction type
|
||||
UINT uFmt, // clipboard data format
|
||||
HCONV , // handle of the conversation
|
||||
HSZ hsz1, // handle of a string
|
||||
HSZ hsz2, // handle of a string
|
||||
HDDEDATA hdata, // handle of a global memory object
|
||||
DWORD , // transaction-specific data
|
||||
DWORD // transaction-specific data
|
||||
)
|
||||
{
|
||||
|
||||
|
||||
if (!Instance_Class::callback){
|
||||
return (HDDEDATA) NULL;
|
||||
}
|
||||
|
||||
switch ( dde_event ) {
|
||||
|
||||
case XTYP_REGISTER:
|
||||
case XTYP_UNREGISTER:
|
||||
|
||||
return (HDDEDATA) NULL;
|
||||
|
||||
case XTYP_ADVDATA:
|
||||
return (HDDEDATA) DDE_FACK;
|
||||
|
||||
case XTYP_XACT_COMPLETE:
|
||||
|
||||
return (HDDEDATA) NULL;
|
||||
|
||||
case XTYP_DISCONNECT:
|
||||
|
||||
Instance_Class::callback( NULL, DDE_ADVISE_DISCONNECT);
|
||||
return (HDDEDATA) NULL;
|
||||
|
||||
case XTYP_CONNECT: {
|
||||
|
||||
char buffer[32];
|
||||
|
||||
DdeQueryString (Instance_Class::id_inst, hsz2, buffer, sizeof (buffer), 0) ;
|
||||
|
||||
if (0 != strcmp (buffer, Instance_Class::ascii_name)) {
|
||||
return (HDDEDATA) NULL;
|
||||
}
|
||||
|
||||
DdeQueryString (Instance_Class::id_inst, hsz1, buffer, sizeof (buffer), 0) ;
|
||||
|
||||
if (0 != strcmp (buffer, "POKE TOPIC")) {
|
||||
return (HDDEDATA) NULL;
|
||||
}
|
||||
|
||||
Instance_Class::callback( NULL, DDE_ADVISE_CONNECT);
|
||||
return (HDDEDATA) TRUE;
|
||||
}
|
||||
|
||||
case XTYP_POKE:
|
||||
|
||||
if (Instance_Class::process_pokes == FALSE ) {
|
||||
return (HDDEDATA) DDE_FNOTPROCESSED; // processing disabled
|
||||
} else {
|
||||
|
||||
char buffer[32];
|
||||
|
||||
DdeQueryString (Instance_Class::id_inst, hsz1, buffer, sizeof (buffer), 0) ;
|
||||
|
||||
if (0 != strcmp (buffer, "POKE TOPIC")) {
|
||||
return (HDDEDATA) DDE_FNOTPROCESSED;
|
||||
} else if (uFmt == CF_TEXT) { // make sure it's CF_TEXT
|
||||
|
||||
BOOL processed;
|
||||
BYTE FAR *pdata;
|
||||
DWORD dw_length;
|
||||
|
||||
if ( (pdata = DdeAccessData( hdata, &dw_length)) == NULL ) {
|
||||
return (HDDEDATA) DDE_FNOTPROCESSED;
|
||||
}
|
||||
|
||||
processed = Instance_Class::callback((LPBYTE) pdata, dw_length);
|
||||
|
||||
DdeUnaccessData( hdata );
|
||||
|
||||
if (processed == TRUE) {
|
||||
return (HDDEDATA) DDE_FACK;
|
||||
} else {
|
||||
return (HDDEDATA) NULL;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return (HDDEDATA) NULL;
|
||||
}
|
||||
}
|
175
DDE.H
Normal file
175
DDE.H
Normal file
|
@ -0,0 +1,175 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Dynamic Data Encapsulation *
|
||||
* *
|
||||
* File Name : DDE.H *
|
||||
* *
|
||||
* Programmer : Steve Wetherill *
|
||||
* *
|
||||
* Start Date : June 1, 1996 *
|
||||
* *
|
||||
* Last Update : June 8, 1996 [SW] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* *
|
||||
* This is the DDE (Instance_Class) which provides a simple CLIENT/SERVER *
|
||||
* DDE model for data transactions between Windows applications. *
|
||||
* This is a fairly naieve implementation allowing only one client/server *
|
||||
* per Instance_Class object. *
|
||||
* *
|
||||
* Typical uses for this class are: *
|
||||
* *
|
||||
* i. Robust verification of whether an application is running *
|
||||
* ii. Data transfer between applications *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
/*
|
||||
***************************** Class defines *****************************
|
||||
*/
|
||||
|
||||
#ifndef __DDE_H
|
||||
#define __DDE_H
|
||||
|
||||
#define DDE_ADVISE_CONNECT -1 // advisory "client has connected"
|
||||
#define DDE_ADVISE_DISCONNECT -2 // advisory "client has disconnected"
|
||||
|
||||
/*
|
||||
***************************** Class Declaration *****************************
|
||||
*/
|
||||
|
||||
class Instance_Class {
|
||||
|
||||
/*
|
||||
---------------------------- Public Interface ----------------------------
|
||||
*/
|
||||
public:
|
||||
|
||||
/*.....................................................................
|
||||
Constructor:
|
||||
- takes null terminated ASCII strings names for client and server
|
||||
.....................................................................*/
|
||||
|
||||
Instance_Class( // constructor
|
||||
LPSTR, // null terminated local sever name string
|
||||
LPSTR // null terminated remote server name string
|
||||
);
|
||||
|
||||
/*.....................................................................
|
||||
Destructor:
|
||||
.....................................................................*/
|
||||
~Instance_Class(void); // the destructor
|
||||
|
||||
/*.....................................................................
|
||||
Send data routine:
|
||||
- sends an unsolicited packet of data to the remote server
|
||||
.....................................................................*/
|
||||
BOOL Poke_Server( LPBYTE, DWORD);
|
||||
|
||||
/*.....................................................................
|
||||
Send data routine:
|
||||
- sets up DNS for the server and registers a user callback to handle
|
||||
incoming data
|
||||
.....................................................................*/
|
||||
BOOL Register_Server( BOOL CALLBACK (*)(LPBYTE, long));
|
||||
|
||||
/*.....................................................................
|
||||
Does a trial connect to the remote server.
|
||||
- used to determine whether server is alive or not (and thus running)
|
||||
.....................................................................*/
|
||||
BOOL Test_Server_Running( HSZ );
|
||||
|
||||
/*.....................................................................
|
||||
Enables user callback (disabled by default)
|
||||
.....................................................................*/
|
||||
BOOL Enable_Callback( BOOL ); // enable or disable callback
|
||||
|
||||
/*.....................................................................
|
||||
Open a connection for sending data to remote server
|
||||
.....................................................................*/
|
||||
BOOL Open_Poke_Connection( HSZ );
|
||||
|
||||
/*.....................................................................
|
||||
Close connection with remote server
|
||||
.....................................................................*/
|
||||
BOOL Close_Poke_Connection( void );
|
||||
|
||||
//
|
||||
// static members
|
||||
//
|
||||
|
||||
/*.....................................................................
|
||||
User callback - called upon receipt of incoming data (static member!)
|
||||
.....................................................................*/
|
||||
static BOOL CALLBACK (*callback) (
|
||||
|
||||
LPBYTE pointer, // pointer to received data
|
||||
long length // if >0 length of received data
|
||||
// if <0
|
||||
// -1 == client connect detected
|
||||
// -2 == client disconnect detected
|
||||
);
|
||||
|
||||
/*.....................................................................
|
||||
DDE callback, called when DDEML has an event for us
|
||||
.....................................................................*/
|
||||
static HDDEDATA CALLBACK dde_callback(
|
||||
|
||||
UINT uType, // transaction type
|
||||
UINT uFmt, // clipboard data format
|
||||
HCONV hconv, // handle of the conversation
|
||||
HSZ hsz1, // handle of a string
|
||||
HSZ hsz2, // handle of a string
|
||||
HDDEDATA hdata, // handle of a global memory object
|
||||
DWORD dwData1, // transaction-specific data
|
||||
DWORD dwData2 // transaction-specific data
|
||||
);
|
||||
HANDLE instance; // this application's instance
|
||||
HWND hwnd; // valid window handle
|
||||
|
||||
/*.....................................................................
|
||||
member variables
|
||||
.....................................................................*/
|
||||
|
||||
static DWORD id_inst; // instance identifier set by DdeInitialize
|
||||
static BOOL process_pokes; // controls response to pokes
|
||||
static char ascii_name[32]; // name of server
|
||||
|
||||
//
|
||||
// non-static member variables
|
||||
//
|
||||
|
||||
HSZ remote_name; // string handle for remote server name
|
||||
HSZ local_name; // string handle for local server name
|
||||
HSZ system_topic; // string handle for the "system" topic
|
||||
HSZ poke_topic; // string handle for poking data to server topic
|
||||
HSZ poke_item; // string handle for poking data to server item
|
||||
|
||||
HCONV conv_handle; // conversation handle
|
||||
BOOL dde_error; // error flag
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
690
DEBUG.CPP
Normal file
690
DEBUG.CPP
Normal file
|
@ -0,0 +1,690 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\debug.cpv 2.17 16 Oct 1995 16:49:18 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DEBUG.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : September 10, 1993 *
|
||||
* *
|
||||
* Last Update : July 5, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Self_Regulate -- Regulates the logic timer to result in smooth animation. *
|
||||
* Debug_Key -- Debug mode keyboard processing. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
#include <stdarg.h>
|
||||
#include <filepcx.h>
|
||||
#include <io.h>
|
||||
#ifdef CHEAT_KEYS
|
||||
|
||||
extern bool ScreenRecording;
|
||||
|
||||
/***********************************************************************************************
|
||||
* Debug_Key -- Debug mode keyboard processing. *
|
||||
* *
|
||||
* If debugging is enabled, then this routine will be called for every keystroke that the *
|
||||
* game doesn't recognize. These extra keys usually perform some debugging function. *
|
||||
* *
|
||||
* INPUT: input -- The key code that was pressed. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 10/07/1992 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void Debug_Key(unsigned input)
|
||||
{
|
||||
static int map_x = -1;
|
||||
static int map_y = -1;
|
||||
static int map_width = -1;
|
||||
static int map_height = -1;
|
||||
|
||||
if (!input || input & KN_BUTTON) return;
|
||||
|
||||
/*
|
||||
** Processing of normal keystrokes.
|
||||
*/
|
||||
if (Debug_Flag) {
|
||||
|
||||
switch (input) {
|
||||
|
||||
case KN_L:
|
||||
extern int NetMonoMode,NewMonoMode;
|
||||
if (NetMonoMode)
|
||||
NetMonoMode = 0;
|
||||
else
|
||||
NetMonoMode = 1;
|
||||
NewMonoMode = 1;
|
||||
break;
|
||||
|
||||
/*
|
||||
** Start saving off screens
|
||||
*/
|
||||
case (int)KN_K|(int)KN_CTRL_BIT:
|
||||
ScreenRecording = true;
|
||||
break;
|
||||
|
||||
case KN_K:
|
||||
/*
|
||||
** time to create a screen shot using the PCX code (if it works)
|
||||
*/
|
||||
{
|
||||
GraphicBufferClass temp_page( SeenBuff.Get_Width(),
|
||||
SeenBuff.Get_Height(),
|
||||
NULL,
|
||||
SeenBuff.Get_Width() * SeenBuff.Get_Height());
|
||||
char filename[30];
|
||||
|
||||
SeenBuff.Blit(temp_page);
|
||||
for (int lp = 0; lp < 99; lp ++) {
|
||||
if (lp < 10) {
|
||||
sprintf(filename, "scrsht0%d.pcx", lp);
|
||||
} else {
|
||||
sprintf(filename, "scrsht%d.pcx", lp);
|
||||
}
|
||||
if (access(filename, F_OK) == -1)
|
||||
break;
|
||||
}
|
||||
|
||||
Write_PCX_File(filename, temp_page, (unsigned char *)CurrentPalette);
|
||||
//Map.Place_Random_Crate();
|
||||
}
|
||||
break;
|
||||
|
||||
case KN_P:
|
||||
Keyboard::Clear();
|
||||
while (!Keyboard::Check()) {
|
||||
Self_Regulate();
|
||||
Sound_Callback();
|
||||
}
|
||||
Keyboard::Clear();
|
||||
break;
|
||||
|
||||
case KN_O:
|
||||
{
|
||||
AircraftClass * air = new AircraftClass(AIRCRAFT_ORCA, PlayerPtr->Class->House);
|
||||
if (air) {
|
||||
air->Altitude = 0;
|
||||
air->Unlimbo(Map.Pixel_To_Coord(Get_Mouse_X(), Get_Mouse_Y()), DIR_N);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case (int)KN_B|(int)KN_ALT_BIT:
|
||||
{
|
||||
Debug_Instant_Build ^= 1;
|
||||
}
|
||||
break;
|
||||
case KN_B:
|
||||
{
|
||||
AircraftClass * air = new AircraftClass(AIRCRAFT_HELICOPTER, PlayerPtr->Class->House);
|
||||
if (air) {
|
||||
air->Altitude = 0;
|
||||
air->Unlimbo(Map.Pixel_To_Coord(Get_Mouse_X(), Get_Mouse_Y()), DIR_N);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case KN_T:
|
||||
{
|
||||
AircraftClass * air = new AircraftClass(AIRCRAFT_TRANSPORT, PlayerPtr->Class->House);
|
||||
if (air) {
|
||||
air->Altitude = 0;
|
||||
air->Unlimbo(Map.Pixel_To_Coord(Get_Mouse_X(), Get_Mouse_Y()), DIR_N);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case KN_GRAVE:
|
||||
new AnimClass(ANIM_ART_EXP1, Map.Pixel_To_Coord(Get_Mouse_X(), Get_Mouse_Y()));
|
||||
Explosion_Damage(Map.Pixel_To_Coord(Get_Mouse_X(), Get_Mouse_Y()), 250, NULL, WARHEAD_HE);
|
||||
break;
|
||||
|
||||
case KN_Z:
|
||||
// new AnimClass(ANIM_LZ_SMOKE, Map.Pixel_To_Coord(Get_Mouse_X(), Get_Mouse_Y()));
|
||||
GDI_Ending();
|
||||
break;
|
||||
|
||||
case KN_C:
|
||||
Debug_Cheat = (Debug_Cheat == false);
|
||||
PlayerPtr->IsRecalcNeeded = true;
|
||||
PlayerPtr->Add_Nuke_Piece();
|
||||
PlayerPtr->Add_Nuke_Piece();
|
||||
PlayerPtr->Add_Nuke_Piece();
|
||||
|
||||
/*
|
||||
** This placement might affect any prerequisite requirements for construction
|
||||
** lists. Update the buildable options accordingly.
|
||||
*/
|
||||
if (!ScenarioInit) {
|
||||
Map.Recalc();
|
||||
for (int index = 0; index < Buildings.Count(); index++) {
|
||||
Buildings.Ptr(index)->Update_Buildables();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case (int)KN_Z|(int)KN_ALT_BIT:
|
||||
if (map_x == -1) {
|
||||
map_x = Map.MapCellX;
|
||||
map_y = Map.MapCellY;
|
||||
map_width = Map.MapCellWidth;
|
||||
map_height = Map.MapCellHeight;
|
||||
Map.MapCellX = 1;
|
||||
Map.MapCellY = 1;
|
||||
Map.MapCellWidth = 62;
|
||||
Map.MapCellHeight = 62;
|
||||
} else {
|
||||
Map.MapCellX = map_x;
|
||||
Map.MapCellY = map_y;
|
||||
Map.MapCellWidth = map_width;
|
||||
Map.MapCellHeight = map_height;
|
||||
map_x = -1;
|
||||
map_y = -1;
|
||||
map_width = -1;
|
||||
map_height = -1;
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef NEVER
|
||||
case KN_G:
|
||||
HouseClass::As_Pointer(HOUSE_GOOD)->Flag_Attach(Map.Click_Cell_Calc(Get_Mouse_X(), Get_Mouse_Y()));
|
||||
break;
|
||||
|
||||
case KN_N:
|
||||
HouseClass::As_Pointer(HOUSE_BAD)->Flag_Attach(Map.Click_Cell_Calc(Get_Mouse_X(), Get_Mouse_Y()));
|
||||
break;
|
||||
#endif
|
||||
|
||||
case KN_R:
|
||||
if (CurrentObject.Count()) {
|
||||
((TechnoClass *)CurrentObject[0])->IsCloakable = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case KN_M:
|
||||
if (Debug_Flag) {
|
||||
if (MonoClass::Is_Enabled()) {
|
||||
MonoClass::Disable();
|
||||
} else {
|
||||
MonoClass::Enable();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case (int)KN_W|(int)KN_ALT_BIT:
|
||||
PlayerPtr->Flag_To_Win();
|
||||
break;
|
||||
|
||||
case (int)KN_L|(int)KN_ALT_BIT:
|
||||
PlayerPtr->Flag_To_Lose();
|
||||
break;
|
||||
|
||||
case KN_F:
|
||||
Debug_Find_Path ^= 1;
|
||||
break;
|
||||
|
||||
case KN_DELETE:
|
||||
if (CurrentObject.Count()) {
|
||||
Map.Recalc();
|
||||
//CurrentObject[0]->Detach_All();
|
||||
delete CurrentObject[0];
|
||||
}
|
||||
break;
|
||||
|
||||
case KN_D:
|
||||
if (Teams.Ptr(0)) {
|
||||
delete Teams.Ptr(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case (int)KN_DELETE|(int)KN_SHIFT_BIT:
|
||||
if (CurrentObject.Count()) {
|
||||
Map.Recalc();
|
||||
int damage = 50;
|
||||
CurrentObject[0]->Take_Damage(damage, 0, WARHEAD_SA);
|
||||
}
|
||||
break;
|
||||
|
||||
case KN_INSERT:
|
||||
if (CurrentObject.Count()) {
|
||||
Map.PendingObject = &CurrentObject[0]->Class_Of();
|
||||
if (Map.PendingObject) {
|
||||
Map.PendingHouse = CurrentObject[0]->Owner();
|
||||
Map.PendingObjectPtr = Map.PendingObject->Create_One_Of(HouseClass::As_Pointer(Map.PendingHouse));
|
||||
if (Map.PendingObjectPtr) {
|
||||
Map.Set_Cursor_Pos();
|
||||
Map.Set_Cursor_Shape(Map.PendingObject->Occupy_List());
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef NEVER
|
||||
case KN_1:
|
||||
case KN_2:
|
||||
case KN_3:
|
||||
case KN_4:
|
||||
case KN_5:
|
||||
case KN_6:
|
||||
case KN_7:
|
||||
case KN_8:
|
||||
case KN_9:
|
||||
case KN_0:
|
||||
MonoPage = (input & 0xFF) - KN_1;
|
||||
MonoPage %= sizeof(MonoArray)/sizeof(MonoArray[0]);
|
||||
MonoArray[MonoPage].View();
|
||||
input = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef NEVER
|
||||
case ((int)KN_F1 | (int)KN_SHIFT_BIT):
|
||||
Special.IsBarOn = (Special.IsBarOn == false);
|
||||
Map.Flag_To_Redraw(true);
|
||||
break;
|
||||
|
||||
case ((int)KN_F1 | (int)KN_SHIFT_BIT): // quick load/save for debugging
|
||||
if (!Save_Game(0,"Command & Conquer Save Game File")) {
|
||||
CCMessageBox().Process("Error saving game!");
|
||||
Prog_End();
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
break;
|
||||
|
||||
case ((int)KN_F2 | (int)KN_SHIFT_BIT): // quick load/save for debugging
|
||||
if (!Load_Game(0)) {
|
||||
CCMessageBox().Process("Error loading game!");
|
||||
Prog_End();
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
break;
|
||||
|
||||
//#ifdef SCENARIO_EDITOR
|
||||
case KN_F2: // enable/disable the map editor
|
||||
Go_Editor(!Debug_Map);
|
||||
break;
|
||||
//#endif
|
||||
#endif
|
||||
|
||||
#ifdef NEVER
|
||||
case KN_F2: {
|
||||
Debug_Map++;
|
||||
Scenario_Editor();
|
||||
Debug_Map--;
|
||||
#ifdef NEVER
|
||||
COORDINATE coord;
|
||||
int index;
|
||||
static COORDINATE _coords[] = {
|
||||
0x00010001L,
|
||||
0x00800080L,
|
||||
0x00810081L,
|
||||
0x00010081L,
|
||||
0x00810001L,
|
||||
0x00800081L,
|
||||
0x00800001L,
|
||||
0x00010080L,
|
||||
0x00810080L,
|
||||
0L
|
||||
};
|
||||
index = 0;
|
||||
while (_coords[index]) {
|
||||
coord = _coords[index++];
|
||||
Mono_Printf("Spillage for %08lX = %d.\r", coord, Coord_Spillage_Number(coord));
|
||||
}
|
||||
Keyboard::Clear();
|
||||
Keyboard::Get();
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef NEVER
|
||||
#define MAX_RADIUS 10
|
||||
COORDINATE coord;
|
||||
int x,y;
|
||||
COORDINATE const *ptr;
|
||||
int input;
|
||||
int f1,f2;
|
||||
TurnTrackType const *track;
|
||||
|
||||
#define XCENTER 160
|
||||
#define YCENTER 100
|
||||
for (;;) {
|
||||
VisiblePage.Clear();
|
||||
|
||||
// Draw grid.
|
||||
{
|
||||
static int _gridx[] = {0,64,128,192,0,64,128,192,0,64,128,192};
|
||||
static int _gridy[] = {0,0,0,0,64,64,64,64,128,128,128,128};
|
||||
int index;
|
||||
|
||||
for (index = 0; index < 12; index++) {
|
||||
LogicPage->Put_Pixel((_gridx[index]+XCENTER)-(32+64),(_gridy[index]+YCENTER)-(32+64), DKGRAY);
|
||||
}
|
||||
}
|
||||
|
||||
// Get facing #1.
|
||||
LogicPage->Print("Facing #1 (0-7)?", 0, 0, WHITE, BLACK);
|
||||
input = Keyboard::Get();
|
||||
if (input == KA_ESC) break;
|
||||
input -= KA_0;
|
||||
input = Bound(input, 0, 7);
|
||||
// input = MAX(input, 0);
|
||||
// input = MIN(input, 7);
|
||||
f1 = input;
|
||||
Int_Print(f1, 100, 0, WHITE, BLACK);
|
||||
|
||||
// Get facing #2.
|
||||
LogicPage->Print("Facing #2 (0-7)?", 0, 10, WHITE, BLACK);
|
||||
input = Keyboard::Get();
|
||||
if (input == KA_ESC) break;
|
||||
input -= KA_0;
|
||||
input = Bound(input, 0, 7);
|
||||
// input = MAX(input, 0);
|
||||
// input = MIN(input, 7);
|
||||
f2 = input;
|
||||
Int_Print(f2, 100, 10, WHITE, BLACK);
|
||||
|
||||
track = &TrackControl[f1][f2];
|
||||
if (track->Track == 0) {
|
||||
LogicPage->Print("Undefined track.", 0, 30, WHITE, BLACK);
|
||||
} else {
|
||||
int index; // Track index counter.
|
||||
|
||||
ptr = TrackPointers[track->Track-1];
|
||||
index = 0;
|
||||
while (ptr[index]) {
|
||||
coord = Smooth_Turn(NULL, ptr[index], track->Flag);
|
||||
|
||||
x = (int)(coord & 0xFFFF);
|
||||
y = (int)((coord >> 16) & 0xFFFF);
|
||||
LogicPage->Put_Pixel(XCENTER + (x>>2), YCENTER + (y>>2), WHITE);
|
||||
Delay(1);
|
||||
index++;
|
||||
}
|
||||
|
||||
}
|
||||
input = Keyboard::Get();
|
||||
if (input == KA_ESC) break;
|
||||
}
|
||||
|
||||
Map.Flag_To_Redraw(true);
|
||||
#endif
|
||||
#ifdef NEVER
|
||||
FILE *fh;
|
||||
int index;
|
||||
COORDINATE coord;
|
||||
|
||||
fh = fopen("diagonal.txt", "wt");
|
||||
if (fh) {
|
||||
|
||||
fprintf(fh, "track 2\n");
|
||||
coord = 0x0100FF00L;
|
||||
for (index = 0; index <= 48; index++) {
|
||||
fprintf(fh, "0x%08lXL\n", coord);
|
||||
coord = Coord_Move(coord, 32, 11);
|
||||
}
|
||||
fprintf(fh, "\n\n");
|
||||
|
||||
fprintf(fh, "track 1\n");
|
||||
coord = 0x01000000L;
|
||||
for (index = 0; index <= 40; index++) {
|
||||
fprintf(fh, "0x%08lXL\n", coord);
|
||||
coord = Coord_Move(coord, 0, 11);
|
||||
}
|
||||
fprintf(fh, "\n\n");
|
||||
|
||||
fclose(fh);
|
||||
}
|
||||
#endif
|
||||
#ifdef NEVER
|
||||
FILE *fh;
|
||||
int x,y,radius;
|
||||
int radsize[MAX_RADIUS+2];
|
||||
int count;
|
||||
|
||||
memset(radsize, 0, sizeof(radsize));
|
||||
fh = fopen("Range.txt", "wt");
|
||||
if (fh) {
|
||||
fprintf(fh, "int const RadiusOffset[] = {\n");
|
||||
|
||||
for (radius = 0; radius <= MAX_RADIUS; radius++) {
|
||||
|
||||
fprintf(fh, "\t/* %-2d */\t", radius);
|
||||
for (y = -MAX_RADIUS; y <= MAX_RADIUS; y++) {
|
||||
for (x = -MAX_RADIUS; x <= MAX_RADIUS; x++) {
|
||||
int xd,yd,dist;
|
||||
|
||||
xd = ABS(x);
|
||||
yd = ABS(y);
|
||||
if (xd > yd) {
|
||||
dist = yd/2 + xd;
|
||||
} else {
|
||||
dist = xd/2 + yd;
|
||||
}
|
||||
if (dist == radius) {
|
||||
dist = y*MAP_CELL_W + x;
|
||||
|
||||
if (y) {
|
||||
if (y < 0) {
|
||||
fprintf(fh, "(-MCW*%d)", ABS(y));
|
||||
} else {
|
||||
fprintf(fh, "(MCW*%d)", ABS(y));
|
||||
}
|
||||
fprintf(fh, "%c%d,", (x<0) ? '-' : '+', ABS(x));
|
||||
} else {
|
||||
fprintf(fh, "%d,", x);
|
||||
}
|
||||
radsize[radius]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
fprintf(fh, "\n");
|
||||
}
|
||||
fprintf(fh, "};\n\n");
|
||||
|
||||
count = 0;
|
||||
fprintf(fh, "int const RadiusCount[%d] = {", MAX_RADIUS+1);
|
||||
for (radius = 0; radius <= MAX_RADIUS; radius++) {
|
||||
count += radsize[radius];
|
||||
fprintf(fh, "%d", count);
|
||||
if (radius != MAX_RADIUS) {
|
||||
fprintf(fh, ",");
|
||||
}
|
||||
}
|
||||
fprintf(fh, "};\n");
|
||||
fclose(fh);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef NEVER
|
||||
case ((int)KN_F3 | (int)KN_ALT_BIT): // quick load/save for debugging
|
||||
Debug_Threat = (Debug_Threat == false);
|
||||
Map.Flag_To_Redraw(true);
|
||||
break;
|
||||
|
||||
#endif
|
||||
|
||||
case KN_F3:
|
||||
Debug_Icon = (Debug_Icon == false);
|
||||
Map.Flag_To_Redraw(true);
|
||||
break;
|
||||
|
||||
|
||||
/*
|
||||
** Reveal entire map to player.
|
||||
*/
|
||||
case KN_F4:
|
||||
if (GameToPlay == GAME_NORMAL) {
|
||||
Debug_Unshroud = (Debug_Unshroud == false);
|
||||
Map.Flag_To_Redraw(true);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** Shows sight and fire range in the form of circles emanating from the currently
|
||||
** selected unit. The white circle is for sight range, the red circle is for
|
||||
** fire range.
|
||||
*/
|
||||
case KN_F7:
|
||||
if (CurrentObject.Count() && CurrentObject[0]->Is_Techno()) {
|
||||
TechnoTypeClass const & ttype = (TechnoTypeClass const &)CurrentObject[0]->Class_Of();
|
||||
int sight = ((int)ttype.SightRange)<<8;
|
||||
int weapon = 0;
|
||||
if (ttype.Primary != WEAPON_NONE) weapon = Weapons[ttype.Primary].Range;
|
||||
Set_Logic_Page(SeenBuff);
|
||||
COORDINATE center = CurrentObject[0]->Center_Coord();
|
||||
COORDINATE center2 = CurrentObject[0]->Fire_Coord(0);
|
||||
|
||||
for (int r = 0; r < 255; r += 10) {
|
||||
int x,y,x1,y1;
|
||||
DirType r1 = (DirType)r;
|
||||
DirType r2 = (DirType)((r+10) & 0xFF);
|
||||
|
||||
if (Map.Coord_To_Pixel(Coord_Move(center, r1, sight), x, y)) {
|
||||
Map.Coord_To_Pixel(Coord_Move(center, r2, sight), x1, y1);
|
||||
LogicPage->Draw_Line(x, y+8, x1, y1+8, WHITE);
|
||||
}
|
||||
if (Map.Coord_To_Pixel(Coord_Move(center2, r1, weapon), x, y)) {
|
||||
Map.Coord_To_Pixel(Coord_Move(center2, r2, weapon), x1, y1);
|
||||
LogicPage->Draw_Line(x, y+8, x1, y1+8, RED);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ((int)KN_F4 | (int)KN_CTRL_BIT):
|
||||
Debug_Unshroud = (Debug_Unshroud == false);
|
||||
Map.Flag_To_Redraw(true);
|
||||
break;
|
||||
|
||||
#ifdef NEVER
|
||||
case KN_F5:
|
||||
Special.IsShowPath = (Special.IsShowPath == false);
|
||||
//PlayerPtr->Credits += 1000;
|
||||
break;
|
||||
|
||||
case KN_F6:
|
||||
if (Map.In_Radar(XY_Cell(Map.MapCellX+5, Map.MapCellY - 1))) {
|
||||
Mono_Printf("Arrrggggghhhhh!");
|
||||
} else {
|
||||
Mono_Printf("No Arrrggggghhhhh!");
|
||||
}
|
||||
break;
|
||||
|
||||
case ((int)KN_F9 | (int)KN_CTRL_BIT):
|
||||
if (HouseClass::As_Pointer(HOUSE_GOOD))
|
||||
(HouseClass::As_Pointer(HOUSE_GOOD))->Blowup_All();
|
||||
break;
|
||||
|
||||
case ((int)KN_F10 | (int)KN_CTRL_BIT):
|
||||
if (HouseClass::As_Pointer(HOUSE_BAD))
|
||||
(HouseClass::As_Pointer(HOUSE_BAD))->Blowup_All();
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Self_Regulate -- Regulates the logic timer to result in smooth animation *
|
||||
* *
|
||||
* The self regulation process checks the number of frames displayed *
|
||||
* per second and from this determines the amount of time to devote *
|
||||
* to internal logic processing. By adjusting the time allotted to *
|
||||
* internal processing, smooth animation can be maintained. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: In order for this routine to work properly it MUST be *
|
||||
* called every display loop. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 07/31/1991 JLB : Created. *
|
||||
* 07/05/1994 JLB : Handles new monochrome system. *
|
||||
*=============================================================================================*/
|
||||
#define UPDATE_INTERVAL TIMER_SECOND
|
||||
void Self_Regulate(void)
|
||||
{
|
||||
static CountDownTimerClass DebugTimer(BT_SYSTEM);
|
||||
static ObjectClass * _lastobject = 0;
|
||||
|
||||
if (!DebugTimer.Time()) {
|
||||
DebugTimer.Set(UPDATE_INTERVAL);
|
||||
|
||||
if (MonoClass::Is_Enabled()) {
|
||||
MonoClass *mono = MonoClass::Get_Current();
|
||||
mono->Set_Default_Attribute(2);
|
||||
|
||||
switch (MonoPage) {
|
||||
case 0:
|
||||
mono = &MonoArray[0];
|
||||
mono->Clear();
|
||||
|
||||
/*
|
||||
** Display the status of the currently selected object.
|
||||
*/
|
||||
if (CurrentObject.Count()) {
|
||||
_lastobject = CurrentObject[0];
|
||||
}
|
||||
if (_lastobject && !_lastobject->IsActive) {
|
||||
_lastobject = 0;
|
||||
}
|
||||
if (_lastobject) {
|
||||
_lastobject->Debug_Dump(mono);
|
||||
}
|
||||
Logic.Debug_Dump(mono);
|
||||
mono->Set_Cursor(0, 20);
|
||||
mono->Printf(
|
||||
"Heap size:%10ld \r"
|
||||
"Largest: %10ld \r"
|
||||
"Ttl Free: %10ld \r"
|
||||
"Frag: %10ld \r",
|
||||
Heap_Size(MEM_NORMAL),
|
||||
Ram_Free(MEM_NORMAL),
|
||||
Total_Ram_Free(MEM_NORMAL),
|
||||
Total_Ram_Free(MEM_NORMAL)-Ram_Free(MEM_NORMAL)
|
||||
);
|
||||
*MonoClass::Get_Current() = *mono;
|
||||
break;
|
||||
}
|
||||
|
||||
MonoArray[MonoPage] = *mono;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
42
DEBUG.H
Normal file
42
DEBUG.H
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define TXT_NONE_DEBUG 0x3e8 //
|
||||
#define TXTED_BLANK 0x3e9 // ____
|
||||
#define TXTED_UNABLETOREAD 0x3ea // Unable to read scenario!
|
||||
#define TXTED_FILEEXISTS 0x3eb // File exists. Replace?
|
||||
#define TXTED_LOWMEM 0x3ec // Insufficient memory!
|
||||
#define TXTED_EXIT 0x3ed // Exit Scenario Editor?
|
||||
#define TXT_GENERIC_EXCEPTION 0x3ee // ERROR: Exception was
|
||||
#define TXT_RADIO_1 0x3ef // hisssss
|
||||
#define TXT_RADIO_2 0x3f0 // Roger.
|
||||
#define TXT_RADIO_3 0x3f1 // Come in.
|
||||
#define TXT_RADIO_4 0x3f2 // Over and out.
|
||||
#define TXT_RADIO_5 0x3f3 // Requesting transport.
|
||||
#define TXT_RADIO_6 0x3f4 // I've got a delivery for
|
||||
#define TXT_RADIO_7 0x3f5 // I'm performing load/unload
|
||||
#define TXT_RADIO_8 0x3f6 // I'm clear.
|
||||
#define TXT_RADIO_9 0x3f7 // You are clear to unload.
|
||||
#define TXT_RADIO_10 0x3f8 // Am unable to comply.
|
||||
#define TXT_RADIO_11 0x3f9 // I'm starting construction
|
||||
#define TXT_RADIO_12 0x3fa // I've finished construction.
|
||||
#define TXT_RADIO_13 0x3fb // Oops, sorry. I might have
|
||||
#define TXT_RADIO_14 0x3fc // I'm full. May I unload at
|
||||
#define TXT_RADIO_15 0x3fd // Are you a refinery and are
|
||||
#define TXT_RADIO_16 0x3fe // Take this kick! You...
|
||||
#define TXT_RADIO_17 0x3ff // Take this punch! You...
|
184
DESCDLG.CPP
Normal file
184
DESCDLG.CPP
Normal file
|
@ -0,0 +1,184 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\descdlg.cpv 2.17 16 Oct 1995 16:49:44 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DESCDLG.CPP *
|
||||
* *
|
||||
* Programmer : Maria del Mar McCready Legg *
|
||||
* Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : Jan 26, 1995 *
|
||||
* *
|
||||
* Last Update : Jan 26, 1995 [MML] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* DescriptionClass::Process -- Handles all the options graphic interface. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
#include "descdlg.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DescriptionClass::Process -- Handles all the options graphic interface. *
|
||||
* *
|
||||
* This dialog uses an edit box to "fill-out" a description. *
|
||||
* *
|
||||
* INPUT: char *string - return answer here. *
|
||||
* OUTPUT: none *
|
||||
* WARNINGS: none *
|
||||
* HISTORY: 12/31/1994 MML : Created. *
|
||||
*=============================================================================================*/
|
||||
void DescriptionClass::Process(char *string)
|
||||
{
|
||||
/*
|
||||
-----------------------------------------------------------------
|
||||
Set up the window. Window x-coords are in bytes not pixels.
|
||||
-----------------------------------------------------------------
|
||||
*/
|
||||
Set_Window(WINDOW_EDITOR, OPTION_X, OPTION_Y, OPTION_WIDTH, OPTION_HEIGHT);
|
||||
Set_Logic_Page(SeenBuff);
|
||||
|
||||
/*
|
||||
-----------------------------------------------------------------------
|
||||
Create Buttons. Button coords are in pixels, but are window-relative.
|
||||
-----------------------------------------------------------------------
|
||||
*/
|
||||
TextButtonClass optionsbtn(
|
||||
BUTTON_OPTIONS,
|
||||
TXT_OK,
|
||||
TPF_6PT_GRAD,
|
||||
0,
|
||||
BUTTON_Y);
|
||||
|
||||
TextButtonClass cancelbtn(
|
||||
BUTTON_CANCEL,
|
||||
TXT_CANCEL,
|
||||
TPF_6PT_GRAD,
|
||||
0,
|
||||
BUTTON_Y);
|
||||
|
||||
cancelbtn.X = OPTION_X + ((OPTION_WIDTH - optionsbtn.Width)/3)*2;
|
||||
optionsbtn.X = OPTION_X + ((OPTION_WIDTH - optionsbtn.Width)/3);
|
||||
optionsbtn.Add_Tail(cancelbtn);
|
||||
|
||||
EditClass edit(
|
||||
BUTTON_EDIT,
|
||||
string,
|
||||
31,
|
||||
TPF_6PT_GRAD,
|
||||
0,
|
||||
EDIT_Y
|
||||
,EDIT_W);
|
||||
|
||||
edit.Set_Focus();
|
||||
edit.X = OPTION_X + (OPTION_WIDTH - edit.Width)/2,
|
||||
optionsbtn.Add_Tail(edit);
|
||||
|
||||
/*
|
||||
** This causes left mouse button clicking within the confines of the dialog to
|
||||
** be ignored if it wasn't recognized by any other button or slider.
|
||||
*/
|
||||
GadgetClass dialog(OPTION_X, OPTION_Y, OPTION_WIDTH, OPTION_HEIGHT, GadgetClass::LEFTPRESS);
|
||||
optionsbtn.Add_Tail(dialog);
|
||||
|
||||
/*
|
||||
** This causes a right click anywhere or a left click outside the dialog region
|
||||
** to be equivalent to clicking on the return to options dialog.
|
||||
*/
|
||||
ControlClass background(BUTTON_OPTIONS, 0, 0, SeenBuff.Get_Width(), SeenBuff.Get_Height(), GadgetClass::LEFTPRESS|GadgetClass::RIGHTPRESS);
|
||||
optionsbtn.Add_Tail(background);
|
||||
|
||||
/*
|
||||
------------------- Main Processing Loop --------------------
|
||||
*/
|
||||
bool display = true;
|
||||
bool process = true;
|
||||
while (process) {
|
||||
|
||||
/*
|
||||
** If we have just received input focus again after running in the background then
|
||||
** we need to redraw.
|
||||
*/
|
||||
if (AllSurfaces.SurfacesRestored){
|
||||
AllSurfaces.SurfacesRestored=FALSE;
|
||||
display=TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
-------------- Invoke game callback -------------
|
||||
*/
|
||||
Call_Back();
|
||||
|
||||
/*
|
||||
-------------- Refresh display if needed --------------
|
||||
*/
|
||||
if (display) {
|
||||
|
||||
Window_Hide_Mouse(WINDOW_EDITOR);
|
||||
|
||||
/*
|
||||
--------- Draw the background -----------
|
||||
*/
|
||||
Window_Box (WINDOW_EDITOR, BOXSTYLE_GREEN_BORDER); // has border, raised up
|
||||
Draw_Caption(TXT_MISSION_DESCRIPTION, OPTION_X, OPTION_Y, OPTION_WIDTH);
|
||||
|
||||
/*
|
||||
--------- Draw the titles -----------
|
||||
*/
|
||||
optionsbtn.Draw_All();
|
||||
Window_Show_Mouse();
|
||||
display = false;
|
||||
}
|
||||
|
||||
/*
|
||||
-------------- Get user input ---------------
|
||||
*/
|
||||
KeyNumType input = optionsbtn.Input();
|
||||
|
||||
/*
|
||||
-------------- Process Input ----------------
|
||||
*/
|
||||
switch (input) {
|
||||
|
||||
case KN_RETURN:
|
||||
case BUTTON_OPTIONS|KN_BUTTON:
|
||||
strtrim(string);
|
||||
process = false;
|
||||
break;
|
||||
|
||||
case KN_ESC:
|
||||
case BUTTON_CANCEL|KN_BUTTON:
|
||||
string[0]= NULL;
|
||||
strtrim(string);
|
||||
process = false;
|
||||
break;
|
||||
|
||||
case BUTTON_EDIT|KN_BUTTON:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
69
DESCDLG.H
Normal file
69
DESCDLG.H
Normal file
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\descdlg.h_v 2.18 16 Oct 1995 16:47:26 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DESCDLG.H *
|
||||
* *
|
||||
* Programmer : Maria del Mar McCready Legg *
|
||||
* Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : Jan 26, 1995 *
|
||||
* *
|
||||
* Last Update : Jan 26, 1995 [MML] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef DESCDLG_H
|
||||
#define DESCDLG_H
|
||||
|
||||
#include "gadget.h"
|
||||
|
||||
class DescriptionClass
|
||||
{
|
||||
private:
|
||||
|
||||
enum DescriptionClassEnum {
|
||||
OPTION_WIDTH=216, // Width of dialog box.
|
||||
OPTION_HEIGHT=122, // Height of dialog box.
|
||||
OPTION_X=(((320 - OPTION_WIDTH) / 2) & ~7),
|
||||
OPTION_Y=((200 - OPTION_HEIGHT) / 2),
|
||||
TEXT_X=OPTION_X+32, // Title's x pos
|
||||
TEXT_Y=OPTION_Y+32, // Add 11 for each following line
|
||||
BUTTON_OPTIONS=1, // Button number for "Ok"
|
||||
BUTTON_CANCEL,
|
||||
BUTTON_EDIT,
|
||||
BUTTON_X=OPTION_X+63, // Options button x pos
|
||||
BUTTON_Y=OPTION_Y+102, // Options button y pos
|
||||
EDIT_Y =OPTION_Y+50,
|
||||
EDIT_W =180 //204,
|
||||
};
|
||||
|
||||
public:
|
||||
DescriptionClass(void) {};
|
||||
void Process(char *string);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
317
DIAL8.CPP
Normal file
317
DIAL8.CPP
Normal file
|
@ -0,0 +1,317 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\dial8.cpv 2.18 16 Oct 1995 16:51:32 JOE_BOSTIC $ */
|
||||
/***************************************************************************
|
||||
** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
|
||||
***************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DIAL8.CPP *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : February 6, 1995 *
|
||||
* *
|
||||
* Last Update : February 6, 1995 [BR] *
|
||||
* *
|
||||
*-------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Dial8Class::Action -- action routine for Dial8Class *
|
||||
* Dial8Class::Dial8Class -- constructor for the facing dial *
|
||||
* Dial8Class::Draw_Me -- render routine for Dial8Class *
|
||||
* Dial8Class::Get_Direction -- retrieves direction (0-255) of dial *
|
||||
* Dial8Class::Set_Direction -- sets current direction (0-255) of dial *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Dial8Class::Dial8Class -- constructor for the facing dial *
|
||||
* *
|
||||
* INPUT: *
|
||||
* id button ID *
|
||||
* x,y,w,h dimensions in window-relative pixels *
|
||||
* dir numerical initial facing value (0-255); this is the *
|
||||
* value returned by WWLIB Desired_Facing8() *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/16/1994 BR : Created. *
|
||||
*=========================================================================*/
|
||||
Dial8Class::Dial8Class(int id, int x, int y, int w, int h, DirType dir) :
|
||||
ControlClass(id, x, y, w, h, LEFTPRESS | LEFTHELD | LEFTRELEASE, true)
|
||||
{
|
||||
/*
|
||||
** Center coordinates.
|
||||
*/
|
||||
FaceX = X + (Width / 2);
|
||||
FaceY = Y + (Height / 2);
|
||||
|
||||
/*
|
||||
** Init directions.
|
||||
*/
|
||||
Direction = dir; // 0 - 255
|
||||
Facing = Dir_Facing(Direction); // 0 - 7
|
||||
OldFacing = Facing; // 0 - 7
|
||||
|
||||
/*
|
||||
** Compute the drawing dimensions: a 45-degree angle intersects a unity-
|
||||
** radius circle at (.707,.707). Make the decorations 8/10 of the radius,
|
||||
** and the line extend to 6/10 of the radius. Use Width/2 for x-radius,
|
||||
** Height/2 for y-radius.
|
||||
*/
|
||||
FacePoint[0][0] = FaceX;
|
||||
FacePoint[0][1] = FaceY - (h * 8 / 2) / 10;
|
||||
|
||||
FacePoint[1][0] = FaceX + (w * 7 * 8 / 2) / 100;
|
||||
FacePoint[1][1] = FaceY - (h * 7 * 8 / 2) / 100;
|
||||
|
||||
FacePoint[2][0] = FaceX + (w * 8 / 2) / 10;
|
||||
FacePoint[2][1] = FaceY;
|
||||
|
||||
FacePoint[3][0] = FaceX + (w * 7 * 8 / 2) / 100;
|
||||
FacePoint[3][1] = FaceY + (h * 7 * 8 / 2) / 100;
|
||||
|
||||
FacePoint[4][0] = FaceX;
|
||||
FacePoint[4][1] = FaceY + (h * 8 / 2) / 10;
|
||||
|
||||
FacePoint[5][0] = FaceX - (w * 7 * 8 / 2) / 100;
|
||||
FacePoint[5][1] = FaceY + (h * 7 * 8 / 2) / 100;
|
||||
|
||||
FacePoint[6][0] = FaceX - (w * 8 / 2) / 10;
|
||||
FacePoint[6][1] = FaceY;
|
||||
|
||||
FacePoint[7][0] = FaceX - (w * 7 * 8 / 2) / 100;
|
||||
FacePoint[7][1] = FaceY - (h * 7 * 8 / 2) / 100;
|
||||
|
||||
FaceLine[0][0] = FaceX;
|
||||
FaceLine[0][1] = FaceY - (h * 6 / 2) / 10;
|
||||
|
||||
FaceLine[1][0] = FaceX + (w * 7 * 6 / 2) / 100;
|
||||
FaceLine[1][1] = FaceY - (h * 7 * 6 / 2) / 100;
|
||||
|
||||
FaceLine[2][0] = FaceX + (w * 6 / 2) / 10;
|
||||
FaceLine[2][1] = FaceY;
|
||||
|
||||
FaceLine[3][0] = FaceX + (w * 7 * 6 / 2) / 100;
|
||||
FaceLine[3][1] = FaceY + (h * 7 * 6 / 2) / 100;
|
||||
|
||||
FaceLine[4][0] = FaceX;
|
||||
FaceLine[4][1] = FaceY + (h * 6 / 2) / 10;
|
||||
|
||||
FaceLine[5][0] = FaceX - (w * 7 * 6 / 2) / 100;
|
||||
FaceLine[5][1] = FaceY + (h * 7 * 6 / 2) / 100;
|
||||
|
||||
FaceLine[6][0] = FaceX - (w * 6 / 2) / 10;
|
||||
FaceLine[6][1] = FaceY;
|
||||
|
||||
FaceLine[7][0] = FaceX - (w * 7 * 6 / 2) / 100;
|
||||
FaceLine[7][1] = FaceY - (h * 7 * 6 / 2) / 100;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Dial8Class::Action -- activation function for Dial8Class *
|
||||
* *
|
||||
* INPUT: *
|
||||
* flags the reason we're being called *
|
||||
* key the KN_number that was pressed *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = event was processed, false = event not processed *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/06/1995 BR : Created. *
|
||||
*=========================================================================*/
|
||||
int Dial8Class::Action(unsigned flags, KeyNumType &key)
|
||||
{
|
||||
static int is_sel = 0;
|
||||
|
||||
/*
|
||||
** We might end up clearing the event bits. Make sure that the sticky
|
||||
** process is properly updated anyway.
|
||||
*/
|
||||
Sticky_Process(flags);
|
||||
|
||||
if (flags & LEFTPRESS) {
|
||||
is_sel = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
** If left mouse is clicked or held, and the dial has changed its direction,
|
||||
** invoke the parent Action routine:
|
||||
** GadgetClass::Action handles Sticky processing, & sets IsToRepaint if any
|
||||
** flag bits are set.
|
||||
** ControlClass::Action handles Peer_To_Peer notification, and substitues
|
||||
** 'key' with the button ID if any flags are set, or 0 if no flags are set
|
||||
*/
|
||||
if (flags & LEFTPRESS || ((flags & LEFTHELD) && is_sel)) {
|
||||
/*
|
||||
** Get new dial position (0-255)
|
||||
*/
|
||||
Direction = (DirType)Desired_Facing8(FaceX, FaceY, Get_Mouse_X(), Get_Mouse_Y());
|
||||
|
||||
/*
|
||||
** Convert to Facing value (0-7).
|
||||
*/
|
||||
Facing = Dir_Facing(Direction);
|
||||
|
||||
/*
|
||||
** If it's moved, redraw.
|
||||
*/
|
||||
if (Facing!=OldFacing) {
|
||||
OldFacing = Facing;
|
||||
ControlClass::Action(flags,key);
|
||||
return(true);
|
||||
|
||||
} else {
|
||||
|
||||
/*
|
||||
** Dial hasn't moved; kill the event & return
|
||||
*/
|
||||
key = KN_NONE;
|
||||
ControlClass::Action(0,key);
|
||||
return(true);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/*
|
||||
** Otherwise, no events have occurred; kill the event if it's a LEFTRELEASE,
|
||||
** and return
|
||||
*/
|
||||
if (flags & LEFTRELEASE) {
|
||||
key = KN_NONE;
|
||||
is_sel = 0;
|
||||
}
|
||||
return(ControlClass::Action(0,key));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Dial8Class::Draw_Me -- custom render routine for Dial8Class *
|
||||
* *
|
||||
* INPUT: *
|
||||
* forced true = draw regardless of the current redraw flag state*
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* true = gadget was redrawn, false = wasn't *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 02/06/1995 BR : Created. *
|
||||
*=========================================================================*/
|
||||
int Dial8Class::Draw_Me(int forced)
|
||||
{
|
||||
/*
|
||||
** Redraw if parent indicates a redraw is needed
|
||||
*/
|
||||
if (ControlClass::Draw_Me(forced)) {
|
||||
/*
|
||||
** Hide the mouse.
|
||||
*/
|
||||
|
||||
if (LogicPage == &SeenBuff) {
|
||||
Hide_Mouse();
|
||||
}
|
||||
|
||||
/*
|
||||
** Draw background & decorations.
|
||||
*/
|
||||
Draw_Box(X, Y, Width, Height, BOXSTYLE_GREEN_DOWN, true);
|
||||
for (int i=0; i<8; i++) {
|
||||
Draw_Box(FacePoint[i][0] - 1, FacePoint[i][1] -1, 3, 3, BOXSTYLE_GREEN_RAISED, false);
|
||||
}
|
||||
|
||||
/*
|
||||
** Draw the hand & its shadow.
|
||||
*/
|
||||
LogicPage->Draw_Line(FaceX+1, FaceY+1, FaceLine[Facing][0]+1, FaceLine[Facing][1]+1,CC_GREEN_SHADOW);
|
||||
LogicPage->Draw_Line(FaceX, FaceY, FaceLine[Facing][0], FaceLine[Facing][1],CC_LIGHT_GREEN);
|
||||
|
||||
/*
|
||||
** Restore the mouse.
|
||||
*/
|
||||
if (LogicPage == &SeenBuff) {
|
||||
Show_Mouse();
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Dial8Class::Get_Direction -- retrieves direction (0-255) of dial *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* DirType dial is pointing to *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/17/1994 BR : Created. *
|
||||
*=========================================================================*/
|
||||
DirType Dial8Class::Get_Direction(void) const
|
||||
{
|
||||
return(Direction);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Dial8Class::Set_Direction -- sets current direction (0-255) of dial *
|
||||
* *
|
||||
* INPUT: *
|
||||
* DirType to set dial to *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/17/1994 BR : Created. *
|
||||
*=========================================================================*/
|
||||
void Dial8Class::Set_Direction(DirType dir)
|
||||
{
|
||||
Direction = dir;
|
||||
Facing = Dir_Facing(Direction);
|
||||
OldFacing = Facing;
|
||||
Flag_To_Redraw();
|
||||
}
|
76
DIAL8.H
Normal file
76
DIAL8.H
Normal file
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\dial8.h_v 2.18 16 Oct 1995 16:47:28 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DIAL8.H *
|
||||
* *
|
||||
* Programmer : Bill Randolph *
|
||||
* *
|
||||
* Start Date : 02/06/95 *
|
||||
* *
|
||||
* Last Update : February 6, 1995 [BR] *
|
||||
* *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef DIAL8_H
|
||||
#define DIAL8_H
|
||||
|
||||
class Dial8Class : public ControlClass
|
||||
{
|
||||
public:
|
||||
/*
|
||||
** Constructor/Destructor
|
||||
*/
|
||||
Dial8Class(int id, int x, int y, int w, int h, DirType dir);
|
||||
|
||||
/*
|
||||
** Get/Set the direction the dial is currently pointing
|
||||
*/
|
||||
DirType Get_Direction(void) const;
|
||||
void Set_Direction(DirType dir);
|
||||
|
||||
/*
|
||||
** Overloaded draw routine
|
||||
*/
|
||||
virtual int Draw_Me(int forced = false);
|
||||
|
||||
protected:
|
||||
/*
|
||||
** Overloaded event processing routine
|
||||
*/
|
||||
virtual int Action(unsigned flags, KeyNumType &key);
|
||||
|
||||
private:
|
||||
int FaceX; // x-coord of center of face
|
||||
int FaceY; // y-coord of center of face
|
||||
int FacePoint[8][2]; // coords of the little dial decorations
|
||||
int FaceLine[8][2]; // coords for drawing the dial hand
|
||||
DirType Direction; // 0-255 numerical direction of dial
|
||||
FacingType Facing; // numerical facing direction of dial (0 - 7)
|
||||
FacingType OldFacing; // previous Facing value
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
790
DIALOG.CPP
Normal file
790
DIALOG.CPP
Normal file
|
@ -0,0 +1,790 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\dialog.cpv 2.17 16 Oct 1995 16:51:50 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DIALOG.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : September 10, 1993 *
|
||||
* *
|
||||
* Last Update : May 18, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* Clip_Text_Print -- Prints text with clipping and <TAB> support. *
|
||||
* Dialog_Box -- draws a dialog background box *
|
||||
* Display_Place_Building -- Displays the "place building" dialog box. *
|
||||
* Display_Select_Target -- Displays the "choose target" prompt. *
|
||||
* Display_Status -- Display the player scenario status box. *
|
||||
* Draw_Box -- Displays a highlighted box. *
|
||||
* Fancy_Text_Print -- Prints text with a drop shadow. *
|
||||
* Redraw_Needed -- Determine if sidebar needs to be redrawn. *
|
||||
* Render_Bar_Graph -- Renders a specified bargraph. *
|
||||
* Simple_Text_Print -- Prints text with a drop shadow. *
|
||||
* Window_Box -- Draws a fancy box over the specified window. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Dialog_Box -- draws a dialog background box *
|
||||
* *
|
||||
* INPUT: *
|
||||
* x,y,w,h the usual *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/26/1995 BR : Created. *
|
||||
*=============================================================================================*/
|
||||
void Dialog_Box(int x, int y, int w, int h)
|
||||
{
|
||||
Draw_Box( x, y, w, h, BOXSTYLE_GREEN_BORDER, true);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Draw_Box -- Displays a highlighted box. *
|
||||
* *
|
||||
* This will draw a highlighted box to the logicpage. It can *
|
||||
* optionally fill the box with a color as well. This is a low level *
|
||||
* function and thus, it doesn't do any graphic mode color adjustments. *
|
||||
* *
|
||||
* INPUT: x,y -- Upper left corner of the box to be drawn (pixels). *
|
||||
* *
|
||||
* w,h -- Width and height of box (in pixels). *
|
||||
* *
|
||||
* up -- Is the box rendered in the "up" stated? *
|
||||
* *
|
||||
* filled-- Is the box to be filled. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/28/1991 JLB : Created. *
|
||||
* 05/30/1992 JLB : Embedded color codes. *
|
||||
* 07/31/1992 JLB : Depressed option added. *
|
||||
*=============================================================================================*/
|
||||
extern void CC_Texture_Fill (void const *shapefile, int shapenum, int xpos, int ypos, int width, int height);
|
||||
|
||||
void Draw_Box(int x, int y, int w, int h, BoxStyleEnum up, bool filled)
|
||||
{
|
||||
static BoxStyleType const ButtonColors[BOXSTYLE_COUNT] = {
|
||||
|
||||
//Filler, Shadow, Hilite, Corner colors
|
||||
|
||||
{ LTGREY, WHITE, DKGREY, LTGREY}, // 0 Button is down.
|
||||
{ LTGREY, DKGREY, WHITE, LTGREY}, // 1 Button is up w/border.
|
||||
{ LTBLUE, BLUE, LTCYAN, LTBLUE}, // 2 Raised blue.
|
||||
{ DKGREY, WHITE, BLACK, DKGREY}, // 3 Button is disabled down.
|
||||
{ DKGREY, BLACK, WHITE, LTGREY}, // 4 Button is disabled up.
|
||||
{ LTGREY, DKGREY, WHITE, LTGREY}, // 5 Button is up w/arrows.
|
||||
//{ CC_GREEN_BKGD, CC_LIGHT_GREEN, CC_GREEN_SHADOW, CC_GREEN_CORNERS }, // 6 Button is down.
|
||||
//{ CC_GREEN_BKGD, CC_GREEN_SHADOW, CC_LIGHT_GREEN, CC_GREEN_CORNERS }, // 7 Button is up w/border.
|
||||
{ CC_GREEN_BKGD, 14, 12, 13 }, // 6 Button is down.
|
||||
{ CC_GREEN_BKGD, 12, 14, 13 }, // 7 Button is up w/border.
|
||||
{ DKGREY, WHITE, BLACK, DKGREY}, // 8 Button is disabled down.
|
||||
{ DKGREY, BLACK, LTGREY, DKGREY}, // 9 Button is disabled up.
|
||||
//{ BLACK, CC_GREEN_BOX, CC_GREEN_BOX, BLACK}, // 10 List box.
|
||||
//{ BLACK, CC_GREEN_BOX, CC_GREEN_BOX, BLACK}, // 11 Menu box.
|
||||
{ BLACK, 14, 14, BLACK}, // 10 List box.
|
||||
{ BLACK, 14, 14, BLACK}, // 11 Menu box.
|
||||
};
|
||||
|
||||
w--;
|
||||
h--;
|
||||
BoxStyleType const &style = ButtonColors[up];
|
||||
|
||||
if (filled) {
|
||||
if (style.Filler == CC_GREEN_BKGD){
|
||||
CC_Texture_Fill (MixFileClass::Retrieve("BTEXTURE.SHP"), InMainLoop, x, y, w, h);
|
||||
}else{
|
||||
LogicPage->Fill_Rect( x, y, x+w, y+h, style.Filler);
|
||||
}
|
||||
}
|
||||
|
||||
switch ( up ) {
|
||||
case ( BOXSTYLE_GREEN_BOX ):
|
||||
LogicPage->Draw_Rect(x, y, x+w, y+h, style.Highlight);
|
||||
break;
|
||||
|
||||
case ( BOXSTYLE_GREEN_BORDER ):
|
||||
LogicPage->Draw_Rect(x+1, y+1, x+w-1, y+h-1, style.Highlight);
|
||||
break;
|
||||
|
||||
default:
|
||||
LogicPage->Draw_Line(x, y+h, x+w, y+h, style.Shadow);
|
||||
LogicPage->Draw_Line(x+w, y, x+w, y+h, style.Shadow);
|
||||
|
||||
LogicPage->Draw_Line(x, y, x+w, y, style.Highlight);
|
||||
LogicPage->Draw_Line(x, y, x, y+h, style.Highlight);
|
||||
|
||||
LogicPage->Put_Pixel(x, y+h, style.Corner);
|
||||
LogicPage->Put_Pixel(x+w, y, style.Corner);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Format_Window_String -- Separates a String into Lines. *
|
||||
* This function will take a long string and break it up into lines *
|
||||
* which are not longer then the window width. Any character < ' ' is *
|
||||
* considered a new line marker and will be replaced by a NULL. *
|
||||
* *
|
||||
* INPUT: char *String - string to be formated. *
|
||||
* int maxlinelen - Max length of any line in pixels. *
|
||||
* *
|
||||
* OUTPUT: int - number of lines string is. *
|
||||
* *
|
||||
* WARNINGS: The string passed in will be modified - NULLs will be put *
|
||||
* into each position that will be a new line. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/27/1992 SB : Created. *
|
||||
* 05/18/1995 JLB : Greatly revised for new font system. *
|
||||
*=============================================================================================*/
|
||||
int Format_Window_String(char * string, int maxlinelen, int & width, int & height)
|
||||
{
|
||||
int linelen;
|
||||
int lines = 0;
|
||||
width = 0;
|
||||
height = 0;
|
||||
|
||||
// In no string was passed in, then there are no lines.
|
||||
if (!string) return(0);
|
||||
|
||||
// While there are more letters left divide the line up.
|
||||
while (*string) {
|
||||
linelen = 0;
|
||||
height += FontHeight + FontYSpacing;
|
||||
lines++;
|
||||
|
||||
// While the current line is less then the max length...
|
||||
while (linelen < maxlinelen && *string != '\r' && *string != '\0') {
|
||||
linelen += Char_Pixel_Width(*string++);
|
||||
}
|
||||
|
||||
// if the line is to long...
|
||||
if (linelen >= maxlinelen) {
|
||||
|
||||
/*
|
||||
** Back up to an appropriate location to break.
|
||||
*/
|
||||
while (*string != ' ' && *string != '\r' && *string != '\0') {
|
||||
linelen -= Char_Pixel_Width(*string--);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
** Record the largest width of the worst case string.
|
||||
*/
|
||||
if (linelen > width) {
|
||||
width = linelen;
|
||||
}
|
||||
|
||||
/*
|
||||
** Force a break at the end of the line.
|
||||
*/
|
||||
if (*string) {
|
||||
*string++ = '\r';
|
||||
}
|
||||
}
|
||||
return(lines);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Window_Box -- Draws a fancy box over the specified window. *
|
||||
* *
|
||||
* This routine will draw a fancy (shaded) box over the specified *
|
||||
* window. This is the effect used to give the polished look to *
|
||||
* screen rectangles without having to use art. *
|
||||
* *
|
||||
* INPUT: window -- Specified window to fill and border. *
|
||||
* *
|
||||
* style -- The style to render the window. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: The rendering is done to the LogicPage. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/03/1992 JLB : Created. *
|
||||
* 07/31/1992 JLB : Cool raised border effect. *
|
||||
* 06/08/1994 JLB : Takes appropriate enumeration parameters. *
|
||||
*=============================================================================================*/
|
||||
void Window_Box(WindowNumberType window, BoxStyleEnum style)
|
||||
{
|
||||
int x,y,w,h; // Window dimensions.
|
||||
int border; // Width of border.
|
||||
|
||||
static int _border[BOXSTYLE_COUNT][2] = {
|
||||
{0,0}, // 0 Simple beveled edge.
|
||||
{2,4}, // 1 Wide raised border.
|
||||
{1,1}, // 2 Thick beveled edge.
|
||||
{2,1}, // 3 Thin raised border.
|
||||
{0,0}, // 4 Simple beveled edge.
|
||||
{20,0}, // 5 Simple beveled edge.
|
||||
{0,0}, // 6 Simple beveled edge.
|
||||
{2,4}, // 7 Wide raised border.
|
||||
{0,0}, // 8 Simple beveled edge.
|
||||
{20,0}, // 9 Simple beveled edge.
|
||||
{0,1} // 10 Simple 1 pixel box.
|
||||
};
|
||||
|
||||
x = WindowList[window][WINDOWX]<<3;
|
||||
y = WindowList[window][WINDOWY];
|
||||
w = WindowList[window][WINDOWWIDTH]<<3;
|
||||
h = WindowList[window][WINDOWHEIGHT];
|
||||
|
||||
/*
|
||||
** If it is to be rendered to the seenpage, then
|
||||
** hide the mouse.
|
||||
*/
|
||||
if (LogicPage == (&SeenBuff)) Conditional_Hide_Mouse(x,y,x+w,y+h);
|
||||
|
||||
Draw_Box(x, y, w, h, style, true);
|
||||
border = _border[style][1];
|
||||
|
||||
/*
|
||||
** Draw the second border if requested.
|
||||
*/
|
||||
if (border) {
|
||||
Draw_Box(x+border, y+border, w-(border<<1), h-(border<<1), style, false);
|
||||
}
|
||||
|
||||
/*
|
||||
** Restore the mouse if it has been hidden and return.
|
||||
*/
|
||||
if (LogicPage == &SeenBuff) Conditional_Show_Mouse();
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Simple_Text_Print -- Prints text with a drop shadow. *
|
||||
* *
|
||||
* This routine functions like Text_Print, but will render a drop *
|
||||
* shadow (in black). *
|
||||
* *
|
||||
* INPUT: text -- Pointer to text to render. *
|
||||
* *
|
||||
* x,y -- Pixel coordinate for to print text. *
|
||||
* *
|
||||
* fore -- Foreground color. *
|
||||
* *
|
||||
* back -- Background color. *
|
||||
* *
|
||||
* flag -- Text print control flags. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/24/1991 JLB : Created. *
|
||||
* 10/26/94 JLB : Handles font X spacing in a more friendly manner. *
|
||||
*=============================================================================================*/
|
||||
void Simple_Text_Print(char const *text, unsigned x, unsigned y, unsigned fore, unsigned back, TextPrintType flag)
|
||||
{
|
||||
static int yspace=0; // Y spacing adjustment for font.
|
||||
static int xspace=0; // Spacing adjustment for font.
|
||||
void const * font=0; // Font to use.
|
||||
|
||||
////////////////#if (0)
|
||||
static unsigned char _textfontpal[16][16] = {
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 26, 25, 24 },
|
||||
{ 0,135, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 136,135,119, 2 },
|
||||
{ 0,159, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 143,159,41 ,167 },
|
||||
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0,157, 0, 0, 0, 0, 0, 0, 0, 0, 0,180, 180,157,158, 5 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0,179, 0, 0, 0, 0, 0, 0, 0, 0, 0,180, 180,179,178,176 },
|
||||
|
||||
{ 0,123, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 122,123,125,127 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,204, 204,203,202,201 },
|
||||
{ 0, 1, 4,166, 41, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
|
||||
{ 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,204, 204,203,202,201 },
|
||||
{ 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,204, 204,203,202,201 },
|
||||
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
static unsigned char _textpalmedium[16] = {
|
||||
0, 25, 119,41, 0, 158,0, 178, 125,0, 202,0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
static unsigned char _textpalbright[16] = {
|
||||
0, 24, 2, 4, 0, 5, 0, 176, 127,0, 201,0, 0, 0, 0, 0
|
||||
};
|
||||
///////////////////////#endif //(0)
|
||||
|
||||
int point; // Requested font size.
|
||||
int shadow; // Requested shadow value.
|
||||
unsigned char fontpalette[16]; // Working font palette array.
|
||||
memset(&fontpalette[0], back, 16);
|
||||
|
||||
if ((flag & 0xf) == TPF_VCR) {
|
||||
fontpalette[3] = 12;
|
||||
fontpalette[9] = 15;
|
||||
fontpalette[10] = 200;
|
||||
fontpalette[11] = 201;
|
||||
fontpalette[12] = 202;
|
||||
fontpalette[13] = 203;
|
||||
fontpalette[14] = 204;
|
||||
fontpalette[15] = 205;
|
||||
}
|
||||
|
||||
char *tempstr = NULL;
|
||||
|
||||
if (text){
|
||||
/*
|
||||
** remove any 0xff characters from the string
|
||||
*/
|
||||
tempstr = new char [strlen (text)+1];
|
||||
char *tempptr = tempstr;
|
||||
|
||||
for ( int i=0 ; i<strlen(text)+1 ; i++ ) {
|
||||
if (text[i] != -1){
|
||||
*tempptr = text[i];
|
||||
tempptr++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** A gradient font always requires special fixups for the palette.
|
||||
*/
|
||||
if ((flag & 0xf) == TPF_6PT_GRAD ||
|
||||
(flag & 0xf) == TPF_GREEN12_GRAD ||
|
||||
(flag & 0xf) == TPF_GREEN12) {
|
||||
/*
|
||||
** If a gradient palette was requested, then fill in the font palette array
|
||||
** according to the color index specified.
|
||||
*/
|
||||
if (flag & TPF_USE_GRAD_PAL) {
|
||||
memcpy(&fontpalette[0], _textfontpal[ (fore & 0x0f) ], 16);
|
||||
} else {
|
||||
|
||||
/*
|
||||
** Special adjustment for fonts that have gradient artwork. When there is
|
||||
** no special gradient effect desired, then set the font color based on the
|
||||
** forground color specified.
|
||||
*/
|
||||
memset(&fontpalette[4], fore, 12);
|
||||
}
|
||||
|
||||
if (flag & TPF_MEDIUM_COLOR) {
|
||||
fore = _textpalmedium[fore & 0x0F];
|
||||
memset(&fontpalette[4], fore, 12);
|
||||
}else{
|
||||
if (flag & TPF_BRIGHT_COLOR) {
|
||||
fore = _textpalbright[fore & 0x0F];
|
||||
memset(&fontpalette[4], fore, 12);
|
||||
}else{
|
||||
fore = fontpalette[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Change the current font if it differs from the font desired.
|
||||
*/
|
||||
point = (flag & (TextPrintType)0x000F);
|
||||
xspace = 1;
|
||||
yspace = 0;
|
||||
|
||||
switch (point) {
|
||||
case TPF_GREEN12:
|
||||
font = Green12FontPtr;
|
||||
break;
|
||||
|
||||
case TPF_GREEN12_GRAD:
|
||||
font = Green12GradFontPtr;
|
||||
break;
|
||||
|
||||
case TPF_MAP:
|
||||
font = MapFontPtr;
|
||||
xspace -= 1;
|
||||
break;
|
||||
|
||||
case TPF_VCR:
|
||||
font = VCRFontPtr;
|
||||
break;
|
||||
|
||||
case TPF_6PT_GRAD:
|
||||
font = GradFont6Ptr;
|
||||
xspace -= 1;
|
||||
//yspace -= 1;
|
||||
break;
|
||||
|
||||
case TPF_3POINT:
|
||||
xspace += 1;
|
||||
font = Font3Ptr;
|
||||
flag = flag & ~(TPF_DROPSHADOW|TPF_FULLSHADOW|TPF_NOSHADOW);
|
||||
break;
|
||||
|
||||
case TPF_6POINT:
|
||||
font = Font6Ptr;
|
||||
xspace -= 1;
|
||||
//yspace -= 1;
|
||||
break;
|
||||
|
||||
case TPF_8POINT:
|
||||
font = Font8Ptr;
|
||||
xspace -= 2;
|
||||
yspace -= 4;
|
||||
break;
|
||||
|
||||
case TPF_LED:
|
||||
xspace -= 4;
|
||||
font = FontLEDPtr;
|
||||
break;
|
||||
|
||||
default:
|
||||
font = FontPtr;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
** Change the current font palette according to the dropshadow flags.
|
||||
*/
|
||||
shadow = (flag & (TPF_NOSHADOW|TPF_DROPSHADOW|TPF_FULLSHADOW|TPF_LIGHTSHADOW));
|
||||
switch (shadow) {
|
||||
|
||||
/*
|
||||
** The text is rendered plain.
|
||||
*/
|
||||
case TPF_NOSHADOW:
|
||||
fontpalette[2] = back;
|
||||
fontpalette[3] = back;
|
||||
xspace -= 1;
|
||||
yspace -= 2;
|
||||
break;
|
||||
|
||||
/*
|
||||
** The text is rendered with a simple
|
||||
** drop shadow.
|
||||
*/
|
||||
case TPF_DROPSHADOW:
|
||||
fontpalette[2] = BLACK;
|
||||
fontpalette[3] = back;
|
||||
xspace -= 1;
|
||||
break;
|
||||
|
||||
/*
|
||||
** Special engraved text look for the options
|
||||
** dialog system.
|
||||
*/
|
||||
case TPF_LIGHTSHADOW:
|
||||
fontpalette[2] = ((14 * 16) + 7)+1;
|
||||
fontpalette[3] = back;
|
||||
xspace -= 1;
|
||||
break;
|
||||
|
||||
/*
|
||||
** Each letter is surrounded by black. This is used
|
||||
** when the text will be over a non-plain background.
|
||||
*/
|
||||
case TPF_FULLSHADOW:
|
||||
fontpalette[2] = BLACK;
|
||||
fontpalette[3] = BLACK;
|
||||
xspace -= 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
fontpalette[0] = back;
|
||||
fontpalette[1] = fore;
|
||||
|
||||
/*
|
||||
** Set the font and spacing according to the values they should be.
|
||||
*/
|
||||
FontXSpacing = xspace;
|
||||
FontYSpacing = yspace;
|
||||
Set_Font(font);
|
||||
Set_Font_Palette(fontpalette);
|
||||
|
||||
/*
|
||||
** Display the (centered) message if there is one.
|
||||
*/
|
||||
if (text && *text) {
|
||||
switch (flag & (TPF_CENTER|TPF_RIGHT)) {
|
||||
case TPF_CENTER:
|
||||
x -= String_Pixel_Width(tempstr)>>1;
|
||||
break;
|
||||
|
||||
case TPF_RIGHT:
|
||||
x -= String_Pixel_Width(tempstr);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ((unsigned)x < SeenBuff.Get_Width() && (unsigned)y < SeenBuff.Get_Height()) {
|
||||
LogicPage->Print(tempstr, x, y, fore, back);
|
||||
}
|
||||
}
|
||||
if (tempstr){
|
||||
delete [] tempstr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Fancy_Text_Print -- Prints text with a drop shadow. *
|
||||
* *
|
||||
* This routine functions like Text_Print, but will render a drop *
|
||||
* shadow (in black). *
|
||||
* *
|
||||
* INPUT: text -- Text number to print. *
|
||||
* *
|
||||
* x,y -- Pixel coordinate for to print text. *
|
||||
* *
|
||||
* fore -- Foreground color. *
|
||||
* *
|
||||
* back -- Background color. *
|
||||
* *
|
||||
* flag -- Text print control flags. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: This routine is much slower than normal text print and *
|
||||
* if rendered to the SEENPAGE, the intermediate rendering *
|
||||
* steps could be visible. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 11/29/1994 JLB : Created *
|
||||
*=============================================================================================*/
|
||||
void Fancy_Text_Print(int text, unsigned x, unsigned y, unsigned fore, unsigned back, TextPrintType flag, ...)
|
||||
{
|
||||
char buffer[512]; // Working staging buffer.
|
||||
va_list arg; // Argument list var.
|
||||
|
||||
/*
|
||||
** If the text number is valid, then process it.
|
||||
*/
|
||||
if (text != TXT_NONE) {
|
||||
va_start(arg, flag);
|
||||
|
||||
/*
|
||||
** The text string must be locked since the vsprintf function doesn't know
|
||||
** how to handle EMS pointers.
|
||||
*/
|
||||
char const * tptr = Text_String(text);
|
||||
vsprintf(buffer, tptr, arg);
|
||||
va_end(arg);
|
||||
|
||||
Simple_Text_Print(buffer, x, y, fore, back, flag);
|
||||
} else {
|
||||
|
||||
/*
|
||||
** Just the flags are to be changed, since the text number is TXT_NONE.
|
||||
*/
|
||||
Simple_Text_Print((char const *)0, x, y, fore, back, flag);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Fancy_Text_Print -- Prints text with a drop shadow. *
|
||||
* *
|
||||
* This routine functions like Text_Print, but will render a drop *
|
||||
* shadow (in black). *
|
||||
* *
|
||||
* INPUT: text -- Pointer to text to render. *
|
||||
* *
|
||||
* x,y -- Pixel coordinate for to print text. *
|
||||
* *
|
||||
* fore -- Foreground color. *
|
||||
* *
|
||||
* back -- Background color. *
|
||||
* *
|
||||
* flag -- Text print control flags. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: This routine is much slower than normal text print and *
|
||||
* if rendered to the SEENPAGE, the intermediate rendering *
|
||||
* steps could be visible. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/24/1991 JLB : Created. *
|
||||
* 10/26/94 JLB : Handles font X spacing in a more friendly manner. *
|
||||
* 11/29/1994 JLB : Separated actual draw action. *
|
||||
*=============================================================================================*/
|
||||
void Fancy_Text_Print(char const *text, unsigned x, unsigned y, unsigned fore, unsigned back, TextPrintType flag, ...)
|
||||
{
|
||||
char buffer[512]; // Working staging buffer.
|
||||
va_list arg; // Argument list var.
|
||||
|
||||
/*
|
||||
** If there is a valid text string pointer then build the final string into the
|
||||
** working buffer before sending it to the simple string printing routine.
|
||||
*/
|
||||
if (text) {
|
||||
|
||||
/*
|
||||
** Since vsprintf doesn't know about EMS pointers, be sure to surround this
|
||||
** call with locking code.
|
||||
*/
|
||||
va_start(arg, flag);
|
||||
vsprintf(buffer, text, arg);
|
||||
va_end(arg);
|
||||
|
||||
Simple_Text_Print(buffer, x, y, fore, back, flag);
|
||||
} else {
|
||||
|
||||
/*
|
||||
** Just the flags are desired to be changed, so call the simple print routine with
|
||||
** a NULL text pointer.
|
||||
*/
|
||||
Simple_Text_Print((char const *)0, x, y, fore, back, flag);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Clip_Text_Print -- Prints text with clipping and <TAB> support. *
|
||||
* *
|
||||
* Use this routine to print text that that should be clipped at an arbitrary right margin *
|
||||
* as well as possibly recognizing <TAB> characters. Typical users of this routine would *
|
||||
* be list boxes. *
|
||||
* *
|
||||
* INPUT: text -- Reference to the text to print. *
|
||||
* *
|
||||
* x,y -- Pixel coordinate of the upper left corner of the text position. *
|
||||
* *
|
||||
* fore -- The foreground color to use. *
|
||||
* *
|
||||
* back -- The background color to use. *
|
||||
* *
|
||||
* flag -- The text print flags to use. *
|
||||
* *
|
||||
* width -- The maximum pixel width to draw the text. Extra characters beyond this *
|
||||
* point will not be printed. *
|
||||
* *
|
||||
* tabs -- Optional pointer to a series of pixel tabstop positions. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void Conquer_Clip_Text_Print(char const *text, unsigned x, unsigned y, unsigned fore, unsigned back, TextPrintType flag, unsigned width, int const * tabs)
|
||||
{
|
||||
char buffer[512];
|
||||
|
||||
if (text) {
|
||||
strcpy(buffer, text);
|
||||
|
||||
/*
|
||||
** Set the font and spacing characteristics according to the flag
|
||||
** value passed in.
|
||||
*/
|
||||
Simple_Text_Print(TXT_NONE, 0, 0, TBLACK, TBLACK, flag);
|
||||
|
||||
char * source = &buffer[0];
|
||||
unsigned offset = 0;
|
||||
int processing = true;
|
||||
while (processing && offset < width) {
|
||||
char * ptr = strchr(source, '\t');
|
||||
|
||||
/*
|
||||
** Zap the tab character. It will be processed later.
|
||||
*/
|
||||
if (ptr) {
|
||||
*ptr = '\0';
|
||||
}
|
||||
|
||||
if (*source) {
|
||||
|
||||
/*
|
||||
** Scan forward until the end of the string is reached or the
|
||||
** maximum width, whichever comes first.
|
||||
*/
|
||||
int w = 0;
|
||||
char * bptr = source;
|
||||
do {
|
||||
w += Char_Pixel_Width(*bptr++);
|
||||
} while(*bptr && offset+w < width);
|
||||
|
||||
/*
|
||||
** If the maximum width has been exceeded, then remove the last
|
||||
** character and signal that further processing is not necessary.
|
||||
*/
|
||||
if (offset+w >= width) {
|
||||
bptr--;
|
||||
w -= Char_Pixel_Width(*bptr);
|
||||
*bptr = '\0';
|
||||
processing = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** Print this text block and advance the offset accordingly.
|
||||
*/
|
||||
Simple_Text_Print(source, x+offset, y, fore, back, flag);
|
||||
offset += w;
|
||||
}
|
||||
|
||||
/*
|
||||
** If a <TAB> was the terminator for this text block, then advance
|
||||
** to the next tabstop.
|
||||
*/
|
||||
if (ptr) {
|
||||
if (tabs) {
|
||||
while (offset > *tabs) {
|
||||
tabs++;
|
||||
}
|
||||
offset = *tabs;
|
||||
} else {
|
||||
offset = ((offset+1 / 50) + 1) * 50;
|
||||
}
|
||||
source = ptr+1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
3753
DISPLAY.CPP
Normal file
3753
DISPLAY.CPP
Normal file
File diff suppressed because it is too large
Load diff
320
DISPLAY.H
Normal file
320
DISPLAY.H
Normal file
|
@ -0,0 +1,320 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\display.h_v 2.15 16 Oct 1995 16:47:42 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DISPLAY.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : May 1, 1994 *
|
||||
* *
|
||||
* Last Update : May 1, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef DISPLAY_H
|
||||
#define DISPLAY_H
|
||||
|
||||
#include "map.h"
|
||||
#include "layer.h"
|
||||
|
||||
|
||||
#define ICON_PIXEL_W 24
|
||||
#define ICON_PIXEL_H 24
|
||||
#define ICON_LEPTON_W 256
|
||||
#define ICON_LEPTON_H 256
|
||||
#define CELL_PIXEL_W ICON_PIXEL_W
|
||||
#define CELL_PIXEL_H ICON_PIXEL_H
|
||||
#define CELL_LEPTON_W ICON_LEPTON_W
|
||||
#define CELL_LEPTON_H ICON_LEPTON_H
|
||||
|
||||
// -----------------------------------------------------------
|
||||
#define PIXEL_LEPTON_W (ICON_LEPTON_W/ICON_PIXEL_W)
|
||||
#define PIXEL_LEPTON_H (ICON_LEPTON_H/ICON_PIXEL_H)
|
||||
|
||||
|
||||
extern COORDINATE Coord_Add(COORDINATE coord1, COORDINATE coord2);
|
||||
|
||||
class DisplayClass: public MapClass
|
||||
{
|
||||
public:
|
||||
|
||||
/*
|
||||
** This indicates the theater that the display is to represent.
|
||||
*/
|
||||
TheaterType Theater;
|
||||
|
||||
/*
|
||||
** The tactical map display position is indicated by the cell of the
|
||||
** upper left hand corner. These should not be altered directly. Use
|
||||
** the Set_Tactical_Position function instead.
|
||||
*/
|
||||
COORDINATE TacticalCoord;
|
||||
|
||||
/*
|
||||
** The dimensions (in cells) of the visible window onto the game map. This tactical
|
||||
** map is how the player interacts and views the game world.
|
||||
*/
|
||||
int TacLeptonWidth;
|
||||
int TacLeptonHeight;
|
||||
|
||||
/*
|
||||
** These layer control elements are used to group the displayable objects
|
||||
** so that proper overlap can be obtained.
|
||||
*/
|
||||
static LayerClass Layer[LAYER_COUNT];
|
||||
|
||||
/*
|
||||
** This records the position and shape of a placement cursor to display
|
||||
** over the map. This cursor is used when placing buildings and also used
|
||||
** extensively by the scenario editor.
|
||||
*/
|
||||
CELL ZoneCell;
|
||||
short ZoneOffset;
|
||||
short const *CursorSize;
|
||||
bool ProximityCheck; // Is proximity check ok?
|
||||
|
||||
/*
|
||||
** This holds the building type that is about to be placed upon the map.
|
||||
** It is only valid during the building placement state. The PendingLegal
|
||||
** flag is updated as the cursor moves and it reflects the legality of
|
||||
** placing the building at the desired location.
|
||||
*/
|
||||
ObjectClass * PendingObjectPtr;
|
||||
ObjectTypeClass const * PendingObject;
|
||||
HousesType PendingHouse;
|
||||
|
||||
static unsigned char FadingBrighten[256];
|
||||
static unsigned char FadingShade[256];
|
||||
static unsigned char FadingLight[256];
|
||||
static unsigned char RemapTables[HOUSE_COUNT][3][256];
|
||||
static unsigned char FadingGreen[256];
|
||||
static unsigned char FadingYellow[256];
|
||||
static unsigned char FadingRed[256];
|
||||
static unsigned char TranslucentTable[(MAGIC_COL_COUNT+1)*256];
|
||||
static unsigned char WhiteTranslucentTable[(1+1)*256];
|
||||
static unsigned char MouseTranslucentTable[(4+1)*256];
|
||||
static void const *TransIconset;
|
||||
static unsigned char UnitShadow[(USHADOW_COL_COUNT+1)*256];
|
||||
static unsigned char SpecialGhost[2*256];
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
DisplayClass(void);
|
||||
|
||||
virtual void Read_INI(char *buffer);
|
||||
void Write_INI(char *buffer);
|
||||
|
||||
/*
|
||||
** Initialization
|
||||
*/
|
||||
virtual void One_Time(void); // One-time inits
|
||||
virtual void Init_Clear(void); // Clears all to known state
|
||||
virtual void Init_IO(void); // Inits button list
|
||||
virtual void Init_Theater(TheaterType theater); // Theater-specific inits
|
||||
|
||||
/*
|
||||
** General display/map/interface support functionality.
|
||||
*/
|
||||
virtual void AI(KeyNumType &input, int x, int y);
|
||||
virtual void Draw_It(bool complete=false);
|
||||
|
||||
/*
|
||||
** Added functionality.
|
||||
*/
|
||||
void Center_Map(void);
|
||||
virtual bool Map_Cell(CELL cell, HouseClass *house);
|
||||
virtual CELL Click_Cell_Calc(int x, int y);
|
||||
virtual void Help_Text(int , int =-1, int =-1, int =YELLOW, bool =false, int =0) {};
|
||||
virtual MouseType Get_Mouse_Shape(void) const = 0;
|
||||
virtual bool Scroll_Map(DirType facing, int & distance, bool really);
|
||||
virtual void Refresh_Cells(CELL cell, short const *list);
|
||||
virtual void Set_View_Dimensions(int x, int y, int width=-1, int height=-1);
|
||||
|
||||
/*
|
||||
** Pending object placement control.
|
||||
*/
|
||||
virtual void Put_Place_Back(TechnoClass * ) {}; // Affects 'pending' system.
|
||||
void Cursor_Mark(CELL pos, bool on);
|
||||
void Set_Cursor_Shape(short const * list);
|
||||
CELL Set_Cursor_Pos(CELL pos = -1);
|
||||
void Get_Occupy_Dimensions(int & w, int & h, short const *list);
|
||||
|
||||
/*
|
||||
** Tactical map only functionality.
|
||||
*/
|
||||
virtual void Set_Tactical_Position(COORDINATE coord);
|
||||
void Refresh_Band(void);
|
||||
void Select_These(COORDINATE coord1, COORDINATE coord2);
|
||||
COORDINATE Pixel_To_Coord(int x, int y);
|
||||
bool Coord_To_Pixel(COORDINATE coord, int &x, int &y);
|
||||
bool Push_Onto_TacMap(COORDINATE &source, COORDINATE &dest);
|
||||
void Remove(ObjectClass const *object, LayerType layer);
|
||||
void Submit(ObjectClass const *object, LayerType layer);
|
||||
CELL Calculated_Cell(SourceType dir, HousesType house);
|
||||
bool In_View(register CELL cell);
|
||||
bool Passes_Proximity_Check(ObjectTypeClass const *object);
|
||||
ObjectClass * Cell_Object(CELL cell, int x=0, int y=0);
|
||||
ObjectClass * Next_Object(ObjectClass * object);
|
||||
ObjectClass * Prev_Object(ObjectClass * object);
|
||||
int Cell_Shadow(CELL cell);
|
||||
short const * Text_Overlap_List(char const * text, int x, int y, int lines = 1);
|
||||
bool Is_Spot_Free(COORDINATE coord) const;
|
||||
COORDINATE Closest_Free_Spot(COORDINATE coord, bool any=false) const;
|
||||
void Sell_Mode_Control(int control);
|
||||
void Repair_Mode_Control(int control);
|
||||
|
||||
void Flag_Cell(CELL cell) {
|
||||
Flag_To_Redraw(false);
|
||||
IsToRedraw = true;
|
||||
CellRedraw[cell] = true;
|
||||
};
|
||||
bool Is_Cell_Flagged(CELL cell) const {return CellRedraw.Is_True(cell);};
|
||||
|
||||
/*
|
||||
** Computes starting position based on player's units' Coords.
|
||||
*/
|
||||
void Compute_Start_Pos(void);
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
virtual void Code_Pointers(void);
|
||||
virtual void Decode_Pointers(void);
|
||||
|
||||
protected:
|
||||
virtual void Mouse_Right_Press(void);
|
||||
virtual void Mouse_Left_Press(int x, int y);
|
||||
virtual void Mouse_Left_Up(bool shadow, ObjectClass * object, ActionType action, bool wwsmall = false);
|
||||
virtual void Mouse_Left_Held(int x, int y);
|
||||
virtual void Mouse_Left_Release(CELL cell, int x, int y, ObjectClass * object, ActionType action, bool wwsmall = false);
|
||||
|
||||
public:
|
||||
/*
|
||||
** This is the pixel offset for the upper left corner of the tactical map.
|
||||
*/
|
||||
int TacPixelX;
|
||||
int TacPixelY;
|
||||
|
||||
/*
|
||||
** This is the coordinate that the tactical map should be in at next available opportunity.
|
||||
*/
|
||||
COORDINATE DesiredTacticalCoord;
|
||||
|
||||
/*
|
||||
** If something in the tactical map is to be redrawn, this flag is set to true.
|
||||
*/
|
||||
unsigned IsToRedraw:1;
|
||||
|
||||
/*
|
||||
** If the player is currently wielding a wrench (to select buildings for repair),
|
||||
** then this flag is true. In such a state, normal movement and combat orders
|
||||
** are preempted.
|
||||
*/
|
||||
unsigned IsRepairMode:1;
|
||||
|
||||
/*
|
||||
** If the player is currently in "sell back" mode, then this flag will be
|
||||
** true. While in this mode, anything clicked on will be sold back to the
|
||||
** "factory".
|
||||
*/
|
||||
unsigned IsSellMode:1;
|
||||
|
||||
/*
|
||||
** If the player is currently in ion cannon targetting mode, then this
|
||||
** flag will be true. While in this mode, anything clicked on will be
|
||||
** be destroyed by the ION cannon.
|
||||
*/
|
||||
unsigned IsTargettingMode:2;
|
||||
|
||||
protected:
|
||||
|
||||
/*
|
||||
** If it is currently in rubber band mode (multi unit selection), then this
|
||||
** flag will be true. While in such a mode, normal input is prempted while
|
||||
** the extended selection is in progress.
|
||||
*/
|
||||
unsigned IsRubberBand:1;
|
||||
|
||||
/*
|
||||
** The moment the mouse is held down, this flag gets set. If the mouse is dragged
|
||||
** a sufficient distance while held down, then true rubber band mode selection
|
||||
** can begin. Using a minimum distance prevents accidental rubber band selection
|
||||
** mode from being initiated.
|
||||
*/
|
||||
unsigned IsTentative:1;
|
||||
|
||||
/*
|
||||
** This gadget class is used for capturing input to the tactical map. All mouse input
|
||||
** will be routed through this gadget.
|
||||
*/
|
||||
class TacticalClass : public GadgetClass {
|
||||
public:
|
||||
TacticalClass(void) : GadgetClass(0,0,0,0,LEFTPRESS|LEFTRELEASE|LEFTHELD|LEFTUP|RIGHTPRESS,true) {};
|
||||
|
||||
protected:
|
||||
virtual int Action(unsigned flags, KeyNumType & key);
|
||||
};
|
||||
friend class TacticalClass;
|
||||
|
||||
/*
|
||||
** This is the "button" that tracks all input to the tactical map.
|
||||
** It must be available to derived classes, for Save/Load purposes.
|
||||
*/
|
||||
static TacticalClass TacButton;
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
** This is a utility flag that is set during the icon draw process only if there
|
||||
** was at least one shadow icon detected that should be redrawn. When the shadow
|
||||
** drawing logic is to take place, but this flag is false, then the shadow drawing
|
||||
** will be skipped since it would perform no function.
|
||||
*/
|
||||
unsigned IsShadowPresent:1;
|
||||
|
||||
/*
|
||||
** Rubber band mode consists of stretching a box from the anchor point (specified
|
||||
** here) to the current cursor position.
|
||||
*/
|
||||
int BandX,BandY;
|
||||
int NewX,NewY;
|
||||
|
||||
static void const *ShadowShapes;
|
||||
static unsigned char ShadowTrans[(SHADOW_COL_COUNT+1)*256];
|
||||
|
||||
void Redraw_Icons(int draw_flags=0);
|
||||
void Redraw_Shadow(void);
|
||||
void Redraw_Shadow_Rects(void);
|
||||
|
||||
/*
|
||||
** This bit array is used to flag cells to be redrawn. If the icon needs to
|
||||
** be redrawn for a cell, then the corresponding flag will be true.
|
||||
*/
|
||||
static BooleanVectorClass CellRedraw;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
202
DOOR.CPP
Normal file
202
DOOR.CPP
Normal file
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\door.cpv 1.4 16 Oct 1995 16:49:16 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DOOR.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 06/11/95 *
|
||||
* *
|
||||
* Last Update : June 14, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* DoorClass::AI -- Handles the door processing logic. *
|
||||
* DoorClass::Close_Door -- Try to close the unit's door. *
|
||||
* DoorClass::DoorClass -- Constructor for the DoorClass object. *
|
||||
* DoorClass::Door_Stage -- Fetches the current door animation frame. *
|
||||
* DoorClass::Open_Door -- Opens the door for this unit. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DoorClass::DoorClass -- Constructor for the DoorClass object. *
|
||||
* *
|
||||
* This constructor sets the door to an initial closed state. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/14/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
DoorClass::DoorClass(void)
|
||||
{
|
||||
State = IS_CLOSED;
|
||||
IsToRedraw = false;
|
||||
Stages = 0;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DoorClass::AI -- Handles the door processing logic. *
|
||||
* *
|
||||
* This routine should be called every game frame. It handles the door closing and opening *
|
||||
* logic. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/13/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void DoorClass::AI(void)
|
||||
{
|
||||
if (Control.Graphic_Logic()) {
|
||||
if (Control.Fetch_Stage() >= Stages) {
|
||||
Control.Set_Rate(0);
|
||||
switch (State) {
|
||||
case IS_OPENING:
|
||||
State = IS_OPEN;
|
||||
break;
|
||||
|
||||
case IS_CLOSING:
|
||||
State = IS_CLOSED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
IsToRedraw = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DoorClass::Open_Door -- Opens the door for this unit. *
|
||||
* *
|
||||
* This routine will perform the door open operation for this unit. It will control vehicle *
|
||||
* rotation if necessary. *
|
||||
* *
|
||||
* INPUT: rate -- The animation rate (delay) to use for the door animation logic. *
|
||||
* *
|
||||
* stages -- The number of animations stages that this door must pass through. *
|
||||
* *
|
||||
* OUTPUT: Was action initiated to open the door? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/08/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool DoorClass::Open_Door(int rate, int stages)
|
||||
{
|
||||
switch (State) {
|
||||
case IS_CLOSED:
|
||||
case IS_CLOSING:
|
||||
State = IS_OPENING;
|
||||
Stages = stages-1;
|
||||
Control.Set_Stage(0);
|
||||
Control.Set_Rate(rate);
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DoorClass::Close_Door -- Try to close the unit's door. *
|
||||
* *
|
||||
* This routine will attempt to close the unit's door. If the door is already closed or *
|
||||
* in the process of closing, then no action is performed. *
|
||||
* *
|
||||
* INPUT: rate -- The animation rate (delay) to use for the door animation logic. *
|
||||
* *
|
||||
* stages -- The number of animations stages that this door must pass through. *
|
||||
* *
|
||||
* OUTPUT: Action was initiated to close the door? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/08/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool DoorClass::Close_Door(int rate, int stages)
|
||||
{
|
||||
switch (State) {
|
||||
case IS_OPEN:
|
||||
case IS_OPENING:
|
||||
State = IS_CLOSING;
|
||||
Stages = stages-1;
|
||||
Control.Set_Stage(0);
|
||||
Control.Set_Rate(rate);
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* DoorClass::Door_Stage -- Fetches the current door animation frame. *
|
||||
* *
|
||||
* Use this routine to fetch the current door animation frame number. Frame zero is the *
|
||||
* closed frame and frame 'N' is the open frame. If the door is in the process of opening *
|
||||
* or closing, the appropriate frame number is used. 'N' is defined as the number of *
|
||||
* stages in the animation minus 1 (e.g., a four frame animation will return a door stage *
|
||||
* number between 0 and 3, inclusive). *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with the door animation frame number. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/14/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int DoorClass::Door_Stage(void) const
|
||||
{
|
||||
switch (State) {
|
||||
case IS_CLOSING:
|
||||
return((Stages-1) - Control.Fetch_Stage());
|
||||
|
||||
case IS_CLOSED:
|
||||
return(0);
|
||||
|
||||
case IS_OPENING:
|
||||
return(Control.Fetch_Stage());
|
||||
|
||||
case IS_OPEN:
|
||||
return(Stages-1);
|
||||
}
|
||||
return(0);
|
||||
}
|
94
DOOR.H
Normal file
94
DOOR.H
Normal file
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\door.h_v 1.8 16 Oct 1995 16:47:54 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DOOR.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 06/11/95 *
|
||||
* *
|
||||
* Last Update : June 11, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef DOOR_H
|
||||
#define DOOR_H
|
||||
|
||||
class DoorClass
|
||||
{
|
||||
private:
|
||||
|
||||
/*
|
||||
** This is the animation control handler.
|
||||
*/
|
||||
StageClass Control;
|
||||
|
||||
/*
|
||||
** This is the recorded number of stages of the current
|
||||
** door animation process.
|
||||
*/
|
||||
unsigned char Stages;
|
||||
|
||||
/*
|
||||
** This is the door state.
|
||||
*/
|
||||
enum {
|
||||
IS_CLOSED, // Door is closed.
|
||||
IS_OPENING, // Door is in the process of opening.
|
||||
IS_OPEN, // Door is fully open.
|
||||
IS_CLOSING // Door is in the process of closing.
|
||||
} State;
|
||||
|
||||
/*
|
||||
** If the animation for this door indicates that the object it is
|
||||
** attached to should be redrawn, then this flag will be true.
|
||||
*/
|
||||
unsigned IsToRedraw:1;
|
||||
|
||||
public:
|
||||
DoorClass(void);
|
||||
|
||||
bool Time_To_Redraw(void) {return(IsToRedraw);};
|
||||
void Clear_Redraw_Flag(void) {IsToRedraw = false;};
|
||||
void AI(void);
|
||||
int Door_Stage(void) const;
|
||||
bool Is_Door_Opening(void) {return(State == IS_OPENING);};
|
||||
bool Is_Door_Closing(void) {return(State == IS_CLOSING);};
|
||||
bool Open_Door(int rate, int stages);
|
||||
bool Close_Door(int rate, int stages);
|
||||
bool Is_Door_Open(void) {return(State == IS_OPEN);};
|
||||
bool Is_Door_Closed(void) {return(State == IS_CLOSED);};
|
||||
bool Is_Ready_To_Open(void);
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
void Code_Pointers(void) { return; }
|
||||
void Decode_Pointers(void) { return; }
|
||||
};
|
||||
|
||||
#endif
|
169
DPMI.CPP
Normal file
169
DPMI.CPP
Normal file
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\dpmi.cpv 2.17 16 Oct 1995 16:49:36 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DPMI.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : July 2, 1994 *
|
||||
* *
|
||||
* Last Update : July 2, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifdef __FLAT__
|
||||
#pragma inline
|
||||
#endif
|
||||
|
||||
#include "function.h"
|
||||
#include "dpmi.h"
|
||||
|
||||
#ifndef __FLAT__
|
||||
|
||||
void DOSSegmentClass::Swap(DOSSegmentClass &src, int soffset, DOSSegmentClass &dest, int doffset, int size)
|
||||
{
|
||||
if (!size) return;
|
||||
|
||||
unsigned short ssel = src.Selector;
|
||||
unsigned short dsel = dest.Selector;
|
||||
|
||||
asm {
|
||||
push es
|
||||
push ds
|
||||
|
||||
mov si,soffset
|
||||
mov di,doffset
|
||||
mov cx,size
|
||||
mov ax,ssel
|
||||
mov dx,dsel
|
||||
mov ds,ax
|
||||
mov es,dx
|
||||
}
|
||||
again:
|
||||
asm {
|
||||
mov al,ds:[si]
|
||||
mov ah,es:[di]
|
||||
mov ds:[si],ah
|
||||
mov es:[di],al
|
||||
inc di
|
||||
inc si
|
||||
dec cx
|
||||
jnz again
|
||||
|
||||
pop ds
|
||||
pop es
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void DOSSegmentClass::Swap(DOSSegmentClass &src, int soffset, DOSSegmentClass &dest, int doffset, int size)
|
||||
{
|
||||
extern void dss_swap(char *src, char *dest, int size);
|
||||
|
||||
#pragma aux dss_swap = \
|
||||
"again: mov al,[esi]" \
|
||||
"mov ah,[edi]" \
|
||||
"mov [esi],ah" \
|
||||
"stosb" \
|
||||
"inc esi" \
|
||||
"loop again" \
|
||||
parm [esi] [edi] [ecx] \
|
||||
modify [ax];
|
||||
|
||||
if (!size) return;
|
||||
dss_swap((char *)(src.Selector + soffset), (char *)(dest.Selector + doffset), size);
|
||||
}
|
||||
|
||||
#ifdef OBSOLETE
|
||||
void DOSSegmentClass::Copy(DOSSegmentClass &src, int soffset, DOSSegmentClass &dest, int doffset, int size)
|
||||
{
|
||||
extern void dss_copy(char *src, char *dest, int size);
|
||||
#pragma aux dss_copy = \
|
||||
"mov ebx,ecx" \
|
||||
"shr ecx,2" \
|
||||
"jecxz copskip1" \
|
||||
"rep movsd" \
|
||||
"copskip1: mov ecx,ebx" \
|
||||
"and ecx,3" \
|
||||
"jecxz copskip2" \
|
||||
"rep movsb" \
|
||||
"copskip2:" \
|
||||
parm [esi edi ecx] \
|
||||
modify [ebx];
|
||||
|
||||
if (!size) return;
|
||||
dss_copy((char *)(src.Selector + soffset), (char *)(dest.Selector + doffset), size);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OBSOLETE
|
||||
void DOSSegmentClass::Copy_To(void *source, int dest, int size)
|
||||
{
|
||||
extern void dss_copy_to(void *src, (void *)dest, int size);
|
||||
|
||||
#pragma aux dss_copy_to = \
|
||||
"mov ebx,ecx" \
|
||||
"shr ecx,2" \
|
||||
"jecxz cop2skip1" \
|
||||
"rep movsd" \
|
||||
"cop2skip1: mov ecx,ebx" \
|
||||
"and ecx,3" \
|
||||
"jecxz cop2skip2" \
|
||||
"rep movsb" \
|
||||
"cop2skip2:" \
|
||||
parm [esi edi ecx] \
|
||||
modify [ebx];
|
||||
|
||||
if (!size) return;
|
||||
dss_copy_to(src, (void *)(Selector + dest), size);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OBSOLETE
|
||||
void DOSSegmentClass::Copy_From(void *dest, int source, int size)
|
||||
{
|
||||
extern void dss_copy_from(void *dest, (void *)source, int size);
|
||||
|
||||
#pragma aux dss_copy_from = \
|
||||
"mov ebx,ecx" \
|
||||
"shr ecx,2" \
|
||||
"jecxz copfskip1" \
|
||||
"rep movsd" \
|
||||
"copfskip1: mov ecx,ebx" \
|
||||
"and ecx,3" \
|
||||
"jecxz copfskip2" \
|
||||
"rep movsb" \
|
||||
"copfskip2:" \
|
||||
parm [edi esi ecx] \
|
||||
modify [ebx];
|
||||
|
||||
if (!size) return;
|
||||
dss_copy_from(dest, (void *)(Selector + source), size);
|
||||
}
|
||||
#endif
|
175
DPMI.H
Normal file
175
DPMI.H
Normal file
|
@ -0,0 +1,175 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\dpmi.h_v 2.17 16 Oct 1995 16:44:52 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DPMI.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : July 2, 1994 *
|
||||
* *
|
||||
* Last Update : July 2, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef DPMI_H
|
||||
#define DPMI_H
|
||||
#include <dos.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <mem.h>
|
||||
|
||||
|
||||
extern void output(short port, short data);
|
||||
|
||||
|
||||
class DOSSegmentClass {
|
||||
/*
|
||||
** This is the selector/segment value. In real mode it is the segment, in protected
|
||||
** mode it is the selector (also 16 bits). This value is moved into DS or ES when
|
||||
** accessing memory.
|
||||
** Note: in Watcom flat addressing, Selector == Segment<<4 (ex: 0A0000h)
|
||||
*/
|
||||
unsigned int Selector;
|
||||
|
||||
/*
|
||||
** These are C equivalents for pushing and popping the DS segment register. By using
|
||||
** these, it is possible to create very small code that uses a segment and
|
||||
** offset without damaging the DS register. These are especially useful in protected
|
||||
** mode, but they are legal in real mode as well.
|
||||
*/
|
||||
void Push_DS(void) {/*__emit__(0x1E);*/};
|
||||
void Pop_DS(void) {/*__emit__(0x1F);*/};
|
||||
|
||||
public:
|
||||
DOSSegmentClass(void);
|
||||
~DOSSegmentClass(void);
|
||||
DOSSegmentClass(unsigned short segment, long size=(1024L*64L));
|
||||
|
||||
unsigned int Get_Selector(void);
|
||||
|
||||
/*
|
||||
** This routine is used to assign where the descriptor actually points to in
|
||||
** low DOS memory. In real mode, this is a simple segment assignment and the size
|
||||
** is always 64K regardless of what is specified. In protected mode, the segment
|
||||
** is used to update the selector and the size can be any length.
|
||||
** In Watcom flat mode, it sets Selector == segment<<4
|
||||
*/
|
||||
void Assign(unsigned short segment, long size=(1024L*64L));
|
||||
|
||||
/*
|
||||
** These routines will move the data to/from regular memory and the segment/descriptor
|
||||
** memory.
|
||||
*/
|
||||
void Copy_To(void *source, int dest, int size);
|
||||
void Copy_From(void *dest, int source, int size);
|
||||
void Copy_Word_To(short data, int dest);
|
||||
void Copy_Byte_To(char data, int dest);
|
||||
void Copy_DWord_To(long data, int dest);
|
||||
short Copy_Word_From(int source);
|
||||
char Copy_Byte_From(int source);
|
||||
long Copy_DWord_From(int source);
|
||||
|
||||
/*
|
||||
** These routines move data around between sections of segmented (descriptor) memory.
|
||||
** Typically, this is used when accessing DOS memory in protected mode or when dealing
|
||||
** with hard memory areas such as the screen.
|
||||
*/
|
||||
static void Copy(DOSSegmentClass &src, int soffset, DOSSegmentClass &dest, int doffset, int size);
|
||||
static void Swap(DOSSegmentClass &src, int soffset, DOSSegmentClass &dest, int doffset, int size);
|
||||
};
|
||||
|
||||
|
||||
inline DOSSegmentClass::DOSSegmentClass(void)
|
||||
{
|
||||
Selector = 0xB0000;
|
||||
}
|
||||
|
||||
inline DOSSegmentClass::~DOSSegmentClass(void)
|
||||
{
|
||||
}
|
||||
|
||||
inline void DOSSegmentClass::Copy_Word_To(short data, int dest)
|
||||
{
|
||||
*(short *)(Selector+dest) = data;
|
||||
}
|
||||
|
||||
inline void DOSSegmentClass::Copy_Byte_To(char data, int dest)
|
||||
{
|
||||
*(char *)(Selector+dest) = data;
|
||||
}
|
||||
|
||||
inline void DOSSegmentClass::Copy_DWord_To(long data, int dest)
|
||||
{
|
||||
*(long *)(Selector+dest) = data;
|
||||
}
|
||||
|
||||
inline DOSSegmentClass::DOSSegmentClass(unsigned short segment, long)
|
||||
{
|
||||
Assign(segment);
|
||||
}
|
||||
|
||||
inline void DOSSegmentClass::Assign(unsigned short segment, long)
|
||||
{
|
||||
Selector = (long)(segment)<<4L;
|
||||
}
|
||||
|
||||
inline void DOSSegmentClass::Copy_To(void *source, int dest, int size)
|
||||
{
|
||||
memmove((void*)(Selector+dest), source, size);
|
||||
}
|
||||
|
||||
inline void DOSSegmentClass::Copy_From(void *dest, int source, int size)
|
||||
{
|
||||
memmove(dest, (void*)(Selector+source), size);
|
||||
}
|
||||
|
||||
inline void DOSSegmentClass::Copy(DOSSegmentClass &src, int soffset, DOSSegmentClass &dest, int doffset, int size) {
|
||||
memmove((void*)(dest.Selector+doffset), (void*)(src.Selector+soffset), size);
|
||||
}
|
||||
|
||||
inline short DOSSegmentClass::Copy_Word_From(int source)
|
||||
{
|
||||
return *(short*)(Selector+source);
|
||||
}
|
||||
|
||||
inline char DOSSegmentClass::Copy_Byte_From(int source)
|
||||
{
|
||||
return *(char*)(Selector+source);
|
||||
}
|
||||
|
||||
inline long DOSSegmentClass::Copy_DWord_From(int source)
|
||||
{
|
||||
return *(long*)(Selector+source);
|
||||
}
|
||||
|
||||
inline unsigned int DOSSegmentClass::Get_Selector(void)
|
||||
{
|
||||
return Selector;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
215
DRIVE.H
Normal file
215
DRIVE.H
Normal file
|
@ -0,0 +1,215 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\drive.h_v 2.19 16 Oct 1995 16:47:44 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : DRIVE.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : April 14, 1994 *
|
||||
* *
|
||||
* Last Update : April 14, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef DRIVE_H
|
||||
#define DRIVE_H
|
||||
|
||||
#include "foot.h"
|
||||
|
||||
/****************************************************************************
|
||||
** Movable objects are handled by this class definition. Moveable objects
|
||||
** cover everything except buildings.
|
||||
*/
|
||||
class DriveClass : public FootClass
|
||||
{
|
||||
public:
|
||||
/*
|
||||
** This points to the static control data that gives 'this' unit its characteristics.
|
||||
*/
|
||||
UnitTypeClass const * const Class;
|
||||
|
||||
/*
|
||||
** This records the number of "loads" of Tiberium the unit is carrying. Only
|
||||
** harvesters use this field.
|
||||
*/
|
||||
unsigned char Tiberium;
|
||||
|
||||
/*
|
||||
** If this unit performing harvesting action, then this flag is true. The flag
|
||||
** is located here because the other bit flags here give it a free place to
|
||||
** reside.
|
||||
*/
|
||||
unsigned IsHarvesting:1;
|
||||
|
||||
/*
|
||||
** This flags when a transport vehicle could not unload at its designated location
|
||||
** and is heading off the map to try again later. When this flag is true, the
|
||||
** transport unit is allowed to disappear when it reaches the edge of the map.
|
||||
*/
|
||||
unsigned IsReturning:1;
|
||||
|
||||
/*
|
||||
** Some units must have their turret locked down to face their body direction.
|
||||
** When this flag is set, this condition is in effect. This flag is a more
|
||||
** accurate check than examining the TrackNumber since the turret may be
|
||||
** rotating into position so that a pending track may start. During this process
|
||||
** the track number does not indicate anything.
|
||||
*/
|
||||
unsigned IsTurretLockedDown:1;
|
||||
|
||||
/*
|
||||
** This vehicle could be processing a "short track". A short track is one that
|
||||
** doesn't actually go anywhere. Kind of like turning in place.
|
||||
*/
|
||||
unsigned IsOnShortTrack:1;
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Constructors, Destructors, and overloaded operators.
|
||||
*/
|
||||
DriveClass(void);
|
||||
DriveClass(UnitType classid, HousesType house);
|
||||
virtual ~DriveClass(void) {};
|
||||
operator UnitType(void) const {return Class->Type;};
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Member function prototypes.
|
||||
*/
|
||||
virtual int Offload_Tiberium_Bail(void);
|
||||
void Do_Turn(DirType dir);
|
||||
virtual void Approach_Target(void);
|
||||
virtual ObjectTypeClass const & Class_Of(void) const;
|
||||
virtual void Overrun_Square(CELL cell, bool threaten=true);
|
||||
virtual void Assign_Destination(TARGET target);
|
||||
virtual void Per_Cell_Process(bool center);
|
||||
virtual bool Ok_To_Move(DirType ) const;
|
||||
virtual void AI(void);
|
||||
#ifdef CHEAT_KEYS
|
||||
virtual void Debug_Dump(MonoClass *mono) const;
|
||||
#endif
|
||||
void Force_Track(int track, COORDINATE coord);
|
||||
virtual int Tiberium_Load(void) const;
|
||||
|
||||
void Exit_Map(void);
|
||||
void Mark_Track(COORDINATE headto, MarkType type);
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
virtual void Code_Pointers(void);
|
||||
virtual void Decode_Pointers(void);
|
||||
|
||||
/**********************************************************************
|
||||
** These enumerations are used as working constants that exist only
|
||||
** in the DriveClass namespace.
|
||||
*/
|
||||
enum DriveClassEnum {
|
||||
BACKUP_INTO_REFINERY=64, // Track to backup into refinery.
|
||||
OUT_OF_REFINERY, // Track to leave refinery.
|
||||
OUT_OF_WEAPON_FACTORY // Track to leave weapons factory.
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
/****************************************************************************
|
||||
** Smooth turning tracks are controlled by this structure and these
|
||||
** processing bits.
|
||||
*/
|
||||
typedef enum TrackControlType {
|
||||
F_=0x00, // No translation necessary?
|
||||
F_T=0x01, // Transpose X and Y components?
|
||||
F_X=0x02, // Reverse X component sign?
|
||||
F_Y=0x04, // Reverse Y component sign?
|
||||
F_D=0x08 // Two cell consumption?
|
||||
} TrackControlType;
|
||||
//#define F_S 0x10 // Is this a 90 degree turn?
|
||||
|
||||
typedef struct {
|
||||
char Track; // Which track to use.
|
||||
char StartTrack; // Track when starting from stand-still.
|
||||
DirType Facing; // Facing when track has been completed.
|
||||
DriveClass::TrackControlType Flag; // List processing flag bits.
|
||||
} TurnTrackType;
|
||||
|
||||
typedef struct {
|
||||
COORDINATE Offset; // Offset to origin coordinate.
|
||||
DirType Facing; // Facing (primary track).
|
||||
} TrackType;
|
||||
|
||||
typedef struct {
|
||||
DriveClass::TrackType const * Track; // Pointer to track list.
|
||||
int Jump; // Index where track jumping is allowed.
|
||||
int Entry; // Entry point if jumping to this track.
|
||||
int Cell; // Per cell process should occur at this index.
|
||||
} RawTrackType;
|
||||
|
||||
/*
|
||||
** These speed values are used to accumulate movement and then
|
||||
** convert them into pixel "steps" that are then translated through
|
||||
** the currently running track so that the unit will move.
|
||||
*/
|
||||
unsigned char SpeedAccum;
|
||||
|
||||
/*
|
||||
** This the track control logic (used for ground vehicles only). The 'Track'
|
||||
** variable holds the track being followed (0 == not following track). The
|
||||
** 'TrackIndex' variable holds the current index into the specified track
|
||||
** (starts at 0).
|
||||
*/
|
||||
char TrackNumber;
|
||||
char TrackIndex;
|
||||
|
||||
/*---------------------------------------------------------------------
|
||||
** Member function prototypes.
|
||||
*/
|
||||
virtual void Fixup_Path(PathType *path);
|
||||
bool While_Moving(void);
|
||||
bool Start_Of_Move(void);
|
||||
void Lay_Track(void);
|
||||
COORDINATE Smooth_Turn(COORDINATE adj, DirType *dir);
|
||||
|
||||
static TurnTrackType const TrackControl[67];
|
||||
static RawTrackType const RawTracks[13];
|
||||
static TrackType const Track13[];
|
||||
static TrackType const Track12[];
|
||||
static TrackType const Track11[];
|
||||
static TrackType const Track10[];
|
||||
static TrackType const Track9[];
|
||||
static TrackType const Track8[];
|
||||
static TrackType const Track7[];
|
||||
static TrackType const Track6[];
|
||||
static TrackType const Track5[];
|
||||
static TrackType const Track4[];
|
||||
static TrackType const Track3[];
|
||||
static TrackType const Track2[];
|
||||
static TrackType const Track1[24];
|
||||
};
|
||||
|
||||
inline DriveClass::TrackControlType operator |(DriveClass::TrackControlType, DriveClass::TrackControlType);
|
||||
inline DriveClass::TrackControlType operator &(DriveClass::TrackControlType, DriveClass::TrackControlType);
|
||||
inline DriveClass::TrackControlType operator ~(DriveClass::TrackControlType);
|
||||
|
||||
|
||||
#endif
|
471
EDIT.CPP
Normal file
471
EDIT.CPP
Normal file
|
@ -0,0 +1,471 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\edit.cpv 2.18 16 Oct 1995 16:48:16 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : EDIT.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic, Maria del Mar McCready Legg *
|
||||
* *
|
||||
* Start Date : 01/15/95 *
|
||||
* *
|
||||
* Last Update : June 25, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* EditClass::Action -- Handles input events. *
|
||||
* EditClass::Draw_Background -- Draw the background to the edit gadget. *
|
||||
* EditClass::Draw_Me -- Draws the edit box and embedded text. *
|
||||
* EditClass::Draw_Text -- Draws the edit gadget text. *
|
||||
* EditClass::EditClass -- Normal constructor for edit class object. *
|
||||
* EditClass::Handle_Key -- Handles keyboard input to edit gadget. *
|
||||
* EditClass::Set_Text -- Sets the text to the edit gadget. *
|
||||
* EditClass::~EditClass -- Default destructor for the edit gadget. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::EditClass -- Normal constructor for edit class object. *
|
||||
* *
|
||||
* This is the normal constructor used to create an edit object. *
|
||||
* *
|
||||
* INPUT: id -- The ID number for this edit object. This is the ID number that will be *
|
||||
* returned by the Input() function when the <RETURN> key is pressed if this *
|
||||
* gadget has the keyboard input focus. *
|
||||
* *
|
||||
* text -- Referenct to the text buffer that the edit gadget will modify as keyboard *
|
||||
* input is processed. The value that this buffer contains is the default *
|
||||
* text displayed. *
|
||||
* *
|
||||
* maxlen-- The maximum size of the text buffer specified. This length INCLUDES the *
|
||||
* trailing null character so a simple sizeof() function call can be used. *
|
||||
* *
|
||||
* flags -- These are the text print control flags. It is used to control how the *
|
||||
* text looks in the edit box. Use the normal TPF_??? flags. *
|
||||
* *
|
||||
* x,y -- The pixel coordinates of the upper left corner of the edit gadget area. *
|
||||
* *
|
||||
* w,h -- The pixel dimensions of the edit box. If either of these are no provided, *
|
||||
* or set to -1, then the dimension is determined from the string itself. *
|
||||
* *
|
||||
* sytle -- This style flag parameter control what kind of characters are allowed in *
|
||||
* the edit box. The initial string in the text buffer may contain illegal *
|
||||
* characters, but they are NOT removed regardless of this parameter. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* WARNINGS: none *
|
||||
* HISTORY: *
|
||||
* 01/05/1995 MML : Created. *
|
||||
* 01/21/1995 JLB : Modified. *
|
||||
*=============================================================================================*/
|
||||
EditClass::EditClass(int id, char * text, int max_len, TextPrintType flags, int x, int y, int w, int h, EditStyle style) :
|
||||
ControlClass (id, x, y, w, h, LEFTPRESS), String(text)
|
||||
{
|
||||
TextFlags = flags;
|
||||
EditFlags = style;
|
||||
Color = CC_GREEN;
|
||||
Set_Text(text, max_len);
|
||||
|
||||
if (w == -1 || h == -1) {
|
||||
Fancy_Text_Print(TXT_NONE, 0, 0, TBLACK, TBLACK, TextFlags);
|
||||
|
||||
if (h == -1) {
|
||||
Height = FontHeight+2;
|
||||
}
|
||||
if (w == -1) {
|
||||
if (strlen(String) > 0) {
|
||||
Width = String_Pixel_Width(String) + 6;
|
||||
} else {
|
||||
Width = ((Char_Pixel_Width('X')+FontXSpacing) * (MaxLength+1)) + 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
IsReadOnly = 0;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::~EditClass -- Default destructor for the edit gadget. *
|
||||
* *
|
||||
* This default destructor removes the focus setting if it currently has it. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/24/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EditClass::~EditClass(void)
|
||||
{
|
||||
if (Has_Focus()) {
|
||||
Clear_Focus();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::Set_Text -- Sets the text to the edit gadget. *
|
||||
* *
|
||||
* Use this routine to change the text that this edit gadget refers to. *
|
||||
* *
|
||||
* INPUT: text -- Reference to the character array that this edit gadget will be *
|
||||
* modifying. *
|
||||
* max_len -- The maximum size of the buffer that will be modified. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* WARNINGS: none *
|
||||
* HISTORY: *
|
||||
* 01/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void EditClass::Set_Text(char * text, int max_len)
|
||||
{
|
||||
String = text;
|
||||
MaxLength = max_len-1;
|
||||
Length = strlen(String);
|
||||
Flag_To_Redraw();
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::Draw_Me -- Draws the edit box and embedded text. *
|
||||
* *
|
||||
* This routine will render the edit box. This will show the box outline as well as any *
|
||||
* text it may contain. *
|
||||
* *
|
||||
* INPUT: forced -- Should the edit box be drawn even if it thinks it doesn't have to? *
|
||||
* *
|
||||
* OUTPUT: Was the edit box drawn? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/25/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int EditClass::Draw_Me(int forced)
|
||||
{
|
||||
if (ControlClass::Draw_Me(forced)) {
|
||||
/*
|
||||
** Hide the mouse.
|
||||
*/
|
||||
if (LogicPage == &SeenBuff) {
|
||||
Conditional_Hide_Mouse(X, Y, X+Width, Y+Height);
|
||||
}
|
||||
|
||||
/*
|
||||
** Draw the body & set text color.
|
||||
*/
|
||||
Draw_Background();
|
||||
|
||||
/*
|
||||
** Display the text.
|
||||
*/
|
||||
Draw_Text(String);
|
||||
|
||||
/*
|
||||
** Display the mouse.
|
||||
*/
|
||||
if (LogicPage == &SeenBuff) {
|
||||
Conditional_Show_Mouse();
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::Action -- Handles input events. *
|
||||
* *
|
||||
* This routine will handle all mouse and keyboard events directed at this edit box *
|
||||
* gadget. For keyboard events, this will insert the characters into the edit box. *
|
||||
* *
|
||||
* INPUT: flags -- The event flag that triggered this function call. *
|
||||
* *
|
||||
* key -- Reference to the keyboard/mouse event that triggered this function call. *
|
||||
* *
|
||||
* OUTPUT: Should the list be processed further? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/25/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int EditClass::Action(unsigned flags, KeyNumType & key)
|
||||
{
|
||||
|
||||
/*
|
||||
** If this is a read-only edit box, it's a display-only device
|
||||
*/
|
||||
if (IsReadOnly) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
/*
|
||||
** If the left mouse button is pressed over this gadget, then set the focus to
|
||||
** this gadget. The event flag is cleared so that no button ID number is returned.
|
||||
*/
|
||||
if ((flags & LEFTPRESS)) {
|
||||
flags &= ~LEFTPRESS;
|
||||
Set_Focus();
|
||||
Flag_To_Redraw(); // force to draw cursor
|
||||
}
|
||||
|
||||
/*
|
||||
** Handle keyboard events here. Normally, the key is added to the string, but if the
|
||||
** RETURN key is pressed, then the button ID number is returned from the Input()
|
||||
** function.
|
||||
*/
|
||||
if ((flags & KEYBOARD) && Has_Focus()) {
|
||||
|
||||
/*
|
||||
** Process the keyboard character. If indicated, consume this keyboard event
|
||||
** so that the edit gadget ID number is not returned.
|
||||
*/
|
||||
if (key == KN_ESC) {
|
||||
|
||||
Clear_Focus();
|
||||
flags = 0;
|
||||
|
||||
} else {
|
||||
|
||||
KeyASCIIType ascii = (KeyASCIIType)(Keyboard::To_ASCII(key) & 0x00ff);
|
||||
|
||||
/*
|
||||
** Allow numeric keypad presses to map to ascii numbers
|
||||
*/
|
||||
if ((key & WWKEY_VK_BIT) && ascii >='0' && ascii <= '9'){
|
||||
key &= ~WWKEY_VK_BIT;
|
||||
|
||||
if ( (!(flags & LEFTRELEASE)) && (!(flags & RIGHTRELEASE))){
|
||||
if (Handle_Key (ascii) ) {
|
||||
flags &= ~KEYBOARD;
|
||||
key = KN_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
/*
|
||||
** Filter out all special keys except return and backspace
|
||||
*/
|
||||
if ((!(key & WWKEY_VK_BIT) && ascii >= ' ' && ascii <= 127)
|
||||
|| key == KN_RETURN || key == KN_BACKSPACE){
|
||||
|
||||
|
||||
if ( (!(flags & LEFTRELEASE)) && (!(flags & RIGHTRELEASE))){
|
||||
if (Handle_Key(Keyboard::To_ASCII(key))) {
|
||||
flags &= ~KEYBOARD;
|
||||
key = KN_NONE;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
//if (key & WWKEY_RLS_BIT){
|
||||
// if ( (!(flags & LEFTRELEASE)) && (!(flags & RIGHTRELEASE))){
|
||||
flags &= ~KEYBOARD;
|
||||
key = KN_NONE;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(ControlClass::Action(flags, key));
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::Draw_Background -- Draw the background to the edit gadget. *
|
||||
* *
|
||||
* This routine will redraw the edit gadget background. The overlaying text is handled by *
|
||||
* a different routine. The mouse is guaranteed to be hidden when this routine is called. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void EditClass::Draw_Background(void)
|
||||
{
|
||||
Draw_Box (X, Y, Width, Height, BOXSTYLE_GREEN_BOX, true);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::Draw_Text -- Draws the edit gadget text. *
|
||||
* *
|
||||
* This routine is called when the edit gadget text needs to be drawn. The background has *
|
||||
* already been drawn by the time this function is called. The mouse is guaranteed to be *
|
||||
* hidden as well. *
|
||||
* *
|
||||
* INPUT: text -- The text to draw in the edit gadget. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 01/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void EditClass::Draw_Text(char const * text)
|
||||
{
|
||||
if (FontPtr == GradFont6Ptr) {
|
||||
TextPrintType flags;
|
||||
|
||||
if (Has_Focus()) {
|
||||
flags = TPF_BRIGHT_COLOR;
|
||||
} else {
|
||||
flags = (TextPrintType)0;
|
||||
}
|
||||
|
||||
Conquer_Clip_Text_Print(text, X+1, Y+1, Color, TBLACK, TextFlags | flags, Width-2);
|
||||
|
||||
if (Has_Focus() && strlen(text) < MaxLength &&
|
||||
(String_Pixel_Width(text) + String_Pixel_Width ("_") < Width-2) ) {
|
||||
Conquer_Clip_Text_Print( "_", X+1+String_Pixel_Width(text), Y+1, Color, TBLACK, TextFlags | flags);
|
||||
}
|
||||
} else {
|
||||
Conquer_Clip_Text_Print(text, X+1, Y+1, Has_Focus() ? BLUE : WHITE, TBLACK, TextFlags, Width-2);
|
||||
|
||||
if (Has_Focus() && strlen(text) < MaxLength &&
|
||||
(String_Pixel_Width(text) + String_Pixel_Width ("_") < Width-2) ) {
|
||||
Conquer_Clip_Text_Print("_",X+1+String_Pixel_Width(text),Y+1,BLUE,TBLACK, TextFlags);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EditClass::Handle_Key -- Handles keyboard input to edit gadget. *
|
||||
* *
|
||||
* This is the gruntwork routine that processes keyboard input to the edit gadget. This *
|
||||
* routine will be called when keyboard input has been detected and this gadget has the *
|
||||
* current focus. *
|
||||
* *
|
||||
* INPUT: ascii -- The ASCII key code that was fetched from the keyboard buffer. *
|
||||
* *
|
||||
* OUTPUT: bool; Should this keyboard input NOT cause the gadget ID number to be returned *
|
||||
* from the controlling Input() routine? Typically, the return value would be *
|
||||
* true unless the focus is lost due to the <RETURN> key being pressed. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* HISTORY: *
|
||||
* 01/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool EditClass::Handle_Key(KeyASCIIType ascii)
|
||||
{
|
||||
switch (ascii) {
|
||||
/*
|
||||
** Handle the special case of a non-keyboard event. It is possible that this
|
||||
** key code might be passed to this routine if this routine has been overridden
|
||||
** and the key event was consumed.
|
||||
*/
|
||||
case 0:
|
||||
break;
|
||||
|
||||
/*
|
||||
** If the return key is pressed, then remove the focus from this edit
|
||||
** gadget but otherwise let the normal gadget processing proceed. This
|
||||
** causes the gadget ID number to be returned from the Input() function
|
||||
** so that the controlling program will know that the text can be
|
||||
** processed.
|
||||
*/
|
||||
case KA_RETURN:
|
||||
Clear_Focus();
|
||||
return(false);
|
||||
|
||||
/*
|
||||
** When the BACKSPACE key is pressed, remove the last character in the edit string.
|
||||
*/
|
||||
case KA_BACKSPACE:
|
||||
if (Length) {
|
||||
Length--;
|
||||
String[Length] = '\0';
|
||||
Flag_To_Redraw();
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** If the keyboard event was not a recognized special key, then examine to see
|
||||
** if it can legally be added to the edit string and do so if possible.
|
||||
*/
|
||||
default:
|
||||
|
||||
/*
|
||||
** Don't add a character if the length is greater than edit width.
|
||||
*/
|
||||
if ((String_Pixel_Width(String) + Char_Pixel_Width(ascii) ) >= (Width-2)) {
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
** Don't add a character if the length is already at maximum.
|
||||
*/
|
||||
if (Length >= MaxLength) break;
|
||||
|
||||
/*
|
||||
** Invisible characters are never added to the string. This is
|
||||
** especially true for spaces at the beginning of the string.
|
||||
*/
|
||||
if (!isgraph(ascii) && ascii != ' ') break;
|
||||
if (ascii == ' ' && Length == 0) break;
|
||||
|
||||
/*
|
||||
** If this is an upper case only edit gadget, then force the alphabetic
|
||||
** character to upper case.
|
||||
*/
|
||||
if ((EditFlags & UPPERCASE) && isalpha(ascii)) {
|
||||
ascii = (KeyASCIIType)toupper(ascii);
|
||||
}
|
||||
|
||||
if ((!(EditFlags & NUMERIC) || !isdigit(ascii)) &&
|
||||
(!(EditFlags & ALPHA) || !isalpha(ascii)) &&
|
||||
(!(EditFlags & MISC) || isalnum(ascii)) &&
|
||||
ascii != ' ') {
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
** The character passed all legality checks, so add it to the edit string
|
||||
** and flag this gadget to be redrawn. The manual flag to redraw is needed
|
||||
** because the event flag has been cleared. This prevents the gadget's ID
|
||||
** number from being returned just because the gadget has been edited.
|
||||
*/
|
||||
String[Length++] = ascii;
|
||||
String[Length] = '\0';
|
||||
Flag_To_Redraw();
|
||||
break;
|
||||
}
|
||||
return(true);
|
||||
}
|
106
EDIT.H
Normal file
106
EDIT.H
Normal file
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\edit.h_v 2.17 16 Oct 1995 16:46:32 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : EDIT.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 01/15/95 *
|
||||
* *
|
||||
* Last Update : January 15, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef EDIT_H
|
||||
#define EDIT_H
|
||||
|
||||
class EditClass : public ControlClass
|
||||
{
|
||||
public:
|
||||
typedef enum EditStyle {
|
||||
ALPHA =0x0001, // Edit accepts alphabetic characters.
|
||||
NUMERIC =0x0002, // Edit accepts numbers.
|
||||
MISC =0x0004, // Edit accepts misc graphic characters.
|
||||
UPPERCASE =0x0008, // Force to upper case.
|
||||
ALPHANUMERIC=(int)ALPHA|(int)NUMERIC|(int)MISC,
|
||||
} EditStyle;
|
||||
|
||||
EditClass (int id, char * text, int max_len, TextPrintType flags, int x, int y, int w=-1, int h=-1, EditStyle style=ALPHANUMERIC);
|
||||
virtual ~EditClass(void);
|
||||
|
||||
virtual int Draw_Me(int forced);
|
||||
virtual void Set_Text(char * text, int max_len);
|
||||
void Set_Color (int color) { Color = color; }
|
||||
|
||||
void Set_Read_Only(int rdonly) {IsReadOnly = rdonly;}
|
||||
|
||||
protected:
|
||||
|
||||
/*
|
||||
** These are the text size and style flags to be used when displaying the text
|
||||
** of the edit gadget.
|
||||
*/
|
||||
TextPrintType TextFlags;
|
||||
|
||||
/*
|
||||
** Input flags that control what characters are allowed in the string.
|
||||
*/
|
||||
EditStyle EditFlags;
|
||||
|
||||
/*
|
||||
** Pointer to text staging buffer and the maximum length of the string it
|
||||
** can contain.
|
||||
*/
|
||||
char *String;
|
||||
int MaxLength;
|
||||
|
||||
/*
|
||||
** This is the current length of the string. This length will never exceed the
|
||||
** MaxLength allowed.
|
||||
*/
|
||||
int Length;
|
||||
|
||||
/*
|
||||
** This is the desired color of the edit control.
|
||||
*/
|
||||
int Color;
|
||||
|
||||
virtual int Action (unsigned flags, KeyNumType &key);
|
||||
virtual void Draw_Background(void);
|
||||
virtual void Draw_Text(char const * text);
|
||||
virtual bool Handle_Key(KeyASCIIType ascii);
|
||||
|
||||
private:
|
||||
int IsReadOnly;
|
||||
|
||||
};
|
||||
|
||||
inline EditClass::EditStyle operator |(EditClass::EditStyle, EditClass::EditStyle);
|
||||
inline EditClass::EditStyle operator &(EditClass::EditStyle, EditClass::EditStyle);
|
||||
inline EditClass::EditStyle operator ~(EditClass::EditStyle);
|
||||
|
||||
#endif
|
261
ENDING.CPP
Normal file
261
ENDING.CPP
Normal file
|
@ -0,0 +1,261 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\ending.cpv 1.5 16 Oct 1995 16:50:30 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : ENDING.H *
|
||||
* *
|
||||
* Programmer : Barry W. Green *
|
||||
* *
|
||||
* Start Date : July 10, 1995 *
|
||||
* *
|
||||
* Last Update : July 10, 1995 [BWG] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
#include "textblit.h"
|
||||
|
||||
void GDI_Ending(void)
|
||||
{
|
||||
#ifdef DEMO
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Load_Title_Screen("DEMOPIC.PCX", &HidPage, Palette);
|
||||
HidPage.Blit(SeenBuff);
|
||||
Fade_Palette_To(Palette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Clear_KeyBuffer();
|
||||
Get_Key_Num();
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
VisiblePage.Clear();
|
||||
|
||||
#else
|
||||
if (TempleIoned) {
|
||||
Play_Movie("GDIFINB");
|
||||
} else {
|
||||
Play_Movie("GDIFINA");
|
||||
}
|
||||
|
||||
Score.Presentation();
|
||||
|
||||
if (TempleIoned) {
|
||||
Play_Movie("GDIEND2");
|
||||
} else {
|
||||
Play_Movie("GDIEND1");
|
||||
}
|
||||
|
||||
CountDownTimerClass count;
|
||||
if (CCFileClass("TRAILER.VQA").Is_Available()) {
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Load_Uncompress(CCFileClass("ATTRACT2.CPS"), SysMemPage, SysMemPage, Palette);
|
||||
SysMemPage.Scale(SeenBuff, 0, 0, 0, 0, 320, 199, 640, 398);
|
||||
Fade_Palette_To(Palette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Clear_KeyBuffer();
|
||||
count.Set(TIMER_SECOND*3);
|
||||
while (count.Time()) {
|
||||
Call_Back();
|
||||
}
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
|
||||
Play_Movie("TRAILER"); // Red Alert teaser.
|
||||
}
|
||||
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Load_Uncompress(CCFileClass("ATTRACT2.CPS"), SysMemPage, SysMemPage, Palette);
|
||||
SysMemPage.Scale(SeenBuff, 0, 0, 0, 0, 320, 199, 640, 398);
|
||||
Fade_Palette_To(Palette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Clear_KeyBuffer();
|
||||
// CountDownTimerClass count;
|
||||
count.Set(TIMER_SECOND*3);
|
||||
while (count.Time()) {
|
||||
Call_Back();
|
||||
}
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
|
||||
Play_Movie("CC2TEASE");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifndef DEMO
|
||||
/***********************************************************************************************
|
||||
* Nod_Ending -- play ending movies for Nod players *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 7/10/1995 BWG : Created. *
|
||||
*=============================================================================================*/
|
||||
void Nod_Ending(void)
|
||||
{
|
||||
static char const _tanpal[]={0x0,0xED,0xED,0x2C,0x2C,0xFB,0xFB,0xFD,0xFD,0x0,0x0,0x0,0x0,0x0,0x52,0x0};
|
||||
|
||||
char fname[12];
|
||||
#ifdef NOT_FOR_WIN95
|
||||
char *satpic = new char[64000];
|
||||
#endif //NOT_FOR_WIN95
|
||||
int oldfontxspacing = FontXSpacing;
|
||||
void const *oldfont;
|
||||
|
||||
Score.Presentation();
|
||||
|
||||
oldfont = Set_Font(ScoreFontPtr);
|
||||
|
||||
PseudoSeenBuff = new GraphicBufferClass(320,200,(void*)NULL);
|
||||
TextPrintBuffer = new GraphicBufferClass(SeenBuff.Get_Width(), SeenBuff.Get_Height(), (void*)NULL);
|
||||
TextPrintBuffer->Clear();
|
||||
BlitList.Clear();
|
||||
SeenBuff.Clear();
|
||||
HidPage.Clear();
|
||||
PseudoSeenBuff->Clear();
|
||||
|
||||
void * localpal = Load_Alloc_Data(CCFileClass("SATSEL.PAL"));
|
||||
Load_Uncompress(CCFileClass("SATSEL.CPS"), SysMemPage, SysMemPage);
|
||||
#ifdef NOT_FOR_WIN95
|
||||
memcpy(satpic, HidPage.Get_Buffer(), 64000);
|
||||
#else
|
||||
SysMemPage.Blit(*PseudoSeenBuff);
|
||||
#endif //NOT_FOR_WIN95
|
||||
void *kanefinl = Load_Sample("KANEFINL.AUD");
|
||||
void *loopie6m = Load_Sample("LOOPIE6M.AUD");
|
||||
|
||||
Play_Movie("NODFINAL", THEME_NONE, false);
|
||||
|
||||
Hide_Mouse();
|
||||
Wait_Vert_Blank();
|
||||
Set_Palette(localpal);
|
||||
#ifdef NOT_FOR_WIN95
|
||||
memcpy(SeenBuff.Get_Buffer(), satpic, 64000);
|
||||
#endif //NOT_FOR_WIN95
|
||||
Show_Mouse();
|
||||
|
||||
InterpolationPaletteChanged = TRUE;
|
||||
InterpolationPalette = (unsigned char*)localpal;
|
||||
Increase_Palette_Luminance(InterpolationPalette , 30,30,30,63);
|
||||
Read_Interpolation_Palette("SATSELIN.PAL");
|
||||
Interpolate_2X_Scale(PseudoSeenBuff, &SeenBuff,"SATSELIN.PAL");
|
||||
|
||||
Keyboard::Clear();
|
||||
Play_Sample(kanefinl,255,128);
|
||||
Play_Sample(loopie6m,255,128);
|
||||
|
||||
bool mouseshown = false;
|
||||
bool done = false;
|
||||
int selection = 1;
|
||||
bool printedtext = false;
|
||||
while (!done) {
|
||||
if (!printedtext && !Is_Sample_Playing(kanefinl)) {
|
||||
printedtext++;
|
||||
Alloc_Object(new ScorePrintClass(Text_String(TXT_SEL_TARGET), 0, 180,_tanpal));
|
||||
mouseshown = true;
|
||||
Show_Mouse();
|
||||
}
|
||||
Call_Back_Delay(1);
|
||||
if (!Keyboard::Check()) {
|
||||
if (!Is_Sample_Playing(loopie6m)) Play_Sample(loopie6m,255,128);
|
||||
} else {
|
||||
if (Is_Sample_Playing(kanefinl)) {
|
||||
Clear_KeyBuffer();
|
||||
} else {
|
||||
int key = Keyboard::Get();
|
||||
if ((key & 0x10FF) == KN_LMOUSE && !(key & KN_RLSE_BIT)) {
|
||||
int mousex = _Kbd->MouseQX;
|
||||
int mousey = _Kbd->MouseQY;
|
||||
if (mousey >= 22*2 && mousey <= 177*2) {
|
||||
done++;
|
||||
if (mousex < 160*2 && mousey < 100*2) selection = 2;
|
||||
if (mousex < 160*2 && mousey >= 100*2) selection = 3;
|
||||
if (mousex >= 160*2 && mousey >= 100*2) selection = 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mouseshown) Hide_Mouse();
|
||||
#ifdef NOT_FOR_WIN95
|
||||
delete satpic;
|
||||
#else
|
||||
delete PseudoSeenBuff;
|
||||
#endif //NOT_FOR_WIN95
|
||||
|
||||
/* get rid of all the animating objects */
|
||||
for (int i = 0; i < MAXSCOREOBJS; i++) if (ScoreObjs[i]) {
|
||||
delete ScoreObjs[i];
|
||||
ScoreObjs[i] = 0;
|
||||
}
|
||||
// erase the "choose a target" text
|
||||
SeenBuff.Fill_Rect(0,180*2,319*2,199*2,0);
|
||||
TextPrintBuffer->Fill_Rect(0,180*2,319*2,199*2,0);
|
||||
|
||||
Hide_Mouse();
|
||||
Keyboard::Clear();
|
||||
|
||||
Set_Font(oldfont);
|
||||
FontXSpacing = oldfontxspacing;
|
||||
Free_Sample(kanefinl);
|
||||
Free_Sample(loopie6m);
|
||||
|
||||
sprintf(fname,"NODEND%d",selection);
|
||||
PreserveVQAScreen = 1;
|
||||
Play_Movie(fname);
|
||||
|
||||
CountDownTimerClass count;
|
||||
if (CCFileClass("TRAILER.VQA").Is_Available()) {
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Load_Uncompress(CCFileClass("ATTRACT2.CPS"), SysMemPage, SysMemPage, Palette);
|
||||
SysMemPage.Scale(SeenBuff, 0, 0, 0, 0, 320, 199, 640, 398);
|
||||
Fade_Palette_To(Palette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Clear_KeyBuffer();
|
||||
count.Set(TIMER_SECOND*3);
|
||||
while (count.Time()) {
|
||||
Call_Back();
|
||||
}
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
|
||||
Play_Movie("TRAILER"); // Red Alert teaser.
|
||||
}
|
||||
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Load_Uncompress(CCFileClass("ATTRACT2.CPS"), SysMemPage, SysMemPage, Palette);
|
||||
SysMemPage.Scale(SeenBuff, 0, 0, 0, 0, 320, 199, 640, 398);
|
||||
Fade_Palette_To(Palette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
Clear_KeyBuffer();
|
||||
// CountDownTimerClass count;
|
||||
count.Set(TIMER_SECOND*3);
|
||||
while (count.Time()) {
|
||||
Call_Back();
|
||||
}
|
||||
Fade_Palette_To(BlackPalette, FADE_PALETTE_MEDIUM, Call_Back);
|
||||
|
||||
Play_Movie("CC2TEASE");
|
||||
|
||||
delete [] localpal;
|
||||
delete TextPrintBuffer;
|
||||
BlitList.Clear();
|
||||
}
|
||||
#endif
|
42
ENDING.H
Normal file
42
ENDING.H
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : ENDING.H *
|
||||
* *
|
||||
* Programmer : Barry W. Green *
|
||||
* *
|
||||
* Start Date : July 10, 1995 *
|
||||
* *
|
||||
* Last Update : July 10, 1995 [BWG] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef ENDING_H
|
||||
#define ENDING_H
|
||||
|
||||
void Nod_Ending(void);
|
||||
|
||||
#endif
|
760
EVENT.CPP
Normal file
760
EVENT.CPP
Normal file
|
@ -0,0 +1,760 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\event.cpv 2.17 16 Oct 1995 16:50:28 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : EVENT.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 12/09/94 *
|
||||
* *
|
||||
* Last Update : June 25, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* EventClass::EventClass -- Construct an id and cell based event. *
|
||||
* EventClass::EventClass -- Construct simple target type event. *
|
||||
* EventClass::EventClass -- Constructor for mission change events. *
|
||||
* EventClass::EventClass -- Constructor for navigation computer events. *
|
||||
* EventClass::EventClass -- Constructor for object types affecting cells event. *
|
||||
* EventClass::EventClass -- Constructor for sidebar build events. *
|
||||
* EventClass::EventClass -- Constructs event to transfer special flags. *
|
||||
* EventClass::EventClass -- Default constructor for event objects. *
|
||||
* EventClass::EventClass -- Event for sequencing animations. *
|
||||
* EventClass::EventClass -- Megamission assigned to unit. *
|
||||
* EventClass::Execute -- Execute a queued command. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
#include "ccdde.h"
|
||||
|
||||
/***************************************************************************
|
||||
** Table of what data is really used in the EventClass struct for different
|
||||
** events. This table must be kept current with the EventType enum.
|
||||
*/
|
||||
unsigned char EventClass::EventLength[EventClass::LAST_EVENT] = {
|
||||
0, // EMPTY
|
||||
size_of(EventClass, Data.General ), // ALLY
|
||||
size_of(EventClass, Data.MegaMission ), // MEGAMISSION
|
||||
size_of(EventClass, Data.Target ), // IDLE
|
||||
size_of(EventClass, Data.Target ), // SCATTER
|
||||
0, // DESTRUCT
|
||||
0, // DEPLOY
|
||||
size_of(EventClass, Data.Place ), // PLACE
|
||||
0, // OPTIONS
|
||||
size_of(EventClass, Data.General ), // GAMESPEED
|
||||
size_of(EventClass, Data.Specific ), // PRODUCE
|
||||
size_of(EventClass, Data.Specific.Type ), // SUSPEND
|
||||
size_of(EventClass, Data.Specific.Type ), // ABANDON
|
||||
size_of(EventClass, Data.Target ), // PRIMARY
|
||||
size_of(EventClass, Data.Special ), // SPECIAL_PLACE
|
||||
0, // EXIT
|
||||
size_of(EventClass, Data.Anim ), // ANIMATION
|
||||
size_of(EventClass, Data.Target ), // REPAIR
|
||||
size_of(EventClass, Data.Target ), // SELL
|
||||
size_of(EventClass, Data.Options ), // SPECIAL
|
||||
0, // FRAMESYNC
|
||||
0, // MESSAGE
|
||||
size_of(EventClass, Data.FrameInfo.Delay ), // RESPONSE_TIME
|
||||
size_of(EventClass, Data.FrameInfo ), // FRAMEINFO
|
||||
size_of(EventClass, Data.Timing ), // TIMING
|
||||
size_of(EventClass, Data.ProcessTime ), // PROCESS_TIME
|
||||
};
|
||||
|
||||
char * EventClass::EventNames[EventClass::LAST_EVENT] = {
|
||||
"EMPTY",
|
||||
"ALLY",
|
||||
"MEGAMISSION",
|
||||
"IDLE",
|
||||
"SCATTER",
|
||||
"DESTRUCT",
|
||||
"DEPLOY",
|
||||
"PLACE",
|
||||
"OPTIONS",
|
||||
"GAMESPEED",
|
||||
"PRODUCE",
|
||||
"SUSPEND",
|
||||
"ABANDON",
|
||||
"PRIMARY",
|
||||
"SPECIAL_PLACE",
|
||||
"EXIT",
|
||||
"ANIMATION",
|
||||
"REPAIR",
|
||||
"SELL",
|
||||
"SPECIAL",
|
||||
"FRAMESYNC",
|
||||
"MESSAGE",
|
||||
"RESPONSE_TIME",
|
||||
"FRAMEINFO",
|
||||
"TIMING",
|
||||
"PROCESS_TIME",
|
||||
};
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Constructs event to transfer special flags. *
|
||||
* *
|
||||
* This constructs an event that will transfer the special flags. *
|
||||
* *
|
||||
* INPUT: data -- The special flags to be transported to all linked computers. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/25/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(SpecialClass data)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = SPECIAL;
|
||||
Frame = ::Frame;
|
||||
Data.Options.Data = data;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Construct simple target type event. *
|
||||
* *
|
||||
* This will construct a generic event that needs only a target parameter. The actual *
|
||||
* event and target values are specified as parameters. *
|
||||
* *
|
||||
* INPUT: type -- The event type to construct. *
|
||||
* *
|
||||
* target-- The target value that this event is to apply to. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 06/25/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(EventType type, TARGET target)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = type;
|
||||
Frame = ::Frame;
|
||||
Data.Target.Whom = target;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Default constructor for event objects. *
|
||||
* *
|
||||
* This constructs a simple event object that requires no parameters other than the *
|
||||
* type of event it is. *
|
||||
* *
|
||||
* INPUT: type -- The type of event to construct. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(EventType type)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = type;
|
||||
Frame = ::Frame;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Constructor for general-purpose-data events. *
|
||||
* *
|
||||
* INPUT: type -- The type of event to construct. *
|
||||
* val -- data value *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(EventType type, int val)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = type;
|
||||
Data.General.Value = val;
|
||||
Frame = ::Frame;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Constructor for navigation computer events. *
|
||||
* *
|
||||
* Constructor for events that are used to assign the navigation computer. *
|
||||
* *
|
||||
* INPUT: type -- The type of event (this constructor can be used by other navigation *
|
||||
* type events). *
|
||||
* *
|
||||
* src -- The object that the event should apply to. *
|
||||
* *
|
||||
* dest -- The destination (or target) that the event needs to complete. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(EventType type, TARGET src, TARGET dest)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = type;
|
||||
Frame = ::Frame;
|
||||
Data.NavCom.Whom = src;
|
||||
Data.NavCom.Where = dest;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Event for sequencing animations. *
|
||||
* *
|
||||
* This constructor is used for animations that must be created through the event system. *
|
||||
* *
|
||||
* INPUT: anim -- The animation that will be created. *
|
||||
* *
|
||||
* coord -- The location where the animation is to be created. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/19/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(AnimType anim, HousesType owner, COORDINATE coord)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = ANIMATION;
|
||||
Frame = ::Frame;
|
||||
Data.Anim.What = anim;
|
||||
Data.Anim.Owner = owner;
|
||||
Data.Anim.Where = coord;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Megamission assigned to unit. *
|
||||
* *
|
||||
* This is the event that is used to assign most missions to units. It combines both the *
|
||||
* mission and the target (navcom and tarcom). *
|
||||
* *
|
||||
* INPUT: src -- The object that this mission is to apply to. *
|
||||
* *
|
||||
* mission -- The mission to assign to this object. *
|
||||
* *
|
||||
* target -- The target to assign to this object's TarCom. *
|
||||
* *
|
||||
* destination -- The destination to assign to this object's NavCom. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/18/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(TARGET src, MissionType mission, TARGET target, TARGET destination)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = MEGAMISSION;
|
||||
Frame = ::Frame;
|
||||
Data.MegaMission.Whom = src;
|
||||
Data.MegaMission.Mission = mission;
|
||||
Data.MegaMission.Target = target;
|
||||
Data.MegaMission.Destination = destination;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Constructor for sidebar build events. *
|
||||
* *
|
||||
* This constructor is used for events that deal with an object type and an object ID. *
|
||||
* Typically, this is used exclusively by the sidebar. *
|
||||
* *
|
||||
* INPUT: type -- The event type of this object. *
|
||||
* *
|
||||
* object -- The object type number. *
|
||||
* *
|
||||
* id -- The object sub-type number. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/18/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(EventType type, RTTIType object, int id)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = type;
|
||||
Frame = ::Frame;
|
||||
Data.Specific.Type = object;
|
||||
Data.Specific.ID = id;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Constructor for object types affecting cells event. *
|
||||
* *
|
||||
* This constructor is used for those events that have an object type and associated cell. *
|
||||
* Typically, this is for building placement after construction has completed. *
|
||||
* *
|
||||
* INPUT: type -- The event type for this object. *
|
||||
* *
|
||||
* object -- The object type number (actual object is probably inferred from the *
|
||||
* sidebar data). *
|
||||
* *
|
||||
* cell -- The cell location where this event is to occur. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/18/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(EventType type, RTTIType object, CELL cell)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = type;
|
||||
Frame = ::Frame;
|
||||
Data.Place.Type = object;
|
||||
Data.Place.Cell = cell;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::EventClass -- Construct an id and cell based event. *
|
||||
* *
|
||||
* This constructor is used for those events that require an ID number and a cell location. *
|
||||
* *
|
||||
* INPUT: type -- The event type this will be. *
|
||||
* *
|
||||
* id -- The arbitrary id number to assign. *
|
||||
* *
|
||||
* cell -- The location for this event. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/18/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
EventClass::EventClass(EventType type, int id, CELL cell)
|
||||
{
|
||||
ID = Houses.ID(PlayerPtr);
|
||||
Type = type;
|
||||
Frame = ::Frame;
|
||||
Data.Special.ID = id;
|
||||
Data.Special.Cell = cell;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* EventClass::Execute -- Execute a queued command. *
|
||||
* *
|
||||
* This routine executes an event. The even must already have been confirmed by any *
|
||||
* remote machine before calling this routine. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/27/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void EventClass::Execute(void)
|
||||
{
|
||||
TechnoClass * techno;
|
||||
AnimClass * anim = 0;
|
||||
HouseClass * house = 0;
|
||||
char txt[80];
|
||||
int i;
|
||||
//#if (0)
|
||||
if (Type < 0 || Type > PROCESS_TIME){
|
||||
char tempbuf[128];
|
||||
sprintf (tempbuf, "Packet type %d received\n", Type);
|
||||
CCDebugString (tempbuf);
|
||||
|
||||
sprintf (tempbuf, " ID = %d\n", ID);
|
||||
CCDebugString (tempbuf);
|
||||
|
||||
sprintf (tempbuf, " Frame = %d\n", Frame);
|
||||
CCDebugString (tempbuf);
|
||||
|
||||
sprintf (tempbuf, " MPlayer ID = %d\n", MPlayerID);
|
||||
CCDebugString (tempbuf);
|
||||
|
||||
}
|
||||
//#endif //(0)
|
||||
|
||||
|
||||
switch (Type) {
|
||||
/*
|
||||
** Make or break alliance.
|
||||
*/
|
||||
case ALLY:
|
||||
house = Houses.Raw_Ptr(Data.General.Value);
|
||||
if (Houses.Raw_Ptr(ID)->Is_Ally(house)) {
|
||||
Houses.Raw_Ptr(ID)->Make_Enemy((HousesType)Data.General.Value);
|
||||
} else {
|
||||
Houses.Raw_Ptr(ID)->Make_Ally((HousesType)Data.General.Value);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** Special self destruct action requested. This is active in the multiplayer mode.
|
||||
*/
|
||||
case DESTRUCT:
|
||||
CCDebugString ("C&C95 - Resignation packet received\n");
|
||||
Houses.Raw_Ptr(ID)->Flag_To_Die();
|
||||
Houses.Raw_Ptr(ID)->Resigned = true;
|
||||
break;
|
||||
|
||||
/*
|
||||
** Update the special control flags. This is necessary so that in a multiplay
|
||||
** game, all machines will agree on the rules. If these options change during
|
||||
** game play, then all players are informed that options have changed.
|
||||
*/
|
||||
case SPECIAL:
|
||||
{
|
||||
Special = Data.Options.Data;
|
||||
HouseClass * house = Houses.Raw_Ptr(ID);
|
||||
|
||||
sprintf(txt, Text_String(TXT_SPECIAL_WARNING), house->Name);
|
||||
Messages.Add_Message(txt, MPlayerTColors[house->RemapColor],
|
||||
TPF_6PT_GRAD|TPF_USE_GRAD_PAL|TPF_FULLSHADOW, 1200, 0, 0);
|
||||
Map.Flag_To_Redraw(false);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** Starts or stops repair on the specified object. This event is triggered by the
|
||||
** player clicking the repair wrench on a building.
|
||||
*/
|
||||
case REPAIR:
|
||||
CCDebugString ("C&C95 - Repair packet received\n");
|
||||
techno = As_Techno(Data.Target.Whom);
|
||||
if (techno && techno->IsActive) {
|
||||
techno->Repair(-1);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** Tells a building/unit to sell. This event is triggered by the player clicking the
|
||||
** sell animating cursor over the building or unit.
|
||||
*/
|
||||
case SELL:
|
||||
CCDebugString ("C&C95 - Sell packet received\n");
|
||||
techno = As_Techno(Data.Target.Whom);
|
||||
if (techno && techno->IsActive && techno->House == Houses.Raw_Ptr(ID)) {
|
||||
techno->Sell_Back(-1);
|
||||
} else {
|
||||
if (Is_Target_Cell(Data.Target.Whom)) {
|
||||
Houses.Raw_Ptr(ID)->Sell_Wall(As_Cell(Data.Target.Whom));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** This even is used to trigger an animation that is generated as a direct
|
||||
** result of player intervention.
|
||||
*/
|
||||
case ANIMATION:
|
||||
anim = new AnimClass(Data.Anim.What, Data.Anim.Where);
|
||||
if (anim) {
|
||||
if (Data.Anim.Owner != HOUSE_NONE && PlayerPtr->Class->House != Data.Anim.Owner && !Special.IsVisibleTarget) {
|
||||
anim->Make_Invisible();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** This event will place the specified object at the specified location.
|
||||
** The event is used to place newly constructed buildings down on the map. The
|
||||
** object type is specified. From this object type, the house can determine the
|
||||
** exact factory and real object pointer to use.
|
||||
*/
|
||||
case PLACE:
|
||||
CCDebugString ("C&C95 - Place packet received\n");
|
||||
Houses.Raw_Ptr(ID)->Place_Object(Data.Place.Type, Data.Place.Cell);
|
||||
break;
|
||||
|
||||
/*
|
||||
** This event starts production of the speicified object type. The house can
|
||||
** determine from the type and ID value, what object to begin production on and
|
||||
** what factory to use.
|
||||
*/
|
||||
case PRODUCE:
|
||||
CCDebugString ("C&C95 - Produce packet received\n");
|
||||
Houses.Raw_Ptr(ID)->Begin_Production(Data.Specific.Type, Data.Specific.ID);
|
||||
break;
|
||||
|
||||
/*
|
||||
** This event is generated when the player puts production on hold. From the
|
||||
** object type, the factory can be inferred.
|
||||
*/
|
||||
case SUSPEND:
|
||||
CCDebugString ("C&C95 - Suspend packet received\n");
|
||||
Houses.Raw_Ptr(ID)->Suspend_Production(Data.Specific.Type);
|
||||
break;
|
||||
|
||||
/*
|
||||
** This event is generated when the player cancels production of the specified
|
||||
** object type. From the object type, the exact factory can be inferred.
|
||||
*/
|
||||
case ABANDON:
|
||||
CCDebugString ("C&C95 - Abandon packet received\n");
|
||||
Houses.Raw_Ptr(ID)->Abandon_Production(Data.Specific.Type);
|
||||
break;
|
||||
|
||||
/*
|
||||
** Toggles the primary factory state of the specified building.
|
||||
*/
|
||||
case PRIMARY:{
|
||||
CCDebugString ("C&C95 - Primary building packet received\n");
|
||||
BuildingClass * building = As_Building(Data.Target.Whom);
|
||||
if (building && building->IsActive) {
|
||||
building->Toggle_Primary();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** This is the general purpose mission control event. Most player
|
||||
** action routes through this event. It sets a unit's mission, TarCom,
|
||||
** and NavCom to the values specified.
|
||||
*/
|
||||
case MEGAMISSION:
|
||||
techno = As_Techno(Data.MegaMission.Whom);
|
||||
if (techno && techno->IsActive) {
|
||||
|
||||
/*
|
||||
** Fetch a pointer to the object of the mission.
|
||||
*/
|
||||
ObjectClass * object;
|
||||
if (Target_Legal(Data.MegaMission.Target)) {
|
||||
object = As_Object(Data.MegaMission.Target);
|
||||
} else {
|
||||
object = As_Object(Data.MegaMission.Destination);
|
||||
}
|
||||
|
||||
/*
|
||||
** Break any existing team contact, since it is now invalid.
|
||||
*/
|
||||
if (!techno->IsTethered) {
|
||||
techno->Transmit_Message(RADIO_OVER_OUT);
|
||||
}
|
||||
switch (techno->What_Am_I()) {
|
||||
case RTTI_INFANTRY:
|
||||
case RTTI_UNIT:
|
||||
if (((FootClass *)techno)->Team) {
|
||||
((FootClass *)techno)->Team->Remove((FootClass *)techno);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (object) {
|
||||
if (PlayerPtr->Is_Ally(techno) || Special.IsVisibleTarget) {
|
||||
object->Clicked_As_Target();
|
||||
}
|
||||
}
|
||||
techno->Assign_Mission(Data.MegaMission.Mission);
|
||||
|
||||
/*
|
||||
** Guard area mode is handled with care. The specified target is actually
|
||||
** assigned as the location that should be guarded. In addition, the
|
||||
** movement destination is immediately set to this new location.
|
||||
*/
|
||||
if (Data.MegaMission.Mission == MISSION_GUARD_AREA &&
|
||||
// Target_Legal(Data.MegaMission.Target) &&
|
||||
(techno->What_Am_I() == RTTI_INFANTRY || techno->What_Am_I() == RTTI_UNIT || techno->What_Am_I() == RTTI_AIRCRAFT)) {
|
||||
|
||||
((FootClass *)techno)->ArchiveTarget = Data.MegaMission.Target;
|
||||
techno->Assign_Target(TARGET_NONE);
|
||||
techno->Assign_Destination(Data.MegaMission.Target);
|
||||
} else {
|
||||
techno->Assign_Target(Data.MegaMission.Target);
|
||||
techno->Assign_Destination(Data.MegaMission.Destination);
|
||||
}
|
||||
|
||||
#ifdef NEVER
|
||||
if ((techno->What_Am_I() == RTTI_UNIT || techno->What_Am_I() == RTTI_INFANTRY) &&
|
||||
Data.MegaMission.Mission == MISSION_GUARD_AREA) {
|
||||
|
||||
((FootClass *)techno)->ArchiveTarget = Data.MegaMission.Destination;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** Request that the unit/infantry/aircraft go into idle mode.
|
||||
*/
|
||||
case IDLE:
|
||||
techno = As_Techno(Data.Target.Whom);
|
||||
if (techno && techno->IsActive && !techno->IsInLimbo && !techno->IsTethered) {
|
||||
techno->Assign_Destination(TARGET_NONE);
|
||||
techno->Assign_Target(TARGET_NONE);
|
||||
techno->Enter_Idle_Mode();
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** Request that the unit/infantry/aircraft scatter from its current location.
|
||||
*/
|
||||
case SCATTER:
|
||||
techno = As_Techno(Data.Target.Whom);
|
||||
if (techno && techno->IsActive && !techno->IsInLimbo && !techno->IsTethered) {
|
||||
techno->Scatter(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** If we are placing down the ion cannon blast then lets take
|
||||
** care of it.
|
||||
*/
|
||||
case SPECIAL_PLACE:
|
||||
CCDebugString ("C&C95 - Special blast packet received\n");
|
||||
Houses.Raw_Ptr(ID)->Place_Special_Blast((SpecialWeaponType)Data.Special.ID, Data.Special.Cell);
|
||||
break;
|
||||
|
||||
/*
|
||||
** Exit the game.
|
||||
** Give parting message while palette is fading to black.
|
||||
*/
|
||||
case EXIT:
|
||||
CCDebugString ("C&C95 - Exit game packet received\n");
|
||||
Theme.Queue_Song(THEME_NONE);
|
||||
Stop_Speaking();
|
||||
Speak(VOX_CONTROL_EXIT);
|
||||
while (Is_Speaking()) {
|
||||
Call_Back();
|
||||
}
|
||||
GameActive = false;
|
||||
break;
|
||||
|
||||
/*
|
||||
** Process the options menu.
|
||||
*/
|
||||
case OPTIONS:
|
||||
SpecialDialog = SDLG_OPTIONS;
|
||||
break;
|
||||
|
||||
/*
|
||||
** Process the options Game Speed
|
||||
*/
|
||||
case GAMESPEED:
|
||||
CCDebugString ("C&C95 - Game speed packet received\n");
|
||||
Options.GameSpeed = Data.General.Value;
|
||||
break;
|
||||
|
||||
/*
|
||||
** Adjust connection timing for multiplayer games
|
||||
*/
|
||||
case RESPONSE_TIME:
|
||||
char flip[128];
|
||||
sprintf (flip, "C&C95 - Changing MaxAhead to %d frames\n", Data.FrameInfo.Delay);
|
||||
CCDebugString (flip);
|
||||
MPlayerMaxAhead = Data.FrameInfo.Delay;
|
||||
break;
|
||||
|
||||
//
|
||||
// This event tells all systems to use new timing values. It's like
|
||||
// RESPONSE_TIME, only it works. It's only used with the
|
||||
// COMM_MULTI_E_COMP protocol.
|
||||
//
|
||||
case TIMING:
|
||||
CCDebugString ("C&C95 - Timing packet received\n");
|
||||
//#if(TIMING_FIX)
|
||||
//
|
||||
// If MaxAhead is about to increase, we're vulnerable to a Packet-
|
||||
// Received-Too-Late error, if any system generates an event after
|
||||
// this TIMING event, but before it executes. So, record the
|
||||
// period of vulnerability's frame start & end values, so we
|
||||
// can reschedule these events to execute after it's over.
|
||||
//
|
||||
if (Data.Timing.MaxAhead > MPlayerMaxAhead) {
|
||||
NewMaxAheadFrame1 = Frame;
|
||||
NewMaxAheadFrame2 = Frame + Data.Timing.MaxAhead;
|
||||
}
|
||||
//#endif
|
||||
|
||||
DesiredFrameRate = Data.Timing.DesiredFrameRate;
|
||||
MPlayerMaxAhead = Data.Timing.MaxAhead;
|
||||
|
||||
sprintf (flip, "C&C95 - Timing packet: DesiredFrameRate = %d\n", Data.Timing.DesiredFrameRate);
|
||||
CCDebugString (flip);
|
||||
sprintf (flip, "C&C95 - Timing packet: MaxAhead = %d\n", Data.Timing.MaxAhead);
|
||||
CCDebugString (flip);
|
||||
|
||||
/*
|
||||
** If spawned from WChat then we should be getting poked every minute. If not then
|
||||
** deliberately break the max ahead value
|
||||
*/
|
||||
if (Special.IsFromWChat){
|
||||
MPlayerMaxAhead += DDEServer.Time_Since_Heartbeat()/(70*60);
|
||||
//if (DDEServer.Time_Since_Heartbeat() >= 70*60) CCDebugString ("C&C95 - Missed a heartbeat\n");
|
||||
}
|
||||
break;
|
||||
|
||||
//
|
||||
// This event tells all systems what the other systems' process
|
||||
// timing requirements are; it's used to compute a desired frame rate
|
||||
// for the game.
|
||||
//
|
||||
case PROCESS_TIME:
|
||||
for (i = 0; i < MPlayerCount; i++) {
|
||||
if (MPlayerID == ::MPlayerID[i]) {
|
||||
TheirProcessTime[i] = Data.ProcessTime.AverageTicks;
|
||||
|
||||
char flip[128];
|
||||
sprintf (flip, "C&C95 - Received PROCESS_TIME packet of %04x ticks\n", Data.ProcessTime.AverageTicks);
|
||||
CCDebugString (flip);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
** Default: do nothing.
|
||||
*/
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
226
EVENT.H
Normal file
226
EVENT.H
Normal file
|
@ -0,0 +1,226 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\event.h_v 2.19 16 Oct 1995 16:46:14 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : EVENT.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 12/09/94 *
|
||||
* *
|
||||
* Last Update : December 9, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef EVENT_H
|
||||
#define EVENT_H
|
||||
|
||||
/*
|
||||
** This event class is used to contain all external game events (things that the player can
|
||||
** do at any time) so that these events can be transported between linked computers. This
|
||||
** encapsulation is required in order to ensure that each event affects all computers at the
|
||||
** same time (same game frame).
|
||||
*/
|
||||
class EventClass
|
||||
{
|
||||
public:
|
||||
|
||||
/*
|
||||
** All external events are identified by these labels.
|
||||
*/
|
||||
typedef enum EventType {
|
||||
EMPTY,
|
||||
|
||||
ALLY, // Make allie of specified house.
|
||||
MEGAMISSION, // Full change of mission with target and destination.
|
||||
IDLE, // Request to enter idle mode.
|
||||
SCATTER, // Request to scatter from current location.
|
||||
DESTRUCT, // Self destruct request (surrender action).
|
||||
DEPLOY, // MCV is to deploy at current location.
|
||||
PLACE, // Place building at location specified.
|
||||
OPTIONS, // Bring up options screen.
|
||||
GAMESPEED, // Set game speed
|
||||
PRODUCE, // Start or Resume production.
|
||||
SUSPEND, // Suspend production.
|
||||
ABANDON, // Abandon production.
|
||||
PRIMARY, // Primary factory selected.
|
||||
SPECIAL_PLACE, // Special target location selected
|
||||
EXIT, // Exit game.
|
||||
ANIMATION, // Flash ground as movement feedback.
|
||||
REPAIR, // Repair specified object.
|
||||
SELL, // Sell specified object.
|
||||
SPECIAL, // Special options control.
|
||||
|
||||
// Private events.
|
||||
FRAMESYNC, // Game-connection packet; includes Scenario CRC & sender's frame #
|
||||
// Used to initiate game connection phase & to reconnect;
|
||||
// When one of these is received, the receiver knows there are
|
||||
// no associated commands in this packet.
|
||||
MESSAGE, // Message to another player (The message is the 40 bytes
|
||||
// after the event class).
|
||||
RESPONSE_TIME, // use a new propogation delay value
|
||||
FRAMEINFO, // Game-heartbeat packet; includes Game CRC & command count
|
||||
// All packets sent for a frame are prefixed with one of these
|
||||
TIMING, // new timing values for all systems to use
|
||||
PROCESS_TIME, // a system's average processing time, in ticks per frame
|
||||
LAST_EVENT, // one past the last event
|
||||
} EventType;
|
||||
|
||||
EventType Type; // Type of queue command object.
|
||||
|
||||
/*
|
||||
** 'Frame' is the frame that the command should execute on.
|
||||
** 27 bits gives over 25 days of playing time without wrapping,
|
||||
** at 30 frames per second, so it should be plenty!
|
||||
*/
|
||||
unsigned Frame : 27;
|
||||
|
||||
/*
|
||||
** House index of the player originating this event
|
||||
*/
|
||||
unsigned ID : 4;
|
||||
|
||||
/*
|
||||
** This bit tells us if we've already executed this event.
|
||||
*/
|
||||
unsigned IsExecuted: 1;
|
||||
|
||||
/*
|
||||
** Multiplayer ID of the player originating this event.
|
||||
** High nybble: the color index of this player.
|
||||
** Low nybble: the HousesType this player is "acting like" (GDI/NOD)
|
||||
*/
|
||||
unsigned char MPlayerID;
|
||||
|
||||
/*
|
||||
** This union contains the specific data that the event requires.
|
||||
*/
|
||||
union {
|
||||
struct {
|
||||
SpecialClass Data; // The special option flags.
|
||||
} Options;
|
||||
struct {
|
||||
TARGET Whom; // The object to apply the event to.
|
||||
} Target;
|
||||
struct {
|
||||
AnimType What; // The animation to create.
|
||||
HousesType Owner; // The owner of the animation (when it matters).
|
||||
COORDINATE Where; // The location to place the animation.
|
||||
} Anim;
|
||||
struct {
|
||||
int Value; // general-purpose data
|
||||
} General;
|
||||
struct {
|
||||
TARGET Whom; // Whom to apply mission to.
|
||||
MissionType Mission; // What mission to apply.
|
||||
TARGET Target; // Target to assign.
|
||||
TARGET Destination;// Destination to assign.
|
||||
} MegaMission;
|
||||
struct {
|
||||
TARGET Whom; // Whom to apply mission to.
|
||||
MissionType Mission; // What mission to apply.
|
||||
} Mission;
|
||||
struct {
|
||||
TARGET Whom; // Whom to apply movement change to.
|
||||
TARGET Where; // Where to set NavCom to.
|
||||
} NavCom;
|
||||
struct {
|
||||
TARGET Whom; // Whom to apply attack change to.
|
||||
TARGET Target; // What to set TarCom to.
|
||||
} TarCom;
|
||||
struct {
|
||||
RTTIType Type;
|
||||
int ID;
|
||||
} Specific;
|
||||
struct {
|
||||
RTTIType Type;
|
||||
CELL Cell;
|
||||
} Place;
|
||||
struct {
|
||||
int ID;
|
||||
CELL Cell;
|
||||
} Special;
|
||||
/*
|
||||
** This structure is used for FRAMEINFO, FRAMESYNC, and RESPONSE_TIME
|
||||
** events; exactly one of these will be sent each frame, whether there's
|
||||
** data that frame or not.
|
||||
** CRC: the game CRC when this packet was generated; used to detect sync errors
|
||||
** CommandCount: # of commands the sender has sent; used to detect missed packets
|
||||
** Delay: sender's propogation delay value for this frame
|
||||
*/
|
||||
struct {
|
||||
unsigned long CRC;
|
||||
unsigned short CommandCount; // # commands sent so far
|
||||
unsigned char Delay; // propogation delay used this frame
|
||||
// (Frame - Delay = sender's current frame #)
|
||||
} FrameInfo;
|
||||
|
||||
//
|
||||
// This structure sets new timing values for all systems in a multiplayer
|
||||
// game. This structure replaces the RESPONSE_TIME event for
|
||||
// the COMM_MULTI_E_COMP protocol.
|
||||
//
|
||||
struct {
|
||||
unsigned short DesiredFrameRate;
|
||||
unsigned short MaxAhead;
|
||||
} Timing;
|
||||
|
||||
//
|
||||
// This structure is transmitted by all systems, and is used to compute
|
||||
// the "desired" frame rate for the game.
|
||||
//
|
||||
struct {
|
||||
unsigned short AverageTicks;
|
||||
} ProcessTime;
|
||||
|
||||
} Data;
|
||||
|
||||
//-------------- Functions ---------------------
|
||||
EventClass(void) {Type = EMPTY;};
|
||||
EventClass(SpecialClass data);
|
||||
EventClass(EventType type, TARGET target);
|
||||
EventClass(EventType type);
|
||||
EventClass(EventType type, int val);
|
||||
EventClass(EventType type, TARGET src, TARGET dest);
|
||||
// EventClass(TARGET src, MissionType mission);
|
||||
EventClass(TARGET src, MissionType mission, TARGET target=TARGET_NONE, TARGET destination=TARGET_NONE);
|
||||
EventClass(EventType type, RTTIType object, int id);
|
||||
EventClass(EventType type, RTTIType object, CELL cell);
|
||||
EventClass(EventType type, int id, CELL cell);
|
||||
EventClass(AnimType anim, HousesType owner, COORDINATE coord);
|
||||
|
||||
// Process the event.
|
||||
void Execute(void);
|
||||
|
||||
int operator == (EventClass & q) {
|
||||
return memcmp(this, &q, sizeof(q)) == 0;
|
||||
};
|
||||
|
||||
static unsigned char EventLength[LAST_EVENT];
|
||||
static char * EventNames[LAST_EVENT];
|
||||
};
|
||||
|
||||
#endif
|
422
EXPAND.CPP
Normal file
422
EXPAND.CPP
Normal file
|
@ -0,0 +1,422 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header$ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : EXPAND.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 11/03/95 *
|
||||
* *
|
||||
* Last Update : November 3, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
#ifdef NEWMENU
|
||||
|
||||
bool Expansion_Present(void)
|
||||
{
|
||||
CCFileClass file("EXPAND.DAT");
|
||||
|
||||
return(file.Is_Available());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
class EListClass : public ListClass
|
||||
{
|
||||
public:
|
||||
EListClass(int id, int x, int y, int w, int h, TextPrintType flags, void const * up, void const * down) :
|
||||
ListClass(id, x, y, w, h, flags, up, down) {};
|
||||
|
||||
protected:
|
||||
virtual void Draw_Entry(int index, int x, int y, int width, int selected);
|
||||
};
|
||||
|
||||
|
||||
void EListClass::Draw_Entry(int index, int x, int y, int width, int selected)
|
||||
{
|
||||
if (TextFlags & TPF_6PT_GRAD) {
|
||||
TextPrintType flags = TextFlags;
|
||||
|
||||
if (selected) {
|
||||
flags = flags | TPF_BRIGHT_COLOR;
|
||||
LogicPage->Fill_Rect (x, y, x + width - 1, y + LineHeight - 1, CC_GREEN_SHADOW);
|
||||
} else {
|
||||
if (!(flags & TPF_USE_GRAD_PAL)) {
|
||||
flags = flags | TPF_MEDIUM_COLOR;
|
||||
}
|
||||
}
|
||||
|
||||
Conquer_Clip_Text_Print(List[index]+sizeof(int), x, y, CC_GREEN, TBLACK, flags, width, Tabs);
|
||||
|
||||
} else {
|
||||
Conquer_Clip_Text_Print(List[index]+sizeof(int), x, y, (selected ? BLUE : WHITE), TBLACK, TextFlags, width, Tabs);
|
||||
}
|
||||
}
|
||||
|
||||
bool Expansion_Dialog(void)
|
||||
{
|
||||
int factor = (SeenBuff.Get_Width() == 320) ? 1 : 2;
|
||||
|
||||
int option_width = 236 * factor;
|
||||
int option_height = 162 * factor;
|
||||
int option_x = (320*factor - option_width) /2;
|
||||
int option_y = (200*factor - option_height) /2;
|
||||
|
||||
GadgetClass * buttons = NULL;
|
||||
|
||||
void const *up_button;
|
||||
void const *down_button;
|
||||
|
||||
if (InMainLoop){
|
||||
up_button = Hires_Retrieve("BTN-UP.SHP");
|
||||
down_button = Hires_Retrieve("BTN-DN.SHP");
|
||||
}else{
|
||||
up_button = Hires_Retrieve("BTN-UP2.SHP");
|
||||
down_button = Hires_Retrieve("BTN-DN2.SHP");
|
||||
}
|
||||
|
||||
TextButtonClass ok(200, TXT_OK, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+25*factor, option_y+option_height-15*factor);
|
||||
TextButtonClass cancel(201, TXT_CANCEL, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+option_width-50*factor, option_y+option_height-15*factor);
|
||||
EListClass list(202, option_x+10*factor, option_y+20*factor, option_width-20*factor, option_height-40*factor, TPF_6PT_GRAD|TPF_NOSHADOW, up_button, down_button);
|
||||
|
||||
buttons = &ok;
|
||||
cancel.Add(*buttons);
|
||||
list.Add(*buttons);
|
||||
|
||||
|
||||
/*
|
||||
** Add in all the expansion scenarios.
|
||||
*/
|
||||
char * sbuffer = (char*)_ShapeBuffer;
|
||||
for (int index = 20; index < 60; index++) {
|
||||
char buffer[128];
|
||||
CCFileClass file;
|
||||
|
||||
Set_Scenario_Name(buffer, index, SCEN_PLAYER_GDI, SCEN_DIR_EAST, SCEN_VAR_A);
|
||||
strcat(buffer, ".INI");
|
||||
file.Set_Name(buffer);
|
||||
if (file.Is_Available()) {
|
||||
file.Read(sbuffer, 1000);
|
||||
sbuffer[1000] = '\r';
|
||||
sbuffer[1000+1] = '\n';
|
||||
sbuffer[1000+2] = '\0';
|
||||
|
||||
WWGetPrivateProfileString("Basic", "Name", "x", buffer, sizeof(buffer), sbuffer);
|
||||
char * data = new char [strlen(buffer)+1+sizeof(int)+25];
|
||||
*((int*)&data[0]) = index;
|
||||
strcpy(&data[sizeof(int)], "GDI: ");
|
||||
strcat(&data[sizeof(int)], buffer);
|
||||
list.Add_Item(data);
|
||||
}
|
||||
}
|
||||
|
||||
for (index = 20; index < 60; index++) {
|
||||
char buffer[128];
|
||||
CCFileClass file;
|
||||
|
||||
Set_Scenario_Name(buffer, index, SCEN_PLAYER_NOD, SCEN_DIR_EAST, SCEN_VAR_A);
|
||||
strcat(buffer, ".INI");
|
||||
file.Set_Name(buffer);
|
||||
if (file.Is_Available()) {
|
||||
file.Read(sbuffer, 1000);
|
||||
sbuffer[1000] = '\r';
|
||||
sbuffer[1000+1] = '\n';
|
||||
sbuffer[1000+2] = '\0';
|
||||
|
||||
WWGetPrivateProfileString("Basic", "Name", "x", buffer, sizeof(buffer), sbuffer);
|
||||
char * data = new char [strlen(buffer)+1+sizeof(int)+25];
|
||||
*((int*)&data[0]) = index;
|
||||
strcpy(&data[sizeof(int)], "NOD: ");
|
||||
strcat(&data[sizeof(int)], buffer);
|
||||
list.Add_Item(data);
|
||||
}
|
||||
}
|
||||
|
||||
Set_Logic_Page(SeenBuff);
|
||||
bool recalc = true;
|
||||
bool display = true;
|
||||
bool process = true;
|
||||
bool okval = true;
|
||||
while (process) {
|
||||
|
||||
Call_Back();
|
||||
|
||||
/*
|
||||
** If we have just received input focus again after running in the background then
|
||||
** we need to redraw.
|
||||
*/
|
||||
if (AllSurfaces.SurfacesRestored){
|
||||
AllSurfaces.SurfacesRestored=FALSE;
|
||||
display=TRUE;
|
||||
}
|
||||
|
||||
if (display) {
|
||||
display = false;
|
||||
|
||||
Hide_Mouse();
|
||||
|
||||
/*
|
||||
** Load the background picture.
|
||||
*/
|
||||
Load_Title_Screen("HTITLE.PCX", &HidPage, Palette);
|
||||
HidPage.Blit(SeenBuff);
|
||||
|
||||
Dialog_Box(option_x, option_y, option_width, option_height);
|
||||
Draw_Caption(TXT_MISSION_DESCRIPTION, option_x, option_y, option_width);
|
||||
buttons->Draw_All();
|
||||
Show_Mouse();
|
||||
}
|
||||
|
||||
KeyNumType input = buttons->Input();
|
||||
switch (input) {
|
||||
case KN_RETURN:
|
||||
case 200|KN_BUTTON:
|
||||
if (list.Current_Item()[sizeof(int)] == 'G') {
|
||||
ScenPlayer = SCEN_PLAYER_GDI;
|
||||
} else {
|
||||
ScenPlayer = SCEN_PLAYER_NOD;
|
||||
}
|
||||
ScenDir = SCEN_DIR_EAST;
|
||||
Whom = HOUSE_GOOD;
|
||||
Scenario = *(int *)list.Current_Item();
|
||||
process = false;
|
||||
okval = true;
|
||||
break;
|
||||
|
||||
case KN_ESC:
|
||||
case 201|KN_BUTTON:
|
||||
ScenPlayer = SCEN_PLAYER_GDI;
|
||||
ScenDir = SCEN_DIR_EAST;
|
||||
Whom = HOUSE_GOOD;
|
||||
Scenario = *(int *)list.Current_Item();
|
||||
process = false;
|
||||
okval = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Free up the allocations for the text lines in the list box.
|
||||
*/
|
||||
for (index = 0; index < list.Count(); index++) {
|
||||
delete [] (char *)list.Get_Item(index);
|
||||
}
|
||||
|
||||
return(okval);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* Bonus_Dialog -- Asks the user which bonus mission he wants to play *
|
||||
* *
|
||||
* *
|
||||
* *
|
||||
* INPUT: Nothing *
|
||||
* *
|
||||
* OUTPUT: Nothing *
|
||||
* *
|
||||
* WARNINGS: None *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 3/26/97 11:07AM ST : Created *
|
||||
*=============================================================================================*/
|
||||
bool Bonus_Dialog(void)
|
||||
{
|
||||
int factor = (SeenBuff.Get_Width() == 320) ? 1 : 2;
|
||||
|
||||
int option_width = 236 * factor;
|
||||
int option_height = 162 * factor;
|
||||
int option_x = (320*factor - option_width) /2;
|
||||
int option_y = (200*factor - option_height) /2;
|
||||
|
||||
GadgetClass * buttons = NULL;
|
||||
|
||||
void const *up_button;
|
||||
void const *down_button;
|
||||
|
||||
if (InMainLoop){
|
||||
up_button = Hires_Retrieve("BTN-UP.SHP");
|
||||
down_button = Hires_Retrieve("BTN-DN.SHP");
|
||||
}else{
|
||||
up_button = Hires_Retrieve("BTN-UP2.SHP");
|
||||
down_button = Hires_Retrieve("BTN-DN2.SHP");
|
||||
}
|
||||
|
||||
TextButtonClass ok(200, TXT_OK, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+25*factor, option_y+option_height-15*factor);
|
||||
TextButtonClass cancel(201, TXT_CANCEL, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+option_width-50*factor, option_y+option_height-15*factor);
|
||||
EListClass list(202, option_x+10*factor, option_y+20*factor, option_width-20*factor, option_height-40*factor, TPF_6PT_GRAD|TPF_NOSHADOW, up_button, down_button);
|
||||
|
||||
buttons = &ok;
|
||||
cancel.Add(*buttons);
|
||||
list.Add(*buttons);
|
||||
|
||||
|
||||
/*
|
||||
** Add in all the expansion scenarios.
|
||||
*/
|
||||
char * sbuffer = (char*)_ShapeBuffer;
|
||||
int gdi_scen_names[3]={
|
||||
TXT_BONUS_MISSION_1,
|
||||
TXT_BONUS_MISSION_2,
|
||||
TXT_BONUS_MISSION_3
|
||||
};
|
||||
|
||||
int nod_scen_names[2]={
|
||||
TXT_BONUS_MISSION_4,
|
||||
TXT_BONUS_MISSION_5
|
||||
};
|
||||
|
||||
|
||||
for (int index = 60; index < 63; index++) {
|
||||
char buffer[128];
|
||||
CCFileClass file;
|
||||
|
||||
Set_Scenario_Name(buffer, index, SCEN_PLAYER_GDI, SCEN_DIR_EAST, SCEN_VAR_A);
|
||||
strcat(buffer, ".INI");
|
||||
file.Set_Name(buffer);
|
||||
if (file.Is_Available()) {
|
||||
memcpy (buffer, Text_String (gdi_scen_names[index-60]), 1+strlen(Text_String (gdi_scen_names[index-60])));
|
||||
char * data = new char [strlen(buffer)+1+sizeof(int)+25];
|
||||
*((int*)&data[0]) = index;
|
||||
strcpy(&data[sizeof(int)], "GDI: ");
|
||||
strcat(&data[sizeof(int)], buffer);
|
||||
list.Add_Item(data);
|
||||
}
|
||||
}
|
||||
|
||||
for (index = 60; index < 62; index++) {
|
||||
char buffer[128];
|
||||
CCFileClass file;
|
||||
|
||||
Set_Scenario_Name(buffer, index, SCEN_PLAYER_NOD, SCEN_DIR_EAST, SCEN_VAR_A);
|
||||
strcat(buffer, ".INI");
|
||||
file.Set_Name(buffer);
|
||||
if (file.Is_Available()) {
|
||||
memcpy (buffer, Text_String (nod_scen_names[index-60]), 1+strlen(Text_String (nod_scen_names[index-60])));
|
||||
char * data = new char [strlen(buffer)+1+sizeof(int)+25];
|
||||
*((int*)&data[0]) = index;
|
||||
strcpy(&data[sizeof(int)], "NOD: ");
|
||||
strcat(&data[sizeof(int)], buffer);
|
||||
list.Add_Item(data);
|
||||
}
|
||||
}
|
||||
|
||||
Set_Logic_Page(SeenBuff);
|
||||
bool recalc = true;
|
||||
bool display = true;
|
||||
bool process = true;
|
||||
bool okval = true;
|
||||
while (process) {
|
||||
|
||||
Call_Back();
|
||||
|
||||
/*
|
||||
** If we have just received input focus again after running in the background then
|
||||
** we need to redraw.
|
||||
*/
|
||||
if (AllSurfaces.SurfacesRestored){
|
||||
AllSurfaces.SurfacesRestored=FALSE;
|
||||
display=TRUE;
|
||||
}
|
||||
|
||||
if (display) {
|
||||
display = false;
|
||||
|
||||
Hide_Mouse();
|
||||
|
||||
/*
|
||||
** Load the background picture.
|
||||
*/
|
||||
Load_Title_Screen("HTITLE.PCX", &HidPage, Palette);
|
||||
HidPage.Blit(SeenBuff);
|
||||
|
||||
Dialog_Box(option_x, option_y, option_width, option_height);
|
||||
Draw_Caption(TXT_BONUS_MISSIONS, option_x, option_y, option_width);
|
||||
buttons->Draw_All();
|
||||
Show_Mouse();
|
||||
}
|
||||
|
||||
KeyNumType input = buttons->Input();
|
||||
switch (input) {
|
||||
case KN_RETURN:
|
||||
case 200|KN_BUTTON:
|
||||
if (list.Current_Item()[sizeof(int)] == 'G') {
|
||||
ScenPlayer = SCEN_PLAYER_GDI;
|
||||
} else {
|
||||
ScenPlayer = SCEN_PLAYER_NOD;
|
||||
}
|
||||
ScenDir = SCEN_DIR_EAST;
|
||||
Whom = HOUSE_GOOD;
|
||||
Scenario = *(int *)list.Current_Item();
|
||||
process = false;
|
||||
okval = true;
|
||||
break;
|
||||
|
||||
case KN_ESC:
|
||||
case 201|KN_BUTTON:
|
||||
ScenPlayer = SCEN_PLAYER_GDI;
|
||||
ScenDir = SCEN_DIR_EAST;
|
||||
Whom = HOUSE_GOOD;
|
||||
Scenario = *(int *)list.Current_Item();
|
||||
process = false;
|
||||
okval = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Free up the allocations for the text lines in the list box.
|
||||
*/
|
||||
for (index = 0; index < list.Count(); index++) {
|
||||
delete [] (char *)list.Get_Item(index);
|
||||
}
|
||||
|
||||
return(okval);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
401
EXTERNS.H
Normal file
401
EXTERNS.H
Normal file
|
@ -0,0 +1,401 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\externs.h_v 2.15 16 Oct 1995 16:45:34 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : EXTERNS.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : May 27, 1994 *
|
||||
* *
|
||||
* Last Update : May 27, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef EXTERNS_H
|
||||
#define EXTERNS_H
|
||||
|
||||
#include "cell.h"
|
||||
|
||||
#ifdef SCENARIO_EDITOR
|
||||
#include "mapedit.h"
|
||||
#endif
|
||||
#include "techno.h"
|
||||
#include "type.h"
|
||||
#include "building.h"
|
||||
#include "unit.h"
|
||||
#include "credits.h"
|
||||
#include "goptions.h"
|
||||
#include "options.h"
|
||||
#include "infantry.H"
|
||||
|
||||
#ifdef JAPANESE
|
||||
extern bool ForceEnglish;
|
||||
#endif
|
||||
|
||||
extern bool Debug_Quiet;
|
||||
extern bool Debug_Cheat;
|
||||
extern bool Debug_Remap;
|
||||
extern bool Debug_Flag;
|
||||
extern bool Debug_Lose;
|
||||
extern bool Debug_Map;
|
||||
extern bool Debug_Win;
|
||||
extern bool Debug_Icon;
|
||||
extern bool Debug_Passable;
|
||||
extern bool Debug_Unshroud;
|
||||
extern bool Debug_Threat;
|
||||
extern bool Debug_Find_Path;
|
||||
extern bool Debug_Check_Map;
|
||||
extern bool Debug_Playtest;
|
||||
|
||||
extern bool Debug_Heap_Dump;
|
||||
extern bool Debug_Smart_Print;
|
||||
extern bool Debug_Trap_Check_Heap;
|
||||
extern bool Debug_Instant_Build;
|
||||
|
||||
extern void const *WarFactoryOverlay;
|
||||
|
||||
|
||||
/*
|
||||
** Dynamic global variables (these change or are initialized at run time).
|
||||
*/
|
||||
#ifdef PATCH
|
||||
extern bool IsV107;
|
||||
extern char OverridePath[128];
|
||||
#endif
|
||||
extern bool SlowPalette;
|
||||
extern char VersionText[16];
|
||||
extern bool ScoresPresent;
|
||||
extern int CrateCount;
|
||||
extern TCountDownTimerClass CrateTimer;
|
||||
extern bool CrateMaker;
|
||||
extern ThemeType TransitTheme;
|
||||
extern bool AllowVoice;
|
||||
extern NewConfigType NewConfig;
|
||||
extern char BriefingText[512];
|
||||
extern char IntroMovie[_MAX_FNAME+_MAX_EXT];
|
||||
extern char ActionMovie[_MAX_FNAME+_MAX_EXT];
|
||||
extern char BriefMovie[_MAX_FNAME+_MAX_EXT];
|
||||
extern char WinMovie[_MAX_FNAME+_MAX_EXT];
|
||||
extern char LoseMovie[_MAX_FNAME+_MAX_EXT];
|
||||
extern VoxType SpeakQueue;
|
||||
extern bool PlayerWins;
|
||||
extern bool PlayerLoses;
|
||||
extern bool PlayerRestarts;
|
||||
extern StructType SabotagedType;
|
||||
extern bool TempleIoned;
|
||||
extern long Frame;
|
||||
extern void * SpeechBuffer;
|
||||
extern int PreserveVQAScreen;
|
||||
extern bool BreakoutAllowed;
|
||||
extern bool Brokeout;
|
||||
extern CELL Views[4];
|
||||
|
||||
extern GameOptionsClass Options;
|
||||
|
||||
extern LogicClass Logic;
|
||||
#ifdef SCENARIO_EDITOR
|
||||
extern MapEditClass Map;
|
||||
#else
|
||||
extern MouseClass Map;
|
||||
#endif
|
||||
extern ScoreClass Score;
|
||||
extern MonoClass MonoArray[MonoClass::MAX_MONO_PAGES];
|
||||
extern MixFileClass * ScoreMix;
|
||||
extern MixFileClass * TheaterData;
|
||||
extern MixFileClass * LowTheaterData;
|
||||
extern MixFileClass * MoviesMix;
|
||||
extern MixFileClass * GeneralMix;
|
||||
extern ThemeClass Theme;
|
||||
extern SpecialClass Special;
|
||||
|
||||
/*
|
||||
** Game object allocation and tracking classes.
|
||||
*/
|
||||
extern TFixedIHeapClass<UnitClass> Units;
|
||||
extern TFixedIHeapClass<FactoryClass> Factories;
|
||||
extern TFixedIHeapClass<TerrainClass> Terrains;
|
||||
extern TFixedIHeapClass<TemplateClass> Templates;
|
||||
extern TFixedIHeapClass<SmudgeClass> Smudges;
|
||||
extern TFixedIHeapClass<OverlayClass> Overlays;
|
||||
extern TFixedIHeapClass<InfantryClass> Infantry;
|
||||
extern TFixedIHeapClass<BulletClass> Bullets;
|
||||
extern TFixedIHeapClass<BuildingClass> Buildings;
|
||||
extern TFixedIHeapClass<AnimClass> Anims;
|
||||
extern TFixedIHeapClass<AircraftClass> Aircraft;
|
||||
extern TFixedIHeapClass<TriggerClass> Triggers;
|
||||
extern TFixedIHeapClass<TeamTypeClass> TeamTypes;
|
||||
extern TFixedIHeapClass<TeamClass> Teams;
|
||||
extern TFixedIHeapClass<HouseClass> Houses;
|
||||
|
||||
extern QueueClass<EventClass, MAX_EVENTS> OutList;
|
||||
extern QueueClass<EventClass, (MAX_EVENTS * 8)> DoList;
|
||||
|
||||
extern DynamicVectorClass<ObjectClass *> CurrentObject;
|
||||
extern DynamicVectorClass<TriggerClass *> CellTriggers;
|
||||
extern DynamicVectorClass<TriggerClass *> HouseTriggers[HOUSE_COUNT];
|
||||
|
||||
extern CELL Waypoint[WAYPT_COUNT];
|
||||
|
||||
extern BaseClass Base;
|
||||
|
||||
/*
|
||||
** Loaded data file pointers.
|
||||
*/
|
||||
extern void const * Green12FontPtr;
|
||||
extern void const * Green12GradFontPtr;
|
||||
extern void const * MapFontPtr;
|
||||
extern void const * VCRFontPtr;
|
||||
extern void const * Font3Ptr;
|
||||
extern void const * Font6Ptr;
|
||||
extern void const * Font8Ptr;
|
||||
extern void const * FontLEDPtr;
|
||||
extern void const * ScoreFontPtr;
|
||||
extern void const * GradFont6Ptr;
|
||||
extern char const * SystemStrings;
|
||||
|
||||
/*
|
||||
** Miscellaneous globals.
|
||||
*/
|
||||
extern HousesType Whom;
|
||||
extern _VQAConfig AnimControl;
|
||||
extern long SpareTicks;
|
||||
extern int MonoPage;
|
||||
extern unsigned char * OriginalPalette;
|
||||
extern int EndCountDown;
|
||||
extern bool GameActive;
|
||||
extern bool SpecialFlag;
|
||||
extern bool ScenarioInit;
|
||||
extern long TutorFlags[2];
|
||||
extern HouseClass * PlayerPtr;
|
||||
extern unsigned char * BlackPalette;
|
||||
extern unsigned char * WhitePalette;
|
||||
extern unsigned char * GamePalette;
|
||||
extern unsigned Scenario;
|
||||
extern ScenarioPlayerType ScenPlayer;
|
||||
extern ScenarioDirType ScenDir;
|
||||
extern ScenarioVarType ScenVar;
|
||||
extern int CarryOverMoney;
|
||||
extern int CarryOverCap;
|
||||
extern int CarryOverPercent;
|
||||
extern char ScenarioName[_MAX_FNAME+_MAX_EXT];
|
||||
extern unsigned BuildLevel;
|
||||
extern unsigned long ScenarioCRC;
|
||||
|
||||
#ifdef SCENARIO_EDITOR
|
||||
extern CELL CurrentCell;
|
||||
#endif
|
||||
|
||||
extern GameType GameToPlay;
|
||||
|
||||
extern CommProtocolType CommProtocol;
|
||||
|
||||
extern CCFileClass RecordFile;
|
||||
extern int RecordGame;
|
||||
extern int SuperRecord;
|
||||
extern int PlaybackGame;
|
||||
extern int AllowAttract;
|
||||
|
||||
extern GetCDClass CDList;
|
||||
|
||||
/*
|
||||
** Modem globals
|
||||
*/
|
||||
extern bool ModemService;
|
||||
extern NullModemClass NullModem;
|
||||
extern DynamicVectorClass<PhoneEntryClass *> PhoneBook;
|
||||
extern int CurPhoneIdx;
|
||||
extern DynamicVectorClass <char *> InitStrings;
|
||||
extern SerialSettingsType SerialDefaults;
|
||||
extern ModemGameType ModemGameToPlay;
|
||||
extern char * DialMethodCheck[ DIAL_METHODS ];
|
||||
extern char * CallWaitStrings[ CALL_WAIT_STRINGS_NUM ];
|
||||
|
||||
/*
|
||||
** Network/Modem globals
|
||||
*/
|
||||
extern int ScenarioIdx;
|
||||
extern int ColorUsed[];
|
||||
extern char MPlayerName[MPLAYER_NAME_MAX];
|
||||
extern int MPlayerGColors[];
|
||||
extern int MPlayerTColors[];
|
||||
extern char MPlayerDescriptions[100][40];
|
||||
extern DynamicVectorClass <char *> MPlayerScenarios;
|
||||
extern DynamicVectorClass <int> MPlayerFilenum;
|
||||
extern int MPlayerMax;
|
||||
extern int MPlayerPrefColor;
|
||||
extern int MPlayerColorIdx;
|
||||
extern HousesType MPlayerHouse;
|
||||
extern unsigned char MPlayerLocalID;
|
||||
extern int MPlayerCount;
|
||||
extern int MPlayerBases;
|
||||
extern int MPlayerCredits;
|
||||
extern int MPlayerTiberium;
|
||||
extern int MPlayerGoodies;
|
||||
extern int MPlayerGhosts;
|
||||
extern int MPlayerSolo;
|
||||
extern int MPlayerUnitCount;
|
||||
extern int MPlayerCountMin[2];
|
||||
extern int MPlayerCountMax[2];
|
||||
extern unsigned long MPlayerMaxAhead;
|
||||
extern unsigned long FrameSendRate;
|
||||
extern unsigned char MPlayerID[MAX_PLAYERS];
|
||||
extern HousesType MPlayerHouses[MAX_PLAYERS];
|
||||
extern char MPlayerNames [MAX_PLAYERS][MPLAYER_NAME_MAX];
|
||||
extern MessageListClass Messages;
|
||||
extern IPXAddressClass MessageAddress;
|
||||
extern char LastMessage[MAX_MESSAGE_LENGTH];
|
||||
extern int MPlayerBlitz;
|
||||
extern int MPlayerObiWan;
|
||||
extern MPlayerScoreType MPlayerScore[MAX_MULTI_NAMES];
|
||||
extern int MPlayerGamesPlayed;
|
||||
extern int MPlayerNumScores;
|
||||
extern int MPlayerWinner;
|
||||
extern int MPlayerCurGame;
|
||||
|
||||
extern int TheirProcessTime[MAX_PLAYERS - 1];
|
||||
extern int DesiredFrameRate;
|
||||
|
||||
extern char * GlobalPacketNames[];
|
||||
extern char * SerialPacketNames[];
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
AircraftClass *Aircraft;
|
||||
AnimClass *Anim;
|
||||
BuildingClass *Building;
|
||||
BulletClass *Bullet;
|
||||
InfantryClass *Infantry;
|
||||
UnitClass *Unit;
|
||||
void *All;
|
||||
} Ptr;
|
||||
} TrapObjectType;
|
||||
|
||||
extern long TrapFrame;
|
||||
extern RTTIType TrapObjType;
|
||||
extern TrapObjectType TrapObject;
|
||||
extern COORDINATE TrapCoord;
|
||||
extern void * TrapThis;
|
||||
extern CellClass * TrapCell;
|
||||
extern int TrapCheckHeap;
|
||||
|
||||
/*
|
||||
** Network (IPX) globals
|
||||
*/
|
||||
extern IPXManagerClass Ipx;
|
||||
extern int IsBridge;
|
||||
extern IPXAddressClass BridgeNet;
|
||||
extern bool NetMaster;
|
||||
extern bool NetStealth;
|
||||
extern bool NetProtect;
|
||||
extern bool NetOpen;
|
||||
extern char MPlayerGameName[MPLAYER_NAME_MAX];
|
||||
extern GlobalPacketType GPacket;
|
||||
extern int GPacketlen;
|
||||
extern IPXAddressClass GAddress;
|
||||
extern unsigned short GProductID;
|
||||
extern char * MetaPacket;
|
||||
extern int MetaSize;
|
||||
extern DynamicVectorClass <NodeNameType *> Games;
|
||||
extern DynamicVectorClass <NodeNameType *> Players;
|
||||
|
||||
extern int Seed;
|
||||
extern long * RandSeedPtr;
|
||||
extern int CustomSeed;
|
||||
extern int NewMaxAheadFrame1;
|
||||
extern int NewMaxAheadFrame2;
|
||||
|
||||
/*
|
||||
** Constant externs (data is not modified during game play).
|
||||
*/
|
||||
extern unsigned char const RemapGreen[256];
|
||||
extern unsigned char const RemapBlue[256];
|
||||
extern unsigned char const RemapOrange[256];
|
||||
extern unsigned char const RemapNone[256];
|
||||
extern unsigned char const RemapYellow[256];
|
||||
extern unsigned char const RemapRed[256];
|
||||
extern unsigned char const RemapBlueGreen[256];
|
||||
extern WeaponTypeClass const Weapons[WEAPON_COUNT];
|
||||
extern WarheadTypeClass const Warheads[WARHEAD_COUNT];
|
||||
extern char const * SourceName[SOURCE_COUNT];
|
||||
extern GroundType const Ground[LAND_COUNT];
|
||||
extern TheaterDataType const Theaters[THEATER_COUNT];
|
||||
extern unsigned char const Facing32[256];
|
||||
extern unsigned char const Facing8[256];
|
||||
extern unsigned char const Pixel2Lepton[24];
|
||||
extern COORDINATE const StoppingCoordAbs[5];
|
||||
extern CELL const AdjacentCell[FACING_COUNT];
|
||||
extern COORDINATE const AdjacentCoord[FACING_COUNT];
|
||||
|
||||
extern int SoundOn;
|
||||
//extern GraphicBufferClass SeenPage;
|
||||
extern GraphicBufferClass VisiblePage;
|
||||
extern GraphicBufferClass HiddenPage;
|
||||
extern GraphicViewPortClass SeenBuff;
|
||||
extern GraphicBufferClass ModeXBuff;
|
||||
extern GraphicViewPortClass HidPage;
|
||||
extern GraphicBufferClass LoResHidPage;
|
||||
extern GraphicBufferClass SysMemPage;
|
||||
extern int MenuList[][8];
|
||||
extern CountDownTimerClass FrameTimer;
|
||||
extern CountDownTimerClass CountDownTimer;
|
||||
|
||||
extern TimerClass ProcessTimer;
|
||||
extern int ProcessTicks;
|
||||
extern int ProcessFrames;
|
||||
|
||||
extern SpecialDialogType SpecialDialog;
|
||||
//extern bool IsFindPath;
|
||||
|
||||
extern char *DebugFname; // for stoopid debugging purposes
|
||||
extern int DebugLine; // for stoopid debugging purposes
|
||||
extern int RequiredCD;
|
||||
extern int MouseInstalled;
|
||||
extern int AreThingiesEnabled;
|
||||
|
||||
extern WWKeyboardClass Kbd;
|
||||
extern int In_Debugger;
|
||||
extern WWMouseClass *WWMouse;
|
||||
extern HANDLE hInstance;
|
||||
extern int AllDone;
|
||||
extern "C" bool MMXAvailable;
|
||||
extern int Get_CD_Index (int cd_drive, int timeout);
|
||||
void Memory_Error_Handler(void);
|
||||
extern bool GameStatisticsPacketSent;
|
||||
extern bool ConnectionLost;
|
||||
extern bool InMainLoop; // True if in game state rather than menu state
|
||||
void CCDebugString (char *string);
|
||||
extern void *PacketLater;
|
||||
void Load_Title_Screen(char *name, GraphicViewPortClass *video_page, unsigned char *palette);
|
||||
|
||||
extern "C"{
|
||||
extern bool IsTheaterShape;
|
||||
}
|
||||
|
||||
extern void Reset_Theater_Shapes(void);
|
||||
extern TheaterType LastTheater;
|
||||
|
||||
#endif
|
183
FACING.CPP
Normal file
183
FACING.CPP
Normal file
|
@ -0,0 +1,183 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\facing.cpv 1.9 16 Oct 1995 16:49:40 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : FACING.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 03/21/95 *
|
||||
* *
|
||||
* Last Update : March 21, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* FacingClass::Rotation_Adjust -- Perform a rotation adjustment to current facing. *
|
||||
* FacingClass::Set_Current -- Sets the current rotation value. *
|
||||
* FacingClass::Set_Desired -- Sets the desired facing value. *
|
||||
* FacingClass::FacingClass -- Default constructor for the facing class. *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
#include "facing.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FacingClass::FacingClass -- Default constructor for the facing class. *
|
||||
* *
|
||||
* This default constructor merely sets the desired and current facing values to be the *
|
||||
* same (North). *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
FacingClass::FacingClass(void)
|
||||
{
|
||||
CurrentFacing = DIR_N;
|
||||
DesiredFacing = DIR_N;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FacingClass::Set_Desired -- Sets the desired facing value. *
|
||||
* *
|
||||
* This routine is used to set the desired facing value without altering the current *
|
||||
* facing setting. Typicall use of this routine is when a vehicle needs to face a *
|
||||
* direction, but currently isn't facing the correct direction. After this routine is *
|
||||
* called, it is presumed that subsequent calls to Rotation_Adjust() will result in the *
|
||||
* eventual alignment of the current facing. *
|
||||
* *
|
||||
* INPUT: facing -- The new facing to assign to the desired value. *
|
||||
* *
|
||||
* OUTPUT: bool; Did the desired facing value actually change by this routine call? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int FacingClass::Set_Desired(DirType facing)
|
||||
{
|
||||
if (DesiredFacing != facing) {
|
||||
DesiredFacing = facing;
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FacingClass::Set_Current -- Sets the current rotation value. *
|
||||
* *
|
||||
* This routine will set the current rotation value. It is used to override the facing *
|
||||
* value without adjusting the desired setting. *
|
||||
* *
|
||||
* INPUT: facing -- The new facing to assign to the current facing value. *
|
||||
* *
|
||||
* OUTPUT: bool; Was the current setting changed by this routine. Failure means that the *
|
||||
* current setting was already at the value specified. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int FacingClass::Set_Current(DirType facing)
|
||||
{
|
||||
if (CurrentFacing != facing) {
|
||||
CurrentFacing = facing;
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FacingClass::Rotation_Adjust -- Perform a rotation adjustment to current facing. *
|
||||
* *
|
||||
* This routine is used when the current and desired facings differ but the current *
|
||||
* facing should be adjusted toward the desired facing. The amount of rotation to adjust *
|
||||
* is provided as a rotation rate parameter. Typical use of this routine is for turrets *
|
||||
* and other vehicle related rotating. *
|
||||
* *
|
||||
* INPUT: rate -- The rotation rate to use when adjusting the current facing toward the *
|
||||
* desired facing. A value of 127 means instantaneous rotation. *
|
||||
* *
|
||||
* OUTPUT: bool; Did the rotation result in the current facing transitioning from one *
|
||||
* 1/32 zone to another? If true, then the owning object most likely will *
|
||||
* need to be redrawn to reflect the change. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 03/21/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int FacingClass::Rotation_Adjust(int rate)
|
||||
{
|
||||
/*
|
||||
** Only perform the rotation adjustment if the desired facing is not the
|
||||
** same as the current facing.
|
||||
*/
|
||||
if (Is_Rotating()) {
|
||||
rate = MIN(rate, 127);
|
||||
|
||||
DirType oldfacing = CurrentFacing;
|
||||
int diff = Difference();
|
||||
|
||||
/*
|
||||
** If the allowed facing change is greater than the difference between
|
||||
** the current facing and the desired facing, then just snap the
|
||||
** facing to the new value.
|
||||
*/
|
||||
if (ABS(diff) < rate) {
|
||||
CurrentFacing = DesiredFacing;
|
||||
} else {
|
||||
|
||||
/*
|
||||
** Adjust the current facing clockwise or counterclockwise depending
|
||||
** on the shortest distance to the desired facing from the current
|
||||
** facing.
|
||||
*/
|
||||
if (diff < 0) {
|
||||
CurrentFacing = (DirType)(CurrentFacing - (DirType)rate);
|
||||
} else {
|
||||
CurrentFacing = (DirType)(CurrentFacing + (DirType)rate);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** If this facing adjustment caused the current facing to rotate into a
|
||||
** new 1/32 rotation zone (likely to cause a redraw), then return
|
||||
** this fact with a true value.
|
||||
*/
|
||||
return(Facing_To_32(CurrentFacing) != Facing_To_32(oldfacing));
|
||||
}
|
||||
return(false);
|
||||
}
|
79
FACING.H
Normal file
79
FACING.H
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\facing.h_v 1.14 16 Oct 1995 16:46:02 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : FACING.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 03/21/95 *
|
||||
* *
|
||||
* Last Update : March 21, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef FACING_H
|
||||
#define FACING_H
|
||||
|
||||
/*
|
||||
** This is a general facing handler class. It is used in those cases where facing needs to be
|
||||
** kept track of, but there could also be an associated desired facing. The current facing
|
||||
** is supposed to transition to the desired state over time. Using this class facilitates this
|
||||
** processing as well as isolating the rest of the code from the internals.
|
||||
*/
|
||||
class FacingClass
|
||||
{
|
||||
public:
|
||||
FacingClass(void);
|
||||
FacingClass(DirType dir) {CurrentFacing = DesiredFacing = dir;};
|
||||
operator DirType(void) const {return CurrentFacing;};
|
||||
|
||||
DirType Current(void) const {return CurrentFacing;};
|
||||
DirType Desired(void) const {return DesiredFacing;};
|
||||
|
||||
int Set_Desired(DirType facing);
|
||||
int Set_Current(DirType facing);
|
||||
|
||||
void Set(DirType facing) {
|
||||
Set_Current(facing);
|
||||
Set_Desired(facing);
|
||||
};
|
||||
|
||||
DirType Get(void) const { return CurrentFacing; }
|
||||
|
||||
int Is_Rotating(void) const {return (DesiredFacing != CurrentFacing);};
|
||||
|
||||
int Difference(void) const {return (signed char)(*((unsigned char*)&DesiredFacing) - *((unsigned char*)&CurrentFacing));};
|
||||
int Difference(DirType facing) const {return (signed char)(*((signed char*)&facing) - *((signed char*)&CurrentFacing));};
|
||||
int Rotation_Adjust(int rate);
|
||||
|
||||
private:
|
||||
DirType CurrentFacing;
|
||||
DirType DesiredFacing;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
750
FACTORY.CPP
Normal file
750
FACTORY.CPP
Normal file
|
@ -0,0 +1,750 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\factory.cpv 2.18 16 Oct 1995 16:51:26 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : FACTORY.CPP *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 12/26/94 *
|
||||
* *
|
||||
* Last Update : May 22, 1995 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* FactoryClass::AI -- Process factory production logic. *
|
||||
* FactoryClass::Abandon -- Abandons current construction with money refunded. *
|
||||
* FactoryClass::Completed -- Clears factory object after a completed production process. *
|
||||
* FactoryClass::Completion -- Fetchs the completion step for this factory. *
|
||||
* FactoryClass::Cost_Per_Tick -- Breaks entire production cost into managable chunks. *
|
||||
* FactoryClass::FactoryClass -- Default constructor for factory objects. *
|
||||
* FactoryClass::Get_Object -- Fetches pointer to object being constructed. *
|
||||
* FactoryClass::Get_Special_Item -- gets factorys spc prod item *
|
||||
* FactoryClass::Has_Changed -- Checks to see if a production step has occurred? *
|
||||
* FactoryClass::Has_Completed -- Checks to see if object has completed production. *
|
||||
* FactoryClass::Set -- Assigns a factory to produce an object. *
|
||||
* FactoryClass::Set -- Fills a factory with an already completed object. *
|
||||
* FactoryClass::Set -- Force factory to "produce" special object. *
|
||||
* FactoryClass::Start -- Resumes production after suspension or creation. *
|
||||
* FactoryClass::Suspend -- Temporarily stop production. *
|
||||
* FactoryClass::operator delete -- Returns a factory to the free factory pool. *
|
||||
* FactoryClass::operator new -- Allocates a factory object from the free factory pool. *
|
||||
* FactoryClass::~FactoryClass -- Default destructor for factory objects. *
|
||||
* FactoryClass::Validate -- validates factory pointer *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#include "function.h"
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Validate -- validates factory pointer *
|
||||
* *
|
||||
* INPUT: *
|
||||
* none. *
|
||||
* *
|
||||
* OUTPUT: *
|
||||
* 1 = ok, 0 = error *
|
||||
* *
|
||||
* WARNINGS: *
|
||||
* none. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/09/1995 BRR : Created. *
|
||||
*=============================================================================================*/
|
||||
#ifdef CHEAT_KEYS
|
||||
int FactoryClass::Validate(void) const
|
||||
{
|
||||
int num;
|
||||
|
||||
num = Factories.ID(this);
|
||||
if (num < 0 || num >= FACTORY_MAX) {
|
||||
Validate_Error("FACTORY");
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
return (1);
|
||||
}
|
||||
#else
|
||||
#define Validate()
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::FactoryClass -- Default constructor for factory objects. *
|
||||
* *
|
||||
* This brings the factory into a null state. It is called when a factory object is *
|
||||
* created. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
FactoryClass::FactoryClass(void)
|
||||
{
|
||||
IsSuspended = false;
|
||||
IsDifferent = false;
|
||||
Balance = 0;
|
||||
SpecialItem = SPC_NONE;
|
||||
Object = NULL;
|
||||
House = NULL;
|
||||
Set_Rate(0);
|
||||
Set_Stage(0);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::~FactoryClass -- Default destructor for factory objects. *
|
||||
* *
|
||||
* This cleans up a factory object in preparation for deletion. If there is currently *
|
||||
* an object in production, it is abandoned and money is refunded. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
FactoryClass::~FactoryClass(void)
|
||||
{
|
||||
if (GameActive) {
|
||||
Abandon();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Init -- Clears all units for scenario preparation. *
|
||||
* *
|
||||
* This routine will zero out the factory list and objects. This routine is typically *
|
||||
* used in preparation for a new scenario load. All factorys are guaranteed to be eliminated*
|
||||
* by this routine. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 08/15/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void FactoryClass::Init(void)
|
||||
{
|
||||
Factories.Free_All();
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::operator new -- Allocates a factory object from the free factory pool. *
|
||||
* *
|
||||
* This routine allocates a factory from the free factory pool. If there is no more room *
|
||||
* to allocate a factory, then NULL is returned. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with pointer to the newly allocated factory object. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void * FactoryClass::operator new(size_t)
|
||||
{
|
||||
void * ptr = Factories.Allocate();
|
||||
if (ptr) {
|
||||
((FactoryClass *)ptr)->IsActive = true;
|
||||
}
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::operator delete -- Returns a factory to the free factory pool. *
|
||||
* *
|
||||
* This returns the factory object back to the factory allocation pool. The factory is then *
|
||||
* available to be allocated. *
|
||||
* *
|
||||
* INPUT: ptr -- Pointer to the factory object to delete. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void FactoryClass::operator delete(void *ptr)
|
||||
{
|
||||
if (ptr) {
|
||||
((FactoryClass *)ptr)->IsActive = false;
|
||||
}
|
||||
Factories.Free((FactoryClass *)ptr);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::AI -- Process factory production logic. *
|
||||
* *
|
||||
* This routine should be called once per game tick. It handles the production process. *
|
||||
* As production proceeds, money is deducted from the owner object's house. When production *
|
||||
* completes, the factory stop processing. A call to Abandon, Delete, or Completed is *
|
||||
* required after that point. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
* 01/04/1995 JLB : Uses exact installment payment method. *
|
||||
*=============================================================================================*/
|
||||
void FactoryClass::AI(void)
|
||||
{
|
||||
Validate();
|
||||
if (!IsSuspended && (Object != NULL || SpecialItem)) {
|
||||
int stages = 1;
|
||||
|
||||
/*
|
||||
** Determine the acceleration factor for factory production.
|
||||
** This applies only to human players. The computer builds
|
||||
** units on a building by building basis -- quantity of building
|
||||
** factory types doesn't affect individual factories.
|
||||
*/
|
||||
if (Object && House->IsHuman) {
|
||||
switch (Object->What_Am_I()) {
|
||||
case RTTI_AIRCRAFT:
|
||||
stages = House->AircraftFactories;
|
||||
break;
|
||||
|
||||
case RTTI_INFANTRY:
|
||||
stages = House->InfantryFactories;
|
||||
break;
|
||||
|
||||
case RTTI_UNIT:
|
||||
stages = House->UnitFactories;
|
||||
break;
|
||||
|
||||
case RTTI_BUILDING:
|
||||
stages = House->BuildingFactories;
|
||||
break;
|
||||
}
|
||||
stages = MAX(stages, 1);
|
||||
}
|
||||
|
||||
|
||||
for (int index = 0; index < stages; index++) {
|
||||
if (!Has_Completed() && Graphic_Logic()) {
|
||||
IsDifferent = true;
|
||||
|
||||
int cost = Cost_Per_Tick();
|
||||
|
||||
cost = MIN(cost, Balance);
|
||||
|
||||
/*
|
||||
** Enough time has expired so that another production step can occur.
|
||||
** If there is insufficient funds, then go back one production step and
|
||||
** continue the countdown. The idea being that by the time the next
|
||||
** production step occurs, there may be sufficient funds available.
|
||||
*/
|
||||
if (cost > House->Available_Money()) {
|
||||
Set_Stage(Fetch_Stage()-1);
|
||||
} else {
|
||||
House->Spend_Money(cost);
|
||||
Balance -= cost;
|
||||
}
|
||||
if ( Debug_Instant_Build ) {
|
||||
Set_Stage(STEP_COUNT);
|
||||
}
|
||||
/*
|
||||
** If the production has completed, then suspend further production.
|
||||
*/
|
||||
if (Fetch_Stage() == STEP_COUNT) {
|
||||
IsSuspended = true;
|
||||
Set_Rate(0);
|
||||
House->Spend_Money(Balance);
|
||||
Balance = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Has_Changed -- Checks to see if a production step has occurred? *
|
||||
* *
|
||||
* Use this routine to determine if production has advanced at least one step. By using *
|
||||
* this function, intelligent rendering may be performed. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Has the production process advanced one step since the last time this *
|
||||
* function was called? *
|
||||
* *
|
||||
* WARNINGS: This function clears the changed status flag as a side effect. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Has_Changed(void)
|
||||
{
|
||||
Validate();
|
||||
bool changed = IsDifferent;
|
||||
IsDifferent = false;
|
||||
return(changed);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Set -- Assigns a factory to produce an object. *
|
||||
* *
|
||||
* This routine initializes a factory to produce the object specified. The desired object *
|
||||
* type is created and placed in suspended animation (limbo) until such time as production *
|
||||
* completes. Production is not actually started by this routine. An explicit call to *
|
||||
* Start() is required to begin production. *
|
||||
* *
|
||||
* INPUT: object -- Reference to the object type class that is to be produced. *
|
||||
* *
|
||||
* house -- Reference to the owner of the object to be produced. *
|
||||
* *
|
||||
* OUTPUT: bool; Was production successfully prepared for this factory object. Failure means *
|
||||
* that the object could not be created. This is catastrophic and in such *
|
||||
* cases, the factory object should be deleted. *
|
||||
* *
|
||||
* WARNINGS: Be sure to examine the return value from this function. Failure to initialize *
|
||||
* the factory means that the factory is useless and should be deleted. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Set(TechnoTypeClass const & object, HouseClass & house)
|
||||
{
|
||||
Validate();
|
||||
/*
|
||||
** If there is any production currently in progress, abandon it.
|
||||
*/
|
||||
Abandon();
|
||||
|
||||
/*
|
||||
** Set up the factory for the new production process.
|
||||
*/
|
||||
IsDifferent = true;
|
||||
IsSuspended = true;
|
||||
Set_Rate(0);
|
||||
Set_Stage(0);
|
||||
|
||||
/*
|
||||
** Create an object of the type requested.
|
||||
*/
|
||||
Object = (TechnoClass *)object.Create_One_Of(&house);
|
||||
|
||||
if (Object) {
|
||||
House = Object->House;
|
||||
Balance = object.Cost_Of();
|
||||
Object->PurchasePrice = Balance;
|
||||
}
|
||||
|
||||
/*
|
||||
** If all was set up successfully, then return true.
|
||||
*/
|
||||
return(Object != NULL);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Set -- Force factory to "produce" special object. *
|
||||
* *
|
||||
* Use this routine to force the factory into special production mode. Such production is *
|
||||
* used for the ion cannon and other timed special weapon events. *
|
||||
* *
|
||||
* INPUT: type -- The special weapon type to begin "production" of. *
|
||||
* *
|
||||
* house -- The owner of this production object. *
|
||||
* *
|
||||
* OUTPUT: Was the assignment successful? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/22/1995 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Set(int const & type, HouseClass & house)
|
||||
{
|
||||
Validate();
|
||||
/*
|
||||
** If there is any production currently in progress, abandon it.
|
||||
*/
|
||||
Abandon();
|
||||
|
||||
/*
|
||||
** Set up the factory for the new production process.
|
||||
*/
|
||||
IsDifferent = true;
|
||||
IsSuspended = true;
|
||||
Set_Rate(0);
|
||||
Set_Stage(0);
|
||||
|
||||
/*
|
||||
** Create an object of the type requested.
|
||||
*/
|
||||
SpecialItem = type;
|
||||
House = &house;
|
||||
Balance = 0;
|
||||
|
||||
/*
|
||||
** If all was set up successfully, then return true.
|
||||
*/
|
||||
return(SpecialItem != SPC_NONE);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Set -- Fills a factory with an already completed object. *
|
||||
* *
|
||||
* This routine is called when a produced object is in placement mode but then placement *
|
||||
* is suspended. The object must then return to the factory as if it were newly completed *
|
||||
* and awaiting removal. *
|
||||
* *
|
||||
* INPUT: object -- The object to return to the factory. *
|
||||
* *
|
||||
* OUTPUT: none *
|
||||
* *
|
||||
* WARNINGS: This will abandon any current object being produced at the factory in order *
|
||||
* to set the new object into it. *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
void FactoryClass::Set(TechnoClass & object)
|
||||
{
|
||||
Validate();
|
||||
Abandon();
|
||||
Object = &object;
|
||||
House = Object->House;
|
||||
Balance = 0;
|
||||
Set_Rate(0);
|
||||
Set_Stage(STEP_COUNT);
|
||||
IsDifferent = true;
|
||||
IsSuspended = true;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Suspend -- Temporarily stop production. *
|
||||
* *
|
||||
* This routine will suspend production until a subsiquent call to Start() or Abandon(). *
|
||||
* Typical use of this function is when the player puts production on hold or when there *
|
||||
* is insufficient funds. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Was production actually stopped? A false return value indicates that the *
|
||||
* factory was empty or production was already stopped (or never started). *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Suspend(void)
|
||||
{
|
||||
Validate();
|
||||
if (!IsSuspended) {
|
||||
IsSuspended = true;
|
||||
Set_Rate(0);
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Start -- Resumes production after suspension or creation. *
|
||||
* *
|
||||
* This function will start the production process. It works for newly created factory *
|
||||
* objects, as well as if production had been suspended previously. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Was production started? A false return value means that the factory is *
|
||||
* empty or there is unsufficient credits to begin production. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Start(void)
|
||||
{
|
||||
Validate();
|
||||
if ((Object || SpecialItem) && IsSuspended && !Has_Completed()) {
|
||||
if (House->Available_Money() >= Cost_Per_Tick()) {
|
||||
int time;
|
||||
|
||||
if (Object) {
|
||||
time = Object->Class_Of().Time_To_Build(House->Class->House);
|
||||
} else {
|
||||
time = TICKS_PER_MINUTE * 5;
|
||||
}
|
||||
|
||||
int frac = House->Power_Fraction();
|
||||
frac = Bound(frac, 0x0010, 0x0100);
|
||||
int rate = (time*256) / frac;
|
||||
|
||||
rate /= STEP_COUNT;
|
||||
rate = Bound(rate, 1, 255);
|
||||
|
||||
Set_Rate(rate);
|
||||
IsSuspended = false;
|
||||
return(true);
|
||||
}
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Abandon -- Abandons current construction with money refunded. *
|
||||
* *
|
||||
* This routine is used when construction is to be abandoned and current money spend is *
|
||||
* to be refunded. This function effectively clears out this factory of all record of the *
|
||||
* producing object so that it may either be deleted or started anew with the Set() *
|
||||
* function. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Was an object actually abandoned? A false return value indicates that the *
|
||||
* factory was not producing any object. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Abandon(void)
|
||||
{
|
||||
Validate();
|
||||
if (Object) {
|
||||
|
||||
if (Object) {
|
||||
/*
|
||||
** Refund all money expended so far, back to the owner of the object under construction.
|
||||
*/
|
||||
House->Refund_Money(Object->Class_Of().Cost_Of() - Balance);
|
||||
Balance = 0;
|
||||
|
||||
/*
|
||||
** Delete the object under construction.
|
||||
*/
|
||||
ScenarioInit++;
|
||||
delete Object;
|
||||
Object = NULL;
|
||||
ScenarioInit--;
|
||||
}
|
||||
if (SpecialItem) {
|
||||
SpecialItem = SPC_NONE;
|
||||
}
|
||||
|
||||
/*
|
||||
** Set the factory back to the idle and empty state.
|
||||
*/
|
||||
Set_Rate(0);
|
||||
Set_Stage(0);
|
||||
IsSuspended = true;
|
||||
IsDifferent = true;
|
||||
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Completion -- Fetchs the completion step for this factory. *
|
||||
* *
|
||||
* Use this routine to determine what animation (or completion step) the factory is *
|
||||
* currently on. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns a completion step number beteen 0 (uncompleted), to STEP_COUNT (completed) *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int FactoryClass::Completion(void)
|
||||
{
|
||||
Validate();
|
||||
return(Fetch_Stage());
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Has_Completed -- Checks to see if object has completed production. *
|
||||
* *
|
||||
* Use this routine to examine the factory object in order to determine if the associated *
|
||||
* object has completed production and is awaiting placement. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Is the associated object to the factory completed and ready for placement? *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Has_Completed(void)
|
||||
{
|
||||
Validate();
|
||||
if (Object && Fetch_Stage() == STEP_COUNT) {
|
||||
return(true);
|
||||
}
|
||||
if (SpecialItem && Fetch_Stage() == STEP_COUNT) {
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Get_Object -- Fetches pointer to object being constructed. *
|
||||
* *
|
||||
* This routine gets the pointer to the currently constructing object. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns with a pointer to the object undergoing construction. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
TechnoClass * FactoryClass::Get_Object(void) const
|
||||
{
|
||||
Validate();
|
||||
return(Object);
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* FactoryClass::Get_Special_Item -- gets factorys spc prod item *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: int the item the factory is currently working on *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 05/05/1995 PWG : Created. *
|
||||
*=========================================================================*/
|
||||
int FactoryClass::Get_Special_Item(void) const
|
||||
{
|
||||
Validate();
|
||||
return(SpecialItem);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Cost_Per_Tick -- Breaks entire production cost into managable chunks. *
|
||||
* *
|
||||
* Use this routine to determine the cost per game "tick" to produce the object. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: Returns the number of credits necessary to advance production one game tick. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
int FactoryClass::Cost_Per_Tick(void)
|
||||
{
|
||||
Validate();
|
||||
if (Object) {
|
||||
int steps = STEP_COUNT - Fetch_Stage();
|
||||
if (steps) {
|
||||
return(Balance / steps);
|
||||
}
|
||||
return(Balance);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************************************
|
||||
* FactoryClass::Completed -- Clears factory object after a completed production process. *
|
||||
* *
|
||||
* This routine is called after production completes, and the object produced has been *
|
||||
* placed into the game. It resets the factory for deletion or starting of new production. *
|
||||
* *
|
||||
* INPUT: none *
|
||||
* *
|
||||
* OUTPUT: bool; Did any resetting occur? Failure is the result of the factory not having *
|
||||
* any completed object. An immediate second call to this routine will also *
|
||||
* yield false. *
|
||||
* *
|
||||
* WARNINGS: none *
|
||||
* *
|
||||
* HISTORY: *
|
||||
* 12/26/1994 JLB : Created. *
|
||||
*=============================================================================================*/
|
||||
bool FactoryClass::Completed(void)
|
||||
{
|
||||
Validate();
|
||||
if (Object && Fetch_Stage() == STEP_COUNT) {
|
||||
Object = NULL;
|
||||
IsSuspended = true;
|
||||
IsDifferent = true;
|
||||
Set_Stage(0);
|
||||
Set_Rate(0);
|
||||
return(true);
|
||||
}
|
||||
|
||||
if (SpecialItem && Fetch_Stage() == STEP_COUNT) {
|
||||
SpecialItem = SPC_NONE;
|
||||
IsSuspended = true;
|
||||
IsDifferent = true;
|
||||
Set_Stage(0);
|
||||
Set_Rate(0);
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
144
FACTORY.H
Normal file
144
FACTORY.H
Normal file
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
** Command & Conquer(tm)
|
||||
** Copyright 2025 Electronic Arts Inc.
|
||||
**
|
||||
** This program is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 3 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* $Header: F:\projects\c&c\vcs\code\factory.h_v 2.17 16 Oct 1995 16:45:44 JOE_BOSTIC $ */
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* File Name : FACTORY.H *
|
||||
* *
|
||||
* Programmer : Joe L. Bostic *
|
||||
* *
|
||||
* Start Date : 12/26/94 *
|
||||
* *
|
||||
* Last Update : December 26, 1994 [JLB] *
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#ifndef FACTORY_H
|
||||
#define FACTORY_H
|
||||
|
||||
#include "stage.h"
|
||||
|
||||
class FactoryClass : private StageClass
|
||||
{
|
||||
public:
|
||||
FactoryClass(void);
|
||||
~FactoryClass(void);
|
||||
static void * operator new(size_t size);
|
||||
static void operator delete(void *ptr);
|
||||
|
||||
static void Init(void);
|
||||
|
||||
/*
|
||||
** File I/O.
|
||||
*/
|
||||
bool Load(FileClass & file);
|
||||
bool Save(FileClass & file);
|
||||
void Code_Pointers(void);
|
||||
void Decode_Pointers(void);
|
||||
|
||||
bool Abandon(void);
|
||||
bool Completed(void);
|
||||
bool Has_Changed(void);
|
||||
bool Has_Completed(void);
|
||||
bool Is_Building(void) const {return(Fetch_Rate() != 0);};
|
||||
bool Set(TechnoTypeClass const & object, HouseClass & house);
|
||||
bool Set(int const & type, HouseClass & house);
|
||||
bool Start(void);
|
||||
bool Suspend(void);
|
||||
int Completion(void);
|
||||
TechnoClass * Get_Object(void) const;
|
||||
int Get_Special_Item(void) const;
|
||||
void AI(void);
|
||||
void Set(TechnoClass & object);
|
||||
HouseClass * Get_House(void) {return(House);};
|
||||
|
||||
/*
|
||||
** Dee-buggin' support.
|
||||
*/
|
||||
int Validate(void) const;
|
||||
|
||||
/*
|
||||
** This flag is used to maintain the pool of factory class objects. If the object has
|
||||
** been allocated, then this flag is true. Otherwise, the object is free to be
|
||||
** allocated.
|
||||
*/
|
||||
unsigned IsActive:1;
|
||||
|
||||
protected:
|
||||
enum StepCountEnum {
|
||||
STEP_COUNT=108 // Number of steps to break production down into.
|
||||
};
|
||||
|
||||
int Cost_Per_Tick(void);
|
||||
|
||||
private:
|
||||
|
||||
/*
|
||||
** If production is temporarily suspended, then this flag will be true. A factory
|
||||
** is suspended when it is first created, when production has completed, and when
|
||||
** explicitly instructed to Suspend() production. Suspended production is not
|
||||
** abandoned. It may be resumed with a call to Start().
|
||||
*/
|
||||
unsigned IsSuspended:1;
|
||||
|
||||
/*
|
||||
** If the AI process detected that the production process has advanced far enough
|
||||
** that a change in the building animation would occur, this flag will be true.
|
||||
** Examination of this flag (through the Has_Chaged function) allows intelligent
|
||||
** updating of any production graphic.
|
||||
*/
|
||||
unsigned IsDifferent:1;
|
||||
|
||||
/*
|
||||
** This records the balance due on the current production item. This value will
|
||||
** be reduced as production proceeds. It will reach zero the moment production has
|
||||
** finished. Using this method ensures that the total production cost will be EXACT
|
||||
** regardless of the number of installment payments that are made.
|
||||
*/
|
||||
int Balance;
|
||||
int OriginalBalance;
|
||||
|
||||
/*
|
||||
** This is the object that is being produced. It is held in a state of limbo while
|
||||
** undergoing production. Since the object is created at the time production is
|
||||
** started, it is always available when production completes.
|
||||
*/
|
||||
TechnoClass * Object;
|
||||
|
||||
/*
|
||||
** If the factory is not producing an object and is instead producing
|
||||
** a special item, then special item will be set.
|
||||
*/
|
||||
int SpecialItem;
|
||||
|
||||
/*
|
||||
** The factory has to be doing production for one house or another.
|
||||
** The house pointer will point to whichever house it is being done
|
||||
** for.
|
||||
*/
|
||||
HouseClass * House;
|
||||
};
|
||||
|
||||
#endif
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue