/** * Silently sets the quest completed/finished flag, this does not fire any events. * * @param boolean completed Sets if the quest has been completed/finished. * @returns am.quest This */ int Quest_complete(lua_State *lua) { Quest *quest = castUData<Quest>(lua, 1); if (quest) { if (lua_gettop(lua) == 1) { lua_pushboolean(lua, quest->isCompleted()); return 1; } else if (lua_isbool(lua, 2)) { quest->setCompleted(lua_tobool(lua, 2)); lua_first(lua); } return LuaState::expectedArgs(lua, "complete", "boolean complete"); } return LuaState::expectedContext(lua, "complete", "am.quest"); }
static int QuestL_IsComplete(lua_State* luaVM) { bool complete = false; int nargs = lua_gettop(luaVM); switch(nargs) { case 1: { Quest* quest = luaW_check<Quest>(luaVM, 1); if(quest != NULL) { complete = quest->isCompleted(); } break; } } lua_pushboolean(luaVM, complete); return 1; }
bool TestLuaQuest::testSimple() { LuaState lua; Engine *prevEng = Engine::getEngine(); Engine *eng = new Engine(); Engine::setEngine(eng); Handle<Game> game(new Game(eng)); eng->setCurrentGame(game); Handle<Character> main(new Character()); main->setGameId("testMainChar"); game->setMainCharacter(main); int loadResult = lua.loadString("Quest, Character, Engine, Game, CoinPurse = import(" "\"Quest\", \"Character\", \"Engine\", \"Game\", \"CoinPurse\")\n" "local quest = Quest.new(\"testQuest\")\n" "Quest.add_quest(quest)\n" "local game = Engine.game()\n" "local main = game:main()\n" "local questStarted = false\n" "function startQuest(event)\n" " main:on(\"talk\", finishQuest)\n" " main:off(\"talk\", startQuest)\n" "end\n" "function finishQuest(event)\n" " main:off(\"talk\", finishQuest)\n" " main:add_experience(1000)\n" " main:coin_purse():add_coin(50)\n" " quest:set_complete(true)\n" "end\n" "main:on(\"talk\", startQuest)\n" ); if (!loadResult) { lua.logStack("LOAD ERR"); } assert(loadResult); lua_Debug ar; lua_getstack(lua, 1, &ar); Quest *quest = Engine::getGame()->getQuest("testQuest"); assert(!quest->isCompleted()); am_equals(0, main->getExperience()); am_equals(0, main->getLevel()); am_equals(0u, main->getCoinPurse()->getCoin()); Handle<Event> startEvent(new Event("talk")); main->fireEvent<Event>(startEvent); main->fireEvent<Event>(startEvent); am_equals(1000, main->getExperience()); am_equals(1, main->getLevel()); am_equals(50u, main->getCoinPurse()->getCoin()); Engine::setEngine(prevEng); delete eng; return true; }