void ScoreKeeperRave::LaunchAttack( AttackLevel al ) { PlayerNumber pn = m_pPlayerState->m_PlayerNumber; RString* asAttacks = GAMESTATE->m_pCurCharacters[pn]->m_sAttacks[al]; // [NUM_ATTACKS_PER_LEVEL] RString sAttackToGive; if (GAMESTATE->m_pCurCharacters[pn] != NULL) sAttackToGive = asAttacks[ RandomInt(NUM_ATTACKS_PER_LEVEL) ]; else { // "If you add any noteskins here, you need to make sure they're cached, too." -? // Noteskins probably won't work here anymore. -aj RString DefaultAttacks[8] = { "1.5x", "2.0x", "0.5x", "reverse", "sudden", "boost", "brake", "wave" }; sAttackToGive = DefaultAttacks[ RandomInt(8) ]; } PlayerNumber pnToAttack = OPPOSITE_PLAYER[pn]; PlayerState *pPlayerStateToAttack = GAMESTATE->m_pPlayerState[pnToAttack]; Attack a; a.level = al; a.fSecsRemaining = ATTACK_DURATION_SECONDS; a.sModifiers = sAttackToGive; // remove current attack (if any) pPlayerStateToAttack->RemoveActiveAttacks(); // apply new attack pPlayerStateToAttack->LaunchAttack( a ); // SCREENMAN->SystemMessage( ssprintf( "attacking %d with %s", pnToAttack, sAttackToGive.c_str() ) ); }
void Inventory::UseItem( int iSlot ) { Attack* pInventory = m_pPlayerState->m_Inventory; //[NUM_INVENTORY_SLOTS] if( pInventory[iSlot].IsBlank() ) return; PlayerNumber pn = m_pPlayerState->m_PlayerNumber; Attack a = pInventory[iSlot]; // remove the item pInventory[iSlot].MakeBlank(); m_vpSoundUseItem[a.level]->Play(false); PlayerNumber pnToAttack = OPPOSITE_PLAYER[pn]; PlayerState *pPlayerStateToAttack = GAMESTATE->m_pPlayerState[pnToAttack]; pPlayerStateToAttack->LaunchAttack( a ); float fPercentHealthToDrain = (a.level+1) / 10.f; ASSERT( fPercentHealthToDrain > 0 ); GAMESTATE->m_fOpponentHealthPercent -= fPercentHealthToDrain; CLAMP( GAMESTATE->m_fOpponentHealthPercent, 0.f, 1.f ); // play announcer sound SCREENMAN->SendMessageToTopScreen( ssprintf("SM_BattleDamageLevel%d",a.level+1) ); }