bool PathFinder::findWay(Tag nextCheckTag) { std::priority_queue<Tag, std::vector<Tag>, Compare> openTags; int checkResult = FAIL; cocos2d::Point checkingPos; m_CurTag = nextCheckTag; for(int dir = DIR_UP; dir < DIR_MAX; ++dir) { checkingPos = findNeighbor(dir); checkResult |= checkPos(checkingPos, &openTags); if(checkResult & FIND) { return true; } } if(checkResult & CHECKING) { while(!openTags.empty()) { Tag nextTag = openTags.top(); if(findWay(nextTag)) { m_Path.push(cocos2d::Point(nextTag.m_X, nextTag.m_Y)); return true; } openTags.pop(); } } return false; }
int KyraEngine_MR::inputSceneChange(int x, int y, int unk1, int unk2) { uint16 curScene = _mainCharacter.sceneId; _pathfinderFlag = 15; if (!_unkHandleSceneChangeFlag) { if (_savedMouseState == -4) { if (_sceneList[curScene].exit4 != 0xFFFF) { x = 4; y = _sceneEnterY4; _pathfinderFlag = 7; } } else if (_savedMouseState == -6) { if (_sceneList[curScene].exit2 != 0xFFFF) { x = 316; y = _sceneEnterY2; _pathfinderFlag = 7; } } else if (_savedMouseState == -7) { if (_sceneList[curScene].exit1 != 0xFFFF) { x = _sceneEnterX1; y = _sceneEnterY1 - 2; _pathfinderFlag = 14; } } else if (_savedMouseState == -5) { if (_sceneList[curScene].exit3 != 0xFFFF) { x = _sceneEnterX3; y = 191; _pathfinderFlag = 11; } } } if (ABS(_mainCharacter.x1 - x) < 4 && ABS(_mainCharacter.y1 - y) < 2) { _pathfinderFlag = 0; return 0; } int x1 = _mainCharacter.x1 & (~3); int y1 = _mainCharacter.y1 & (~1); x &= ~3; y &= ~1; int size = findWay(x1, y1, x, y, _movFacingTable, 600); _pathfinderFlag = 0; if (!size || size == 0x7D00) return 0; return trySceneChange(_movFacingTable, unk1, unk2); }
void Walk::findWay(Sprite *spr) { if (!spr || spr == this) return; int x = spr->_x; int z = spr->_z; if (spr->_flags._east) x += spr->_w + _w / 2 - kWalkSide; else x -= _w / 2 - kWalkSide; findWay(Cluster(_vm, (x / kMapGridX), ((z < kMapZCnt - kDistMax) ? (z + 1) : (z - 1)))); }
void KyraEngine_v2::pathfinderFinializePath(int *moveTable, int tableLen, int x, int y, int moveTableSize) { int x1 = 0, y1 = 0; int x2 = 0, y2 = 0; int index1 = 0, index2 = 0; int sizeLeft = moveTableSize; for (int i = 0; i < tableLen; ++i) { index2 = _pathfinderPositionIndexTable[i]; x1 = _pathfinderPositionTable[index1*2+0] + x; y1 = _pathfinderPositionTable[index1*2+1] + y; x2 = _pathfinderPositionTable[index2*2+0] + x; y2 = _pathfinderPositionTable[index2*2+1] + y; int wayLen = findWay(x1, y1, x2, y2, moveTable, sizeLeft); moveTable += wayLen; sizeLeft -= wayLen; // unlike the original we want to be sure that the size left is correct index1 = index2; } }
short search(){ printf("SEARCHING\n"); short nodes[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; short x = position[0]; short y = position[1]; //map[x][y+6][0] = Robot_GetIntersections(); //Kreuzung erhalten unsigned short intersection = mapIntersection(x, y + 6); fillNodes(nodes, intersection/16); //Knoten füllen fillUsed(nodes); //existierende Knoten auf "besucht" testen map[x][y+6][1] = 2; //Kreuzung auf "besucht" stellen if (findWay(nodes) == 1){ //Weg finden return 1; } return 0; }
bool PathFinder::initFinder(int startX, int startY, int goalX, int goalY) { m_CostMap.clear(); m_StartPos.x = startX; m_StartPos.y = startY; m_GoalPos.x = goalX; m_GoalPos.y = goalY; Tag firstTag; firstTag.m_X = m_StartPos.x; firstTag.m_Y = m_StartPos.y; firstTag.m_PastCost = 0; firstTag.m_FutureCost = abs(goalX - startX) + abs(goalY - startY); m_CostMap[m_StartPos.x + m_StartPos.y * m_MapSize.width] = firstTag.totalCost(); return findWay(firstTag); }
void gameClient(sf::RenderWindow & window,char * mapName){ int i,/*displacementX=0,displacementY=0,*/ menu=0; gameMap_t map; // int redrawMMAP = 1; cursor_t gCur; gCur.status = 0; gCur.cell = NULL; player_t players; players.resourcesPlayer1 = 400; players.resourcesPlayer2 = 400; // player_t player2; unsigned int currentPlayerTurn=0; selection_t select; select.status=0; select.cell=NULL; createMap(&map); /* Set textures. */ sf::Texture background, interface_image,menu1,menu2,grind,cursor,pCourse,endTurn1,endTurn2,sel,enemy,fpT,spT,cT1,cT2,cB1,cB2; sf::Sprite gameBackground,gameInterface,gameMenu,gameGrind,gameCursor,aCell,gameEndTurn,cSel,cEnemy,cpT,cTc,cBc; menu1.loadFromFile("gameInterface/menu.png"); fpT.loadFromFile("gameInterface/fpTurn.png"); spT.loadFromFile("gameInterface/spTurn.png"); enemy.loadFromFile("gameInterface/enemyCell.png"); sel.loadFromFile("gameInterface/selected.png"); menu2.loadFromFile("gameInterface/menuConfirmed.png"); grind.loadFromFile("maps/grind.png"); endTurn1.loadFromFile("gameInterface/endTurn.png"); endTurn2.loadFromFile("gameInterface/endTurnConfirmed.png"); cT1.loadFromFile("gameInterface/cTank.png"); cT2.loadFromFile("gameInterface/cTankC.png"); cB1.loadFromFile("gameInterface/cBuggy.png"); cB2.loadFromFile("gameInterface/cBuggyC.png"); //test addUnit(&map,window,0,TANK,15,0); addUnit(&map,window,0,BUGGY,12,0); addUnit(&map,window,0,TANK,9,0); addUnit(&map,window,1,TANK,27,18); addUnit(&map,window,1,BUGGY,30,18); addUnit(&map,window,1,TANK,33,18); addObject(&map,window,0,20,12); addObject(&map,window,0,10,10); addObject(&map,window,0,30,8); cpT.setPosition(130,0); cursor.loadFromFile("gameInterface/setCell.png"); pCourse.loadFromFile("gameInterface/availableCell.png"); background.loadFromFile(mapName); interface_image.loadFromFile("gameInterface/mainInterface.png"); gameBackground.setTexture(background); cSel.setTexture(sel); aCell.setTexture(pCourse); gameGrind.setTexture(grind); gameInterface.setTexture(interface_image); cEnemy.setTexture(enemy); gameCursor.setTexture(cursor); drawMinMap(window,currentPlayerTurn,&map); while (window.isOpen()){ cameraMouseMove(window,&map); mouseEvents(window,&map); menu=gameSelection(window,gameMenu,menu1,menu2,gameEndTurn,endTurn1,endTurn2,cTc,cT1,cT2,cBc,cB1,cB2); gameBackground.setPosition(map.displacementX,map.displacementY); gameInterface.setPosition(-1,-1); gameMenu.setPosition(1700,0); gameEndTurn.setPosition(1500,5); cTc.setPosition(1680,750); cBc.setPosition(1680,890); selectUnit(&map,window,cSel,&select,currentPlayerTurn); if(select.status==1){ cSel.setPosition(select.cell->X,select.cell->Y); } sf::Event event; if (sf::Mouse::isButtonPressed(sf::Mouse::Left)&&menu==1){ if(pauseMenu(window)==0){ break; } } if (sf::Mouse::isButtonPressed(sf::Mouse::Left)&&menu>=3){ createUnit(&map,&players,currentPlayerTurn,menu,window,&select,gameBackground,gameInterface,gameMenu,gameEndTurn,cTc,cBc); } if (sf::Mouse::isButtonPressed(sf::Mouse::Left)&&menu==2){ isEnd(&map,window,endFn); getOP(&map,&players); getResources(&map,currentPlayerTurn,&players); deleteSelect(&select); overmind(&map,window,&select,aCell,cEnemy,&gCur,gameBackground,gameInterface,gameMenu,gameEndTurn,currentPlayerTurn,cTc,&players,cBc); endTurn(&map); Sleep(500); } if (sf::Mouse::isButtonPressed(sf::Mouse::Right)){ deleteSelect(&select); } while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) { window.close(); } } window.clear(sf::Color::Black); window.draw(gameBackground); drawUnits(&map,window); if(cursorConfirm(window,&map,gameCursor,&gCur)==1){ window.draw(gameCursor); } if(select.status==1){ window.draw(cSel); findWay(&map,window,&select,aCell,cEnemy,&gCur,gameBackground,gameInterface,gameMenu,gameEndTurn,currentPlayerTurn,cTc,&players,cBc); } window.draw(gameInterface); if(select.status==1){ pData(window,&select); } window.draw(gameMenu); window.draw(gameEndTurn); drawMinMap(window,currentPlayerTurn,&map); drawPlayer(window,currentPlayerTurn,&players); window.draw(cTc); window.draw(cBc); window.display(); } }