GliderPRO/Sources/Tools.c
John Calhoun 7a70d18ba6 First check-in.
Sources for Glider PRO, a Macintosh game written by John Calhoun and
published by Casady & Greene, Inc. I believe it was using CodeWarrior
IDE to create a fat (68K and PowerPC) binary.
2016-01-28 08:10:38 -08:00

1 line
11 KiB
C
Executable File

//============================================================================
//----------------------------------------------------------------------------
// Tools.c
//----------------------------------------------------------------------------
//============================================================================
#include <TextUtils.h>
#include "Externs.h"
#include "Environ.h"
#include "RectUtils.h"
#include "Utilities.h"
#define kToolsHigh 4
#define kToolsWide 4
#define kTotalTools 16 // kToolsHigh * kToolsWide
#define kPopUpControl 129
#define kFirstBlower 1
#define kLastBlower 15
#define kBlowerBase 1
#define kFirstFurniture 1
#define kLastFurniture 15
#define kFurnitureBase 21
#define kFirstBonus 1
#define kLastBonus 15
#define kBonusBase 41
#define kFirstTransport 1
#define kLastTransport 12
#define kTransportBase 61
#define kFirstSwitch 1
#define kLastSwitch 9
#define kSwitchBase 81
#define kFirstLight 1
#define kLastLight 8
#define kLightBase 101
#define kFirstAppliance 1
#define kLastAppliance 14
#define kApplianceBase 121
#define kFirstEnemy 1
#define kLastEnemy 9
#define kEnemyBase 141
#define kFirstClutter 1
#define kLastClutter 15
#define kClutterBase 161
#define kToolsPictID 1011
void CreateToolsOffscreen (void);
void KillToolsOffscreen (void);
void FrameSelectedTool (void);
void DrawToolName (void);
void DrawToolTiles (void);
void SwitchToolModes (short);
Rect toolsWindowRect, toolSrcRect, toolTextRect;
Rect toolRects[kTotalTools];
ControlHandle classPopUp;
GWorldPtr toolSrcMap;
WindowPtr toolsWindow;
short isToolsH, isToolsV;
short toolSelected, toolMode;
short firstTool, lastTool, objectBase;
Boolean isToolsOpen;
//============================================================== Functions
//-------------------------------------------------------------- CreateToolsOffscreen
#ifndef COMPILEDEMO
void CreateToolsOffscreen (void)
{
CGrafPtr wasCPort;
GDHandle wasWorld;
OSErr theErr;
if (toolSrcMap == nil)
{
GetGWorld(&wasCPort, &wasWorld);
QSetRect(&toolSrcRect, 0, 0, 360, 216);
theErr = CreateOffScreenGWorld(&toolSrcMap, &toolSrcRect, kPreferredDepth);
SetGWorld(toolSrcMap, nil);
LoadGraphic(kToolsPictID);
SetGWorld(wasCPort, wasWorld);
}
}
#endif
//-------------------------------------------------------------- KillToolsOffscreen
#ifndef COMPILEDEMO
void KillToolsOffscreen (void)
{
if (toolSrcMap != nil)
{
DisposeGWorld(toolSrcMap);
// KillOffScreenPixMap(toolSrcMap);
toolSrcMap = nil;
}
}
#endif
//-------------------------------------------------------------- FrameSelectedTool
#ifndef COMPILEDEMO
void FrameSelectedTool (void)
{
Rect theRect;
short toolIcon;
toolIcon = toolSelected;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon--;
}
else if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 15)
toolIcon -= 4;
else
toolIcon = ((toolIcon - 7) / 2) + 7;
}
theRect = toolRects[toolIcon];
PenSize(2, 2);
ForeColor(redColor);
FrameRect(&theRect);
PenNormal();
ForeColor(blackColor);
}
#endif
//-------------------------------------------------------------- DrawToolName
#ifndef COMPILEDEMO
void DrawToolName (void)
{
Str255 theString;
if (toolSelected == 0)
PasStringCopy("\pSelection Tool", theString);
else
GetIndString(theString, kObjectNameStrings,
toolSelected + ((toolMode - 1) * 0x0010));
EraseRect(&toolTextRect);
MoveTo(toolTextRect.left + 3, toolTextRect.bottom - 6);
TextFont(applFont);
TextSize(9);
TextFace(bold);
ColorText(theString, 171L);
}
#endif
//-------------------------------------------------------------- DrawToolTiles
#ifndef COMPILEDEMO
void DrawToolTiles (void)
{
Rect srcRect, destRect;
short i;
DrawCIcon(2000, toolRects[0].left, toolRects[0].top); // Selection Tool
for (i = 0; i < 15; i++) // Other tools
{
QSetRect(&srcRect, 0, 0, 24, 24);
QSetRect(&destRect, 0, 0, 24, 24);
QOffsetRect(&srcRect, i * 24, (toolMode - 1) * 24);
QOffsetRect(&destRect, toolRects[i + 1].left + 2, toolRects[i + 1].top + 2);
CopyBits((BitMap *)*GetGWorldPixMap(toolSrcMap),
GetPortBitMapForCopyBits(GetWindowPort(toolsWindow)),
&srcRect, &destRect, srcCopy, nil);
}
}
#endif
//-------------------------------------------------------------- EraseSelectedTool
void EraseSelectedTool (void)
{
#ifndef COMPILEDEMO
Rect theRect;
short toolIcon;
if (toolsWindow == nil)
return;
SetPort((GrafPtr)toolsWindow);
toolIcon = toolSelected;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon--;
}
else if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 15)
toolIcon -= 4;
else
toolIcon = ((toolIcon - 7) / 2) + 7;
}
theRect = toolRects[toolIcon];
PenSize(2, 2);
ForeColor(whiteColor);
FrameRect(&theRect);
#endif
}
//-------------------------------------------------------------- SelectTool
void SelectTool (short which)
{
#ifndef COMPILEDEMO
Rect theRect;
short toolIcon;
if (toolsWindow == nil)
return;
SetPort((GrafPtr)toolsWindow);
toolIcon = which;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon--;
}
else if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 15)
toolIcon -= 4;
else
toolIcon = ((toolIcon - 7) / 2) + 7;
}
theRect = toolRects[toolIcon];
ForeColor(redColor);
FrameRect(&theRect);
PenNormal();
ForeColor(blackColor);
toolSelected = which;
DrawToolName();
#endif
}
//-------------------------------------------------------------- UpdateToolsWindow
void UpdateToolsWindow (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
return;
SetPortWindowPort(toolsWindow);
DrawControls(toolsWindow);
DkGrayForeColor();
MoveTo(4, 25);
Line(108, 0);
ForeColor(blackColor);
DrawToolTiles();
FrameSelectedTool();
DrawToolName();
#endif
}
//-------------------------------------------------------------- OpenToolsWindow
void OpenToolsWindow (void)
{
#ifndef COMPILEDEMO
Rect src, dest;
Point globalMouse;
short h, v;
if (toolsWindow == nil)
{
QSetRect(&toolsWindowRect, 0, 0, 116, 152); // 143
QSetRect(&toolTextRect, 0, 0, 116, 12);
InsetRect(&toolTextRect, -1, -1);
QOffsetRect(&toolTextRect, 0, 157 - 15);
if (thisMac.hasColor)
toolsWindow = NewCWindow(nil, &toolsWindowRect,
"\pTools", false, kWindoidWDEF, kPutInFront, true, 0L);
else
toolsWindow = NewWindow(nil, &toolsWindowRect,
"\pTools", false, kWindoidWDEF, kPutInFront, true, 0L);
if (toolsWindow == nil)
RedAlert(kErrNoMemory);
// if (OptionKeyDown())
// {
// isToolsH = qd.screenBits.bounds.right - 120;
// isToolsV = 35;
// }
MoveWindow(toolsWindow, isToolsH, isToolsV, true);
globalMouse = MyGetGlobalMouse();
QSetRect(&src, 0, 0, 1, 1);
QOffsetRect(&src, globalMouse.h, globalMouse.v);
GetWindowRect(toolsWindow, &dest);
BringToFront(toolsWindow);
ShowHide(toolsWindow, true);
// FlagWindowFloating(toolsWindow); TEMP - use flaoting windows
HiliteAllWindows();
classPopUp = GetNewControl(kPopUpControl, toolsWindow);
if (classPopUp == nil)
RedAlert(kErrFailedResourceLoad);
SetControlValue(classPopUp, toolMode);
for (v = 0; v < kToolsHigh; v++)
for (h = 0; h < kToolsWide; h++)
{
QSetRect(&toolRects[(v * kToolsWide) + h], 2, 29, 30, 57);
QOffsetRect(&toolRects[(v * kToolsWide) + h], h * 28, v * 28);
}
CreateToolsOffscreen();
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
}
UpdateToolsCheckmark(true);
#endif
}
//-------------------------------------------------------------- CloseToolsWindow
void CloseToolsWindow (void)
{
#ifndef COMPILEDEMO
CloseThisWindow(&toolsWindow);
KillToolsOffscreen();
UpdateToolsCheckmark(false);
#endif
}
//-------------------------------------------------------------- ToggleToolsWindow
void ToggleToolsWindow (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
{
OpenToolsWindow();
isToolsOpen = true;
}
else
{
CloseToolsWindow();
isToolsOpen = true;
}
#endif
}
//-------------------------------------------------------------- SwitchToolModes
#ifndef COMPILEDEMO
void SwitchToolModes (short newMode)
{
if (toolsWindow == nil)
return;
SelectTool(kSelectTool);
switch (newMode)
{
case kBlowerMode:
firstTool = kFirstBlower;
lastTool = kLastBlower;
objectBase = kBlowerBase;
break;
case kFurnitureMode:
firstTool = kFirstFurniture;
lastTool = kLastFurniture;
objectBase = kFurnitureBase;
break;
case kBonusMode:
firstTool = kFirstBonus;
lastTool = kLastBonus;
objectBase = kBonusBase;
break;
case kTransportMode:
firstTool = kFirstTransport;
lastTool = kLastTransport;
objectBase = kTransportBase;
break;
case kSwitchMode:
firstTool = kFirstSwitch;
lastTool = kLastSwitch;
objectBase = kSwitchBase;
break;
case kLightMode:
firstTool = kFirstLight;
lastTool = kLastLight;
objectBase = kLightBase;
break;
case kApplianceMode:
firstTool = kFirstAppliance;
lastTool = kLastAppliance;
objectBase = kApplianceBase;
break;
case kEnemyMode:
firstTool = kFirstEnemy;
lastTool = kLastEnemy;
objectBase = kEnemyBase;
break;
case kClutterMode:
firstTool = kFirstClutter;
lastTool = kLastClutter;
objectBase = kClutterBase;
break;
}
toolMode = newMode;
InvalWindowRect(toolsWindow, &toolsWindowRect);
}
#endif
//-------------------------------------------------------------- HandleToolsClick
void HandleToolsClick (Point wherePt)
{
#ifndef COMPILEDEMO
ControlHandle theControl;
short i, part, newMode, toolIcon;
if (toolsWindow == nil)
return;
SetPortWindowPort(toolsWindow);
GlobalToLocal(&wherePt);
part = FindControl(wherePt, toolsWindow, &theControl);
if ((theControl != nil) && (part != 0))
{
part = TrackControl(theControl, wherePt, (ControlActionUPP)-1L);
if (part != 0)
{
newMode = GetControlValue(theControl);
if (newMode != toolMode)
{
EraseSelectedTool();
SwitchToolModes(newMode);
}
}
}
else
{
for (i = 0; i < kTotalTools; i++)
if ((PtInRect(wherePt, &toolRects[i])) && (i <= lastTool))
{
EraseSelectedTool();
toolIcon = i;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon++;
}
if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 11)
toolIcon += 4;
else
toolIcon = ((toolIcon - 7) * 2) + 7;
}
SelectTool(toolIcon);
break;
}
}
#endif
}
//-------------------------------------------------------------- NextToolMode
void NextToolMode (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
return;
if ((theMode == kEditMode) && (toolMode < kClutterMode))
{
EraseSelectedTool();
toolMode++;
SetControlValue(classPopUp, toolMode);
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
}
#endif
}
//-------------------------------------------------------------- PrevToolMode
void PrevToolMode (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
return;
if ((theMode == kEditMode) && (toolMode > kBlowerMode))
{
EraseSelectedTool();
toolMode--;
SetControlValue(classPopUp, toolMode);
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
}
#endif
}
//-------------------------------------------------------------- SetSpecificToolMode
void SetSpecificToolMode (short modeToSet)
{
#ifndef COMPILEDEMO
if ((toolsWindow == nil) || (theMode != kEditMode))
return;
EraseSelectedTool();
toolMode = modeToSet;
SetControlValue(classPopUp, toolMode);
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
#endif
}