CnC_Remastered_Collection/REDALERT/SUPER.CPP
PG-SteveT ae72fce5dd August 6th Patch Update
Accumulated DLL source code changes since June 22nd patch
2020-08-06 09:44:54 -07:00

389 lines
23 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: /CounterStrike/SUPER.CPP 1 3/03/97 10:25a 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 : SUPER.CPP *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : 07/28/95 *
* *
* Last Update : October 11, 1996 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* SuperClass::AI -- Process the super weapon AI. *
* SuperClass::Anim_Stage -- Fetches the animation stage for this super weapon. *
* SuperClass::Discharged -- Handles discharged action for special super weapon. *
* SuperClass::Enable -- Enable this super special weapon. *
* SuperClass::Forced_Charge -- Force the super weapon to full charge state. *
* SuperClass::Impatient_Click -- Called when player clicks on unfinished super weapon. *
* SuperClass::Recharge -- Starts the special super weapon recharging. *
* SuperClass::Remove -- Removes super weapon availability. *
* SuperClass::SuperClass -- Constructor for special super weapon objects. *
* SuperClass::Suspend -- Suspend the charging of the super weapon. *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
/***********************************************************************************************
* SuperClass::SuperClass -- Constructor for special super weapon objects. *
* *
* This is the constructor for the super weapons. *
* *
* INPUT: recharge -- The recharge delay time (in game frames). *
* *
* charging -- Voice to announce that the weapon is charging. *
* *
* ready -- Voice to announce that the weapon is fully charged. *
* *
* impatient -- Voice to announce current charging state. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
SuperClass::SuperClass(int recharge, bool powered, VoxType charging, VoxType ready, VoxType impatient, VoxType suspend) :
IsPowered(powered),
IsPresent(false),
IsOneTime(false),
IsReady(false),
Control(0),
OldStage(-1),
VoxRecharge(ready),
VoxCharging(charging),
VoxImpatient(impatient),
VoxSuspend(suspend),
RechargeTime(recharge)
{
}
/***********************************************************************************************
* SuperClass::Suspend -- Suspend the charging of the super weapon. *
* *
* This will temporarily put on hold the charging of the special weapon. This might be the *
* result of insufficient power. *
* *
* INPUT: on -- Should the weapon charging be suspended? Else, it will unsuspend. *
* *
* OUTPUT: Was the weapon suspend state changed? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
bool SuperClass::Suspend(bool on)
{
if (IsPresent && !IsReady && !IsOneTime && on == Control.Is_Active()) {
if (!on) {
Control.Start();
} else {
Control.Stop();
}
// if (on != IsSuspended) {
// if (on) {
// SuspendTime = Control;
// } else {
// Control = SuspendTime;
// }
// IsSuspended = on;
return(true);
// }
}
return(false);
}
/***********************************************************************************************
* SuperClass::Enable -- Enable this super special weapon. *
* *
* This routine is called when the special weapon needs to be activated. This is used for *
* both the normal super weapons and the special one-time super weapons (from crates). *
* *
* INPUT: onetime -- Is this a special one time super weapon? *
* *
* player -- Is this weapon for the player? If true, then there might be a voice *
* announcement of this weapon's availability. *
* *
* quiet -- Request that the weapon start in suspended state (quiet mode). *
* *
* OUTPUT: Was the special super weapon enabled? Failure might indicate that the weapon was *
* already available. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
bool SuperClass::Enable(bool onetime, bool player, bool quiet)
{
if (!IsPresent) {
IsPresent = true;
IsOneTime = onetime;
bool retval = Recharge(player && !quiet);
if (quiet) Suspend(true);
return(retval);
}
return(false);
}
/***********************************************************************************************
* SuperClass::Remove -- Removes super weapon availability. *
* *
* Call this routine when the super weapon should be removed because of some outside *
* force. For one time special super weapons, they can never be removed except as the *
* result of discharging them. *
* *
* INPUT: none *
* *
* OUTPUT: Was the special weapon removed and disabled? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
bool SuperClass::Remove(bool forced)
{
if (IsPresent && (!IsOneTime || forced)) {
IsReady = false;
IsPresent = false;
return(true);
}
return(false);
}
/***********************************************************************************************
* SuperClass::Recharge -- Starts the special super weapon recharging. *
* *
* This routine is called when the special weapon is allowed to recharge. Suspension will *
* be disabled and the animation process will begin. *
* *
* INPUT: player -- Is this for a player owned super weapon? If so, then a voice *
* announcement might be in order. *
* *
* OUTPUT: Was the super weapon begun charging up? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
bool SuperClass::Recharge(bool player)
{
if (IsPresent && !IsReady) {
// IsSuspended = false;
OldStage = -1;
Control.Start();
Control = RechargeTime;
#ifdef CHEAT_KEYS
if (Special.IsSpeedBuild) {
Control = 1;
}
#endif
if (player) {
Speak(VoxCharging);
}
return(true);
}
return(false);
}
/***********************************************************************************************
* Superclass::Discharged -- Handles discharged action for special super weapon. *
* *
* This routine should be called when the special super weapon has been discharged. The *
* weapon will either begin charging anew or will be removed entirely -- depends on the *
* one time flag for the weapon. *
* *
* INPUT: player -- Is this special weapon for the player? If so, then there might be a *
* voice announcement. *
* *
* OUTPUT: Should the sidebar be reprocessed because the special weapon has been eliminated? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
bool SuperClass::Discharged(bool player)
{
if (Control.Is_Active() && IsPresent && IsReady) {
IsReady = false;
if (IsOneTime) {
IsOneTime = false;
return(Remove());
} else {
Recharge(player);
}
}
return(false);
}
/***********************************************************************************************
* SuperClass::AI -- Process the super weapon AI. *
* *
* This routine will process the charge up AI for this super weapon object. If the weapon *
* has advanced far enough to change any sidebar graphic that might represent it, then *
* "true" will be returned. Use this return value to intelligently update the sidebar. *
* *
* INPUT: player -- Is this for the player? If it is and the weapon is now fully charged, *
* then this fully charged state will be announced to the player. *
* *
* OUTPUT: Was the weapon's state changed such that a sidebar graphic update will be *
* necessary? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
bool SuperClass::AI(bool player)
{
if (IsPresent && !IsReady) {
if (!Control.Is_Active()) {
if (OldStage != -1) {
OldStage = -1;
return(true);
}
} else {
if (Control == 0) {
IsReady = true;
if (player) {
Speak(VoxRecharge);
}
return(true);
} else {
if (Anim_Stage() != OldStage) {
OldStage = Anim_Stage();
return(true);
}
}
}
}
return(false);
}
/***********************************************************************************************
* SuperClass::Anim_Stage -- Fetches the animation stage for this super weapon. *
* *
* This will return the current animation stage for this super weapon. The value will be *
* between zero (uncharged) to ANIMATION_STAGES (fully charged). Use this value to render *
* the appropriate graphic on the sidebar. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with the current animation stage for this special super weapon powerup. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
* 10/11/1996 JLB : Doesn't show complete until really complete. *
*=============================================================================================*/
int SuperClass::Anim_Stage(void) const
{
if (IsPresent) {
if (IsReady) {
return(ANIMATION_STAGES);
}
// int time = Control;
// if (IsSuspended) {
// time = SuspendTime;
// }
int stage = ANIMATION_STAGES * fixed(RechargeTime-Control.Value(), RechargeTime);
stage = min(stage, ANIMATION_STAGES-1);
return(stage);
}
return(0);
}
/***********************************************************************************************
* SuperClass::Impatient_Click -- Called when player clicks on unfinished super weapon. *
* *
* This routine is called when the player clicks on the super weapon icon on the sidebar *
* when the super weapon is not ready yet. This results in a voice message feedback to the *
* player. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/28/1995 JLB : Created. *
*=============================================================================================*/
void SuperClass::Impatient_Click(void) const
{
if (!Control.Is_Active()) {
Speak(VoxSuspend);
} else {
Speak(VoxImpatient);
}
}
/***********************************************************************************************
* SuperClass::Forced_Charge -- Force the super weapon to full charge state. *
* *
* This routine will force the special weapon to full charge state. Call it when the weapon *
* needs to be instantly charged. The airstrike (when it first becomes available) is a *
* good example. *
* *
* INPUT: player -- Is this for the player? If true, then the full charge state will be *
* announced. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/29/1995 JLB : Created. *
*=============================================================================================*/
void SuperClass::Forced_Charge(bool player)
{
if (IsPresent) {
IsReady = true;
Control.Start();
Control = 0;
// IsSuspended = false;
if (player) {
Speak(VoxRecharge);
}
}
}