Ejemplo n.º 1
0
/* ================================================ */
void GamePlayer::EventUpdate( Common::CMN_EVENT &eventId )
{
	switch( eventId.m_event ){
	case Common::EVENT_HIT_ENEMY_SLIME:
	case Common::EVENT_HIT_ENEMY_SLIME_ANOTHER:
	case Common::EVENT_HIT_ENEMY_AHRIMAN:
	case Common::EVENT_HIT_ENEMY_COW:
	case Common::EVENT_HIT_ENEMY_BOSS:
	case Common::EVENT_HIT_ENEMY_SLIME_KING:
	case Common::EVENT_HIT_ENEMY_WIZARD:
	case Common::EVENT_HIT_WIZARD_CRYSTAL:
	case Common::EVENT_HIT_DRAGON:
	case Common::EVENT_HIT_BULLET_ENEMY:
	case Common::EVENT_HIT_BLADE_ENEMY:
	case Common::EVENT_HIT_EXPLOSION_ENEMY:
	case Common::EVENT_HIT_FIRE_BALL:
	case Common::EVENT_HIT_FIRE:
	case Common::EVENT_HIT_BOSS:
	case Common::EVENT_HIT_BOSS_LEFT:
	case Common::EVENT_HIT_BOSS_RIGHT:
		EventDamage( eventId );
		break;
	case Common::EVENT_GET_ITEM_BULLET:
		PlayerGetItem( Common::ITEM_KIND_RAPID_BULLET );
		break;
	case Common::EVENT_HIT_POISON:
		if( m_poisonTime >= 0 ){
			// 毒ダメージ
			m_poisonTime = 60 * 5;
			if( !IsPlayerState( ABNORMAL_STATE_POISON ) ){
				// ステータス変更とSEを鳴らす
				SetPlayerState( ABNORMAL_STATE_POISON, true );
				SoundManager::GetInstance()->PlaySE("Poison");
			}
		}
		break;
	case Common::EVENT_GET_ITEM_LIFE:
		PlayerGetItem( Common::ITEM_KIND_LIFE_UP );
		break;
	case Common::EVENT_GET_ITEM_DAMAGE:
		PlayerGetItem( Common::ITEM_KIND_DAMAGE_UP );
		break;
	case Common::EVENT_GET_ITEM_ANTIDOTE:
		PlayerGetItem( Common::ITEM_KIND_ANTIDOTE );
		break;
	case Common::EVENT_ADD_FORCE_MOVE:
		// 必要な情報を取り出す
		m_forceMoveInfo = eventId.GetExInfoForceMove();
		m_invalidCtrlTime	= 10;
		m_invisibleTime		= DAMAGE_INVISIBLE_TIME;
		break;
	default:

		break;
	}
}
Ejemplo n.º 2
0
void GamePlayer::SetPlayerState( const PLAYER_ABNORMAL_STATE &checkState, const bool &flag )
{
	if( flag ){
		m_playerState |= checkState;
	}
	else{
		m_playerState &= ~checkState;
	}

	// 異常状態アイコンの設定
	const static PLAYER_ABNORMAL_STATE abnormalStatus[] = {
		ABNORMAL_STATE_POISON,
		ABNORMAL_STATE_MOVE_LOCK,
		ABNORMAL_STATE_FIRE,
	};

	if( !m_pMyStateIcon ){
		return;
	}

	// 異常状態アイコンの表示非表示セット(いったん非表示に)
	m_pMyStateIcon->SetDrawFlag( false );
	for( uint32_t i = 0; i < NUMBEROF(abnormalStatus) ; ++i ){
		if( IsPlayerState( abnormalStatus[i] ) ){
			
			// 異常状態アイコンの表示非表示セット
			m_pMyStateIcon->SetDrawFlag( true );

			// 異常状態アイコンの設定
			switch( abnormalStatus[i] ){
			default:
				DEBUG_ASSERT( 0, "プレイヤーのステータスが異常");
				break;
			case ABNORMAL_STATE_NONE:
				break;
			case ABNORMAL_STATE_MOVE_LOCK:
				m_pMyStateIcon->SetEffectAnim( "walk" );
				break;
			case ABNORMAL_STATE_POISON:
				m_pMyStateIcon->SetEffectAnim( "poison" );
				break;
			case ABNORMAL_STATE_FIRE:
				m_pMyStateIcon->SetEffectAnim( "fire" );
				break;
			}
		}
	}
}
Ejemplo n.º 3
0
int CTibia::AntiParalyze(void)
{
	unsigned int *mana = (unsigned int*)Address::PLAYER_MANA;
	char buf[32];
	GetWindowText(hAutoHealDelay, buf, 32);
	unsigned int dwDelay = atoi(buf);
	unsigned int dwTime = timeGetTime();
	if(IsPlayerState(PlayerStates::Slowed) == true)
	{
		if(dwTime - dwSpellTime >= dwDelay)
		{
			if(*mana >= SpellHi.Mana)
			{
				CPacket::SayMessage(SpellHi.Spell);
				dwSpellTime = timeGetTime();
			}
		}
	}
	return 0;
}
Ejemplo n.º 4
0
/* ================================================ */
void GamePlayer::EventDamage( Common::CMN_EVENT &eventId )
{
	Common::EVENT_MESSAGE	eventKind	= eventId.m_event;
	uint32_t				damageValue	= eventId.m_eventValue;

	// 無敵時間中なので処理なし
	if( m_invisibleTime != 0 && eventKind != Common::EVENT_HIT_FIRE ){
		return;
	}

	// 既にゲーム終了か
	const GameManager *pGameMan = GameRegister::GetInstance()->GetManagerGame();
	if( pGameMan->IsGameOver() ){
		return;
	}

	// ダメージ音
	switch( eventKind ){
	case Common::EVENT_HIT_BULLET_ENEMY:
		SoundManager::GetInstance()->PlaySE("DamageBullet");
		break;
	case Common::EVENT_HIT_FIRE:
		// SEなし
		break;
	default:
		SoundManager::GetInstance()->PlaySE("DamageDirect");
		break;
	}

	// 各ダメージ種類による特殊処理
	switch( eventKind ){
	default:
		// ダメージを受けたら一定時間ダメージを受けない
		m_invisibleTime = DAMAGE_INVISIBLE_TIME;
		break;
	case Common::EVENT_HIT_ENEMY_SLIME_KING:
		{
			if( !IsPlayerState( ABNORMAL_STATE_MOVE_LOCK ) ){
				// 三秒ほど動けずとりこまれる、その後はじき出される
				Common::CMN_EVENT forceEvent;
				forceEvent.Init();
				forceEvent.m_event = Common::EVENT_ADD_FORCE_MOVE;
				forceEvent.m_delayTime = 120;
				Common::EX_FORCE_MOVE moveInfo;
				math::Vector2 vec	= math::Vector2( Utility::GetRandamValueFloat( 100, -100 ) / 100.0f, Utility::GetRandamValueFloat( 100, -100 ) / 100.0f );
				vec.Normalize();
				moveInfo.m_posX = vec.x;
				moveInfo.m_posY = vec.y;
				moveInfo.m_forcePower	= 20.0f;
				forceEvent.SetExInfoForceMove( moveInfo );
				AddEvent( forceEvent );

				// 動けないステータスにセット
				SetPlayerState( ABNORMAL_STATE_MOVE_LOCK, true );
			}
			else{
				// 既にロック状態なのでなにもしない(ダメージ処理だけ)
			}
			// ダメージを受けたら一定時間ダメージを受けない
			m_invisibleTime = DAMAGE_INVISIBLE_TIME;
		}
		break;
	case Common::EVENT_HIT_ENEMY_SLIME:
	case Common::EVENT_HIT_ENEMY_SLIME_ANOTHER:
	case Common::EVENT_HIT_ENEMY_AHRIMAN:
	case Common::EVENT_HIT_ENEMY_COW:
	case Common::EVENT_HIT_ENEMY_BOSS:
	case Common::EVENT_HIT_ENEMY_WIZARD:
	case Common::EVENT_HIT_WIZARD_CRYSTAL:
	case Common::EVENT_HIT_DRAGON:
	case Common::EVENT_HIT_BOSS:
	case Common::EVENT_HIT_BOSS_LEFT:
	case Common::EVENT_HIT_BOSS_RIGHT:
		{
			// 吹き飛ぶ方向を設定してイベントとしてセットしておく
			math::Vector2 plPos		= Utility::GetPlayerPos();
			math::Vector2 enemyPos	= math::Vector2( eventId.GetExInfoCmn().m_posX, eventId.GetExInfoCmn().m_posY );			
			math::Vector2 forceAngle = plPos - enemyPos;
			forceAngle.Normalize();

			Common::CMN_EVENT forceEvent;
			forceEvent.Init();
			forceEvent.m_event = Common::EVENT_ADD_FORCE_MOVE;
			Common::EX_FORCE_MOVE moveInfo;
			moveInfo.m_posX = forceAngle.x;
			moveInfo.m_posY = forceAngle.y;
			moveInfo.m_forcePower	= ( eventKind == Common::EVENT_HIT_ENEMY_COW ) ? 25.0f : 10.0f ;
			forceEvent.SetExInfoForceMove( moveInfo );
			AddEvent( forceEvent );

			// ダメージを受けたら一定時間ダメージを受けない
			m_invisibleTime = DAMAGE_INVISIBLE_TIME;
		}
		break;
	case Common::EVENT_HIT_FIRE:
		// 炎ダメージアイコン
		if( !IsPlayerState( ABNORMAL_STATE_FIRE ) ){
			SetPlayerState( ABNORMAL_STATE_FIRE, true );
		}
		m_fireTime = 5;
		// 一定時間ごとにダメージ
		if( FpsManager::GetUpdateCounter() % 15 == 0 ){
			damageValue = 10;
		}
		else{
			return;
		}
		break;
	}

	// 特定の攻撃を受けたら一定時間操作不能
	switch( eventKind ){
	case Common::EVENT_HIT_BLADE_ENEMY:
		m_invalidCtrlTime = 10;
		break;
	case Common::EVENT_HIT_ENEMY_SLIME_KING:
		m_invalidCtrlTime = 200;
		break;
	default:
		break;
	}

	// 防御力に応じてダメージを減らす
	uint32_t totalDamage = static_cast<uint32_t>( damageValue * m_deffenceLate );

	DEBUG_PRINT("ダメージ確定 イベントNo:%d\n", eventKind );

	// ダメージ処理実行
	ReflectDamage( totalDamage );
}