#include "gamebuilder.h" #include #include "game.h" #include "astbranch.h" #include "astleaf.h" #include "astleafliteral.h" #include "astfunction.h" #include "command.h" using namespace Bu; GameBuilder::GameBuilder() : pGame( NULL ), bGlobal( false ), pCurNode( NULL ), pCurRoot( NULL ), pCurCmd( NULL ), pCurFnc( NULL ) { pGame = new Game(); } GameBuilder::~GameBuilder() { } void GameBuilder::setLiteral( const Variable &v ) { vLiteral = v; } void GameBuilder::setGameParam( const Bu::String &sName ) { pGame->hGlobalParam.insert( sName, vLiteral ); } void GameBuilder::beginFunction( const Bu::String &sName ) { pCurNode = pCurRoot = new AstBranch( AstNode::tScope ); pCurFnc = new AstFunction( sName ); sio << "New function: " << sName << sio.nl; } void GameBuilder::addFunctionParam( const Bu::String &sName ) { pCurFnc->addParam( sName ); sio << " - Param added '" << sName << "'" << sio.nl; } void GameBuilder::endFunction() { sio << "Function ended: " << *pCurRoot << sio.nl; pCurFnc->setAst( pCurRoot ); pCurRoot = pCurNode = NULL; pGame->hFunction.insert( pCurFnc->getName(), pCurFnc ); } void GameBuilder::beginSituation( const Bu::String &sName ) { sio << "New situation: " << sName << sio.nl; } void GameBuilder::endSituation() { sio << "Situation ended." << sio.nl; } void GameBuilder::addNode( AstNode::Type iType ) { switch( iType&AstNode::tTypeMask ) { case AstNode::tBranch: pCurNode = (AstBranch *)pCurNode->addNode( new AstBranch( iType ) ); break; case AstNode::tLeaf: pCurNode->addNode( new AstLeaf( iType ) ); break; } } void GameBuilder::closeNode() { pCurNode = pCurNode->getParent(); } void GameBuilder::addLiteral( const Variable &v ) { setLiteral( v ); if( pCurNode ) { pCurNode->addNode( new AstLeafLiteral( v ) ); } } void GameBuilder::addVarRef( const Bu::String &sName ) { if( pCurNode ) { pCurNode->addNode( new AstLeafLiteral( AstNode::tVarName, sName ) ); } } void GameBuilder::addFuncCall( const Bu::String &sName ) { if( pCurNode ) { pCurNode->addNode( new AstLeafLiteral( AstNode::tFuncCall, sName ) ); } } void GameBuilder::beginGlobal() { bGlobal = true; } void GameBuilder::closeGlobal() { bGlobal = false; } void GameBuilder::beginCommand( const Bu::String &sValue ) { pCurNode = pCurRoot = new AstBranch( AstNode::tScope ); pCurCmd = new Command(); pCurCmd->addLiteral( sValue ); } void GameBuilder::addCommandLiteral( const Bu::String &sValue ) { pCurCmd->addLiteral( sValue ); } void GameBuilder::addCommandParam( const Bu::String &sValue ) { pCurCmd->addParam( sValue ); } void GameBuilder::closeCommand() { pCurCmd->setAst( pCurRoot ); pCurRoot = pCurNode = NULL; pCurCmd->print(); if( bGlobal ) { pGame->csGlobal.addCommand( pCurCmd ); } else { delete pCurCmd; } pCurCmd = NULL; }