diff options
Diffstat (limited to 'src/T2DLL/T2MoverRoutingTable.cpp')
-rw-r--r-- | src/T2DLL/T2MoverRoutingTable.cpp | 223 |
1 files changed, 210 insertions, 13 deletions
diff --git a/src/T2DLL/T2MoverRoutingTable.cpp b/src/T2DLL/T2MoverRoutingTable.cpp index 7ee928c..dd791e4 100644 --- a/src/T2DLL/T2MoverRoutingTable.cpp +++ b/src/T2DLL/T2MoverRoutingTable.cpp @@ -1,49 +1,246 @@ +#include "T2CrossEquipArray.h" +#include "T2FloorInfo.h" +#include "T2FloorPtrList.h" +#include "T2Mover.h" #include "T2MoverRoutingTable.h" +#include "T2Request.h" +#include "T2RoutingTable.h" +#include "T2Tenant.h" -T2MoverRoutingTable::T2MoverRoutingTable(T2FloorInfo*, T2FloorPtrList*, T2Mover*) { +T2MoverRoutingTable::T2MoverRoutingTable(T2FloorInfo* inFloorInfo, T2FloorPtrList* inFloorPtrList, T2Mover* inMover) + : LArray(sizeof(T2RoutingTableElem)) +{ + mMover = inMover; + mFloorPtrList = inFloorPtrList; + mFloorInfo = inFloorInfo; + + RECT rect; + inMover->GetEquipArea(rect); + mMoverHPos = (rect.left + rect.right) / 2; + + AddItems(mFloorPtrList->GetCount()); } /*virtual*/ T2MoverRoutingTable::~T2MoverRoutingTable() { } -void T2MoverRoutingTable::AddItems(int) { +void T2MoverRoutingTable::AddItems(int inCount) { + T2RoutingTableElem elem; + InsertItemsAt(inCount, mItemCount + 1, &elem); } -void T2MoverRoutingTable::RemoveItem(int) { +void T2MoverRoutingTable::RemoveItem(int inIndex) { + RemoveItemsAt(1, inIndex); } void T2MoverRoutingTable::ClearData() { + T2RoutingTableElem elem; + AssignItemsAt(GetCount(), 1, &elem); } -int T2MoverRoutingTable::GetItem(int, T2RoutingTableElem&) { +BOOL T2MoverRoutingTable::GetItem(int inIndex, T2RoutingTableElem& outItem) { + return FetchItemAt(inIndex, &outItem); } -int T2MoverRoutingTable::IsStopFloor(int) { +BOOL T2MoverRoutingTable::IsStopFloor(int inIndex) { + BOOL res = false; + T2RoutingTableElem item; + + if (FetchItemAt(inIndex, &item)) + res = item.IsStopFloor(); + + return res; } void T2MoverRoutingTable::SetStopFloor() { + LArrayIterator iterator(*mMover->GetCEArray()); + unsigned int id; + + while (iterator.Next(&id)) { + int index = mFloorPtrList->GetIndex(id); + T2RoutingTableElem item; + item.SetTable(id, mMoverHPos); + AssignItemsAt(1, index, &item); + } } -int T2MoverRoutingTable::Update(T2MoverRoutingTable*) { +BOOL T2MoverRoutingTable::Update(T2MoverRoutingTable* inTable) { + BOOL set = false; + unsigned int numOfFloor = mFloorPtrList->GetCount(); + + for (unsigned int prevFloor = 1; prevFloor <= numOfFloor; prevFloor++) { + if (!IsStopFloor(prevFloor) && inTable->IsStopFloor(prevFloor)) { + for (unsigned int nextFloor = 1; nextFloor <= numOfFloor; nextFloor++) { + if (nextFloor != prevFloor && inTable->IsStopFloor(nextFloor)) { + T2RoutingTableElem elem; + GetItem(nextFloor, elem); + + if (elem.HasRoute()) + set |= IsUpdate(inTable, nextFloor, prevFloor, elem); + } + } + } + } + + return set; } -int T2MoverRoutingTable::IsUpdate(const T2MoverRoutingTable*, unsigned int, unsigned int, T2RoutingTableElem&) { +BOOL T2MoverRoutingTable::IsUpdate(const T2MoverRoutingTable* inTable, unsigned int inNextFloorID, unsigned int inPrevFloorID, T2RoutingTableElem& inElem) { + BOOL set = false; + + unsigned int hScore = CalcHScore(inTable->GetMoverHPos() - inElem.GetFinalHPos()); + if (hScore < 120) { + T2Mover *theMover = inTable->GetMover(); + unsigned int vScore = theMover->CalcScore(mFloorPtrList->CalcDistance(inNextFloorID, inPrevFloorID)); + unsigned int totalScore = hScore + vScore + inElem.GetScore(); + + if (theMover->IsElevator()) + totalScore += 120; + + if (totalScore <= 1000) + set = IsSetTable(inPrevFloorID, inElem.GetNextFloorID(), totalScore, 0, inTable->GetMoverHPos()); + } + + return set; } -int T2MoverRoutingTable::IsSetTable(unsigned int, unsigned int, unsigned int, int, int) { +BOOL T2MoverRoutingTable::IsSetTable(unsigned int inPrevFloorID, unsigned int inNextFloorID, unsigned int inScore, int inTime, int inFinalHPos) { + BOOL set = false; + T2RoutingTableElem item; + + if (FetchItemAt(inPrevFloorID, &item)) { + if (item.IsSetTable(inNextFloorID, inScore, inTime, inFinalHPos)) { + AssignItemsAt(1, inPrevFloorID, &item); + set = true; + } + } + + return set; } -int T2MoverRoutingTable::CalcHScore(int) { +int T2MoverRoutingTable::CalcHScore(int inDistance) { + if (inDistance < 0) + inDistance *= -1; + return inDistance; } -int T2MoverRoutingTable::IsConnectRoute(int) { +BOOL T2MoverRoutingTable::IsConnectRoute(int inFloorID) { + BOOL result = false; + T2RoutingTableElem item; + + if (FetchItemAt(inFloorID, &item)) + result = item.HasRoute(); + + return result; } -int T2MoverRoutingTable::GetNextRoute(POINT, unsigned int, POINT&, unsigned int, unsigned int&) { +BOOL T2MoverRoutingTable::GetNextRoute(POINT inPt, unsigned int inFloorID, POINT& ioPt, unsigned int inFloorID2, unsigned int& outScore) { + BOOL ok = false; + + T2RoutingTableElem item; + FetchItemAt(inFloorID2, &item); + + if (item.HasNextRoute(inFloorID)) { + outScore = CalcScore(inPt, ioPt, &item); + ok = true; + } + + return ok; } -unsigned int T2MoverRoutingTable::CalcScore(POINT, POINT&, T2RoutingTableElem*) { +unsigned int T2MoverRoutingTable::CalcScore(POINT inPt, POINT& ioPt, T2RoutingTableElem* inElem) { +#pragma var_order(theNextFloor, nextFloorArea, score, moverArea, theRequest, lobby, pt, isDown) + T2Tenant *theNextFloor = mFloorInfo->GetTenant(inElem->GetNextFloorID()); +#line 377 + _ASSERT(theNextFloor != NULL); + + RECT nextFloorArea; + theNextFloor->GetEquipArea(nextFloorArea); + + POINT pt; + pt.y = nextFloorArea.bottom - 1; + + BOOL isDown = (pt.y - inPt.y) > 0; + + RECT moverArea; + mMover->GetEquipArea(moverArea); + + if (isDown) + pt.x = moverArea.right + 2; + else + pt.x = moverArea.left - 4; + + unsigned int score = inElem->GetScore() + mMover->CalcScore(pt.y - inPt.y); + + int lobby = mFloorInfo->GetGroundLine() - 1; + if (inPt.y != lobby) + score += CalcHScore(pt.x - inPt.x); + if (ioPt.y != lobby) + score += CalcHScore(ioPt.x - inElem->GetFinalHPos()); + + if (mMover->IsElevator()) + score += 120; + + T2Request *theRequest = mMover->GetRequest(mFloorInfo, mMover->UnitToPosition(inPt.y), isDown); + if (theRequest) + score += theRequest->GetNumOfContent() * 10; + + ioPt = pt; + return score; } -T2Tenant* T2MoverRoutingTable::SelectNearFloor(POINT, int&, unsigned int&) { +T2Tenant* T2MoverRoutingTable::SelectNearFloor(POINT inPt, int& outFinalHPos, unsigned int& ioScore) { + T2Tenant *result = NULL; + ioScore -= CalcHScore(mMoverHPos - inPt.x); + + if (ioScore > 0) { + LArrayIterator iterator(*this); + T2RoutingTableElem item; + int numOfFloor = 0; + + while (iterator.Next(&item)) { + if (item.HasRoute() && ioScore > item.GetScore()) { + int scoreThreshold = ioScore - item.GetScore(); + T2Tenant *theNextFloor = mFloorInfo->GetTenant(item.GetNextFloorID()); + if (theNextFloor) { + RECT area; + theNextFloor->GetEquipArea(area); + + int v = area.bottom - 1; + if (scoreThreshold > mMover->CalcScore(v - inPt.y)) + numOfFloor++; + } + } + } + + if (numOfFloor > 0) { + int randFloor = rand() % numOfFloor; + int index = 0; + iterator.ResetTo(0); + + while (!result && iterator.Next(&item)) { + if (item.HasRoute() && ioScore > item.GetScore()) { + int scoreThreshold = ioScore - item.GetScore(); + T2Tenant *theNextFloor = mFloorInfo->GetTenant(item.GetNextFloorID()); + if (theNextFloor) { + RECT area; + theNextFloor->GetEquipArea(area); + + int v = area.bottom - 1; + if (scoreThreshold > mMover->CalcScore(v - inPt.y)) { + if (index == randFloor) { + result = theNextFloor; + outFinalHPos = item.GetFinalHPos(); + ioScore = scoreThreshold; + } else { + index++; + } + } + } + } + } + } + } + + return result; } |