📄 worldmodel.cpp
字号:
/* * Copyright 2002-2005, Mersad Team, Allameh Helli High School (NODET). * * This program is free software, you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * This file is created by: Ahmad Boorghany * and is modified by: Mohammad Salehe, Mostafa Rokooey, * Sassan Haradji, Darioush Jalali * * Released on Monday 1 August 2005, 10 Mordad 1384 by Mersad RoboCup Team. * For more information please read README file.*/#include <cmath>#include <sstream>#include <cassert>#include <iostream>#include <Config.h>#include <Logger.h>#include <Basics.h>#include <Degree.h>#include <Defines.h>#include <WorldModel.h>#include <SayEncoding.h>using namespace std;using namespace Basics;using namespace Degree;#define OPP_OFFLINE_LOCAL_X 20#define OPP_OFFLINE_LOCAL_Y 10#define MARKING_DECAY_FACTOR (0.8)#define MARKING_THRESHOLD (2.0)#define MARKING_AREA (2.75)// class WorldModelWorldModel::WorldModel(){ unsigned i; if (config["Agent"]["Server"]["OfflinePlayer"].asBool()) timer = new VirtualTimer(); else timer = new OnlineTimer(); seeCycle = 0; curCycle = 0; curTime = 0; fieldSide = SI_LEFT; playMode = PM_BEFORE_KICK_OFF; virtualPlayMode = VPM_NONE; playModeRemainCycle = 0; setBodyReplaced(false); initViewPartDirs(); resetSeeDeltaCycles(); freeKickAdvicerSayCycle = 0; curKickCalculate.init(); // Objects on the field. flagsNum = 0; goalsNum = 0; linesNum = 0; for (i = 0; i < FLAGS_NUM; i++) flags[i] = new FieldFlag(); for (i = 0; i < GOALS_NUM; i++) goals[i] = new FieldGoal(); for (i = 0; i < LINES_NUM; i++) lines[i] = new FieldLine(); ball = new Ball; body = new Body; for (i = 0; i < FULL_PLAYERS_NUM; i++) { fullPlayers[TID_TEAMMATE][i] = new Player(PLM_FULL); fullPlayers[TID_TEAMMATE][i]->setUniNum(i + 1); } for (i = 0; i < FULL_PLAYERS_NUM; i++) { fullPlayers[TID_OPPONENT][i] = new Player(PLM_FULL); fullPlayers[TID_OPPONENT][i]->setUniNum(i + 1); } for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_TEAMMATE][i] = new Player(PLM_HALF); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_OPPONENT][i] = new Player(PLM_HALF); for (i = 0; i < QUARTER_PLAYERS_NUM; i++) quarterPlayers[i] = new Player(PLM_QUARTER);}WorldModel::WorldModel(const WorldModel &worldModelCopy){ copyFrom(worldModelCopy, false); LOG << "WorldModel copied." << endl;}WorldModel::~WorldModel(){ unsigned i; delete timer; for (i = 0; i < FLAGS_NUM; i++) delete flags[i]; for (i = 0; i < GOALS_NUM; i++) delete goals[i]; for (i = 0; i < LINES_NUM; i++) delete lines[i]; delete ball; if (!isBodyReplaced()) delete body; // else it will be deleted with other players. for (i = 0; i < FULL_PLAYERS_NUM; i++) delete fullPlayers[TID_TEAMMATE][i]; for (i = 0; i < FULL_PLAYERS_NUM; i++) delete fullPlayers[TID_OPPONENT][i]; for (i = 0; i < HALF_PLAYERS_NUM; i++) delete halfPlayers[TID_TEAMMATE][i]; for (i = 0; i < HALF_PLAYERS_NUM; i++) delete halfPlayers[TID_OPPONENT][i]; for (i = 0; i < QUARTER_PLAYERS_NUM; i++) delete quarterPlayers[i];}void WorldModel::copyFrom(const WorldModel &worldModelCopy, bool constructed){ unsigned i; if (constructed) { LOG << "WorldModel copying 1" << endl; delete timer; for (i = 0; i < FLAGS_NUM; i++) delete flags[i]; for (i = 0; i < GOALS_NUM; i++) delete goals[i]; for (i = 0; i < LINES_NUM; i++) delete lines[i]; delete ball; if (!isBodyReplaced()) delete body; // else it will be deleted with other players. for (i = 0; i < FULL_PLAYERS_NUM; i++) delete fullPlayers[TID_TEAMMATE][i]; for (i = 0; i < FULL_PLAYERS_NUM; i++) delete fullPlayers[TID_OPPONENT][i]; for (i = 0; i < HALF_PLAYERS_NUM; i++) delete halfPlayers[TID_TEAMMATE][i]; for (i = 0; i < HALF_PLAYERS_NUM; i++) delete halfPlayers[TID_OPPONENT][i]; for (i = 0; i < QUARTER_PLAYERS_NUM; i++) delete quarterPlayers[i]; } LOG << "WorldModel copying 2" << endl; *this = worldModelCopy; if (dynamic_cast<OnlineTimer *>(worldModelCopy.timer)) timer = new OnlineTimer((const OnlineTimer&)*(worldModelCopy.timer)); else timer = new VirtualTimer((const VirtualTimer&)*(worldModelCopy.timer)); for (i = 0; i < FLAGS_NUM; i++) flags[i] = new FieldFlag(*(worldModelCopy.flags[i])); for (i = 0; i < GOALS_NUM; i++) goals[i] = new FieldGoal(*(worldModelCopy.goals[i])); for (i = 0; i < LINES_NUM; i++) lines[i] = new FieldLine(*(worldModelCopy.lines[i])); ball = new Ball(*(worldModelCopy.ball)); body = new Body(*(worldModelCopy.body)); for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_TEAMMATE][i] = new Player(*(worldModelCopy.fullPlayers[TID_TEAMMATE][i])); for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_OPPONENT][i] = new Player(*(worldModelCopy.fullPlayers[TID_OPPONENT][i])); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_TEAMMATE][i] = new Player(*(worldModelCopy.halfPlayers[TID_TEAMMATE][i])); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_OPPONENT][i] = new Player(*(worldModelCopy.halfPlayers[TID_OPPONENT][i])); for (i = 0; i < QUARTER_PLAYERS_NUM; i++) quarterPlayers[i] = new Player(*(worldModelCopy.quarterPlayers[i])); if (worldModelCopy.bodyReplacedFlag) replaceBodyInPlayersList(worldModelCopy.body->getUniNum());}void WorldModel::updateAfterSenseBody(){ curKickCalculate.setValid(false); resetHearedVarsAfterSenseBody();}void WorldModel::initServerParam(const SExpression &exp){ int i; SExpAtomic *at = dynamic_cast<SExpAtomic *>(exp[0]); assert(at); assert(at->asString() == "server_param"); for (i = 1; i < exp.size(); i++) { SExpression *se = dynamic_cast<SExpression *>(exp[i]); assert(se); SExpAtomic *at1 = dynamic_cast<SExpAtomic *>((*se)[0]); assert(at1); SExpAtomic *at2 = dynamic_cast<SExpAtomic *>((*se)[1]); assert(at2); serverParam.add(at1->asString(), at2->asString()); } // now I can set default variables of objects. ball->setServerParamVars(serverParam); for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_TEAMMATE][i]->setServerParamVars(serverParam); for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_OPPONENT][i]->setServerParamVars(serverParam); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_TEAMMATE][i]->setServerParamVars(serverParam); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_OPPONENT][i]->setServerParamVars(serverParam); for (i = 0; i < QUARTER_PLAYERS_NUM; i++) quarterPlayers[i]->setServerParamVars(serverParam);}void WorldModel::initPlayerParam(const SExpression &exp){ int i; SExpAtomic *at = dynamic_cast<SExpAtomic *>(exp[0]); assert(at); assert(at->asString() == "player_param"); for (i = 1; i < exp.size(); i++) { SExpression *se = dynamic_cast<SExpression *>(exp[i]); assert(se); SExpAtomic *at1 = dynamic_cast<SExpAtomic *>((*se)[0]); assert(at1); SExpAtomic *at2 = dynamic_cast<SExpAtomic *>((*se)[1]); assert(at2); playerParam.add(at1->asString(), at2->asString()); } playerTypes = vector<Param>(playerParam["player_types"].asInt());}void WorldModel::initPlayerType(const SExpression &exp){ int i; SExpAtomic *at = dynamic_cast<SExpAtomic *>(exp[0]); assert(at); assert(at->asString() == "player_type"); const SExpression &seid = exp["id"]; at = dynamic_cast<SExpAtomic *>(seid[1]); assert(at); int id = at->asInt(); for (i = 2; i < exp.size(); i++) { SExpression *se = dynamic_cast<SExpression *>(exp[i]); assert(se); SExpAtomic *at1 = dynamic_cast<SExpAtomic *>((*se)[0]); assert(at1); SExpAtomic *at2 = dynamic_cast<SExpAtomic *>((*se)[1]); assert(at2); playerTypes[id].add(at1->asString(), at2->asString()); } if (id == 0) // now I can set default players type. { for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_TEAMMATE][i]->setType(0, playerTypes[0]); for (i = 0; i < FULL_PLAYERS_NUM; i++) fullPlayers[TID_OPPONENT][i]->setType(0, playerTypes[0]); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_TEAMMATE][i]->setType(0, playerTypes[0]); for (i = 0; i < HALF_PLAYERS_NUM; i++) halfPlayers[TID_OPPONENT][i]->setType(0, playerTypes[0]); for (i = 0; i < QUARTER_PLAYERS_NUM; i++) quarterPlayers[i]->setType(0, playerTypes[0]); }}void WorldModel::parseSee(const SExpression &exp){ SExpAtomic *at; SExpression *se1,*se2; int i; at = dynamic_cast<SExpAtomic *>(exp[0]); assert(at); assert(at->asString() == "see"); // See time at = dynamic_cast<SExpAtomic *>(exp[1]); assert(at); seeCycle = at->asInt(); seeTime = getCurTime(); for (i = 2; i < exp.size(); i++) { se1 = dynamic_cast<SExpression *>(exp[i]); assert(se1); se2 = dynamic_cast<SExpression *>((*se1)[0]); assert(se2); at = dynamic_cast<SExpAtomic *>((*se2)[0]); assert(at); switch (at->asString()[0]) { case 'f': parseFlag(*se1); break; case 'g': parseGoal(*se1); break; case 'l': parseLine(*se1); break; case 'b': case 'B': parseBall(*se1); break; case 'p': case 'P': parsePlayer(*se1); break; case 'F': case 'L': case 'G': break; // Going to trash. default: assert(0); } }}void WorldModel::parseFlag(const SExpression &exp){ SExpression *se; int flagId; se = dynamic_cast<SExpression *>(exp[0]); assert(se); flagId = fieldData.getFlagId(*se); flags[flagsNum]->parse(flagId, exp, getCurTime()); flagsNum++;}void WorldModel::parseGoal(const SExpression &exp){ SExpression *se; int goalId; se = dynamic_cast<SExpression *>(exp[0]); assert(se); goalId = fieldData.getGoalId(*se); goals[goalsNum]->parse(goalId, exp, getCurTime()); goalsNum++;}void WorldModel::parseLine(const SExpression &exp){ SExpression *se; int lineId; se = dynamic_cast<SExpression *>(exp[0]); assert(se); lineId = fieldData.getLineId(*se); lines[linesNum]->parse(lineId, exp, getCurTime()); linesNum++;}void WorldModel::parseBall(const SExpression &exp){ ball->parse(exp, getCurTime());}void WorldModel::parsePlayer(const SExpression &exp){ SExpression *se; SExpAtomic *at; string ourTeamName; TeamId teamId = TID_UNKNOWN; unsigned uniNum = 0; bool isGoalie = false; unsigned i; se = dynamic_cast<SExpression *>(exp[0]); assert(se); if (se->size() > 1) { at = dynamic_cast<SExpAtomic *>((*se)[1]); assert(at); ourTeamName = (string)"\"" + config["Agent"]["Public"]["TeamName"].asString() + "\""; if (at->toString() == ourTeamName) teamId = TID_TEAMMATE; else teamId = TID_OPPONENT; } if (se->size() > 2) { at = dynamic_cast<SExpAtomic *>((*se)[2]); assert(at); uniNum = at->asInt(); } if (se->size() > 3) { at = dynamic_cast<SExpAtomic *>((*se)[3]); assert(at); assert(at->toString() == "goalie");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -