summaryrefslogtreecommitdiff
path: root/dmserializers/importactbusy.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /dmserializers/importactbusy.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'dmserializers/importactbusy.cpp')
-rw-r--r--dmserializers/importactbusy.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/dmserializers/importactbusy.cpp b/dmserializers/importactbusy.cpp
new file mode 100644
index 0000000..2ca816e
--- /dev/null
+++ b/dmserializers/importactbusy.cpp
@@ -0,0 +1,182 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#include "importkeyvaluebase.h"
+#include "dmserializers.h"
+#include "datamodel/idatamodel.h"
+#include "datamodel/dmelement.h"
+#include "tier1/KeyValues.h"
+#include "tier1/utlbuffer.h"
+#include "datamodel/dmattribute.h"
+
+
+//-----------------------------------------------------------------------------
+// Serialization class for Key Values
+//-----------------------------------------------------------------------------
+class CImportActBusy : public CImportKeyValueBase
+{
+public:
+ virtual const char *GetName() const { return "actbusy"; }
+ virtual const char *GetDescription() const { return "ActBusy Script File"; }
+ virtual int GetCurrentVersion() const { return 0; } // doesn't store a version
+
+ bool Serialize( CUtlBuffer &outBuf, CDmElement *pRoot );
+ CDmElement* UnserializeFromKeyValues( KeyValues *pKeyValues );
+
+private:
+ // Reads a single element
+ bool UnserializeActBusyKey( CDmAttribute *pChildren, KeyValues *pKeyValues );
+
+ // Writes out the actbusy header
+ void SerializeHeader( CUtlBuffer &buf );
+};
+
+
+//-----------------------------------------------------------------------------
+// Singleton instance
+//-----------------------------------------------------------------------------
+static CImportActBusy s_ImportActBusy;
+
+void InstallActBusyImporter( IDataModel *pFactory )
+{
+ pFactory->AddSerializer( &s_ImportActBusy );
+}
+
+
+//-----------------------------------------------------------------------------
+// Writes out the actbusy header
+//-----------------------------------------------------------------------------
+void CImportActBusy::SerializeHeader( CUtlBuffer &buf )
+{
+ buf.Printf( "// \"act busy name\"\t\tThis is the name that a mapmaker must specify in the hint node.\n" );
+ buf.Printf( "// {\n" );
+ buf.Printf( "// \t\"busy_anim\"\t\t\t\"Activity Name\".\n" );
+ buf.Printf( "// \t\"entry_anim\"\t\t\"Activity Name\"\n" );
+ buf.Printf( "// \t\"exit_anim\"\t\t\t\"Activity Name\"\n" );
+ buf.Printf( "// \t\"busy_sequence\"\t\t\"Sequence Name\". If specified, this is used over the activity name. Specify it in the hint node.\n" );
+ buf.Printf( "// \t\"entry_sequence\"\t\"Sequence Name\". If specified, this is used over the entry anim.\n" );
+ buf.Printf( "// \t\"exit_sequence\"\t\t\"Sequence Name\". If specified, this is used over the exit anim.\n" );
+ buf.Printf( "// \t\"min_time\"\t\t\t\"Minimum time to spend in this busy anim\"\n" );
+ buf.Printf( "// \t\"max_time\"\t\t\t\"Maximum time to spend in this busy anim\" 0 = only stop when interrupted by external event\n" );
+ buf.Printf( "// \t\"interrupts\"\t\tOne of:\n" );
+ buf.Printf( "// \t\t\t\t\t\t\"BA_INT_NONE\"\t\tbreak out only when time runs out. No external influence will break me out.\n" );
+ buf.Printf( "// \t\t\t\t\t\t\"BA_INT_DANGER\"\t\tbreak out of this anim only if threatened\n" );
+ buf.Printf( "// \t\t\t\t\t\t\"BA_INT_PLAYER\"\t\tbreak out of this anim if I can see the player, or I'm threatened\n" );
+ buf.Printf( "// \t\t\t\t\t\t\"BA_INT_AMBUSH\"\t\tsomeone please define this - I have no idea what it does\n" );
+ buf.Printf( "// \t\t\t\t\t\t\"BA_INT_COMBAT\"\t\tbreak out of this anim if combat occurs in my line of sight (bullet hits, grenades, etc), -OR- the max time is reached\n" );
+ buf.Printf( "// }\n" );
+ buf.Printf( "//\n" );
+}
+
+
+//-----------------------------------------------------------------------------
+// Writes out a new actbusy file
+//-----------------------------------------------------------------------------
+bool CImportActBusy::Serialize( CUtlBuffer &buf, CDmElement *pRoot )
+{
+ SerializeHeader( buf );
+ buf.Printf( "\"ActBusy.txt\"\n" );
+ buf.Printf( "{\n" );
+
+ CDmAttribute *pChildren = pRoot->GetAttribute( "children" );
+ if ( !pChildren || pChildren->GetType() != AT_ELEMENT_ARRAY )
+ return NULL;
+
+ CDmrElementArray<> children( pChildren );
+ int nCount = children.Count();
+
+ buf.PushTab();
+ for ( int i = 0; i < nCount; ++i )
+ {
+ CDmElement *pChild = children[i];
+ buf.Printf( "\"%s\"\n", pChild->GetName() );
+ buf.Printf( "{\n" );
+
+ buf.PushTab();
+ PrintStringAttribute( pChild, buf, "busy_anim", true );
+ PrintStringAttribute( pChild, buf, "entry_anim", true );
+ PrintStringAttribute( pChild, buf, "exit_anim", true );
+ PrintStringAttribute( pChild, buf, "busy_sequence", true );
+ PrintStringAttribute( pChild, buf, "entry_sequence", true );
+ PrintStringAttribute( pChild, buf, "exit_sequence", true );
+ PrintFloatAttribute( pChild, buf, "min_time" );
+ PrintFloatAttribute( pChild, buf, "max_time" );
+ PrintStringAttribute( pChild, buf, "interrupts" );
+ buf.PopTab();
+
+ buf.Printf( "}\n" );
+ }
+ buf.PopTab();
+
+ buf.Printf( "}\n" );
+
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Reads a single element
+//-----------------------------------------------------------------------------
+bool CImportActBusy::UnserializeActBusyKey( CDmAttribute *pChildren, KeyValues *pKeyValues )
+{
+ CDmElement *pActBusy = CreateDmElement( "DmElement", pKeyValues->GetName(), NULL );
+ if ( !pActBusy )
+ return false;
+
+ // Each act busy needs to have an editortype associated with it so it displays nicely in editors
+ pActBusy->SetValue( "editorType", "actBusy" );
+
+ float flZero = 0.0f;
+ AddStringAttribute( pActBusy, pKeyValues, "busy_anim", "" );
+ AddStringAttribute( pActBusy, pKeyValues, "entry_anim", "" );
+ AddStringAttribute( pActBusy, pKeyValues, "exit_anim", "" );
+ AddStringAttribute( pActBusy, pKeyValues, "busy_sequence", "" );
+ AddStringAttribute( pActBusy, pKeyValues, "entry_sequence", "" );
+ AddStringAttribute( pActBusy, pKeyValues, "exit_sequence", "" );
+ AddFloatAttribute( pActBusy, pKeyValues, "min_time", &flZero );
+ AddFloatAttribute( pActBusy, pKeyValues, "max_time", &flZero );
+ AddStringAttribute( pActBusy, pKeyValues, "interrupts", "BA_INT_NONE" );
+
+ CDmrElementArray<> children( pChildren );
+ children.AddToTail( pActBusy );
+
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Main entry point for the unserialization
+//-----------------------------------------------------------------------------
+CDmElement* CImportActBusy::UnserializeFromKeyValues( KeyValues *pKeyValues )
+{
+ // Create the main element
+ CDmElement *pElement = CreateDmElement( "DmElement", "ActBusyList", NULL );
+ if ( !pElement )
+ return NULL;
+
+ // Each act busy list needs to have an editortype associated with it so it displays nicely in editors
+ pElement->SetValue( "editorType", "actBusyList" );
+
+ // All actbusy keys are elements of a single element array attribute 'children'
+ CDmAttribute *pChildren = pElement->AddAttribute( "children", AT_ELEMENT_ARRAY );
+ if ( !pChildren )
+ return NULL;
+
+ // Under the root are all the actbusy keys
+ for ( KeyValues *pActBusyKey = pKeyValues->GetFirstTrueSubKey(); pActBusyKey != NULL; pActBusyKey = pActBusyKey->GetNextTrueSubKey() )
+ {
+ if ( !UnserializeActBusyKey( pChildren, pActBusyKey ) )
+ {
+ Warning( "Error importing actbusy element %s\n", pActBusyKey->GetName() );
+ return NULL;
+ }
+ }
+
+ // Resolve all element references recursively
+ RecursivelyResolveElement( pElement );
+
+ return pElement;
+}