sources » TechnoClass » RegisterDestruction
void TechnoClass::RegisterDestruction(TechnoClass * Killer) {
// stuff
TechnoClass * Victim = this;
int Reward = Victim->GetTechnoType()->GetActualCost(Victim->Owner);
if(!Victim->GetTechnoType()->DontScore) {
if(Killer) {
if(Killer->Owner->IsAlliedWith(Victim)) {
Reward = 0;
} else if(Victim->Veterancy.IsVeteran()) {
Reward *= 2;
} else if(Victim->Veterancy.IsElite()) {
Reward *= 3;
}
VeterancyStruct * veterancy = NULL;
int OwnerCost = 0;
int VictimCost = Reward;
TechnoClass * Transporter = NULL;
if(Killer->InOpenTopped && (Transporter = Killer->Transporter) && Transporter->GetTechnoType()->Trainable) {
veterancy = &Transporter->Veterancy;
OwnerCost = Transporter->GetTechnoType()->GetActualCost(Transporter->Owner);
} else if(Killer->GetTechnoType()->Trainable) {
veterancy = &Killer->Veterancy;
OwnerCost = Killer->GetTechnoType()->GetActualCost(Killer->Owner);
} else if(Killer->GetTechnoType()->MissileSpawn) {
if(TechnoClass * Spawner = Killer->SpawnOwner) {
if(Spawner->GetTechnoType()->Trainable) {
veterancy = &Spawner->Veterancy;
OwnerCost = Spawner->GetTechnoType()->GetActualCost(Spawner->Owner);
}
}
} else if(Killer->CanOccupyFire) {
if(BuildingClass * KillerBuilding = specific_cast<BuildingClass *>(Killer)) {
InfantryClass * Occupant = KillerBuilding->Occupants[KillerBuilding->FiringOccupantIndex];
veterancy = &Occupant->Veterancy;
OwnerCost = Occupant->Type->GetActualCost(Occupant->Owner);
}
}
}
if(Veterancy) {
Veterancy->Add(OwnerCost, VictimCost);
}
}
// stuff
}
void VeterancyStruct::Add(int OwnerCost, int VictimCost) {
float Addition = VictimCost / OwnerCost * RulesClass::Instance->VeteranRatio;
float NewVeterancy = this->Veterancy + Addition;
if(NewVeterancy > RulesClass::Instance->VeteranCap) {
NewVeterancy = RulesClass::Instance->VeteranCap;
}
this->Veterancy = NewVeterancy;
}