Пример #1
0
void CKAIK::UnitIdle(int unitID) {
	if (ai->Initialized()) {
		if (ai->GetUnit(unitID)->isDead) {
			return;
		}

		if (ai->uh->lastCapturedUnitFrame == ai->cb->GetCurrentFrame()) {
			if (unitID == ai->uh->lastCapturedUnitID) {
				// KLOOTNOTE: for some reason this also gets called when one
				// of our units is captured (in the same frame as, but after
				// HandleEvent(AI_EVENT_UNITCAPTURED)), *before* the unit has
				// actually changed teams (ie. for any unit that is no longer
				// on our team but still registers as such)
				ai->uh->lastCapturedUnitFrame = -1;
				ai->uh->lastCapturedUnitID = -1;
				return;
			}
		}

		// AttackHandler handles cat_g_attack units
		if (GCAT(unitID) == CAT_G_ATTACK && ai->GetUnit(unitID)->groupID != -1) {
			// attackHandler->UnitIdle(unit);
		} else {
			ai->uh->IdleUnitAdd(unitID, ai->cb->GetCurrentFrame());
		}
	}
}
Пример #2
0
void CEconomyTracker::UnitFinished(int unit) {
	if (trackerOff)
		return;

	const int frame = ai->cb->GetCurrentFrame();
	const UnitDef* unitDef = ai->cb->GetUnitDef(unit);

	if (unitDef == NULL || CUNIT::IsCommander(unitDef) || unitDef->canDGun) {
		// add the commander to an EconomyUnitTracker
		EconomyUnitTracker * economyUnitTracker = new EconomyUnitTracker;
		economyUnitTracker->clear();
		economyUnitTracker->economyUnitId = unit;
		economyUnitTracker->createFrame = frame;
		economyUnitTracker->alive = true;
		economyUnitTracker->category = GCAT(unit);
		economyUnitTracker->unitDef = unitDef;
		SetUnitDefDataInTracker(economyUnitTracker);
		newEconomyUnitTrackers.push_back(economyUnitTracker);
		return;
	}

	// move the new EconomyUnitTrackers
	bool found = false;
	std::list<EconomyUnitTracker*> removeList;
	for (std::list<EconomyUnitTracker*>::iterator i = underConstructionEconomyUnitTrackers.begin(); i != underConstructionEconomyUnitTrackers.end(); i++) {
		EconomyUnitTracker *bt = *i;
		if (bt->economyUnitId == unit) {
			 bt->createFrame = frame;
			assert(bt->alive);
			newEconomyUnitTrackers.push_back(bt);
			removeList.push_back(bt);
			found = true;
			break;
		}
	}

	assert(found);
	// remove them from underConstructionEconomyUnitTrackers
	for (std::list<EconomyUnitTracker*>::iterator i = removeList.begin(); i != removeList.end(); i++) {
		underConstructionEconomyUnitTrackers.remove(*i);
	}

	UnitCategory category = ai->ut->GetCategory(unit);
	found = false;

	if (category != CAT_LAST) {
		for (std::list<BuildingTracker>::iterator i = allTheBuildingTrackers[category].begin(); i != allTheBuildingTrackers[category].end(); i++) {
			BuildingTracker* bt = &*i;
			if (bt->unitUnderConstruction == unit) {
				updateUnitUnderConstruction(bt);
				found = true;
				allTheBuildingTrackers[category].erase(i);
				break;
			}
		}
		if (!found) {
			// unit not in a BuildingTracker?
		}
	}
}
Пример #3
0
void CGlobalAI::UnitFinished(int unit) {
    ai->econTracker->UnitFinished(unit);
    int frame = ai->cb->GetCurrentFrame();
    const UnitDef* udef = ai->cb->GetUnitDef(unit);

    if (udef) {
        // let attackhandler handle cat_g_attack units
        if (GCAT(unit) == CAT_G_ATTACK) {
            ai->ah->AddUnit(unit);
        } else {
            ai->uh->IdleUnitAdd(unit, frame);
        }

        ai->uh->BuildTaskRemove(unit);
    }
}
Пример #4
0
void CKAIK::UnitFinished(int unitID) {
	if (ai->Initialized()) {
		ai->econTracker->UnitFinished(unitID);

		if (ai->cb->GetUnitDef(unitID) != NULL) {
			// let attackhandler handle cat_g_attack units
			if (GCAT(unitID) == CAT_G_ATTACK) {
				ai->ah->AddUnit(unitID);
			} else {
				ai->uh->IdleUnitAdd(unitID, ai->cb->GetCurrentFrame());
			}

			ai->uh->BuildTaskRemove(unitID);
		}
	}
}
Пример #5
0
void CGlobalAI::UnitIdle(int unit) {
    ai -> math -> StartTimer(totalSumTime);
    ai -> math -> StartTimer(globalAILogTime);
    L("Idle: " << unit);
    ai -> math -> StopTimer(globalAILogTime);
    ai -> math -> StartTimer(unitIdleTime);
    ai -> econTracker -> frameUpdate();

    // attackhandler handles cat_g_attack units atm
    if (GCAT(unit) == CAT_G_ATTACK && ai -> MyUnits.at(unit) -> groupID != -1) {
        // attackHandler -> UnitIdle(unit);
    }
    else {
        ai -> uh -> IdleUnitAdd(unit);
    }
    ai -> math -> StopTimer(unitIdleTime);
    ai -> math -> StopTimer(totalSumTime);
}
Пример #6
0
int CUNIT::category()
{
	return GCAT(myid);
}
float CDamageControl::GetCurrentDamageScore(const UnitDef* unit)
{
	//L("Getting CombatScore for : " << unit->humanName << " number of units: " << NumOfUnitTypes);
	float score = 0;
	int category = GCAT(unit); 
	bool foundaunit = false;
	if(category == CAT_ATTACK || category == CAT_ARTILLERY || category == CAT_ASSAULT){
		for(int i = 1; i <= NumOfUnitTypes; i++){
			if(TheirUnitsAll[i].Cost > 0 && ai->ut->unittypearray[unit->id].DPSvsUnit[i] > 0 && ai->ut->unittypearray[i].AverageDPS > 0){
				//L("unit->id: " << unit->id << " I: " << i);
				//L("DPSvsUnit[i] " << ai->ut->unittypearray[unit->id].DPSvsUnit[i] << " TheirUnitsAll[i].Cost " << TheirUnitsAll[i].Cost);
				score+= ai->ut->unittypearray[unit->id].DPSvsUnit[i] * TheirUnitsAll[i].Cost / TheirUnitsAll[i].Hitpoints / (MyArmy[i].Damage + 1); // kill the stuff with the best value
				//L("Score:" << score);
				//score+= 0; // This was for making a debug brakepoint
				foundaunit = true;
			}
		}
		if(!foundaunit){ // if nothing found try to kill his movable units (comm and builders)
			for(int i = 1; i <= NumOfUnitTypes; i++){
				if(TheirUnitsAll[i].Cost > 0 && ai->ut->unittypearray[unit->id].DPSvsUnit[i] > 0 && ai->ut->unittypearray[i].def->speed > 0){
					score+= ai->ut->unittypearray[unit->id].DPSvsUnit[i] * TheirUnitsAll[i].Cost / TheirUnitsAll[i].Hitpoints / (MyArmy[i].Damage + 1); // kill the stuff with the best value
					foundaunit = true;
				}
			}
		}
		if(!foundaunit){ // if all fails just get whatever hes got and try to hit it
			for(int i = 1; i <= NumOfUnitTypes; i++){
				if(TheirUnitsAll[i].Cost > 0 && ai->ut->unittypearray[unit->id].DPSvsUnit[i] > 0){
					score+= ai->ut->unittypearray[unit->id].DPSvsUnit[i] * TheirUnitsAll[i].Cost / TheirUnitsAll[i].Hitpoints / (MyArmy[i].Damage + 1); // kill the stuff with the best value
				}
			}
		}
	}
	else if(category == CAT_DEFENCE){
		for(int i = 1; i <= NumOfUnitTypes; i++){
			if(TheirArmy[i].Cost > 0 && ai->ut->unittypearray[unit->id].DPSvsUnit[i] > 0 && (ai->ut->unittypearray[i].category == CAT_ATTACK || ai->ut->unittypearray[i].category == CAT_ARTILLERY || ai->ut->unittypearray[i].category == CAT_ASSAULT)){
				//L("unit->id: " << unit->id << " I: " << i);
				//L("DPSvsUnit[i] " << ai->ut->unittypearray[unit->id].DPSvsUnit[i] << " TheirUnitsAll[i].Cost " << TheirUnitsAll[i].Cost);
				score+= ai->ut->unittypearray[unit->id].DPSvsUnit[i] * TheirArmy[i].Cost / TheirArmy[i].Hitpoints / (MyDefences[i].Damage + 1); // kill the stuff with the best value
				//L("Score:" << score);
				//score+= 0; // This was for making a debug brakepoint
				foundaunit = true;				
			}
		}
		if(!foundaunit){ // if nothing found try to kill his movable units (comm and builders)
			for(int i = 1; i <= NumOfUnitTypes; i++){
				if(TheirUnitsAll[i].Cost > 0 && ai->ut->unittypearray[unit->id].DPSvsUnit[i] > 0 && ai->ut->unittypearray[i].def->speed > 0){
					score+= ai->ut->unittypearray[unit->id].DPSvsUnit[i] * TheirUnitsAll[i].Cost / TheirUnitsAll[i].Hitpoints / (MyArmy[i].Damage + 1); // kill the stuff with the best value
					foundaunit = true;
				}
			}
		}
		if(!foundaunit){ // if all fails just get whatever hes got and try to hit it
			for(int i = 1; i <= NumOfUnitTypes; i++){
				if(TheirUnitsAll[i].Cost > 0 && ai->ut->unittypearray[unit->id].DPSvsUnit[i] > 0){
					score+= ai->ut->unittypearray[unit->id].DPSvsUnit[i] * TheirUnitsAll[i].Cost / TheirUnitsAll[i].Hitpoints / (MyArmy[i].Damage + 1); // kill the stuff with the best value
				}
			}
		}
	}

	//L(" score " << score << " TheirTotalCost " << TheirTotalCost);
	if (TheirTotalArmyCost <= 0)
		return 1;
	if (category == CAT_ATTACK || category == CAT_ARTILLERY || category == CAT_ASSAULT) {
		return score / TheirTotalArmyCost / (TheirUnitsAll[unit->id].Damage + 1);
	}

	else if (category == CAT_DEFENCE) {
		return score / TheirTotalArmyCost / (TheirArmy[unit->id].Damage + 1);
	}
	L("***** Getdamagescore Error! *****");
	return 1;
}
Пример #8
0
void CEconomyTracker::UnitCreated(int unitID) {
	if (trackerOff) {
		return;
	}

	const int frame = ai->cb->GetCurrentFrame();
	const UnitDef* unitDef = ai->cb->GetUnitDef(unitID);

	const bool iscommander = CUNIT::IsCommander(unitDef);

	if (unitDef == NULL || iscommander || unitDef->canDGun) {
		// ignore the commander
		return;
	}


	EconomyUnitTracker* economyUnitTracker = new EconomyUnitTracker;
	economyUnitTracker->clear();
	economyUnitTracker->economyUnitId = unitID;
	economyUnitTracker->createFrame = -frame;
	economyUnitTracker->alive = true;
	economyUnitTracker->category = GCAT(unitID);
	economyUnitTracker->unitDef = unitDef;

	SetUnitDefDataInTracker(economyUnitTracker);
	underConstructionEconomyUnitTrackers.push_back(economyUnitTracker);


	// find it (slow++)
	int  catIdx = int(CAT_COMM);
	bool found  = false;

	for (; catIdx < int(CAT_LAST); catIdx++ ) {
		std::list<BuildTask>::iterator i;

		for (i = ai->uh->BuildTasks[catIdx].begin(); i != ai->uh->BuildTasks[catIdx].end(); i++) {
			BuildTask bt = *i;

			if (bt.id == unitID) {
				// add this new unit to the list
				BuildingTracker tracker;
				tracker.clear();
				tracker.economyUnitTracker = economyUnitTracker;
				tracker.buildTask = true;
				tracker.category = UnitCategory(catIdx);
				tracker.unitUnderConstruction = unitID;
				allTheBuildingTrackers[catIdx].push_front(tracker);
				found = true;
				break;
			}
		}
	}

	if (!found) {
		// it is made by a factory
		float3 unitPos = ai->cb->GetUnitPos(unitID);
		UnitCategory category = GCAT(unitID);

		for (std::list<Factory>::iterator i = ai->uh->Factories.begin(); i != ai->uh->Factories.end(); i++) {
			Factory factory = *i;
			int factoryId = factory.id;
			// bad, no easy way to get the factory of the unit
			float3 factoryPos = ai->cb->GetUnitPos(factoryId);
			float distance = factoryPos.distance2D(unitPos);

			if (distance < 100.0f) {
				BuildingTracker tracker;
				tracker.clear();
				tracker.economyUnitTracker = economyUnitTracker;
				tracker.category = category;
				tracker.unitUnderConstruction = unitID;
				tracker.factory = factoryId;
				allTheBuildingTrackers[category].push_front(tracker);
				found = true;
				break;
			}
		}
	}

	// unit constructor not found?!
	// assert(found);
}
void CEconomyTracker::UnitFinished(int unit)
{
    if(trackerOff)
        return;
    int frame=ai->cb->GetCurrentFrame();

    if(frame == 0)
    {
        // Add the commander to a EconomyUnitTracker
        EconomyUnitTracker * economyUnitTracker = new EconomyUnitTracker;
        economyUnitTracker->clear();
        economyUnitTracker->economyUnitId = unit;
        economyUnitTracker->createFrame = frame;
        economyUnitTracker->alive = true;
        economyUnitTracker->category = GCAT(unit);
        economyUnitTracker->unitDef = ai->cb->GetUnitDef(unit);
        SetUnitDefDataInTracker(economyUnitTracker);
        newEconomyUnitTrackers.push_back(economyUnitTracker);
        return;
    }

    // Move the new EconomyUnitTrackers
    bool found = false;
    list<EconomyUnitTracker*> removeList;
    for(list<EconomyUnitTracker*>::iterator i = underConstructionEconomyUnitTrackers.begin(); i != underConstructionEconomyUnitTrackers.end(); i++) {
        EconomyUnitTracker *bt = *i; // This is bad, but needed
        if(bt->economyUnitId == unit)
        {
            bt->createFrame = frame;
            // Move it to the new list
            assert(bt->alive);
            newEconomyUnitTrackers.push_back(bt);
            removeList.push_back(bt);
            //L("Moved "  << bt->unitDef->humanName << " to newEconomyUnitTrackers");
            found = true;
            break;
        }
    }
    assert(found);
    // Remove them from underConstructionEconomyUnitTrackers:
    for(list<EconomyUnitTracker*>::iterator i = removeList.begin(); i != removeList.end(); i++) {
        underConstructionEconomyUnitTrackers.remove(*i);
    }

    //L("Finished a " << ai->cb->GetUnitDef(unit)->humanName);
    int category = ai->ut->GetCategory(unit);
    found = false;
    if(category != -1)
        for(list<BuildingTracker>::iterator i = allTheBuildingTrackers[category]->begin(); i != allTheBuildingTrackers[category]->end(); i++) {
            BuildingTracker *bt = &*i;
            if(bt->unitUnderConstruction == unit)
            {
                updateUnitUnderConstruction(bt);
                found = true;
                allTheBuildingTrackers[category]->erase(i);
                break;
            }
        }
    if(!found) {
        //L("This unit was not in a BuildingTracker!!!!!!!!!");
    }
}
void CEconomyTracker::UnitCreated(int unit)
{
    if(trackerOff)
        return;
    int frame=ai->cb->GetCurrentFrame();
    if(frame == 0)
    {
        // Ignore the commander
        return;
    }

    EconomyUnitTracker * economyUnitTracker = new EconomyUnitTracker;
    economyUnitTracker->clear();
    economyUnitTracker->economyUnitId = unit;
    economyUnitTracker->createFrame = -frame;
    economyUnitTracker->alive = true;
    economyUnitTracker->category = GCAT(unit);
    economyUnitTracker->unitDef = ai->cb->GetUnitDef(unit);
    SetUnitDefDataInTracker(economyUnitTracker);
    underConstructionEconomyUnitTrackers.push_back(economyUnitTracker);


    //L("Started to make an " << ai->cb->GetUnitDef(unit)->humanName);
    // Find it (slow++)
    bool found = false;
    for(int category = 0; category < LASTCATEGORY; category++ )
    {
        for(list<BuildTask>::iterator i = ai->uh->BuildTasks[category]->begin(); i != ai->uh->BuildTasks[category]->end(); i++) {
            BuildTask bt = *i;
            if(bt.id == unit)
            {
                // Add this new unit to the list
                BuildingTracker tracker;
                tracker.clear();
                tracker.economyUnitTracker = economyUnitTracker;
                tracker.buildTask = true;
                tracker.category = category;
                tracker.unitUnderConstruction = unit;
                allTheBuildingTrackers[category]->push_front(tracker);
                found = true;
                break;
            }
        }
    }
    if(!found)
    {
        // It is made by a factory
        float3 unitPos = ai->cb->GetUnitPos(unit);
        int category = GCAT(unit);
        for(list<Factory>::iterator i = ai->uh->Factories.begin(); i != ai->uh->Factories.end(); i++) {
            Factory factory = *i;
            int factoryId = factory.id;
            // This is bad, no easy way to get the factory of the unit...
            float3 factoryPos = ai->cb->GetUnitPos(factoryId);
            float distance = factoryPos.distance2D(unitPos);
            //L("factory distance: " << distance);
            if(distance < 100)
            {
                BuildingTracker tracker;
                tracker.clear();
                tracker.economyUnitTracker = economyUnitTracker;
                tracker.category = category;
                tracker.unitUnderConstruction = unit;
                tracker.factory = factoryId;
                allTheBuildingTrackers[category]->push_front(tracker);
                found = true;
                break;
            }
        }
    }
    if(!found) {
        //L("Unit constructor not found !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }
    /*
    float EProductionNeed = unit->energyCost - ai->cb->GetEnergy();//ai->cb->GetEnergy() - unit->energyCost;
    float EProduction = ai->cb->GetEnergyIncome() - ai->cb->GetEnergyUsage();
    if(EProduction < 1)
    	EProduction = 1;
    ////L("EProductionNeed: " << EProductionNeed);
    ////L("EProduction: " << EProduction);
    float MProductionNeed = unit->metalCost - ai->cb->GetMetal();//ai->cb->GetMetal() - unit->metalCost;
    float MProduction = ai->cb->GetMetalIncome() - ai->cb->GetMetalUsage();
    if(MProduction < 1)
    	MProduction = 1;
    ////L("MProductionNeed: " << MProductionNeed);
    ////L("MProduction: " << MProduction);
    float timeToBuild = max (EProductionNeed / EProduction, MProductionNeed / MProduction);
    if(timeToBuild < 1)
    	timeToBuild = 1; // It can be built right now...  Make something more costly instead?
    ////L("timeToBuild: " << timeToBuild);
    //float METAL2ENERGY_current = ai->cb->GetEnergy() (ai->cb->GetEnergyIncome()*0.9 - ai->cb->GetEnergyUsage())
    //float buildtime = //unit->buildTime / builder->buildSpeed;
    // Take the buildtime, and use it smart.
    // Make a ratio of unit->buildTime / timeToBuild ???:
    // This realy needs to know its creators build speed.
    float buildTimeRatio =  unit->buildTime / timeToBuild;
    ////L("buildTimeRatio: " << buildTimeRatio);
    float buildTimeFix = unit->buildTime / 100;
    */
}