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>
383 lines
10 KiB
C++
383 lines
10 KiB
C++
#include "rpl4.h"
|
|
#pragma hdrstop
|
|
|
|
#include "rpl4app.h"
|
|
#include "rpl4vid.h"
|
|
#include "rpl4arnd.h"
|
|
#include "rpl4grnd.h"
|
|
#include "rpl4mssn.h"
|
|
#include "..\munga_l4\l4gauge.h"
|
|
#include "..\rp\rpreg.h"
|
|
#include "..\munga_l4\l4ctrl.h"
|
|
#include "..\munga_l4\l4mppr.h"
|
|
#include "..\munga\appmgr.h"
|
|
#include "rpl4mode.h"
|
|
#include "..\rp\vtv.h"
|
|
#include "rpl4mppr.h"
|
|
#include "..\rp\rpplayer.h"
|
|
|
|
//
|
|
//#############################################################################
|
|
// RPL4Application
|
|
//#############################################################################
|
|
//
|
|
RPL4Application::RPL4Application(
|
|
HINSTANCE hInstance,
|
|
HWND hWnd,
|
|
ResourceFile *resource_file,
|
|
ClassID class_ID,
|
|
SharedData &shared_data
|
|
):
|
|
L4Application(hInstance, hWnd, resource_file, RPL4, class_ID, shared_data)
|
|
{
|
|
Check_Fpu();
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// ~RPL4Application
|
|
//#############################################################################
|
|
//
|
|
RPL4Application::~RPL4Application()
|
|
{
|
|
Check_Fpu();
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// MakeRegistry
|
|
//#############################################################################
|
|
//
|
|
Registry*
|
|
RPL4Application::MakeRegistry()
|
|
{
|
|
Check_Fpu();
|
|
return new RPRegistry(GetResourceFile());
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// MakeVideoRenderer
|
|
//#############################################################################
|
|
//
|
|
VideoRenderer*
|
|
RPL4Application::MakeVideoRenderer()
|
|
{
|
|
if (divisionParameters)
|
|
{
|
|
return
|
|
new RPL4VideoRenderer(
|
|
ghWnd,
|
|
L4Application::mScreenWidth,
|
|
L4Application::mScreenHeight,
|
|
L4Application::mFullscreen,
|
|
VisualInterestType,
|
|
DefaultInterestDepth
|
|
);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// MakeAudioRenderer
|
|
//#############################################################################
|
|
//
|
|
AudioRenderer*
|
|
RPL4Application::MakeAudioRenderer()
|
|
{
|
|
Check_Fpu();
|
|
// char *blaster1, *blaster2;
|
|
|
|
// blaster1 = getenv(FRONT_CARD_ENV_VAR);
|
|
// blaster2 = getenv(REAR_CARD_ENV_VAR);
|
|
|
|
//if (blaster1 != NULL && blaster2 != NULL)
|
|
//{
|
|
return new RPL4AudioRenderer(
|
|
1000.0f,
|
|
GetMissionReviewMode()
|
|
);
|
|
//}
|
|
// return NULL;
|
|
}
|
|
|
|
//#############################################################################
|
|
// MakeModeManager
|
|
//#############################################################################
|
|
ModeManager*
|
|
RPL4Application::MakeModeManager()
|
|
{
|
|
RPL4ModeManager
|
|
*manager = new RPL4ModeManager(RPL4ModeManager::ModeInitial);
|
|
Check(manager);
|
|
return manager;
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// MakeGaugeRenderer
|
|
//#############################################################################
|
|
//
|
|
GaugeRenderer*
|
|
RPL4Application::MakeGaugeRenderer(int *secondaryIndex, int *aux1Index, int *aux2Index)
|
|
{
|
|
char *mode_string = getenv("L4GAUGE");
|
|
if (mode_string != NULL && (secondaryIndex != NULL || aux1Index != NULL || aux2Index != NULL))
|
|
{
|
|
return new RPL4GaugeRenderer(!L4Application::mFullscreen, secondaryIndex, aux1Index, aux2Index);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// MakeMission
|
|
//#############################################################################
|
|
//
|
|
Mission*
|
|
RPL4Application::MakeMission(
|
|
NotationFile *notation_file,
|
|
ResourceFile *resources
|
|
)
|
|
{
|
|
Check(this);
|
|
Check(notation_file);
|
|
Check(resources);
|
|
|
|
Check_Fpu();
|
|
return new RPL4Mission(notation_file, resources);
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// MakeViewpointEntity
|
|
//#############################################################################
|
|
//
|
|
Entity*
|
|
RPL4Application::MakeViewpointEntity(Entity::MakeMessage *message)
|
|
{
|
|
Check(this);
|
|
|
|
// Entity
|
|
// *viewing_entity = L4Application::MakeViewpointEntity(message);
|
|
//
|
|
// if(viewing_entity)
|
|
// {
|
|
// Check_Fpu();
|
|
// return viewing_entity;
|
|
// }
|
|
|
|
LBE4ControlsManager* controls =
|
|
(LBE4ControlsManager *)GetControlsManager();
|
|
Check(controls);
|
|
|
|
Entity
|
|
*viewing_entity = NULL;
|
|
char
|
|
*primary_mapping_name = NULL;
|
|
|
|
switch(message->classToCreate)
|
|
{
|
|
case CameraShipClassID:
|
|
//=======================================================================
|
|
// Create Camera ship
|
|
//=======================================================================
|
|
{
|
|
CameraShip
|
|
*viewing_camera =
|
|
CameraShip::Make((CameraShip::MakeMessage*)message);
|
|
Check(viewing_camera);
|
|
|
|
viewing_entity = viewing_camera;
|
|
//--------------------------------------------------
|
|
// Create controls mapping object
|
|
//--------------------------------------------------
|
|
CameraControlsMapper::SubsystemResource
|
|
control_subsystem_resource;
|
|
|
|
Str_Copy(
|
|
control_subsystem_resource.subsystemName,
|
|
"ControlsMapper",
|
|
sizeof(control_subsystem_resource.subsystemName)
|
|
);
|
|
control_subsystem_resource.classID = TrivialSubsystemClassID;
|
|
control_subsystem_resource.subsystemModelSize =
|
|
sizeof(control_subsystem_resource);
|
|
|
|
CameraControlsMapper
|
|
*camera_mapper;
|
|
|
|
switch (controls->primaryControlType)
|
|
{
|
|
case LBE4ControlsManager::PrimaryThrustMaster:
|
|
Tell("RPL4Application, CameraShip using ThrustMaster\n");
|
|
camera_mapper = new CameraThrustmasterMapper(
|
|
viewing_camera,
|
|
CameraShip::ControlsMapperSubsystem,
|
|
&control_subsystem_resource
|
|
);
|
|
primary_mapping_name = "Thrustmaster";
|
|
break;
|
|
|
|
case LBE4ControlsManager::PrimaryRIO:
|
|
Tell("RPL4Application, CameraShip using RIO\n");
|
|
camera_mapper = new CameraRIOMapper(
|
|
viewing_camera,
|
|
CameraShip::ControlsMapperSubsystem,
|
|
&control_subsystem_resource
|
|
);
|
|
primary_mapping_name = "L4";
|
|
break;
|
|
|
|
default:
|
|
Tell("RPL4Application, CameraShip using default mapper\n");
|
|
camera_mapper = new CameraL4Mapper(
|
|
viewing_camera,
|
|
CameraShip::ControlsMapperSubsystem,
|
|
&control_subsystem_resource
|
|
);
|
|
// primary mapping name is NULL
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------
|
|
// Set mapping subsystem for this entity
|
|
//-------------------------------------------
|
|
Register_Object(camera_mapper);
|
|
viewing_camera->SetMappingSubsystem(camera_mapper);
|
|
}
|
|
break;
|
|
|
|
case VTVClassID:
|
|
//=======================================================================
|
|
// Create VTV
|
|
//=======================================================================
|
|
{
|
|
VTV
|
|
*viewing_VTV = VTV::Make((VTV::MakeMessage*)message);
|
|
Check(viewing_VTV);
|
|
|
|
viewing_entity = viewing_VTV;
|
|
//--------------------------------------------------
|
|
// Set control deadbanding
|
|
//--------------------------------------------------
|
|
controls->SetJoystickDeadBand(.1);
|
|
controls->SetThrottleDeadBand(.1);
|
|
controls->SetPedalsDeadBand(.1);
|
|
//--------------------------------------------------
|
|
// Create controls mapping object
|
|
//--------------------------------------------------
|
|
VTVControlsMapper::SubsystemResource
|
|
control_subsystem_resource;
|
|
Str_Copy(
|
|
control_subsystem_resource.subsystemName,
|
|
"ControlsMapper",
|
|
sizeof(control_subsystem_resource.subsystemName)
|
|
);
|
|
control_subsystem_resource.classID = TrivialSubsystemClassID;
|
|
control_subsystem_resource.subsystemModelSize =
|
|
sizeof(control_subsystem_resource);
|
|
control_subsystem_resource.segmentIndex = -1;
|
|
control_subsystem_resource.subsystemFlags = 0;
|
|
|
|
VTVControlsMapper
|
|
*vtv_mapper;
|
|
|
|
switch (controls->primaryControlType)
|
|
{
|
|
case LBE4ControlsManager::PrimaryThrustMaster:
|
|
Tell("RPL4Application, VTV using ThrustMaster\n");
|
|
vtv_mapper = new VTVThrustmasterMapper(
|
|
viewing_VTV,
|
|
VTV::ControlsMapperSubsystem,
|
|
&control_subsystem_resource
|
|
);
|
|
primary_mapping_name = "Thrustmaster";
|
|
break;
|
|
|
|
case LBE4ControlsManager::PrimaryRIO:
|
|
Tell("RPL4Application, VTV using RIO\n");
|
|
vtv_mapper = new VTVRIOMapper(
|
|
viewing_VTV,
|
|
VTV::ControlsMapperSubsystem,
|
|
&control_subsystem_resource
|
|
);
|
|
primary_mapping_name = "L4";
|
|
break;
|
|
|
|
default:
|
|
DEBUG_STREAM << "*****VTV has no controls mapping!*****" << std::flush;
|
|
Fail("RPL4Application::MakeViewpointEntity");
|
|
vtv_mapper = NULL;
|
|
// primary mapping name is NULL
|
|
break;
|
|
}
|
|
|
|
//-------------------------------------------
|
|
// Set mapping subsystem for this entity
|
|
//-------------------------------------------
|
|
Register_Object(vtv_mapper);
|
|
viewing_VTV->SetMappingSubsystem(vtv_mapper);
|
|
//-------------------------------------------
|
|
// Enable collision detection for this entity
|
|
//-------------------------------------------
|
|
viewing_VTV->StartCollisionAssistant();
|
|
}
|
|
break;
|
|
}
|
|
Check(viewing_entity);
|
|
|
|
//------------------------------------------------------------------------
|
|
// Load up the control mapping stream for the entity
|
|
//------------------------------------------------------------------------
|
|
if (primary_mapping_name != NULL)
|
|
{
|
|
ResourceDescription
|
|
*resource_description =
|
|
application->GetResourceFile()->SearchList(
|
|
viewing_entity->GetResourceID(),
|
|
ResourceDescription::ControlMappingsListResourceType
|
|
);
|
|
|
|
if (resource_description != NULL)
|
|
{
|
|
Check(resource_description);
|
|
|
|
Check(GetResourceFile());
|
|
resource_description =
|
|
GetResourceFile()->SearchList(
|
|
resource_description->resourceID,
|
|
primary_mapping_name
|
|
);
|
|
|
|
if (resource_description != NULL)
|
|
{
|
|
Check(resource_description);
|
|
|
|
resource_description->Lock();
|
|
controls->CreateStreamedMappings(
|
|
viewing_entity,
|
|
(int*)resource_description->resourceAddress
|
|
);
|
|
resource_description->Unlock();
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
// Create gauges for this entity
|
|
//------------------------------------------------------------------------
|
|
RPL4GaugeRenderer
|
|
*gauge_renderer = (RPL4GaugeRenderer *) GetGaugeRenderer();
|
|
|
|
if (gauge_renderer != NULL)
|
|
{
|
|
Check(gauge_renderer);
|
|
gauge_renderer->ConfigureForModel("Init", viewing_entity);
|
|
}
|
|
|
|
Check_Fpu();
|
|
return viewing_entity;
|
|
}
|