Files
firestorm/Gameleap/code/mw4/Libraries/Adept/AttributeWatcher.hpp
T
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

237 lines
6.3 KiB
C++

//===========================================================================//
// File: watcher.hpp //
// Project: MUNGA Brick: Watcher //
// Contents: //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- -----------------------------------------------------------//
// 3/02/97 JMA Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1997, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#pragma once
#include "Adept.hpp"
#include "Channel.hpp"
#include "Entity.hpp"
#include "EntityClassData.hpp"
#include "Attribute.hpp"
namespace Adept {
//##########################################################################
//######################### AttributeWatcherOf ###########################
//##########################################################################
template <class T, int ID> class AttributeWatcherOf:
public ChannelOf<T>
{
public:
static void
InitializeClass();
static void
TerminateClass();
typedef ChannelOf<T> BaseClass;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Constructor/Destructor
//
public:
~AttributeWatcherOf();
static AttributeWatcherOf<T, ID>*
Make(
MemoryStream *stream,
ComponentWeb *owning_web,
Entity *entity
);
protected:
AttributeWatcherOf(
ClassData *class_data,
MemoryStream *stream,
ComponentWeb *owning_web,
Entity *entity
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Virtual data
//
public:
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Data flow
//
public:
void
Execute();
protected:
Entity
*entity;
AttributeEntry
*attributeEntry;
Scalar
differenceThreshold;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Tool Support
//
public:
static ClassData*
CreateFactoryRequest(
FactoryRequestParameters *parameters,
Entity::ClassData *class_data
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Test Support
//
public:
void
TestInstance();
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
template <class T, int ID> AttributeWatcherOf<T, ID>::ClassData*
AttributeWatcherOf<T, ID>::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
template <class T, int ID> void
AttributeWatcherOf<T, ID>::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
template <class T, int ID> AttributeWatcherOf<T, ID>::~AttributeWatcherOf()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
template <class T, int ID> AttributeWatcherOf<T, ID>::AttributeWatcherOf(
ClassData *class_data,
MemoryStream *stream,
ComponentWeb *owning_web,
Entity *watched_entity
):
ChannelOf<T>(class_data, stream, owning_web)
{
int attribute_id;
*stream >> attribute_id;
*stream >> differenceThreshold;
entity = watched_entity;
Check_Object(entity);
attributeEntry = entity->GetAttributeEntry(attribute_id);
Check_Object(attributeEntry);
Verify(attributeEntry->attributeType == ID);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
template <class T, int ID> void
AttributeWatcherOf<T, ID>::Execute()
{
Check_Object(attributeEntry);
if (
attributeEntry->GetChangedValue(
entity,
&channelOutput,
&channelOutput,
differenceThreshold
)
)
{
NotifyDependantsOfChange();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
template <class T, int ID> void
AttributeWatcherOf<T, ID>::TestInstance()
{
Verify(IsDerivedFrom(DefaultData));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
template <class T, int ID> AttributeWatcherOf<T, ID>::ClassData*
AttributeWatcherOf<T, ID>::CreateFactoryRequest(
FactoryRequestParameters *parameters,
Entity::ClassData *class_data
)
{
bool result = BaseClass::CreateFactoryRequest(parameters) != NULL;
//
//-------------------------
// Read the attribute field
//-------------------------
//
MemoryStream *component_stream = parameters->m_stream;
Check_Object(component_stream);
Page *page = parameters->m_page;
Check_Object(page);
NotationFile *file = page->GetNotationFile();
Check_Object(file);
const char* attribute_name;
page->GetEntry("Attribute", &attribute_name, true);
const AttributeEntry *attribute_entry;
Check_Object(class_data);
attribute_entry =
class_data->attributeTable.GetAttributeEntry(attribute_name);
if (attribute_entry == NULL)
{
STOP((
"%s: {[%s]Attribute=%s}: Unknown attribute!",
file->GetFileName(),
page->GetName(),
attribute_name
));
return false;
}
Check_Object(attribute_entry);
if (attribute_entry->attributeType != ID)
{
PAUSE((
"%s: {[%s]Attribute=%s}: Attribute is not correct type!",
file->GetFileName(),
page->GetName(),
attribute_name
));
result = false;
}
else
*component_stream << attribute_entry->attributeID;
//
//---------------------------------
// Read in the difference threshold
//---------------------------------
//
Scalar difference = 0.0f;
page->GetEntry("Threshold", &difference);
*component_stream << difference;
Check_Object(DefaultData);
return (result) ? DefaultData : NULL;
}
}