void nofHunter::HandleStateWalkingToCadaver() { // Sind wir schon da? if(animal->GetX() == x && animal->GetY() == y) { // dann ausnehmen state = STATE_HUNTER_EVISCERATING; current_ev = em->AddEvent(this,80,1); } else { // Weg dorthin suchen if((dir=gwg->FindHumanPath(x,y,animal->GetX(),animal->GetY(),6)) != 0xFF) { // Weg gefunden, dann hinlaufen StartWalking(dir); } else { // kein Weg gefunden --> nach Hause laufen StartWalkingHome(); WalkHome(); } } }
void nofHunter::AnimalLost() { animal = 0; switch(state) { default: return; case STATE_HUNTER_CHASING: case STATE_HUNTER_FINDINGSHOOTINGPOINT: case STATE_HUNTER_WALKINGTOCADAVER: { // nach Haue laufen StartWalkingHome(); } break; case STATE_HUNTER_SHOOTING: case STATE_HUNTER_EVISCERATING: { // Arbeits-Event abmelden em->RemoveEvent(current_ev); // Nach Hause laufen StartWalkingHome(); WalkHome(); } break; } }
void nofHunter::HandleStateFindingShootingPoint() { // Sind wir schon da und steht das Tier schon? if(shooting_x == x && shooting_y == y && animal->IsReadyForShooting()) { // dann schießen state = STATE_HUNTER_SHOOTING; current_ev = em->AddEvent(this,16,1); } else { // Weg dorthin suchen if((dir=gwg->FindHumanPath(x,y,shooting_x,shooting_y,6)) != 0xFF) { // Weg gefunden, dann hinlaufen StartWalking(dir); } else { // kein Weg gefunden --> nach Hause laufen StartWalkingHome(); WalkHome(); } } }
void nofFarmhand::StartWalkingHome() { state = STATE_WALKINGHOME; // Fahne vor dem Gebäude anpeilen dest = gwg->GetNeighbour(workplace->GetPos(), 4); // Zu Laufen anfangen WalkHome(); }
void nofFarmhand::WalkedDerived() { switch(state) { case STATE_WALKTOWORKPOINT: WalkToWorkpoint(); break; case STATE_WALKINGHOME: WalkHome(); break; default: break; } }
void nofFarmhand::StartWalkingHome() { state = STATE_WALKINGHOME; // Fahne vor dem Gebäude anpeilen dest_x = gwg->GetXA(workplace->GetX(), workplace->GetY(), 4); dest_y = gwg->GetYA(workplace->GetX(), workplace->GetY(), 4); // Zu Laufen anfangen WalkHome(); }
void nofHunter::HandleStateEviscerating() { // Tier verschwinden lassen gwg->RemoveFigure(animal,x,y); // Tier vernichten animal->Eviscerated(); animal->Destroy(); delete animal; animal = 0; // Fleisch in die Hand nehmen ware = GD_MEAT; // und zurück zur Hütte StartWalkingHome(); WalkHome(); }
void nofHunter::WalkedDerived() { switch(state) { default: break; case STATE_HUNTER_CHASING: { HandleStateChasing(); } break; case STATE_HUNTER_FINDINGSHOOTINGPOINT: { HandleStateFindingShootingPoint(); } break; case STATE_HUNTER_WALKINGTOCADAVER: { HandleStateWalkingToCadaver(); } break; case STATE_WALKINGHOME: { WalkHome(); } break; } }
void nofHunter::HandleStateChasing() { // Sind wir in der Nähe des Tieres? if(gwg->CalcDistance(x,y,animal->GetX(),animal->GetY()) < 7) { unsigned short animal_x, animal_y; // Dann bitten wir es mal, schonmal anzuhalten und bekommen seine Koordinaten, wo es dann steht animal->HunterIsNear(&animal_x,&animal_y); // Nun müssen wir drumherum einen Punkt suchen, von dem wir schießen, der natürlich direkt dem Standort // des Tieres gegenüberliegen muss (mit zufälliger Richtung beginnen) unsigned char doffset = RANDOM.Rand(__FILE__,__LINE__,obj_id,6); shooting_x = 0xFFFF; shooting_y = 0xFFFF; unsigned char d; for(d = 0;d<6;++d) { switch((d+doffset)%6) { case 0: { if(animal_x >= 4) { if(IsShootingPointGood(animal_x - 4,animal_y)) { shooting_x = animal_x - 4; shooting_y = animal_y; } } } break; case 1: { if(animal_x >= 2 && animal_y >= 4) { if(IsShootingPointGood(animal_x - 2,animal_y - 4)) { shooting_x = animal_x - 2; shooting_y = animal_y - 4; } } } break; case 2: { if(animal_x + 2 < gwg->GetWidth() && animal_y >= 4) { if(IsShootingPointGood(animal_x + 2,animal_y - 4)) { shooting_x = animal_x + 2; shooting_y = animal_y - 4; } } } break; case 3: { if(animal_x + 4 < gwg->GetWidth()) { if(IsShootingPointGood(animal_x + 4,animal_y)) { shooting_x = animal_x + 4; shooting_y = animal_y; } } } break; case 4: { if(animal_x + 2 < gwg->GetWidth() && animal_y + 4 < gwg->GetHeight()) { if(IsShootingPointGood(animal_x + 2,animal_y + 4)) { shooting_x = animal_x + 2; shooting_y = animal_y + 4; } } } break; case 5: { if(animal_x >= 2 && animal_y + 4 < gwg->GetHeight()) { if(IsShootingPointGood(animal_x - 2,animal_y + 4)) { shooting_x = animal_x - 2; shooting_y = animal_y + 4; } } } break; } // Wurde ein Punkt gefunden --> raus if(shooting_x != 0xFFFF) break; } // Wurde ein Punkt gefunden? if(shooting_x != 0xFFFF) { // Richtung, in die geschossen wird, bestimmen (natürlich die entgegengesetzte nehmen) shooting_dir = (d+doffset+3)%6; // dorthingehen state = STATE_HUNTER_FINDINGSHOOTINGPOINT; HandleStateFindingShootingPoint(); } else { // kein Punkt gefunden --> nach Hause gehen StartWalkingHome(); WalkHome(); } } else { // Weg dorthin suchen if((dir=gwg->FindHumanPath(x,y,animal->GetX(),animal->GetY(),MAX_HUNTING_DISTANCE)) != 0xFF) { // Weg gefunden, dann hinlaufen StartWalking(dir); } else { // kein Weg gefunden --> nach Hause laufen StartWalkingHome(); WalkHome(); } } }