1
0
mirror of https://github.com/alliedmodders/hl2sdk.git synced 2025-01-07 09:43:40 +08:00
hl2sdk/game/missionchooser/layout_system/tilegen_class_interfaces.h
2010-07-22 01:46:14 -05:00

179 lines
8.0 KiB
C++

//============ Copyright (c) Valve Corporation, All rights reserved. ============
//
// Interfaces used by the tilegen layout system:
// ITilegenAction, ITilegenListener, ITilegenExpression<>, ITilegenRange<>
//
//===============================================================================
#ifndef TILEGEN_CLASS_INTERFACES_H
#define TILEGEN_CLASS_INTERFACES_H
#if defined( COMPILER_MSVC )
#pragma once
#endif
class KeyValues;
// These classes come from tilegen_layout_system.h
class CFreeVariableMap;
class CLayoutSystem;
class CTilegenState;
//////////////////////////////////////////////////////////////////////////
// Interface Definitions
//////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
// Base interface for all level generation actions.
//-----------------------------------------------------------------------------
class ITilegenAction
{
public:
virtual ~ITilegenAction() { }
//-----------------------------------------------------------------------------
// Called on all action objects by the layout system when
// beginning generation of a new map.
//-----------------------------------------------------------------------------
virtual void OnBeginGeneration( CLayoutSystem *pLayoutSystem ) { pLayoutSystem; }
//-----------------------------------------------------------------------------
// Called on all action objects in a state when transitioning to that state.
//-----------------------------------------------------------------------------
virtual void OnStateChanged( CLayoutSystem *pLayoutSystem ) { pLayoutSystem; }
//-----------------------------------------------------------------------------
// Initializes the class from KeyValues data.
//-----------------------------------------------------------------------------
virtual bool LoadFromKeyValues( KeyValues *pKeyValues ) = 0;
//-----------------------------------------------------------------------------
// Gets the name of the derived class.
// NOTE: this is defined for each class by a macro in
// tilegen_class_factories.cpp
//-----------------------------------------------------------------------------
virtual const char *GetTypeName() = 0;
//-----------------------------------------------------------------------------
// Executes an action, operating on the given layout system.
//-----------------------------------------------------------------------------
virtual void Execute( CLayoutSystem *pLayoutSystem ) = 0;
};
//-----------------------------------------------------------------------------
// Derived classes can listen and respond to events by updating
// free variables.
//-----------------------------------------------------------------------------
class ITilegenListener
{
public:
virtual ~ITilegenListener() { }
//-----------------------------------------------------------------------------
// Invoked when beginning generation of a new map.
//-----------------------------------------------------------------------------
virtual void OnBeginGeneration( const CLayoutSystem *pLayoutSystem, CFreeVariableMap *pFreeVariables ) { pLayoutSystem; pFreeVariables; }
//-----------------------------------------------------------------------------
// Invoked when a room is placed as the result of an action.
//-----------------------------------------------------------------------------
virtual void OnRoomPlaced( const CLayoutSystem *pLayoutSystem, CFreeVariableMap *pFreeVariables ) { pLayoutSystem; pFreeVariables; }
//-----------------------------------------------------------------------------
// Invoked when the current state is changed as the result of an action.
//-----------------------------------------------------------------------------
virtual void OnStateChanged( const CLayoutSystem *pLayoutSystem, const CTilegenState *pOldState, CFreeVariableMap *pFreeVariables ) { pLayoutSystem; pOldState; pFreeVariables; }
//-----------------------------------------------------------------------------
// Invoked when a an action is executed.
//-----------------------------------------------------------------------------
virtual void OnActionExecuted( const CLayoutSystem *pLayoutSystem, const ITilegenAction *pAction, CFreeVariableMap *pFreeVariables ) { pLayoutSystem; pAction; pFreeVariables; }
};
//-----------------------------------------------------------------------------
// Derived classes are nodes in an experession tree which can be recursively
// evalauted to produce a value.
//-----------------------------------------------------------------------------
template< typename TValue >
class ITilegenExpression
{
public:
typedef TValue TExpressionValue;
virtual ~ITilegenExpression() { }
//-----------------------------------------------------------------------------
// Initializes the class from KeyValues data.
//-----------------------------------------------------------------------------
virtual bool LoadFromKeyValues( KeyValues *pKeyValues ) = 0;
//-----------------------------------------------------------------------------
// Gets the name of the derived class.
//-----------------------------------------------------------------------------
virtual const char *GetTypeName() = 0;
//-----------------------------------------------------------------------------
// Recursively evaluates this expression, given the current free variable
// state, and returns the value.
//
// pContext - A dictionary of all known variables in the system.
//-----------------------------------------------------------------------------
virtual TValue Evaluate( CFreeVariableMap *pContext ) = 0;
};
//-----------------------------------------------------------------------------
// A class which encapsulates a range of iterateable elements.
//
// The iterator pattern for this class is:
//
// // Initialize if this range's values may have changed
// pRange->Initialize( pFreeVariables );
//
// pRange->Reset();
// while ( pRange->MoveNext() )
// {
// DoStuff( pRange->GetCurrent() );
// }
//-----------------------------------------------------------------------------
template< typename TValue >
class ITilegenRange
{
public:
typedef TValue TElementValue;
virtual ~ITilegenRange() { }
//-----------------------------------------------------------------------------
// Initializes the class from KeyValues data.
//-----------------------------------------------------------------------------
virtual bool LoadFromKeyValues( KeyValues *pKeyValues ) = 0;
//-----------------------------------------------------------------------------
// Called before a range is used. Function is responsible for ensuring
// that any cached internal state is up-to-date.
//-----------------------------------------------------------------------------
virtual void Initialize( CFreeVariableMap *pContext ) = 0;
//-----------------------------------------------------------------------------
// Resets the current item pointer to one-before the start of the range.
// GetCurrent() is invalid to call immediately after Reset().
//-----------------------------------------------------------------------------
virtual void Reset() = 0;
//-----------------------------------------------------------------------------
// Advances the current item forward by 1.
// Returns false if past the end of the range, true otherwise.
// GetCurrent() is only valid to call after a call to MoveNext() which
// has returned true.
//-----------------------------------------------------------------------------
virtual bool MoveNext() = 0;
//-----------------------------------------------------------------------------
// Returns the current element in the range.
//-----------------------------------------------------------------------------
virtual TElementValue GetCurrent() = 0;
};
#endif // TILEGEN_CLASS_INTERFACES_H