1 #include "spring_api.h"
2 
3 #include "AI/Wrappers/Cpp/src-generated/Engine.h"
4 #include "AI/Wrappers/Cpp/src-generated/OOAICallback.h"
5 #include "ExternalAI/Interface/AISEvents.h"
6 #include "ExternalAI/Interface/AISCommands.h"
7 #include "AI/Wrappers/Cpp/src-generated/UnitDef.h"
8 #include "AI/Wrappers/Cpp/src-generated/WeaponMount.h"
9 #include "AI/Wrappers/Cpp/src-generated/WeaponDef.h"
10 #include "AI/Wrappers/Cpp/src-generated/Damage.h"
11 #include "SpringGame.h"
12 #include "SpringUnitType.h"
13 
CSpringUnitType(CSpringGame * game,springai::OOAICallback * callback,springai::UnitDef * unitDef)14 CSpringUnitType::CSpringUnitType(CSpringGame* game, springai::OOAICallback* callback, springai::UnitDef* unitDef):
15 	boptions(unitDef->GetBuildOptions()),
16 	game(game),
17 	callback(callback),
18 	unitDef(unitDef),
19 	resources(callback->GetResources()),
20 	weaponMounts(unitDef->GetWeaponMounts())
21 {
22 }
23 
~CSpringUnitType()24 CSpringUnitType::~CSpringUnitType(){
25 	game = NULL;
26 	callback = NULL;
27 	delete unitDef; //same as in SpringUnit.cpp
28 	unitDef = NULL;
29 	for (int i = 0; i < resources.size(); i += 1) {
30 		delete resources[i];
31 	}
32 	for (int i = 0; i < weaponMounts.size(); i += 1) {
33 		delete weaponMounts[i];
34 	}
35 	for (int i = 0; i < boptions.size(); i += 1) {
36 		delete boptions[i];
37 	}
38 }
39 
Name()40 std::string CSpringUnitType::Name(){
41 	return this->unitDef->GetName();
42 }
43 
ReclaimSpeed()44 float CSpringUnitType::ReclaimSpeed(){
45 	return unitDef->GetReclaimSpeed();
46 }
47 
ResourceCost(int idx)48 float CSpringUnitType::ResourceCost(int idx){
49 	if(!resources.empty()){
50 		std::vector<springai::Resource*>::iterator i = resources.begin();
51 		for(;i != resources.end();++i){
52 			springai::Resource* r = *i;
53 			if(r->GetResourceId() == idx){
54 				return unitDef->GetCost(r);
55 			}
56 		}
57 	}
58 	return -1;
59 }
60 
Extractor()61 bool CSpringUnitType::Extractor(){
62 	springai::Resource* r = static_cast<CSpringMap*>(game->Map())->GetMetalResource();
63 	return unitDef->GetResourceExtractorRange(r);
64 }
65 
GetMaxHealth()66 float CSpringUnitType::GetMaxHealth(){
67 	return unitDef->GetHealth();
68 }
69 
WeaponCount()70 int CSpringUnitType::WeaponCount(){
71 	return weaponMounts.size();
72 }
73 
MaxWeaponDamage()74 float CSpringUnitType::MaxWeaponDamage(){
75 	if(!weaponMounts.empty()){
76 		float output = 0;
77 		std::vector<springai::WeaponMount*>::iterator i = weaponMounts.begin();
78 		for(; i != weaponMounts.begin();++i){
79 			springai::WeaponMount* m = *i;
80 			springai::WeaponDef* def = m->GetWeaponDef();
81 			springai::Damage* d = def->GetDamage();
82 			float damage = *(d->GetTypes().begin());
83 			output += damage;
84 			delete d;
85 			delete def;
86 		}
87 		return output;
88 	}
89 	return 0;
90 }
91 
GetUnitDef()92 springai::UnitDef* CSpringUnitType::GetUnitDef(){
93 	return unitDef;
94 }
95 
BuildOptions()96 std::vector<IUnitType*> CSpringUnitType::BuildOptions(){
97 	std::vector<IUnitType*> options;
98 
99 	std::vector<springai::UnitDef*> defs = unitDef->GetBuildOptions();
100 	if(!defs.empty()){
101 		std::vector<springai::UnitDef*>::iterator i = defs.begin();
102 		for(;i!= defs.end();++i){
103 			springai::UnitDef* u = *i;
104 			IUnitType* ut = game->ToIUnitType(u);
105 			options.push_back(ut);
106 			delete u;
107 		}
108 	}
109 	return options;
110 }
111