summaryrefslogtreecommitdiff
path: root/src/T2DLL/T2Maru_Reggae.cpp
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2023-06-28 22:22:32 +0100
committerAsh Wolf <ninji@wuffs.org>2023-06-28 22:22:32 +0100
commitc0c336500955a23e344651e5412c9d9d441ef4ee (patch)
tree790769c748db307cf3314f6e896e2f61c68561a2 /src/T2DLL/T2Maru_Reggae.cpp
parent37e364b2c6cc7487a1c888d256a73e5337bb7189 (diff)
downloadt2win-c0c336500955a23e344651e5412c9d9d441ef4ee.tar.gz
t2win-c0c336500955a23e344651e5412c9d9d441ef4ee.zip
first pass of T2DLL
Diffstat (limited to '')
-rw-r--r--src/T2DLL/T2Maru_Reggae.cpp656
1 files changed, 645 insertions, 11 deletions
diff --git a/src/T2DLL/T2Maru_Reggae.cpp b/src/T2DLL/T2Maru_Reggae.cpp
index fe26eeb..612dc62 100644
--- a/src/T2DLL/T2Maru_Reggae.cpp
+++ b/src/T2DLL/T2Maru_Reggae.cpp
@@ -1,43 +1,677 @@
+#include "CResFile.h"
+#include "GlobalFunc.h"
+#include "T2Archive.h"
+#include "T2DateTime.h"
+#include "T2EquipPtrList.h"
+#include "T2FloorInfo.h"
#include "T2Maru_Reggae.h"
+#include "T2Name.h"
+#include "T2NameList.h"
+#include "T2People.h"
+#include "T2PeopleArrayList.h"
+#include "T2PeopleDef.h"
+#include "T2PeopleLinkIterator.h"
+#include "T2Pool.h"
+#include "T2RegistedTenantDB.h"
+#include "T2RouteNavigator.h"
+#include "T2SoundPlayer.h"
+#include "T2TemplatePluginList.h"
+#include "T2Tenant.h"
+#include "T2TowerDoc.h"
+#include "T2TowerEvent.h"
+#include "T2TowerMainView.h"
+#include "T2TowerMessage.h"
+#include "T2WorldDef.h"
+#include "URect.h"
+#include "UT2Coordinate.h"
+#include "UT2Utils.h"
-T2Maru_Reggae::T2Maru_Reggae(T2TowerEvent*, CResFile*, int) {
+T2Maru_Reggae::T2Maru_Reggae(T2TowerEvent* inTowerEvent, CResFile* inResFile, int inSubID)
+ : T2EventItem(inTowerEvent, inResFile, inSubID)
+{
+ int subResID;
+
+ *inResFile >> mAnimResID;
+ *inResFile >> subResID;
+ *inResFile >> mTargetTenantCategory;
+ *inResFile >> m3C;
+ *inResFile >> mReggaeName;
+ mIsReggae = (mReggaeName.GetLength() > 0);
+
+ CResFile subResFile;
+ if (subResFile.OpenResource(GetWorldDef()->mModuleHandle, subResID, 'VIPL'))
+ subResFile >> mSilhouetteType;
+ else
+ mSilhouetteType = 0;
+
+ mStatus = kMaruReggaeStatus0;
+ mReggaeManID = 0;
+ mVisitTenantID = 0;
+ mLastMinutes = 0;
+ mDidSetSilhouetteDef = false;
+ mDidChangeDirection = false;
+ mCounter = 0;
+ mGuardman = NULL;
+
+ Sounds->AddSound("MR:Maru", SoundPriority_1, 9003, GetWorldModuleHandle());
+ Sounds->AddSound("MR:Rege", SoundPriority_1, 9004, GetWorldModuleHandle());
}
/*virtual*/ T2Maru_Reggae::~T2Maru_Reggae() {
+ if (Sounds) {
+ Sounds->DeleteSound("MR:Maru");
+ Sounds->DeleteSound("MR:Rege");
+ }
+
+ if (mGuardman)
+ delete mGuardman;
}
-/*virtual*/ int T2Maru_Reggae::Start(T2TowerDoc*) {
+/*virtual*/ BOOL T2Maru_Reggae::Start(T2TowerDoc* inDoc) {
+ mStatus = kMaruReggaeStatus0;
+ mReggaeManID = 0;
+ mVisitTenantID = 0;
+ mDidChangeDirection = false;
+ mLastMinutes = 0;
+
+ T2Tenant *theTenant = FindTargetTenant(inDoc);
+ if (theTenant) {
+ T2Pool *thePool = inDoc->towerDoc_vf130();
+#line 85
+ _ASSERT(thePool != NULL);
+
+ T2People *thePeople = thePool->BornVIP(mSilhouetteType, 0);
+ if (thePeople) {
+ CString nameStr;
+ thePeople->GetName(nameStr);
+
+ T2Name *theName = inDoc->mNameDB->Search(thePeople);
+ if (theName) {
+ theName->SetName(nameStr);
+ } else {
+ T2Name *theNewName = new T2Name(nameStr, thePeople, false);
+ inDoc->mNameDB->Add(theNewName);
+ }
+
+ T2MatterDef *theMatterDef = thePeople->GetMatterDef();
+ T2TemplatePluginList *thePluginList = inDoc->towerDoc_vf128();
+ T2SilhouetteDef *theSilhouetteDef = thePluginList ? thePluginList->FindSilhouette(theMatterDef->mSilhouetteID + 1) : NULL;
+
+ if (theSilhouetteDef) {
+ thePeople->SetSilhouetteDef(kPeopleStyle1, theSilhouetteDef);
+ mDidSetSilhouetteDef = true;
+ } else {
+ mDidSetSilhouetteDef = false;
+ }
+
+ thePeople->mColor = 11;
+ thePeople->SetDestination(theTenant->mEquipID);
+ thePeople->SetSpecialFlag(kSpecialFlag20 | kSpecialFlag40);
+
+ mReggaeManID = thePeople->GetPeopleID();
+ mVisitTenantID = theTenant->GetEquipID();
+ mLastMinutes = GetEndTime();
+ mLastStatus = thePeople->GetStatus();
+
+ mStatus = kMaruReggaeStatus1;
+ }
+ }
+
+ return (mStatus != kMaruReggaeStatus0);
}
-/*virtual*/ int T2Maru_Reggae::Exec(T2TowerDoc*) {
+/*virtual*/ int T2Maru_Reggae::Exec(T2TowerDoc* inDoc) {
+ int result = 0;
+
+ switch (mStatus) {
+ case kMaruReggaeStatus0:
+ case kMaruReggaeStatus9:
+ mStatus = kMaruReggaeStatus0;
+ result = 3;
+ break;
+ }
+
+ if (DoReception(inDoc))
+ result = 3;
+ else
+ result = IsExclusive() ? 1 : 0;
+
+ return result;
}
-int T2Maru_Reggae::DoReception(T2TowerDoc*) {
+BOOL T2Maru_Reggae::DoReception(T2TowerDoc* inDoc) {
+ if (mGuardman && !mGuardman->DoReception(inDoc)) {
+ delete mGuardman;
+ mGuardman = NULL;
+ mLastMinutes = 0;
+ }
+
+ T2People *thePeople = GetReggaeMan();
+ T2Tenant *theTenant;
+ int pplStatus;
+
+ if (thePeople) {
+ T2DateTime *theNow = inDoc->mNow;
+ pplStatus = thePeople->GetStatus();
+
+ if (pplStatus != mLastStatus || theNow->GetRawMinutes() > mLastMinutes) {
+ mLastMinutes = theNow->GetRawMinutes();
+
+ switch (pplStatus) {
+ case kStatus12:
+ if (mStatus != kMaruReggaeStatus11 && mLastMinutes < GetEndTime()) {
+ theTenant = FindTargetTenant(inDoc);
+ if (theTenant) {
+ thePeople->SetDestination(theTenant->GetEquipID());
+ thePeople->ChangeStatus(kStatus3);
+ mStatus = kMaruReggaeStatus1;
+ mLastMinutes = GetEndTime();
+ } else {
+ mStatus = kMaruReggaeStatus11;
+ }
+ }
+ break;
+
+ case kStatus1:
+ if (mStatus != kMaruReggaeStatus8) {
+ T2Name *theName = inDoc->mNameDB->Search(thePeople);
+ if (theName) {
+ inDoc->mNameDB->RemoveName(theName);
+ delete theName;
+ }
+ mStatus = kMaruReggaeStatus8;
+ } else if (mGuardman == NULL) {
+ T2Pool *thePool = inDoc->towerDoc_vf130();
+#line 208
+ _ASSERT(thePool != NULL);
+
+ thePool->DeadVIP(thePeople);
+ return true;
+ }
+ break;
+
+ case kStatus9:
+ thePeople->UpdateEstimation();
+ mLastMinutes = GetEndTime();
+ break;
+
+ case kStatus15:
+ {
+ unsigned int theNextTenant;
+ switch (mStatus) {
+ case kMaruReggaeStatus1:
+ theTenant = inDoc->towerDoc_vf12C()->GetTenant(mVisitTenantID);
+ if (theTenant) {
+ T2EquipDef *theDef = theTenant->GetEquipDef();
+ if (theTenant->IsTherePeople() && !theTenant->IsFireproof()) {
+ if (mTargetTenantCategory == 0 || (theDef && theDef->GetCategory() == mTargetTenantCategory)) {
+ if (mIsReggae)
+ ReggaeReception(inDoc, thePeople);
+ else
+ MaruReception(inDoc, thePeople);
+ break;
+ }
+ }
+ }
+
+ theNextTenant = FindNextTenant(inDoc);
+ if (theNextTenant) {
+ mVisitTenantID = theNextTenant;
+ thePeople->SetDestination(mVisitTenantID);
+ thePeople->ChangeStatus(kStatus3);
+ mLastMinutes = GetEndTime();
+ break;
+ }
+
+ case kMaruReggaeStatus5:
+ theTenant = FindTargetTenant(inDoc);
+ if (mLastMinutes >= GetEndTime() || theTenant == NULL) {
+ mVisitTenantID = 1;
+ mStatus = kMaruReggaeStatus11;
+ } else {
+ mVisitTenantID = theTenant->GetEquipID();
+ mStatus = kMaruReggaeStatus1;
+ }
+ thePeople->ChangeStatus(kStatus3);
+ thePeople->ChangeStyle(kPeopleStyle0);
+ thePeople->SetDestination(mVisitTenantID);
+ mDidChangeDirection = false;
+ mLastMinutes = GetEndTime();
+ break;
+
+ case kMaruReggaeStatus2:
+ case kMaruReggaeStatus3:
+ case kMaruReggaeStatus4:
+ MaruReception(inDoc, thePeople);
+ break;
+
+ case kMaruReggaeStatus6:
+ case kMaruReggaeStatus7:
+ ReggaeReception(inDoc, thePeople);
+ break;
+ }
+ break;
+ }
+
+ default:
+ mLastMinutes = GetEndTime();
+ }
+
+ mLastStatus = thePeople->GetStatus();
+ }
+ }
+
+ return false;
}
-void T2Maru_Reggae::MaruReception(T2TowerDoc*, T2People*) {
+void T2Maru_Reggae::MaruReception(T2TowerDoc* inDoc, T2People* inPeople) {
+ switch (mStatus) {
+ case kMaruReggaeStatus1:
+ inPeople->SetDestination(0);
+ inPeople->UpdateEstimation();
+ if (mDidSetSilhouetteDef)
+ inPeople->ChangeStyle(kPeopleStyle1);
+ inPeople->ChangeWalkStyle(0);
+ inPeople->ChangeStatus(kStatus14);
+ mLastMinutes = GetEndTime();
+ mStatus = kMaruReggaeStatus2;
+ break;
+
+ case kMaruReggaeStatus2:
+ mLastMinutes += 30;
+ if (mLastMinutes > GetEndTime())
+ mLastMinutes = GetEndTime();
+ mStatus = kMaruReggaeStatus3;
+ break;
+
+ case kMaruReggaeStatus3:
+ case kMaruReggaeStatus4:
+ {
+ POINT curPos = inPeople->GetCurPosition();
+
+ CRect theRect;
+ T2TowerMainView *theView = inDoc->GetTowerMainView();
+ theView->GetClientRect(theRect);
+ theRect.OffsetRect(theView->m64);
+
+ UT2Coordinate::QDToUnit(theRect, inDoc->towerDoc_vf108());
+
+ if (theRect.PtInRect(curPos) && inDoc->towerDoc_vf140() != ViewMode_1) {
+ UT2Coordinate::MakeRect(theRect, curPos, 2, 1);
+ theView->tmv_vf128(theRect, true);
+ } else {
+ mStatus = kMaruReggaeStatus4;
+ }
+
+ mStatus++;
+ if (mStatus < kMaruReggaeStatus5) {
+ Sounds->Play("MR:Maru", SoundMask_10, SoundFlags_10, &curPos, PlayMode_0, 100);
+ inPeople->ChangeWalkStyle(2);
+ mLastMinutes += 8;
+ } else {
+ inPeople->ChangeWalkStyle(0);
+ mLastMinutes += 30;
+ if (mLastMinutes > GetEndTime())
+ mLastMinutes = GetEndTime();
+ }
+ break;
+ }
+ }
}
-void T2Maru_Reggae::ReggaeReception(T2TowerDoc*, T2People*) {
+void T2Maru_Reggae::ReggaeReception(T2TowerDoc* inDoc, T2People* inPeople) {
+ POINT curPos;
+ T2Tenant *theTenant;
+
+ switch (mStatus) {
+ case kMaruReggaeStatus1:
+ inPeople->SetDestination(0);
+ inPeople->UpdateEstimation();
+
+ theTenant = inDoc->towerDoc_vf12C()->GetTenant(mVisitTenantID);
+ if (theTenant) {
+ CRect rect;
+ theTenant->GetEquipArea(rect);
+ rect.left += URect::Width(rect) / 2;
+
+ POINT curPos = inPeople->GetCurPosition();
+ if (
+ (curPos.x > rect.left && inPeople->GetDirection() == 0) ||
+ (curPos.x < rect.left && inPeople->GetDirection() == 1)
+ )
+ inPeople->FlipDirection();
+
+ inPeople->SetCurrDestPos(rect.TopLeft());
+ inPeople->ChangeStatus(kStatus14);
+ mLastMinutes = GetEndTime();
+ mCounter = 0;
+ mStatus = kMaruReggaeStatus6;
+ } else {
+ mStatus = kMaruReggaeStatus5;
+ }
+ break;
+
+ case kMaruReggaeStatus6:
+ curPos = inPeople->GetCurPosition();
+ theTenant = inDoc->towerDoc_vf12C()->GetTenant(curPos.y, curPos.x);
+ if (theTenant && !theTenant->IsFloor() && mLastMinutes < GetEndTime()) {
+ CRect theRect;
+ T2TowerMainView *theView = inDoc->GetTowerMainView();
+ theView->GetClientRect(&theRect);
+ theRect.OffsetRect(theView->m64);
+
+ UT2Coordinate::QDToUnit(theRect, inDoc->towerDoc_vf108());
+
+ if (theRect.PtInRect(curPos) && inDoc->towerDoc_vf140() != ViewMode_1) {
+ UT2Coordinate::MakeRect(theRect, curPos, 2, 1);
+ theView->tmv_vf128(theRect, true);
+
+ if (inPeople->GetWalkStyle() == 0)
+ inPeople->ChangeWalkStyle(1);
+ else
+ inPeople->ChangeWalkStyle(0);
+
+ Sounds->Play("MR:Rege", SoundMask_10, SoundFlags_10, &curPos, PlayMode_0, 100);
+ }
+
+ mCounter++;
+ if ((mCounter % 60) == 0) {
+ CString message;
+ MakeClaimMessage(inDoc, theTenant, message);
+ inDoc->towerDoc_vf13C()->InfoBarMessage(message, 180, NULL);
+
+ if (!mGuardman)
+ mGuardman = new T2Guardman(this, inDoc, theTenant);
+ }
+
+ if ((mCounter % 10) == 0 && theTenant->GetFirstPeople()) {
+ T2PeopleLinkIterator iterator(theTenant->GetFirstPeople());
+ T2People *people;
+ while (iterator.Next(&people)) {
+ if (people)
+ people->IncStress(10);
+ }
+ }
+
+ mLastMinutes += 3;
+ } else {
+ mStatus = kMaruReggaeStatus5;
+ }
+ break;
+
+ case kMaruReggaeStatus7:
+ int anims[3] = {2, 0, 0};
+ anims[1] = mAnimResID;
+ anims[2] = mAnimResID + 1;
+ CString message;
+
+ curPos = inPeople->GetCurPosition();
+ theTenant = inDoc->towerDoc_vf12C()->GetTenant(curPos.y, curPos.x);
+ MakeClaimMessage(inDoc, theTenant, message);
+ inDoc->towerDoc_vf13C()->CancelInfoBarMessage(message);
+
+ // "レゲエのおじさんは警備員につかまりました。"
+ // Uncle Reggae was caught by a security guard.
+ message = "\x83\x8C\x83\x51\x83\x47\x82\xCC\x82\xA8\x82\xB6\x82\xB3\x82\xF1\x82\xCD\x8C\x78\x94\xF5\x88\xF5\x82\xC9\x82\xC2\x82\xA9\x82\xDC\x82\xE8\x82\xDC\x82\xB5\x82\xBD\x81\x42";
+ DoDialog(inDoc, 9200, mAnimResID, 2, message);
+
+ mVisitTenantID = 1;
+ mStatus = kMaruReggaeStatus11;
+
+ inPeople->ChangeStatus(kStatus3);
+ inPeople->SetDestination(mVisitTenantID);
+
+ mDidChangeDirection = false;
+ mLastMinutes = GetEndTime();
+
+ if (mGuardman)
+ mGuardman->GoHome();
+ break;
+ }
}
-void T2Maru_Reggae::MakeClaimMessage(T2TowerDoc*, T2Tenant*, CString&) {
+void T2Maru_Reggae::MakeClaimMessage(T2TowerDoc* inDoc, T2Tenant* inTenant, CString& outStr) {
+ CString floorStr, roomStr, nameStr;
+
+ int floorNum = inTenant->GetFloorNumber(inDoc->towerDoc_vf12C());
+ if (floorNum < 0)
+ floorStr.Format("B%d", -floorNum);
+ else
+ floorStr.Format("%d", floorNum);
+
+ int roomNum = inTenant->GetRoomNumber(inDoc->towerDoc_vf12C());
+ if (roomNum < 0)
+ roomStr.Format("B%d", -roomNum);
+ else
+ roomStr.Format("%d", roomNum);
+
+ T2EquipDef *theTenantDef = inTenant->GetEquipDef();
+ if (theTenantDef)
+ theTenantDef->GetName(nameStr, 0);
+
+ // "%sと%s階%s号室%sから苦情です"
+ // Complaints from %s and %s Floor %s Room %s
+ outStr.Format(
+ "%s\x82\xC6%s\x8A\x4B%s\x8D\x86\x8E\xBA%s\x82\xA9\x82\xE7\x8B\xEA\x8F\xEE\x82\xC5\x82\xB7",
+ mReggaeName, floorStr, roomStr, nameStr);
}
-T2Tenant* T2Maru_Reggae::FindTargetTenant(T2TowerDoc*) {
+T2Tenant* T2Maru_Reggae::FindTargetTenant(T2TowerDoc* inDoc) {
+ T2RouteNavigator *theNavi = inDoc->towerDoc_vf124();
+#line 521
+ _ASSERT(theNavi != NULL);
+
+ POINT theTargetPos;
+ int theHRange = GetWorldDef()->GetWidth();
+ int theVRange = GetWorldDef()->mGroundLine - 2;
+ int theTotal = theHRange * theVRange;
+
+ T2Tenant *theTenant;
+ T2EquipDef *theEquipDef;
+
+ do {
+ theTotal--;
+ if (theTotal <= 0)
+ return NULL;
+
+ theTargetPos.y = UT2Utils::Randomize(theHRange);
+ theTargetPos.x = UT2Utils::Randomize(theVRange);
+ theTenant = inDoc->mFloorInfo->GetTenant(theTargetPos.x, theTargetPos.y);
+ theEquipDef = theTenant ? theTenant->GetEquipDef() : NULL;
+ } while (
+ !theTenant ||
+ !theNavi->IsConnectRouteFromLobby(theTenant->GetEntrancePt()) ||
+ theTenant->IsFireproof() ||
+ theTenant->GetEquipID() == mVisitTenantID ||
+ !theEquipDef ||
+ (mTargetTenantCategory != 0 && theEquipDef->GetCategory() != mTargetTenantCategory)
+ );
+
+ return theTenant;
}
-unsigned int T2Maru_Reggae::FindNextTenant(T2TowerDoc*) {
+unsigned int T2Maru_Reggae::FindNextTenant(T2TowerDoc* inDoc) {
+ unsigned int theNextTenantID = 0;
+
+ T2FloorInfo *fInfo = inDoc->towerDoc_vf12C();
+#line 550
+ _ASSERT(fInfo != NULL);
+ T2People *thePeople = GetReggaeMan();
+#line 552
+ _ASSERT(thePeople != NULL);
+
+ T2Tenant *theTenant = fInfo->GetTenant(mVisitTenantID);
+ if (theTenant) {
+ RECT rect;
+ theTenant->GetEquipArea(rect);
+
+ do {
+ rect.left += thePeople->GetDirection() ? -1 : 1;
+ theNextTenantID = fInfo->GetTenantID(rect.bottom - 1, rect.left);
+ } while (theNextTenantID == mVisitTenantID);
+
+ if (theNextTenantID == 0 && !mDidChangeDirection) {
+ mDidChangeDirection = true;
+ thePeople->FlipDirection();
+ theNextTenantID = mVisitTenantID;
+ }
+ }
+
+ return theNextTenantID;
}
T2People* T2Maru_Reggae::GetReggaeMan() {
+ return GetTowerDoc()->mPeopleArrayList->FindPeople(mReggaeManID);
}
T2Tenant* T2Maru_Reggae::GetVisitTenant() {
+ return (mStatus == kMaruReggaeStatus6) ? GetTowerDoc()->towerDoc_vf12C()->GetTenant(mVisitTenantID) : NULL;
+}
+
+/*virtual*/ void T2Maru_Reggae::Write(T2Archive& inArchive) {
+ unsigned int len = 14;
+ inArchive << len;
+
+ inArchive << (short) mStatus;
+ inArchive << mReggaeManID;
+ inArchive << (unsigned short) mVisitTenantID;
+
+ unsigned char flag = (mDidChangeDirection != 0);
+ inArchive << flag;
+ flag = (mDidSetSilhouetteDef != 0);
+ inArchive << flag;
+
+ inArchive << mCounter;
}
-/*virtual*/ void T2Maru_Reggae::Write(T2Archive&) {
+/*virtual*/ void T2Maru_Reggae::Read(T2Archive& inArchive) {
+ unsigned int len;
+ unsigned short theUInt16;
+ short theSInt16;
+ unsigned char theChar;
+
+ inArchive >> len;
+
+ inArchive >> theSInt16;
+ mStatus = theSInt16;
+
+ inArchive >> mReggaeManID;
+
+ inArchive >> theUInt16;
+ mVisitTenantID = theUInt16;
+
+ inArchive >> theChar;
+ mDidChangeDirection = (theChar != 0);
+ inArchive >> theChar;
+ mDidSetSilhouetteDef = (theChar != 0);
+
+ inArchive >> mCounter;
+}
+
+
+
+T2Guardman::T2Guardman(T2Maru_Reggae *inOwner, T2TowerDoc *inDoc, T2Tenant *inTenant) {
+ mOwner = inOwner;
+ mPeople = NULL;
+
+ T2RegistedTenantDB *theDB = inDoc->towerDoc_vf174();
+#line 647
+ _ASSERT(theDB != NULL);
+
+ T2EquipPtrList *theList = theDB->GetList(kTenantRegistID5);
+ if (theList) {
+ T2Tenant *theTenant;
+ theList->FetchItemAt(1, &theTenant);
+
+ if (theTenant) {
+ T2RouteNavigator *theNavi = inDoc->towerDoc_vf124();
+#line 656
+ _ASSERT(theNavi != NULL);
+
+ POINT theNextPt = inTenant->GetEntrancePt();
+ T2Tenant *selectedTenant = NULL;
+ LArrayIterator iterator(*theList);
+ for (int score = theTenant->GetEmployeeSearchScore(); score > 0; score--) {
+ int found = 0;
+ iterator.ResetTo(0);
+
+ while (iterator.Next(&theTenant)) {
+ POINT exitPt = theTenant->GetExitPt();
+ if (theNavi->CheckRoute(exitPt, theNextPt, score)) {
+ selectedTenant = theTenant;
+ found++;
+ if (found > 1)
+ break;
+ }
+ }
+
+ if (found <= 1)
+ break;
+ }
+
+ if (selectedTenant && selectedTenant->GetFirstPeople()) {
+ mPeople = selectedTenant->GetFirstPeople();
+ mPeople->SetDestination(inTenant->GetEquipID());
+ mPeople->SetSpecialFlag(kSpecialFlag20 | kSpecialFlag40);
+ mPeople->SetReturn(selectedTenant->GetEquipID());
+ mPeople->mColor = 11;
+ selectedTenant->PushOutPeople(inDoc, mPeople);
+ }
+ }
+ }
+}
+
+T2Guardman::~T2Guardman() {
+ if (mPeople) {
+ mPeople->UpdateEstimation();
+ mPeople->ClearSpecialFlag(kSpecialFlag20 | kSpecialFlag40);
+ mPeople->ClearColor();
+ }
+}
+
+BOOL T2Guardman::DoReception(T2TowerDoc *inDoc) {
+ BOOL result = true;
+
+ if (mPeople) {
+ switch (mPeople->GetStatus()) {
+ case kStatus15:
+ {
+ CPoint curPos = mPeople->GetCurPosition();
+ T2Tenant *theTenant = inDoc->towerDoc_vf12C()->GetTenant(curPos.y, curPos.x);
+ T2People *theReggaeMan = mOwner->GetReggaeMan();
+ if (theTenant && theReggaeMan && mOwner->mStatus == kMaruReggaeStatus6) {
+ CPoint reggaeManPos = theReggaeMan->GetCurPosition();
+ if (theTenant == inDoc->towerDoc_vf12C()->GetTenant(reggaeManPos.y, reggaeManPos.x)) {
+ if (reggaeManPos == curPos) {
+ mOwner->mStatus = kMaruReggaeStatus7;
+ } else {
+ if (
+ (curPos.x > reggaeManPos.x && mPeople->GetDirection() == 0) ||
+ (curPos.x < reggaeManPos.x && mPeople->GetDirection() == 1)
+ )
+ mPeople->FlipDirection();
+
+ mPeople->SetCurrDestPos(reggaeManPos);
+ mPeople->ChangeStatus(kStatus14);
+ }
+ }
+ }
+ break;
+ }
+
+ case kStatus11:
+ result = false;
+ break;
+ }
+ } else {
+ result = false;
+ }
+
+ return result;
}
-/*virtual*/ void T2Maru_Reggae::Read(T2Archive&) {
+void T2Guardman::GoHome() {
+ mPeople->SetReturnToDestination();
+ mPeople->SetStatus(kStatus3);
+ mPeople->ClearSpecialFlag(kSpecialFlag40);
}