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:
@@ -0,0 +1,306 @@
|
||||
#include "rpl4.h"
|
||||
#pragma hdrstop
|
||||
|
||||
#include "rpl4mssn.h"
|
||||
#include "..\munga_l4\l4grend.h"
|
||||
#include "..\munga_l4\l4app.h"
|
||||
#include "..\munga\notation.h"
|
||||
#include "..\munga_l4\l4host.h"
|
||||
#include "..\munga\hostmgr.h"
|
||||
#include "..\munga\namelist.h"
|
||||
|
||||
//##########################################################################
|
||||
//########################### RPL4Mission ############################
|
||||
//##########################################################################
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
RPL4Mission::RPL4Mission(
|
||||
NotationFile *notation_file,
|
||||
ResourceFile *resources
|
||||
):
|
||||
RPMission(notation_file, resources)
|
||||
{
|
||||
Check_Fpu();
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
RPL4Mission::~RPL4Mission()
|
||||
{
|
||||
Check(this);
|
||||
Check_Fpu();
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
void
|
||||
RPL4Mission::SetPlayerData(NotationFile *notation_file)
|
||||
{
|
||||
Check(this);
|
||||
//
|
||||
//--------------------------------------------------------------
|
||||
// Figure out which page we should be using to create the player
|
||||
//--------------------------------------------------------------
|
||||
//
|
||||
Check(application);
|
||||
HostManager *host_manager = application->GetHostManager();
|
||||
Check(host_manager);
|
||||
L4Host *host = (L4Host*)host_manager->GetLocalHost();
|
||||
Check(host);
|
||||
CString
|
||||
player_node = host->GetSymbolicName();
|
||||
|
||||
//
|
||||
//----------------------------------------------------------
|
||||
// Copy the game model and dropzone strings into the mission
|
||||
//----------------------------------------------------------
|
||||
//
|
||||
gameModel = NULL;
|
||||
const char* player_model = NULL;
|
||||
notation_file->GetEntry(player_node, "vehicle", &player_model);
|
||||
if (!player_model)
|
||||
{
|
||||
DEBUG_STREAM << "Error: vehicle not specified!\n" << std::flush;
|
||||
PostQuitMessage(AbortExitCodeID);
|
||||
}
|
||||
Check_Pointer(player_model);
|
||||
gameModel = strdup(player_model);
|
||||
Register_Pointer(gameModel);
|
||||
|
||||
dropZoneName = NULL;
|
||||
const char* drop_zone = NULL;
|
||||
notation_file->GetEntry(player_node, "dropzone", &drop_zone);
|
||||
if (!drop_zone)
|
||||
{
|
||||
DEBUG_STREAM << "Error: dropzone not specified!\n" << std::flush;
|
||||
PostQuitMessage(AbortExitCodeID);
|
||||
}
|
||||
Check_Pointer(drop_zone);
|
||||
dropZoneName = strdup(drop_zone);
|
||||
Register_Pointer(dropZoneName);
|
||||
|
||||
dropZoneHost = False;
|
||||
notation_file->GetEntry(player_node, "loadzones", &dropZoneHost);
|
||||
|
||||
colorName = NULL;
|
||||
const char* color_name = NULL;
|
||||
notation_file->GetEntry(player_node, "color", &color_name);
|
||||
if (!color_name)
|
||||
{
|
||||
DEBUG_STREAM << "Error: color not specified!\n" << std::flush;
|
||||
PostQuitMessage(AbortExitCodeID);
|
||||
}
|
||||
Check_Pointer(color_name);
|
||||
colorName = strdup(color_name);
|
||||
Register_Pointer(colorName);
|
||||
|
||||
badgeName = NULL;
|
||||
const char* badge_name = NULL;
|
||||
notation_file->GetEntry(player_node, "badge", &badge_name);
|
||||
if (!badge_name)
|
||||
{
|
||||
DEBUG_STREAM << "Error: badge not specified!\n" << std::flush;
|
||||
PostQuitMessage(AbortExitCodeID);
|
||||
}
|
||||
Check_Pointer(badge_name);
|
||||
badgeName = strdup(badge_name);
|
||||
Register_Pointer(badgeName);
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Get playerBitmapIndex
|
||||
//~~~~~~~~~~~~~~~~~~~~~~
|
||||
//
|
||||
if (!notation_file->GetEntry(
|
||||
player_node,
|
||||
"bitmapindex",
|
||||
&playerBitmapIndex
|
||||
)
|
||||
)
|
||||
{
|
||||
DEBUG_STREAM<<"No bitmapindex in egg"<<std::endl << std::flush;
|
||||
}
|
||||
else
|
||||
{
|
||||
//--------------------------------------------------------
|
||||
// Show the bitmap on the plasma display (if it exists)
|
||||
//--------------------------------------------------------
|
||||
//
|
||||
BitMap *bitmap = GetLargeNameBitmap(playerBitmapIndex);
|
||||
if (bitmap)
|
||||
{
|
||||
Check(application);
|
||||
L4GaugeRenderer
|
||||
*gauge_renderer=((L4Application*)application)->
|
||||
GetGaugeRenderer();
|
||||
if (gauge_renderer != NULL)
|
||||
{
|
||||
Check(gauge_renderer);
|
||||
GraphicsDisplay *graphics_display =
|
||||
gauge_renderer->GetExternalDisplay();
|
||||
|
||||
if (graphics_display != NULL)
|
||||
{
|
||||
graphics_display->DrawBitMapOpaque(
|
||||
1, // foreground color
|
||||
0, // background color
|
||||
0xFF, // bitmask
|
||||
GraphicsDisplay::Replace, // operation
|
||||
0, // rotation
|
||||
0,0, // position
|
||||
bitmap,
|
||||
0, // sx1
|
||||
0, // sy1
|
||||
bitmap->Data.Size.x-1, // sx2
|
||||
bitmap->Data.Size.y-1 // sy2
|
||||
);
|
||||
graphics_display->Update(True);
|
||||
graphics_display->WaitForUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
//----------------------------------------------------------
|
||||
// scoreCompression
|
||||
//----------------------------------------------------------
|
||||
//
|
||||
scoreCompression = False;
|
||||
const char* score_compression = NULL;
|
||||
notation_file->GetEntry("mission", "compression", &score_compression);
|
||||
if (!score_compression)
|
||||
{
|
||||
scoreCompression = False;
|
||||
}
|
||||
else if (strcmp("1", score_compression) == 0)
|
||||
{
|
||||
scoreCompression = True;
|
||||
}
|
||||
else
|
||||
{
|
||||
scoreCompression = False;
|
||||
}
|
||||
|
||||
//
|
||||
//-----------------------------------------------
|
||||
// Get the position name "General" if not listed
|
||||
//-----------------------------------------------
|
||||
//
|
||||
positionName = NULL;
|
||||
const char* position_name = NULL;
|
||||
notation_file->GetEntry(player_node, "position", &position_name);
|
||||
if(!position_name)
|
||||
{
|
||||
position_name = strdup("General");
|
||||
}
|
||||
Check_Pointer(position_name);
|
||||
positionName = strdup(position_name);
|
||||
Register_Pointer(positionName);
|
||||
//
|
||||
//---------------------------------------
|
||||
// Assign an integer value for the teamID
|
||||
//---------------------------------------
|
||||
//
|
||||
const char* team_name;
|
||||
notation_file->GetEntry(player_node, "team", &team_name);
|
||||
int team_count;
|
||||
|
||||
NameList
|
||||
*team_namelist = notation_file->MakeEntryList("teams");
|
||||
|
||||
teamID = -1;
|
||||
if (team_namelist)
|
||||
{
|
||||
Register_Object(team_namelist);
|
||||
team_count = team_namelist->EntryCount();
|
||||
if(team_count)
|
||||
{
|
||||
int current_id=0;
|
||||
NameList::Entry *team_entry = team_namelist->GetFirstEntry();
|
||||
while(team_entry)
|
||||
{
|
||||
if (strcmp(team_name, team_entry->GetChar()) == 0)
|
||||
{
|
||||
teamID = current_id;
|
||||
break;
|
||||
}
|
||||
current_id++;
|
||||
team_entry = team_entry->GetNextEntry();
|
||||
}
|
||||
}
|
||||
Unregister_Object(team_namelist);
|
||||
delete team_namelist;
|
||||
}
|
||||
Check_Fpu();
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
Logical
|
||||
RPL4Mission::TestInstance() const
|
||||
{
|
||||
RPMission::TestInstance();
|
||||
return True;
|
||||
}
|
||||
|
||||
#if 0
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
void
|
||||
RPL4Mission::CreatePlayerMessage(
|
||||
NotationFile *notation_file,
|
||||
StreamableResourceFile *resources
|
||||
)
|
||||
{
|
||||
Check(this);
|
||||
Check(notation_file);
|
||||
Check(resources);
|
||||
|
||||
Check(application);
|
||||
HostManager *host_manager = application->GetHostManager();
|
||||
Check(host_manager);
|
||||
L4Host *host = (L4Host*)host_manager->GetLocalHost();
|
||||
Check(host);
|
||||
CString player_node = host->GetSymbolicName();
|
||||
|
||||
const char* player_model = NULL;
|
||||
notation_file->GetEntry(player_node, "gamemodel", &player_model);
|
||||
Check_Pointer(player_model);
|
||||
|
||||
ResourceDescription *vtv =
|
||||
resources->FindResourceDescription(
|
||||
player_model,
|
||||
ResourceDescription::ModelListResourceType
|
||||
);
|
||||
Check(vtv);
|
||||
|
||||
VTV::MakeMessage *create_player =
|
||||
new VTV::MakeMessage(
|
||||
VTV::MakeMessageID,
|
||||
sizeof(VTV::MakeMessage),
|
||||
EntityID(host_manager->GetLocalHostID()),
|
||||
VTV::VTVClassID,
|
||||
EntityID::Null,
|
||||
vtv->resourceID,
|
||||
VTV::DefaultFlags|VTV::InitialStasisFlag,
|
||||
Origin(Point3D(0.0f, 10.0f, 0.0f), Quaternion::Identity),
|
||||
Motion::Identity,
|
||||
Motion::Identity
|
||||
);
|
||||
Register_Object(create_player);
|
||||
|
||||
AdoptCreatePlayerMessage(create_player);
|
||||
Check_Fpu();
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user