Initial import of Red Planet v4.10 Win32 source

Imports the current Win32 source for the pod-racing game 'Red Planet',
built on the MUNGA engine and its L4 (Win32/DirectX) platform layer:

- MUNGA / MUNGA_L4: cross-platform engine core and Win32 backend
- RP / RP_L4: Red Planet game logic and Win32 application
- DivLoader, Setup1: asset loader and installer project
- lib, MUNGA_L4/openal, MUNGA_L4/sos: third-party audio dependencies

Removed stale Subversion metadata and added .gitignore/.gitattributes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-06-30 07:59:51 -05:00
co-authored by Claude Opus 4.8
commit 4abbf8879f
551 changed files with 254956 additions and 0 deletions
+623
View File
@@ -0,0 +1,623 @@
#include "munga.h"
#pragma hdrstop
#include "mission.h"
#include "namelist.h"
#include "notation.h"
#include "graph2d.h"
//#############################################################################
//####################### MissionHostData ###############################
//#############################################################################
MissionHostData::MissionHostData(
const CString &address_string,
HostType host_type
):
addressString(address_string),
hostType(host_type)
{
}
MissionHostData::~MissionHostData()
{
}
//#############################################################################
//########################### Mission ###################################
//#############################################################################
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Mission::LoadOrdinalBitmaps(NotationFile *notation_file)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Load ordinal bitmaps from egg
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Check(notation_file);
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Make an entrylist of all the bitmap names
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
NameList *ord_namelist = notation_file->MakeEntryList("ordinals", "bitmap");
if (!ord_namelist)
{
Warn("No Ordinal Bitmaps in Egg \n");
return;
}
Register_Object(ord_namelist);
NameList::Entry *ord_entry = ord_namelist->GetFirstEntry();
BitMap *new_bitmap;
int index(0);
while(ord_entry)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~
// Get the bitmap pageName
//~~~~~~~~~~~~~~~~~~~~~~~~
//
++index;
CString ord_bitmap_name = ord_entry->GetChar();
new_bitmap = new BitMap(notation_file, ord_bitmap_name);
Register_Object(new_bitmap);
ordinalBitmapChain.AddValue(new_bitmap, index);
//
//~~~~~~~~~~~~~~~~~~~~
// Increment the index
//~~~~~~~~~~~~~~~~~~~~
//
ord_entry = ord_entry->GetNextEntry();
}
Unregister_Object(ord_namelist);
delete ord_namelist;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Mission::LoadTeamBitmaps(NotationFile *notation_file)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Load team bitmaps from egg
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Check(notation_file);
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Make an entrylist of all the team names
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
NameList *team_namelist = notation_file->MakeEntryList("teams", "team");
if (!team_namelist)
{
return;
}
Register_Object(team_namelist);
NameList::Entry *team_entry = team_namelist->GetFirstEntry();
BitMap *new_bitmap;
int index(0);
while(team_entry)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~
// Get the team pageName
//~~~~~~~~~~~~~~~~~~~~~~~~
//
CString team_name = team_entry->GetChar();
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get the Team Bitmap Page Name
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
const char *team_bitmap_name;
notation_file->GetEntry(
team_name,
"bitmap",
&team_bitmap_name
);
//
//~~~~~~~~~~~~~~~~~~
// Create the bitMap
//~~~~~~~~~~~~~~~~~~
//
new_bitmap = new BitMap(notation_file, team_bitmap_name);
Register_Object(new_bitmap);
teamBitmapChain.AddValue(new_bitmap, index);
//
//~~~~~~~~~~~~~~~~~~~~
// Increment the index
//~~~~~~~~~~~~~~~~~~~~
//
++index;
team_entry = team_entry->GetNextEntry();
}
Unregister_Object(team_namelist);
delete team_namelist;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Mission::LoadNameBitmaps(NotationFile *notation_file)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Load name bitmaps from egg
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Check(notation_file);
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Make an entrylist of all the large bitmap names
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
NameList *large_namelist = notation_file->MakeEntryList("largebitmap", "bitmap");
if (!large_namelist)
{
Warn("No Large NameBitmaps in Egg \n");
return;
}
Register_Object(large_namelist);
NameList::Entry *large_entry = large_namelist->GetFirstEntry();
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Make an entrylist of all the small bitmap names
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
NameList *small_namelist = notation_file->MakeEntryList("smallbitmap", "bitmap");
if (!small_namelist)
{
Warn("No Small NameBitmaps in Egg \n");
return;
}
Register_Object(small_namelist);
NameList::Entry *small_entry = small_namelist->GetFirstEntry();
BitMap *new_bitmap;
CString large_bitmap_name, small_bitmap_name;
int index(0);
while(large_entry && small_entry)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Create the large Name bitmap
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
++index;
large_bitmap_name = large_entry->GetChar();
new_bitmap = new BitMap(notation_file, large_bitmap_name);
Register_Object(new_bitmap);
largeNameBitmapChain.AddValue(new_bitmap, index);
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Create the small Name bitmap
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
small_bitmap_name = small_entry->GetChar();
new_bitmap = new BitMap(notation_file, small_bitmap_name);
Register_Object(new_bitmap);
smallNameBitmapChain.AddValue(new_bitmap, index);
small_entry = small_entry->GetNextEntry();
large_entry = large_entry->GetNextEntry();
}
Unregister_Object(large_namelist);
delete large_namelist;
Unregister_Object(small_namelist);
delete small_namelist;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Mission::LoadLandmarkBitmaps(NotationFile *notation_file)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Load Landmark bitmaps from egg
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Check(notation_file);
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Make an entrylist of all the landmark names
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
NameList *landmark_namelist = notation_file->MakeEntryList("landmarks", "landmark");
if (!landmark_namelist)
{
return;
}
Register_Object(landmark_namelist);
NameList::Entry *landmark_entry = landmark_namelist->GetFirstEntry();
BitMap *new_bitmap;
int index(0);
while(landmark_entry)
{
//
//~~~~~~~~~~~~~~~~~~~~~~~~
// Get the landmark pageName
//~~~~~~~~~~~~~~~~~~~~~~~~
//
CString landmark_name = landmark_entry->GetChar();
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get the landmark Bitmap Page Name
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
const char *landmark_bitmap_name;
notation_file->GetEntry(
landmark_name,
"bitmap",
&landmark_bitmap_name
);
//
//~~~~~~~~~~~~~~~~~~
// Create the bitMap
//~~~~~~~~~~~~~~~~~~
//
new_bitmap = new BitMap(notation_file, landmark_bitmap_name);
Register_Object(new_bitmap);
landmarkBitmapChain.AddValue(new_bitmap, index);
//
//~~~~~~~~~~~~~~~~~~~~
// Increment the index
//~~~~~~~~~~~~~~~~~~~~
//
++index;
landmark_entry = landmark_entry->GetNextEntry();
}
Unregister_Object(landmark_namelist);
delete landmark_namelist;
}
//
//#############################################################################
//#############################################################################
//
Mission::Mission(
NotationFile *notation_file,
ResourceFile *resources
):
missionHostSocket(NULL),
largeNameBitmapChain(NULL, True),
smallNameBitmapChain(NULL, True),
ordinalBitmapChain(NULL, True),
teamBitmapChain(NULL, True),
landmarkBitmapChain(NULL, True),
scenarioRoleChain(NULL, True)
{
Check(notation_file);
Check(resources);
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// NULL out All allocated variables
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
colorName = NULL;
badgeName = NULL;
dropZoneName = NULL;
gameModel = NULL;
missionTime = NULL;
missionWeather = NULL;
scenarioName = NULL;
positionName = NULL;
//
//-----------------
// Get the map name
//-----------------
//
Logical ret;
const char *map_name;
ret = notation_file->GetEntry("mission", "map", &map_name);
if (!ret)
{
DEBUG_STREAM << "ERROR: no map in egg!\n" << std::flush;
PostQuitMessage(AbortExitCodeID);
}
//
//-----------------------
// Get the mission length
//-----------------------
//
gameLength = 0.0;
notation_file->GetEntry("mission", "length", &gameLength);
//
//------------------------
// Get the map resource id
//------------------------
//
ResourceDescription *map =
resources->FindResourceDescription(
map_name,
ResourceDescription::MakeMessageStreamResourceType
);
if (!map)
{
DEBUG_STREAM << "ERROR: Couldn't find map in resource file!\n" << std::flush;
PostQuitMessage(AbortExitCodeID);
}
Check(map);
mapID = map->resourceID;
//
//----------------------------------
// Get the existance map resource id
//----------------------------------
//
map =
resources->FindResourceDescription(
map_name,
ResourceDescription::ExistanceBoxStreamResourceType
);
if (!map)
{
DEBUG_STREAM << "ERROR: Couldn't find existance map in resource file!\n" << std::flush;
PostQuitMessage(AbortExitCodeID);
}
Check(map);
existanceMapID = map->resourceID;
//
//---------------------------------------------
// Get the mission time, weather, and scenario
//--------------------------------------------
//
const char *mission_time;
const char *mission_weather;
const char *mission_scenario;
ret = notation_file->GetEntry("mission", "time", &mission_time);
if (!ret)
{
DEBUG_STREAM << "ERROR: no time in egg!\n" << std::flush;
PostQuitMessage(AbortExitCodeID);
}
ret = notation_file->GetEntry("mission", "weather", &mission_weather);
if (!ret)
{
DEBUG_STREAM << "ERROR: no weather in egg!\n" << std::flush;
PostQuitMessage(AbortExitCodeID);
}
ret = notation_file->GetEntry("mission", "scenario", &mission_scenario);
if (!ret)
{
DEBUG_STREAM << "ERROR: no scenario in egg!\n" << std::flush;
PostQuitMessage(AbortExitCodeID);
}
int length;
length = strlen(mission_time) + 1;
missionTime = new char[length];
Register_Pointer(missionTime); // safer to register BEFORE using
Str_Copy(missionTime, mission_time, length);
length = strlen(mission_weather) + 1;
missionWeather = new char[length];
Register_Pointer(missionWeather); // safer to register BEFORE using
Str_Copy(missionWeather, mission_weather, length);
length = strlen(mission_scenario) + 1;
scenarioName = new char[length];
Register_Pointer(scenarioName); // safer to register BEFORE using
Str_Copy(scenarioName, mission_scenario, length);
//
//--------------------------
// Get the mission host data
//--------------------------
//
NameList *entry_list;
NameList::Entry *entry;
playerCount = 0;
entry_list = notation_file->MakeEntryList("pilots", "pilot");
Register_Object(entry_list);
entry = entry_list->GetFirstEntry();
while (entry != NULL)
{
Check(entry);
//
// Get the host address character string
//
char *host_address_pointer = entry->GetChar();
Check_Pointer(host_address_pointer);
//
// Create the host address string
//
CString host_address_string(host_address_pointer);
Check(&host_address_string);
//
// Get the host type
//
int host_type;
ret = notation_file->GetEntry(
host_address_pointer,
"hostType",
&host_type
);
if (!ret)
{
DEBUG_STREAM << "ERROR: no host type in egg!\n" << std::flush;
PostQuitMessage(AbortExitCodeID);
}
//
// Create the mission host data
//
MissionHostData *mission_host_data;
mission_host_data =
new MissionHostData(
host_address_string,
(HostType)host_type
);
Register_Object(mission_host_data);
//
// Add to the host socket
//
missionHostSocket.Add(mission_host_data);
++playerCount;
entry = entry->GetNextEntry();
}
#if DEBUG_LEVEL>0
SChainIteratorOf<MissionHostData*> iterator(&missionHostSocket);
Check(&iterator);
Verify(iterator.GetSize() > 0);
#endif
Unregister_Object(entry_list);
delete entry_list;
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Load all the Bitmaps from the Notation File
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
LoadOrdinalBitmaps(notation_file);
LoadNameBitmaps(notation_file);
//LoadTeamBitmaps(notation_file);
//LoadLandmarkBitmaps(notation_file);
positionName = NULL;
}
//
//#############################################################################
//#############################################################################
//
Mission::~Mission()
{
Check(this);
//
// Delete mission host data
//
SChainIteratorOf<MissionHostData*> iterator(&missionHostSocket);
Check(&iterator);
iterator.DeletePlugs();
//
// Delete the text fields
//
if (gameModel)
{
Unregister_Pointer(gameModel);
delete[] gameModel;
}
if (dropZoneName)
{
Unregister_Pointer(dropZoneName);
delete[] dropZoneName;
}
if (colorName)
{
Unregister_Pointer(colorName);
delete[] colorName;
}
if (badgeName)
{
Unregister_Pointer(badgeName);
delete[] badgeName;
}
if (positionName)
{
Unregister_Pointer(positionName);
delete[] positionName;
}
if (missionTime)
{
Unregister_Pointer(missionTime);
delete[] missionTime;
}
if (missionWeather)
{
Unregister_Pointer(missionWeather);
delete[] missionWeather;
}
if (scenarioName)
{
Unregister_Pointer(scenarioName);
delete[] scenarioName;
}
//
//~~~~~~~~~~~~~~~~~~~~~~~
// delete all the bitmaps
//~~~~~~~~~~~~~~~~~~~~~~~
//
VChainIteratorOf<BitMap*,int> small_iterator(smallNameBitmapChain);
small_iterator.DeletePlugs();
VChainIteratorOf<BitMap*,int> large_iterator(largeNameBitmapChain);
large_iterator.DeletePlugs();
VChainIteratorOf<BitMap*,int> ordinal_iterator(ordinalBitmapChain);
ordinal_iterator.DeletePlugs();
VChainIteratorOf<BitMap*,int> team_iterator(teamBitmapChain);
team_iterator.DeletePlugs();
VChainIteratorOf<BitMap*,int> landmark_iterator(landmarkBitmapChain);
landmark_iterator.DeletePlugs();
VChainIteratorOf<ScenarioRole*, CString> role_iterator(scenarioRoleChain);
role_iterator.DeletePlugs();
}
//
//#############################################################################
//#############################################################################
//
void
Mission::SetPlayerData(
NotationFile * //notation_file
)
{
}
//
//#############################################################################
//#############################################################################
//
Logical
Mission::TestInstance() const
{
Check(&missionHostSocket);
return True;
}
//#############################################################################
//###################### Mission_HostIterator ###########################
//#############################################################################
Mission_HostIterator::Mission_HostIterator(Mission *mission):
SChainIteratorOf<MissionHostData*>(&mission->missionHostSocket)
{
}
Mission_HostIterator::~Mission_HostIterator()
{
}