This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Commando/dlgevamaptab.cpp

267 lines
8.1 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program 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.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** 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 : Combat *
* *
* $Archive:: /Commando/Code/commando/dlgevamaptab.cpp $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 1/09/02 1:54p $*
* *
* $Revision:: 14 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "dlgevamaptab.h"
#include "resource.h"
#include "mapctrl.h"
#include "combat.h"
#include "soldier.h"
#include "objectives.h"
#include "translatedb.h"
#include "translateobj.h"
#include "listctrl.h"
#include "mapmgr.h"
#include "lineseg.h"
#include "rendobj.h"
#include "phys.h"
#include "pscene.h"
#include "coltype.h"
#include "physcoltest.h"
#include "gamemode.h"
#include "gameinitmgr.h"
#include "imagectrl.h"
#include "string_ids.h"
////////////////////////////////////////////////////////////////
//
// On_Init_Dialog
//
////////////////////////////////////////////////////////////////
void
EvaMapTabClass::On_Init_Dialog (void)
{
//
// Set the map's title
//
Set_Dlg_Item_Text (IDC_MAP_TITLE, TRANSLATE (MapMgrClass::Get_Map_Title ()));
MapCtrlClass *map_ctrl = (MapCtrlClass *)Get_Dlg_Item (IDC_MAP_CTRL);
if (map_ctrl != NULL) {
//
// Configure the map
//
StringClass texture_filename;
MapMgrClass::Get_Map_Texture_Filename (texture_filename);
if (!texture_filename.Is_Empty()) {
map_ctrl->Set_Map_Texture (texture_filename);
}
map_ctrl->Set_Marker_Texture ("MAPICONS.TGA");
map_ctrl->Set_Map_Center (MapMgrClass::Get_Map_Center ());
map_ctrl->Set_Map_Scale (MapMgrClass::Get_Map_Scale ());
map_ctrl->Initialize_Cloud (MapMgrClass::CLOUD_WIDTH, MapMgrClass::CLOUD_HEIGHT);
//
// Do the cloud
//
for (int cell_x = 0; cell_x < MapMgrClass::CLOUD_WIDTH; cell_x ++) {
for (int cell_y = 0; cell_y < MapMgrClass::CLOUD_HEIGHT; cell_y ++) {
map_ctrl->Set_Cloud_Cell (cell_x, cell_y, MapMgrClass::Is_Cell_Visible (cell_x, cell_y));
}
}
//
// Now add a marker that represents Havoc to the map
//
if (COMBAT_STAR && MapMgrClass::Is_Player_Marker_Visible ()) {
Vector3 pos;
COMBAT_STAR->Get_Position (&pos);
map_ctrl->Add_Marker (TRANSLATE (IDS_MENU_HAVOC), pos, RectClass (0, 0, 31, 31));
}
//
// Add all the objective markers
//
int count = ObjectiveManager::Get_Objective_Count ();
for (int index = 0; index < count; index ++) {
Objective *objective = ObjectiveManager::Get_Objective (index);
//
// Is this an objective we should put on the map?
//
if ( objective != NULL &&
objective->Status == ObjectiveManager::STATUS_IS_PENDING)
{
//
// Now add a marker that represents this objective
//
int color = VRGB_TO_INT32 (objective->Type_To_Color ());
int item_index = map_ctrl->Add_Marker (L"", objective->Position, RectClass (32, 0, 64, 32), color);
map_ctrl->Set_Marker_Data (item_index, (uint32)objective);
}
}
//
// Make sure that Havoc is in view
//
if (COMBAT_STAR != NULL && MapMgrClass::Is_Player_Marker_Visible ()) {
map_ctrl->Center_View_About_Marker (0);
}
}
//
// Configure the list control
//
ListCtrlClass *list_ctrl = (ListCtrlClass *)Get_Dlg_Item (IDC_OBJECT_DESC_LIST);
if (list_ctrl != NULL) {
list_ctrl->Add_Column (L"", 1.0F, Vector3 (1, 1, 1));
}
ChildDialogClass::On_Init_Dialog ();
return ;
}
////////////////////////////////////////////////////////////////
//
// On_MapCtrl_Marker_Hilighted
//
////////////////////////////////////////////////////////////////
void
EvaMapTabClass::On_MapCtrl_Marker_Hilighted
(
MapCtrlClass * map_ctrl,
int ctrl_id,
int marker_index
)
{
ListCtrlClass *list_ctrl = (ListCtrlClass *)Get_Dlg_Item (IDC_OBJECT_DESC_LIST);
ImageCtrlClass *image_ctrl = (ImageCtrlClass *)Get_Dlg_Item (IDC_IMAGE);
if (list_ctrl == NULL || image_ctrl == NULL) {
return ;
}
//
// Reset the objective description list
//
list_ctrl->Delete_All_Entries ();
image_ctrl->Set_Texture (NULL);
if (marker_index == 0) {
//
// Let the user know its Havoc
//
list_ctrl->Insert_Entry (0, TRANSLATE (IDS_MENU_NAME_HAVOC));
} else if (marker_index > 0) {
//
// Display the objective information
//
Objective *objective = (Objective *)map_ctrl->Get_Marker_Data (marker_index);
if (objective != NULL) {
WideStringClass name = TRANSLATE (objective->ShortDescriptionID);
WideStringClass string;
string.Format (TRANSLATE (IDS_MENU_NAME_FORMAT), (const WCHAR *)name);
list_ctrl->Insert_Entry (0, string);
string.Format (TRANSLATE (IDS_MENU_PRIORITY_FORMAT), objective->Type_To_Name ());
list_ctrl->Insert_Entry (1, string);
list_ctrl->Set_Entry_Color (1, 0, objective->Type_To_Color ());
string.Format (TRANSLATE (IDS_MENU_STATUS_FORMAT), objective->Status_To_Name ());
list_ctrl->Insert_Entry (2, string);
list_ctrl->Insert_Entry (3, L"");
//
// Lookup the translation object from the strings database
//
TDBObjClass *translate_obj = TranslateDBClass::Find_Object (objective->LongDescriptionID);
if (translate_obj != NULL) {
list_ctrl->Insert_Entry (4, translate_obj->Get_String ());
}
//
// Configure the POG icon
//
image_ctrl->Set_Texture (objective->HUDPogTextureName);
}
}
return ;
}
////////////////////////////////////////////////////////////////
//
// On_MapCtrl_Pos_Clicked
//
////////////////////////////////////////////////////////////////
void
EvaMapTabClass::On_MapCtrl_Pos_Clicked
(
MapCtrlClass * map_ctrl,
int ctrl_id,
const Vector3 & position
)
{
float start_z = 1000;
float end_z = -1000;
//
// Setup a raycast at this (x,y) position to find the z position
//
CastResultStruct result;
LineSegClass ray (Vector3 (position.X, position.Y, start_z), Vector3 (position.X, position.Y, end_z));
PhysRayCollisionTestClass raytest (ray, &result, 0, COLLISION_TYPE_PROJECTILE);
PhysicsSceneClass::Get_Instance ()->Cast_Ray (raytest);
Vector3 world_space_pos = position;
//
// Calculate what the z-position is
//
if (result.Fraction < 1.0F) {
world_space_pos.Z = start_z + (end_z - start_z) * result.Fraction;
}
//
// Warp the player to this position
//
COMBAT_STAR->Set_Position (world_space_pos);
//
// Return to the game
//
//extern void Continue_Game (void);
//Continue_Game ();
GameInitMgrClass::Continue_Game();
return ;
}