Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

1052 lines
30 KiB
C++

// ResourceWindow.cpp : implementation file
//
#include "stdafx.h"
#include "MW4GameEd.h"
#include "ResourceWindow.h"
#include "EditorChildWnd.h"
#include "MW4GameEd.h"
#include <direct.h>
#include <stdlib.h>
#include <stdio.h>
#include <Adept\Map.hpp>
#include "MoveCommand.h"
#include "AddCommand.h"
#include "SprayCommand.h"
#include <Adept\EntityManager.hpp>
#include <Adept\Mission.hpp>
#include <Adept\Connection.hpp>
#include <Adept\Application.hpp>
#include <Adept\NameTable.hpp>
#include <Adept\EntityClassData.hpp>
#include <MW4\Vehicle.hpp>
#include <MW4\Building.hpp>
#include "EditorWaypoint.h"
#include <MW4\rail_move.hpp>
#include "MW4\path.hpp"
#include "DisplayWindow.h"
#include "OverviewWindow.h"
#include "InstanceWindow.h"
#include "Selection.h"
#include <MW4\MWTool.hpp>
#include <NavPoint.hpp>
#include <mw4\Cultural.hpp>
#include <mw4\noncom.hpp>
#include <Adept\navpoint.hpp>
#include "ProgDlg.h"
extern CMW4GameEdApp theApp;
Entity* CreateNewInstanceSimple(char* game_model_name, char* entity_name, char* instance_name);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CResourceWindow
IMPLEMENT_DYNCREATE(CResourceWindow, CEditorChildWnd)
CResourceWindow::CResourceWindow() :
mechList(NULL),
buildingList(NULL),
vehicleList(NULL),
miscList(NULL),
tabListIterator(NULL)
{
CString title;
RECT rect;
TLDlg = NULL;
title.LoadString(IDS_RESOURCEWINDOWTITLE);
rect.top = 210; rect.left = 650; rect.bottom = 400; rect.right = 900;
Create(NULL,title,WS_CHILD | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW | WS_VISIBLE,rect);//,theApp.m_pMainWnd,0);
numEntitiesAdded = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
CResourceWindow::~CResourceWindow()
{
objectInformation->IgnoreChanges();
Unregister_Object(objectInformation);
delete objectInformation;
TabList* current;
ChainIteratorOf<TabList*> mechIterator(&mechList);
while((current = mechIterator.GetCurrent()) != NULL)
{
mechIterator.Remove();
mechIterator.First();
delete current;
}
ChainIteratorOf<TabList*> buildingIterator(&buildingList);
while((current = buildingIterator.GetCurrent()) != NULL)
{
buildingIterator.Remove();
buildingIterator.First();
delete current;
}
ChainIteratorOf<TabList*> vehicleIterator(&vehicleList);
while((current = vehicleIterator.GetCurrent()) != NULL)
{
vehicleIterator.Remove();
vehicleIterator.First();
delete current;
}
ChainIteratorOf<TabList*> miscIterator(&miscList);
while((current = miscIterator.GetCurrent()) != NULL)
{
miscIterator.Remove();
miscIterator.First();
delete current;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
BEGIN_MESSAGE_MAP(CResourceWindow,CEditorChildWnd)
//{{AFX_MSG_MAP(CResourceWindow)
ON_WM_LBUTTONDBLCLK()
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_KEYDOWN()
ON_WM_RBUTTONDBLCLK()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CResourceWindow message handlers
void CResourceWindow::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if(Application::Instance->GetApplicationState()
== ApplicationStateEngine::RunningGameState)
{
theApp.m_editorState = CMW4GameEdApp::WaitingToAddState;
Entity* entity = CreateNewInstance();
if (entity != NULL)
{
if (theApp.m_editorState == CMW4GameEdApp::WaitingToAddState)
theApp.m_editorState = CMW4GameEdApp::AddingObjectState;
}
else
{
theApp.m_editorState = CMW4GameEdApp::IdleState;
}
}
CEditorChildWnd::OnLButtonDblClk(nFlags, point);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Entity* CResourceWindow::CreateNewInstance(char* game_model_name, char* entity_name, char* instance_name)
{
Entity* entity = NULL;
Check_Object(theApp.resourceWindow->objectInformation);
Page *entity_instance = theApp.resourceWindow->objectInformation->FindPage(instance_name);
if(!entity_instance)
{
PAUSE(("That item does not have an instance in editor.contents"));
return (NULL);
}
else
{
FileDependencies dummy;
FileDependencies *parent = Resource::ParentFileDependencies;
Resource::ParentFileDependencies = &dummy;
entity_instance->SetEntry("Model", game_model_name);
DynamicMemoryStream entity_stream;
ReplicatorID entity_id = ReplicatorID::Null;
Entity::CreateMessage* create_message =
Tool::Instance->ConstructCreateMessage(
&entity_stream,
entity_instance,
&entity_id
);
//
// set the default alignment based on the editor settings
//
create_message->alignment = theApp.GetDefaultAlignmentForPlacedObjects();
LinearMatrix4D matrix = LinearMatrix4D::Identity;
Point3D point;
point.x = 0.0f;
point.z = 0.0f;
point.y = theApp.displayWindow->GetMapPointVertical(point.x,point.z);
matrix.BuildTranslation(point);
create_message->localToParent = matrix;
entity_stream.Rewind();
Check_Object(Connection::Local);
entity_id = Connection::Local->GetNextReplicatorID();
entity = Entity::CreateEntity(
&entity_stream,
&entity_id,
false
);
//
//--------------------------------------------
//Make some initial assignments for the entity
//--------------------------------------------
//
Check_Object(entity);
Check_Object(EntityManager::Instance);
EntityManager::Instance->GetNameSocket()->Remove(entity);
entity->instanceName = theApp.resourceWindow->AssignObjectName(entity_name, &theApp.resourceWindow->numEntitiesAdded);
if (entity->IsDerivedFrom(Vehicle::DefaultData))
{
Vehicle* vehicle = Cast_Object(Vehicle*,entity);
EntityManager::Instance->RemoveMover(vehicle);
EntityManager::Instance->AddMover(vehicle);
}
EntityManager::Instance->GetNameSocket()->AddValue(entity, entity->instanceName);
Check_Object(Map::Instance);
Map::Instance->AddChild(entity);
MLRTexturePool::Instance->LoadImages();
entity->SetPropType(Entity::MissionPropType);
theApp.displayWindow->SetFocus();
entity->SyncMatrices(true);
Map::Instance->UpdateZone(entity);
CSelectionList::Instance->AddSelection(entity);
CSelectionList::Instance->RemoveCollision();
Resource::ParentFileDependencies = parent;
}
return entity;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Entity* CResourceWindow::CreateNewInstance(Entity* entity)
{
static recurseGuard = false;
TLDlg->m_ObjList.EnableWindow(FALSE);
theApp.instanceWindow->TLDlg->m_ObjList.EnableWindow(FALSE);
CSelectionList::Instance->ClearSelectionList();
theApp.m_MultiDrop = true;
int item = TLDlg->m_ObjList.GetCurSel();
if(Application::Instance->GetApplicationState()
== ApplicationStateEngine::RunningGameState)
{
const char *game_model_name = (char *)TLDlg->m_ObjList.GetItemData(item);
char entity_name[MAX_PATH];
int length = TLDlg->m_ObjList.GetText(item,entity_name);
Verify(length < MAX_PATH);
char instance_name[MAX_PATH];
TLDlg->m_ObjList.GetText(item,instance_name);
entity = CreateNewInstance((char*)game_model_name,entity_name,instance_name);
if (entity == NULL)
{
TLDlg->m_ObjList.EnableWindow(TRUE);
theApp.instanceWindow->TLDlg->m_ObjList.EnableWindow(TRUE);
theApp.m_MultiDrop = false;
return (NULL);
}
if (entity->IsDerivedFrom(EditorLatticeNode::DefaultData))
{
Point3D pos;
pos = entity->GetLocalToWorld();
MW4AI::CRailNode* railNode;
SPEW(("scottjan","Hey! set up a default railnode radius"));
railNode = new MW4AI::CRailNode(pos,50);
MW4AI::g_MissionGraph->AddNode(railNode);
EditorLatticeNode* latticeNode = Cast_Object(EditorLatticeNode*,entity);
latticeNode->railNode = railNode;
theApp.CreateLatticeNodeRadius(latticeNode);
theApp.m_showLattice = false;
theApp.OnToolsMovementlattice();
// theApp.m_showLatticeLinks = false;
// theApp.OnToolsMovmentlayerShowlatticelinks();
}
else if (entity->IsDerivedFrom(EditorMovementPath::DefaultData))
{
if (theApp.m_CurPath == NULL)
{
EditorMovementPath* path;
path = Cast_Object(EditorMovementPath*, entity);
path->pathSlot.Remove();
path->pathSlot.Add(CreateMovementPath());
theApp.m_CurPath = path;
theApp.m_CurPathNodeCount = 0;
theApp.m_LastPathNode = NULL;
path->instanceName = path->pathSlot.GetCurrent()->instanceName;
// path->GetElement()->SetAlwaysCullMode();
path->GetElement()->Sync();
theApp.instanceWindow->ResetInstanceLists();
}
else // quick hack, if we are appending to a path we need to destroy the new one we just created
{
entity->SentenceToDeathRow();
}
entity = CreateNewInstance("Content\\Editor\\Reserved\\PathNode\\PathNode.data",
"PathNode","PathNode");
CSelectionList::Instance->ClearSelectionList();
CSelectionList::Instance->AddSelection(entity);
CSelectionList::Instance->RemoveCollision();
Point3D point;
point = entity->GetLocalToWorld();
theApp.m_CurPath->pathSlot.GetCurrent()->pathPoints.push_back(point);
EditorPathNode* pathNode;
pathNode = Cast_Object(EditorPathNode*,entity);
pathNode->pathSlot.Remove();
pathNode->pathSlot.Add(theApp.m_CurPath);
theApp.m_CurPath->pathNodes.Add(pathNode);
pathNode->index = theApp.m_CurPathNodeCount++;
pathNode->nextnode = NULL;
pathNode->prevnode = theApp.m_LastPathNode;
if (theApp.m_LastPathNode)
theApp.m_LastPathNode->nextnode = pathNode;
pathNode->CreateLink();
theApp.m_LastPathNode = pathNode;
theApp.m_showPaths = false;
theApp.OnToolsMovmentlayerShowpaths();
}
else if (entity->IsDerivedFrom(EditorDropNode::DefaultData))
{
EditorDropNode* node;
node = Cast_Object(EditorDropNode*,entity);
node->SetDropZone(NULL); // will create a new Adept::DropZone and attach it to EditorDropNode
theApp.m_showDropZones = false;
theApp.OnToolsMovmentlayerShowdropzones();
}
else if (entity->IsDerivedFrom(EditorObjectiveMarker::DefaultData))
{
EditorObjectiveMarker* node;
node = Cast_Object(EditorObjectiveMarker*,entity);
node->SetObjective(NULL); // will create a new MechWarrior4::Objective and attach it to EditorDropNode
theApp.m_showAI = false;
theApp.OnToolsMovmentlayerShowobjectives();
}
else if (entity->IsDerivedFrom(NavPoint::DefaultData))
{
NavPoint* node;
node = Cast_Object(NavPoint*,entity);
node->SetToDisplay();
}
else if (entity->IsDerivedFrom(EditorLight::DefaultData))
{
EditorLight* editorLight;
editorLight = Cast_Object(EditorLight*,entity);
editorLight->SetLight();
}
else if (entity->IsDerivedFrom(EditorCameraShip::DefaultData))
{
EditorCameraShip* node;
node = Cast_Object(EditorCameraShip*,entity);
node->SetCameraShip(NULL); // will create a new CameraShip and attach it to EditorDropNode
}
#if 0
if (theApp.m_editorState == CMW4GameEdApp::AddingObjectState)
{
theApp.currentCommand = new AddCommand(entity);
Register_Object(theApp.currentCommand);
}
else if (!recurseGuard && entity->IsDerivedFrom(Building::DefaultData))
{
recurseGuard = true;
theApp.currentCommand = new SprayCommand(entity);
Register_Object(theApp.currentCommand);
recurseGuard = false;
}
#endif
if ((!recurseGuard && entity->IsDerivedFrom(Building::DefaultData)) &&
(theApp.m_editorState == CMW4GameEdApp::WaitingToSprayState))
{
recurseGuard = true;
theApp.currentCommand = new SprayCommand(entity);
Register_Object(theApp.currentCommand);
recurseGuard = false;
theApp.m_editorState = CMW4GameEdApp::SprayingState;
}
else if(theApp.m_editorState == CMW4GameEdApp::WaitingToAddState)
{
theApp.currentCommand = new AddCommand(entity);
Register_Object(theApp.currentCommand);
theApp.m_editorState = CMW4GameEdApp::AddingObjectState;
if (entity->IsDerivedFrom(EditorAmbientLight::DefaultData) ||
entity->IsDerivedFrom(EditorInfiniteLight::DefaultData) ||
entity->IsDerivedFrom(EditorObjectiveMarker::DefaultData))
{
entity->GetElement()->SetAlwaysCullMode();
CSelectionList::Instance->ClearSelectionList();
theApp.m_editorState = CMW4GameEdApp::SelectingObjectState;
theApp.m_MultiDrop = false;
theApp.resourceWindow->TLDlg->m_ObjList.EnableWindow();
theApp.instanceWindow->TLDlg->m_ObjList.EnableWindow();
// theApp.instanceWindow->AddInstance(entity);
}
}
}
theApp.displayWindow->SetFocus(); // rqr'd for multi instace add
return entity;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int CResourceWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEditorChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
TLDlg = new CObjWindow;
TLDlg->Create(CObjWindow::IDD,this);
RECT r;
memset(&r,0,sizeof(r));
TLDlg->m_ObjList.Create(WS_VISIBLE | WS_CHILD | LBS_NOINTEGRALHEIGHT | LBS_STANDARD,r,TLDlg,0);
TLDlg->GetDlgItem(IDC_INSTANCEALINGMENTBTN)->ShowWindow(SW_HIDE);
TLDlg->GetDlgItem(IDC_INSTANCETYPEBTN)->ShowWindow(SW_HIDE);
TLDlg->ShowWindow(SW_SHOW);
//
//----------------------------------------
//Initialize the Instance Information File
//----------------------------------------
//
objectInformation = new NotationFile("Content\\Editor\\editor.contents");
Register_Object(objectInformation);
{
MString vehicle_path = Working_Directory;
vehicle_path += "\\Content\\Mechs\\*.*";
Directory *vehicle_directory;
vehicle_directory = new Directory(vehicle_path, true);
Register_Object(vehicle_directory);
TLDlg->m_TabCtrl.InsertItem(0,TLDlg->mechTab);
vehicle_path.IsolateDirectory();
MakeDirectoryList(
vehicle_directory,
MECH_TAB,
vehicle_path
);
Unregister_Object(vehicle_directory);
delete vehicle_directory;
}
//
//-----------------------------------------
//Initialize the Building Folder in Content
//-----------------------------------------
//
{
MString prop_path = Working_Directory;
prop_path += "\\Content\\Buildings\\*.*";
Directory *prop_directory;
prop_directory = new Directory(prop_path, true);
Check_Object(prop_directory);
Register_Object(prop_directory);
TLDlg->m_TabCtrl.InsertItem(1,TLDlg->buildingTab);
prop_path.IsolateDirectory();
MakeDirectoryList(
prop_directory,
BUILDING_TAB,
prop_path
);
Unregister_Object(prop_directory);
delete prop_directory;
}
//
//-----------------------------------------
//Initialize the Vehicles Folder in Content
//-----------------------------------------
//
{
MString vehicle_path = Working_Directory;
vehicle_path += "\\Content\\Vehicles\\*.*";
Directory *vehicle_directory;
vehicle_directory = new Directory(vehicle_path, true);
Register_Object(vehicle_directory);
TLDlg->m_TabCtrl.InsertItem(2,TLDlg->vehicleTab);
vehicle_path.IsolateDirectory();
MakeDirectoryList(
vehicle_directory,
VEHICLE_TAB,
vehicle_path
);
Unregister_Object(vehicle_directory);
delete vehicle_directory;
}
{
/*
MString prop_path = Working_Directory;
prop_path += "\\Content\\DropZones\\*.*";
Directory *prop_directory;
prop_directory = new Directory(prop_path, true);
Check_Object(prop_directory);
Register_Object(prop_directory);
Stuff::IsolateDirectory(&prop_path);
MakeDirectoryList(
prop_directory,
MISC_TAB,
prop_path
);
Unregister_Object(prop_directory);
delete prop_directory;
*/
TLDlg->m_TabCtrl.InsertItem(3,TLDlg->miscTab);
MString prop_path = Working_Directory;
prop_path += "\\Content\\Editor\\Waypoints\\*.*";
Directory *prop_directory = new Directory(prop_path, true);
Check_Object(prop_directory);
Register_Object(prop_directory);
prop_path.IsolateDirectory();
MakeDirectoryList(
prop_directory,
MISC_TAB,
prop_path
);
Unregister_Object(prop_directory);
delete prop_directory;
}
TLDlg->m_TabCtrl.SetCurSel(0);
FillTabBox(0);
return 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void CResourceWindow::OnSize(UINT nType, int cx, int cy)
{
CEditorChildWnd::OnSize(nType, cx, cy);
if(TLDlg)
{
TLDlg->SetWindowPos(NULL,0,0,cx,cy,SWP_NOZORDER);
TLDlg->m_TabCtrl.SetWindowPos(NULL,0,0,cx,cy,SWP_NOZORDER);
RECT r,l;
TLDlg->m_TabCtrl.GetClientRect(&r);
TLDlg->m_TabCtrl.GetItemRect(0,&l);
TLDlg->m_ObjList.SetWindowPos(NULL,3,l.bottom + 3,r.right - 7,r.bottom - l.bottom - 7,SWP_NOZORDER);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void CResourceWindow::OnPaint()
{
CPaintDC dc(this); // device context for painting
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MString
CResourceWindow::AssignObjectName(MString name, int *num)
{
MString object_name;
char number[256];
//
// Make the object name
//
sprintf(number, "%i", *num);
(*num)++;
object_name = name;
object_name += "_";
object_name += number;
while (CheckObjectName(object_name))
{
sprintf(number, "%i", *num);
(*num)++;
object_name = name;
object_name += "_";
object_name += number;
}
return object_name;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
CResourceWindow::MakeDirectoryList(
Directory *current_directory,
int tabNumber,
MString directory_name
)
{
static int recursionDepth = 0;
Check_Pointer (this);
Check_Pointer(current_directory);
MString file_directory_name;
file_directory_name = directory_name;
file_directory_name.StripExtension();
file_directory_name += "*.data";
Directory *file_directory = new Directory(file_directory_name, false);
Register_Object(file_directory);
MString file_name;
while((char *)(file_name = file_directory->GetCurrentFileName()) != NULL)
{
file_name.StripExtension();
file_name.ToLower();
if (file_name == "basic")
{
file_directory->AdvanceCurrentFile();
continue;
}
TabList* newNode = new TabList;
newNode->itemString = file_name;
newNode->itemPath = directory_name;
newNode->itemPath += file_name;
newNode->itemPath += ".data";
char appended_data[MAX_PATH];
strcpy(appended_data, strstr(newNode->itemPath.GetBuffer(MAX_PATH - 1), "Content"));
newNode->itemPath = appended_data;
if (file_name == "navpoint")
{
miscList.Add(newNode);
}
else
{
switch (tabNumber)
{
case MECH_TAB:
mechList.Add(newNode);
break;
case BUILDING_TAB:
buildingList.Add(newNode);
break;
case VEHICLE_TAB:
vehicleList.Add(newNode);
break;
case MISC_TAB:
miscList.Add(newNode);
break;
}
}
file_directory->AdvanceCurrentFile();
}
Unregister_Object(file_directory);
delete file_directory;
if (recursionDepth > 0)
{
recursionDepth--;
return;
}
MString folder_name;
while((char *)(folder_name = current_directory->GetCurrentFolderName()) != NULL)
{
MString new_directory_name = directory_name;
new_directory_name += folder_name;
new_directory_name += "\\*.*";
Directory *new_directory = new Directory(new_directory_name, true);
Register_Object(new_directory);
new_directory_name.IsolateDirectory();
recursionDepth++;
MakeDirectoryList(
new_directory,
tabNumber,
new_directory_name
);
Unregister_Object(new_directory);
delete new_directory;
current_directory->AdvanceCurrentFolder();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
CResourceWindow::CheckObjectName(MString name)
{
Check_Object(EntityManager::Instance);
if(EntityManager::Instance->GetNameSocket()->Find(name))
{
return true;
}
return false;
}
void CResourceWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// if (theApp.m_editorState != CMW4GameEdApp::AddingObjectState)
CEditorChildWnd::OnKeyDown(nChar, nRepCnt, nFlags);
// else if (nChar == VK_ESCAPE)
// theApp.StopMultiPlace();
}
void CResourceWindow::FillTabBox(int tabNumber)
{
switch (tabNumber)
{
case MECH_TAB:
{
ChainIteratorOf<TabList*> iterator(&mechList);
FillTabBox(iterator);
break;
}
case BUILDING_TAB:
{
ChainIteratorOf<TabList*> iterator(&buildingList);
FillTabBox(iterator);
break;
}
case VEHICLE_TAB:
{
ChainIteratorOf<TabList*> iterator(&vehicleList);
FillTabBox(iterator);
break;
}
case MISC_TAB:
{
ChainIteratorOf<TabList*> iterator(&miscList);
FillTabBox(iterator);
break;
}
}
}
void CResourceWindow::FillTabBox(ChainIteratorOf<TabList*> &iterator)
{
TLDlg->m_ObjList.ResetContent();
TabList* item;
while ((item = iterator.ReadAndNext()) != NULL)
{
int index = TLDlg->m_ObjList.AddString(item->itemString);
TLDlg->m_ObjList.SetItemDataPtr(index,(void*)LPCTSTR(item->itemPath));
}
}
BOOL CResourceWindow::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if (UINT(wParam) == IDC_OBJECTTAB)
FillTabBox(((NMHDR*)(lParam))->code);
*pResult = 0;
return CEditorChildWnd::OnNotify(wParam, lParam, pResult);
}
MechWarrior4::Path* CResourceWindow::CreateMovementPath()
{
Resource model_resource;
SPEW(("scottjan","Get rid of the hard coded data file"));
NotationFile path_file("Content\\Misc\\Path.data");
Tool::Instance->ConstructDataList(&model_resource, &path_file);
Check_Object(&model_resource);
Verify(model_resource.DoesResourceExist());
Entity::ClassID class_ID;
class_ID = Entity::GetClassIDFromDataListID(model_resource.GetResourceID());
Verify(class_ID != NullClassID);
LinearMatrix4D matrix = LinearMatrix4D::Identity;
MechWarrior4::Path::CreateMessage Path_Create_Message(
sizeof(MechWarrior4::Path::CreateMessage),
DefaultEventPriority,
MechWarrior4::Path::CreateMessage::DefaultFlags,
class_ID,
MechWarrior4::Path::DefaultFlags,
model_resource.GetResourceID(),
matrix,
0.0f,
Entity__ExecutionStateEngine::AlwaysExecuteState,
NameTable::NullObjectID,
Entity::DefaultAlignment,
ResourceID::Null
);
MemoryStream stream(&Path_Create_Message, Path_Create_Message.messageLength);
ReplicatorID Path_id = Connection::Local->GetNextReplicatorID();
Entity* entity;
entity = Entity::CreateEntity(&stream, &Path_id, false);
Check_Object(entity);
Verify(entity->IsDerivedFrom(Path::DefaultData));
Check_Object(EntityManager::Instance);
EntityManager::Instance->GetNameSocket()->Remove(entity);
entity->instanceName = theApp.resourceWindow->AssignObjectName("Path", &theApp.resourceWindow->numEntitiesAdded);
EntityManager::Instance->GetNameSocket()->AddValue(entity, entity->instanceName);
Check_Object(Map::Instance);
Map::Instance->AddChild(entity);
MLRTexturePool::Instance->LoadImages();
CSelectionList::Instance->RemoveCollision();
entity->SetPropType(Entity::MissionPropType);
entity->SyncMatrices(true);
Verify(entity->IsDerivedFrom(Path::DefaultData));
NameTable::Instance->AddEntry(entity, NameTable::PathArray);
NameTable::Instance->IsValid();
MechWarrior4::Path* path;
path = Cast_Object(MechWarrior4::Path*, entity);
return (path);
}
void CResourceWindow::OnRButtonDblClk(UINT nFlags, CPoint point)
{
if(Application::Instance->GetApplicationState()
== ApplicationStateEngine::RunningGameState)
{
if (TLDlg->m_TabCtrl.GetCurSel() == BUILDING_TAB)
{
theApp.m_editorState = CMW4GameEdApp::WaitingToSprayState;
Entity* entity = CreateNewInstance();
if (entity != NULL)
{
theApp.m_editorState = CMW4GameEdApp::SprayingState;
}
else
{
theApp.m_editorState = CMW4GameEdApp::IdleState;
}
}
}
CEditorChildWnd::OnRButtonDblClk(nFlags, point);
}
void CResourceWindow::DisperseWithBitmap(bool cultural_flag)
{
CFileDialog fdlg(TRUE,NULL,NULL,NULL,"Bitmap Images (*.tif,*.gif,*.tga)|*.tif;*.gif;*.tga||",NULL);
if(fdlg.DoModal()==IDOK)
{
Image img;
img.Load((char *)(LPCSTR)fdlg.GetPathName());
img.Rotate180();
SetCurrentDirectory(Working_Directory);
BYTE *dat=img.Lock();
int x,y;
Scalar minz,maxz,minx,maxx,xsize,zsize;
float gridxsize,gridzsize;
Map::Instance->GetMapExtents(&minz,&maxz,&minx,&maxx);
xsize=maxx-minx;
zsize=maxz-minz;
int total=img.GetHeight()*img.GetWidth();
int current=0;
CProgressDlg *ProgressDlg;
ProgressDlg = new CProgressDlg(IDS_DISPERSE);
ProgressDlg->Create();
ProgressDlg->ShowWindow(SW_SHOW);
ProgressDlg->SetRange(0,total);
ProgressDlg->SetStep(50);
ProgressDlg->SetPos(0);
gridxsize=xsize/img.GetWidth();
gridzsize=zsize/img.GetHeight();
int item = TLDlg->m_ObjList.GetCurSel();
const char *game_model_name = (char *)TLDlg->m_ObjList.GetItemData(item);
char entity_name[MAX_PATH];
int length = TLDlg->m_ObjList.GetText(item,entity_name);
Verify(length < MAX_PATH);
char instance_name[MAX_PATH];
TLDlg->m_ObjList.GetText(item,instance_name);
CSelectionList::Instance->ClearSelectionList();
for(y=0;y<img.GetHeight();y++)
for(x=0;x<img.GetWidth();x++)
{
current++;
if((current%50 || current==total)) ProgressDlg->SetPos(current);
if(dat[x+img.GetPitch()*y])
{
Entity *entity = NULL;
entity = CreateNewInstanceSimple((char*)game_model_name,entity_name,instance_name);
Point3D pos;
YawPitchRoll rot;
Stuff::LinearMatrix4D mat;
do
{
rot.yaw=Stuff::Random::GetFraction()*Two_Pi;
rot.pitch=0.0f;
rot.roll=0.0f;
pos.x=x*gridxsize+Stuff::Random::GetFraction()*gridxsize;
pos.z=y*gridzsize+Stuff::Random::GetFraction()*gridzsize;
pos.y=theApp.displayWindow->GetMapPointVertical(pos.x,pos.z);
mat.BuildRotation(rot);
mat.BuildTranslation(pos);
Map::Instance->AddChild(entity);
entity->SetNewLocalToParent(mat);
entity->SyncMatrices(true);
Map::Instance->UpdateZone(entity);
}
while(entity->IsMultiZone());
if ( entity->IsMultiTile())
{
Map::Instance->RemoveChild(entity);
NameTable::Instance->RemoveEntry(entity->objectID);
NameTable::Instance->IsValid();
delete Cast_Object(Stuff::Plug *, entity);
}
else
{
Check_Object(NameTable::Instance);
entity->BindToTile();
if(entity->IsDerivedFrom(Vehicle::DefaultData))
NameTable::Instance->AddEntry(entity, NameTable::VehicleArray);
else if(entity->IsDerivedFrom(Building::DefaultData) || entity->IsDerivedFrom(Cultural::DefaultData))
NameTable::Instance->AddEntry(entity, NameTable::BuildingArray);
else if(entity->IsDerivedFrom(NavPoint::DefaultData))
NameTable::Instance->AddEntry(entity, NameTable::NavArray);
else if(entity->IsDerivedFrom(NonCom::DefaultData))
NameTable::Instance->AddEntry(entity, NameTable::BuildingArray);
else if(entity->IsDerivedFrom(AI::DefaultData))
NameTable::Instance->AddEntry(entity, NameTable::AIArray);
NameTable::Instance->IsValid();
if(cultural_flag) theApp.culturalList.Add(entity);
}
}
}
delete ProgressDlg;
img.UnLock();
}
theApp.instanceWindow->ResetInstanceLists();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Entity* CreateNewInstanceSimple(char* game_model_name, char* entity_name, char* instance_name)
{
Entity* entity = NULL;
Check_Object(theApp.resourceWindow->objectInformation);
Page *entity_instance = theApp.resourceWindow->objectInformation->FindPage(instance_name);
if(!entity_instance)
{
PAUSE(("That item does not have an instance in editor.contents"));
}
else
{
FileDependencies dummy;
FileDependencies *parent = Resource::ParentFileDependencies;
Resource::ParentFileDependencies = &dummy;
entity_instance->SetEntry("Model", game_model_name);
DynamicMemoryStream entity_stream;
ReplicatorID entity_id = ReplicatorID::Null;
Entity::CreateMessage* create_message =
Tool::Instance->ConstructCreateMessage(
&entity_stream,
entity_instance,
&entity_id
);
//
// set the default alignment based on the editor settings
//
create_message->alignment = theApp.GetDefaultAlignmentForPlacedObjects();
LinearMatrix4D matrix = LinearMatrix4D::Identity;
create_message->localToParent = matrix;
entity_stream.Rewind();
Check_Object(Connection::Local);
entity_id = Connection::Local->GetNextReplicatorID();
entity = Entity::CreateEntity(
&entity_stream,
&entity_id,
false
);
//
//--------------------------------------------
//Make some initial assignments for the entity
//--------------------------------------------
//
Check_Object(entity);
Check_Object(EntityManager::Instance);
EntityManager::Instance->GetNameSocket()->Remove(entity);
entity->instanceName = theApp.resourceWindow->AssignObjectName(entity_name, &theApp.resourceWindow->numEntitiesAdded);
if (entity->IsDerivedFrom(Vehicle::DefaultData))
{
Vehicle* vehicle = Cast_Object(Vehicle*,entity);
EntityManager::Instance->RemoveMover(vehicle);
EntityManager::Instance->AddMover(vehicle);
}
EntityManager::Instance->GetNameSocket()->AddValue(entity, entity->instanceName);
entity->SetPropType(Entity::MissionPropType);
Resource::ParentFileDependencies = parent;
}
return entity;
}