/* ================================================ */ 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; } }
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; } } } }
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; }
/* ================================================ */ 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 ); }