Files
CydandClaude Opus 4.8 4abbf8879f 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>
2026-06-30 07:59:51 -05:00

390 lines
8.4 KiB
C++

#include "mungal4.h"
#pragma hdrstop
#define PRELOAD_ART
#include "..\munga\vdata.h"
#include "l4lamp.h"
#include "l4wrhous.h"
// #define LOCAL_TEST
#if defined(LOCAL_TEST)
# define Test_Tell(n) cout << n
#else
# define Test_Tell(n)
#endif
//#########################################################################
//############################# L4LampManager #############################
//#########################################################################
L4LampManager::L4LampManager(LBE4ControlsManager *controls_manager):
LampManager()
{
Check(controls_manager);
controlsManager = controls_manager;
previousLampState = new int[LBE4ControlsManager::LampCount];
Register_Pointer(previousLampState);
lampActiveFlag = new Logical[LBE4ControlsManager::LampCount];
Register_Pointer(lampActiveFlag);
//-----------------------------------------
// Clear L4 lamp state tables
//-----------------------------------------
int
i;
Check_Pointer(previousLampState);
for(i=0; i< LBE4ControlsManager::LampCount; ++i)
{
previousLampState[i] = RIO::solid + RIO::state1Off + RIO::state2Off;
}
Check_Fpu();
}
L4LampManager::~L4LampManager()
{
Check(this);
Unregister_Pointer(previousLampState);
delete[] previousLampState;
previousLampState = NULL;
Unregister_Pointer(lampActiveFlag);
delete[] lampActiveFlag;
lampActiveFlag = NULL;
Check_Fpu();
}
Logical
L4LampManager::TestInstance() const
{
Check_Fpu();
return LampManager::TestInstance();
}
void
L4LampManager::Update(ModeMask current_mode_mask)
{
Check(this);
Logical
flush_inactive_lamps = (current_mode_mask != previousModeMask);
int
i;
if (flush_inactive_lamps)
{
//---------------------------------------
// Mark all lamps as inactive
//---------------------------------------
Check_Pointer(lampActiveFlag);
for(i=0; i< LBE4ControlsManager::LampCount; ++i)
{
lampActiveFlag[i] = False;
}
}
//---------------------------------------
// Update LampManager, set lamp outputs,
// and mark active lamps
//---------------------------------------
LampManager::Update(current_mode_mask);
if (flush_inactive_lamps)
{
//---------------------------------------
// Turn off inactive lamps
//---------------------------------------
Check_Pointer(lampActiveFlag);
for(i=0; i< LBE4ControlsManager::LampCount; ++i)
{
if (lampActiveFlag[i] == False)
{
AssertNewLampValue(i, RIO::solid+RIO::state1Off+RIO::state2Off);
}
}
}
Check_Fpu();
}
void
L4LampManager::AssertNewLampValue(int lamp_number, int lamp_value)
{
Check(this);
Verify(lamp_number >= 0);
Verify(lamp_number < LBE4ControlsManager::LampCount);
//--------------------------------------
// Update external hardware
//--------------------------------------
Check_Pointer(previousLampState);
if (previousLampState[lamp_number] != lamp_value)
{
previousLampState[lamp_number] = lamp_value;
//--------------------------------------
// Send RIO command to update L4 lamp
//--------------------------------------
Check(controlsManager);
controlsManager->SetLamp(lamp_number, lamp_value);
}
Check_Fpu();
}
//#########################################################################
//################################ L4Lamp #################################
//#########################################################################
L4Lamp::L4Lamp(
LampID lamp_number,
ModeMask mode_mask,
L4LampManager *lamp_manager
) :
Lamp(lamp_number, mode_mask, (LampManager *) lamp_manager)
{
automatic = True;
automaticValue = (ControlsButton) 0;
previousAutomaticValue = automaticValue;
SetState(LampStateDim);
Check_Fpu();
}
L4Lamp::~L4Lamp()
{
Check(this);
SetState(LampStateOff);
Check_Fpu();
}
Logical
L4Lamp::TestInstance() const
{
return Lamp::TestInstance();
}
void
L4Lamp::SetAutomaticOperation(Logical automatic_flag)
{
Check(this);
automatic = automatic_flag;
Check_Fpu();
}
void
L4Lamp::Update(Logical force_notification)
{
Check(this);
//--------------------------------------
// Tell manager we're still active
//--------------------------------------
if (lampID >= 0)
{
if (lampID < LBE4ControlsManager::LampCount)
{
Check_Pointer(((L4LampManager *)manager)->lampActiveFlag);
((L4LampManager *)manager)->lampActiveFlag[lampID] = True;
}
}
//--------------------------------------
// Update state if automatic
//--------------------------------------
if (automatic)
{
if (previousAutomaticValue != automaticValue)
{
previousAutomaticValue = automaticValue;
if (previousAutomaticValue > 0)
{
SetState(LampStateOn);
}
else
{
SetState(LampStateDim);
}
}
else if (force_notification)
{
NotifyOfStateChange();
}
}
else if (force_notification)
{
NotifyOfStateChange();
}
Check_Fpu();
}
void
L4Lamp::NotifyOfStateChange()
{
Check(this);
Check((L4LampManager *) manager);
int
output_value;
if (alertActive)
{
switch(previousState)
{
default:
output_value = RIO::flashFast + RIO::state1Off + RIO::state2Dim;
break;
case LampStateDim:
case LampStateOn:
output_value = RIO::flashFast + RIO::state1Dim + RIO::state2Bright;
break;
}
}
else
{
switch(previousState)
{
default:
output_value = RIO::solid + RIO::state1Off + RIO::state2Off;
break;
case LampStateDim:
output_value = RIO::solid + RIO::state1Dim + RIO::state2Dim;
break;
case LampStateOn:
output_value = RIO::solid + RIO::state1Bright + RIO::state2Bright;
break;
}
}
((L4LampManager *) manager)->AssertNewLampValue(lampID, output_value);
Check_Fpu();
}
//#########################################################################
//############################# L4VirtualLamp #############################
//#########################################################################
L4GraphicLamp::L4GraphicLamp(
LampID lamp_id,
ModeMask mode_mask,
GaugeRenderer *the_renderer,
int graphics_port_number,
int left, int bottom,
const char *map_name,
int bg_color, int fg_color,
Logical opaque_flag
) :
GraphicLamp(
lamp_id,
mode_mask,
the_renderer->GetLampManager(),
the_renderer,
graphics_port_number
)
{
//--------------------------------------------
// Build copy of map name
//--------------------------------------------
Check_Pointer(map_name);
mapName = new char[strlen(map_name)+1];
Register_Pointer(mapName);
strcpy(mapName, map_name);
//--------------------------------------------
// Get the image
//--------------------------------------------
# if defined(PRELOAD_ART)
Check(renderer);
L4Warehouse
*warehouse = (L4Warehouse *) renderer->warehousePointer;
Check(warehouse);
warehouse->bitMapBin.Get(mapName);
# endif
opaque = opaque_flag;
bgColor = bg_color;
fgColor = fg_color;
localView.SetOrigin(left, bottom);
Check_Fpu();
}
L4GraphicLamp::~L4GraphicLamp()
{
Check(this);
Check_Pointer(mapName);
//--------------------------------------------
// Release the preloaded image
//--------------------------------------------
# if defined(PRELOAD_ART)
Check(renderer);
L4Warehouse
*warehouse = (L4Warehouse *) renderer->warehousePointer;
Check(warehouse);
warehouse->bitMapBin.Release(mapName);
# endif
//--------------------------------------------
// Delete the copy of the name
//--------------------------------------------
Check_Pointer(mapName);
delete[] mapName;
mapName = NULL;
Check_Fpu();
}
Logical
L4GraphicLamp::TestInstance() const
{
return GraphicLamp::TestInstance();
}
void
L4GraphicLamp::NotifyOfStateChange()
{
Check(this);
//--------------------------------------------
// Get the bitmap
//--------------------------------------------
Check(renderer);
L4Warehouse
*warehouse = (L4Warehouse *) renderer->warehousePointer;
Check(warehouse);
BitMap
*bitmap = warehouse->bitMapBin.Get(mapName);
if (bitmap != NULL)
{
Check(bitmap);
//--------------------------------------------
// Set the color
//--------------------------------------------
if (previousState <= LampStateOff)
{
localView.SetColor(bgColor);
}
else
{
localView.SetColor(fgColor);
}
//--------------------------------------------
// Draw the bitmap
//--------------------------------------------
if (opaque)
{
localView.DrawBitMapOpaque(bgColor, 0, bitmap);
}
else
{
localView.DrawBitMap(0, bitmap);
}
//--------------------------------------------
// Release the bitmap
//--------------------------------------------
Check(warehouse);
warehouse->bitMapBin.Release(mapName);
}
Check_Fpu();
}