const IScriptCommand* ScriptParser::commandScriptSpawn(void) { auto command = new ScriptSpawn; command->setFrame(mParser.extractValue<float>()); command->setInstruction(IScriptCommand::Instruction::SPAWN); command->setSpawnName(mParser.extractWord()); command->setX(mParser.extractValue<float>()); command->setY(mParser.extractValue<float>()); command->setAngle(mParser.extractValue<float>()); return command; }
SSATmp::SSATmp(uint32_t opndId, IRInstruction* i, int dstId /* = 0 */) : m_id(opndId) { setInstruction(i, dstId); }
void CFBMatch::tryShootBall(CFBPlayer* shooter, bool isAir) { auto team = shooter->getOwnerTeam(); auto size = team->getSide(); auto pitch = FBMATCH->getPitch(); auto otherSide = pitch->getOtherSide(size); auto otherTeam = FBMATCH->getTeam(otherSide); auto& otherTeamMembers = otherTeam->getTeamMembers(); Point goalPos = pitch->getGoalPos(otherSide); if (isAir) { m_currentInstruction = INS_FAC->getShootBallAirIns(); } else { m_currentInstruction = INS_FAC->getShootBallGroundIns(); } m_currentInstruction->addPlayer(shooter); for (auto x : m_defendPlayerIds) { auto pO = otherTeam->getPlayer(x); int roll = RANDOM_MGR->getRand() % 300; if (roll > 200) { pO->setInstruction(FBDefs::PLAYER_INS::TAKCLE); } else if (roll > 100) { pO->setInstruction(FBDefs::PLAYER_INS::INTERCEPT); } else { pO->setInstruction(FBDefs::PLAYER_INS::BLOCK); } m_currentInstruction->addPlayer(pO); } auto& fpos = shooter->getPosition(); vector<pair<float, CFBPlayer*>> involvePlayers; CFBPlayer* goalKeeper = nullptr; for (auto player : otherTeamMembers) { if (player->m_isGoalKeeper) { goalKeeper = player; } else { auto it = std::find(m_defendPlayerIds.begin(), m_defendPlayerIds.end(), player->m_positionInFormation); if (it == m_defendPlayerIds.end()) { auto& ppos = player->getPosition(); if (FBDefs::isPointOnTheWay(fpos, goalPos, ppos)) { float dist = fpos.getDistanceSq(ppos); involvePlayers.push_back(pair<float, CFBPlayer*>(dist, player)); } } } } std::sort(involvePlayers.begin(), involvePlayers.end(), [&](const pair<float, CFBPlayer*>& o1, const pair<float, CFBPlayer*> o2)-> bool { return o1.first < o2.first; }); for (auto a : involvePlayers) { auto pO = a.second; int roll = RANDOM_MGR->getRand() % 300; if (roll > 200) { pO->setInstruction(FBDefs::PLAYER_INS::TAKCLE); } else if (roll > 100) { pO->setInstruction(FBDefs::PLAYER_INS::INTERCEPT); } else { pO->setInstruction(FBDefs::PLAYER_INS::BLOCK); } m_currentInstruction->addPlayer(pO); } CC_ASSERT(goalKeeper); int roll = RANDOM_MGR->getRand() % 1000; if (roll > 500) { goalKeeper->setInstruction(FBDefs::PLAYER_INS::HIT); } else { goalKeeper->setInstruction(FBDefs::PLAYER_INS::TAKE); } m_currentInstruction->addPlayer(goalKeeper); m_currentInstruction->start(bind(&CFBMatch::onInstructionEnd, this)); pauseGame(true); }