示例#1
0
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();
		}
	}
}
示例#2
0
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;
	}
}
示例#3
0
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();
		}
	}
}
示例#4
0
void nofFarmhand::StartWalkingHome()
{
    state = STATE_WALKINGHOME;
    // Fahne vor dem Gebäude anpeilen
    dest = gwg->GetNeighbour(workplace->GetPos(), 4);

    // Zu Laufen anfangen
    WalkHome();
}
示例#5
0
void nofFarmhand::WalkedDerived()
{
    switch(state)
    {
        case STATE_WALKTOWORKPOINT: WalkToWorkpoint(); break;
        case STATE_WALKINGHOME: WalkHome(); break;
        default:
            break;
    }
}
示例#6
0
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();
}
示例#7
0
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();
}
示例#8
0
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;
	}
}
示例#9
0
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();
		}
	}
}