diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2012-02-08 00:22:34 -0700 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2012-02-08 00:22:34 -0700 |
| commit | 11554a9e5c92a98129b42598495abe7503d9208c (patch) | |
| tree | 91182c1737204d60bcbbc038f2743e60d09faedb /src/gamestate.cpp | |
| parent | 3a1a20a9bc7008abb7de241c44cc0d7a3d4a77d9 (diff) | |
| download | stage-11554a9e5c92a98129b42598495abe7503d9208c.tar.gz stage-11554a9e5c92a98129b42598495abe7503d9208c.tar.bz2 stage-11554a9e5c92a98129b42598495abe7503d9208c.tar.xz stage-11554a9e5c92a98129b42598495abe7503d9208c.zip | |
Everything seems to work now, goto, return, etc.
Diffstat (limited to 'src/gamestate.cpp')
| -rw-r--r-- | src/gamestate.cpp | 89 |
1 files changed, 53 insertions, 36 deletions
diff --git a/src/gamestate.cpp b/src/gamestate.cpp index 38c6612..0434e6d 100644 --- a/src/gamestate.cpp +++ b/src/gamestate.cpp | |||
| @@ -237,10 +237,10 @@ class Situation *GameState::getCurSituation() | |||
| 237 | { | 237 | { |
| 238 | return pGame->getSituation( sCurSituation ); | 238 | return pGame->getSituation( sCurSituation ); |
| 239 | } | 239 | } |
| 240 | 240 | /* | |
| 241 | void GameState::run( class AstBranch *pAst ) | 241 | void GameState::run( class AstBranch *pAst ) |
| 242 | { | 242 | { |
| 243 | pushScope( pAst ); | 243 | // pushScope( pAst ); |
| 244 | run(); | 244 | run(); |
| 245 | // if( lsLocal.getSize() == iDepth ) | 245 | // if( lsLocal.getSize() == iDepth ) |
| 246 | // delete lsLocal.peekPop(); | 246 | // delete lsLocal.peekPop(); |
| @@ -256,7 +256,7 @@ void GameState::pushScope( class AstBranch *pAst ) | |||
| 256 | // int iDepth = lsLocal.getSize(); | 256 | // int iDepth = lsLocal.getSize(); |
| 257 | sProg.push( pAst->getNodeList().begin() ); | 257 | sProg.push( pAst->getNodeList().begin() ); |
| 258 | } | 258 | } |
| 259 | 259 | */ | |
| 260 | void GameState::init() | 260 | void GameState::init() |
| 261 | { | 261 | { |
| 262 | Variable vStart = pGame->getParam("start"); | 262 | Variable vStart = pGame->getParam("start"); |
| @@ -264,7 +264,6 @@ void GameState::init() | |||
| 264 | throw Bu::ExceptionBase("game.start is not set to a situation name."); | 264 | throw Bu::ExceptionBase("game.start is not set to a situation name."); |
| 265 | 265 | ||
| 266 | gotoSituation( vStart.getString() ); | 266 | gotoSituation( vStart.getString() ); |
| 267 | run(); | ||
| 268 | } | 267 | } |
| 269 | 268 | ||
| 270 | void GameState::gotoSituation( const Bu::String &sName ) | 269 | void GameState::gotoSituation( const Bu::String &sName ) |
| @@ -276,17 +275,23 @@ void GameState::gotoSituation( const Bu::String &sName ) | |||
| 276 | 275 | ||
| 277 | Situation *pSit = pGame->getSituation( sName ); | 276 | Situation *pSit = pGame->getSituation( sName ); |
| 278 | sCurSituation = sName; | 277 | sCurSituation = sName; |
| 278 | sGoto.clear(); | ||
| 279 | if( !hsSituation.has( sName ) ) | 279 | if( !hsSituation.has( sName ) ) |
| 280 | { | 280 | { |
| 281 | hsSituation.insert( sName, new Scope() ); | 281 | hsSituation.insert( sName, new Scope() ); |
| 282 | pSit->exec( *this, Situation::modeEnter ); | ||
| 283 | pSit->exec( *this, Situation::modeSetup ); | 282 | pSit->exec( *this, Situation::modeSetup ); |
| 283 | if( !sGoto.isSet() ) | ||
| 284 | pSit->exec( *this, Situation::modeEnter ); | ||
| 284 | } | 285 | } |
| 285 | else | 286 | else |
| 286 | { | 287 | { |
| 287 | pSit->exec( *this, Situation::modeEnter ); | 288 | pSit->exec( *this, Situation::modeEnter ); |
| 288 | } | 289 | } |
| 289 | 290 | ||
| 291 | if( sGoto.isSet() ) | ||
| 292 | { | ||
| 293 | gotoSituation( sGoto ); | ||
| 294 | } | ||
| 290 | } | 295 | } |
| 291 | 296 | ||
| 292 | void GameState::callFunction( const Bu::String &sName ) | 297 | void GameState::callFunction( const Bu::String &sName ) |
| @@ -308,11 +313,17 @@ void GameState::execCommand( const Bu::String &sCmd ) | |||
| 308 | return; | 313 | return; |
| 309 | } | 314 | } |
| 310 | } | 315 | } |
| 316 | |||
| 317 | if( sGoto.isSet() ) | ||
| 318 | gotoSituation( sGoto ); | ||
| 311 | } | 319 | } |
| 312 | 320 | ||
| 313 | void GameState::execOption( int idx ) | 321 | void GameState::execOption( int idx ) |
| 314 | { | 322 | { |
| 315 | pGame->getSituation( sCurSituation )->execOption( *this, idx ); | 323 | pGame->getSituation( sCurSituation )->execOption( *this, idx ); |
| 324 | |||
| 325 | if( sGoto.isSet() ) | ||
| 326 | gotoSituation( sGoto ); | ||
| 316 | } | 327 | } |
| 317 | 328 | ||
| 318 | bool GameState::hasVariable( const Bu::String &sName, ScopeId id ) | 329 | bool GameState::hasVariable( const Bu::String &sName, ScopeId id ) |
| @@ -523,14 +534,27 @@ Variable GameState::popDeref() | |||
| 523 | return v; | 534 | return v; |
| 524 | } | 535 | } |
| 525 | 536 | ||
| 526 | void GameState::run() | 537 | void GameState::run( const class AstBranch *pAst, bool bNewScope ) |
| 527 | { | 538 | { |
| 528 | bEscape = false; | 539 | if( pAst->getType() != AstNode::tScope ) |
| 540 | throw Bu::ExceptionBase("Nope, nothing doing, you can't run a non-scope AstBranch."); | ||
| 541 | |||
| 542 | run( pAst->getNodeList(), bNewScope ); | ||
| 543 | } | ||
| 544 | |||
| 545 | void GameState::run( const AstBranch::NodeList &lNode, bool bNewScope ) | ||
| 546 | { | ||
| 547 | ProgramStack sProg; | ||
| 548 | |||
| 549 | if( bNewScope ) | ||
| 550 | lsLocal.push( new Scope() ); | ||
| 551 | sProg.push( lNode.begin() ); | ||
| 552 | |||
| 529 | while( !sProg.isEmpty() ) | 553 | while( !sProg.isEmpty() ) |
| 530 | { | 554 | { |
| 531 | ProgramCounter &i = sProg.peek(); | 555 | ProgramCounter &i = sProg.peek(); |
| 532 | sio << "Stack: " << lStack << sio.nl; | 556 | // sio << "Stack: " << lStack << sio.nl; |
| 533 | sio << "exec: " << (*i)->getType() << sio.nl; | 557 | // sio << "exec: " << (*i)->getType() << sio.nl; |
| 534 | switch( (*i)->getType() ) | 558 | switch( (*i)->getType() ) |
| 535 | { | 559 | { |
| 536 | // tLeaf | 560 | // tLeaf |
| @@ -712,10 +736,8 @@ void GameState::run() | |||
| 712 | Variable x = popDeref(); | 736 | Variable x = popDeref(); |
| 713 | if( x.getType() != Variable::tSituation ) | 737 | if( x.getType() != Variable::tSituation ) |
| 714 | throw Bu::ExceptionBase("You cannot goto anything but a situation."); | 738 | throw Bu::ExceptionBase("You cannot goto anything but a situation."); |
| 715 | sProg.clear(); | 739 | sGoto = x.getString(); |
| 716 | gotoSituation( x.getString() ); | 740 | return; |
| 717 | bEscape = true; | ||
| 718 | continue; | ||
| 719 | } | 741 | } |
| 720 | break; | 742 | break; |
| 721 | 743 | ||
| @@ -729,11 +751,9 @@ void GameState::run() | |||
| 729 | break; | 751 | break; |
| 730 | 752 | ||
| 731 | case AstNode::tReturn: | 753 | case AstNode::tReturn: |
| 732 | sProg.pop(); | 754 | if( bNewScope ) |
| 733 | // bReturnOnly = true; | 755 | lsLocal.pop(); |
| 734 | // bEscape = true; | 756 | return; |
| 735 | // return; | ||
| 736 | break; | ||
| 737 | 757 | ||
| 738 | case AstNode::tAppend: | 758 | case AstNode::tAppend: |
| 739 | { | 759 | { |
| @@ -791,18 +811,10 @@ void GameState::run() | |||
| 791 | break; | 811 | break; |
| 792 | 812 | ||
| 793 | case AstNode::tFuncCall: | 813 | case AstNode::tFuncCall: |
| 794 | sio << "Calling function now: " << sio.nl; | ||
| 795 | { | ||
| 796 | ProgramCounter c = i; | ||
| 797 | i++; | ||
| 798 | callFunction( | 814 | callFunction( |
| 799 | dynamic_cast<const AstLeafLiteral *>(*c) | 815 | dynamic_cast<const AstLeafLiteral *>(*i) |
| 800 | ->getValue().getString() | 816 | ->getValue().getString() |
| 801 | ); | 817 | ); |
| 802 | } | ||
| 803 | continue; | ||
| 804 | bReturnOnly = false; | ||
| 805 | bEscape = false; | ||
| 806 | break; | 818 | break; |
| 807 | 819 | ||
| 808 | // tBranch | 820 | // tBranch |
| @@ -838,7 +850,7 @@ void GameState::run() | |||
| 838 | } | 850 | } |
| 839 | } | 851 | } |
| 840 | break; | 852 | break; |
| 841 | /* | 853 | |
| 842 | case AstNode::tForEach: | 854 | case AstNode::tForEach: |
| 843 | { | 855 | { |
| 844 | AstBranch::NodeList lFe = | 856 | AstBranch::NodeList lFe = |
| @@ -868,7 +880,8 @@ void GameState::run() | |||
| 868 | getValue().getVariableRef(); | 880 | getValue().getVariableRef(); |
| 869 | } | 881 | } |
| 870 | 882 | ||
| 871 | parse( dynamic_cast<const AstBranch *>(*iIn)->getNodeList() ); | 883 | run( dynamic_cast<const AstBranch *>(*iIn), |
| 884 | false ); | ||
| 872 | Variable vIn = popDeref(); | 885 | Variable vIn = popDeref(); |
| 873 | 886 | ||
| 874 | const AstBranch::NodeList &rDo = | 887 | const AstBranch::NodeList &rDo = |
| @@ -883,7 +896,7 @@ void GameState::run() | |||
| 883 | if( bUseKey ) | 896 | if( bUseKey ) |
| 884 | setVariable( vrKey.sName, i.getKey(), vrKey.sid ); | 897 | setVariable( vrKey.sName, i.getKey(), vrKey.sid ); |
| 885 | setVariable( vrValue.sName, i.getValue(), vrValue.sid ); | 898 | setVariable( vrValue.sName, i.getValue(), vrValue.sid ); |
| 886 | parse( rDo ); | 899 | run( rDo, false ); |
| 887 | } | 900 | } |
| 888 | } | 901 | } |
| 889 | else if( vIn.getType() == Variable::tList ) | 902 | else if( vIn.getType() == Variable::tList ) |
| @@ -897,7 +910,7 @@ void GameState::run() | |||
| 897 | rList.begin(); i; i++ ) | 910 | rList.begin(); i; i++ ) |
| 898 | { | 911 | { |
| 899 | setVariable( vrValue.sName, *i, vrValue.sid ); | 912 | setVariable( vrValue.sName, *i, vrValue.sid ); |
| 900 | parse( rDo ); | 913 | run( rDo, false ); |
| 901 | } | 914 | } |
| 902 | } | 915 | } |
| 903 | } | 916 | } |
| @@ -912,27 +925,31 @@ void GameState::run() | |||
| 912 | 925 | ||
| 913 | for(;;) | 926 | for(;;) |
| 914 | { | 927 | { |
| 915 | parse( dynamic_cast<const AstBranch *>(*iTest)-> | 928 | run( dynamic_cast<const AstBranch *>(*iTest)-> |
| 916 | getNodeList() ); | 929 | getNodeList(), false ); |
| 917 | Variable v = popDeref(); | 930 | Variable v = popDeref(); |
| 918 | if( v.getType() != Variable::tBool ) | 931 | if( v.getType() != Variable::tBool ) |
| 919 | throw Bu::ExceptionBase("conditional did not evaluate to boolean."); | 932 | throw Bu::ExceptionBase("conditional did not evaluate to boolean."); |
| 920 | if( !v.getBool() ) | 933 | if( !v.getBool() ) |
| 921 | break; | 934 | break; |
| 922 | 935 | ||
| 923 | parse( dynamic_cast<const AstBranch *>(*iDo)-> | 936 | run( dynamic_cast<const AstBranch *>(*iDo)-> |
| 924 | getNodeList() ); | 937 | getNodeList(), false ); |
| 925 | } | 938 | } |
| 926 | } | 939 | } |
| 927 | break; | 940 | break; |
| 928 | */ | ||
| 929 | } | 941 | } |
| 930 | 942 | ||
| 943 | if( sGoto.isSet() ) | ||
| 944 | return; | ||
| 945 | |||
| 931 | ++sProg.peek(); | 946 | ++sProg.peek(); |
| 932 | while( !sProg.isEmpty() && !sProg.peek() ) | 947 | while( !sProg.isEmpty() && !sProg.peek() ) |
| 933 | { | 948 | { |
| 934 | sProg.pop(); | 949 | sProg.pop(); |
| 935 | } | 950 | } |
| 936 | } | 951 | } |
| 952 | if( bNewScope ) | ||
| 953 | lsLocal.pop(); | ||
| 937 | } | 954 | } |
| 938 | 955 | ||
