CnC_Remastered_Collection/TIBERIANDAWN/OPTIONS.CPP

797 lines
46 KiB
C++

//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
// software: you can redistribute it and/or modify it under the terms of
// the GNU General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
// in the hope that it will be useful, but with permitted additional restrictions
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
// distributed with this program. You should have received a copy of the
// GNU General Public License along with permitted additional restrictions
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
/* $Header: F:\projects\c&c\vcs\code\options.cpv 2.17 16 Oct 1995 16:51:28 JOE_BOSTIC $ */
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : Command & Conquer *
* *
* File Name : OPTIONS.CPP *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : June 8, 1994 *
* *
* Last Update : June 30, 1995 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* OptionsClass::Adjust_Palette -- Adjusts the palette according to the settings specified. *
* OptionsClass::Get_Brightness -- Fetches the current brightness setting. *
* OptionsClass::Get_Color -- Fetches the current color setting. *
* OptionsClass::Get_Contrast -- Gets the current contrast setting. *
* OptionsClass::Get_Game_Speed -- Fetches the current game speed setting. *
* OptionsClass::Get_Scroll_Rate -- Fetches the current scroll rate setting. *
* OptionsClass::Get_Tint -- Fetches the current tint setting. *
* OptionsClass::Load_Settings -- reads options settings from the INI file *
* OptionsClass::Normalize_Delay -- Normalizes delay factor to keep rate constant. *
* OptionsClass::One_Time -- This performs any one time initialization for the options class.*
* OptionsClass::OptionsClass -- The default constructor for the options class. *
* OptionsClass::Process -- Handles all the options graphic interface. *
* OptionsClass::Save_Settings -- writes options settings to the INI file *
* OptionsClass::Set -- Sets options based on current settings *
* OptionsClass::Set_Brightness -- Sets the brightness level to that specified. *
* OptionsClass::Set_Color -- Sets the color to the value specified. *
* OptionsClass::Set_Contrast -- Sets the contrast to the value specified. *
* OptionsClass::Set_Game_Speed -- Sets the game speed as specified. *
* OptionsClass::Set_Repeat -- Controls the score repeat option. *
* OptionsClass::Set_Score_Volume -- Sets the global score volume to that specified. *
* OptionsClass::Set_Scroll_Rate -- Sets the scroll rate as specified. *
* OptionsClass::Set_Shuffle -- Controls the play shuffle setting. *
* OptionsClass::Set_Sound_Volume -- Sets the sound effects volume level. *
* OptionsClass::Set_Tint -- Sets the tint setting. *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
#include "options.h"
/***********************************************************************************************
* OptionsClass::OptionsClass -- The default constructor for the options class. *
* *
* This is the constructor for the options class. It handles setting up all the globals *
* necessary for the options. This includes setting them to their default state. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/21/1994 JLB : Created. *
*=============================================================================================*/
OptionsClass::OptionsClass(void)
{
GameSpeed = TIMER_SECOND / TICKS_PER_SECOND;
ScrollRate = TIMER_SECOND / TICKS_PER_SECOND;
Volume = 0xE0;
ScoreVolume = 0x90;
Contrast = 0x80;
Color = 0x80;
Contrast = 0x80;
Tint = 0x80;
Brightness = 0x80;
AutoScroll = true;
#if (GERMAN | FRENCH)
IsDeathAnnounce = true;
#else
IsDeathAnnounce = false;
#endif
IsScoreRepeat = false;
IsScoreShuffle = false;
IsFreeScroll = false;
}
/***********************************************************************************************
* OptionsClass::One_Time -- This performs any one time initialization for the options class. *
* *
* This routine should be called only once and it will perform any inializations for the *
* options class that is needed. This may include things like file loading and memory *
* allocation. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: Only call this routine once. *
* *
* HISTORY: *
* 07/21/1994 JLB : Created. *
*=============================================================================================*/
void OptionsClass::One_Time(void)
{
Set_Score_Vol(ScoreVolume);
}
/***********************************************************************************************
* OptionsClass::Process -- Handles all the options graphic interface. *
* *
* This routine is the main control for the visual representation of the options *
* screen. It handles the visual overlay and the player input. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/21/1994 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Process(void)
{
}
/***********************************************************************************************
* OptionsClass::Set_Shuffle -- Controls the play shuffle setting. *
* *
* This routine will control the score shuffle flag. The setting to use is provided as *
* a parameter. When shuffling is on, the score play order is scrambled. *
* *
* INPUT: on -- Should the shuffle option be activated? *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Shuffle(int on)
{
IsScoreShuffle = on;
}
/***********************************************************************************************
* OptionsClass::Set_Repeat -- Controls the score repeat option. *
* *
* This routine is used to control whether scores repeat or not. The setting to use for *
* the repeat flag is provided as a parameter. *
* *
* INPUT: on -- Should the scores repeat? *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Repeat(int on)
{
IsScoreRepeat = on;
}
/***********************************************************************************************
* OptionsClass::Set_Score_Volume -- Sets the global score volume to that specified. *
* *
* This routine will set the global score volume to the value specified. The value ranges *
* from zero to 255. *
* *
* INPUT: volume -- The new volume setting to use for scores. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Score_Volume(int volume)
{
volume = Bound(volume, 0, 255);
ScoreVolume = volume;
Set_Score_Vol(ScoreVolume);
}
/***********************************************************************************************
* OptionsClass::Set_Sound_Volume -- Sets the sound effects volume level. *
* *
* This routine will set the sound effect volume level as indicated. It can generate a *
* sound effect for feedback purposes if desired. The volume setting can range from zero *
* to 255. The value of 255 is the loudest. *
* *
* INPUT: volume -- The volume setting to use for the new value. 0 to 255. *
* *
* feedback -- Should a feedback sound effect be generated? *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Sound_Volume(int volume, int feedback)
{
volume = Bound(volume, 0, 255);
Volume = volume;
if (feedback) {
Sound_Effect(VOC_BLEEPY3, NULL);
}
}
/***********************************************************************************************
* OptionsClass::Set_Brightness -- Sets the brightness level to that specified. *
* *
* This routine will set the current brightness level to the value specified. This value *
* can range from zero to 255, with 128 being the normal (default) brightness level. *
* *
* INPUT: brightness -- The brightness level to set as current. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Brightness(int brightness)
{
Brightness = 0x40 + Fixed_To_Cardinal(0x80, brightness);
Adjust_Palette(OriginalPalette, GamePalette, Brightness, Color, Tint, Contrast);
if (InMainLoop){
Set_Palette(GamePalette);
}
}
/***********************************************************************************************
* OptionsClass::Get_Brightness -- Fetches the current brightness setting. *
* *
* This routine will fetch the current setting for the brightness level. The value ranges *
* from zero to 255, with 128 being the normal (default) value. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with the current brightness setting. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
int OptionsClass::Get_Brightness(void) const
{
return(Cardinal_To_Fixed(0x80, Brightness-0x40));
}
/***********************************************************************************************
* OptionsClass::Set_Color -- Sets the color to the value specified. *
* *
* This routine will set the color value to that specified. The value specified can range *
* from zero to 255. The value of 128 is the normal default color setting. *
* *
* INPUT: color -- The new color value to set as current. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Color(int color)
{
Color = color;
Adjust_Palette(OriginalPalette, GamePalette, Brightness, Color, Tint, Contrast);
if (InMainLoop){
Set_Palette(GamePalette);
}
}
/***********************************************************************************************
* OptionsClass::Get_Color -- Fetches the current color setting. *
* *
* This routine will fetch the current color setting. This value ranges from zero to *
* 255. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with the current color setting. The value of 128 is the normal (default) *
* color setting. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
int OptionsClass::Get_Color(void) const
{
return(Color);
}
/***********************************************************************************************
* OptionsClass::Set_Contrast -- Sets the contrast to the value specified. *
* *
* This routine will set the constrast to the setting specified. This setting ranges from *
* zero to 255. The value o 128 is the normal default value. *
* *
* INPUT: contrast -- The constrast setting to make as the current setting. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Contrast(int contrast)
{
Contrast = 0x40 + Fixed_To_Cardinal(0x80, contrast);
Adjust_Palette(OriginalPalette, GamePalette, Brightness, Color, Tint, Contrast);
if (InMainLoop){
Set_Palette(GamePalette);
}
}
/***********************************************************************************************
* OptionsClass::Get_Contrast -- Gets the current contrast setting. *
* *
* This routine will get the current contrast setting. The value returned is in the range *
* of zero to 255. *
* *
* INPUT: none *
* *
* OUTPUT: Returns the current contrast setting. A setting of 128 is the normal default value.*
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
int OptionsClass::Get_Contrast(void) const
{
return(Cardinal_To_Fixed(0x80, Contrast-0x40));
}
/***********************************************************************************************
* OptionsClass::Set_Tint -- Sets the tint setting. *
* *
* This routine will change the current tint setting according to the value specified. *
* *
* INPUT: tint -- The desired tint setting. This value ranges from zero to 255. *
* *
* OUTPUT: none *
* *
* WARNINGS: The value of 128 is the default (normal) tint setting. *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Set_Tint(int tint)
{
Tint = tint;
Adjust_Palette(OriginalPalette, GamePalette, Brightness, Color, Tint, Contrast);
if (InMainLoop){
Set_Palette(GamePalette);
}
}
/***********************************************************************************************
* OptionsClass::Get_Tint -- Fetches the current tint setting. *
* *
* This fetches the current tint setting. The value is returned as a number between *
* zero and 255. This has been adjusted for the valid range allowed. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with the current tint setting. Normal tint setting is 128. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/19/1995 JLB : Created. *
*=============================================================================================*/
int OptionsClass::Get_Tint(void) const
{
return(Tint);
}
/***********************************************************************************************
* OptionsClass::Adjust_Palette -- Adjusts the palette according to the settings specified. *
* *
* This routine is used to adjust the palette according to the settings provided. It is *
* used by the options class to monkey with the palette. *
* *
* INPUT: oldpal -- Pointer to the original (unmodified) palette. *
* *
* newpal -- The new palette to create according to the settings provided. *
* *
* brightness -- The brightness level (0..255). *
* *
* color -- The color level (0..255). *
* *
* tint -- The tint (hue) level (0..255). *
* *
* contrast -- The contrast level (0..255). *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/21/1994 JLB : Created. *
*=============================================================================================*/
void OptionsClass::Adjust_Palette(void *oldpal, void *newpal, unsigned char brightness, unsigned char color, unsigned char tint, unsigned char contrast) const
{
// ST - 1/3/2019 10:49AM
#if (0)
int index;
unsigned h,s,v;
unsigned r,g,b;
if (!oldpal || !newpal) return;
/*
** Adjust for palette.
*/
for (index = 0; index < 256; index++) {
if (/*index == LTGREEN ||*/ index == 255) {
memcpy(&((char*)newpal)[index*3], &((char*)oldpal)[index*3], 3);
} else {
r = ((char*)oldpal)[(index*3)+0];
g = ((char*)oldpal)[(index*3)+1];
b = ((char*)oldpal)[(index*3)+2];
Convert_RGB_To_HSV(r, g, b, &h, &s, &v);
/*
** Adjust contrast by moving the value toward the center according to the
** percentage indicated.
*/
int temp;
temp = (v * brightness) / 0x80; // Brightness
temp = Bound(temp, 0, 0xFF);
v = temp;
temp = (((((int)v) - 0x80) * contrast) / 0x80) + 0x80; // Contrast
temp = Bound(temp, 0, 0xFF);
v = temp;
temp = (s * color) / 0x80; // Color
temp = Bound(temp, 0, 0xFF);
s = temp;
temp = (h * tint) / 0x80; // Tint
temp = Bound(temp, 0, 0xFF);
h = temp;
Convert_HSV_To_RGB(h, s, v, &r, &g, &b);
((char*)newpal)[(index*3)+0] = r;
((char*)newpal)[(index*3)+1] = g;
((char*)newpal)[(index*3)+2] = b;
}
}
#endif
}
/***********************************************************************************************
* OptionsClass::Load_Settings -- reads options settings from the INI file *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 02/14/1995 BR : Created. *
*=============================================================================================*/
void OptionsClass::Load_Settings (void)
{
char *buffer; // INI staging buffer pointer.
/*
** Fetch working pointer to the INI staging buffer. Make sure that the buffer
** is cleared out before proceeding. (Don't use the HidPage for this, since
** the HidPage may be needed for various uncompressions during the INI
** parsing.)
*/
buffer = (char *)_ShapeBuffer;
memset(buffer, '\0', _ShapeBufferSize);
/*
** Create filename and read the file.
*/
CCFileClass file ("CONQUER.INI");
if (!file.Is_Available()) {
return;
} else {
file.Read(buffer, _ShapeBufferSize-1);
}
file.Close();
/*
** Read in the Options values
*/
GameSpeed = WWGetPrivateProfileInt("Options", "GameSpeed", 4, buffer);
ScrollRate = WWGetPrivateProfileInt("Options", "ScrollRate", 4, buffer);
Set_Brightness(WWGetPrivateProfileInt("Options", "Brightness", 0x80, buffer));
Set_Sound_Volume(WWGetPrivateProfileInt("Options", "Volume", 0xA0, buffer),false);
Set_Score_Volume(WWGetPrivateProfileInt("Options", "ScoreVolume", 0xFF, buffer));
Set_Contrast(WWGetPrivateProfileInt("Options", "Contrast", 0x80, buffer));
Set_Color(WWGetPrivateProfileInt("Options", "Color", 0x80, buffer));
Set_Tint(WWGetPrivateProfileInt("Options", "Tint", 0x80, buffer));
AutoScroll = WWGetPrivateProfileInt("Options", "AutoScroll", 1, buffer);
Set_Repeat(WWGetPrivateProfileInt("Options", "IsScoreRepeat", 0, buffer));
Set_Shuffle(WWGetPrivateProfileInt("Options", "IsScoreShuffle", 0, buffer));
IsDeathAnnounce = WWGetPrivateProfileInt("Options", "DeathAnnounce", 0, buffer);
IsFreeScroll = WWGetPrivateProfileInt("Options", "FreeScrolling", 0, buffer);
SlowPalette = WWGetPrivateProfileInt("Options", "SlowPalette", 1, buffer);
char workbuf[128];
/*
** Check for and possible enable true object names.
*/
WWGetPrivateProfileString("Options", "TrueNames", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_TRUENAME) {
Special.IsNamed = true;
}
/*
** Enable 6 player games if special flag is detected.
*/
WWGetPrivateProfileString("Options", "Players", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_6PLAYER) {
MPlayerMax = 6;
}
/*
** Enable three point turning logic as indicated.
*/
WWGetPrivateProfileString("Options", "Rotation", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_3POINT) {
Special.IsThreePoint = true;
}
/*
** Allow purchase of the helipad separately from the helicopter.
*/
WWGetPrivateProfileString("Options", "Helipad", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_HELIPAD) {
Special.IsSeparate = true;
}
/*
** Allow the MCV to undeploy rather than sell.
*/
WWGetPrivateProfileString("Options", "MCV", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_MCV) {
Special.IsMCVDeploy = true;
}
/*
** Allow disabling of building bibs so that tigher building packing can occur.
*/
WWGetPrivateProfileString("Options", "Bibs", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_BIB) {
Special.IsRoad = true;
}
/*
** Allow targeting of trees without having to hold down the shift key.
*/
WWGetPrivateProfileString("Options", "TreeTarget", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_TREETARGET) {
Special.IsTreeTarget = true;
}
/*
** Allow infantry to fire while moving. Attacker gets advantage with this flag.
*/
WWGetPrivateProfileString("Options", "Combat", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_COMBAT) {
Special.IsDefenderAdvantage = false;
}
/*
** Allow custom scores.
*/
WWGetPrivateProfileString("Options", "Scores", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_SCORE) {
Special.IsVariation = true;
}
/*
** Smarter self defense logic. Tanks will try to run over adjacent infantry. Buildings
** will automatically return fire if they are fired upon. Infantry will run from an
** incoming explosive (grenade or napalm) or damage that can't be directly addressed.
*/
WWGetPrivateProfileString("Options", "CombatIQ", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_IQ) {
Special.IsSmartDefense = true;
Special.IsScatter = true;
}
/*
** Enable the infantry squish marks when run over by a vehicle.
*/
WWGetPrivateProfileString("Options", "Overrun", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_SQUISH) {
Special.IsGross = true;
}
/*
** Enable the human generated sound effects.
*/
WWGetPrivateProfileString("Options", "Sounds", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_HUMAN) {
Special.IsJuvenile = true;
}
/*
** Scrolling is disabled over the tabs with this option.
*/
WWGetPrivateProfileString("Options", "Scrolling", "", workbuf, sizeof(workbuf), buffer);
if (Obfuscate(workbuf) == PARM_SCROLLING) {
Special.IsScrollMod = true;
}
}
/***********************************************************************************************
* OptionsClass::Save_Settings -- writes options settings to the INI file *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 02/14/1995 BR : Created. *
*=============================================================================================*/
void OptionsClass::Save_Settings (void)
{
char * buffer; // INI staging buffer pointer.
CCFileClass file;
/*
** Get a working pointer to the INI staging buffer. Make sure that the buffer
** starts cleared out of any data.
*/
buffer = (char *)_ShapeBuffer;
memset(buffer, '\0', _ShapeBufferSize);
file.Set_Name("CONQUER.INI");
if (file.Is_Available()) {
file.Read(buffer, _ShapeBufferSize-1);
}
/*
** Save Options settings
*/
WWWritePrivateProfileInt("Options", "GameSpeed", GameSpeed, buffer);
WWWritePrivateProfileInt("Options", "ScrollRate", ScrollRate, buffer);
WWWritePrivateProfileInt("Options", "Brightness", Brightness, buffer);
WWWritePrivateProfileInt("Options", "Volume", Volume, buffer);
WWWritePrivateProfileInt("Options", "ScoreVolume", ScoreVolume, buffer);
WWWritePrivateProfileInt("Options", "Contrast", Contrast, buffer);
WWWritePrivateProfileInt("Options", "Color", Color, buffer);
WWWritePrivateProfileInt("Options", "Tint", Tint, buffer);
WWWritePrivateProfileInt("Options", "AutoScroll", AutoScroll, buffer);
WWWritePrivateProfileInt("Options", "IsScoreRepeat", IsScoreRepeat, buffer);
WWWritePrivateProfileInt("Options", "IsScoreShuffle", IsScoreShuffle, buffer);
WWWritePrivateProfileInt("Options", "DeathAnnounce", IsDeathAnnounce, buffer);
WWWritePrivateProfileInt("Options", "FreeScrolling", IsFreeScroll, buffer);
/*
** Write the INI data out to a file.
*/
file.Write(buffer,strlen(buffer));
}
/***********************************************************************************************
* OptionsClass::Set -- Sets options based on current settings *
* *
* Use this routine to adjust the palette or sound settings after a fresh scenario load. *
* It assumes the values needed are already loaded into OptionsClass. *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 06/24/1995 BRR : Created. *
*=============================================================================================*/
void OptionsClass::Set(void)
{
Set_Brightness(Brightness);
Set_Contrast(Contrast);
Set_Color(Color);
Set_Tint(Tint);
Set_Sound_Volume(Volume,false);
Set_Score_Volume(ScoreVolume);
Set_Repeat(IsScoreRepeat);
Set_Shuffle(IsScoreShuffle);
}
/***********************************************************************************************
* OptionsClass::Normalize_Delay -- Normalizes delay factor to keep rate constant. *
* *
* This routine is used to adjust delay factors that MUST be synchronized on all machines *
* but should maintain a speed as close to constant as possible. Building animations are *
* a good example of this. *
* *
* INPUT: delay -- The normal delay factor. *
* *
* OUTPUT: Returns with the delay to use that has been modified so that a reasonably constant *
* rate will result. *
* *
* WARNINGS: This calculation is crude due to the coarse resolution that a 1/15 second timer *
* allows. *
* *
* Use of this routine ASSUMES that the GameSpeed is synchronized on all machines. *
* *
* HISTORY: *
* 06/18/1995 JLB : Created. *
* 06/30/1995 JLB : Handles low values in a more consistent manner. *
*=============================================================================================*/
int OptionsClass::Normalize_Delay(int delay) const
{
static int _adjust[][8] = {
{2,2,1,1,1,1,1,1},
{3,3,3,2,2,2,1,1},
{5,4,4,3,3,2,2,1},
{7,6,5,4,4,4,3,2}
};
if (delay) {
if (delay < 5) {
delay = _adjust[delay-1][GameSpeed];
} else {
delay = ((delay * 8) / (GameSpeed+1));
}
}
return(delay);
}
void OptionsClass::Fixup_Palette(void) const
{
Adjust_Palette(OriginalPalette, GamePalette, Brightness, Color, Tint, Contrast);
}
int OptionsClass::Normalize_Sound(int volume) const
{
return(Fixed_To_Cardinal(volume, Volume));
}