예제 #1
0
void AttackAspect::step(GameState & gs, float deltaT) {
	// handle attack for all players

	std::list<PlayerEntity*> playerFakeList;

	auto hitEnemy =
			[ &gs ]( PlayerEntity * attacker, EnemyEntity * enemy, PlayerData * player, Vector2 const& conVector ) {
				enemy->getHitAction().activate(EnemyBehaviour::HitTime);
				// move slightly back
				// todo: this kick direction looks a bit strange
				//auto kickBack = conVector * PlayerMovement::HitKickBackFactor;
				//auto kickForce = conVector * 3000.0f;
				//enemy->setMoveDelta(kickBack);
				auto conVectorNorm = conVector.normalizedCopy();
				enemy->setDirection(-conVectorNorm);

				// does not look so good
				//enemy->getRigidBody()->applyCentralImpulse( Vector3( kickForce.x(), kickForce.y(), 0.0f) );
				enemy->activateLastHit();

				EntityFactory fact( gs.getEngines());
				//fact.createPunchParticles( enemy->getPosition(), conVector.normalizedCopy() );
				auto newEnts = fact.createPunchParticlesTex < BloodEntity > ( enemy->getPosition(), conVector.normalizedCopy() );
				//const float bloodSpeed = 5.0f;
				for ( auto & e: newEnts ) {
					gs.addFragment( std::move(e) );

				}

				logging::Info() << "Enemy player hit";
				gs.getEngines().soundEngine().startVibratePattern( VibratePatterns().EnemyPunched );
				if ( attacker->getBikingAction().isActive())
				{
					enemy->subtractLife( 127);
				} else {
					enemy->subtractLife( PlayerMovement::KickSubtractLife );
				}

				logging::Info() << "Enemy has " << enemy->getLife() << " life left";

				if ( enemy->getLife() < 0)
				{
					logging::Info() << "Enemy died";
					enemy->die( );
					enemy->updateVisual( gs.getEngines() );

					gs.slotEnemyDied.signal(gs, player->Id, enemy);
					gs.increaseScore( player->Id, GameRules::PointsForKill );
				}

				if( attacker->getBikingAction().isActive() )
				attacker->getBikingAction().setProcessed();
				if( attacker->getKickAction().isActive() )
				attacker->getKickAction().setProcessed();
			};

	for (PlayerData & pd : gs.getPlayers()) {
		PlayerEntity * pent = pd.Entity;

		if (pent == nullptr)
			continue;

		// check if the player kicks and whether there is an enemy close by
		if ((pent->getKickAction().isActive()
				&& !pent->getKickAction().wasProcessed())
				|| (pent->getBikingAction().isActive()
						&& !pent->getBikingAction().wasProcessed())) {

			attackOnList(pent, gs.getEnemies(), hitEnemy, &pd,
					PlayerMovement::AttackAngle,
					PlayerMovement::AttackRangeSquared, EnemyBehaviour::HitTime,
					PlayerMovement::KickAffectCount);

		}

		playerFakeList.push_back(pent);
	}

	auto hitOnPlayer =
			[]( EnemyEntity * attacker, PlayerEntity * enemy, PlayerData * player, Vector2 const& conVector ) {
				//enemy->getHitAction().activate(EnemyBehaviour::HitTime);
				// move slightly back
				// todo: this kick direction looks a bit strange
				/*auto kickBack = conVector * 0.25f;
				 enemy->setMoveDelta(kickBack);
				 auto conVectorNorm = conVector.normalizedCopy();
				 enemy->setDirection(-conVectorNorm);*/
			};

	// checks for enemies hitting player
	for (auto * enemy : gs.getEnemies()) {
		if (enemy->getKickAction().isActive()
				&& !enemy->getKickAction().wasProcessed()) {


			attackOnList(enemy, playerFakeList, hitOnPlayer, nullptr,
					PlayerMovement::AttackAngle,
					PlayerMovement::AttackRangeSquared, EnemyBehaviour::HitTime,
					1);
			enemy->getKickAction().setProcessed();
		}
	}

	/*for (auto & enemy : gs.getEnemies()) {
	 if (enemy->getHitAction().isActive())
	 continue;
	 auto conVector = enemy->getPosition() - gs.getPlayerEntity()->getPosition();

	 if (conVector.magSquared() < PlayerMovement::AttackRangeSquared) {
	 // check for correction direction
	 const Vector2 conVec = enemy->getPosition() - gs.getPlayerEntity()->getPosition();
	 const float angle = Vector2::angleBetween(conVec, gs.getPlayerEntity()->getDirection());
	 if (angle < PlayerMovement::AttackAngle) {

	 enemy->getHitAction().activate(EnemyBehaviour::HitTime);
	 // move slightly back

	 // could be made delayed
	 // todo: this kick direction looks a bit strange
	 auto kickBack = conVector * 0.55f;
	 enemy->setMoveDelta(kickBack);
	 auto conVectorNorm = conVector.normalizedCopy();
	 enemy->setDirection(-conVectorNorm);

	 //enemy->changeActiveVisual(gs.getEngines(), DescentTextureIds::Hit_0);
	 }
	 }
	 }*/

}