TaxiRouteInSim TakeoffQueueInSim::GetTaxiRoute( IntersectionNodeInSim * entryNode ) { TaxiRouteInSim taxiRoute(OnQueueToRunway,entryNode,entryNode); TakeoffQueueRouteFinder routeFinder(this); routeFinder.InitPathInfo(); bool bFound = routeFinder.FindRoute(entryNode,m_pNodeOnRunway,taxiRoute); //ASSERT(bFound); return taxiRoute; }
int Router::doWalk(byte *ob_logic, byte *ob_graph, byte *ob_mega, byte *ob_walkdata, int16 target_x, int16 target_y, uint8 target_dir) { ObjectLogic obLogic(ob_logic); ObjectGraphic obGraph(ob_graph); ObjectMega obMega(ob_mega); // If this is the start of the walk, calculate the route. if (obLogic.getLooping() == 0) { // If we're already there, don't even bother allocating // memory and calling the router, just quit back & continue // the script! This avoids an embarassing mega stand frame // appearing for one cycle when we're already in position for // an anim eg. repeatedly clicking on same object to repeat // an anim - no mega frame will appear in between runs of the // anim. if (obMega.getFeetX() == target_x && obMega.getFeetY() == target_y && obMega.getCurDir() == target_dir) { _vm->_logic->writeVar(RESULT, 0); return IR_CONT; } assert(target_dir <= 8); obMega.setWalkPc(0); // Set up mem for _walkData in route_slots[] & set mega's // 'route_slot_id' accordingly allocateRouteMem(); int32 route = routeFinder(ob_mega, ob_walkdata, target_x, target_y, target_dir); // 0 = can't make route to target // 1 = created route // 2 = zero route but may need to turn if (route != 1 && route != 2) { freeRouteMem(); _vm->_logic->writeVar(RESULT, 1); return IR_CONT; } // Walk is about to start obMega.setIsWalking(1); obLogic.setLooping(1); obGraph.setAnimResource(obMega.getMegasetRes()); } else if (_vm->_logic->readVar(EXIT_FADING) && _vm->_screen->getFadeStatus() == RDFADE_BLACK) { // Double clicked an exit, and the screen has faded down to // black. Ok, that's it. Back to script and change screen. // We have to clear te EXIT_CLICK_ID variable in case there's a // walk instruction on the new screen, or it'd be cut short. freeRouteMem(); obLogic.setLooping(0); obMega.setIsWalking(0); _vm->_logic->writeVar(EXIT_CLICK_ID, 0); _vm->_logic->writeVar(RESULT, 0); return IR_CONT; } // Get pointer to walkanim & current frame position WalkData *walkAnim = getRouteMem(); int32 walk_pc = obMega.getWalkPc(); // If stopping the walk early, overwrite the next step with a // slow-out, then finish if (_vm->_logic->checkEventWaiting() && walkAnim[walk_pc].step == 0 && walkAnim[walk_pc + 1].step == 1) { // At the beginning of a step earlySlowOut(ob_mega, ob_walkdata); } // Get new frame of walk obGraph.setAnimPc(walkAnim[walk_pc].frame); obMega.setCurDir(walkAnim[walk_pc].dir); obMega.setFeetX(walkAnim[walk_pc].x); obMega.setFeetY(walkAnim[walk_pc].y); // Is the NEXT frame is the end-marker (512) of the walk sequence? if (walkAnim[walk_pc + 1].frame != 512) { // No, it wasn't. Increment the walk-anim frame number and // come back next cycle. obMega.setWalkPc(obMega.getWalkPc() + 1); return IR_REPEAT; } // We have reached the end-marker, which means we can return to the // script just as the final (stand) frame of the walk is set. freeRouteMem(); obLogic.setLooping(0); obMega.setIsWalking(0); // If George's walk has been interrupted to run a new action script for // instance or Nico's walk has been interrupted by player clicking on // her to talk // There used to be code here for checking if two megas were colliding, // but it had been commented out, and it was only run if a function // that always returned zero returned non-zero. if (_vm->_logic->checkEventWaiting()) { _vm->_logic->startEvent(); _vm->_logic->writeVar(RESULT, 1); return IR_TERMINATE; } _vm->_logic->writeVar(RESULT, 0); // CONTINUE the script so that RESULT can be checked! Also, if an anim // command follows the fnWalk command, the 1st frame of the anim (which // is always a stand frame itself) can replace the final stand frame of // the walk, to hide the slight difference between the shrinking on the // mega frames and the pre-shrunk anim start-frame. return IR_CONT; }