mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-12-14 20:19:38 +00:00
Add house export to room editor
This commit is contained in:
@@ -75,6 +75,8 @@ namespace PortabilityLayer
|
||||
#define iObjectWindow 20
|
||||
#define iCoordinateWindow 21
|
||||
|
||||
#define iExportGliderPROHouse 1
|
||||
|
||||
//-------------------------------------------------------------- Structs
|
||||
/*
|
||||
typedef short SICN[16];
|
||||
|
||||
@@ -187,6 +187,7 @@
|
||||
#define kGameMenuID 129
|
||||
#define kOptionsMenuID 130
|
||||
#define kHouseMenuID 131
|
||||
#define kExportMenuID 132
|
||||
|
||||
#define kSplashMode 0
|
||||
#define kEditMode 1
|
||||
|
||||
@@ -119,6 +119,7 @@ void GenerateRetroLinks (void);
|
||||
void DoGoToDialog (void);
|
||||
void ConvertHouseVer1To2 (void);
|
||||
void ShiftWholeHouse (SInt16);
|
||||
void ExportHouse (void);
|
||||
|
||||
void DoHouseInfo (void); // --- HouseInfo.c
|
||||
|
||||
|
||||
1283
GpApp/HouseIO.cpp
1283
GpApp/HouseIO.cpp
File diff suppressed because it is too large
Load Diff
@@ -32,7 +32,7 @@ extern WindowPtr mapWindow, toolsWindow, linkWindow;
|
||||
extern Rect boardSrcRect, localRoomsDest[];
|
||||
extern IGpCursor *handCursor, *vertCursor, *horiCursor;
|
||||
extern IGpCursor *diagCursor;
|
||||
extern MenuHandle appleMenu, gameMenu, optionsMenu, houseMenu;
|
||||
extern MenuHandle appleMenu, gameMenu, optionsMenu, houseMenu, exportMenu;
|
||||
extern long incrementModeTime;
|
||||
extern UInt32 doubleTime;
|
||||
extern short fadeInSequence[], idleMode;
|
||||
@@ -50,6 +50,8 @@ extern Boolean twoPlayerGame, paused, hasMirror, splashDrawn;
|
||||
|
||||
void InitializeMenus (void)
|
||||
{
|
||||
PortabilityLayer::MenuManager *mm = PortabilityLayer::MenuManager::GetInstance();
|
||||
|
||||
appleMenu = GetMenu(kAppleMenuID);
|
||||
if (appleMenu == nil)
|
||||
RedAlert(kErrFailedResourceLoad);
|
||||
@@ -70,12 +72,15 @@ void InitializeMenus (void)
|
||||
if (!thisMac.isTouchscreen)
|
||||
{
|
||||
menusUp = true;
|
||||
PortabilityLayer::MenuManager::GetInstance()->SetMenuVisible(true);
|
||||
mm->SetMenuVisible(true);
|
||||
}
|
||||
|
||||
houseMenu = GetMenu(kHouseMenuID);
|
||||
if (houseMenu == nil)
|
||||
RedAlert(kErrFailedResourceLoad);
|
||||
|
||||
exportMenu = mm->CreateMenu(PSTR("Export"), kExportMenuID, true, 100, 16, 0);
|
||||
mm->AppendMenuItem(exportMenu, 0, 0, 0, 0, true, false, PSTR("Export Glider PRO\xaa House..."));
|
||||
|
||||
UpdateMenus(false);
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ void UpdateMenusHouseClosed (void);
|
||||
void HeyYourPissingAHighScore (void);
|
||||
|
||||
|
||||
MenuHandle appleMenu, gameMenu, optionsMenu, houseMenu;
|
||||
MenuHandle appleMenu, gameMenu, optionsMenu, houseMenu, exportMenu;
|
||||
Boolean menusUp, resumedSavedGame;
|
||||
|
||||
|
||||
@@ -141,6 +141,11 @@ void UpdateMenusHouseOpen (void)
|
||||
EnableMenuItem(houseMenu, iSendBack);
|
||||
}
|
||||
}
|
||||
|
||||
if (houseUnlocked)
|
||||
EnableMenuItem(exportMenu, iExportGliderPROHouse);
|
||||
else
|
||||
DisableMenuItem(exportMenu, iExportGliderPROHouse);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- UpdateMenusHouseClosed
|
||||
@@ -159,6 +164,8 @@ void UpdateMenusHouseClosed (void)
|
||||
DisableMenuItem(houseMenu, iPaste);
|
||||
DisableMenuItem(houseMenu, iClear);
|
||||
DisableMenuItem(houseMenu, iDuplicate);
|
||||
|
||||
DisableMenuItem(exportMenu, iExportGliderPROHouse);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- UpdateClipboardMenus
|
||||
@@ -254,12 +261,19 @@ void UpdateMenus (Boolean newMode)
|
||||
{
|
||||
PortabilityLayer::MenuManager *mm = PortabilityLayer::MenuManager::GetInstance();
|
||||
if (theMode == kEditMode)
|
||||
{
|
||||
InsertMenu(houseMenu, 0);
|
||||
InsertMenu(exportMenu, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
THandle<Menu> houseMenu = mm->GetMenuByID(kHouseMenuID);
|
||||
if (houseMenu)
|
||||
mm->RemoveMenu(houseMenu);
|
||||
|
||||
THandle<Menu> exportMenu = mm->GetMenuByID(kExportMenuID);
|
||||
if (exportMenu)
|
||||
mm->RemoveMenu(exportMenu);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -465,6 +479,19 @@ void DoOptionsMenu (short theItem)
|
||||
//-------------------------------------------------------------- DoHouseMenu
|
||||
// Handle the user selecting an item from the House menu (only in Edit mode).
|
||||
|
||||
void DoExportMenu(short theItem)
|
||||
{
|
||||
switch (theItem)
|
||||
{
|
||||
case iExportGliderPROHouse:
|
||||
ExportHouse();
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- DoHouseMenu
|
||||
// Handle the user selecting an item from the House menu (only in Edit mode).
|
||||
|
||||
void DoHouseMenu (short theItem)
|
||||
{
|
||||
#ifndef COMPILEDEMO
|
||||
@@ -647,6 +674,10 @@ void DoMenuChoice (long menuChoice)
|
||||
case kHouseMenuID:
|
||||
DoHouseMenu(theItem);
|
||||
break;
|
||||
|
||||
case kExportMenuID:
|
||||
DoExportMenu(theItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -404,23 +404,23 @@ void TellHerNoSounds (void)
|
||||
|
||||
//-------------------------------------------------------------- ParseAndConvertSound
|
||||
|
||||
IGpAudioBuffer *ParseAndConvertSoundChecked(const THandle<void> &handle)
|
||||
bool ParseAndConvertSoundChecked(const THandle<void> &handle, void const*& outDataContents, size_t &outDataSize)
|
||||
{
|
||||
const uint8_t *dataStart = static_cast<const uint8_t*>(*handle);
|
||||
const size_t size = handle.MMBlock()->m_size;
|
||||
|
||||
if (size < sizeof(PortabilityLayer::RIFFTag))
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
PortabilityLayer::RIFFTag mainRiffTag;
|
||||
memcpy(&mainRiffTag, dataStart, sizeof(PortabilityLayer::RIFFTag));
|
||||
|
||||
if (mainRiffTag.m_tag != PortabilityLayer::WaveConstants::kRiffChunkID)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
const uint32_t riffSize = mainRiffTag.m_chunkSize;
|
||||
if (riffSize < 4 || riffSize - 4 > size - sizeof(PortabilityLayer::RIFFTag))
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
const uint8_t *riffStart = dataStart + sizeof(PortabilityLayer::RIFFTag);
|
||||
const uint8_t *riffEnd = riffStart + riffSize;
|
||||
@@ -432,7 +432,7 @@ IGpAudioBuffer *ParseAndConvertSoundChecked(const THandle<void> &handle)
|
||||
memcpy(&waveMarker, riffStart, 4);
|
||||
|
||||
if (waveMarker != PortabilityLayer::WaveConstants::kWaveChunkID)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
const uint8_t *tagSearchLoc = riffStart + 4;
|
||||
|
||||
@@ -440,7 +440,7 @@ IGpAudioBuffer *ParseAndConvertSoundChecked(const THandle<void> &handle)
|
||||
while (tagSearchLoc != riffEnd)
|
||||
{
|
||||
if (riffEnd - tagSearchLoc < sizeof(PortabilityLayer::RIFFTag))
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
PortabilityLayer::RIFFTag riffTag;
|
||||
memcpy(&riffTag, tagSearchLoc, sizeof(PortabilityLayer::RIFFTag));
|
||||
@@ -453,20 +453,20 @@ IGpAudioBuffer *ParseAndConvertSoundChecked(const THandle<void> &handle)
|
||||
const uint32_t riffTagSizeUnpadded = riffTag.m_chunkSize;
|
||||
|
||||
if (riffTagSizeUnpadded == 0xffffffffU)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
const uint32_t riffTagSizePadded = riffTagSizeUnpadded + (riffTagSizeUnpadded & 1);
|
||||
|
||||
tagSearchLoc += sizeof(PortabilityLayer::RIFFTag);
|
||||
|
||||
if (riffEnd - tagSearchLoc < riffTagSizePadded)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
tagSearchLoc += riffTagSizePadded;
|
||||
}
|
||||
|
||||
if (formatTagLoc == nullptr || dataTagLoc == nullptr)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
PortabilityLayer::RIFFTag fmtTag;
|
||||
memcpy(&fmtTag, formatTagLoc, sizeof(PortabilityLayer::RIFFTag));
|
||||
@@ -500,7 +500,7 @@ IGpAudioBuffer *ParseAndConvertSoundChecked(const THandle<void> &handle)
|
||||
copyableSize = sizeof(PortabilityLayer::WaveFormatChunkV1);
|
||||
}
|
||||
else
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
memcpy(&formatChunkV3, formatContents, copyableSize);
|
||||
|
||||
@@ -508,23 +508,22 @@ IGpAudioBuffer *ParseAndConvertSoundChecked(const THandle<void> &handle)
|
||||
const PortabilityLayer::WaveFormatChunkV1 formatChunkV1 = formatChunkV2.m_v1;
|
||||
|
||||
if (formatChunkV1.m_bitsPerSample != 8)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
if (formatChunkV1.m_formatCode != PortabilityLayer::WaveConstants::kFormatPCM ||
|
||||
formatChunkV1.m_numChannels != 1 ||
|
||||
formatChunkV1.m_blockAlignmentBytes != 1 ||
|
||||
formatChunkV1.m_bitsPerSample != 8)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
uint32_t dataSize = dataTag.m_chunkSize;
|
||||
if (dataSize > 0x1000000 || dataSize < 1)
|
||||
return nullptr;
|
||||
return false;
|
||||
|
||||
IGpAudioDriver *audioDriver = PLDrivers::GetAudioDriver();
|
||||
if (!audioDriver)
|
||||
return nullptr;
|
||||
outDataContents = dataContents;
|
||||
outDataSize = dataSize;
|
||||
|
||||
return audioDriver->CreateBuffer(dataContents, dataSize);
|
||||
return true;
|
||||
}
|
||||
|
||||
IGpAudioBuffer *ParseAndConvertSound(const THandle<void> &handle)
|
||||
@@ -532,6 +531,14 @@ IGpAudioBuffer *ParseAndConvertSound(const THandle<void> &handle)
|
||||
if (!handle)
|
||||
return nullptr;
|
||||
|
||||
IGpAudioBuffer *buffer = ParseAndConvertSoundChecked(handle);
|
||||
return buffer;
|
||||
IGpAudioDriver *audioDriver = PLDrivers::GetAudioDriver();
|
||||
if (!audioDriver)
|
||||
return nullptr;
|
||||
|
||||
const void *dataContents = nullptr;
|
||||
size_t dataSize = 0;
|
||||
if (!ParseAndConvertSoundChecked(handle, dataContents, dataSize))
|
||||
return nullptr;
|
||||
|
||||
return audioDriver->CreateBuffer(dataContents, dataSize);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user