Esempio n. 1
0
void doEntities(void)
{
	int numAllies, numEnemies;
	int numActiveAllies, numActiveEnemies;
	int numSpawnedEnemies;
	Entity *e, *prev;

	prev = &battle.entityHead;

	numAllies = numEnemies = numActiveAllies = numActiveEnemies = 0;

	if (dev.playerImmortal)
	{
		player->health = player->maxHealth;
		player->shield = player->maxShield;
	}

	for (e = battle.entityHead.next ; e != NULL ; e = e->next)
	{
		removeFromQuadtree(e, &battle.quadtree);

		if (dev.allImmortal)
		{
			e->health = e->maxHealth;
			e->shield = e->maxShield;
		}

		if (e->active)
		{
			self = e;

			e->reload = MAX(e->reload - 1, 0);

			if (e->shieldRechargeRate)
			{
				if (e->shield >= 0)
				{
					if (--e->shieldRecharge <= 0)
					{
						e->shield = MIN(e->shield + 1, e->maxShield);

						e->shieldRecharge = e->shieldRechargeRate;
					}
				}
				else
				{
					e->shield++;
				}
			}

			e->armourHit = MAX(e->armourHit - 25, 0);
			e->shieldHit = MAX(e->shieldHit - 5, 0);
			e->systemHit = MAX(e->systemHit - 25, 0);

			e->aiDamageTimer = MAX(e->aiDamageTimer - 1, 0);
			if (!e->aiDamageTimer)
			{
				e->aiDamagePerSec = 0;
				e->aiFlags &= ~AIF_EVADE;
			}

			switch (e->type)
			{
				case ET_FIGHTER:
					doFighter();
					break;

				case ET_CAPITAL_SHIP:
					doCapitalShip();
					break;

				default:
					doEntity();
					break;
			}

			if (e->alive == ALIVE_ALIVE || e->alive == ALIVE_DYING)
			{
				if (e->action != NULL)
				{
					if (dev.noEntityActions)
					{
						e->thinkTime = 2;
					}

					if (--e->thinkTime <= 0)
					{
						e->thinkTime = 0;
						e->action();
					}
				}
				
				doRope(e);
				
				restrictToBattleArea(e);
				
				if (!e->speed)
				{
					e->dx = e->dy = 0;
				}
				
				e->x += e->dx;
				e->y += e->dy;
				
				addToQuadtree(e, &battle.quadtree);
			}
			else
			{
				if (e == battle.entityTail)
				{
					battle.entityTail = prev;
				}

				if (e == battle.missionTarget)
				{
					battle.missionTarget = NULL;
				}

				if (e == player)
				{
					player = NULL;

					battle.playerSelect = battle.isEpic;
				}

				cutRope(e);

				prev->next = e->next;

				/* move to dead list */
				e->next = NULL;
				deadTail->next = e;
				deadTail = e;

				e = prev;
			}
		}

		if (e->type == ET_FIGHTER || e->type == ET_CAPITAL_SHIP)
		{
			if (e->side == SIDE_ALLIES)
			{
				numAllies++;

				if (e->health > 0 && e->active)
				{
					numActiveAllies++;
				}
			}
			else
			{
				numEnemies++;

				if (e->health > 0 && e->active)
				{
					numActiveEnemies++;
					
					if (e->spawned)
					{
						numSpawnedEnemies++;
					}
				}
			}
		}

		prev = e;
	}

	battle.numAllies = (battle.isEpic) ? numAllies : numActiveAllies;
	battle.numEnemies = (battle.isEpic) ? numEnemies : numActiveEnemies;

	if (battle.isEpic && battle.stats[STAT_TIME] % FPS == 0)
	{
		numActiveEnemies -= numSpawnedEnemies;
		
		if (numAllies > battle.epicFighterLimit)
		{
			activateEpicFighters(battle.epicFighterLimit - numActiveAllies, SIDE_ALLIES);
		}

		if (numEnemies > battle.epicFighterLimit)
		{
			activateEpicFighters(battle.epicFighterLimit - numActiveEnemies, SIDE_NONE);
		}
	}

	alignComponents();

	disabledGlow = MAX(DISABLED_GLOW_MIN, MIN(disabledGlow + disabledGlowDir, DISABLED_GLOW_MAX));

	if (disabledGlow <= DISABLED_GLOW_MIN)
	{
		disabledGlowDir = DISABLED_GLOW_SPEED;
	}
	else if (disabledGlow >= DISABLED_GLOW_MAX)
	{
		disabledGlowDir = -DISABLED_GLOW_SPEED;
	}
}
Esempio n. 2
0
File: daemon.cpp Progetto: spito/dp
bool Daemon::processControl( Channel channel ) {
    InputMessage message;
    channel->peek( message );
    auto cleanup = [&] {
        channel->receiveHeader( message );
    };

    Code code = message.tag< Code >();

    switch ( code ) {
    case Code::Enslave:
        enslave( message, std::move( channel ) );
        break;
    case Code::Disconnect:
        cleanup();
        release( std::move( channel ) );
        return false;
    case Code::Peers:
        startGrouping( message, std::move( channel ) );
        break;
    case Code::ConnectTo:
        connecting( message, std::move( channel ) );
        break;
    case Code::Join:
        join( message, std::move( channel ) );
        break;
    case Code::DataLine:
        addDataLine( message, std::move( channel ) );
        break;
    case Code::Grouped:
        cleanup();
        grouped( std::move( channel ) );
        break;
    case Code::InitialData:
        initData( message, std::move( channel ) );
        break;
    case Code::Run:
        run( message, std::move( channel ) );
        break;
    case Code::PrepareToLeave:
        cleanup();
        prepare( std::move( channel ) );
        break;
    case Code::CutRope:
        cleanup();
        cutRope( std::move( channel ) );
        break;
    case Code::Leave:
        cleanup();
        leave( std::move( channel ) );
        break;
    case Code::Error:
        cleanup();
        error( std::move( channel ) );
        break;
    case Code::Renegade:
        renegade( message, std::move( channel ) );
        break;
    case Code::Status:
        cleanup();
        status( std::move( channel ) );
        break;
    case Code::Shutdown:
        cleanup();
        shutdown( std::move( channel ) );
        break;
    case Code::ForceShutdown:
        cleanup();
        forceShutdown();
        break;
    case Code::ForceReset:
        cleanup();
        forceReset();
        return false;
    default:
        cleanup();
        throw ResponseException( {
            Code::Enslave,
            Code::Disconnect,
            Code::Peers,
            Code::ConnectTo,
            Code::Join,
            Code::DataLine,
            Code::Grouped,
            Code::InitialData,
            Code::Run,
            Code::PrepareToLeave,
            Code::Leave,
            Code::CutRope,
            Code::Error,
            Code::Renegade,
            Code::Shutdown,
            Code::ForceShutdown,
            Code::ForceReset,
        }, code );
        break;
    }
    return true;
}