From 4161c5d1c46436e3b942d707da1b40317e87180e Mon Sep 17 00:00:00 2001 From: Treeki Date: Sun, 10 Jul 2011 22:06:08 +0200 Subject: custom blocks, states and static initialisers. fuck yeah --- include/statelib.h | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 include/statelib.h (limited to 'include/statelib.h') diff --git a/include/statelib.h b/include/statelib.h new file mode 100644 index 0000000..34ab282 --- /dev/null +++ b/include/statelib.h @@ -0,0 +1,133 @@ +/******************************************************************************/ +// StateBase class +/******************************************************************************/ + +class StateBase { +public: + StateBase(const char *name); + + virtual ~StateBase(); + virtual bool isInvalid(); + virtual bool isEqualNotUsedForSomeReason(StateBase *another); + virtual bool isEqual(StateBase *another); + virtual bool isNotEqual(StateBase *another); + virtual bool isSameStateName(const char *name); + virtual const char *getName(); + virtual int getID(); + + static StateBase mNoState; + +private: + const char *mName; + int mID; + + static int mLastID; +}; + +/******************************************************************************/ +// State : StateBase class +/******************************************************************************/ + +template +class State : public StateBase { +public: + typedef void (TOwner::*funcPtr)(); + + State(const char *name, funcPtr begin, funcPtr execute, funcPtr end) : StateBase(name) { + mBegin = begin; + mExecute = execute; + mEnd = end; + } + + ~State(); + bool isSameStateName(const char *name); + + virtual void doBegin(TOwner *owner); + virtual void doExecute(TOwner *owner); + virtual void doEnd(TOwner *owner); + + funcPtr mBegin; + funcPtr mExecute; + funcPtr mEnd; +}; + +template +State::~State() { } + +template +bool State::isSameStateName(const char *name) { + const char *p = strrchr(name, ':'); + if (p) + name = p + 1; + + int cmp = strcmp(strrchr(getName(), ':')+1, name); + if (cmp == 0) + return true; + else + return false; +} + +template +void State::doBegin(TOwner *owner) { + (owner->*mBegin)(); +} + +template +void State::doExecute(TOwner *owner) { + (owner->*mExecute)(); +} + +template +void State::doEnd(TOwner *owner) { + (owner->*mEnd)(); +} + +/******************************************************************************/ +// StateMgrBase class +/******************************************************************************/ + +class StateMgrBase { +public: + StateMgrBase(void *one, void *two, StateBase *pInitState); + + virtual ~StateMgrBase(); + virtual void _vf0C(); + virtual void execute(); + virtual void _vf14(); + virtual void setState(StateBase *pNewState); + virtual void setField10ToOne(); + virtual StateBase *getField20(); + virtual StateBase *getField14(); + virtual StateBase *getCurrentState_maybe(); + virtual StateBase *getField18(); + virtual bool _vf30() = 0; + virtual void _vf34() = 0; + virtual void _vf38() = 0; + virtual void _vf3C(StateBase *pState) = 0; + +private: + void *m04, *m08; + bool m0C, m0D, m0E, m0F, m10; + StateBase *m14, *m18, *m1C; + StateBase *m20; // maybe not a StateBase? +}; + +/******************************************************************************/ +// StateMgr : StateMgrBase class +/******************************************************************************/ + +template +class StateMgr : public StateMgrBase { +public: + StateMgr(void *one, void *two, StateBase *pInitState); + ~StateMgr(); + + bool _vf30(); + void _vf34(); + void _vf38(); + void _vf3C(StateBase *pState); +}; + +// TODO: add template methods + + -- cgit v1.2.3