Quest Builder

From Arianne
Jump to: navigation, search

This is a draft of a new quest builder system. At this point it is only a first idea that needs further refinement.

Example for Kill Creatures Quest

/**
 * QUEST: CleanStorageSpace
 * <p>
 * PARTICIPANTS:
 * <li> Eonna
 * <p>
 * STEPS:
 * <li> Eonna asks you to clean her storage space.
 * <li> You go kill at least a rat, a cave rat and a cobra.
 * <li> Eonna checks your kills and then thanks you.
 * <p>
 * REWARD:
 * <li> 100 XP, karma
 * <p>
 * REPETITIONS:
 * <li> None.
 */
 
KillCreaturesQuestBuilder quest = new KillCreatureQuestBuilder();

quest.info()
    .name("Clean the Storage Space")
    .description("Eonna is too scared to go into her underground storage space, as it is filled with rats and snakes.")
    .internalName("CleanStorageSpace")
    .repeatable(false);
    .minLevel(0)
    .region(Region.SEMOS_CITY)
    .questGiverNpc("Eonna")


quest.history()
    .whenNpcWasMet("I have met Eonna at her house in Semos next to the bakery.")
    .whenQuestWasRejected("I do not want to clear her storage space of creatures.");
    .whenQuestWasAccepted("I promised Eonna to kill the rats and snakes in her basement.");
    .whenTaskWasCompleted("I have cleaned out Eonna's storage space.")
    .whenQuestWasCompleted("Wow, Eonna thinks I am her hero. *blush*")


quest.offer()
    //.when(new SomeCondition())
    .respondToRequest("My #basement is absolutely crawling with rats. Will you help me?")
    .respondToRepeatedRequest("Thanks again! I think it's still clear down there.")
    .respondToAccept("Oh, thank you! I'll wait up here, and if any try to escape I'll hit them with the broom!")
    .respondToReject("*sigh* Oh well, maybe someone else will be my hero...")
    .respondTo("basement", "storage space").saying("Yes, it's just down the stairs, over there. A whole bunch of nasty-looking rats; I think I saw a snake as well! You should be careful... still want to help me?")
    .remind("Don't you remember promising to clean out the rats from my #basement?")


quest.task()
    .requestKill(1, "rat")
    .requestKill(1, "caverat");
    .requestKill(1, "snake");


quest.complete()
    .greet("A hero at last! Thank you!")
    .rewardWith(new IncreaseKarmaAction(5.0)
    .rewardWith(new IncreaseXPAction(100));

Example for Request Item Quest

/**
 * QUEST: Armor for Dagobert
 *
 * PARTICIPANTS:
 * <ul>
 * <li>Dagobert, the consultant at the bank of Semos</li>
 * </ul>
 *
 * STEPS:
 * <ul>
 * <li>Dagobert asks you to find a leather cuirass.</li>
 * <li>You get a leather cuirass, e.g. by killing a cyclops.</li>
 * <li>Dagobert sees your leather cuirass and asks for it and then thanks you.</li>
 * </ul>
 *
 * REWARD:
 * <ul>
 * <li>50 XP</li>
 * <li>80 gold</li>
 * <li>Karma: 10</li>
 * <li>Access to vault</li>
 * </ul>
 *
 * REPETITIONS:
 * <ul>
 * <li>None</li>
 * </ul>
 */


ProvideItemQuestBuilder quest = new ProvideItemQuestBuilder();

quest.info()
    .name("Armor for Dagobert")
    .description("Dagobert, the consultant at the bank of Semos, needs protection.")
    .internalName("ArmorForDagobert")
    .repeatable(false);
    .minLevel(0)
    .region(Region.SEMOS_CITY)
    .questGiverNpc("Dagobert")

quest.history()
    .whenNpcWasMet("I have met Dagobert. He is the consultant at the bank in Semos.")
    .whenQuestWasRejected("He asked me to find a leather cuirass but I rejected his request.")
    .whenQuestWasAccepted("I promised to find a leather cuirass for him because he has been robbed.")
    .whenTaskWasDone("I found a leather cuirass and will take it to Dagobert.")
    .whenQuestWasCompleted("I took the leather cuirass to Dagobert. As a little thank you, he will allow me to use a private vault.");


quest.offer()
    .respondToRequest("I'm so afraid of being robbed. I don't have any protection. Do you think you can help me?")
    .respondToRepeatedRequest("Thank you very much for the armor, but I don't have any other task for you.")
    .respondToAccept("Once I had a nice #'leather cuirass', but it was destroyed during the last robbery. If you find a new one, I'll give you a reward.")
    .respondToReject("Well, then I guess I'll just duck and cover.")
    .remind("Luckily I haven't been robbed while you were away. I would be glad to receive a leather cuirass. Anyway, how can I #help you?")

npc.addReply(Arrays.toList("leather cuirass", "leather", "cuirass"), "A leather cuirass is the traditional cyclops armor. Some cyclopes are living in the dungeon deep under the city.");


quest.task()
    .requestItem(1, "leather cuirass")
    .alternativeItem(1, "pauldroned leather cuirass")

quest.complete()
    .greet("Excuse me, please! I have noticed the leather cuirass you're carrying. Is it for me?")
    .respondToReject("Well then, I hope you find another one which you can give to me before I get robbed again.")
    .respondToAccept("Oh, I am so thankful! Here is some gold I found ... ehm ... somewhere. Now that you have proven yourself a trusted customer, you may have access to your own private banking #vault any time you like.")
    .rewardWith(new EquipItemAction("money", 80));
    .rewardWith(new IncreaseXPAction(50));
    .rewardWith(new IncreaseKarmaAction(10));