示例#1
0
void AUModCharacter::DamagePlayer(int32 force)
{
    if (Role != ROLE_Authority) {
        return;
    }

    uint32 a = (uint32)force;

    if (playerHealth > a) {
        playerHealth -= a;
    } else if (playerHealth == a) {
        KillPlayer();
    } else if (playerHealth < a) {
        KillPlayer();
    }
}
void game_sv_TeamDeathmatch::OnPlayerChangeTeam(ClientID id_who, s16 team)
{
    game_PlayerState*	ps_who	=	get_id	(id_who);
    if (!ps_who) return;
    if (!team)
    {
        if (!ps_who->team)
            team = AutoTeam();
        else if (TeamSizeEqual())
        {
            team = ps_who->team;
        }
        else
        {
            team = AutoTeam();
        }
    };
    //-----------------------------------------------------
    NET_Packet Px;
    GenerateGameMessage(Px);
    Px.w_u32(GAME_EVENT_PLAYER_GAME_MENU_RESPOND);
    Px.w_u8(PLAYER_CHANGE_TEAM);
    Px.w_s16(team);
    m_server->SendTo(id_who,Px,net_flags(TRUE,TRUE));
    //-----------------------------------------------------
    if (ps_who->team == team) return;
    //-----------------------------------------------------
    KillPlayer(id_who, ps_who->GameID);
    //-----------------------------------------------------
    ps_who->setFlag(GAME_PLAYER_FLAG_SPECTATOR);
    //-----------------------------------------------------
    s16 OldTeam = ps_who->team;
    ps_who->team = u8(team & 0x00ff);
    TeamStruct* pTS = GetTeamData(team);
    if (pTS)
    {
        if ((ps_who->money_for_round < pTS->m_iM_Start) || (OldTeam == 0))
            Money_SetStart(id_who);
    }

/////////////////////////////////////////////////////////
    //Send Switch team message
    NET_Packet			P;
//	P.w_begin			(M_GAMEMESSAGE);
    GenerateGameMessage (P);
    P.w_u32				(PLAYER_CHANGE_TEAM);
    P.w_u16				(ps_who->GameID);
    P.w_u16				(ps_who->team);
    P.w_u16				(team);
    u_EventSend(P);
/////////////////////////////////////////////////////////



    SetPlayersDefItems(ps_who);

}
void game_sv_CaptureTheArtefact::OnEvent(NET_Packet & tNetPacket, u16 type, u32 time, ClientID sender )
{
	switch	(type)
	{
	case GAME_EVENT_PLAYER_KILL:
		{
			u16				ID = tNetPacket.r_u16();
			xrClientData*	l_pC = (xrClientData*)get_client(ID);
			if (!l_pC)
				break;

			KillPlayer		(l_pC->ID, l_pC->ps->GameID);
		}break;
	case GAME_EVENT_PLAYER_BUY_FINISHED:
		{
			xrClientData* l_pC = m_server->ID_to_client(sender);
			OnPlayerBuyFinished(l_pC->ID, tNetPacket);
		}break;
	case GAME_EVENT_PLAYER_ENTER_TEAM_BASE:
		{
			u16 pl_id = tNetPacket.r_u16();
			//warning, in editor green team zone has 1 id, blue team zone has id 2
			u8 z_t_id = tNetPacket.r_u8();
			z_t_id--; // :( !!!
			OnObjectEnterTeamBase(pl_id, z_t_id);
		}break;

	case GAME_EVENT_PLAYER_LEAVE_TEAM_BASE:
		{
 			u16 pl_id = tNetPacket.r_u16();
			u8 z_t_id = tNetPacket.r_u8();
			z_t_id--;						// :( !!!
			OnObjectLeaveTeamBase(pl_id, z_t_id);
		}break;
	default:
		inherited::OnEvent(tNetPacket, type, time, sender);
	};//switch
}
示例#4
0
static s32 CalcCrow( struct TaskData* pTask , u32 Flag ) {
	int dx = pTask->x - g_PlayerX;
	int dy = pTask->y - g_PlayerY -g_OffsetY + 275;



	if(dx*dx>512*512) return 0;	//遠すぎる場合はすぐ終了

	pTask->Data.crow.count += 1;
	if(pTask->Data.crow.count>=60){
        // 弾発射
          struct TaskData* pBTask;
          pBTask = AllocTask();
          if (pBTask != NULL) {
			  InitTaskEBullet( pBTask , pTask->x, pTask->y, AG_RP_OBJ_EBULLET,0, 5, 0,0 );
            AddlLink( pBTask , DISP_LEVEL_EBULLET );
        };
		pTask->Data.crow.count = 0;
		ageSndMgrPlayOneshot( AS_SND_CROW , 0 , 0x80 , AGE_SNDMGR_PANMODE_LR12 , 0x80 , 0 );

	};
	if(pTask->Data.crow.count % 20 == 0){
		pTask->Data.crow.mode += 1;
		pTask->Data.crow.mode %= 3;
	};
	//移動
	{
		int ax = (int)(-dx*0.01 - pTask->Data.crow.vx*0.04);
		int ay = (int)(-dy*0.01 - pTask->Data.crow.vy*0.04);
		if(ax==0){
			if(dx>0)ax = -1;
			else if(dx<0)ax = 1;
		}
		pTask->Data.crow.vx += ax;
		pTask->Data.crow.vy += ay;
	
	if(pTask->Data.crow.vx==0){
		if(dx>0)pTask->Data.crow.vx = -1;
		else if(dx<0)pTask->Data.crow.vx = 1;
	}
	pTask->x += pTask->Data.crow.vx;
	pTask->y += pTask->Data.crow.vy;
	}

  // 自機の弾の判定
  {
    struct TaskData* pBTask;
    pBTask = GetDispLink( DISP_LEVEL_PBULLET );
    while ( pBTask != NULL ) {
      if (pBTask->type == TASK_PBULLET) {
        if ( (pTask->x - pBTask->x) * (pTask->x - pBTask->x) + (pTask->y - pBTask->y) * (pTask->y - pBTask->y) < 50*50) {
          struct TaskData* pATask;

          pATask = AllocTask();
          InitTaskAttack( pATask , pTask->x , pTask->y );
          AddlLink( pATask , DISP_LEVEL_ATTACK );

          pTask->visible = 0;
          pTask->flag = TASK_FLAG_DESTROY;

          AddScore( pTask->Data.crow.score );

          pBTask->visible = 0;
          pBTask->flag = TASK_FLAG_DESTROY;
          break;
        }
      }

      pBTask = pBTask->Next;
    }
  }

  // 自機との判定
  if ( (pTask->x - g_PlayerX) * (pTask->x - g_PlayerX) + (pTask->y - 28 - g_PlayerY ) * (pTask->y - 28 - g_PlayerY ) < 60*60) {
  //if ( g_pPlayerRect != NULL && HitCrow(pTask, g_pPlayerRect) ) {
    KillPlayer( g_pPlayerTask );
  }

	return( 0 );
}
void ATotemCharacter::ReduceHealth(float damage, ATotemPlayerController* player, AbilityType type, FName abilityName)
{
	if (PlayerHealth > 0 && HasAuthority() && !bInvincible)
	{
		PlayerHealth -= damage * DamageScale;


		ATotemCharacter* character = nullptr;

		if (type != AbilityType::NONE && type != AbilityType::End && player)
		{
			character = Cast<ATotemCharacter>(player->AcknowledgedPawn);
			PreviousHit.controller = player;
			PreviousHit.name = abilityName;
			PreviousHit.type = type;
			TimeSinceHit = InstigKillTimer;
		}
		else if (PlayerHealth <= 0)
		{
#if WRITE_METRICS
			ATotemPlayerController* control = Cast<ATotemPlayerController>(Controller);
			if (control)
			{
				ATotemPlayerState* state = Cast<ATotemPlayerState>(control->PlayerState);
				std::string team;
				switch (state->Team)
				{
				case ETeam::RED_TEAM:
					team = "Red";
					break;
				case ETeam::BLUE_TEAM:
					team = "Blue";
					break;
				default:
					team = "None";
					break;
				}
				Metrics::WriteToFile(std::string(TCHAR_TO_UTF8(*(state->MyName))), team, std::string("Died in lava"), std::string(), std::string(), std::string("Probably"));
				state->NumOfDie += 1;
			}
#endif
		}

		if (PlayerHealth <= 0)
		{
			PlayerHealth = 0;
			if (character)
			{
#if WRITE_METRICS
				if (type != AbilityType::NONE && type != AbilityType::End)
				{
					ATotemPlayerController* control = Cast<ATotemPlayerController>(Controller);
					if (control)
					{
						ATotemPlayerState* state = Cast<ATotemPlayerState>(control->PlayerState);
						ATotemPlayerState* attackerState = Cast<ATotemPlayerState>(player->PlayerState);
						if (state && attackerState)
						{
							std::string team;
							std::string attackerTeam;
							switch (state->Team)
							{
							case ETeam::RED_TEAM:
								team = "Red";
								break;
							case ETeam::BLUE_TEAM:
								team = "Blue";
								break;
							default:
								team = "None";
								break;
							}
							switch (attackerState->Team)
							{
							case ETeam::RED_TEAM:
								attackerTeam = "Red";
								break;
							case ETeam::BLUE_TEAM:
								attackerTeam = "Blue";
								break;
							default:
								attackerTeam = "None";
								break;
							}
							Metrics::WriteToFile(std::string(TCHAR_TO_UTF8(*(attackerState->MyName))), attackerTeam, std::string("Killed"), std::string(TCHAR_TO_UTF8(*(state->MyName))), team, std::string("Using: " + std::string(TCHAR_TO_UTF8(*(abilityName.ToString())))));
							// Player statistics part
							state->NumOfDie += 1;
							// Prevent count friendly kill
							if (team != attackerTeam)
							{
								attackerState->NumOfKill += 1;
							}							
						}
					}
				}
#endif
				ATotemPlayerController* controller = Cast<ATotemPlayerController>(GetController());
				if (controller && controller != player)
				{
					character->DealtDamageTo(nullptr, controller, player, true);
				}
			}
			else if (PreviousHit.controller)
			{
				////Tell controller to count the kill
				//ATotemCharacter* character = Cast<ATotemCharacter>(PreviousHit.controller->GetPawn());
				//if (character)
				//{
				//	ATotemPlayerController* controller = Cast<ATotemPlayerController>(GetController());
				//	if (controller)
				//	{
				//		character->DealtDamageTo(nullptr, controller, PreviousHit.controller, true);
				//	}
				//}
				//else
				//{
				//	//TODO: update score on the controller if previous hit player died in the meantime
				//}
				DeathToLava(PreviousHit.controller, PreviousHit.type);
				// Add kill and dead statistics, hopefully it will work
				ATotemPlayerState* AttackerState = Cast<ATotemPlayerState>(PreviousHit.controller->PlayerState);				
				if (Controller)
				{
					ATotemPlayerController* VictimController = Cast<ATotemPlayerController>(Controller);
					if (VictimController)
					{
						ATotemPlayerState* VictimState = Cast<ATotemPlayerState>(Controller->PlayerState);
						if (VictimState)
						{
							VictimState->NumOfDie += 1;
							if (AttackerState)
							{
								if (AttackerState->Team != VictimState->Team)
								{
									AttackerState += 1;
								}
							}
						}
					}
				}
				
#if WRITE_METRICS
				ATotemPlayerController* control = Cast<ATotemPlayerController>(Controller);
				if (control)
				{
					ATotemPlayerState* state = Cast<ATotemPlayerState>(control->PlayerState);
					ATotemPlayerState* attackerState = Cast<ATotemPlayerState>(PreviousHit.controller->PlayerState);
					if (state && attackerState)
					{
						std::string team;
						std::string attackerTeam;
						switch (state->Team)
						{
						case ETeam::RED_TEAM:
							team = "Red";
							break;
						case ETeam::BLUE_TEAM:
							team = "Blue";
							break;
						default:
							team = "None";
							break;
						}
						switch (attackerState->Team)
						{
						case ETeam::RED_TEAM:
							attackerTeam = "Red";
							break;
						case ETeam::BLUE_TEAM:
							attackerTeam = "Blue";
							break;
						default:
							attackerTeam = "None";
							break;
						}
						Metrics::WriteToFile(std::string(TCHAR_TO_UTF8(*(attackerState->MyName))), attackerTeam, std::string("Killed"), std::string(TCHAR_TO_UTF8(*(state->MyName))), team, std::string("Using: " + std::string(TCHAR_TO_UTF8(*(abilityName.ToString())))));
					}
				}
#endif
			}
			KillPlayer();
		}
		else if (character)
		{
			ATotemPlayerController* controller = Cast<ATotemPlayerController>(GetController());
			if (controller)
			{
				character->DealtDamageTo(nullptr, controller, player, false);
			}
		}
	}

	if (!bInvincible )
	{
		OnDamageTaken(player);

		DamageTakenBy(type, abilityName);
	}
}
示例#6
0
static void PlayGame()
{
    Uint8 *keystate;
    int quit = 0;
    int turn;
    int prev_ticks = 0, cur_ticks = 0; /* for keeping track of timing */
    int awaiting_respawn = 0;

    /* framerate counter variables */
    int start_time, end_time;
    int frames_drawn = 0;

    /* respawn timer */
    int respawn_timer = -1;
	
    prev_ticks = SDL_GetTicks();
	
    start_time = time(NULL);

    /* Reset the score counters. */
    player.score = 0;
    opponent.score = 0;

    /* Start sound playback. */
    StartAudio();
    StartMusic();

    /* Start the music update thread. */
    music_update_thread = SDL_CreateThread(UpdateMusicThread, NULL);
    if (music_update_thread == NULL) {
	printf("Unable to start music update thread.\n");
    }

    /* Start the game! */
    while ((quit == 0) && network_ok) {

	/* Determine how many milliseconds have passed since
	   the last frame, and update our motion scaling. */
	prev_ticks = cur_ticks;
	cur_ticks = SDL_GetTicks();
	time_scale = (double)(cur_ticks-prev_ticks)/30.0;
				
	/* Update SDL's internal input state information. */
	SDL_PumpEvents();
		
	/* Grab a snapshot of the keyboard. */
	keystate = SDL_GetKeyState(NULL);

	/* Lock the mutex so we can access the player's data. */
	SDL_LockMutex(player_mutex);
		
	/* If this is a network game, take note of variables
	   set by the network thread. These are handled differently
	   for a scripted opponent. */
	if (opponent_type == OPP_NETWORK) {

	    /* Has the opponent respawned? */
	    if (network_opponent_respawn) {
		printf("Remote player has respawned.\n");
		opponent.shields = 100;
		network_opponent_respawn = 0;
		awaiting_respawn = 0;
	    }
		
	    /* Has the local player been hit? */
	    if (local_player_hit) {
		local_player_hit--;
		player.shields -= PHASER_DAMAGE;
		ShowPhaserHit(&player);
				/* No need to check for death, the
				   other computer will tell us. */
	    }
		}

	/* Update phasers. */
	player.firing -= time_scale;
	if (player.firing < 0) player.firing = 0;
	opponent.firing -= time_scale;
	if (opponent.firing < 0) opponent.firing = 0;
	ChargePhasers(&player);

	/* If the local player is destroyed, the respawn timer will
	   start counting. During this time the controls are disabled
	   and explosion sequence occurs. */
	if (respawn_timer >= 0) {
	    respawn_timer++;

	    if (respawn_timer >= ((double)RESPAWN_TIME / time_scale)) {
		respawn_timer = -1;
		InitPlayer(&player);

				/* Set the local_player_respawn flag so the
				   network thread will notify the opponent
				   of the respawn. */
		local_player_respawn = 1;

		SetStatusMessage("GOOD LUCK, WARRIOR!");
	    }
	}

	/* Respond to input and network events, but not if we're in a respawn. */
	if (respawn_timer == -1) {
	    if (keystate[SDLK_q] || keystate[SDLK_ESCAPE]) quit = 1;
			
	    /* Left and right arrow keys control turning. */
	    turn = 0;
	    if (keystate[SDLK_LEFT]) turn += 10;
	    if (keystate[SDLK_RIGHT]) turn -= 10;
			
	    /* Forward and back arrow keys activate thrusters. */
	    player.accel = 0;
	    if (keystate[SDLK_UP]) player.accel = PLAYER_FORWARD_THRUST;
	    if (keystate[SDLK_DOWN]) player.accel = PLAYER_REVERSE_THRUST;
			
	    /* Spacebar fires phasers. */
	    if (keystate[SDLK_SPACE]) {

		if (CanPlayerFire(&player)) {

		    FirePhasers(&player);

		    /* If it's a hit, either notify the opponent
		       or exact the damage. Create a satisfying particle
		       burst. */
		    if (!awaiting_respawn &&
			CheckPhaserHit(&player,&opponent)) {

			ShowPhaserHit(&opponent);
			DamageOpponent();

			/* If that killed the opponent, set the
			   "awaiting respawn" state, to prevent multiple
			   kills. */
			if (opponent.shields <= 0 &&
			    opponent_type == OPP_NETWORK)
			    awaiting_respawn = 1;
       		    }
		}
	    }
			
	    /* Turn. */
	    player.angle += turn * time_scale;
	    if (player.angle < 0) player.angle += 360;
	    if (player.angle >= 360) player.angle -= 360;

	    /* If this is a network game, the remote player will
	       tell us if we've died. Otherwise we have to check
	       for failed shields. */
	    if (((opponent_type == OPP_NETWORK) && local_player_dead) ||
		(player.shields <= 0))
	    {
		printf("Local player has been destroyed.\n");
		local_player_dead = 0;
				
		/* Kaboom! */
		KillPlayer();
				
		/* Respawn. */
		respawn_timer = 0;
	    }
	}

	/* If this is a player vs. computer game, give the computer a chance. */
	if (opponent_type == OPP_COMPUTER) {
	    if (RunGameScript() != 0) {
		fprintf(stderr, "Ending game due to script error.\n");
		quit = 1;
	    }
			
	    /* Check for phaser hits against the player. */
	    if (opponent.firing) {
		if (CheckPhaserHit(&opponent,&player)) {
					
		    ShowPhaserHit(&player);
		    player.shields -= PHASER_DAMAGE;

		    /* Did that destroy the player? */
		    if (respawn_timer < 0 && player.shields <= 0) {
			KillPlayer();
			respawn_timer = 0;
		    }
		}
	    }

	    ChargePhasers(&opponent);
	    UpdatePlayer(&opponent);
	}

	/* Update the player's position. */
	UpdatePlayer(&player);

	/* Update the status information. */
	SetPlayerStatusInfo(player.score, player.shields, player.charge);
	SetOpponentStatusInfo(opponent.score, opponent.shields);

	/* Make the camera follow the player (but impose limits). */
	camera_x = player.world_x - SCREEN_WIDTH/2;
	camera_y = player.world_y - SCREEN_HEIGHT/2;
		
	if (camera_x < 0) camera_x = 0;
	if (camera_x >= WORLD_WIDTH-SCREEN_WIDTH)
	    camera_x = WORLD_WIDTH-SCREEN_WIDTH-1;
	if (camera_y < 0) camera_y = 0;
	if (camera_y >= WORLD_HEIGHT-SCREEN_HEIGHT)
	    camera_y = WORLD_HEIGHT-SCREEN_HEIGHT-1;

	/* Update the particle system. */
	UpdateParticles();

	/* Keep OpenAL happy. */
	UpdateAudio(&player, &opponent);
				
	/* Redraw everything. */
	DrawBackground(screen, camera_x, camera_y);
	DrawParallax(screen, camera_x, camera_y);
	DrawParticles(screen, camera_x, camera_y);
	if (opponent.firing)
	    DrawPhaserBeam(&opponent, screen, camera_x, camera_y);
	if (player.firing)
	    DrawPhaserBeam(&player, screen, camera_x, camera_y);

	if (respawn_timer < 0)
	    DrawPlayer(&player);
	if (!awaiting_respawn)
	    DrawPlayer(&opponent);
	UpdateStatusDisplay(screen);
		
	/* Release the mutex so the networking system can get it.
	   It doesn't stay unlocked for very long, but the networking
	   system should still have plenty of time. */
	SDL_UnlockMutex(player_mutex);
	
	/* Flip the page. */
	SDL_Flip(screen);

	frames_drawn++;
    }

    end_time = time(NULL);
    if (start_time == end_time) end_time++;

    /* Display the average framerate. */
    printf("Drew %i frames in %i seconds, for a framerate of %.2f fps.\n",
	   frames_drawn,
	   end_time-start_time,
	   (float)frames_drawn/(float)(end_time-start_time));


    /* Terminate the music update thread. */
    if (music_update_thread != NULL) {
	SDL_KillThread(music_update_thread);
	music_update_thread = NULL;
    }
	
    /* Stop audio playback. */
    StopAudio();
    StopMusic();
}
void EntityManager::handleCollisions()
{
    // Evade from other enemies.
    for(std::list<Enemy*>::iterator i = m_enemies.begin(); i != m_enemies.end(); i++)
    {
        for(std::list<Enemy*>::iterator j = m_enemies.begin(); j != m_enemies.end(); j++)
        {
            if(isColliding(*i, *j))
            {
                (*i)->handleCollision(*j);
                (*j)->handleCollision(*i);
            }
        }
    }

    // Determine shot enemies.
    for(std::list<Enemy*>::iterator i = m_enemies.begin(); i != m_enemies.end(); i++)
    {
        for(std::list<Bullet*>::iterator j = m_bullets.begin(); j != m_bullets.end(); j++)
        {
            if(isColliding(*i, *j))
            {
                (*i)->wasShot();
                (*i)->setExpired();
            }
        }
    }

    // Determine enemy crashing into player.
    for(std::list<Enemy*>::iterator i = m_enemies.begin(); i != m_enemies.end(); i++)
    {
        if(isColliding(*i, PlayerShip::getInstance()) && (*i)->getIsActive())
        {
            PlayerShip::getInstance()->kill();

            for(std::list<Enemy*>::iterator j = m_enemies.begin(); j != m_enemies.end(); j++)
            {
                (*j)->wasShot();
            }

            EnemySpawner::getInstance()->reset();
            break;
        }
    }

    // Determine enemy crashing into player.
    for(std::list<BlackHole *>::iterator i = m_blackHoles.begin(); i != m_blackHoles.end(); i++)
    {
        // Kill enemies in the way.
        for(std::list<Enemy*>::iterator j = m_enemies.begin();
            j != m_enemies.end();
            j++)
        {
            if((*j)->getIsActive() && isColliding(*i, *j))
            {
                (*j)->wasShot();
            }
        }

        // Kill bullets in the way.
        for(std::list<Bullet*>::iterator j = m_bullets.begin();
            j != m_bullets.end();
            j++)
        {
            if(isColliding(*i, *j))
            {
                (*j)->setExpired();
                (*i)->wasShot();
            }
        }

        // Kill player if collide.
        if(isColliding(PlayerShip::getInstance(), *i))
        {
            KillPlayer();
        }
    }
}