Maqsad: AICoopPlayer ichidagi "qo'l uchida yozilgan" (string-based) kodlarni olib tashlab, O'yin Dvigatelining (Engine) haqiqiy KindOf tizimiga o'tkazish.
Bizga binolarni nomi bo'yicha emas, balki "Pasporti" (KindOf) bo'yicha sanaydigan funksiya kerak.
// AICoopPlayer.h
Int countStructuresByKindOf(KindOfMaskType mask);
// AICoopPlayer.cpp
Int AICoopPlayer::countStructuresByKindOf(KindOfMaskType mask) {
Int soni = 0;
// O'yindagi barcha obyektlarni tekshiramiz
Object *obj = TheGameLogic->getFirstObject();
while (obj) {
if (obj->getControllingPlayer() == m_player &&
obj->isAlive() &&
obj->isKindOfMulti(mask, KINDOFMASK_NONE)) { // Pasporti to'g'ri kelsa
soni++;
}
obj = obj->getNextObject();
}
return soni;
}Raqamlarni kod ichidan olib, tepaga chiqaramiz:
const Int STRATEGIC_DEFENSE_COST = 2000;
const Int MAX_DEFENSES = 8;
Eski usul: count("Patriot") + count("Gattling")... (Har bitta nomni yozib chiqish kerak edi).
Yangi usul:
Int turrets = countStructuresByKindOf(KINDOF_FS_BASE_DEFENSE | KINDOF_CAN_ATTACK); (Hamma otadigan himoya binolari).
Int bunkers = countStructuresByKindOf(KINDOF_FS_BASE_DEFENSE | KINDOF_GARRISONABLE_UNTIL_DESTROYED); (Hamma ichiga odam sig'adigan binolar).
Eski usul: strstr("Bunker") (Nomi "Bunker" bo'lsa...).
Yangi usul: tmpl->isKindOf(...) (Tepa vaqtida yozgan siklimiz).
Funksiya quyidagicha ishlaydi:
- Pul va Elektrni tekshiradi.
- Mavjud Turret va Bunkerlarni sanaydi (Universal).
- Agar limit to'lgan bo'lsa -> To'xtaydi.
- Bu millat (Faction) uchun eng mos Turret va Bunker shablonini topadi (Universal).
- Sonlarni solishtiradi (Bunker+ Balansi).
- Quradi.
AICoopPlayer.hga yangi funksiyani qo'shish.AICoopPlayer.cppda yangi funksiyani yozish.coopBuildStrategicDefenseni to'liq o'chirib, yangitdan "Toza Kod" bilan yozish.