183 lines
10 KiB
C++
183 lines
10 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/CRATE.CPP 3 3/04/97 3:12p 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 : CRATE.CPP *
|
|
* *
|
|
* Programmer : Joe L. Bostic *
|
|
* *
|
|
* Start Date : 08/26/96 *
|
|
* *
|
|
* Last Update : October 14, 1996 [JLB] *
|
|
* *
|
|
*---------------------------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* CrateClass::Create_Crate -- Create a crate in the cell specified. *
|
|
* CrateClass::Get_Crate -- Pick up a crate from the cell specified. *
|
|
* CrateClass::Put_Crate -- Generates crate overlay at cell specified. *
|
|
* CrateClass::Remove_It -- Removes the crate from wherever it is. *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
#include "function.h"
|
|
|
|
|
|
/***********************************************************************************************
|
|
* CrateClass::Remove_It -- Removes the crate from wherever it is. *
|
|
* *
|
|
* This routine will remove the crate from whereever it happens to be. *
|
|
* *
|
|
* INPUT: none *
|
|
* *
|
|
* OUTPUT: bool; Was the crate found and removed? *
|
|
* *
|
|
* WARNINGS: none *
|
|
* *
|
|
* HISTORY: *
|
|
* 08/26/1996 JLB : Created. *
|
|
*=============================================================================================*/
|
|
bool CrateClass::Remove_It(void)
|
|
{
|
|
if (Is_Valid()) {
|
|
Get_Crate(Cell);
|
|
Make_Invalid();
|
|
return(true);
|
|
}
|
|
return(false);
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* CrateClass::Create_Crate -- Create a crate in the cell specified. *
|
|
* *
|
|
* This will create a crate in the cell specified. If the crate could not be crated there *
|
|
* then 'false' will be returned. *
|
|
* *
|
|
* INPUT: cell -- The desired cell to place the crate in. *
|
|
* *
|
|
* OUTPUT: bool; Was the crate created and placed in the cell? *
|
|
* *
|
|
* WARNINGS: It is quite possible for the crate not to have been placed. Only the most clear *
|
|
* locations are valid for crate placement. *
|
|
* *
|
|
* HISTORY: *
|
|
* 08/26/1996 JLB : Created. *
|
|
*=============================================================================================*/
|
|
bool CrateClass::Create_Crate(CELL cell)
|
|
{
|
|
/*
|
|
** Remove any existing crate that this crate class is tracking.
|
|
*/
|
|
Remove_It();
|
|
|
|
/*
|
|
** Try to place a new crate at the cell specified.
|
|
*/
|
|
if (Put_Crate(cell)) {
|
|
Cell = cell;
|
|
Timer = Random_Pick(Rule.CrateTime * (TICKS_PER_MINUTE/2), Rule.CrateTime * (TICKS_PER_MINUTE*2));
|
|
Timer.Start();
|
|
return(true);
|
|
}
|
|
return(false);
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* CrateClass::Put_Crate -- Generates crate overlay at cell specified. *
|
|
* *
|
|
* This helpter routine will examine the cell and place the appropriate crate type into *
|
|
* the cell specified. If the overlay could not be generated, then 'false' is returned. *
|
|
* *
|
|
* INPUT: cell -- The cell to generate the crate overlay in. *
|
|
* *
|
|
* OUTPUT: bool; Was the crate overlay generated? *
|
|
* *
|
|
* WARNINGS: none *
|
|
* *
|
|
* HISTORY: *
|
|
* 08/26/1996 JLB : Created. *
|
|
* 10/14/1996 JLB : Takes reference to cell so that tracking can occur. *
|
|
*=============================================================================================*/
|
|
bool CrateClass::Put_Crate(CELL & cell)
|
|
{
|
|
int old = ScenarioInit;
|
|
ScenarioInit = 0;
|
|
|
|
if (Map.In_Radar(cell)) {
|
|
CellClass * cellptr = &Map[cell];
|
|
|
|
while (cellptr->Overlay != OVERLAY_NONE && !cellptr->Is_Clear_To_Build(SPEED_FLOAT) && !cellptr->Is_Clear_To_Build(SPEED_FOOT)) {
|
|
cell = Map.Pick_Random_Location();
|
|
|
|
if (Percent_Chance(100 * Rule.WaterCrateChance)) {
|
|
cell = Map.Nearby_Location(cell, SPEED_FLOAT);
|
|
} else {
|
|
cell = Map.Nearby_Location(cell, SPEED_TRACK);
|
|
}
|
|
cellptr = &Map[cell];
|
|
}
|
|
|
|
if (cellptr->Is_Clear_To_Build(SPEED_FLOAT)) {
|
|
new OverlayClass(OVERLAY_WATER_CRATE, cell);
|
|
} else {
|
|
new OverlayClass(OVERLAY_WOOD_CRATE, cell);
|
|
}
|
|
ScenarioInit = old;
|
|
return(true);
|
|
}
|
|
|
|
ScenarioInit = old;
|
|
return(false);
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* CrateClass::Get_Crate -- Pick up a crate from the cell specified. *
|
|
* *
|
|
* This will remove the crate from the cell specified. *
|
|
* *
|
|
* INPUT: cell -- The cell to examine and remove any crate overlays present. *
|
|
* *
|
|
* OUTPUT: bool; Was a crate overlay found and removed? *
|
|
* *
|
|
* WARNINGS: none *
|
|
* *
|
|
* HISTORY: *
|
|
* 08/26/1996 JLB : Created. *
|
|
*=============================================================================================*/
|
|
bool CrateClass::Get_Crate(CELL cell)
|
|
{
|
|
if (Map.In_Radar(cell)) {
|
|
CellClass * cellptr = &Map[cell];
|
|
|
|
if (cellptr->Overlay == OVERLAY_WOOD_CRATE ||
|
|
cellptr->Overlay == OVERLAY_STEEL_CRATE ||
|
|
cellptr->Overlay == OVERLAY_WATER_CRATE) {
|
|
|
|
cellptr->Overlay = OVERLAY_NONE;
|
|
cellptr->OverlayData = 0;
|
|
cellptr->Redraw_Objects();
|
|
return(true);
|
|
}
|
|
}
|
|
return(false);
|
|
}
|