diff options
author | Ash Wolf <ninji@wuffs.org> | 2023-07-05 19:04:06 +0100 |
---|---|---|
committer | Ash Wolf <ninji@wuffs.org> | 2023-07-05 19:04:06 +0100 |
commit | 5e61c1280c15ab9969b94cd360cafd4a11b2dd30 (patch) | |
tree | 1fdb60d771c4351b5aa5dcf1a43376c0558625a4 /src/T2TowerDoc.cpp | |
parent | c2efba6907fab934a04959b9bb644cf7141cc955 (diff) | |
download | t2win-5e61c1280c15ab9969b94cd360cafd4a11b2dd30.tar.gz t2win-5e61c1280c15ab9969b94cd360cafd4a11b2dd30.zip |
matched T2.exe
Diffstat (limited to '')
-rw-r--r-- | src/T2TowerDoc.cpp | 4419 |
1 files changed, 4419 insertions, 0 deletions
diff --git a/src/T2TowerDoc.cpp b/src/T2TowerDoc.cpp new file mode 100644 index 0000000..f9bcf5f --- /dev/null +++ b/src/T2TowerDoc.cpp @@ -0,0 +1,4419 @@ +#include "CFilePluginList.h" +#include "CObjectQueue.h" +#include "CPluginInfoArray.h" +#include "CPluginInfo.h" +#include "DbgIPS.h" +#include "DbgPeopleView.h" +#include "DbgStepRun.h" +#include "GlobalFunc.h" +#include "T2.h" +#include "T2AdvertisePlugin.h" +#include "T2Archive.h" +#include "T2ArrowWnd.h" +#include "T2BitImage.h" +#include "T2CtrlPalette.h" +#include "T2DateTime.h" +#include "T2Dialog.h" +#include "T2DlgItemAnimation.h" +#include "T2DlgItemProgress.h" +#include "T2DlgItemText.h" +#include "T2DLL.h" +#include "T2FInfoAreaIterator.h" +#include "T2FInfoPtIterator.h" +#include "T2FloorInfo.h" +#include "T2HallEventPlugin.h" +#include "T2MainWindow.h" +#include "T2Mover.h" +#include "T2MoverArray.h" +#include "T2MoverArrayList.h" +#include "T2MoverDef.h" +#include "T2MoverPlugin.h" +#include "T2MoviePlugin.h" +#include "T2MoviePluginList.h" +#include "T2MsgWindow.h" +#include "T2MWControl.h" +#include "T2Name.h" +#include "T2NameList.h" +#include "T2OpenSelectDlg.h" +#include "T2OptionPluginList.h" +#include "T2OuterObjDef.h" +#include "T2OuterObjList.h" +#include "T2OuterObjPlugin.h" +#include "T2OutObj.h" +#include "T2OutObjArray.h" +#include "T2OutObjArrayList.h" +#include "T2PaletteAnime.h" +#include "T2People.h" +#include "T2PeopleArray.h" +#include "T2PeopleArrayList.h" +#include "T2PeopleDef.h" +#include "T2PeopleLoader.h" +#include "T2PluginInfoTable.h" +#include "T2PluginLoader.h" +#include "T2PluginSpecifier.h" +#include "T2Pool.h" +#include "T2PoolView.h" +#include "T2RegistedTenantDB.h" +#include "T2Request.h" +#include "T2RequestArrayList.h" +#include "T2RouteNavigator.h" +#include "T2SearchDialog.h" +#include "T2SettingDialog.h" +#include "T2Settlement.h" +#include "T2SilhouetteDef.h" +#include "T2SoundPlayer.h" +#include "T2StewardDialog.h" +#include "T2SysInfoDlg.h" +#include "T2TemplatePluginDB.h" +#include "T2TemplatePluginList.h" +#include "T2Tenant.h" +#include "T2TenantArray.h" +#include "T2TenantArrayList.h" +#include "T2TenantDef.h" +#include "T2TenantPlugin.h" +#include "T2ToolWindow.h" +#include "T2TowerDoc.h" +#include "T2TowerEvent.h" +#include "T2TowerMainView.h" +#include "T2TowerMessage.h" +#include "T2TrafficInfo.h" +#include "T2TreasureDialog.h" +#include "T2UnitInfo.h" +#include "T2WorldDef.h" +#include "T2WorldPlugin.h" +#include "T2WorldSelectDlg.h" +#include "UT2BkgndInfo.h" +#include "UT2Coordinate.h" +#include "UT2Utils.h" + +IMPLEMENT_DYNCREATE(T2TowerDoc, CDocument) + +BEGIN_MESSAGE_MAP(T2TowerDoc, CDocument) + ON_COMMAND(0x8009, OnSystemInformation) + ON_UPDATE_COMMAND_UI(0x800A, OnUpdateDebugStepRun) + ON_COMMAND(0x800A, OnDebugStepRun) + ON_UPDATE_COMMAND_UI(0x8010, OnUpdateDebugIdleSpeedMeasuring) + ON_COMMAND(0x8010, OnDebugIdleSpeedMeasuring) + ON_UPDATE_COMMAND_UI(0x8011, OnUpdateDebugAllLoadMeasuring) + ON_COMMAND(0x8011, OnDebugAllLoadMeasuring) + ON_UPDATE_COMMAND_UI(0x8012, OnUpdateDebugPool) + ON_COMMAND(0x8012, OnDebugPool) + ON_UPDATE_COMMAND_UI(0x8013, OnUpdateDebugDisplayIPS) + ON_COMMAND(0x8013, OnDebugDisplayIPS) + ON_UPDATE_COMMAND_UI(0x8014, OnUpdateDebugPeople) + ON_COMMAND(0x8014, OnDebugPeople) + ON_COMMAND(0x8015, OnDebugGradeUp) + ON_COMMAND(0x8016, OnDebugGradeDown) + ON_COMMAND(0x8019, OnPause) + ON_UPDATE_COMMAND_UI(0x8019, OnUpdatePause) + ON_COMMAND(0x801A, OnSetting) + ON_UPDATE_COMMAND_UI(0x801A, OnUpdateSetting) + ON_COMMAND(0x801B, OnHideElevatorRoom) + ON_UPDATE_COMMAND_UI(0x801B, OnUpdateHideElevatorRoom) + ON_COMMAND(0x8022, OnFavorite) + ON_UPDATE_COMMAND_UI(0x8022, OnUpdateFavorite) + ON_COMMAND(0x801F, OnHideControlWindow) + ON_UPDATE_COMMAND_UI(0x801F, OnUpdateHideControlWindow) + ON_COMMAND(0x8020, OnHideMessageWindow) + ON_UPDATE_COMMAND_UI(0x8020, OnUpdateHideMessageWindow) + ON_COMMAND(0x8021, OnHideToolWindow) + ON_UPDATE_COMMAND_UI(0x8021, OnUpdateHideToolWindow) +END_MESSAGE_MAP() + +T2TowerDoc::T2TowerDoc() { + g_TowerDoc = this; + gT2App->_E4 = 1; + m228 = 1; + _22C = false; + mNewDocFlag = true; + m208 = 0; + mTowerMainView = NULL; + mDestroyCallbackData = NULL; + mDestroyCallback = NULL; + + mWorldPluginID = 0; + mToolPaletteID = 1000; + + mWorldDef = NULL; + + mIsStuffLoadedFlag = false; + + _B0 = true; + mLastRequestedCursor = 256; + mCurrentCursorIndex = -1; + + _1F8 = 0; + mFundsOnClick = 0; + + mT2PluginLoader = T2_APP->mPluginLoader; + T2_APP->mDocument = this; + + m20C = 0; + + HDC hdc = GetDC(NULL); + if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) + mIsPaletteMode = true; + else + mIsPaletteMode = false; + ReleaseDC(NULL, hdc); + + mTowerMessage = NULL; +} + +/*virtual*/ T2TowerDoc::~T2TowerDoc() { + gT2App->_E4 = 0; + + if (mDestroyCallbackData && mDestroyCallback) { + mDestroyCallback(mDestroyCallbackData); + mDestroyCallbackData = NULL; + } + + towerDoc_vfD4(false); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfC8() { + mSoundPlayer = NULL; + mNameDB = NULL; + mWorldPluginSpecifier = mT2PluginLoader->FindPlugin(mWorldPluginID, 'WdPl'); + + if (!mWorldPluginSpecifier) { + if (m228) { + T2OpenSelectDlg *dlg = new T2OpenSelectDlg(this); + dlg->ShowOpenSelectDialog(); + } else { + LoadsWorldPlugin(); + } + } else { + towerDoc_vfCC(mWorldPluginSpecifier, true); + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfCC(T2PluginSpecifier *inWorldPluginSpec, BOOL inIsExistingFile) { + T2MainWindow *theMainWindow = T2_MAIN_WINDOW; + if (theMainWindow) + theMainWindow->EnableWindow(); + + if (!mWorldPluginSpecifier) { + mWorldPluginSpecifier = inWorldPluginSpec; + mWorldPluginID = mWorldPluginSpecifier->mID; + } + +#line 187 + _ASSERT(mWorldPluginSpecifier != NULL); + + mWorldPlugin = (T2WorldPlugin *) T2PluginLoader::LoadPlugin(mWorldPluginSpecifier); + mWorldDef = mWorldPlugin->LoadT2WorldDef(); + + mToolPaletteSpecifier = mT2PluginLoader->FindPlugin(mToolPaletteID, 'TOPL'); +#line 192 + _ASSERT(mToolPaletteSpecifier != NULL); + + T2_APP->mToolWindow = NULL; + + m218 = 0; + m21C = 0; + mGameLevel = mWorldDef->m70; + _1F4 = 1; + m9C = 0; + mA0 = 0; + mZoomLevel = 0; + mDrawSpeed = 25; + _94 = 0; + mViewMode = kInView; + mPause = false; + m204 = 0; + mNow = new T2DateTime(1, mWorldDef->m74, 7, 0, 0); + mFloorDef = NULL; + mDragMask = NULL; + mDebugStepRunEnabled = false; + mDisplayIPS = false; + m1C4 = NULL; + mPeopleArrayList = NULL; + mTrafficInfo = NULL; + mSearchRangeFrom = NULL; + m1F0 = 0; + mElevTransparent = false; + mWalkRate = 1; + _224 = 0; + mObjectQueue = new CObjectQueue; + mCraneCount = 0; + mCranePosArray = NULL; + mBC = 0; + mC0 = 0; + mRegistedTenantDB = new T2RegistedTenantDB; + m1A0 = NULL; + _1A4 = NULL; + _1A8 = 0; + _1AC = 0; + + mFloorInfo = new T2FloorInfo(mWorldDef); + mWorldDef->InitializeFloorInfo(mFloorInfo); + + m1CC = 0; + mRouteNavigator = new T2RouteNavigator(mFloorInfo); + mPaletteUpdated = false; + + mIsDustOn = mWorldDef->IsDustOn(mGameLevel); + mToiletDenomi = mWorldDef->GetToiletDenomi(mGameLevel); + mColdDenomi = mWorldDef->GetColdDenomi(mGameLevel, mNow->GetMonth()); + + mPaletteAnime = new T2PaletteAnime(mWorldDef, mNow); + + mTenantPlugins = new CFilePluginList('TnPl'); + mMoverPlugins = new CFilePluginList('MvPl'); + mOuterObjPlugins = new CFilePluginList('OoPl'); + mMoviePluginList = new T2MoviePluginList; + mHallEventPlugins = new CFilePluginList('HePl'); + mAdvertisePlugins = new CFilePluginList('AdPl'); + + mTenantTemplates = new T2TemplatePluginList('TnDf'); + mMoverTemplates = new T2TemplatePluginList('MvDf'); + mOuterObjTemplates = new T2TemplatePluginList('OODf'); + if (mWorldDef->IsUseMatterObject()) + mMatterTemplates = new T2TemplatePluginList('MtDf'); + else + mMatterTemplates = NULL; + mPeopleTemplates = new T2TemplatePluginList('PPDf'); + mSilhouetteTemplates = new T2TemplatePluginList('SlDf'); + + mTemplatePluginDB = new T2TemplatePluginDB; + mTemplatePluginDB->Add(mTenantTemplates); + mTemplatePluginDB->Add(mMoverTemplates); + mTemplatePluginDB->Add(mOuterObjTemplates); + if (mWorldDef->IsUseMatterObject()) + mTemplatePluginDB->Add(mMatterTemplates); + mTemplatePluginDB->Add(mPeopleTemplates); + mTemplatePluginDB->Add(mSilhouetteTemplates); + + mOuterObjList = new T2OuterObjList; + mPeopleArrayList = new T2PeopleArrayList; + mPeopleArrayList->SetWalkPeople(mWalkRate); + + mOptionPluginList = new T2OptionPluginList; + + mNameDB = new T2NameList; + + T2PeopleLoader::Load(mWorldPluginSpecifier, mTemplatePluginDB); + + towerDoc_vfD0(); + + LoadOptionPlugins(); + if (!inIsExistingFile) + SelectPlugins(false); + + CreatePool(); + + RECT theBkgndRect; + SetRect(&theBkgndRect, 0, 0, mWorldDef->GetWidth(), mWorldDef->GetHeight()); + mBkgndInfo = UT2BkgndInfo::SetupBkgndInfo(theBkgndRect, mWorldDef->mGroundLine); + mWorldDef->InitializeBkgndInfo(mBkgndInfo); + + InitSound(T2_APP->mMainWindow->mSoundPlayer); + + mWorldDef->InitializeDocument(this); + mWorldDef->InitTowerEvent(this); + + RECT theFloorArea; + mFloorInfo->GetFloorArea(theFloorArea); + mTrafficInfo = new T2TrafficInfo(theFloorArea, 100, 500, 1000, 4); + + mSettlement = new T2Settlement(this, mWorldDef->GetInitialFunds()); + + T2_APP->mMainWindow->Setup(); + + T2ToolWindow *theToolPalette = T2_APP->mMainWindow->mToolWindow; + theToolPalette->SetDocument(this); + + T2MsgWindow *messageWindow = T2_APP->mMainWindow->mMsgWindow; + messageWindow->SetDocument(this); + + T2CtrlPalette *controlPalette = T2_APP->mMainWindow->mCtrlPalette; + controlPalette->SetDocument(this); + controlPalette->vf100(mViewMode); + + T2_APP->mMainWindow->InvalidateRect(NULL); + + mIsStuffLoadedFlag = true; + m228 = 0; + + CRect mainWindowArea; + T2_APP->mMainWindow->GetWindowRect(mainWindowArea); + T2_APP->mMainWindow->x414445(); + + m188 = mTowerMainView->mScrollOffset; + + if (!mTowerMessage) + mTowerMessage = new T2TowerMessage(AfxGetInstanceHandle(), this); + + SetupGradeAnimation(); +} + +void T2TowerDoc::xUnkNameSelectWorld(T2PluginSpecifier *inWorldPluginSpec) { + towerDoc_vfCC(inWorldPluginSpec, false); + x41CFEB(); +} + +void T2TowerDoc::x41CFEB() { + mPaletteAnime->MinuteChanged(mNow); + mPaletteAnime->ChangeSE(); + mPaletteAnime->DoAnimatePalette(); + _22C = true; + + UpdateAllViews(NULL); + + T2MainWindow *theMainWindow = T2_MAIN_WINDOW; + if (theMainWindow) + theMainWindow->InvalidateRect(NULL); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfD0() { + T2ToolWindow *toolWindow = T2_APP->mToolWindow; + toolWindow = (T2ToolWindow *) T2PluginLoader::LoadPlugin(mToolPaletteSpecifier); + T2_APP->mToolWindow = toolWindow; + + toolWindow->mModule = mToolPaletteSpecifier->mInstance; + toolWindow->SetDocument(this); + + toolWindow->AddIcon( + "ToolDestruct", + 3, + // 撤去ツール + // テナント、移動設備、看板を撤去します。 + "\x93\x50\x8B\x8E\x83\x63\x81\x5B\x83\x8B\n\x83\x65\x83\x69\x83\x93\x83\x67\x81\x41\x88\xDA\x93\xAE\x90\xDD\x94\xF5\x81\x41\x8A\xC5\x94\xC2\x82\xF0\x93\x50\x8B\x8E\x82\xB5\x82\xDC\x82\xB7\x81\x42", + this); + + toolWindow->AddIcon( + "ToolFinger", + 1, + // エレベータ伸縮ツール + // エレベータの機械室をドラッグして伸縮します。 + "\x83\x47\x83\x8C\x83\x78\x81\x5B\x83\x5E\x90\x4C\x8F\x6B\x83\x63\x81\x5B\x83\x8B\n\x83\x47\x83\x8C\x83\x78\x81\x5B\x83\x5E\x82\xCC\x8B\x40\x8A\x42\x8E\xBA\x82\xF0\x83\x68\x83\x89\x83\x62\x83\x4F\x82\xB5\x82\xC4\x90\x4C\x8F\x6B\x82\xB5\x82\xDC\x82\xB7\x81\x42", + this); + + toolWindow->AddIcon( + "ToolInfo", + 3, + // 情報ツール + // テナント、移動設備、人をクリックすると情報ウィンドウが表示されます。 + "\x8F\xEE\x95\xF1\x83\x63\x81\x5B\x83\x8B\n\x83\x65\x83\x69\x83\x93\x83\x67\x81\x41\x88\xDA\x93\xAE\x90\xDD\x94\xF5\x81\x41\x90\x6C\x82\xF0\x83\x4E\x83\x8A\x83\x62\x83\x4E\x82\xB7\x82\xE9\x82\xC6\x8F\xEE\x95\xF1\x83\x45\x83\x42\x83\x93\x83\x68\x83\x45\x82\xAA\x95\x5C\x8E\xA6\x82\xB3\x82\xEA\x82\xDC\x82\xB7\x81\x42", + this); + + toolWindow->AddIcon( + "ToolZoom", + 3, + // ズームツール + // ゲーム画面を拡大縮小します。 + // 左クリックで拡大、右クリックで縮小します。 + "\x83\x59\x81\x5B\x83\x80\x83\x63\x81\x5B\x83\x8B\n\x83\x51\x81\x5B\x83\x80\x89\xE6\x96\xCA\x82\xF0\x8A\x67\x91\xE5\x8F\x6B\x8F\xAC\x82\xB5\x82\xDC\x82\xB7\x81\x42\n\x8D\xB6\x83\x4E\x83\x8A\x83\x62\x83\x4E\x82\xC5\x8A\x67\x91\xE5\x81\x41\x89\x45\x83\x4E\x83\x8A\x83\x62\x83\x4E\x82\xC5\x8F\x6B\x8F\xAC\x82\xB5\x82\xDC\x82\xB7\x81\x42", + this); + + toolWindow->AddIcon( + "ToolHand", + 3, + // スクロールツール + // 画面を自由にスクロールできます。 + "\x83\x58\x83\x4E\x83\x8D\x81\x5B\x83\x8B\x83\x63\x81\x5B\x83\x8B\n\x89\xE6\x96\xCA\x82\xF0\x8E\xA9\x97\x52\x82\xC9\x83\x58\x83\x4E\x83\x8D\x81\x5B\x83\x8B\x82\xC5\x82\xAB\x82\xDC\x82\xB7\x81\x42", + this); + + toolWindow->AddIcon( + "ToolMic", + 1, + // インタビューツール + // 歩いている人の意見を聞くことができます。 + "\x83\x43\x83\x93\x83\x5E\x83\x72\x83\x85\x81\x5B\x83\x63\x81\x5B\x83\x8B\n\x95\xE0\x82\xA2\x82\xC4\x82\xA2\x82\xE9\x90\x6C\x82\xCC\x88\xD3\x8C\xA9\x82\xF0\x95\xB7\x82\xAD\x82\xB1\x82\xC6\x82\xAA\x82\xC5\x82\xAB\x82\xDC\x82\xB7\x81\x42", + this); + + toolWindow->AddIcon( + "ToolRoot", + 1, + // 集客範囲表示ツール + // クリックしたテナントが人を呼べる範囲を表示します。 + "\x8F\x57\x8B\x71\x94\xCD\x88\xCD\x95\x5C\x8E\xA6\x83\x63\x81\x5B\x83\x8B\n\x83\x4E\x83\x8A\x83\x62\x83\x4E\x82\xB5\x82\xBD\x83\x65\x83\x69\x83\x93\x83\x67\x82\xAA\x90\x6C\x82\xF0\x8C\xC4\x82\xD7\x82\xE9\x94\xCD\x88\xCD\x82\xF0\x95\x5C\x8E\xA6\x82\xB5\x82\xDC\x82\xB7\x81\x42", + this); +} + +void T2TowerDoc::LoadOptionPlugins() { + T2PluginSpecifier *specifier; + POSITION pos; + + mT2PluginLoader->SetTypeFilter(pos, 'OPPL'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if (specifier->mAttrib == 0 || specifier->mAttrib == mWorldPluginSpecifier->mID) { + T2OptionPlugin *plugin = (T2OptionPlugin *) T2PluginLoader::LoadPlugin(specifier); + mOptionPluginList->Add(plugin); + } + } + + mOptionPluginList->DispatchEvent(kInitOptionEvent, this, NULL); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfD4(BOOL inResetMainWindow) { + _22C = false; + + if (mIsStuffLoadedFlag) { + mIsStuffLoadedFlag = false; + mOptionPluginList->DispatchEvent(kDestroyOptionEvent, this, NULL); + + if (inResetMainWindow) { + T2_MAIN_WINDOW->Teardown(); + mSoundPlayer->DeleteSoundAll(); + } + + mWorldDef->ClearCranePos(this); + + delete mPool; + T2PeopleLoader::Unload(mTemplatePluginDB); + + delete mTenantPlugins; + delete mMoverPlugins; + delete mOuterObjPlugins; + delete mMoviePluginList; + delete mHallEventPlugins; + delete mAdvertisePlugins; + delete mTenantTemplates; + delete mMoverTemplates; + delete mOuterObjTemplates; + if (mMatterTemplates) + delete mMatterTemplates; + delete mPeopleTemplates; + delete mSilhouetteTemplates; + delete mTemplatePluginDB; + delete mObjectQueue; + delete mOuterObjList; + delete mNameDB; + delete mTrafficInfo; + delete mSettlement; + delete mOptionPluginList; + UT2BkgndInfo::DisposeBkgndInfo(mBkgndInfo); + delete mRouteNavigator; + delete mFloorInfo; + + T2PluginSpecifier *specifier; + POSITION pos; + + mT2PluginLoader->SetTypeFilter(pos, 0); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if (specifier->mIsLoaded) + T2PluginLoader::UnloadPlugin(specifier); + } + + delete mRegistedTenantDB; + delete mNow; + + mSprite.AllClear(); + + if (mPeopleArrayList) + delete mPeopleArrayList; + + mWorldDef = NULL; + + UpdateAllViews(NULL); + + if (inResetMainWindow) + T2_APP->mMainWindow->InvalidateRect(NULL); + } +} + +/*virtual*/ BOOL T2TowerDoc::OnNewDocument() { + if (!CDocument::OnNewDocument()) + return false; + + towerDoc_vfD4(true); + mWorldPluginID = 0; + mNewDocFlag = true; + towerDoc_vfC8(); + + return true; +} + +/*virtual*/ BOOL T2TowerDoc::OnOpenDocument(LPCTSTR lpszPathName) { + mErrorFlag = false; + + if (!towerDoc_vf2BC(lpszPathName)) { + MessageBox(NULL, "File load error", "ERROR", MB_OK); + mErrorFlag = true; + return false; + } + + return true; +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf2BC(const char *inPath) { + BOOL loaded = true; + int viewMode = kInView; + + mNewDocFlag = false; + + T2Archive stream; + if (stream.OpenAsReadMode(inPath)) { + DWORD magic; + stream >> magic; + + if (magic == 'T200') { + stream.BeginCompressedStream(); + BOOL foundWorldPlugin = true; + + stream >> mWorldPluginID; + if (!mT2PluginLoader->FindPlugin(mWorldPluginID, 'WdPl')) + foundWorldPlugin = false; + + if (foundWorldPlugin) { + towerDoc_vfD4(true); + mTowerMainView->tmv_vf110(); + towerDoc_vfC8(); + _22C = false; + + try { +#pragma var_order(i, installedPlugins, mustCheckError, uc, queueVar, checkError, pluginInfoArray, s, theFloorArea, pluginInfo, us, scrollX, desktopRect, numPlugins, ctrlPalette, scrollY, pluginIterator, desktopWindow, pt2, anotherRect, pt1, missingPlugins) + int i; + short s; + unsigned short us; + unsigned char uc; + + stream >> s; + mGameLevel = s; + stream >> s; + m9C = s; + + stream >> mA0; + + stream >> s; + mZoomLevel = s; + + stream >> uc; + if (uc) + mPause = true; + else + mPause = false; + + stream >> s; // drawSpeed on Mac + stream >> s; // field 0x8C on Mac + + stream >> s; + viewMode = s; + + stream >> uc; // field 0x92 on Mac + stream >> uc; // field 0x93 on Mac + stream >> uc; // soundplayer pausedFlag on Mac + + // soundplayer priority on flags on Mac + for (i = 0; i < 7; i++) + stream >> uc; + + delete mNow; + mNow = new T2DateTime(stream); + + SelectPlugins(false); + + int numPlugins; + stream >> numPlugins; + + CPluginInfoArray *pluginInfoArray = new CPluginInfoArray(false); + CPluginInfo *pluginInfo; + + for (i = 0; i < numPlugins; i++) { + pluginInfo = CPluginInfo::ReadPluginInfo(stream); + pluginInfoArray->Add(&pluginInfo); + } + + BOOL mustCheckError = false; + BOOL checkError = false; + + LArray *missingPlugins = new CPluginInfoArray(true); + CPluginInfoArray *installedPlugins = MakePluginInfoArray(); + + LArrayIterator pluginIterator(*pluginInfoArray); + while (pluginIterator.Next(&pluginInfo)) { + DWORD id = pluginInfo->GetID(); + BOOL found = false; + + LArrayIterator iteratorCheck(*installedPlugins); + CPluginInfo *thePluginCheck; + + while (iteratorCheck.Next(&thePluginCheck)) { + if (id == thePluginCheck->GetID()) { + found = true; + break; + } + } + + if (!found) + missingPlugins->Add(&pluginInfo); + } + + if (missingPlugins->GetCount() > 0) { + TRACE("\r\nPlugin Check Error !\r\n"); + + checkError = true; + + CPluginInfo *errorPlugin; + LArrayIterator iterator(*missingPlugins); + + while (iterator.Next(&errorPlugin)) { + if (errorPlugin->mMustItem) { + mustCheckError = true; + break; + } + } + + if (mustCheckError) { + TRACE("\r\nPlugin Must Check Error !\r\n"); + + T2Dialog dialog; + + CRect rect; + AfxGetMainWnd()->GetWindowRect(rect); + + T2DLGTEMPLATE theTmpl; + theTmpl.pt = rect.CenterPoint(); + theTmpl.moduleHandle = AfxGetApp()->m_hInstance; + theTmpl.resID = 1110; + + dialog.Realize(this, &theTmpl, this, NULL, NULL, true, NULL, 0, true); + + T2PluginInfoTable *pluginInfoTable = (T2PluginInfoTable *) dialog.GetDlgItem(102); + if (pluginInfoTable) { + CPluginInfo *errorPlugin; + LArrayIterator iterator(*missingPlugins); + + while (iterator.Next(&errorPlugin)) { + if (errorPlugin->mMustItem) + pluginInfoTable->Add(errorPlugin); + } + } + + int code = dialog.DoModal(); + throw -10000; + } + } + + if (checkError) { + T2Dialog dialog; + + CRect rect; + AfxGetMainWnd()->GetWindowRect(rect); + + T2DLGTEMPLATE theTmpl; + theTmpl.pt = rect.CenterPoint(); + theTmpl.moduleHandle = AfxGetApp()->m_hInstance; + theTmpl.resID = 1111; + + dialog.Realize(this, &theTmpl, this, NULL, NULL, true, NULL, 0, true); + + T2PluginInfoTable *pluginInfoTable = (T2PluginInfoTable *) dialog.GetDlgItem(102); + if (pluginInfoTable) { + CPluginInfo *errorPlugin; + LArrayIterator iterator(*missingPlugins); + + while (iterator.Next(&errorPlugin)) + pluginInfoTable->Add(errorPlugin); + } + + int code = dialog.DoModal(); + if (code == IDOK) + throw -10000; + } + + delete missingPlugins; + delete installedPlugins; + delete pluginInfoArray; + + mPeopleArrayList->Read(stream, this); + mFloorInfo->Read(stream, this); + + short queueVar; + stream >> queueVar; + + if (queueVar > 0) { + unsigned int queueLen; + stream >> queueLen; + + for (unsigned int index = 0; index < queueLen; index++) { + stream >> s; + T2Tenant *theTenant = mFloorInfo->GetTenant(s); + if (theTenant) + mObjectQueue->AddItem(theTenant); + } + } + + stream >> uc; + mElevTransparent = (uc != 0); + + stream >> s; + mWalkRate = s; + + LoadPool(stream); + + delete mRouteNavigator; + mRouteNavigator = new T2RouteNavigator(mFloorInfo); + + RECT theFloorArea; + mFloorInfo->GetFloorArea(theFloorArea); + mTrafficInfo = new T2TrafficInfo(theFloorArea, 100, 500, 1000, 4); + mTrafficInfo->Read(stream); + + mSettlement = new T2Settlement(this, stream); + mMoviePluginList->Read(stream); + mWorldDef->ReadTowerEvent(stream); + + CRect desktopRect; + CWnd *desktopWindow = CWnd::GetDesktopWindow(); + if (desktopWindow) + desktopWindow->GetWindowRect(&desktopRect); + + CRect anotherRect; + CPoint pt1, pt2; + stream.ReadSRect(anotherRect); + + pt1 = anotherRect.TopLeft(); + pt2 = anotherRect.BottomRight(); + if (desktopRect.PtInRect(pt1) && desktopRect.PtInRect(pt2)) + AfxGetMainWnd()->MoveWindow(&anotherRect); + + int scrollX, scrollY; + stream >> scrollY; + m188.y = scrollY; + stream >> scrollX; + m188.x = scrollX; + + // tool window bounds + stream.ReadSRect(anotherRect); + anotherRect.right = anotherRect.left + 92; + anotherRect.bottom = anotherRect.top + 359; + + pt1 = anotherRect.TopLeft(); + pt2 = anotherRect.BottomRight(); + if (desktopRect.PtInRect(pt1) && desktopRect.PtInRect(pt2)) + T2_APP->mToolWindow->MoveWindow(&anotherRect); + + // message window bounds + stream.ReadSRect(anotherRect); + anotherRect.right = anotherRect.left + 523; + anotherRect.bottom = anotherRect.top + 70; + + pt1 = anotherRect.TopLeft(); + pt2 = anotherRect.BottomRight(); + if (desktopRect.PtInRect(pt1) && desktopRect.PtInRect(pt2)) + T2_MAIN_WINDOW->mMsgWindow->MoveWindow(&anotherRect); + + // control window bounds + stream.ReadSRect(anotherRect); + anotherRect.right = anotherRect.left + 133; + anotherRect.bottom = anotherRect.top + 76; + + T2CtrlPalette *ctrlPalette = T2_APP->mMainWindow->mCtrlPalette; + pt1 = anotherRect.TopLeft(); + pt2 = anotherRect.BottomRight(); + if (desktopRect.PtInRect(pt1) && desktopRect.PtInRect(pt2)) + ctrlPalette->MoveWindow(&anotherRect); + + SetViewMode(mViewMode); + + // calendar window bounds - Mac only + stream.ReadSRect(anotherRect); + + // sub-window visibility flags - Mac only + stream >> uc; + stream >> uc; + stream >> uc; + stream >> uc; + + stream >> us; + mSearchRangeFrom = (us == 0) ? NULL : mFloorInfo->GetTenant(us); + + mNameDB->Read(stream); + mWorldDef->ReadStatisticsProc(this, stream); + } catch (int err) { + loaded = false; + } + } else { + loaded = false; + } + + stream.EndCompressedStream(); + } else { + loaded = false; + } + + stream.Close(); + } else { + loaded = false; + } + + if (loaded) { +#pragma var_order(theTenantArrayList, theMoverDef, theOutObjArrayList, theMover, theOutObjArray, theIterator, theMoverArray, theTenantArray, theMoverArrayList, theTenant, theOutObj, theTenantDef) + SelectPlugins(false); + + T2TenantArrayList *theTenantArrayList = mFloorInfo->GetTenantArrayList(); + LArrayIterator *theIterator = new LArrayIterator(*theTenantArrayList); + T2TenantArray *theTenantArray; + T2Tenant *theTenant; + T2TenantDef *theTenantDef; + + while (theIterator->Next(&theTenantArray)) { + for (int index = 0; index < T2TenantArray::kGroupSize; index++) { + theTenant = &theTenantArray->mTenants[index]; + if (theTenant->IsUsed()) { + LArrayIterator templateIterator(*mTenantTemplates); + + while (templateIterator.Next(&theTenantDef)) { + if (theTenantDef->GetEquipType() == theTenant->GetEquipType()) { + theTenant->SetToolDef(theTenantDef); + break; + } + } + + if (!theTenant->GetToolDef()) { + CRect tmp; + theTenant->Destruct(this, tmp); + } + } + } + } + + delete theIterator; + + T2MoverArrayList *theMoverArrayList = mFloorInfo->GetMoverArrayList(); + theIterator = new LArrayIterator(*theMoverArrayList); + T2MoverArray *theMoverArray; + T2Mover *theMover; + T2MoverDef *theMoverDef; + + while (theIterator->Next(&theMoverArray)) { + for (int index = 0; index < T2MoverArray::kGroupSize; index++) { + theMover = &theMoverArray->mMover[index]; + if (theMover->IsUsed()) { + LArrayIterator templateIterator(*mMoverTemplates); + + while (templateIterator.Next(&theMoverDef)) { + if (theMoverDef->GetEquipType() == theMover->GetEquipType()) { + theMover->SetToolDef(theMoverDef); + break; + } + } + + if (!theMover->GetToolDef()) { + CRect tmp; + theMover->Destruct(this, tmp); + } + } + } + } + + delete theIterator; + + T2OutObjArrayList *theOutObjArrayList = mFloorInfo->GetOutObjArrayList(); + theIterator = new LArrayIterator(*theOutObjArrayList); + T2OutObjArray *theOutObjArray; + T2OutObj *theOutObj; + + while (theIterator->Next(&theOutObjArray)) { + for (int index = 0; index < T2OutObjArray::kGroupSize; index++) { + theOutObj = &theOutObjArray->mOutObj[index]; + if (theOutObj->IsUsed()) { + mOuterObjList->Add(&theOutObj); + theOutObj->_3C = theOutObj->mOutObjArea; + } + } + } + + delete theIterator; + } + + BOOL pausedFlag = false; + if (mPause) + pausedFlag = true; + + x429A9A(pausedFlag); + x429B01(pausedFlag); + + SetViewMode(viewMode); + mWorldDef->DayChanged(this); + + if (loaded) + x41CFEB(); + + return loaded; +} + +/*virtual*/ BOOL T2TowerDoc::OnSaveDocument(LPCTSTR lpszPathName) { + if (!towerDoc_vf2C0(lpszPathName)) + MessageBox(NULL, "File save error", "ERROR", MB_OK); + + return true; +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf2C0(const char *inPath) { +#pragma var_order(thePluginInfoArray, uc, stream, queueVar, s, magic, thePluginInfo, us, pluginIterator, i, scrollPos, windowPlacement, dummyRect) + T2Archive stream; + if (!stream.OpenAsWriteMode(inPath)) + return false; + + short s; + unsigned char uc; + unsigned short us; + + DWORD magic = 'T200'; + stream << magic; + + stream.BeginCompressedStream(); + + stream << mWorldPluginSpecifier->mID; + + s = mGameLevel; + stream << s; + + s = m9C; + stream << s; + + stream << mA0; + + s = mZoomLevel; + stream << s; + + uc = 0; + s = 0; + stream << uc; + stream << s; + stream << s; + + s = mViewMode; + stream << s; + + stream << uc; + stream << uc; + stream << uc; + + for (int i = 0; i < 7; i++) + stream << uc; + + mNow->Write(stream); + + CPluginInfoArray *thePluginInfoArray = MakePluginInfoArray(); + stream << thePluginInfoArray->GetCount(); + + LArrayIterator pluginIterator(*thePluginInfoArray); + CPluginInfo *thePluginInfo; + + while (pluginIterator.Next(&thePluginInfo)) + thePluginInfo->Write(stream); + + mPeopleArrayList->Write(stream); + mFloorInfo->Write(stream); + + short queueVar = 0; + if (mObjectQueue) { + queueVar = 1; + stream << queueVar; + stream << mObjectQueue->GetItemCount(); + + POSITION pos = mObjectQueue->GetHeadPosition(); + while (pos) { + POSITION prevPos = pos; + T2Tenant *theTenant = (T2Tenant *) mObjectQueue->GetNext(pos); + s = theTenant->GetEquipID(); + stream << s; + } + } else { + stream << queueVar; + } + + uc = mElevTransparent != 0; + stream << uc; + + stream << (short) mWalkRate; + + mPool->Write(stream); + mTrafficInfo->Write(stream); + mSettlement->Write(stream); + mMoviePluginList->Write(stream); + mWorldDef->WriteTowerEvent(stream); + + WINDOWPLACEMENT windowPlacement; + + AfxGetMainWnd()->GetWindowPlacement(&windowPlacement); + stream.WriteSRect(windowPlacement.rcNormalPosition); + + POINT scrollPos = mTowerMainView->mScrollOffset; + stream << (int) scrollPos.y; + stream << (int) scrollPos.x; + + T2_APP->mToolWindow->GetWindowPlacement(&windowPlacement); + windowPlacement.rcNormalPosition.right = windowPlacement.rcNormalPosition.left + 88; + windowPlacement.rcNormalPosition.bottom = windowPlacement.rcNormalPosition.top + 353; + stream.WriteSRect(windowPlacement.rcNormalPosition); + + T2_MAIN_WINDOW->mMsgWindow->GetWindowPlacement(&windowPlacement); + windowPlacement.rcNormalPosition.right = windowPlacement.rcNormalPosition.left + 513; + windowPlacement.rcNormalPosition.bottom = windowPlacement.rcNormalPosition.top + 45; + stream.WriteSRect(windowPlacement.rcNormalPosition); + + T2_APP->mMainWindow->mCtrlPalette->GetWindowPlacement(&windowPlacement); + windowPlacement.rcNormalPosition.right = windowPlacement.rcNormalPosition.left + 150; + windowPlacement.rcNormalPosition.bottom = windowPlacement.rcNormalPosition.top + 58; + stream.WriteSRect(windowPlacement.rcNormalPosition); + + RECT dummyRect; + dummyRect.left = 0; + dummyRect.top = 0; + dummyRect.right = 0; + dummyRect.bottom = 0; + stream.WriteSRect(dummyRect); + + uc = 1; + stream << uc; + stream << uc; + stream << uc; + stream << uc; + + us = (mSearchRangeFrom == NULL) ? 0 : mSearchRangeFrom->GetEquipID(); + stream << us; + + mNameDB->Write(stream); + mWorldDef->WriteStatisticsProc(this, stream); + + stream.EndCompressedStream(); + stream.Close(); + + return true; +} + +void T2TowerDoc::OnSystemInformation() { + T2SysInfoDlg dlg(NULL); + dlg.SetDocument(this); + dlg.DoModal(); +} + +/*virtual*/ int T2TowerDoc::GetZoomLevel() const { + return mZoomLevel; +} + +/*virtual*/ void T2TowerDoc::DrawBkgnd(const RECT &inRect) { + RECT bkgndRect, updateRect; + bkgndRect.left = 0; + bkgndRect.top = 0; + bkgndRect.right = mBkgndInfo->hRange; + bkgndRect.bottom = mBkgndInfo->vRange; + + IntersectRect(&updateRect, &inRect, &bkgndRect); + + if (updateRect.left < 0 || updateRect.right > mBkgndInfo->hRange || updateRect.top < 0 || updateRect.bottom > mBkgndInfo->vRange) { + OutputDebugString("Backgound update rect is invalid!!\n"); + return; + } + + if (!IsRectEmpty(&inRect)) + mWorldDef->DrawBkgnd(inRect, this); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfF0(const RECT &inRect1, const RECT &inRect2) { + RECT rect; + UnionRect(&rect, &inRect1, &inRect2); + towerDoc_vfD8(inRect1, inRect2); +} + +/*virtual*/ void T2TowerDoc::DrawBuilding(const RECT &inRect1, const RECT &inRect2) { + RECT rect; + UnionRect(&rect, &inRect1, &inRect2); + + if (mViewMode == kOutView) + DrawOutView(rect, inRect2); + else + DrawInView(rect, inRect2); + + mWorldDef->DrawCrane(this, rect); +} + +/*virtual*/ void T2TowerDoc::DrawInView(const RECT &inRect1, const RECT &inRect2) { + DrawRequestAll(inRect1); + mPeopleArrayList->DrawSearchedPerson(this); + DrawMoverAll(inRect1); +} + +/*virtual*/ void T2TowerDoc::DrawOutView(const RECT &inRect1, const RECT &inRect2) { + DrawTenantOutViewAll(inRect1); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfD8(const RECT &inRect1, const RECT &inRect2) { + if (!IsRectEmpty(&inRect2)) { + RECT rect; + UnionRect(&rect, &inRect1, &inRect2); + towerDoc_vfFC(rect); + } else { + towerDoc_vfF8(inRect1); + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfFC(const RECT &inRect) { + RECT drawRect = inRect; + + if (mViewMode == kOutView) { + drawRect.bottom = mFloorInfo->GetGroundLine(); + InsetRect(&drawRect, -mFloorInfo->GetEntranceWidth(), 0); + } + + int topFloorLine = mWorldDef->mTopFloorLine; + T2FInfoAreaIterator iterator(*mFloorInfo, drawRect); + T2Tenant *theTenant; + + while (iterator.NextTenant(theTenant)) { + if (theTenant) { + RECT rect; + theTenant->GetEquipArea(rect); + + ROOFANDFLOOR roofAndFloor; + if (((T2TenantDef *) theTenant->GetToolDef())->mDrawRoof) { + if (((T2TenantDef *) theTenant->GetToolDef())->mDrawFloor) + roofAndFloor = RoofAndFloor_Both; + else + roofAndFloor = RoofAndFloor_Roof; + } else { + if (((T2TenantDef *) theTenant->GetToolDef())->mDrawFloor) + roofAndFloor = RoofAndFloor_Floor; + else + roofAndFloor = RoofAndFloor_None; + } + + T2Tenant *theFloor = NULL; + + if (theTenant->IsFloor()) { + if (theTenant->IsBuildFinish()) { + iterator.GetTenantRect(rect); + if (mViewMode != kOutView) + mWorldDef->DrawRoofAndFloor(rect, this, roofAndFloor); + theTenant->Draw(this, rect); + } else { + mWorldDef->DrawBuild(theTenant, this); + } + + theFloor = theTenant; + } else { + if (theTenant->IsBuildFinish()) { + if (mViewMode != kOutView) + mWorldDef->DrawRoofAndFloor(rect, this, roofAndFloor); + theTenant->Draw(this, rect); + } else { + mWorldDef->DrawBuild(theTenant, this); + } + + theFloor = mFloorInfo->GetTenant(theTenant->GetFloorID(-1)); + } + + theTenant->ClearDrawMode(); + } + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfF8(const RECT &inRect) { + RECT drawRect = inRect; + + if (mViewMode == kOutView) { + drawRect.bottom = mFloorInfo->GetGroundLine(); + InsetRect(&drawRect, -mFloorInfo->GetEntranceWidth(), 0); + } + + int topFloorLine = mWorldDef->mTopFloorLine; + T2FInfoAreaIterator iterator(*mFloorInfo, drawRect); + T2Tenant *theTenant; + unsigned int floorID = 0; + + while (iterator.NextTenant(theTenant)) { + if (theTenant) { + RECT rect; + + ROOFANDFLOOR roofAndFloor; + if (((T2TenantDef *) theTenant->GetToolDef())->mDrawRoof) { + if (((T2TenantDef *) theTenant->GetToolDef())->mDrawFloor) + roofAndFloor = RoofAndFloor_Both; + else + roofAndFloor = RoofAndFloor_Roof; + } else { + if (((T2TenantDef *) theTenant->GetToolDef())->mDrawFloor) + roofAndFloor = RoofAndFloor_Floor; + else + roofAndFloor = RoofAndFloor_None; + } + + if (theTenant->IsNeedDraw()) { + if (theTenant->IsBuildFinish()) { + theTenant->GetEquipArea(rect); + if (theTenant->IsFloor()) + iterator.GetTenantRect(rect); + + if (mViewMode != kOutView) + mWorldDef->DrawRoofAndFloor(rect, this, roofAndFloor); + + theTenant->Draw(this, rect); + } else { + mWorldDef->DrawBuild(theTenant, this); + } + + theTenant->ClearDrawMode(); + } else if (theTenant->IsFloor() && theTenant->GetEquipID() == floorID) { + theTenant->GetEquipArea(rect); + iterator.GetTenantRect(rect); + + if (mViewMode != kOutView) + mWorldDef->DrawRoofAndFloor(rect, this, roofAndFloor); + + theTenant->Draw(this, rect); + theTenant->ClearDrawMode(); + } + } + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf100(const RECT &inRect) { + mWorldDef->DrawOptionObj(this, inRect); +} + +/*virtual*/ void T2TowerDoc::DrawRequestAll(const RECT &inRect) { + T2FInfoAreaIterator iterator(*mFloorInfo, inRect); + T2Request *theReq; + + while (iterator.NextRequest(theReq)) { + RECT rect, requestArea; + theReq->CalcArea(requestArea); + if (IntersectRect(&rect, &requestArea, &inRect)) + theReq->Draw(this, rect); + } +} + +/*virtual*/ void T2TowerDoc::DrawMoverAll(const RECT &inRect) { + T2MoverArrayList *theMoverArrayList = mFloorInfo->GetMoverArrayList(); + if (theMoverArrayList) + theMoverArrayList->DrawMoverAll(this, inRect); +} + +/*virtual*/ void T2TowerDoc::DrawTenantOutViewAll(const RECT &inRect) { + RECT rect; + LArrayIterator iterator(*mOuterObjList); + T2OutObj *theOutObj; + + while (iterator.Next(&theOutObj)) { + if (IntersectRect(&rect, &inRect, &theOutObj->_3C)) { + CRect rectCopy = inRect; + theOutObj->Draw(this, rectCopy); + } + } +} + +/*virtual*/ int T2TowerDoc::HitTest(POINT inPt, HitTestResult &outObj, BOOL inSkipPeople, BOOL inSkipOuterObj) { + int theHitType = kHitNull; + outObj.obj = NULL; + + T2BitImage *theImage = mTowerMainView->mImage; + theImage->SetOrigin(mTowerMainView->mScrollOffset.x, mTowerMainView->mScrollOffset.y); + theImage->SetClipRect(NULL); + theImage->Clear(254); + + POINT pt = inPt; + UT2Coordinate::QDToUnit(pt, mZoomLevel); + + theHitType = HitTestLayer(theImage, inPt, outObj, T2Sprite::ELayer_2); + if (theHitType == kHitNull && !inSkipOuterObj) { + LArrayIterator iterator(*mOuterObjList); + T2OutObj *theOuterObj; + + while (theHitType == kHitNull && iterator.Next(&theOuterObj)) { + theOuterObj->DrawHitMask(this); + if (theImage->GetPixel(inPt) != 254) { + theHitType = kHitOutObj; + outObj.obj = theOuterObj; + } + } + } + + if (theHitType == kHitNull) { + LArrayIterator arrayListIter(*mFloorInfo->GetMoverArrayList()); + T2MoverArray *theMoverArray; + + while (theHitType == kHitNull && arrayListIter.Next(&theMoverArray)) { + for (int i = 0; theHitType == kHitNull && i < T2MoverArray::kGroupSize; i++) { + T2Mover *theMover = &theMoverArray->mMover[i]; + if (theMover->IsUsed()) { + theMover->DrawHitMask(this); + if (theImage->GetPixel(inPt) != 254) { + theHitType = kHitMover; + outObj.obj = theMover; + } + } + } + } + } + + if (theHitType == kHitNull && !inSkipPeople) { + RECT visibleRect; + mTowerMainView->GetVisibleUnitRect(visibleRect); + + T2FInfoAreaIterator iterator(*mFloorInfo, visibleRect); + T2Request *theRequest; + + while (theHitType == kHitNull && iterator.NextRequest(theRequest)) { + theRequest->DrawHitMask(this); + if (theImage->GetPixel(inPt) != 254) { + T2People *thePeople = theRequest->FindPeople(pt.x); +#line 1414 + _ASSERT(thePeople != NULL); + + theHitType = kHitPeople; + outObj.obj = thePeople; + } + } + } + + if (theHitType == kHitNull && !inSkipPeople) { + LArrayIterator arrayListIter(*mPeopleArrayList); + T2PeopleArray *thePeopleArray; + + while (theHitType == kHitNull && arrayListIter.Next(&thePeopleArray)) { + for (int i = 0; theHitType == kHitNull && i < T2PeopleArray::kGroupSize; i++) { + T2People *thePeople = &thePeopleArray->mPeople[i]; + if (thePeople->IsUsed() && thePeople->IsWalk()) { + thePeople->DrawHitMask(this); + if (theImage->GetPixel(inPt) != 254) { + theHitType = kHitPeople; + outObj.obj = thePeople; + } + } + } + } + } + + if (theHitType == kHitNull) { + RECT visibleRect; + mTowerMainView->GetVisibleUnitRect(visibleRect); + + T2FInfoAreaIterator iterator(*mFloorInfo, visibleRect); + T2Tenant *theTenant; + + while (theHitType == kHitNull && iterator.NextTenant(theTenant)) { + if (theTenant && !theTenant->IsFloor()) { + theTenant->DrawHitMask(this); + if (theImage->GetPixel(inPt) != 254) { + theHitType = kHitTenant; + if (theTenant->GetStatus() >= kTenantStatus10) + outObj.obj = theTenant; + } + } + } + } + + if (theHitType == kHitNull) { + RECT visibleRect; + mTowerMainView->GetVisibleUnitRect(visibleRect); + + T2FInfoAreaIterator iterator(*mFloorInfo, visibleRect); + T2Tenant *theTenant; + + while (theHitType == kHitNull && iterator.NextTenant(theTenant)) { + if (theTenant && theTenant->IsFloor()) { + theTenant->DrawHitMask(this); + if (theImage->GetPixel(inPt) != 254) { + theHitType = kHitTenant; + outObj.obj = theTenant; + } + } + } + } + + if (theHitType == kHitNull) + theHitType = HitTestLayer(theImage, inPt, outObj, T2Sprite::ELayer_1); + + if (theHitType == kHitNull) { + CRect bkgndRect; + mTowerMainView->GetClientRect(bkgndRect); + bkgndRect.OffsetRect(mTowerMainView->mScrollOffset); + + UT2Coordinate::QDToBkgnd(bkgndRect, mZoomLevel); + bkgndRect.right += 1; + bkgndRect.bottom += 1; + + for (int y = bkgndRect.top; theHitType == kHitNull && y < bkgndRect.bottom; y++) { + for (int x = bkgndRect.left; theHitType == kHitNull && x < bkgndRect.right; x++) { + unsigned int bkgndInfo = UT2BkgndInfo::GetBkgndInfo(mBkgndInfo, y, x); + + RECT bkgndInfoRect; + SetRect(&bkgndInfoRect, x, y, x + 1, y + 1); + mWorldDef->DrawBkgnd(bkgndInfo, bkgndInfoRect, this); + + if (theImage->GetPixel(inPt) != 254) { + theHitType = kHitBkgndInfo; + outObj.bkgndInfo = bkgndInfo; + } + } + } + } + + if (theHitType == kHitNull) + theHitType = HitTestLayer(theImage, inPt, outObj, T2Sprite::ELayer_0); + + theImage->SetOrigin(0, 0); + mTowerMainView->Invalidate(true); + mTowerMainView->tmv_vf11C(); + + return theHitType; +} + +int T2TowerDoc::HitTestLayer(T2BitImage *inImage, POINT inPt, HitTestResult &outObj, int inLayer) { + POSITION pos = mSprite.GetHeadPosition(); + while (pos) { + T2SpriteObj *obj = mSprite.GetNext(pos); + if (obj->mLayer == inLayer) { + mSprite.DrawSprite(inImage, obj, mZoomLevel); + if (inImage->GetPixel(inPt) != 254) { + outObj.spriteObj = obj; + return kHitSpriteObj; + } + } + } + + return kHitNull; +} + +/*virtual*/ T2BitImage *T2TowerDoc::GetImage() const { + return mTowerMainView->mImage; +} + +/*virtual*/ T2TowerMainView *T2TowerDoc::GetMainView() const { + return mTowerMainView; +} + +/*virtual*/ T2DateTime *T2TowerDoc::GetNow() const { + return mNow; +} + +/*virtual*/ T2RouteNavigator *T2TowerDoc::GetRouteNavi() const { + return mRouteNavigator; +} + +/*virtual*/ T2TemplatePluginList *T2TowerDoc::GetSilhouetteTemplates() { + return mSilhouetteTemplates; +} + +static int cursors[16] = { + 194, 184, + 187, 188, + 193, 183, + 195, 195, + 189, 190, + 185, 185, + 192, 192, + 210, 210 +}; + +/*virtual*/ void T2TowerDoc::SetCursorType(int inCursor, BOOL inIsPressed) { + HCURSOR theCursorH = NULL; + CT2App *theApp = T2_APP; + UINT id; + + if (inCursor == kCursorNoChange) + inCursor = mLastRequestedCursor; + else + mLastRequestedCursor = inCursor; + + if (inCursor < kCursorDefault) { + inCursor *= 2; + if (inIsPressed) + inCursor++; + + id = cursors[inCursor]; + theCursorH = theApp->LoadCursor(id); + } else if (inCursor == kCursorDefault) { + theCursorH = theApp->LoadStandardCursor(IDC_ARROW); + } + + if (mCurrentCursorIndex != inCursor) { + mCurrentCursorIndex = inCursor; + + if (inCursor == kCursorDefault) { + theCursorH = theApp->LoadStandardCursor(IDC_ARROW); + } else { + id = cursors[inCursor]; + theCursorH = theApp->LoadCursor(id); + } + + if (theCursorH) { + SetClassLong(mTowerMainView->m_hWnd, GCL_HCURSOR, (LONG) theCursorH); + SetCursor(theCursorH); + } + } +} + +/*virtual*/ void T2TowerDoc::Serialize(CArchive &ar) { + if (ar.IsStoring()) { + } else { + } +} + +/*virtual*/ void T2TowerDoc::InitSound(T2SoundPlayer *inSoundPlayer) { + mSoundPlayer = inSoundPlayer; + Sounds = mSoundPlayer; + + LoadSoundForPlugin(mWorldDef); + + T2TemplatePlugin *thePlugin; + LArrayIterator *theIterator; + + theIterator = new LArrayIterator(*mTenantTemplates); + while (theIterator->Next(&thePlugin)) + LoadSoundForPlugin(thePlugin); + delete theIterator; + + theIterator = new LArrayIterator(*mMoverTemplates); + while (theIterator->Next(&thePlugin)) + LoadSoundForPlugin(thePlugin); + delete theIterator; +} + +void T2TowerDoc::LoadSoundForPlugin(T2TemplatePlugin *inPlugin) { + if (mSoundPlayer) + inPlugin->LoadSound(this); +} + +/*virtual*/ void T2TowerDoc::CreatePool() { + if (mWorldDef) { + T2PoolDef *thePoolDef = mWorldDef->mPoolDef; + if (thePoolDef) { + T2TemplatePluginList *theList = mTemplatePluginDB->GetTemplatePluginList('PPDf'); + unsigned int theHour = mNow->Get24Hour(); + mPool = new T2Pool( + thePoolDef, + mWorldDef->GetSeasonParamDef(), + theList, + mPeopleArrayList, + mGameLevel, + mNow->GetMonth(), + mNow->Get24Hour(), + mWorldDef); + } + } +} + +/*virtual*/ void T2TowerDoc::LoadPool(T2Archive &inArchive) { + if (mWorldDef) { + T2PoolDef *thePoolDef = mWorldDef->mPoolDef; + if (thePoolDef) { + T2TemplatePluginList *theList = mTemplatePluginDB->GetTemplatePluginList('PPDf'); + unsigned int theHour = mNow->Get24Hour(); + mPool = new T2Pool( + inArchive, + thePoolDef, + mWorldDef->GetSeasonParamDef(), + theList, + mPeopleArrayList, + mWorldDef); + } + } +} + +/*virtual*/ void T2TowerDoc::SetViewMode(int inViewMode) { + if (mViewMode != inViewMode) { + if (mWorldDef) + mWorldDef->ViewModeChanged(this, (VIEWMODE) inViewMode); + + T2MainWindow *theMainWindow = T2_MAIN_WINDOW; + if (theMainWindow) { + T2CtrlPalette *theCtrlPalette = theMainWindow->mCtrlPalette; + if (theCtrlPalette) + theCtrlPalette->vf100(inViewMode); + } + + GetWorldDef()->GetTowerEvent()->ViewModeChanged(this, (VIEWMODE) inViewMode); + + mViewMode = inViewMode; + + mSearchRangeFrom = NULL; + + T2ToolWindow *theToolWindow = T2_APP->mToolWindow; + + unsigned short theIconSet; + if (mViewMode == kOutView) + theIconSet = 2; + else + theIconSet = 1; + theToolWindow->EnableIcon(theIconSet); + + mTowerMainView->Invalidate(false); + mTowerMainView->tmv_vf120(); + } +} + +/*virtual*/ void T2TowerDoc::SelectPlugins(BOOL inIsGradeUp) { +#pragma var_order(rect, pos2, pos3, theItemNameText, tmpl, thePluginTypeText, specifier, theToolWindow, numPlugins, str, pos1, theProgress, pos, theDialog) + mOptionPluginList->DispatchEvent(kSelectPluginsOptionEvent, this, NULL); + + T2ToolWindow *theToolWindow = T2_APP->mToolWindow; + + towerDoc_vf290(true); + + POSITION pos; + T2PluginSpecifier *specifier; + int numPlugins = 0; + + mT2PluginLoader->SetTypeFilter(pos, 'TnPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mTenantPlugins->GetItem(specifier->mID) && + (!specifier->mSecretItem || (specifier->mSecretItem & (m9C != 0))) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'MvPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mMoverPlugins->GetItem(specifier->mID) && + (!specifier->mSecretItem || (specifier->mSecretItem & (m9C != 0))) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'OoPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mOuterObjPlugins->GetItem(specifier->mID) && + (!specifier->mSecretItem || (specifier->mSecretItem & (m9C != 0))) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'MoPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mMoviePluginList->GetItem(specifier->mID) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'HePl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mHallEventPlugins->GetItem(specifier->mID) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'AdPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mAdvertisePlugins->GetItem(specifier->mID) + ) + numPlugins++; + } + + CRect rect; + AfxGetMainWnd()->GetWindowRect(rect); + + T2DLGTEMPLATE tmpl; + tmpl.pt = rect.CenterPoint(); + tmpl.moduleHandle = GetWorldModuleHandle(); + if (!inIsGradeUp) + tmpl.resID = 9100; + else + tmpl.resID = 9101; + + T2Dialog *theDialog = new T2Dialog; + theDialog->mDeleteOnClose = true; + theDialog->Realize(this, &tmpl, this, NULL, NULL, true, NULL, 0, true); + T2_APP->app_vfB4(); + + if (inIsGradeUp) { + T2DlgItemAnimation *theGradeUpAnimation = (T2DlgItemAnimation *) theDialog->GetDlgItem(104); + mWorldDef->SetupGradeUpAnimation(theGradeUpAnimation, mGameLevel); + + CString message; + mWorldDef->GetGradeUpMessage(mGameLevel, message); + ((T2DlgItem *) theDialog->GetDlgItem(105))->SetDescriptor(message); + + mSoundPlayer->Play("GradeUp", SoundMask_10, SoundFlags_10, NULL, PlayMode_2, 100); + + DWORD v = timeGetTime(); + while ((timeGetTime() - v) < 3000) + T2_APP->app_vfB4(); + } + + CString str; + T2DlgItemText *theItemNameText = (T2DlgItemText *) theDialog->GetDlgItem(101); + T2DlgItemText *thePluginTypeText = (T2DlgItemText *) theDialog->GetDlgItem(102); + T2DlgItemProgress *theProgress = (T2DlgItemProgress *) theDialog->GetDlgItem(103); + + theProgress->SetRange(0, numPlugins); + theProgress->SetPos(0); + theProgress->SetStep(1); + + // "テナント" + thePluginTypeText->SetDescriptor("\x83\x65\x83\x69\x83\x93\x83\x67"); + + T2_APP->app_vfB4(); + + mT2PluginLoader->SetTypeFilter(pos, 'TnPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mTenantPlugins->GetItem(specifier->mID) && + (!specifier->mSecretItem || (specifier->mSecretItem & (m9C != 0))) + ) + { + theItemNameText->SetDescriptor(specifier->mPluginName); + theProgress->StepIt(); + T2_APP->app_vfB4(); + + T2TenantPlugin *theTenantPlugin = (T2TenantPlugin *) mT2PluginLoader->LoadPlugin(specifier); + mTenantPlugins->Add(theTenantPlugin); + theTenantPlugin->LoadAllTemplatePlugin(mWorldDef, mTemplatePluginDB); + + T2TenantDef *def = (T2TenantDef *) theTenantPlugin->GetTemplatePlugin(); + mTenantTemplates->Regist(def); + + if (def->IsFloor()) + mFloorDef = def; + + if (!def->RequierToolIcon(theToolWindow)) + theToolWindow->AddIcon(def->mStr48, NULL, 0, kToolOption1, def, 0, 1, this); + theToolWindow->AddIcon("Category", NULL, def->mCategoryNo, kToolOption4, def, 0, 1, this); + + LoadSoundForPlugin(def); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + +#line 1996 + _ASSERT(mFloorDef != NULL); + + // "移動設備" + thePluginTypeText->SetDescriptor("\x88\xDA\x93\xAE\x90\xDD\x94\xF5"); + + T2_APP->app_vfB4(); + + mT2PluginLoader->SetTypeFilter(pos, 'MvPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mMoverPlugins->GetItem(specifier->mID) && + (!specifier->mSecretItem || (specifier->mSecretItem & (m9C != 0))) + ) + { + theItemNameText->SetDescriptor(specifier->mPluginName); + theProgress->StepIt(); + T2_APP->app_vfB4(); + + T2MoverPlugin *theMoverPlugin = (T2MoverPlugin *) mT2PluginLoader->LoadPlugin(specifier); + mMoverPlugins->Add(theMoverPlugin); + theMoverPlugin->LoadAllTemplatePlugin(mWorldDef, mTemplatePluginDB); + + T2MoverDef *def = (T2MoverDef *) theMoverPlugin->GetTemplatePlugin(); + mMoverTemplates->Regist(def); + + if (!def->RequierToolIcon(theToolWindow)) + theToolWindow->AddIcon(def->mStr48, NULL, 0, kToolOption2, def, 0, 1, this); + theToolWindow->AddIcon("Category", NULL, def->mCategoryNo, kToolOption4, def, 0, 1, this); + + LoadSoundForPlugin(def); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + // "外観" + thePluginTypeText->SetDescriptor("\x8A\x4F\x8A\xCF"); + + T2_APP->app_vfB4(); + + mT2PluginLoader->SetTypeFilter(pos, 'OoPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mOuterObjPlugins->GetItem(specifier->mID) && + (!specifier->mSecretItem || (specifier->mSecretItem & (m9C != 0))) + ) + { + theItemNameText->SetDescriptor(specifier->mPluginName); + theProgress->StepIt(); + T2_APP->app_vfB4(); + + T2OuterObjPlugin *theOuterObjPlugin = (T2OuterObjPlugin *) mT2PluginLoader->LoadPlugin(specifier); + mOuterObjPlugins->Add(theOuterObjPlugin); + theOuterObjPlugin->LoadAllTemplatePlugin(mWorldDef, mTemplatePluginDB); + + T2OuterObjDef *def = (T2OuterObjDef *) theOuterObjPlugin->GetTemplatePlugin(); + mOuterObjTemplates->Regist(def); + + if (!def->RequierToolIcon(theToolWindow)) + theToolWindow->AddIcon(def->mStr48, NULL, 0, kToolOption3, def, 0, 2, this); + theToolWindow->AddIcon("Category", NULL, def->mCategoryNo, kToolOption4, def, 0, 2, this); + + LoadSoundForPlugin(def); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + // "ムービー" + thePluginTypeText->SetDescriptor("\x83\x80\x81\x5B\x83\x72\x81\x5B"); + + T2_APP->app_vfB4(); + + mT2PluginLoader->SetTypeFilter(pos, 'MoPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mMoviePluginList->GetItem(specifier->mID) + ) + { + theItemNameText->SetDescriptor(specifier->mPluginName); + theProgress->StepIt(); + T2_APP->app_vfB4(); + + T2MoviePlugin *theMoviePlugin = new T2MoviePlugin('MoPl', *specifier); + theMoviePlugin->LoadSelf(); + mMoviePluginList->Add(theMoviePlugin); + + theMoviePlugin->UnfoldPluginSelf(); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + // "イベント" + thePluginTypeText->SetDescriptor("\x83\x43\x83\x78\x83\x93\x83\x67"); + + T2_APP->app_vfB4(); + + mT2PluginLoader->SetTypeFilter(pos, 'HePl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mHallEventPlugins->GetItem(specifier->mID) + ) + { + theItemNameText->SetDescriptor(specifier->mPluginName); + theProgress->StepIt(); + T2_APP->app_vfB4(); + + T2HallEventPlugin *theHallEventPlugin = new T2HallEventPlugin('HePl', *specifier); + theHallEventPlugin->LoadSelf(); + mHallEventPlugins->Add(theHallEventPlugin); + + theHallEventPlugin->UnfoldPluginSelf(); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + // "広告" + thePluginTypeText->SetDescriptor("\x8D\x4C\x8D\x90"); + + T2_APP->app_vfB4(); + + mT2PluginLoader->SetTypeFilter(pos, 'AdPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mAdvertisePlugins->GetItem(specifier->mID) + ) + { + theItemNameText->SetDescriptor(specifier->mPluginName); + theProgress->StepIt(); + T2_APP->app_vfB4(); + + T2AdvertisePlugin *theAdvertisePlugin = new T2AdvertisePlugin('AdPl', *specifier); + theAdvertisePlugin->LoadSelf(); + mAdvertisePlugins->Add(theAdvertisePlugin); + + theAdvertisePlugin->UnfoldPluginSelf(); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + if (!inIsGradeUp) { + int id; + if (mViewMode == kOutView) { + id = theToolWindow->GetID("ToolInfo", 0); + } else { + // "フロア" + id = theToolWindow->GetID("\x83\x74\x83\x8D\x83\x41", 1); + } + theToolWindow->SetSel(id); + } + + POSITION pos1 = mTenantPlugins->GetHeadPosition(); + while (pos1) { + T2TenantPlugin *theTenantPlugin = (T2TenantPlugin *) mTenantPlugins->GetNext(pos1); + T2TenantDef *def = (T2TenantDef *) theTenantPlugin->GetTemplatePlugin(); + if (def) { + DWORD subPluginType = def->GetSubPluginType(); + if (subPluginType == 'MoPl') { + POSITION pluginPos = mMoviePluginList->GetHeadPosition(); + while (pluginPos) { + CResourcePlugin *thePlugin = (CResourcePlugin *) mMoviePluginList->GetNext(pluginPos); + if (thePlugin->GetType() == subPluginType) + def->Add(thePlugin); + } + } + } + } + + POSITION pos2 = mTenantPlugins->GetHeadPosition(); + while (pos2) { + T2TenantPlugin *theTenantPlugin = (T2TenantPlugin *) mTenantPlugins->GetNext(pos2); + T2TenantDef *def = (T2TenantDef *) theTenantPlugin->GetTemplatePlugin(); + if (def) { + DWORD subPluginType = def->GetSubPluginType(); + if (subPluginType == 'HePl') { + POSITION pluginPos = mHallEventPlugins->GetHeadPosition(); + while (pluginPos) { + CResourcePlugin *thePlugin = (CResourcePlugin *) mHallEventPlugins->GetNext(pluginPos); + if (thePlugin->GetType() == subPluginType) + def->Add(thePlugin); + } + } + } + } + + POSITION pos3 = mOuterObjPlugins->GetHeadPosition(); + while (pos3) { + T2OuterObjPlugin *theOuterObjPlugin = (T2OuterObjPlugin *) mOuterObjPlugins->GetNext(pos3); + T2OuterObjDef *theOuterObjDef = (T2OuterObjDef *) theOuterObjPlugin->GetTemplatePlugin(); + if (theOuterObjDef) { + DWORD subPluginType = theOuterObjDef->GetSubPluginType(); + if (subPluginType != 0) { + POSITION pluginPos = mAdvertisePlugins->GetHeadPosition(); + while (pluginPos) { + T2AdvertisePlugin *thePlugin = (T2AdvertisePlugin *) mAdvertisePlugins->GetNext(pluginPos); + if (thePlugin->GetSubType() == subPluginType) + theOuterObjDef->Add(thePlugin); + } + } + } + } + + _1F4 = 0; + theDialog->DestroyWindow(); + SetupGradeAnimation(); + towerDoc_vf294(); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfC0(int) { +#pragma var_order(var8, varC, counter, var14, oldLevel) + if (!mWorldPluginID || !mTowerMainView) + return; + + DWORD varC = timeGetTime(); + if (m218 == 0) + m218 = varC; + if (varC > m218) + m21C += varC - m218; + if (m21C > 1000) + m21C = 1000; + + int counter = 0; + DWORD var14 = timeGetTime(); + + while (m21C > mDrawSpeed) { + if ((counter++ % 2) == 0) { + MSG msg; + if (PeekMessage(&msg, NULL, 0, 0, 0)) { + if (msg.message == WM_QUIT) + return; + + if (msg.message != WM_PAINT) { + m21C = 0; + break; + } + } + } + + if ((timeGetTime() - var14) > 1000) { + m21C = 0; + break; + } + + mTowerMessage->SpendTime2(); + + if (!mPause) + towerDoc_vfC4(); + + if (m21C >= mDrawSpeed) + m21C -= mDrawSpeed; + + if (m208) + break; + } + + DWORD var8 = GetTickCount(); + if ((var8 - mC0) > 20) { + mBC = (mBC >= 7) ? 0 : (mBC + 1); + mC0 = var8; + } + + if (!gT2App->_E4) + return; + + mTowerMainView->tmv_vf120(); + m218 = varC; + + int oldLevel = mGameLevel; + if (oldLevel != CheckGameLevel()) { + mBC = 0; + mC0 = GetTickCount(); + SelectPlugins(true); + + mPool->GameLevelChanged(mGameLevel); + mIsDustOn = mWorldDef->IsDustOn(mGameLevel); + mToiletDenomi = mWorldDef->GetToiletDenomi(mGameLevel); + mColdDenomi = mWorldDef->GetColdDenomi(mGameLevel, mNow->GetMonth()); + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vfC4() { + if (m20C) { + m210++; + if ((time(NULL) - m20C) >= 5) { + m20C = 0; + + CString str; + str.Format("%.2f Idles/sec.", m210 / 5.0f); + + MessageBox(NULL, str, "RESULT", MB_OK); + } + + if (m214) + mTowerMainView->Invalidate(false); + } + + DispatchOptionEvent(kIdleOptionEvent, NULL); + + unsigned int theOldDay = mNow->GetDay(); + unsigned int theOldHour = mNow->GetHour(); + if (mNow->IsIncDateTime()) { + InvalClock(); + if (mNow->GetHour() != theOldHour) { + mPool->IncHour(mNow); + mTrafficInfo->HourChanged(this); + + unsigned int theNewDay = mNow->GetDay(); + if (theNewDay != theOldDay) { + InvalCalender(); + mWorldDef->DayChanged(this); + mColdDenomi = mWorldDef->GetColdDenomi(mGameLevel, mNow->GetMonth()); + + if (theNewDay == 1) { + mSettlement->Update(); + mFloorInfo->CalcMentenanceCost(this); + } + } + } + + if (mPool->IsChangePopulation()) + InvalPopulation(); + + if ((mNow->GetMinutes() == 0) && (mNow->GetHour() % 3) == 0) { + } + + mPaletteAnime->MinuteChanged(mNow); + } + + // this might be a bool + int idleResult = mWorldDef->IdleProc(this); + + if (m1CC) { + m1CC++; + if (m1CC == 256) + m1CC = 0; + } + + mPeopleArrayList->DispatchIdle(this); + + static DWORD var4479B0; + DWORD ticks = GetTickCount(); + if (ticks < var4479B0 || ticks >= (var4479B0 + 100)) { + var4479B0 = ticks; + CycleOutlinePalette(); + } + + mFloorInfo->GetRequestArrayList()->DispatchIdle(this); + mFloorInfo->GetMoverArrayList()->DispatchIdle(this); + + if (idleResult == 0) { + mFloorInfo->GetTenantArrayList()->DispatchIdle(this); + mFloorInfo->GetOutObjArrayList()->DispatchIdle(this); + + m204++; + if (m204 >= 40) { + m204 = 0; + if (mOuterObjTemplates) + mOuterObjTemplates->DispatchIdle(this); + if (mMoverTemplates) + mMoverTemplates->DispatchIdle(this); + if (mTenantTemplates) + mTenantTemplates->DispatchIdle(this); + } + + CheckBuildQueue(); + } + + if (mPaletteAnime->IsSETime()) + mPaletteAnime->ChangeSE(); + mPaletteAnime->DoAnimatePalette(); + + mTowerMessage->SpendTime(); + + static DWORD var4479B4 = 0; + static DWORD var4479B8 = 0; + + var4479B4++; + if (var4479B8 == 0) + var4479B8 = GetTickCount(); + + DWORD endTicks = GetTickCount(); + if ((endTicks - var4479B8) >= 550) { + if (mDisplayIPS) { + char buf[12]; + sprintf(buf, "%.2f", (var4479B4 * 1000.0f) / (endTicks - var4479B8)); + T2_MAIN_WINDOW->mDbgIPS->GetDlgItem(1019)->SetWindowText(buf); + } + var4479B4 = 0; + var4479B8 = endTicks; + } + + SetModifiedFlag(); +} + +/*virtual*/ void T2TowerDoc::DoDestruct(const CPoint &inPt) { +#pragma var_order(ptC, result, theHit, var18, pt20, var24) + POINT pt20 = inPt; + POINT ptC = inPt; + UT2Coordinate::QDToUnit(pt20, mZoomLevel); + + T2DrawableObject *var18 = NULL; + BOOL var24 = false; + + HitTestResult result; + int theHit = HitTest(inPt, result, true, mViewMode != kOutView); + if (!result.obj) + return; + + if (mViewMode == kOutView) { + if (theHit == kHitOutObj) { + var24 = DestructOutObj(inPt, pt20, (T2OutObj *) result.obj); + if (var24) + var18 = result.obj; + } + } else { + if (theHit == kHitMover) { + var24 = DestructMover(inPt, pt20, (T2Mover *) result.obj); + if (var24) + var18 = result.obj; + } + + if (theHit == kHitTenant) { + var24 = DestructTenant(inPt, pt20, (T2Tenant *) result.obj, false); + if (var24) + var18 = result.obj; + } + } + + if (var24 && mWorldDef && var18) { + if (theHit == kHitOutObj) + mWorldDef->SetLatestBuild(((T2OutObj *) var18)->GetToolDef(), false); + else + mWorldDef->SetLatestBuild((T2Equip *) var18, false); + } +} + +/*virtual*/ BOOL T2TowerDoc::DestructTenant(POINT inPt1, POINT inPt2, T2Tenant *inTenant, BOOL inSkipSounds) { + if (inTenant->IsFloor() && !OutsideAreaCheck(inTenant, true)) + return false; + + if (!inTenant->IsBuildFinish()) { + // EN: Can not remove the item under construction until it is completed. + towerDoc_vf13C()->BuildErr(52, NULL); + + if (!inSkipSounds) + mSoundPlayer->Play("No", SoundMask_20, SoundFlags_20, &inPt2, PlayMode_2, 100); + return false; + } + + T2Name *theName = mNameDB->Search(inTenant); + RECT destructRect = {0, 0, 0, 0}; + PROCCODE result = inTenant->DoDestruct(this, inPt1, destructRect); + + if (result == ProcCode_1 && theName) { + mNameDB->RemoveName(theName); + delete theName; + } + + if (!IsRectEmpty(&destructRect)) { + CalcCraneUpdateRect(destructRect); + mTowerMainView->InvalUnitRect(destructRect, true); + } + + if (!inSkipSounds) { + if (result == ProcCode_1) + mSoundPlayer->Play("Destroy", SoundMask_20, SoundFlags_20, &inPt2, PlayMode_2, 100); + else + mSoundPlayer->Play("No", SoundMask_20, SoundFlags_20, &inPt2, PlayMode_2, 100); + } + + return true; +} + +BOOL T2TowerDoc::OutsideAreaCheck(T2Tenant *inTenant, BOOL inShowError) { + RECT rect; + inTenant->GetEquipArea(rect); + + for (int v = rect.top; v < rect.bottom; v++) { + for (int h = rect.left; h < rect.right; h++) { + if (mFloorInfo->GetOutObjID(v, h) != 0) { + if (inShowError) { + // EN: Can not remove this floor because an outside item is placed. + towerDoc_vf13C()->BuildErr(69 /*nice*/, NULL); + } + return false; + } + } + } + + return true; +} + +void T2TowerDoc::CalcCraneUpdateRect(RECT &ioRect) { + RECT rect; + RECT craneArea; + int i; + + rect.top = rect.left = 0; + rect.right = mWorldDef->m190.x; + rect.bottom = mWorldDef->m190.y; + + for (i = 0; i < mCraneCount; i++) { + craneArea = rect; + OffsetRect(&craneArea, mCranePosArray[i].x, mCranePosArray[i].y); + UnionRect(&ioRect, &craneArea, &ioRect); + } + + mWorldDef->CalcCranePos(this); + + for (i = 0; i < mCraneCount; i++) { + craneArea = rect; + OffsetRect(&craneArea, mCranePosArray[i].x, mCranePosArray[i].y); + UnionRect(&ioRect, &craneArea, &ioRect); + } +} + +/*virtual*/ BOOL T2TowerDoc::DestructMover(POINT inPt1, POINT inPt2, T2Mover *inMover) { + RECT destructRect = {0, 0, 0, 0}; + + if (inMover->DoDestruct(this, inPt1, destructRect) == ProcCode_1) { + mSoundPlayer->Play("Destroy", SoundMask_20, SoundFlags_20, &inPt2, PlayMode_2, 100); + mTowerMainView->InvalUnitRect(destructRect, true); + return true; + } + + return true; +} + +/*virtual*/ BOOL T2TowerDoc::DestructOutObj(POINT inPt1, POINT inPt2, T2OutObj *inOutObj) { + CRect rect; + + if (inOutObj->DoDestruct(this, 0, inPt1, inPt2, rect) == ProcCode_1) { + mOuterObjList->RemoveItemsAt(1, mOuterObjList->FetchIndexOf(&inOutObj)); + + mSoundPlayer->Play("Destroy", SoundMask_20, SoundFlags_20, &inPt2, PlayMode_2, 100); + mTowerMainView->InvalUnitRect(rect, true); + + CalcCraneUpdateRect(rect); + mTowerMainView->InvalUnitRect(rect, true); + + return true; + } + + return false; +} + +/*virtual*/ BOOL T2TowerDoc::DoClickByTenantTool(CRect inRect, T2TenantDef *inDef, unsigned int inValiation) { +#pragma var_order(rect, clickResult, result) + if (!inDef) + return false; + + _200 = 0; + + RECT rect = inRect; + mFundsOnClick = GetCurrentFunds(); + _1A4 = NULL; + + int clickResult = 0; + clickResult = inDef->ClickProc(this, &rect, inValiation); + + _1BC = inRect.TopLeft(); + m1A0 = inDef; + mValiation = inValiation; + + CalcDragMask(inRect); + BOOL result = towerDoc_vf248(rect); + mTowerMainView->tmv_vf120(); + + if (!clickResult) { + free(mDragMask); + mDragMask = NULL; + } + + return result; +} + +/*virtual*/ void T2TowerDoc::DoDragByTenantTool(CRect inRect) { +#pragma var_order(buildArea, pt) + // TODO: name me + CPoint pt = inRect.TopLeft(); + + RECT buildArea; + mWorldDef->GetBuildArea(buildArea); + + pt.x = min(pt.x, buildArea.right); + pt.x = max(pt.x, buildArea.left); + + pt.y = min(pt.y, buildArea.bottom); + pt.y = max(pt.y, buildArea.top); + + if (mDragMask) { +#pragma var_order(rect, pt2) + CRect rect; + POINT pt2; + pt2.y = _1BC.y; + if (_1BC.x <= pt.x) { + for (pt2.x = _1BC.x; pt2.x <= pt.x; pt2.x += inRect.Width()) { + if (mDragMask[pt2.x].x0 == kDm1) + break; + + rect.top = pt2.y; + rect.left = pt2.x; + rect.bottom = pt2.y + inRect.Height(); + rect.right = pt2.x + inRect.Width(); + + towerDoc_vf248(rect); + } + } else { + for (pt2.x = _1BC.x; pt2.x >= pt.x; pt2.x -= inRect.Width()) { + if (mDragMask[pt2.x].x0 == kDm1) + break; + + rect.top = pt2.y; + rect.left = pt2.x; + rect.bottom = pt2.y + inRect.Height(); + rect.right = pt2.x + inRect.Width(); + + towerDoc_vf248(rect); + } + } + + mTowerMainView->tmv_vf120(); + } +} + +/*virtual*/ void T2TowerDoc::DoReleaseByTenantTool(CRect inRect) { + CPoint centerPt = inRect.CenterPoint(); + + if (_200 > 0) { + if (m1A0 && !m1A0->IsFloor()) + mSoundPlayer->Play("Build2", SoundMask_20, SoundFlags_20, ¢erPt, PlayMode_2, 100); + else if (m1A0 && m1A0->IsFloor()) + mSoundPlayer->Play("Build", SoundMask_20, SoundFlags_20, ¢erPt, PlayMode_2, 100); + + RECT craneUpdateRect = {0, 0, 0, 0}; + CalcCraneUpdateRect(craneUpdateRect); + mTowerMainView->InvalUnitRect(craneUpdateRect, true); + } + + int moneySpent = mFundsOnClick - GetCurrentFunds(); + if (inRect.top >= mWorldDef->mGroundLine && !m1A0->IsFloor() && moneySpent >= 65) { + T2TreasureStatus status; + if (mWorldDef->CheckTreasure(this, &status)) { + T2TreasureDialog::ShowTreasureDialog(this, &status); + int winnings = status._0; + DoPay(-winnings, kFundGroup4); + } + } + + if (mDragMask) { + free(mDragMask); + mDragMask = NULL; + } +} + +/*virtual*/ void T2TowerDoc::CalcDragMask(CRect inRect) { + RECT buildArea; + mWorldDef->GetBuildArea(buildArea); + + int width = mWorldDef->GetWidth(); + mDragMask = (DragMask *) malloc(width * sizeof(DragMask)); + + int i; + for (i = 0; i < width; i++) { + mDragMask[i].x0 = kDm1; + mDragMask[i].x4 = 0; + SetRectEmpty(&mDragMask[i].rect); + } + + int funds = GetCurrentFunds(); + CalcDragMaskPoint(inRect, funds, mDragMask, 0, false); + + if (mDragMask[inRect.left].x0 == kDm0) { + CRect rect = inRect; + + for (i = inRect.left + inRect.Width(); i < width; i += inRect.Width()) { + rect.left = i; + rect.right = i + inRect.Width(); + if (CalcDragMaskPoint(rect, funds, mDragMask, 2, false) != kDm0) + break; + } + + funds = mDragMask[inRect.left].x4; + for (i = inRect.left - m1A0->mWidth; i >= 0; i -= inRect.Width()) { + rect.left = i; + rect.right = i + inRect.Width(); + if (CalcDragMaskPoint(rect, funds, mDragMask, 1, false) != kDm0) + break; + } + } +} + +/*virtual*/ int T2TowerDoc::CalcDragMaskPoint(CRect &ioRect, int &ioFunds, DragMask *inArray, int inMode, BOOL inShowError) { + int h = ioRect.left; + + if (ioFunds < 0) + return true; + if (inArray && inArray[h].x0 == kDm2) + return true; + + RECT area = ioRect; + unsigned int valiation; + if (!m1A0->IsFloor()) { + if (area.bottom == mWorldDef->mGroundLine) + valiation = 1; + else + valiation = 0; + } else { + valiation = mValiation; + } + + int cost = 0; + BOOL success = CheckTenantArea(area, m1A0, inShowError, false); + if (success && success) { + RECT rect2 = area; + + BOOL isSkyBridge = false; + CProgramPlugin *thePlugin = m1A0->GetPlugin(); + isSkyBridge = (thePlugin && thePlugin->GetID() == 'SKYB'); + + if (!isSkyBridge) { + success = mFloorDef->AreaCheck( + this, + rect2, + valiation | + (!m1A0->IsFloor() ? 0x10000 : 0) | + ((inMode == 1) ? 0x1000 : 0) | + ((inMode == 2) ? 0x100 : 0), + inShowError + ) == AreaCheckCode_1; + } + + if (success) + cost += mFloorDef->CalcPayment(this, rect2, valiation); + + if (success && !m1A0->IsFloor()) { + success = (m1A0->AreaCheck(this, area, mValiation, inShowError) == AreaCheckCode_1); + cost += m1A0->CalcPayment(this, area, mValiation); + } + + if (success) { + if (ioFunds >= cost) { + ioFunds -= cost; + ioRect = area; + + if (inArray) { + for (int i = area.left; i < area.right; i++) { + if (inArray[i].x0 != kDm0) + inArray[i].x0 = kDm2; + } + + inArray[h].x0 = kDm0; + inArray[h].x4 = ioFunds; + inArray[h].rect = area; + } + } else { + success = false; + if (inShowError) { + // EN: Shortage of construction money. + towerDoc_vf13C()->BuildErr(10, NULL); + } + } + } + } + + if (inArray) + return inArray[h].x0; + return success ? kDm0 : kDm1; +} + +/*virtual*/ BOOL T2TowerDoc::CheckTenantArea(const RECT &inRect, T2TenantDef *inTenantDef, BOOL inShowErr, BOOL inUnkFlag) { + RECT buildArea; + mWorldDef->GetBuildArea(buildArea); + + if (inRect.top < buildArea.top || inRect.bottom > buildArea.bottom || inRect.left < buildArea.left || inRect.right > buildArea.right) { + if (inShowErr) { + // EN: Can not place items here. + towerDoc_vf13C()->BuildErr(8, NULL); + } + return false; + } + + if (!mFloorInfo->IsAreaBuildable(inRect)) { + if (inShowErr) { + // EN: Can not place items here. + towerDoc_vf13C()->BuildErr(8, NULL); + } + return false; + } + + if (!inUnkFlag) { + if (!m1A0->IsFloor()) { + if (m1A0->IsSetAttribute(kTenantAttrOnlyGroundFloor)) { + if (inRect.bottom != mWorldDef->mGroundLine) { + if (inShowErr) { + // EN: This item can only be placed on the lobby floor. + towerDoc_vf13C()->BuildErr(23, NULL); + } + return false; + } + } else { + if (mWorldDef->mGroundLine > inRect.top && inRect.bottom > (mWorldDef->mGroundLine - mWorldDef->GetLobbyHeight())) { + if (inShowErr) { + // EN: Can not place this item on the lobby floor. + towerDoc_vf13C()->BuildErr(24, NULL); + } + return false; + } + } + + if (m1A0->IsSetAttribute(kTenantAttrOnlyAboveGround)) { + if (inRect.bottom > mWorldDef->mGroundLine) { + if (inShowErr) { + // EN: Can not place this item underground. + towerDoc_vf13C()->BuildErr(6, NULL); + } + return false; + } + } + + if (m1A0->IsSetAttribute(kTenantAttrOnlyUnderground)) { + if (inRect.top < mWorldDef->mGroundLine) { + if (inShowErr) { + // EN: Can not place this item above ground. + towerDoc_vf13C()->BuildErr(7, NULL); + } + return false; + } + } + } + + BOOL isBuildingFloor = m1A0->IsFloor(); + + POSITION pos = mObjectQueue->GetHeadPosition(); + while (pos) { + RECT tmp; + T2Equip *equip = (T2Equip *) mObjectQueue->GetNext(pos); + if (IntersectRect(&tmp, &inRect, &equip->mArea)) { + if (inShowErr) { + // EN: Can not place items where something else already exists. + towerDoc_vf13C()->BuildErr(9, NULL); + } + return false; + } + } + + for (int v = inRect.top; v < inRect.bottom; v++) { + for (int h = inRect.left; h < inRect.right; h++) { + T2Tenant *theTenant = mFloorInfo->GetTenant(v, h); + if (theTenant && (isBuildingFloor || !theTenant->IsFloor())) { + if (inShowErr) { + // EN: Can not place items where something else already exists. + towerDoc_vf13C()->BuildErr(9, NULL); + } + return false; + } + } + } + } + + return true; +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf248(CRect inRect) { + BOOL result = true; + + int cost2 = 0; + int beginH = inRect.left; + CPoint centerPt = inRect.CenterPoint(); + + if (mDragMask[beginH].x0 == kDm3) + result = false; + + if (result && m1A0->GetMaxBuildCount() != 0) { + if (m1A0->GetCurBuildCount() >= m1A0->GetMaxBuildCount()) { + if (_B0) { + // EN: Can not make additional placement of this item. + towerDoc_vf13C()->BuildErr(11, NULL); + } + result = false; + } + } + + if (result) { + int funds = GetCurrentFunds(); + CalcDragMaskPoint(inRect, funds, NULL, 0, _B0); + if (mDragMask[beginH].x0 != kDm0) + result = false; + } + + CRect rect = inRect; + if (result) { + if (!CheckTenantArea(rect, m1A0, false, false)) + result = false; + } + + if (result) { + int cost = 0; + int h, v; + + if (!m1A0->IsFloor()) { + for (v = rect.top; v < rect.bottom; v++) { + BOOL isLobby; + if (rect.bottom == mWorldDef->mGroundLine) + isLobby = true; + else + isLobby = false; + + for (h = rect.left; h < rect.right; h++) { + if (!mFloorInfo->GetTenant(v, h)) { + RECT newTenantRect; + newTenantRect.top = v; + newTenantRect.left = h; + newTenantRect.bottom = v + 1; + + for (; h < rect.right; h++) { + if (mFloorInfo->GetTenant(v, h)) + break; + } + + newTenantRect.right = h; + + mFloorDef->AreaCheck(this, newTenantRect, 3, false); + cost += mFloorDef->CalcPayment(this, newTenantRect, 0); + + h = newTenantRect.right; + + T2Tenant *theTenant = AssignNewTenant(mFloorDef, newTenantRect, (isLobby == 1)); + theTenant->StartBuild(); + mFloorInfo->FillTenantID(theTenant->mArea, theTenant->mEquipID); + theTenant->GetEquipDef()->BuildFinish(this, theTenant); + + mTowerMainView->InvalUnitRect(newTenantRect, true); + mTowerMainView->tmv_vf120(); + } + } + } + } + + if (_1A4 && !_1A4->IsFloor()) + _1A4 = NULL; + + if (!_1A4) { + _1A4 = AssignNewTenant(m1A0, rect, mValiation); + TenantAdded(_1A4); + cost += m1A0->CalcPayment(this, rect, mValiation); + } + + BOOL isFloor = false; + if (!_1A4->IsFloor()) { + mSoundPlayer->Play("Build1", SoundMask_20, SoundFlags_20, ¢erPt, PlayMode_2, 100); + mObjectQueue->AddItem(_1A4); + CheckBuildQueue(); + } else { + mSoundPlayer->Play("BuildFloor", SoundMask_20, SoundFlags_20, ¢erPt, PlayMode_0, 100); + + RECT origArea = _1A4->mArea; + if (rect.left < _1A4->mArea.left) + _1A4->mArea.left = rect.left; + if (_1A4->mArea.right < rect.right) + _1A4->mArea.right = rect.right; + + mFloorDef->AreaCheck(this, _1A4->mArea, mValiation, false); + + if (!EqualRect(&origArea, &_1A4->mArea) || EqualRect(&rect, &_1A4->mArea)) { + if (!EqualRect(&origArea, &_1A4->mArea)) + cost += mFloorDef->CalcPayment(this, _1A4->mArea, mValiation); + + mFloorDef->OptionProc(this, _1A4, NULL); + mFloorInfo->FillTenantID(_1A4->mArea, _1A4->mEquipID); + _1A4->StartBuild(); + _1A4->GetEquipDef()->BuildFinish(this, _1A4); + + isFloor = true; + } + } + + if (isFloor) + mTowerMainView->InvalUnitRect(_1A4->mArea, true); + + DoPay(cost, kFundGroup1); + DoPay(-cost2, kFundGroup4); + + mWorldDef->SetLatestBuild(_1A4, true); + + for (h = inRect.left; h < inRect.right; h++) + mDragMask[h].x0 = kDm3; + + InvalFunds(); + _200++; + } else { + if (_200 == 0) { + CPoint pt = inRect.CenterPoint(); + mSoundPlayer->Play("No", SoundMask_20, SoundFlags_20, &pt, PlayMode_2, 100); + _200--; + } + } + + return result; +} + +/*virtual*/ T2Tenant *T2TowerDoc::AssignNewTenant(T2TenantDef *inTenantDef, RECT &inRect, unsigned int inValiation) { + T2Tenant *theTenant = mFloorInfo->FindUnusedTenant(); + theTenant->InitTenant(inTenantDef, inRect, inValiation); + return theTenant; +} + +/*virtual*/ void T2TowerDoc::CheckBuildQueue() { + POSITION position = mObjectQueue->GetHeadPosition(); + while (position) { + POSITION oldPosition = position; + T2Tenant *tenant = (T2Tenant *) mObjectQueue->GetNext(position); + BOOL isWait = false; + + for (int v = tenant->mArea.top; v < tenant->mArea.bottom; v++) { + for (int h = tenant->mArea.left; h < tenant->mArea.right; h++) { + T2Tenant *otherTenant = mFloorInfo->GetTenant(v, h); + if (otherTenant && otherTenant->IsFloor()) { + if (!otherTenant->IsBuildFinish()) { + isWait = true; + break; + } + h = otherTenant->mArea.right - 1; + } + } + } + + if (!isWait) { + T2Tenant *theFloor = mFloorInfo->GetTenant(tenant->mArea.top, tenant->mArea.left); + tenant->SetFloorID(mFloorInfo); + mFloorInfo->FillTenantID(tenant->mArea, tenant->mEquipID); + + tenant->StartBuild(); + + RECT updateRect = tenant->mArea; + if (tenant->mArea.right < theFloor->mArea.right) { + updateRect.right = theFloor->mArea.right; + theFloor->SetDrawMode(DrawMode3); + } + mTowerMainView->InvalUnitRect(updateRect, true); + + mObjectQueue->RemoveItem(oldPosition); + position = mObjectQueue->GetHeadPosition(); + } + } +} + +/*virtual*/ BOOL T2TowerDoc::DoClickByMoverTool(CRect inRect, T2MoverDef *inDef, unsigned int inValiation, BOOL inIsFromMouseMove) { + if (!inDef) + return false; + + int cost = 0; + + RECT moverRect = inRect; + +#line 3246 + _ASSERT(!inDef->ClickProc(this, &moverRect, inValiation)); + + if (!mFloorInfo->IsAreaBuildable(moverRect)) + return false; + + AREACHECKCODE theAreaCheck = inDef->AreaCheck(this, moverRect, 0, !inIsFromMouseMove); + if (theAreaCheck == AreaCheckCode_0) + return false; + if (theAreaCheck == AreaCheckCode_0) + return false; + + if (theAreaCheck == AreaCheckCode_1) { + moverRect.top -= inDef->mAddSize.top; + moverRect.left -= inDef->mAddSize.left; + moverRect.bottom -= inDef->mAddSize.bottom; + moverRect.right -= inDef->mAddSize.right; + } + + CRect requiredSpace = moverRect; + requiredSpace.left -= T2MoverDef::GetRequiredRequestSpace(); + requiredSpace.right += T2MoverDef::GetRequiredRequestSpace(); + + CRect checkSpace, buildArea; + mFloorInfo->GetBuildArea(buildArea); + checkSpace.IntersectRect(buildArea, requiredSpace); + + if (checkSpace != requiredSpace || !mFloorInfo->IsAllTenant(requiredSpace)) { + if (!inIsFromMouseMove) { + if (inDef->IsStair()) { + // EN: can not be placed there. + towerDoc_vf13C()->BuildErr(41, inDef); + } else { + // EN: Can not place elevator system there. + towerDoc_vf13C()->BuildErr(42, NULL); + } + } + return false; + } + + T2FInfoAreaIterator iter(*mFloorInfo, requiredSpace); + T2UnitInfo *theUnitInfo; + while (iter.Next(theUnitInfo)) { + unsigned int theTenantID = theUnitInfo->GetTenantID(); + if (theTenantID != 0) { + T2Tenant *theTenant = mFloorInfo->GetTenant(theTenantID); + if (theTenant && theTenant->IsSetAttribute(kTenantAttr40000)) { + if (!inIsFromMouseMove) { + // EN: Can not place a transit system on the Sky Bridge. + towerDoc_vf13C()->BuildErr(72, NULL); + } + return false; + } + } + } + + if (!mFloorInfo->IsEnoughSideSpace(inRect)) { + if (!inIsFromMouseMove) { + if (inDef->IsStair()) { + // EN: requires space on both sides. + towerDoc_vf13C()->BuildErr(32, inDef); + } else { + // EN: The elevator item requires space on both sides. + towerDoc_vf13C()->BuildErr(33, NULL); + } + } + return false; + } + + BOOL finish = true; + + if (theAreaCheck == AreaCheckCode_1) { + cost = inDef->CalcPayment(this, moverRect, 0); + if (cost > GetCurrentFunds()) { + if (!inIsFromMouseMove) { + // EN: Shortage of construction money. + towerDoc_vf13C()->BuildErr(10, NULL); + } + return false; + } + + if (!inIsFromMouseMove) { + mFloorInfo->FinishBuildFloor(this, requiredSpace); + finish = towerDoc_vf258(moverRect, inDef); + } + } else if (theAreaCheck == AreaCheckCode_2) { + cost = inDef->m194; + if (cost == 0) + cost = inDef->CalcPayment(this, moverRect, 0); + + if (cost > GetCurrentFunds()) { + if (!inIsFromMouseMove) { + // EN: Shortage of construction money. + towerDoc_vf13C()->BuildErr(10, NULL); + } + return false; + } + + if (!inIsFromMouseMove) { + mFloorInfo->FinishBuildFloor(this, requiredSpace); + finish = towerDoc_vf25C(moverRect, inDef); + } + } + + if (!inIsFromMouseMove && finish) { + DoPay(cost, kFundGroup1); + mWorldDef->SetLatestBuild(inDef, true); + } + + return true; +} + +/*virtual*/ void T2TowerDoc::DoDragByMoverTool(CRect inRect) { + // empty +} + +/*virtual*/ void T2TowerDoc::DoReleaseByMoverTool(CRect inRect) { + // empty +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf258(const RECT &inRect, T2MoverDef *inMoverDef) { + if (!inMoverDef) + return false; + + CRect cRect = inRect; + CPoint centerPt = cRect.CenterPoint(); + + RECT moverArea = inRect; + + BOOL didBuildMover = false; + PROCCODE result = inMoverDef->DoBuildProc(this, moverArea, 0); + + if (result == ProcCode_1) { + mSoundPlayer->Play("Build", SoundMask_20, SoundFlags_20, ¢erPt, PlayMode_2, 100); + didBuildMover = true; + } + + if (result == ProcCode_0) { + T2Mover *theMover = mFloorInfo->FindUnusedMover(); + theMover->InitMover(inMoverDef, moverArea, 0); + mFloorInfo->FillMoverID(theMover->mArea, theMover->mEquipID); + theMover->GetEquipDef()->BuildFinish(this, theMover); + moverArea = theMover->mArea; + } + + mTowerMainView->InvalUnitRect(moverArea); + mTowerMainView->tmv_vf120(); + return didBuildMover; +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf25C(const RECT &inRect, T2MoverDef *inMoverDef) { + if (!inMoverDef) + return false; + + CRect buildRect = inRect; + CPoint centerPt = buildRect.CenterPoint(); + + RECT moverArea = inRect; + + T2FInfoAreaIterator iter(*mFloorInfo, inRect); + T2UnitInfo *unitInfo; + T2Mover *theMover; + while (iter.Next(unitInfo)) { + unsigned int theMoverID = unitInfo->GetMoverID(); + if (theMoverID != 0) { + theMover = mFloorInfo->GetMover(theMoverID); + if (theMover->GetEquipType() == inMoverDef->GetEquipType()) + break; + } + } + + if (inMoverDef->AddModuleProc(this, theMover, &moverArea) == ProcCode_1) { + mSoundPlayer->Play("Build1", SoundMask_20, SoundFlags_20, ¢erPt, PlayMode_2, 100); + return true; + } + + return false; +} + +/*virtual*/ BOOL T2TowerDoc::DoClickByFingerTool(CPoint inPt) { + CPoint pt = inPt; + UT2Coordinate::QDToUnit(pt, mZoomLevel); + + T2Mover *theMover = mFloorInfo->GetMover(pt.y, pt.x); + m1C4 = theMover; + if (theMover) { + if (theMover->GetPartFromPoint(this, inPt, NULL)) + return theMover->GetEquipDef()->FingerToolProc(this, theMover, inPt, MouseEvent_0); + } + + T2Tenant *theTenant = mFloorInfo->GetTenant(pt.y, pt.x); + m1C4 = theTenant; + if (theTenant) { + if (theTenant->GetPartFromPoint(this, inPt, NULL)) + return theTenant->GetEquipDef()->FingerToolProc(this, theTenant, inPt, MouseEvent_0); + } + + return false; +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf23C(CPoint inPt) { + CPoint pt = inPt; + UT2Coordinate::QDToUnit(pt, mZoomLevel); + + if (pt.x < 0) + return false; + if (pt.x >= mFloorInfo->GetHRange()) + return false; + + if (pt.y < 0) + return false; + if (pt.y >= mFloorInfo->GetVRange()) + return false; + + T2Mover *theMover = mFloorInfo->GetMover(pt.y, pt.x); + if (theMover) { + T2MoverDef *theMoverDef = (T2MoverDef *) theMover->GetEquipDef(); + if (theMoverDef) { + PARTCODE part = theMoverDef->GetPartFromPoint(this, theMover, inPt, NULL); + if (part == PartCode_1 || part == PartCode_3) + return true; + } + } + + return false; +} + +/*virtual*/ void T2TowerDoc::DoDragByFingerTool(CPoint inPt) { + m1C4->GetEquipDef()->FingerToolProc(this, m1C4, inPt, MouseEvent_1); +} + +/*virtual*/ void T2TowerDoc::DoReleaseByFingerTool(CPoint inPt) { + m1C4->GetEquipDef()->FingerToolProc(this, m1C4, inPt, MouseEvent_2); + m1C4 = NULL; +} + +/*virtual*/ void T2TowerDoc::DoClickByOutObjTool(CRect inRect, T2OuterObjDef *inDef, unsigned int inValiation) { + towerDoc_vf260(inRect, inDef); +} + +/*virtual*/ void T2TowerDoc::DoDragByOutObjTool(CRect inRect) { + // empty +} + +/*virtual*/ void T2TowerDoc::DoReleaseByOutObjTool(CRect inRect) { + // empty +} + +/*virtual*/ void T2TowerDoc::DoGetInfo(CPoint inPt) { + HitTestResult result; + int theHit = HitTest(inPt, result, false, mViewMode != kOutView); + + if (!result.obj) + return; + + if (theHit != kHitBkgndInfo && theHit != kHitSpriteObj) { + if (mViewMode != kOutView || (mViewMode == kOutView && theHit == kHitOutObj)) { + if (theHit == kHitMover) + ((T2Mover *) result.obj)->ShowInfoDialog(this, inPt); + else + ((T2Equip *) result.obj)->ShowInfoDialog(this); + } + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf228(CPoint inPt) { + // empty +} + +/*virtual*/ void T2TowerDoc::DoInterview(CPoint inPt) { + CPoint pt = inPt; + UT2Coordinate::QDToUnit(pt, mZoomLevel); + + T2People *thePeople = mFloorInfo->FindPeople(pt.y, pt.x); + if (thePeople) + thePeople->Interview(this); +} + +/*virtual*/ void T2TowerDoc::DoSearchRangeTool(CPoint inPt) { + CPoint pt = inPt; + UT2Coordinate::QDToUnit(pt, mZoomLevel); + + T2Tenant *theClickTenant = mFloorInfo->GetTenant(pt.y, pt.x); + if (theClickTenant && !theClickTenant->IsFloor()) + SetSearchRangeFrom(theClickTenant); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf260(const RECT &inRect, T2OuterObjDef *inOuterObjDef) { + CRect rect = inRect; + CPoint centerPt = rect.CenterPoint(); + + if (inOuterObjDef->AreaCheck(this, rect, 0, true) == AreaCheckCode_1) { + mSoundPlayer->Play("Build", SoundMask_20, SoundFlags_20, ¢erPt, PlayMode_2, 100); + + T2OutObj *theOutObj = mFloorInfo->FindUnusedOutObj(); + inOuterObjDef->InitObject(theOutObj); + theOutObj->_3C = rect; + + mOuterObjList->Add(&theOutObj); + mFloorInfo->FillOutObjID(rect, theOutObj->mID); + + mTowerMainView->InvalUnitRect(rect, true); + mWorldDef->SetLatestBuild(inOuterObjDef, true); + + DoPay(inOuterObjDef->mPrice[0], kFundGroup1); + theOutObj->InitOutObj(inOuterObjDef, rect, mValiation); + } +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf288(RECT &ioRect, int &ioCost) { + int cost = ioCost, x, y; + RECT rect; + RECT origRect = ioRect; + + for (y = ioRect.top; y < ioRect.bottom; y++) { + for (x = ioRect.left; x < ioRect.right; x++) { + if (mFloorInfo->GetTenant(y, x) == 0) { + rect.top = y; + rect.bottom = y + 1; + rect.left = x; + + for (; x < ioRect.right; x++) { + if (mFloorInfo->GetTenant(y, x)) + break; + } + + rect.right = x; + + if (!CheckTenantArea(rect, mFloorDef, false, true)) + return false; + if (!mWorldDef->TenantAreaCheck(this, rect, false)) + return false; + if (mFloorDef->AreaCheck(this, rect, 0, false) != AreaCheckCode_1) + return false; + + cost += mFloorDef->CalcPayment(this, rect, 0); + if (cost > GetCurrentFunds()) + return false; + + UnionRect(&ioRect, &ioRect, &rect); + } + } + } + + ioCost = cost; + return true; +} + +/*virtual*/ void T2TowerDoc::FillFloor(const RECT &inRect) { + RECT rect; + int x, y; + + for (y = inRect.top; y < inRect.bottom; y++) { + for (x = inRect.left; x < inRect.right; x++) { + if (mFloorInfo->GetTenantID(y, x) == 0) { + rect.top = y; + rect.bottom = y + 1; + rect.left = x; + + for (; x < inRect.right; x++) { + if (mFloorInfo->GetTenant(y, x)) + break; + } + + rect.right = x; + + T2Tenant *theTenant = AssignNewTenant(mFloorDef, rect, 0); + theTenant->SetStatus(kTenantStatus1); + + mFloorInfo->FillTenantID(theTenant->mArea, theTenant->mEquipID); + theTenant->GetEquipDef()->BuildFinish(this, theTenant); + theTenant->Idle(this); + + CalcCraneUpdateRect(rect); + mTowerMainView->InvalUnitRect(rect, true); + } + } + } + + mFloorInfo->FinishBuildFloor(this, inRect); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf298() { + if (!m1CC) + m1CC = 1; +} + +/*virtual*/ void T2TowerDoc::BreakoutEmergency() { + mFloorInfo->GetTenantArrayList()->BreakoutEmergency(this); + mFloorInfo->GetRequestArrayList()->BreakoutEmergency(this); + mPeopleArrayList->BreakoutEmergency(this); +} + +void T2TowerDoc::OnUpdateDebugStepRun(CCmdUI *pCmdUI) { + pCmdUI->SetCheck(mDebugStepRunEnabled != FALSE); +} + +void T2TowerDoc::OnDebugStepRun() { + mDebugStepRunEnabled = !mDebugStepRunEnabled; + + T2_APP->app_vfA4(!mDebugStepRunEnabled); + T2_MAIN_WINDOW->mDbgStepRun->ShowWindow(mDebugStepRunEnabled ? SW_SHOW : SW_HIDE); +} + +void T2TowerDoc::InvalClock() { + T2MsgWindow *msgWindow = T2_MAIN_WINDOW->mMsgWindow; + msgWindow->GetDlgItem(1000)->InvalidateRect(NULL); +} + +void T2TowerDoc::InvalCalender() { + T2MsgWindow *msgWindow = T2_MAIN_WINDOW->mMsgWindow; + msgWindow->GetDlgItem(1001)->InvalidateRect(NULL); +} + +void T2TowerDoc::InvalFunds() { + T2MsgWindow *msgWindow = T2_MAIN_WINDOW->mMsgWindow; + msgWindow->GetDlgItem(1002)->InvalidateRect(NULL); +} + +void T2TowerDoc::InvalPopulation() { + T2MsgWindow *msgWindow = T2_MAIN_WINDOW->mMsgWindow; + msgWindow->GetDlgItem(1003)->InvalidateRect(NULL); +} + +void T2TowerDoc::SetupGradeAnimation() { + T2MsgWindow *msgWindow = T2_MAIN_WINDOW->mMsgWindow; + if (msgWindow) { + T2DlgItemAnimation *theAnimation = (T2DlgItemAnimation *) msgWindow->GetDlgItem(1005); + theAnimation->SetAnimation(mWorldDef->mModuleHandle, mWorldDef->m148[mGameLevel - 1], 0); + theAnimation->SetAnimationParam(100, 0); + } +} + +void T2TowerDoc::x42670C() { + // empty +} + +void T2TowerDoc::x426717() { + // empty +} + +void T2TowerDoc::CycleOutlinePalette() { + static int sMode = 0; + static int sCounter = 0; + + PALETTEENTRY colors[2]; + + if (sMode == 0) { + colors[0].peRed = 1; + colors[0].peGreen = 1; + colors[0].peBlue = 1; + colors[0].peFlags = PC_RESERVED; + colors[1].peRed = 255; + colors[1].peGreen = 255; + colors[1].peBlue = 255; + colors[1].peFlags = PC_RESERVED; + + sCounter++; + if (sCounter == 2) + sCounter = 0; + } else if (sMode == 1) { + int i = ((sCounter + 1) * 254) / 3; + colors[0].peRed = i + 1; + colors[0].peGreen = i + 1; + colors[0].peBlue = i + 1; + colors[0].peFlags = PC_RESERVED; + colors[1].peRed = 255 - i; + colors[1].peGreen = 255 - i; + colors[1].peBlue = 255 - i; + colors[1].peFlags = PC_RESERVED; + + sCounter++; + if (sCounter == 2) + sCounter = 0; + } else if (sMode == 2) { + colors[0].peRed = 255; + colors[0].peGreen = 255; + colors[0].peBlue = 255; + colors[0].peFlags = PC_RESERVED; + colors[1].peRed = 1; + colors[1].peGreen = 1; + colors[1].peBlue = 1; + colors[1].peFlags = PC_RESERVED; + + sCounter++; + if (sCounter == 2) + sCounter = 0; + } else if (sMode == 3) { + int i = ((sCounter + 1) * 254) / 3; + colors[0].peRed = 255 - i; + colors[0].peGreen = 255 - i; + colors[0].peBlue = 255 - i; + colors[0].peFlags = PC_RESERVED; + colors[1].peRed = i + 1; + colors[1].peGreen = i + 1; + colors[1].peBlue = i + 1; + colors[1].peFlags = PC_RESERVED; + + sCounter++; + if (sCounter == 2) + sCounter = 0; + } + + if (sCounter == 0) { + sMode++; + if (sMode == 4) + sMode = 0; + } + + UpdatePalette(253, 2, colors); +} + +/*virtual*/ void T2TowerDoc::UpdatePalette(int startIndex, int count, PALETTEENTRY *entries) { + if (mIsPaletteMode) { + mWorldDef->GetPalette()->AnimatePalette(startIndex, count, entries); + } else { + mWorldDef->GetPalette()->SetPaletteEntries(startIndex, count, entries); + mPaletteUpdated = true; + } +} + +/*virtual*/ void T2TowerDoc::DoPayTool(int inCost, short inFundGroup, T2ToolDef *inToolDef) { + if (inCost == 0) + return; + + mSettlement->DoPayTool(inCost, inFundGroup, inToolDef); + InvalFunds(); +} + +/*virtual*/ void T2TowerDoc::DoPayTool(int inCost, short inFundGroup, T2ToolDef *inToolDef, const char *inMessage, int inLimitLength, int inLimitType) { + if (inCost == 0) + return; + + mSettlement->DoPayTool(inCost, inFundGroup, inToolDef); + mSettlement->EmitPayToolMessage(this, inToolDef, inMessage, inLimitLength, inLimitType); + InvalFunds(); +} + +/*virtual*/ void T2TowerDoc::DoPay(int inCost, short inFundGroup) { + if (inCost == 0) + return; + + mSettlement->DoPay(inCost, inFundGroup); + InvalFunds(); +} + +/*virtual*/ void T2TowerDoc::CallbackZoomIn(POINT inPt) { + mTowerMainView->DoZoomIn(inPt); + x42670C(); +} + +/*virtual*/ void T2TowerDoc::CallbackZoomOut() { + mTowerMainView->DoZoomOut(); + x42670C(); +} + +/*virtual*/ void T2TowerDoc::CallbackInView() { + SetViewMode(kInView); + mTowerMainView->Invalidate(true); + + T2_APP->mMainWindow->mCtrlPalette->vf104(mViewMode); +} + +/*virtual*/ void T2TowerDoc::CallbackOutView() { + SetViewMode(kOutView); + mTowerMainView->Invalidate(true); + + T2_APP->mMainWindow->mCtrlPalette->vf104(mViewMode); +} + +/*virtual*/ void T2TowerDoc::CallbackPriceView() { + SetViewMode(kPriceView); + mTowerMainView->Invalidate(true); + + T2_APP->mMainWindow->mCtrlPalette->vf104(mViewMode); +} + +/*virtual*/ void T2TowerDoc::CallbackMaintView() { + SetViewMode(kMaintView); + mTowerMainView->Invalidate(true); + + T2_APP->mMainWindow->mCtrlPalette->vf104(mViewMode); +} + +/*virtual*/ void T2TowerDoc::CallbackTransView() { + SetViewMode(kTransView); + mTowerMainView->Invalidate(true); + + T2_APP->mMainWindow->mCtrlPalette->vf104(mViewMode); +} + +/*virtual*/ void T2TowerDoc::CallbackEvalView() { + SetViewMode(kEvalView); + mTowerMainView->Invalidate(true); + + T2_APP->mMainWindow->mCtrlPalette->vf104(mViewMode); +} + +/*virtual*/ void T2TowerDoc::CallbackPause(BOOL inPause) { + towerDoc_vf290(inPause); + x429B01(inPause); +} + +/*virtual*/ void T2TowerDoc::CallbackCalendar() { +} + +/*virtual*/ void T2TowerDoc::CallbackFunds() { +} + +/*virtual*/ void T2TowerDoc::CallbackPopulation() { +} + +void T2TowerDoc::OnUpdateDebugIdleSpeedMeasuring(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnDebugIdleSpeedMeasuring() { + m20C = time(NULL); + + time_t t; +retry: + t = time(NULL); + if (t == m20C) + goto retry; + + m20C = t; + m210 = 0; + m214 = 0; +} + +void T2TowerDoc::OnUpdateDebugAllLoadMeasuring(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnDebugAllLoadMeasuring() { + m20C = time(NULL); + + time_t t; + retry: + t = time(NULL); + if (t == m20C) + goto retry; + + m20C = t; + m210 = 0; + m214 = 1; +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf290(BOOL inPause) { + if (inPause) { + mPause++; + } else if (mPause > 0) { + mPause--; + } else { +#line 4043 + _ASSERT(!1); + } + + TRACE("\x81\x9FPAUSE COUNTER = %d\n", mPause); +} + +void T2TowerDoc::OnUpdateDebugPool(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnDebugPool() { + CString wndClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, NULL, (HBRUSH) GetStockObject(WHITE_BRUSH)); + + RECT theRect; + SetRect(&theRect, 300, 80, 500, 400); + + T2PoolView *thePoolView = new T2PoolView; + thePoolView->Create(wndClass, "Pool", WS_THICKFRAME | WS_POPUPWINDOW | WS_VSCROLL | WS_CAPTION | WS_CLIPCHILDREN | WS_VISIBLE, theRect, AfxGetMainWnd(), NULL, WS_EX_TOOLWINDOW); + thePoolView->SetPool(mPool); +} + +void T2TowerDoc::OnUpdateDebugDisplayIPS(CCmdUI *pCmdUI) { + pCmdUI->Enable(); + pCmdUI->SetCheck(mDisplayIPS); +} + +void T2TowerDoc::OnDebugDisplayIPS() { + mDisplayIPS = !mDisplayIPS; + T2_MAIN_WINDOW->mDbgIPS->ShowWindow(mDisplayIPS ? SW_SHOW : SW_HIDE); +} + +/*virtual*/ void T2TowerDoc::LoadsWorldPlugin() { + mWorldPluginSpecifier = mT2PluginLoader->FindPlugin(mWorldPluginID, 'WdPl'); + if (!mWorldPluginSpecifier) { + T2WorldSelectDlg *dlg = new T2WorldSelectDlg; + dlg->ShowWorldSelectDlg(this, mT2PluginLoader, false); + } else { + towerDoc_vfCC(mWorldPluginSpecifier, false); + } +} + +void T2TowerDoc::OnDebugPeople() { + CString wndClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, NULL, (HBRUSH) GetStockObject(WHITE_BRUSH)); + + RECT theRect; + SetRect(&theRect, 200, 80, 600, 400); + + DbgPeopleView *thePeopleView = new DbgPeopleView; + thePeopleView->SetPeople(mPeopleArrayList); + thePeopleView->Create(wndClass, "People link", WS_THICKFRAME | WS_POPUPWINDOW | WS_VSCROLL | WS_CAPTION | WS_CLIPCHILDREN | WS_VISIBLE, theRect, AfxGetMainWnd(), NULL, WS_EX_TOOLWINDOW); +} + +void T2TowerDoc::OnUpdateDebugPeople(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::UpdateAllTenant() { + CRect rect; + mTowerMainView->GetVisibleUnitRect(rect); + mFloorInfo->SetTenantDrawModeByRect(rect, DrawMode3); + mTowerMainView->Invalidate(false); + mTowerMainView->tmv_vf120(); +} + +/*virtual*/ BOOL T2TowerDoc::IsRectInView(const RECT &inRect) { + CRect theRect, viewRect, intersect; + + theRect = inRect; + UT2Coordinate::UnitToQD(theRect, mZoomLevel); + + mTowerMainView->GetClientRect(viewRect); + viewRect.OffsetRect(mTowerMainView->mScrollOffset); + return intersect.IntersectRect(theRect, viewRect); +} + +/*virtual*/ void T2TowerDoc::SetWalkRate(int inWalkRate) { + mWalkRate = inWalkRate; + mPeopleArrayList->SetWalkPeople(mWalkRate); + UpdateAllTenant(); +} + +/*virtual*/ void T2TowerDoc::AddFavoritePeople(T2People *inPeople) { + if (inPeople) { +#line 4141 + _ASSERT(!inPeople->IsFavorite()); + + CString roomName, peopleDefaultName, name; + unsigned int theTenantID = (inPeople->GetWorkTenant() > 1) ? inPeople->GetWorkTenant() : (inPeople->GetHomeTenant() > 1) ? inPeople->GetHomeTenant() : 1; + T2Tenant *theTenant = GetFloorInfo()->GetTenantArrayList()->GetTenantByID(theTenantID); + + if (theTenant) { + int roomNumber = theTenant->GetRoomNumber(GetFloorInfo()); + UT2Utils::GetRoomNumberString(roomNumber, roomName); + roomName += "\x8D\x86\x8E\xBA"; + } else { + roomName = "\x83\x65\x83\x69\x83\x93\x83\x67\x82\xC8\x82\xB5"; + } + + T2Name *theName = mNameDB->Search(inPeople); + if (theName) { + unsigned int id; + theName->GetName(peopleDefaultName, id); + } else { +#line 4165 + _ASSERT(inPeople->GetMatterDef() != NULL); + _ASSERT(((T2PeopleDef *) inPeople->GetMatterDef())->GetSilhouetteDef() != NULL); + ((T2PeopleDef *) inPeople->GetMatterDef())->GetSilhouetteDef()->GetName(peopleDefaultName); + } + + name = roomName + "\x81\x40" + peopleDefaultName; + + int index = 2; + while (mNameDB->Search(name) || mNameDB->Search(name, true)) { + CString indexStr; + indexStr.Format("%d", index++); + name = roomName + "\x81\x40" + peopleDefaultName + " " + indexStr; + } + + T2Name *newName = new T2Name(name, inPeople, true); + mNameDB->Add(newName); + inPeople->SetFavorite(true); + _1E4 = true; + } +} + +/*virtual*/ void T2TowerDoc::AddFavoriteTenant(T2Tenant *inTenant) { + if (inTenant) { +#line 4192 + _ASSERT(!inTenant->IsFavorite()); + + CString roomName, tenantDefaultName, name; + + int RoomNum = inTenant->GetRoomNumber(GetFloorInfo()); + UT2Utils::GetRoomNumberString(RoomNum, roomName); + roomName += "\x8D\x86\x8E\xBA"; + + T2Name *theName = mNameDB->Search(inTenant); + if (theName) { + unsigned int id; + theName->GetName(tenantDefaultName, id); + } else { + inTenant->GetTypicalName(tenantDefaultName); + } + + name = roomName + "\x81\x40" + tenantDefaultName; + + int index = 2; + while (mNameDB->Search(name) || mNameDB->Search(name, true)) { + CString indexStr; + indexStr.Format("%d", index++); + name = roomName + "\x81\x40" + tenantDefaultName + " " + indexStr; + } + + T2Name *newName = new T2Name(name, inTenant, true); + mNameDB->Add(newName); + inTenant->SetFavorite(true); + _1E4 = true; + } +} + +/*virtual*/ void T2TowerDoc::RemoveFavoritePeople(const char *inName, BOOL inFlag) { + T2Name *theName = mNameDB->Search(inName, true); + if (theName) { + mNameDB->RemoveName(theName); + + T2People *thePeople = mPeopleArrayList->FindPeople(theName->GetID()); + thePeople->SetFavorite(false); + + if (inFlag) + return; + + _1E4 = true; + } +} + +/*virtual*/ void T2TowerDoc::RemoveFavoriteTenant(const char *inName, BOOL inFlag) { + T2Name *theName = mNameDB->Search(inName, true); + if (theName) { + mNameDB->RemoveName(theName); + + T2Tenant *theTenant = mFloorInfo->GetTenantArrayList()->GetTenantByID(theName->GetID()); + theTenant->SetFavorite(false); + + if (inFlag) + return; + + _1E4 = true; + } +} + +/*virtual*/ void T2TowerDoc::RemoveFavoritePeople(T2People *inPeople, BOOL inFlag) { + T2Name *theName = mNameDB->Search(inPeople, true); + if (theName) { + mNameDB->RemoveName(theName); + + T2People *thePeople = mPeopleArrayList->FindPeople(theName->GetID()); + thePeople->SetFavorite(false); + + if (inFlag) + return; + + _1E4 = true; + } +} + +/*virtual*/ void T2TowerDoc::RemoveFavoriteTenant(T2Tenant *inTenant, BOOL inFlag) { + T2Name *theName = mNameDB->Search(inTenant, true); + if (theName) { + mNameDB->RemoveName(theName); + + T2Tenant *theTenant = mFloorInfo->GetTenantArrayList()->GetTenantByID(theName->GetID()); + theTenant->SetFavorite(false); + + if (inFlag) + return; + + _1E4 = true; + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf1D4() { + // empty +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf1D8() { + // empty +} + +/*virtual*/ BOOL T2TowerDoc::IsToiletFlagOn() const { + BOOL isFlagOn = false; + + if (mToiletDenomi > 0) + isFlagOn = (UT2Utils::Randomize(mToiletDenomi) == 0); + + return isFlagOn; +} + +int T2TowerDoc::CheckGameLevel() { + if (m1F0 == 0 && mWorldDef) + m1F0 = mWorldDef->CheckGameLevelProc(this); + + if (m1F0 == 10005) + mGameLevel++; + else if (m1F0 == 10006) + mGameLevel--; + + m1F0 = 0; + return mGameLevel; +} + +void T2TowerDoc::OnDebugGradeUp() { + m1F0 = 10005; +} + +void T2TowerDoc::OnDebugGradeDown() { + m1F0 = 10006; +} + +/*virtual*/ void T2TowerDoc::TenantAdded(T2Tenant *inTenant) { + mRegistedTenantDB->AddItem(inTenant); +} + +/*virtual*/ void T2TowerDoc::TenantRemoved(T2Tenant *inTenant) { + mRegistedTenantDB->RemoveItem(inTenant); + mFloorInfo->GetTenantArrayList()->TenantRemoved(inTenant->GetEquipID()); + mPeopleArrayList->TenantRemoved(inTenant->GetEquipID()); +} + +CPluginInfoArray *T2TowerDoc::MakePluginInfoArray() { + CPluginInfoArray *theArray = new CPluginInfoArray; +#line 4366 + _ASSERT(theArray != NULL); + + CPluginInfo *worldPluginInfo = mWorldPlugin->GetPluginInfo(); + theArray->Add(&worldPluginInfo); + + _MakePluginInfoArray(theArray, mTenantPlugins); + _MakePluginInfoArray(theArray, mMoverPlugins); + _MakePluginInfoArray(theArray, mOuterObjPlugins); + _MakePluginInfoArray(theArray, mMoviePluginList); + _MakePluginInfoArray(theArray, mHallEventPlugins); + + return theArray; +} + +void T2TowerDoc::_MakePluginInfoArray(CPluginInfoArray *inResultArray, CFilePluginList *inPluginArray) { + POSITION position = inPluginArray->GetHeadPosition(); + while (position) { + CFilePlugin *plugin = inPluginArray->GetNext(position); + if (plugin->GetGameLevel() <= mGameLevel) { + CPluginInfo *info = plugin->GetPluginInfo(); + inResultArray->Add(&info); + } + } +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf184(int inFlags) { +#pragma var_order(var14, var18, theToolWindow, specifier, theToolWindow2, numPlugins, str, pos) + if (!(inFlags & _98)) + return; + + T2ToolWindow *theToolWindow = T2_APP->mToolWindow; + T2ToolWindow *theToolWindow2 = T2_APP->mToolWindow; + + int var14 = 0; + T2TemplatePluginList *var18 = NULL; + int numPlugins = 0; + CString str; + + POSITION pos; + T2PluginSpecifier *specifier; + + mT2PluginLoader->SetTypeFilter(pos, 'TnPl'); + var18 = mTenantTemplates; + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + (specifier->mSecretItem & inFlags) && + !mTenantPlugins->GetItem(specifier->mID) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'TnPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + (specifier->mSecretItem & inFlags) && + !mTenantPlugins->GetItem(specifier->mID) + ) + { + T2TenantPlugin *theTenantPlugin = (T2TenantPlugin *) mT2PluginLoader->LoadPlugin(specifier); + mTenantPlugins->Add(theTenantPlugin); + theTenantPlugin->LoadAllTemplatePlugin(mWorldDef, mTemplatePluginDB); + + T2TenantDef *def = (T2TenantDef *) theTenantPlugin->GetTemplatePlugin(); + theTenantPlugin->GetName(str); + mTenantTemplates->Regist(def); + + if (def->IsFloor()) + mFloorDef = def; + + if (!def->RequierToolIcon(theToolWindow2)) + theToolWindow2->AddIcon(def->mStr48, NULL, 0, kToolOption1, def, 0, 1, this); + theToolWindow2->AddIcon("Category", NULL, def->mCategoryNo, kToolOption4, def, 0, 1, this); + + LoadSoundForPlugin(def); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + mT2PluginLoader->SetTypeFilter(pos, 'MvPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mMoverPlugins->GetItem(specifier->mID) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'MvPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mMoverPlugins->GetItem(specifier->mID) + ) + { + T2MoverPlugin *theMoverPlugin = (T2MoverPlugin *) mT2PluginLoader->LoadPlugin(specifier); + mMoverPlugins->Add(theMoverPlugin); + theMoverPlugin->LoadAllTemplatePlugin(mWorldDef, mTemplatePluginDB); + + T2MoverDef *def = (T2MoverDef *) theMoverPlugin->GetTemplatePlugin(); + theMoverPlugin->GetName(str); + mMoverTemplates->Regist(def); + + if (!def->RequierToolIcon(theToolWindow2)) + theToolWindow2->AddIcon(def->mStr48, NULL, 0, kToolOption2, def, 0, 1, this); + theToolWindow2->AddIcon("Category", NULL, def->mCategoryNo, kToolOption4, def, 0, 1, this); + + LoadSoundForPlugin(def); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + mT2PluginLoader->SetTypeFilter(pos, 'OoPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mOuterObjPlugins->GetItem(specifier->mID) + ) + numPlugins++; + } + + mT2PluginLoader->SetTypeFilter(pos, 'OoPl'); + while ((specifier = mT2PluginLoader->GetNext(pos))) { + if ( + (mWorldPlugin->GetAttrib() & specifier->mAttrib) && + (specifier->mGameLevel <= mGameLevel) && + !mOuterObjPlugins->GetItem(specifier->mID) + ) + { + T2OuterObjPlugin *theOuterObjPlugin = (T2OuterObjPlugin *) mT2PluginLoader->LoadPlugin(specifier); + mOuterObjPlugins->Add(theOuterObjPlugin); + theOuterObjPlugin->LoadAllTemplatePlugin(mWorldDef, mTemplatePluginDB); + + T2OuterObjDef *def = (T2OuterObjDef *) theOuterObjPlugin->GetTemplatePlugin(); + theOuterObjPlugin->GetName(str); + mOuterObjTemplates->Regist(def); + + if (!def->RequierToolIcon(theToolWindow2)) + theToolWindow2->AddIcon(def->mStr48, NULL, 0, kToolOption3, def, 0, 2, this); + theToolWindow2->AddIcon("Category", NULL, def->mCategoryNo, kToolOption4, def, 0, 2, this); + + LoadSoundForPlugin(def); + T2PeopleLoader::Load(specifier, mTemplatePluginDB); + } + } + + m9C |= inFlags; +} + +/*virtual*/ BOOL T2TowerDoc::SetElevTransparent(BOOL inTransparent) { + BOOL oldValue = mElevTransparent; + mElevTransparent = inTransparent; + + mTowerMainView->Invalidate(false); + mTowerMainView->tmv_vf120(); + + return oldValue; +} + +/*virtual*/ BOOL T2TowerDoc::towerDoc_vf2B0(BOOL inValue) { + BOOL oldValue = _1FC; + if (inValue != _1FC) + _1FC = inValue; + return oldValue; +} + +/*virtual*/ void T2TowerDoc::FinalEventOccur() { + if (mGameLevel == mWorldDef->mNumOfGradeDef) + mA0 |= mWorldDef->mGradeDef[mGameLevel - 1].m0; +} + +/*virtual*/ void T2TowerDoc::SetSearchRangeFrom(T2Tenant *inTenant) { + mViewMode = ViewMode_6; + mSearchRangeFrom = inTenant; + + mTowerMainView->Invalidate(true); + T2_APP->mMainWindow->mCtrlPalette->vf100(kInView); + T2_APP->mMainWindow->mCtrlPalette->vf104(kInView); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf194() { + mViewMode = kInView; + mSearchRangeFrom = NULL; + + mTowerMainView->Invalidate(true); + T2_APP->mMainWindow->mCtrlPalette->vf100(mViewMode); + T2_APP->mMainWindow->mCtrlPalette->vf104(mViewMode); +} + +/*virtual*/ void T2TowerDoc::DoRenumberTenant() { + CRect rect; + mFloorInfo->GetBuildArea(rect); + + for (int v = rect.top; v < rect.bottom; v++) { + CPoint rightPt; + rightPt.x = rect.right - 1; + rightPt.y = v; + + T2FInfoPtIterator iterator(*mFloorInfo, rightPt); + int number = 0; + T2Tenant *tenant = NULL; + + while (iterator.LeftTenant(tenant)) { + if (tenant->IsFloor()) + continue; + + number++; + tenant->SetTenantNumber(number); + } + + mFloorInfo->SetTenantNumber(v, number); + } + + towerDoc_vf280(); +} + +/*virtual*/ int T2TowerDoc::GetNextTenantNumber(int inV) { + return mFloorInfo->GetNextTenantNumber(inV); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf280() { + // empty +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf1A0(BOOL inPause) { + if (inPause) { + _1F8++; + if (_1F8 != 1) + return; + } else if (_1F8 != 0) { + _1F8--; + if (_1F8 != 0) + return; + } else { + return; + } + + T2ToolWindow *theToolWindow = T2_APP->mToolWindow; + unsigned int isEnabled; + + if (inPause) { + theToolWindow->EnableIcon(false); + isEnabled = MF_BYPOSITION | MF_GRAYED; + } else { + theToolWindow->EnableIcon(true); + isEnabled = MF_BYPOSITION; + } + + T2MainWindow *theMain = T2_MAIN_WINDOW; + CMenu *theMenu = theMain->GetMenu(); + + unsigned int numItems = theMenu->GetMenuItemCount(); + for (unsigned int i = 0; i < numItems; i++) + theMenu->EnableMenuItem(i, isEnabled); + + theMain->DrawMenuBar(); +} + +/*virtual*/ void T2TowerDoc::towerDoc_vf198(unsigned short inWindowType) { + T2MainWindow *theMain = T2_MAIN_WINDOW; + CMenu *theMainMenu = theMain->GetMenu(); + if (!theMainMenu) + return; + + CString label; + CWnd *theWnd; + unsigned int id; + + switch (inWindowType) { + case kControlWindow: + id = 0x801F; + theWnd = T2_APP->mMainWindow->mCtrlPalette; + // "コントロールパレット" + label = "\x83\x52\x83\x93\x83\x67\x83\x8D\x81\x5B\x83\x8B\x83\x70\x83\x8C\x83\x62\x83\x67"; + break; + case kMessageWindow: + id = 0x8020; + theWnd = T2_APP->mMainWindow->mMsgWindow; + // "情報バー" + label = "\x8F\xEE\x95\xF1\x83\x6F\x81\x5B"; + break; + case kToolWindow: + id = 0x8021; + theWnd = T2_APP->mMainWindow->mToolWindow; + // "ツールパレット" + label = "\x83\x63\x81\x5B\x83\x8B\x83\x70\x83\x8C\x83\x62\x83\x67"; + break; + } + + if (theMainMenu->GetMenuState(id, 0) & MFS_CHECKED) { + // "を表示" + label += "\x82\xF0\x95\x5C\x8E\xA6"; + theMainMenu->ModifyMenu(id, 0, id, label); + theMainMenu->CheckMenuItem(id, MFS_UNCHECKED); + theWnd->ShowWindow(SW_HIDE); + } else { + // "を隠す" + label += "\x82\xF0\x89\x42\x82\xB7"; + theMainMenu->ModifyMenu(id, 0, id, label); + theMainMenu->CheckMenuItem(id, MFS_CHECKED); + theWnd->ShowWindow(SW_SHOW); + } +} + +void T2TowerDoc::OnPause() { + T2CtrlPalette *ctrlPalette = T2_APP->mMainWindow->mCtrlPalette; + if (!ctrlPalette) + return; + + T2MWControl *pauseCtrl = ctrlPalette->mPauseControl; + if (!pauseCtrl) + return; + + BOOL isPaused = false; + if (pauseCtrl->GetData() == 0) + isPaused = true; + + towerDoc_vf290(isPaused); + x429A9A(isPaused); + x429B01(isPaused); +} + +void T2TowerDoc::OnUpdatePause(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnSetting() { + T2SettingDialog *theDialog = new T2SettingDialog(this); + short dialogResult = theDialog->DoModal(); +} + +void T2TowerDoc::OnUpdateSetting(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnHideElevatorRoom() { + T2MainWindow *theMain = T2_MAIN_WINDOW; + CMenu *theMainMenu = theMain->GetMenu(); + // "エレベータ機械室" + CString label = "\x83\x47\x83\x8C\x83\x78\x81\x5B\x83\x5E\x8B\x40\x8A\x42\x8E\xBA"; + + if (mElevTransparent) { + // "非表示" + label += "\x94\xF1\x95\x5C\x8E\xA6"; + mElevTransparent = false; + } else { + // "表示" + label += "\x95\x5C\x8E\xA6"; + mElevTransparent = true; + } + + theMainMenu->ModifyMenu(0x801B, 0, 0x801B, label); + mTowerMainView->Invalidate(true); + mTowerMainView->tmv_vf120(); +} + +void T2TowerDoc::OnUpdateHideElevatorRoom(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnFavorite() { + T2SearchDialog *theDialog = new T2SearchDialog(this); + short dialogResult = theDialog->DoModal(); +} + +void T2TowerDoc::OnUpdateFavorite(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnHideControlWindow() { + towerDoc_vf198(kControlWindow); +} + +void T2TowerDoc::OnUpdateHideControlWindow(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnHideMessageWindow() { + towerDoc_vf198(kMessageWindow); +} + +void T2TowerDoc::OnUpdateHideMessageWindow(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +void T2TowerDoc::OnHideToolWindow() { + towerDoc_vf198(kToolWindow); +} + +void T2TowerDoc::OnUpdateHideToolWindow(CCmdUI *pCmdUI) { + pCmdUI->Enable(); +} + +/*virtual*/ T2ToolWindow *T2TowerDoc::towerDoc_vf2A0() { + if (gT2App->mMainWindow && gT2App->mMainWindow->mToolWindow) + return gT2App->mMainWindow->mToolWindow; + + return NULL; +} + +/*virtual*/ void T2TowerDoc::toolCallback_vf00(int unkParam1, T2ToolIconItem *inItem) { + if (inItem->mName == "ToolRoot") { + if (inItem->m24) + towerDoc_vf194(); + } else if (mSearchRangeFrom) { + towerDoc_vf194(); + } +} + +/*virtual*/ void T2TowerDoc::DoFind(T2Name *inName) { + if (!inName) + return; + + RECT rect; + BOOL found = false; + + switch (inName->GetType()) { + case kTenantNameType: { + T2Tenant *theTenant = mFloorInfo->GetTenant(inName->GetID()); + if (theTenant) { + theTenant->GetEquipArea(rect); +#line 5031 + _ASSERT(GetMainView() != NULL); + GetMainView()->CenterOnRect(&rect); + found = true; + } + break; + } + + case kMoverNameType: { + T2Mover *theMover = mFloorInfo->GetMover(inName->GetID()); + if (theMover) { + theMover->GetEquipArea(rect); +#line 5043 + _ASSERT(GetMainView() != NULL); + GetMainView()->CenterOnRect(&rect); + found = true; + } + break; + } + + case kPeopleNameType: { +#line 5068 + _ASSERT(mPeopleArrayList != NULL); + T2People *thePeople = mPeopleArrayList->FindPeople(inName->GetID()); + if (thePeople) + found = x4295F1(thePeople, rect); + break; + } + } + + if (found) { + CPoint leftPt(rect.left, rect.top); + UT2Coordinate::UnitToQD(leftPt, GetZoomLevel()); + + CPoint rightPt(rect.right, rect.top); + UT2Coordinate::UnitToQD(rightPt, GetZoomLevel()); + + leftPt.x += (rightPt.x - leftPt.x) / 2; + + T2TowerMainView *theMainView = GetMainView(); + leftPt -= theMainView->mScrollOffset; + + T2ArrowWnd *arrow = new T2ArrowWnd; + arrow->Show(leftPt.x, leftPt.y, this); + } +} + +BOOL T2TowerDoc::x4295F1(T2People *inPeople, RECT &outRect) { + BOOL isFound = false; + BOOL isFail = false; + CString text; + + switch (inPeople->GetStatus()) { + case kStatus1: { + T2Name *theName = mNameDB->Search(inPeople); + if (theName) { + unsigned int id; + theName->GetName(text, id); + } else { + inPeople->GetName(text); + } + // "は今、ビル内にいません。" + // is not in the building now. + text += "\x82\xCD\x8D\xA1\x81\x41\x83\x72\x83\x8B\x93\xE0\x82\xC9\x82\xA2\x82\xDC\x82\xB9\x82\xF1\x81\x42"; + isFail = true; + break; + } + + case kStatus11: { + T2Tenant *theTenant = GetFloorInfo()->GetTenant(inPeople->GetCurTenantID()); + if (theTenant) { + theTenant->GetEquipArea(outRect); +#line 5117 + _ASSERT(GetMainView() != NULL); + GetMainView()->CenterOnRect(&outRect); + isFound = true; + } + break; + } + + case kStatus8: { + T2Mover *theMover = GetFloorInfo()->GetMover(inPeople->GetCurrEquipID()); + if (theMover) { + T2MoverModule *theModule = theMover->FindPeople(inPeople); + if (theModule) { + int moduleID; + if (theMover->CalcModuleRect(theModule, outRect, moduleID)) { +#line 5132 + _ASSERT(GetMainView() != NULL); + GetMainView()->CenterOnRect(&outRect); + isFound = true; + } else { + T2Name *theName = mNameDB->Search(inPeople); + if (theName) { + unsigned int id; + theName->GetName(text, id); + } else { + inPeople->GetName(text); + } + // "は今、移動設備内にいます。" + // is now in the mobile facility. + text += "\x82\xCD\x8D\xA1\x81\x41\x88\xDA\x93\xAE\x90\xDD\x94\xF5\x93\xE0\x82\xC9\x82\xA2\x82\xDC\x82\xB7\x81\x42"; + isFail = true; + } + } + } + break; + } + + case kStatus6: + case kStatus7: + case kStatus9: + UT2Coordinate::MakeRect( + outRect, + inPeople->GetCurPosition(), + inPeople->IsFatSilhouette() ? 2 : 1, + 1); +#line 5160 + _ASSERT(GetMainView() != NULL); + GetMainView()->CenterOnRect(&outRect); + isFound = true; + break; + + default: { + int theFloor = GetFloorInfo()->UnitToFloor(inPeople->GetCurPosition().y); + T2Tenant *theTenant = GetFloorInfo()->GetTenant(inPeople->GetCurTenantID()); + CString numStr; + + T2Name *theName = mNameDB->Search(inPeople); + if (theName) { + unsigned int id; + theName->GetName(text, id); + } else { + inPeople->GetName(text); + } + + // "は今、" - is now + text += "\x82\xCD\x8D\xA1\x81\x41"; + + UT2Utils::GetRoomNumberString(theFloor, numStr); + text += numStr; + + // "階フロアを移動中です" - moving between floors + text += "\x8A\x4B\x83\x74\x83\x8D\x83\x41\x82\xF0\x88\xDA\x93\xAE\x92\x86\x82\xC5\x82\xB7"; + + isFail = true; + } + } + + if (isFail) { + T2WorldDef *theWorldDef = GetWorldDef(); + T2StewardDialog *theStewardDialog = new T2StewardDialog(this, theWorldDef->mModuleHandle, text, 0); + } + + return isFound; +} + +void T2TowerDoc::x429A9A(BOOL inPause) { + T2CtrlPalette *theCtrlPalette = T2_APP->mMainWindow->mCtrlPalette; + if (!theCtrlPalette) + return; + + T2MWControl *thePauseButton = theCtrlPalette->mPauseControl; + if (!thePauseButton) + return; + + if (inPause) + thePauseButton->SetData(100); + else + thePauseButton->SetData(0); +} + +void T2TowerDoc::x429B01(BOOL inPause) { + T2MainWindow *theMainWindow = T2_MAIN_WINDOW; + if (!theMainWindow) + return; + + CMenu *theMainMenu = theMainWindow->GetMenu(); + if (!theMainMenu) + return; + + if (inPause) { + // "再生" - play + theMainMenu->ModifyMenu(0x8019, 0, 0x8019, "\x8D\xC4\x90\xB6"); + } else { + // "一時停止" - pause + theMainMenu->ModifyMenu(0x8019, 0, 0x8019, "\x88\xEA\x8E\x9E\x92\xE2\x8E\x7E"); + } +} + +/*virtual*/ void T2TowerDoc::SetInfoBarText(const char *inText) { + T2MainWindow *theMainWindow = T2_MAIN_WINDOW; + if (theMainWindow) { + T2MsgWindow *theMsgWindow = theMainWindow->mMsgWindow; + if (theMsgWindow) { + theMsgWindow->GetDlgItem(1004)->SetWindowText(inText); + theMsgWindow->GetDlgItem(1004)->InvalidateRect(NULL); + } + } +} + +/*virtual*/ BOOL T2TowerDoc::IsColdFlagOn() const { + BOOL isFlagOn = false; + + if (mColdDenomi > 0) + isFlagOn = (UT2Utils::Randomize(mColdDenomi) == 0); + + return isFlagOn; +} |