-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path_rtti.cpp
More file actions
191 lines (177 loc) · 6.87 KB
/
Copy path_rtti.cpp
File metadata and controls
191 lines (177 loc) · 6.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*******************************************************************************
* O P E N T S
*******************************************************************************
* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright 2025 Electronic Arts Inc.
* Copyright 2026 OpenTS contributors
*
* Contains material derived from Electronic Arts source code.
* Modified by OpenTS contributors, 2026.
* EA's GPLv3 Section 7 additional terms and supplemental warranty
* disclaimers apply; see LICENSE.md.
******************************************************************************/
#include "always.h"
#include "_rtti.h"
#include "object.h"
struct {
char const *Name;
RTTIType RTTI;
} RTTIs[RTTI_COUNT] = {
{ "<none>", RTTI_NONE },
{ "Unit", RTTI_UNIT },
{ "Aircraft", RTTI_AIRCRAFT },
{ "AircraftType", RTTI_AIRCRAFTTYPE },
{ "Anim", RTTI_ANIM },
{ "AnimType", RTTI_ANIMTYPE },
{ "Building", RTTI_BUILDING },
{ "BuildingType", RTTI_BUILDINGTYPE },
{ "Bullet", RTTI_BULLET },
{ "BulletType", RTTI_BULLETTYPE },
{ "Campaign", RTTI_CAMPAIGN },
{ "Cell", RTTI_CELL },
{ "Factory", RTTI_FACTORY },
{ "House", RTTI_HOUSE },
{ "HouseType", RTTI_HOUSETYPE },
{ "Infantry", RTTI_INFANTRY },
{ "InfantryType", RTTI_INFANTRYTYPE },
{ "Isotile", RTTI_ISOTILE },
{ "IsotileType", RTTI_ISOTILETYPE },
{ "Light", RTTI_LIGHT },
{ "Overlay", RTTI_OVERLAY },
{ "OverlayType", RTTI_OVERLAYTYPE },
{ "Particle", RTTI_PARTICLE },
{ "ParticleType", RTTI_PARTICLETYPE },
{ "ParticleSystem", RTTI_PARTICLESYSTEM },
{ "ParticleSystemType", RTTI_PARTICLESYSTEMTYPE },
{ "Script", RTTI_SCRIPT },
{ "ScriptType", RTTI_SCRIPTTYPE },
{ "Side", RTTI_SIDE },
{ "Smudge", RTTI_SMUDGE },
{ "SmudgeType", RTTI_SMUDGETYPE },
{ "Special", RTTI_SPECIAL },
{ "SuperWeaponType", RTTI_SUPERWEAPONTYPE },
{ "TaskForce", RTTI_TASKFORCE },
{ "Team", RTTI_TEAM },
{ "TeamType", RTTI_TEAMTYPE },
{ "Terrain", RTTI_TERRAIN },
{ "TerrainType", RTTI_TERRAINTYPE },
{ "Trigger", RTTI_TRIGGER },
{ "TriggerType", RTTI_TRIGGERTYPE },
{ "UnitType", RTTI_UNITTYPE },
{ "VoxelAnim", RTTI_VOXELANIM },
{ "VoxelAnimType", RTTI_VOXELANIMTYPE },
{ "Wave", RTTI_WAVE },
{ "Tag", RTTI_TAG },
{ "TagType", RTTI_TAGTYPE },
{ "Tiberium", RTTI_TIBERIUM },
{ "Action", RTTI_ACTION },
{ "Event", RTTI_EVENT },
{ "WeaponType", RTTI_WEAPONTYPE },
{ "WarheadType", RTTI_WARHEADTYPE },
{ "Waypoint", RTTI_WAYPOINT },
{ "Abstract", RTTI_ABSTRACT },
{ "Tube", RTTI_TUBE },
{ "LightSource", RTTI_LIGHTSOURCE },
{ "EMPulse", RTTI_EMPULSE },
{ "TacticalMap", RTTI_TACTICALMAP },
{ "SuperWeapon", RTTI_SUPERWEAPON },
{ "AITrigger", RTTI_AITRIGGER },
{ "AITriggerType", RTTI_AITRIGGERTYPE },
{ "Neuron", RTTI_NEURON },
{ "FoggedObject", RTTI_FOGGEDOBJECT },
{ "AlphaShape", RTTI_ALPHASHAPE },
{ "VeinholeMonster", RTTI_VEINHOLEMONSTER },
};
static char UNKNOWN_RTTI_NAME[] = { "Unknown" };
/// <summary>
/// Fetches the readable name for an RTTI type.
/// Use this routine whenever an object type must be recorded in human readable form --
/// when storing it in an INI database, or when logging object state for the sync debugger.
/// </summary>
/// <returns>Returns with the name of the RTTI type specified. If the type has no name
/// assigned, then "Unknown" is returned.</returns>
char const *Name_From_RTTI(RTTIType rtti)
{
for (int i = 0; i < RTTI_COUNT; i++) {
if (RTTIs[i].RTTI == rtti) {
return(RTTIs[i].Name);
}
}
return(UNKNOWN_RTTI_NAME);
}
/// <summary>
/// Converts an RTTI name back into its RTTI type.
/// This routine is the counterpart to Name_From_RTTI and is used when an object type is
/// read back out of an INI database. The name comparison ignores case.
/// </summary>
/// <returns>Returns with the RTTI type that the name refers to, or RTTI_NONE if the name
/// is not recognized.</returns>
RTTIType RTTI_From_Name(char const *name)
{
for (int i = 0; i < RTTI_COUNT; i++) {
if (!strcmpi(RTTIs[i].Name, name)) {
return(RTTIs[i].RTTI);
}
}
return(RTTI_NONE);
}
/***********************************************************************************************
* As_Techno -- Converts a target value into a TechnoClass pointer. *
* *
* This routine will take the target value specified and convert it into a TechnoClass *
* pointer if the target represents an object that has a TechnoClass. *
* *
* INPUT: target -- The target value to convert into a TechnoClass pointer. *
* *
* OUTPUT: Returns with a pointer to the associated object's TechnoClass. If the target *
* cannot be converted into a TechnoClass pointer, then NULL is returned. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 06/02/1994 JLB : Created. *
*=============================================================================================*/
template <>
TechnoClass const * Dynamic_Cast<TechnoClass const *>(AbstractClass const * target)
{
if (target != NULL) {
RTTIType rtti = target->RTTI;
switch (rtti) {
case RTTI_INFANTRY:
return((TechnoClass *)target);
case RTTI_UNIT:
return((TechnoClass *)target);
case RTTI_BUILDING:
return((TechnoClass *)target);
case RTTI_AIRCRAFT:
return((TechnoClass *)target);
}
}
return(NULL);
}
/// <summary>
/// Converts an abstract object pointer into a TechnoClass pointer.
/// This routine will take the object specified and convert it into a TechnoClass pointer
/// if that object is one of the techno derived types. It is the non-const counterpart to
/// the specialization above.
/// </summary>
/// <returns>Returns with a pointer to the associated object's TechnoClass. If the object
/// cannot be converted into a TechnoClass pointer, then NULL is returned.</returns>
template <>
TechnoClass * Dynamic_Cast<TechnoClass *>(AbstractClass * target)
{
if (target != NULL) {
RTTIType rtti = target->RTTI;
switch (rtti) {
case RTTI_INFANTRY:
return((TechnoClass *)target);
case RTTI_UNIT:
return((TechnoClass *)target);
case RTTI_BUILDING:
return((TechnoClass *)target);
case RTTI_AIRCRAFT:
return((TechnoClass *)target);
}
}
return(NULL);
}