diff options
Diffstat (limited to 'src/T2DLL/T2PeopleDemandList.cpp')
-rw-r--r-- | src/T2DLL/T2PeopleDemandList.cpp | 132 |
1 files changed, 120 insertions, 12 deletions
diff --git a/src/T2DLL/T2PeopleDemandList.cpp b/src/T2DLL/T2PeopleDemandList.cpp index 06e943c..e8def3b 100644 --- a/src/T2DLL/T2PeopleDemandList.cpp +++ b/src/T2DLL/T2PeopleDemandList.cpp @@ -1,40 +1,148 @@ +#include "T2Archive.h" #include "T2PeopleDemandList.h" +#include "T2PeopleTimeZoneList.h" +#include "T2PeopleType.h" +#include "T2PoolDef.h" +#include "T2SeasonParamDef.h" +#include "T2TenantMemberDef.h" +#include "UT2Utils.h" -T2PeopleDemandList::T2PeopleDemandList(T2PoolDef*, T2SeasonParamDef*, T2WorldDef*) { +T2PeopleDemandList::T2PeopleDemandList(T2PoolDef* inPoolDef, T2SeasonParamDef* inSeasonParamDef, T2WorldDef* inWorldDef) + : LArray(sizeof(T2PeopleTimeZoneList *)) + , mSeasonParamDef(inSeasonParamDef) +{ + int count = inPoolDef->GetNumOfDemand(); + for (int i = 0; i < count; i++) { + DemandInfo *theDemandInfo = inPoolDef->GetDemandInfo(i); + T2PeopleTimeZoneList *theTimeZoneList = new T2PeopleTimeZoneList(theDemandInfo->b, theDemandInfo->a, inWorldDef); + Add(theTimeZoneList); + } } -T2PeopleDemandList::T2PeopleDemandList(T2Archive&, T2SeasonParamDef*, T2WorldDef*) { +T2PeopleDemandList::T2PeopleDemandList(T2Archive& inArchive, T2SeasonParamDef* inSeasonParamDef, T2WorldDef* inWorldDef) + : LArray(sizeof(T2PeopleTimeZoneList *)) + , mSeasonParamDef(inSeasonParamDef) +{ + unsigned int count; + inArchive >> count; + + for (unsigned int i = 0; i < count; i++) { + T2PeopleTimeZoneList *theTimeZoneList = new T2PeopleTimeZoneList(inArchive, inWorldDef); + Add(theTimeZoneList); + } } /*virtual*/ T2PeopleDemandList::~T2PeopleDemandList() { + LArrayIterator iterator(*this); + T2PeopleTimeZoneList *theTimeZoneList; + + while (iterator.Next(&theTimeZoneList)) + delete theTimeZoneList; } -void T2PeopleDemandList::Add(T2PeopleTimeZoneList*) { +void T2PeopleDemandList::Add(T2PeopleTimeZoneList* inTimeZoneList) { + InsertItemsAt(1, mItemCount + 1, &inTimeZoneList); } -void T2PeopleDemandList::Add(T2PoolGradeDef*) { +void T2PeopleDemandList::Add(T2PoolGradeDef* inGradeDef) { + LArrayIterator iterator(*this); + int demandType = 0; + T2PeopleType peopleType; + T2PeopleTimeZoneList *theTimeZoneList; + + while (iterator.Next(&theTimeZoneList)) { + peopleType.SetDemandType(demandType); + + T2PoolDefDemandElem *theDemandElem = inGradeDef->GetDemandElem(demandType); + theTimeZoneList->Add(&peopleType, theDemandElem); + + demandType++; + } } -void T2PeopleDemandList::Init(unsigned int, unsigned int) { +void T2PeopleDemandList::Init(unsigned int inMonth, unsigned int inSomeNum) { + float rate = 0.0f; + if (mSeasonParamDef) + rate = mSeasonParamDef->GetRate(inMonth - 1); + + LArrayIterator iterator(*this); + T2PeopleTimeZoneList *theTimeZoneList; + + while (iterator.Next(&theTimeZoneList)) + theTimeZoneList->Init(inSomeNum, rate); } -void T2PeopleDemandList::IncHour(unsigned int) { +void T2PeopleDemandList::IncHour(unsigned int inMonth) { + float rate = 0.0f; + if (mSeasonParamDef) + rate = mSeasonParamDef->GetRate(inMonth - 1); + + LArrayIterator iterator(*this); + T2PeopleTimeZoneList *theTimeZoneList; + + while (iterator.Next(&theTimeZoneList)) + theTimeZoneList->IncHour(rate); } -T2PeopleTimeZoneList* T2PeopleDemandList::GetItem(int) const { +T2PeopleTimeZoneList* T2PeopleDemandList::GetItem(int inDemandType) const { + int index = inDemandType + 1; + T2PeopleTimeZoneList *theList; + if (!FetchItemAt(index, &theList)) + theList = NULL; + return theList; } -int T2PeopleDemandList::Find(T2TenantMemberDef*, int, unsigned int, int) const { +BOOL T2PeopleDemandList::Find(T2TenantMemberDef* inTenantMemberDef, int inEconoType, unsigned int inTransportType, BOOL inCheckOnlyFirstEconoType) const { + BOOL result = false; + + T2PeopleTimeZoneList *theList = GetItem(inTenantMemberDef->GetDemandType()); + if (theList) + result = theList->Find(inTenantMemberDef, inEconoType, inTransportType, inCheckOnlyFirstEconoType); + + return result; } -int T2PeopleDemandList::Call(T2TenantMemberDef*, int, unsigned int, T2PeopleType&) const { +BOOL T2PeopleDemandList::Call(T2TenantMemberDef* inTenantMemberDef, int inEconoType, unsigned int inTransportType, T2PeopleType& outPeopleType) const { + BOOL result = false; + int demandType = inTenantMemberDef->GetDemandType(); + + if (demandType != -1) { + T2PeopleTimeZoneList *theList = GetItem(demandType); + if (theList) + result = theList->Call(inTenantMemberDef, inEconoType, inTransportType, outPeopleType); + } else { + for (int i = UT2Utils::Randomize(mItemCount) + 1, j = 0; !result && j < mItemCount; j++, i++) { + if (i > mItemCount) + i = 1; + + T2PeopleTimeZoneList *theList = GetItem(i); + if (theList && !theList->IsFixed()) + result = theList->Call(inTenantMemberDef, inEconoType, inTransportType, outPeopleType); + } + } + + return result; } -void T2PeopleDemandList::DispatchRestore(T2PeopleType&) { +void T2PeopleDemandList::DispatchRestore(T2PeopleType& peopleType) { + T2PeopleTimeZoneList *theList = GetItem(peopleType.GetDemandType()); + if (theList) + theList->DispatchRestore(peopleType); } -void T2PeopleDemandList::DispatchAdd(T2PeopleType*) { +void T2PeopleDemandList::DispatchAdd(T2PeopleType* peopleType) { + T2PeopleTimeZoneList *theList = GetItem(peopleType->GetDemandType()); + if (theList) + theList->DispatchAdd(peopleType); } -void T2PeopleDemandList::Write(T2Archive&) { +void T2PeopleDemandList::Write(T2Archive& archive) { + unsigned int count = GetCount(); + archive << count; + + for (unsigned int i = 0; i < count; i++) { + T2PeopleTimeZoneList *theList = GetItem(i); + if (theList) + theList->Write(archive); + } } |