//----------------------------------------------------------------------------- void SoccerWorld::updateAIData() { if (isRaceOver()) return; // Fill the kart distance map m_red_kdm.clear(); m_blue_kdm.clear(); for (unsigned int i = 0; i < m_karts.size(); ++i) { if (UserConfigParams::m_arena_ai_stats && m_karts[i]->getController()->isPlayerController()) continue; if (getKartTeam(m_karts[i]->getWorldKartId()) == SOCCER_TEAM_RED) { Vec3 rd = m_karts[i]->getXYZ() - getBallPosition(); m_red_kdm.push_back(KartDistanceMap(i, rd.length_2d())); } else { Vec3 bd = m_karts[i]->getXYZ() - getBallPosition(); m_blue_kdm.push_back(KartDistanceMap(i, bd.length_2d())); } } // Sort the vectors, so first vector will have the min distance std::sort(m_red_kdm.begin(), m_red_kdm.end()); std::sort(m_blue_kdm.begin(), m_blue_kdm.end()); // Fill Ball and goals data m_bgd.updateBallAndGoal(getBallPosition(), getBallHeading()); } // updateAIData
//----------------------------------------------------------------------------- void SoccerWorld::initKartList() { const unsigned int kart_amount = (unsigned int)m_karts.size(); //Loading the indicator textures irr::video::ITexture *red = irr_driver->getTexture(FileManager::GUI, "soccer_player_red.png"); irr::video::ITexture *blue = irr_driver->getTexture(FileManager::GUI, "soccer_player_blue.png"); //Assigning indicators for(unsigned int i=0; i<kart_amount; i++) { scene::ISceneNode *arrow_node; float arrow_pos_height = m_karts[i]->getKartModel()->getHeight()+0.5f; SoccerTeam team = getKartTeam(i); arrow_node = irr_driver->addBillboard(core::dimension2d<irr::f32>(0.3f, 0.3f), team == SOCCER_TEAM_BLUE ? blue : red, m_karts[i] ->getNode(), true); arrow_node->setPosition(core::vector3df(0, arrow_pos_height, 0)); } } // initKartList
//----------------------------------------------------------------------------- void SoccerWorld::initKartList() { #ifndef SERVER_ONLY const unsigned int kart_amount = (unsigned int)m_karts.size(); //Loading the indicator textures std::string red_path = file_manager->getAsset(FileManager::GUI, "soccer_player_red.png"); std::string blue_path = file_manager->getAsset(FileManager::GUI, "soccer_player_blue.png"); //Assigning indicators for(unsigned int i = 0; i < kart_amount; i++) { scene::ISceneNode *arrow_node = NULL; KartModel* km = m_karts[i]->getKartModel(); // Color of karts can be changed using shaders if the model supports if (km->supportColorization() && CVS->isGLSL()) continue; float arrow_pos_height = km->getHeight() + 0.5f; SoccerTeam team = getKartTeam(i); arrow_node = irr_driver->addBillboard( core::dimension2d<irr::f32>(0.3f,0.3f), team == SOCCER_TEAM_BLUE ? blue_path : red_path, m_karts[i]->getNode()); arrow_node->setPosition(core::vector3df(0, arrow_pos_height, 0)); } #endif } // initKartList
//----------------------------------------------------------------------------- void SoccerWorld::updateDefenders() { if (isRaceOver()) return; float distance = 99999.9f; int defender = -1; // Check for red team for (unsigned int i = 0; i < (unsigned)m_karts.size(); ++i) { if (m_karts[i]->getController()->isPlayerController() || getKartTeam(m_karts[i]->getWorldKartId()) != SOCCER_TEAM_RED) continue; Vec3 d = this->getGoalLocation(SOCCER_TEAM_RED, CheckGoal::POINT_CENTER) - m_karts[i]->getXYZ(); if (d.length_2d() <= distance) { defender = i; distance = d.length_2d(); } } if (defender != -1) m_red_defender = defender; distance = 99999.9f; defender = -1; // Check for blue team for (unsigned int i = 0; i < (unsigned)m_karts.size(); ++i) { if (m_karts[i]->getController()->isPlayerController() || getKartTeam(m_karts[i]->getWorldKartId()) != SOCCER_TEAM_BLUE) continue; Vec3 d = this->getGoalLocation(SOCCER_TEAM_BLUE, CheckGoal::POINT_CENTER) - m_karts[i]->getXYZ(); if (d.length_2d() <= distance) { defender = i; distance = d.length_2d(); } } if (defender != -1) m_blue_defender = defender; } // updateDefenders
//----------------------------------------------------------------------------- int SoccerWorld::getTeamNum(SoccerTeam team) const { int total = 0; if (m_kart_team_map.empty()) return total; for (unsigned int i = 0; i < (unsigned)m_karts.size(); ++i) { if (team == getKartTeam(m_karts[i]->getWorldKartId())) total++; } return total; } // getTeamNum
//----------------------------------------------------------------------------- bool SoccerWorld::getKartSoccerResult(unsigned int kart_id) const { if (m_red_scorers.size() == m_blue_scorers.size()) return true; bool red_win = m_red_scorers.size() > m_blue_scorers.size(); SoccerTeam team = getKartTeam(kart_id); if ((red_win && team == SOCCER_TEAM_RED) || (!red_win && team == SOCCER_TEAM_BLUE)) return true; else return false; } // getKartSoccerResult
//----------------------------------------------------------------------------- bool SoccerWorld::isCorrectGoal(unsigned int kart_id, bool first_goal) const { SoccerTeam team = getKartTeam(kart_id); if (first_goal) { if (team == SOCCER_TEAM_RED) return true; } else if (!first_goal) { if (team == SOCCER_TEAM_BLUE) return true; } return false; } // isCorrectGoal