//-------------------------------------------------------------- // Name: selectState() // Class: GeneralCombatWithMeleeWeapon // // Description: Selects the state for the behavior // // Parameters: Actor &self // // Returns: None //-------------------------------------------------------------- void GeneralCombatWithMeleeWeapon::selectState( Actor &self ) { float chance; Entity* currentEnemy; currentEnemy = self.enemyManager->GetCurrentEnemy(); // If we don't have an enemy, then let's ask our enemy manager // to try and find one if ( !currentEnemy ) self.enemyManager->FindHighestHateEnemy(); // If we still don't have an enemy, then we need to hold if ( !currentEnemy ) { if ( !setupHold( self )) return; _state = GENERAL_COMBAT_MELEE_HOLD; return; } chance = G_Random(); if ( self.checkincomingmeleeattack() && chance < _blockChance ) { _state = GENERAL_COMBAT_MELEE_BLOCK; if ( !setupBlock( self ) ) setupBlockFailed( self ); return; } chance = G_Random(); if ( currentEnemy && self.enemyManager->InEnemyLineOfFire() && chance < _strafeChance && self.WithinDistance( currentEnemy , _meleeDistance ) ) { _state = GENERAL_COMBAT_MELEE_STRAFE; if ( !setupStrafe( self ) ) strafeFailed(self); return; } // // The Change Posture stuff is commented out because it looks really weak right now // I need to keep it here though, so that when the animations look better or I figure out // how to better utilize them it will be easy to re-enable // //if ( currentEnemy && chance < _postureChangeChance && level.time > _nextPostureChangeTime && self.WithinDistance( currentEnemy , _meleeDistance ) ) // { // _state = GENERAL_COMBAT_MELEE_CHANGE_POSTURE; // // if ( !_setupChangePosture(self) ) // _setupChangePostureFailed(self); // // return; // } chance = G_Random(); if ( currentEnemy && chance < _attackChance && self.WithinDistance( currentEnemy , _meleeDistance ) ) { _state = GENERAL_COMBAT_MELEE_ATTACK; if (!setupAttack( self )) setupAttackFailed( self ); return; } setupHold( self ); _state = GENERAL_COMBAT_MELEE_HOLD; }
void rowTest() { csvsqldb::BlockManager blockManager; csvsqldb::Types types; types.push_back(csvsqldb::INT); types.push_back(csvsqldb::DATE); types.push_back(csvsqldb::STRING); types.push_back(csvsqldb::STRING); types.push_back(csvsqldb::STRING); types.push_back(csvsqldb::DATE); { csvsqldb::FunctionRegistry functions; csvsqldb::SQLParser parser(functions); csvsqldb::VariableStore store; csvsqldb::ASTExprNodePtr exp = parser.parseExpression("hire_date > DATE'2012-01-01'"); csvsqldb::StackMachine::VariableMapping mapping; csvsqldb::StackMachine sm; csvsqldb::ASTInstructionStackVisitor visitor(sm, mapping); exp->accept(visitor); csvsqldb::BlockPtr block = setupBlock(blockManager); MyBlockProvider blockProvider(block, blockManager); csvsqldb::BlockIteratorPtr iterator = std::make_shared<csvsqldb::BlockIterator>(types, blockProvider, blockManager); { const csvsqldb::Values& rowValues = *(iterator->getNextRow()); const csvsqldb::Value* val = rowValues[0]; MPF_TEST_ASSERTEQUAL("4711", val->toString()); val = rowValues[1]; MPF_TEST_ASSERTEQUAL("1970-09-23", val->toString()); val = rowValues[2]; MPF_TEST_ASSERTEQUAL("Lars", val->toString()); val = rowValues[3]; MPF_TEST_ASSERTEQUAL("Fürstenberg", val->toString()); val = rowValues[4]; MPF_TEST_ASSERTEQUAL("M", val->toString()); val = rowValues[5]; MPF_TEST_ASSERTEQUAL("2012-02-01", val->toString()); store.addVariable(0, csvsqldb::Variant(dynamic_cast<const csvsqldb::ValDate*>(val)->asDate())); bool matches = sm.evaluate(store, functions).asBool(); MPF_TEST_ASSERT(matches); } { const csvsqldb::Values& rowValues = *(iterator->getNextRow()); const csvsqldb::Value* val = rowValues[0]; MPF_TEST_ASSERTEQUAL("815", val->toString()); val = rowValues[1]; MPF_TEST_ASSERTEQUAL("1969-05-17", val->toString()); val = rowValues[2]; MPF_TEST_ASSERTEQUAL("Mark", val->toString()); val = rowValues[3]; MPF_TEST_ASSERTEQUAL("Fürstenberg", val->toString()); val = rowValues[4]; MPF_TEST_ASSERTEQUAL("M", val->toString()); val = rowValues[5]; MPF_TEST_ASSERTEQUAL("2003-04-15", val->toString()); store.addVariable(0, csvsqldb::Variant(dynamic_cast<const csvsqldb::ValDate*>(val)->asDate())); bool matches = sm.evaluate(store, functions).asBool(); MPF_TEST_ASSERT(!matches); } } { csvsqldb::FunctionRegistry functions; csvsqldb::SQLParser parser(functions); csvsqldb::VariableStore store; csvsqldb::ASTExprNodePtr exp = parser.parseExpression("emp.last_name = 'Fürstenberg'"); csvsqldb::StackMachine::VariableMapping mapping; csvsqldb::StackMachine sm; csvsqldb::ASTInstructionStackVisitor visitor(sm, mapping); exp->accept(visitor); csvsqldb::BlockPtr block = setupBlock(blockManager); MyBlockProvider blockProvider(block, blockManager); csvsqldb::BlockIteratorPtr iterator = std::make_shared<csvsqldb::BlockIterator>(types, blockProvider, blockManager); const csvsqldb::Values* row = nullptr; int count = 0; while((row = iterator->getNextRow())) { if(count == 0) { MPF_TEST_ASSERTEQUAL("4711", (*row)[0]->toString()); MPF_TEST_ASSERTEQUAL("1970-09-23", (*row)[1]->toString()); MPF_TEST_ASSERTEQUAL("Lars", (*row)[2]->toString()); MPF_TEST_ASSERTEQUAL("Fürstenberg", (*row)[3]->toString()); MPF_TEST_ASSERTEQUAL("M", (*row)[4]->toString()); MPF_TEST_ASSERTEQUAL("2012-02-01", (*row)[5]->toString()); store.addVariable(0, csvsqldb::Variant(dynamic_cast<const csvsqldb::ValString*>((*row)[3])->asString())); bool matches = sm.evaluate(store, functions).asBool(); MPF_TEST_ASSERT(matches); } else if(count == 1) { MPF_TEST_ASSERTEQUAL("815", (*row)[0]->toString()); MPF_TEST_ASSERTEQUAL("1969-05-17", (*row)[1]->toString()); MPF_TEST_ASSERTEQUAL("Mark", (*row)[2]->toString()); MPF_TEST_ASSERTEQUAL("Fürstenberg", (*row)[3]->toString()); MPF_TEST_ASSERTEQUAL("M", (*row)[4]->toString()); MPF_TEST_ASSERTEQUAL("2003-04-15", (*row)[5]->toString()); store.addVariable(0, csvsqldb::Variant(dynamic_cast<const csvsqldb::ValString*>((*row)[3])->asString())); bool matches = sm.evaluate(store, functions).asBool(); MPF_TEST_ASSERT(matches); } ++count; } } }