Files
Aerofoil/GpApp/Link.cpp

402 lines
8.9 KiB
C++
Raw Permalink Normal View History

2019-11-11 00:11:59 -05:00
//============================================================================
//----------------------------------------------------------------------------
// Link.c
//----------------------------------------------------------------------------
//============================================================================
#include "PLControlDefinitions.h"
#include "PLPasStr.h"
#include "Externs.h"
#include "Environ.h"
#include "ObjectEdit.h"
#include "RectUtils.h"
2020-01-05 02:33:03 -05:00
#include "PLButtonWidget.h"
#include "PLWidgets.h"
#include "WindowDef.h"
2020-01-05 02:33:03 -05:00
#include "WindowManager.h"
2019-11-11 00:11:59 -05:00
#define kLinkControlID 130
#define kUnlinkControlID 131
void DoLink (void);
void DoUnlink (void);
Rect linkWindowRect;
2020-01-05 02:33:03 -05:00
PortabilityLayer::Widget *linkControl, *unlinkControl;
2019-11-11 00:11:59 -05:00
WindowPtr linkWindow;
short isLinkH, isLinkV, linkRoom, linkType;
Byte linkObject;
Boolean isLinkOpen, linkerIsSwitch;
//============================================================== Functions
//-------------------------------------------------------------- MergeFloorSuite
short MergeFloorSuite (short floor, short suite)
{
return ((suite * 100) + floor);
}
//-------------------------------------------------------------- ExtractFloorSuite
2021-04-25 22:08:15 -04:00
void ExtractFloorSuite (const houseType *house, SInt16 combo, SInt16 *floor, SInt16 *suite)
2019-11-11 00:11:59 -05:00
{
2021-04-25 22:08:15 -04:00
if (house->version < 0x0200) // old floor/suite combo
2019-11-11 00:11:59 -05:00
{
*floor = (combo / 100) - kNumUndergroundFloors;
*suite = combo % 100;
}
else
{
*suite = combo / 100;
*floor = (combo % 100) - kNumUndergroundFloors;
}
}
//-------------------------------------------------------------- UpdateLinkControl
void UpdateLinkControl (void)
{
#ifndef COMPILEDEMO
if (linkWindow == nil)
return;
switch (linkType)
{
2020-03-01 17:01:35 -05:00
case kSwitchLinkOnly:
2019-11-11 00:11:59 -05:00
if (objActive == kNoObjectSelected)
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(false);// HiliteControl(linkControl, kControlInactive);
2019-11-11 00:11:59 -05:00
else
switch (thisRoom->objects[objActive].what)
{
case kFloorVent:
case kCeilingVent:
case kFloorBlower:
case kCeilingBlower:
case kSewerGrate:
case kLeftFan:
case kRightFan:
case kInvisBlower:
case kGrecoVent:
case kSewerBlower:
case kLiftArea:
case kRedClock:
case kBlueClock:
case kYellowClock:
case kCuckoo:
case kPaper:
case kBattery:
case kBands:
case kFoil:
case kInvisBonus:
case kHelium:
case kDeluxeTrans:
case kCeilingLight:
case kLightBulb:
case kTableLamp:
case kHipLamp:
case kDecoLamp:
case kFlourescent:
case kTrackLight:
case kInvisLight:
case kShredder:
case kToaster:
case kMacPlus:
case kTV:
case kCoffee:
case kOutlet:
case kVCR:
case kStereo:
case kMicrowave:
case kBalloon:
case kCopterLf:
case kCopterRt:
case kDartLf:
case kDartRt:
case kBall:
case kDrip:
case kFish:
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(true);
2019-11-11 00:11:59 -05:00
break;
default:
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(false);
2019-11-11 00:11:59 -05:00
break;
}
break;
case kTriggerLinkOnly:
if (objActive == kNoObjectSelected)
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(false);
2019-11-11 00:11:59 -05:00
else
switch (thisRoom->objects[objActive].what)
{
case kGreaseRt:
case kGreaseLf:
case kToaster:
case kGuitar:
case kCoffee:
case kOutlet:
case kBalloon:
case kCopterLf:
case kCopterRt:
case kDartLf:
case kDartRt:
case kDrip:
case kFish:
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(true);
2019-11-11 00:11:59 -05:00
break;
case kLightSwitch:
case kMachineSwitch:
case kThermostat:
case kPowerSwitch:
case kKnifeSwitch:
case kInvisSwitch:
if (linkRoom == thisRoomNumber)
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(true);
2019-11-11 00:11:59 -05:00
break;
default:
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(false);
2019-11-11 00:11:59 -05:00
break;
}
break;
case kTransportLinkOnly:
if (objActive == kNoObjectSelected)
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(false);
2019-11-11 00:11:59 -05:00
else
switch (thisRoom->objects[objActive].what)
{
case kMailboxLf:
case kMailboxRt:
case kCeilingTrans:
case kInvisTrans:
case kDeluxeTrans:
case kInvisLight:
case kOzma:
case kMirror:
case kFireplace:
case kWallWindow:
case kCalendar:
case kBulletin:
case kCloud:
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(true);
2019-11-11 00:11:59 -05:00
break;
default:
2020-03-01 17:01:35 -05:00
linkControl->SetEnabled(false);
2019-11-11 00:11:59 -05:00
break;
}
break;
}
#endif
}
//-------------------------------------------------------------- UpdateLinkWindow
void UpdateLinkWindow (void)
{
#ifndef COMPILEDEMO
if (linkWindow == nil)
return;
UpdateLinkControl();
#endif
}
//-------------------------------------------------------------- OpenLinkWindow
void OpenLinkWindow (void)
{
#ifndef COMPILEDEMO
Rect src, dest;
Point globalMouse;
2020-03-01 17:01:35 -05:00
PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance();
2019-11-11 00:11:59 -05:00
if (linkWindow == nil)
{
2020-02-23 20:21:04 -05:00
const uint16_t windowStyle = PortabilityLayer::WindowStyleFlags::kTitleBar | PortabilityLayer::WindowStyleFlags::kMiniBar | PortabilityLayer::WindowStyleFlags::kCloseBox;
2019-11-11 00:11:59 -05:00
QSetRect(&linkWindowRect, 0, 0, 129, 30);
2020-03-01 17:01:35 -05:00
{
PortabilityLayer::WindowDef wdef = PortabilityLayer::WindowDef::Create(linkWindowRect, windowStyle, true, 0, 0, PSTR("Link"));
linkWindow = wm->CreateWindow(wdef);
}
2019-11-11 00:11:59 -05:00
2020-03-01 17:01:35 -05:00
wm->PutWindowBehind(linkWindow, wm->GetPutInFrontSentinel());
2019-11-11 00:11:59 -05:00
MoveWindow(linkWindow, isLinkH, isLinkV, true);
2020-01-05 02:33:03 -05:00
2019-11-11 00:11:59 -05:00
GetWindowRect(linkWindow, &dest);
2020-01-05 02:33:03 -05:00
PortabilityLayer::WindowManager::GetInstance()->ShowWindow(linkWindow);
2019-11-11 00:11:59 -05:00
// FlagWindowFloating(linkWindow); TEMP - use flaoting windows
2020-01-05 02:33:03 -05:00
PortabilityLayer::WidgetBasicState basicState;
basicState.m_rect = Rect::Create(5, 70, 25, 124);
basicState.m_text.Set(4, "Link");
basicState.m_window = linkWindow;
2020-05-27 18:06:22 -04:00
PortabilityLayer::ButtonWidget::AdditionalData addlData;
linkControl = PortabilityLayer::ButtonWidget::Create(basicState, &addlData);
2020-01-05 02:33:03 -05:00
basicState.m_rect = Rect::Create(5, 5, 25, 59);
basicState.m_text.Set(6, "Unlink");
basicState.m_window = linkWindow;
2020-05-27 18:06:22 -04:00
unlinkControl = PortabilityLayer::ButtonWidget::Create(basicState, &addlData);
2020-03-01 17:01:35 -05:00
linkWindow->DrawControls();
2019-11-11 00:11:59 -05:00
linkRoom = -1;
linkObject = 255;
isLinkOpen = true;
UpdateLinkWindow();
2019-11-11 00:11:59 -05:00
}
#endif
}
//-------------------------------------------------------------- CloseLinkWindow
void CloseLinkWindow (void)
{
#ifndef COMPILEDEMO
if (linkWindow != nil)
2020-03-01 17:01:35 -05:00
PortabilityLayer::WindowManager::GetInstance()->DestroyWindow(linkWindow);
2019-11-11 00:11:59 -05:00
linkWindow = nil;
isLinkOpen = false;
#endif
}
//-------------------------------------------------------------- DoLink
#ifndef COMPILEDEMO
void DoLink (void)
{
short floor, suite;
char wasState;
if (GetRoomFloorSuite(thisRoomNumber, &floor, &suite))
{
floor += kNumUndergroundFloors;
if (thisRoomNumber == linkRoom)
{
if (linkerIsSwitch)
{
thisRoom->objects[linkObject].data.e.where =
MergeFloorSuite(floor, suite);
thisRoom->objects[linkObject].data.e.who =
objActive;
}
else
{
thisRoom->objects[linkObject].data.d.where =
MergeFloorSuite(floor, suite);
thisRoom->objects[linkObject].data.d.who =
objActive;
}
}
else
{
if (linkerIsSwitch)
{
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.e.where =
MergeFloorSuite(floor, suite);
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.e.who =
objActive;
}
else // linker is transport
{
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.d.where =
MergeFloorSuite(floor, suite);
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.d.who =
objActive;
}
}
fileDirty = true;
UpdateMenus(false);
CloseLinkWindow();
}
}
#endif
//-------------------------------------------------------------- DoUnlink
#ifndef COMPILEDEMO
void DoUnlink (void)
{
char wasState;
if (thisRoomNumber == linkRoom)
{
if (linkerIsSwitch)
{
thisRoom->objects[linkObject].data.e.where = -1;
thisRoom->objects[linkObject].data.e.who = 255;
}
else
{
thisRoom->objects[linkObject].data.d.where = -1;
thisRoom->objects[linkObject].data.d.who = 255;
}
}
else
{
if (linkerIsSwitch)
{
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.e.where = -1;
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.e.who = 255;
}
else
{
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.d.where = -1;
(*thisHouse)->rooms[linkRoom].objects[linkObject].data.d.who = 255;
}
}
fileDirty = true;
UpdateMenus(false);
CloseLinkWindow();
}
#endif
//-------------------------------------------------------------- HandleLinkClick
void HandleLinkClick (Point wherePt)
{
#ifndef COMPILEDEMO
2020-01-05 02:33:03 -05:00
PortabilityLayer::Widget *theControl;
2019-11-11 00:11:59 -05:00
short part;
if (linkWindow == nil)
return;
2020-05-20 17:20:50 -04:00
wherePt -= linkWindow->GetTopLeftCoord();
2019-11-11 00:11:59 -05:00
part = FindControl(wherePt, linkWindow, &theControl);
if ((theControl != nil) && (part != 0))
{
2020-09-12 22:29:57 -04:00
part = theControl->Capture(nullptr, wherePt, nullptr);
2019-11-11 00:11:59 -05:00
if (part != 0)
{
if (theControl == linkControl)
DoLink();
else if (theControl == unlinkControl)
DoUnlink();
if (thisRoomNumber == linkRoom)
CopyThisRoomToRoom();
GenerateRetroLinks();
}
}
#endif
}