Finished quest engine for evadventure
This commit is contained in:
parent
944420e92e
commit
dc431fd5a5
4 changed files with 465 additions and 67 deletions
|
|
@ -5,7 +5,6 @@ Test EvAdventure combat.
|
|||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from anything import Something
|
||||
from evennia.utils import create
|
||||
from evennia.utils.test_resources import BaseEvenniaTest
|
||||
|
||||
|
|
@ -13,13 +12,7 @@ from .. import combat_turnbased
|
|||
from ..characters import EvAdventureCharacter
|
||||
from ..enums import WieldLocation
|
||||
from ..npcs import EvAdventureMob
|
||||
from ..objects import (
|
||||
EvAdventureConsumable,
|
||||
EvAdventureRunestone,
|
||||
EvAdventureWeapon,
|
||||
WeaponEmptyHand,
|
||||
)
|
||||
from ..rooms import EvAdventureRoom
|
||||
from ..objects import EvAdventureConsumable, EvAdventureRunestone, EvAdventureWeapon
|
||||
from .mixins import EvAdventureMixin
|
||||
|
||||
|
||||
|
|
|
|||
150
evennia/contrib/tutorials/evadventure/tests/test_quests.py
Normal file
150
evennia/contrib/tutorials/evadventure/tests/test_quests.py
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
"""
|
||||
Testing Quest functionality.
|
||||
|
||||
"""
|
||||
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from evennia.utils.test_resources import BaseEvenniaTest
|
||||
|
||||
from .. import quests
|
||||
from ..objects import EvAdventureObject
|
||||
from .mixins import EvAdventureMixin
|
||||
|
||||
|
||||
class _TestQuest(quests.EvAdventureQuest):
|
||||
"""
|
||||
Test quest.
|
||||
|
||||
"""
|
||||
|
||||
key = "testquest"
|
||||
desc = "A test quest!"
|
||||
|
||||
start_step = "A"
|
||||
end_text = "This task is completed."
|
||||
|
||||
help_A = "You need to do A first."
|
||||
help_B = "Next, do B."
|
||||
|
||||
def step_A(self, *args, **kwargs):
|
||||
"""
|
||||
Quest-step A is completed when quester carries an item with tag "QuestA" and category
|
||||
"quests".
|
||||
"""
|
||||
# note - this could be done with a direct db query instead to avoid a loop, for a
|
||||
# unit test it's fine though
|
||||
if any(obj for obj in self.quester.contents if obj.tags.has("QuestA", category="quests")):
|
||||
self.quester.msg("Completed step A of quest!")
|
||||
self.current_step = "B"
|
||||
self.progress()
|
||||
|
||||
def step_B(self, *args, **kwargs):
|
||||
"""
|
||||
Quest-step B is completed when the progress-check is called with a special kwarg
|
||||
"complete_quest_B"
|
||||
|
||||
"""
|
||||
if kwargs.get("complete_quest_B", False):
|
||||
self.quester.msg("Completed step B of quest!")
|
||||
self.quester.db.test_quest_counter = 0
|
||||
self.current_step = "C"
|
||||
self.progress()
|
||||
|
||||
def help_C(self):
|
||||
"""Testing the method-version of getting a help entry"""
|
||||
return f"Only C left now, {self.quester.key}!"
|
||||
|
||||
def step_C(self, *args, **kwargs):
|
||||
"""
|
||||
Step C (final) step of quest completes when a counter on quester is big enough.
|
||||
|
||||
"""
|
||||
if self.quester.db.test_quest_counter and self.quester.db.test_quest_counter > 5:
|
||||
self.quester.msg("Quest complete! Get XP rewards!")
|
||||
self.quester.db.xp += 10
|
||||
self.complete()
|
||||
|
||||
def cleanup(self):
|
||||
"""
|
||||
Cleanup data related to quest.
|
||||
|
||||
"""
|
||||
del self.quester.db.test_quest_counter
|
||||
|
||||
|
||||
class EvAdventureQuestTest(EvAdventureMixin, BaseEvenniaTest):
|
||||
"""
|
||||
Test questing.
|
||||
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.character.quests.add(_TestQuest)
|
||||
self.character.msg = MagicMock()
|
||||
|
||||
def _get_quest(self):
|
||||
return self.character.quests.get(_TestQuest.key)
|
||||
|
||||
def _fulfillA(self):
|
||||
"""Fulfill quest step A"""
|
||||
EvAdventureObject.create(
|
||||
key="quest obj", location=self.character, tags=(("QuestA", "quests"),)
|
||||
)
|
||||
|
||||
def _fulfillC(self):
|
||||
"""Fullfill quest step C"""
|
||||
self.character.db.test_quest_counter = 6
|
||||
|
||||
def test_help(self):
|
||||
"""Get help"""
|
||||
# get help for all quests
|
||||
help_txt = self.character.quests.get_help()
|
||||
self.assertEqual(help_txt, ["|ctestquest|n\n A test quest!\n\n - You need to do A first."])
|
||||
|
||||
# get help for one specific quest
|
||||
help_txt = self.character.quests.get_help(_TestQuest.key)
|
||||
self.assertEqual(help_txt, ["|ctestquest|n\n A test quest!\n\n - You need to do A first."])
|
||||
|
||||
# help for finished quest
|
||||
self._get_quest().is_completed = True
|
||||
help_txt = self.character.quests.get_help()
|
||||
self.assertEqual(help_txt, ["|ctestquest|n\n A test quest!\n\n - This quest is completed!"])
|
||||
|
||||
def test_progress__fail(self):
|
||||
"""
|
||||
Check progress without having any.
|
||||
"""
|
||||
# progress all quests
|
||||
self.character.quests.progress()
|
||||
# progress one quest
|
||||
self.character.quests.progress(_TestQuest.key)
|
||||
|
||||
# still on step A
|
||||
self.assertEqual(self._get_quest().current_step, "A")
|
||||
|
||||
def test_progress(self):
|
||||
"""
|
||||
Fulfill the quest steps in sequess
|
||||
|
||||
"""
|
||||
# A requires a certain object in inventory
|
||||
self._fulfillA()
|
||||
self.character.quests.progress()
|
||||
self.assertEqual(self._get_quest().current_step, "B")
|
||||
|
||||
# B requires progress be called with specific kwarg
|
||||
# should not step (no kwarg)
|
||||
self.character.quests.progress()
|
||||
self.assertEqual(self._get_quest().current_step, "B")
|
||||
|
||||
# should step (kwarg sent)
|
||||
self.character.quests.progress(complete_quest_B=True)
|
||||
self.assertEqual(self._get_quest().current_step, "C")
|
||||
|
||||
# C requires a counter Attribute on char be high enough
|
||||
self._fulfillC()
|
||||
self.character.quests.progress()
|
||||
self.assertEqual(self._get_quest().current_step, "C") # still on last step
|
||||
self.assertEqual(self._get_quest().is_completed, True)
|
||||
Loading…
Add table
Add a link
Reference in a new issue