summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/astfunction.cpp2
-rw-r--r--src/astfunction.h2
-rw-r--r--src/function.h2
-rw-r--r--src/functiondelete.cpp19
-rw-r--r--src/functiondelete.h16
-rw-r--r--src/functiondisplay.cpp2
-rw-r--r--src/functiondisplay.h2
-rw-r--r--src/functionexists.cpp19
-rw-r--r--src/functionexists.h16
-rw-r--r--src/game.cpp4
-rw-r--r--src/gamestate.cpp40
-rw-r--r--src/gamestate.h2
-rw-r--r--test.stage4
13 files changed, 125 insertions, 5 deletions
diff --git a/src/astfunction.cpp b/src/astfunction.cpp
index f5e25dc..c37a70d 100644
--- a/src/astfunction.cpp
+++ b/src/astfunction.cpp
@@ -14,7 +14,7 @@ AstFunction::~AstFunction()
14 delete pAst; 14 delete pAst;
15} 15}
16 16
17Variable AstFunction::call( class GameState &gState ) 17void AstFunction::call( class GameState &gState )
18{ 18{
19 gState.parse( pAst ); 19 gState.parse( pAst );
20} 20}
diff --git a/src/astfunction.h b/src/astfunction.h
index a546b19..5e71753 100644
--- a/src/astfunction.h
+++ b/src/astfunction.h
@@ -10,7 +10,7 @@ public:
10 virtual ~AstFunction(); 10 virtual ~AstFunction();
11 11
12 virtual Bu::String getName() const { return sName; } 12 virtual Bu::String getName() const { return sName; }
13 virtual Variable call( class GameState &gState ); 13 virtual void call( class GameState &gState );
14 14
15 void addParam( const Bu::String &sName ); 15 void addParam( const Bu::String &sName );
16 const Bu::StringList &getParamList() { return lParam; } 16 const Bu::StringList &getParamList() { return lParam; }
diff --git a/src/function.h b/src/function.h
index c1289f4..6696d5a 100644
--- a/src/function.h
+++ b/src/function.h
@@ -11,7 +11,7 @@ public:
11 virtual ~Function(); 11 virtual ~Function();
12 12
13 virtual Bu::String getName() const=0; 13 virtual Bu::String getName() const=0;
14 virtual Variable call( class GameState &gState )=0; 14 virtual void call( class GameState &gState )=0;
15}; 15};
16 16
17#endif 17#endif
diff --git a/src/functiondelete.cpp b/src/functiondelete.cpp
new file mode 100644
index 0000000..c9bfef4
--- /dev/null
+++ b/src/functiondelete.cpp
@@ -0,0 +1,19 @@
1#include "functiondelete.h"
2
3#include "gamestate.h"
4
5FunctionDelete::FunctionDelete()
6{
7}
8
9FunctionDelete::~FunctionDelete()
10{
11}
12
13void FunctionDelete::call( class GameState &gState )
14{
15 Variable v = gState.pop();
16 VariableRef r = v.getVariableRef();
17 gState.delVariable( r.sName, r.sid );
18}
19
diff --git a/src/functiondelete.h b/src/functiondelete.h
new file mode 100644
index 0000000..3545343
--- /dev/null
+++ b/src/functiondelete.h
@@ -0,0 +1,16 @@
1#ifndef FUNCTION_DELETE_H
2#define FUNCTION_DELETE_H
3
4#include "function.h"
5
6class FunctionDelete : public Function
7{
8public:
9 FunctionDelete();
10 virtual ~FunctionDelete();
11
12 virtual Bu::String getName() const { return "delete"; }
13 virtual void call( class GameState &gState );
14};
15
16#endif
diff --git a/src/functiondisplay.cpp b/src/functiondisplay.cpp
index 332a2c9..fa5b79c 100644
--- a/src/functiondisplay.cpp
+++ b/src/functiondisplay.cpp
@@ -13,7 +13,7 @@ FunctionDisplay::~FunctionDisplay()
13{ 13{
14} 14}
15 15
16Variable FunctionDisplay::call( class GameState &gState ) 16void FunctionDisplay::call( class GameState &gState )
17{ 17{
18 Variable v = gState.popDeref(); 18 Variable v = gState.popDeref();
19 sio << "Display: " << v << sio.nl; 19 sio << "Display: " << v << sio.nl;
diff --git a/src/functiondisplay.h b/src/functiondisplay.h
index d1a63a9..3b7e828 100644
--- a/src/functiondisplay.h
+++ b/src/functiondisplay.h
@@ -10,7 +10,7 @@ public:
10 virtual ~FunctionDisplay(); 10 virtual ~FunctionDisplay();
11 11
12 virtual Bu::String getName() const { return "display"; } 12 virtual Bu::String getName() const { return "display"; }
13 virtual Variable call( class GameState &gState ); 13 virtual void call( class GameState &gState );
14}; 14};
15 15
16#endif 16#endif
diff --git a/src/functionexists.cpp b/src/functionexists.cpp
new file mode 100644
index 0000000..71e03f6
--- /dev/null
+++ b/src/functionexists.cpp
@@ -0,0 +1,19 @@
1#include "functionexists.h"
2
3#include "gamestate.h"
4
5FunctionExists::FunctionExists()
6{
7}
8
9FunctionExists::~FunctionExists()
10{
11}
12
13void FunctionExists::call( class GameState &gState )
14{
15 Variable v = gState.pop();
16 VariableRef r = v.getVariableRef();
17 gState.push( Variable( gState.hasVariable( r.sName, r.sid ) ) );
18}
19
diff --git a/src/functionexists.h b/src/functionexists.h
new file mode 100644
index 0000000..5313331
--- /dev/null
+++ b/src/functionexists.h
@@ -0,0 +1,16 @@
1#ifndef FUNCTION_EXISTS_H
2#define FUNCTION_EXISTS_H
3
4#include "function.h"
5
6class FunctionExists : public Function
7{
8public:
9 FunctionExists();
10 virtual ~FunctionExists();
11
12 virtual Bu::String getName() const { return "exists"; }
13 virtual void call( class GameState &gState );
14};
15
16#endif
diff --git a/src/game.cpp b/src/game.cpp
index 6c980ee..87d82b7 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1,10 +1,14 @@
1#include "game.h" 1#include "game.h"
2 2
3#include "functiondisplay.h" 3#include "functiondisplay.h"
4#include "functionexists.h"
5#include "functiondelete.h"
4 6
5Game::Game() 7Game::Game()
6{ 8{
7 addFunction( new FunctionDisplay() ); 9 addFunction( new FunctionDisplay() );
10 addFunction( new FunctionExists() );
11 addFunction( new FunctionDelete() );
8} 12}
9 13
10Game::~Game() 14Game::~Game()
diff --git a/src/gamestate.cpp b/src/gamestate.cpp
index 902d0a9..a3758ce 100644
--- a/src/gamestate.cpp
+++ b/src/gamestate.cpp
@@ -65,6 +65,46 @@ void GameState::callFunction( const Bu::String &sName )
65 pGame->getFunction( sName )->call( *this ); 65 pGame->getFunction( sName )->call( *this );
66} 66}
67 67
68bool GameState::hasVariable( const Bu::String &sName, ScopeId id )
69{
70 switch( id )
71 {
72 case sidLocal:
73 return lsLocal.peek()->has( sName );
74
75 case sidGlobal:
76 return sGlobal.has( sName );
77
78 case sidPlayer:
79 return sPlayer.has( sName );
80
81 case sidSituation:
82 return hsSituation.get( sCurSituation )->has( sName );
83 }
84
85 throw Bu::ExceptionBase("Really bad scopeid passed into getVariable");
86}
87
88void GameState::delVariable( const Bu::String &sName, ScopeId id )
89{
90 switch( id )
91 {
92 case sidLocal:
93 return lsLocal.peek()->erase( sName );
94
95 case sidGlobal:
96 return sGlobal.erase( sName );
97
98 case sidPlayer:
99 return sPlayer.erase( sName );
100
101 case sidSituation:
102 return hsSituation.get( sCurSituation )->erase( sName );
103 }
104
105 throw Bu::ExceptionBase("Really bad scopeid passed into getVariable");
106}
107
68Variable GameState::getVariable( const Bu::String &sName, ScopeId id ) 108Variable GameState::getVariable( const Bu::String &sName, ScopeId id )
69{ 109{
70 try 110 try
diff --git a/src/gamestate.h b/src/gamestate.h
index 6000419..61e18e8 100644
--- a/src/gamestate.h
+++ b/src/gamestate.h
@@ -26,6 +26,8 @@ public:
26 26
27 void callFunction( const Bu::String &sName ); 27 void callFunction( const Bu::String &sName );
28 28
29 bool hasVariable( const Bu::String &sName, ScopeId id );
30 void delVariable( const Bu::String &sName, ScopeId id );
29 Variable getVariable( const Bu::String &sName, ScopeId id=sidLocal ); 31 Variable getVariable( const Bu::String &sName, ScopeId id=sidLocal );
30 void setVariable( const Bu::String &sName, const Variable &v, ScopeId id=sidLocal ); 32 void setVariable( const Bu::String &sName, const Variable &v, ScopeId id=sidLocal );
31 33
diff --git a/test.stage b/test.stage
index 516471d..060e11d 100644
--- a/test.stage
+++ b/test.stage
@@ -48,6 +48,10 @@ situation <<start>>
48 display("This is the setup phase for start, " + name); 48 display("This is the setup phase for start, " + name);
49 sillyDisplay( "Hello", name == player.name ); 49 sillyDisplay( "Hello", name == player.name );
50 50
51 display( exists(name) );
52 delete( name );
53 display( exists(name) );
54
51 getThing(); 55 getThing();
52 myGoto( <<stuff>> ); 56 myGoto( <<stuff>> );
53 display("You shouldn't see this."); 57 display("You shouldn't see this.");