diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2011-12-31 00:13:13 -0700 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2011-12-31 00:13:13 -0700 |
| commit | 55e6f570f5760e970c6523458914b5e4c63a6ce4 (patch) | |
| tree | ae996d612c6c55b914a960139a618922bf7e4971 | |
| parent | 3357b0a0ecc4d36ccd3c2668e9d55aaaefedf4df (diff) | |
| download | stage-55e6f570f5760e970c6523458914b5e4c63a6ce4.tar.gz stage-55e6f570f5760e970c6523458914b5e4c63a6ce4.tar.bz2 stage-55e6f570f5760e970c6523458914b5e4c63a6ce4.tar.xz stage-55e6f570f5760e970c6523458914b5e4c63a6ce4.zip | |
Random function added, other fixes.
| -rw-r--r-- | demo.stage | 84 | ||||
| -rw-r--r-- | src/functiondisplay.cpp | 7 | ||||
| -rw-r--r-- | src/functionrandom.cpp | 30 | ||||
| -rw-r--r-- | src/functionrandom.h | 16 | ||||
| -rw-r--r-- | src/game.cpp | 3 | ||||
| -rw-r--r-- | src/gamestate.cpp | 3 | ||||
| -rw-r--r-- | src/main.cpp | 5 | ||||
| -rw-r--r-- | src/variable.cpp | 11 | ||||
| -rw-r--r-- | test.stage | 19 |
9 files changed, 125 insertions, 53 deletions
| @@ -45,47 +45,44 @@ global | |||
| 45 | } | 45 | } |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | // You should always have a global exit, quit, escape, something for | 48 | command: "take" item |
| 49 | // dev-testing at least. | ||
| 50 | command: "exit" | ||
| 51 | { | 49 | { |
| 52 | exit(); | 50 | if exists(situation.items) then |
| 51 | { | ||
| 52 | if item in situation.items then | ||
| 53 | { | ||
| 54 | situation.items -= item; | ||
| 55 | player.inventory += item; | ||
| 56 | display("You take the " + item); | ||
| 57 | return(); | ||
| 58 | } | ||
| 59 | } | ||
| 60 | display("You don't see that anywhere."); | ||
| 53 | } | 61 | } |
| 54 | } | ||
| 55 | |||
| 56 | function square( x ) | ||
| 57 | { | ||
| 58 | return( x*x ); | ||
| 59 | } | ||
| 60 | 62 | ||
| 61 | function sillyDisplay( txt, extra ) | 63 | command: "inventory" |
| 62 | { | ||
| 63 | display("!~! " + txt + " !~!"); | ||
| 64 | if extra then | ||
| 65 | { | 64 | { |
| 66 | display("And then some extra!"); | 65 | out = 'You are carrying: '; |
| 66 | for each item in player.inventory do | ||
| 67 | { | ||
| 68 | out += " " + item; | ||
| 69 | } | ||
| 70 | display( out ); | ||
| 67 | } | 71 | } |
| 68 | else | 72 | |
| 73 | // You should always have a global exit, quit, escape, something for | ||
| 74 | // dev-testing at least. | ||
| 75 | command: "exit" | ||
| 69 | { | 76 | { |
| 70 | display("...no extra for you"); | 77 | exit(); |
| 71 | } | 78 | } |
| 72 | } | 79 | } |
| 73 | 80 | ||
| 74 | function myGoto( txt ) | ||
| 75 | { | ||
| 76 | display( txt ); | ||
| 77 | goto( txt ); | ||
| 78 | } | ||
| 79 | |||
| 80 | function getThing() | ||
| 81 | { | ||
| 82 | display( situation.thing ); | ||
| 83 | } | ||
| 84 | |||
| 85 | situation <<start>> | 81 | situation <<start>> |
| 86 | { | 82 | { |
| 87 | setup | 83 | setup |
| 88 | { | 84 | { |
| 85 | player.inventory = []; | ||
| 89 | goto( <<diningRoom>> ); | 86 | goto( <<diningRoom>> ); |
| 90 | } | 87 | } |
| 91 | 88 | ||
| @@ -102,6 +99,7 @@ situation <<diningRoom>> | |||
| 102 | 'south': <<livingRoom>>, | 99 | 'south': <<livingRoom>>, |
| 103 | 'east': <<kitchen>> | 100 | 'east': <<kitchen>> |
| 104 | }; | 101 | }; |
| 102 | situation.items = ['postcard']; | ||
| 105 | } | 103 | } |
| 106 | enter | 104 | enter |
| 107 | { | 105 | { |
| @@ -127,15 +125,43 @@ situation <<livingRoom>> | |||
| 127 | 125 | ||
| 128 | situation <<kitchen>> | 126 | situation <<kitchen>> |
| 129 | { | 127 | { |
| 128 | command: "open" "cupboard" | ||
| 129 | { | ||
| 130 | if not situation.bCupboardOpen then | ||
| 131 | { | ||
| 132 | situation.bCupboardOpen = true; | ||
| 133 | if "pan" in situation.cupboardItems then | ||
| 134 | { | ||
| 135 | display("You open the cupboard, it's mostly empty. There is a | ||
| 136 | single frying pan inside."); | ||
| 137 | situation.cupboardItems -= "pan"; | ||
| 138 | situation.items += "pan"; | ||
| 139 | |||
| 140 | } | ||
| 141 | else | ||
| 142 | { | ||
| 143 | display("You open the cupboard, it's empty."); | ||
| 144 | } | ||
| 145 | } | ||
| 146 | else | ||
| 147 | { | ||
| 148 | display("The cupboard is already open."); | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 130 | setup | 152 | setup |
| 131 | { | 153 | { |
| 132 | situation.exits = { | 154 | situation.exits = { |
| 133 | 'west': <<diningRoom>> | 155 | 'west': <<diningRoom>> |
| 134 | }; | 156 | }; |
| 157 | situation.bCupboardOpen = false; | ||
| 158 | situation.cupboardItems = ['pan']; | ||
| 159 | situation.items = []; | ||
| 135 | } | 160 | } |
| 136 | 161 | ||
| 137 | enter | 162 | enter |
| 138 | { | 163 | { |
| 139 | display('''Kitchen!'''); | 164 | display('''You are standing in the kitchen. There is an electric |
| 165 | range, a microwave, cupboards, a fridge, and a window.'''); | ||
| 140 | } | 166 | } |
| 141 | } | 167 | } |
diff --git a/src/functiondisplay.cpp b/src/functiondisplay.cpp index ab37a08..7328293 100644 --- a/src/functiondisplay.cpp +++ b/src/functiondisplay.cpp | |||
| @@ -15,12 +15,13 @@ FunctionDisplay::~FunctionDisplay() | |||
| 15 | 15 | ||
| 16 | void FunctionDisplay::call( class GameState &gState ) | 16 | void FunctionDisplay::call( class GameState &gState ) |
| 17 | { | 17 | { |
| 18 | // Bu::String s = gState.popDeref().to( Variable::tString ).getString(); | 18 | Bu::String s = gState.popDeref().to( Variable::tString ).getString(); |
| 19 | 19 | sio << format( s ) << sio.nl; | |
| 20 | // sio << format( s ) << sio.nl; | ||
| 21 | 20 | ||
| 21 | /* | ||
| 22 | Variable v = gState.popDeref(); | 22 | Variable v = gState.popDeref(); |
| 23 | sio << "Display: " << v << sio.nl; | 23 | sio << "Display: " << v << sio.nl; |
| 24 | */ | ||
| 24 | } | 25 | } |
| 25 | 26 | ||
| 26 | Bu::String FunctionDisplay::format( const Bu::String &sSrc ) | 27 | Bu::String FunctionDisplay::format( const Bu::String &sSrc ) |
diff --git a/src/functionrandom.cpp b/src/functionrandom.cpp new file mode 100644 index 0000000..2665a14 --- /dev/null +++ b/src/functionrandom.cpp | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | #include "functionrandom.h" | ||
| 2 | |||
| 3 | #include "gamestate.h" | ||
| 4 | |||
| 5 | #include <stdlib.h> | ||
| 6 | |||
| 7 | FunctionRandom::FunctionRandom() | ||
| 8 | { | ||
| 9 | } | ||
| 10 | |||
| 11 | FunctionRandom::~FunctionRandom() | ||
| 12 | { | ||
| 13 | } | ||
| 14 | |||
| 15 | void FunctionRandom::call( class GameState &gState ) | ||
| 16 | { | ||
| 17 | Variable vHigh = gState.popDeref(); | ||
| 18 | Variable vLow = gState.popDeref(); | ||
| 19 | |||
| 20 | if( vHigh.getType() != vLow.getType() ) | ||
| 21 | throw Bu::ExceptionBase("Different types in random!"); | ||
| 22 | |||
| 23 | if( vLow.getType() == Variable::tInt ) | ||
| 24 | { | ||
| 25 | gState.push( Variable( (int64_t)( | ||
| 26 | (random()%(vHigh.getInt()-vLow.getInt()+1ll))+vLow.getInt() | ||
| 27 | ) ) ); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
diff --git a/src/functionrandom.h b/src/functionrandom.h new file mode 100644 index 0000000..b30f110 --- /dev/null +++ b/src/functionrandom.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | #ifndef FUNCTION_RANDOM_H | ||
| 2 | #define FUNCTION_RANDOM_H | ||
| 3 | |||
| 4 | #include "function.h" | ||
| 5 | |||
| 6 | class FunctionRandom : public Function | ||
| 7 | { | ||
| 8 | public: | ||
| 9 | FunctionRandom(); | ||
| 10 | virtual ~FunctionRandom(); | ||
| 11 | |||
| 12 | virtual Bu::String getName() const { return "random"; } | ||
| 13 | virtual void call( class GameState &gState ); | ||
| 14 | }; | ||
| 15 | |||
| 16 | #endif | ||
diff --git a/src/game.cpp b/src/game.cpp index 910cec2..c19b039 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
| @@ -4,13 +4,16 @@ | |||
| 4 | #include "functionexists.h" | 4 | #include "functionexists.h" |
| 5 | #include "functiondelete.h" | 5 | #include "functiondelete.h" |
| 6 | #include "functionexit.h" | 6 | #include "functionexit.h" |
| 7 | #include "functionrandom.h" | ||
| 7 | 8 | ||
| 8 | Game::Game() | 9 | Game::Game() |
| 9 | { | 10 | { |
| 11 | hGlobalParam.insert("start", Variable::newSituationName("start") ); | ||
| 10 | addFunction( new FunctionDisplay() ); | 12 | addFunction( new FunctionDisplay() ); |
| 11 | addFunction( new FunctionExists() ); | 13 | addFunction( new FunctionExists() ); |
| 12 | addFunction( new FunctionDelete() ); | 14 | addFunction( new FunctionDelete() ); |
| 13 | addFunction( new FunctionExit() ); | 15 | addFunction( new FunctionExit() ); |
| 16 | addFunction( new FunctionRandom() ); | ||
| 14 | } | 17 | } |
| 15 | 18 | ||
| 16 | Game::~Game() | 19 | Game::~Game() |
diff --git a/src/gamestate.cpp b/src/gamestate.cpp index dcae848..2032d5c 100644 --- a/src/gamestate.cpp +++ b/src/gamestate.cpp | |||
| @@ -465,7 +465,8 @@ void GameState::parse( const AstBranch::NodeList &lCode ) | |||
| 465 | { | 465 | { |
| 466 | Variable v = popDeref(); | 466 | Variable v = popDeref(); |
| 467 | Variable x = popDeref(); | 467 | Variable x = popDeref(); |
| 468 | if( v.getType() == Variable::tDictionary ) | 468 | if( v.getType() == Variable::tDictionary || |
| 469 | v.getType() == Variable::tList ) | ||
| 469 | { | 470 | { |
| 470 | push( Variable( v.has( x ) ) ); | 471 | push( Variable( v.has( x ) ) ); |
| 471 | } | 472 | } |
diff --git a/src/main.cpp b/src/main.cpp index b3dbba7..1f532d9 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
| @@ -3,6 +3,9 @@ | |||
| 3 | #include "gamestate.h" | 3 | #include "gamestate.h" |
| 4 | #include "parser.tab.h" | 4 | #include "parser.tab.h" |
| 5 | 5 | ||
| 6 | #include <stdlib.h> | ||
| 7 | #include <time.h> | ||
| 8 | |||
| 6 | #include <bu/sio.h> | 9 | #include <bu/sio.h> |
| 7 | using namespace Bu; | 10 | using namespace Bu; |
| 8 | 11 | ||
| @@ -28,6 +31,8 @@ int main( int argc, char *argv[] ) | |||
| 28 | 31 | ||
| 29 | fclose( in ); | 32 | fclose( in ); |
| 30 | 33 | ||
| 34 | srandom( time( NULL ) ); | ||
| 35 | |||
| 31 | Game *pGame = bld.getGame(); | 36 | Game *pGame = bld.getGame(); |
| 32 | 37 | ||
| 33 | GameState gs( pGame ); | 38 | GameState gs( pGame ); |
diff --git a/src/variable.cpp b/src/variable.cpp index 5296848..a3fb4a2 100644 --- a/src/variable.cpp +++ b/src/variable.cpp | |||
| @@ -242,8 +242,15 @@ bool Variable::has( const Variable &vKey ) | |||
| 242 | { | 242 | { |
| 243 | if( eType == tDictionary ) | 243 | if( eType == tDictionary ) |
| 244 | return hValue->has( vKey ); | 244 | return hValue->has( vKey ); |
| 245 | // else if( eType == tList ) | 245 | else if( eType == tList ) |
| 246 | // return lValue->contains( vKey ); | 246 | { |
| 247 | for( VariableList::const_iterator i = lValue->begin(); i; i++ ) | ||
| 248 | { | ||
| 249 | if( (*i) == vKey ) | ||
| 250 | return true; | ||
| 251 | } | ||
| 252 | return false; | ||
| 253 | } | ||
| 247 | else | 254 | else |
| 248 | throw Bu::ExceptionBase("Insert on non-dictionary."); | 255 | throw Bu::ExceptionBase("Insert on non-dictionary."); |
| 249 | } | 256 | } |
| @@ -17,24 +17,7 @@ situation <<start>> | |||
| 17 | { | 17 | { |
| 18 | setup | 18 | setup |
| 19 | { | 19 | { |
| 20 | dict = {1: "Hello"}; | 20 | display( random( 1, 3 ) ); |
| 21 | dict['bob'] = 'yup'; | ||
| 22 | display( dict ); | ||
| 23 | dict -= 1; | ||
| 24 | display( dict ); | ||
| 25 | |||
| 26 | lst = [55]; | ||
| 27 | lst += 112; | ||
| 28 | display( lst ); | ||
| 29 | lst -= 55; | ||
| 30 | display( lst ); | ||
| 31 | lst += "hi"; | ||
| 32 | lst += "Things"; | ||
| 33 | display("---For each test---"); | ||
| 34 | for each x : y in dict do | ||
| 35 | { | ||
| 36 | display( x ); | ||
| 37 | } | ||
| 38 | exit(); | 21 | exit(); |
| 39 | } | 22 | } |
| 40 | 23 | ||
