neon.resources.quest.RQuest.java Source code

Java tutorial

Introduction

Here is the source code for neon.resources.quest.RQuest.java

Source

/*
 *   Neon, a roguelike engine.
 *   Copyright (C) 2014 - Maarten Driesen
 * 
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package neon.resources.quest;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import neon.resources.RData;
import org.jdom2.Element;

/**
 * A resource representing a quest.
 * 
 * @author mdriesen
 */
public class RQuest extends RData {
    public Element variables;
    public int frequency;
    // repeat quests kunnen meer als eens draaien
    public boolean repeat = false;
    // initial quest wordt toegevoegd van zodra spel start
    public boolean initial = false;
    // journal quests verschijnen in de player journal
    public boolean journal = true;

    private ArrayList<String> conditions = new ArrayList<String>();
    private ArrayList<Conversation> conversations = new ArrayList<Conversation>();
    private HashMap<Integer, Stage> stages = new HashMap<>();

    public RQuest(String id, Element properties, String... path) {
        super(id, path);
        name = properties.getAttributeValue("name");

        if (properties.getChild("stages") != null) {
            for (Element e : properties.getChild("stages").getChildren()) {
                Stage stage = new Stage(id, e);
                stages.put(stage.getIndex(), stage);
            }
        }

        if (properties.getChild("pre") != null) {
            for (Element condition : properties.getChild("pre").getChildren()) {
                conditions.add(condition.getTextTrim());
            }
        }

        if (properties.getChild("objects") != null) {
            variables = properties.getChild("objects").detach();
        }

        repeat = properties.getName().equals("repeat");
        if (repeat) {
            frequency = Integer.parseInt(properties.getAttributeValue("f"));
        }

        initial = (properties.getAttribute("init") != null);
        journal = (properties.getAttribute("journal") != null);

        if (properties.getChild("dialog") != null) {
            initDialog(properties.getChild("dialog"));
        }
    }

    public RQuest(String id, String... path) {
        super(id, path);
    }

    private void initDialog(Element dialog) {
        for (Element ce : dialog.getChildren("conversation")) {
            Conversation conversation = new Conversation(id, ce.getAttributeValue("id"));
            Topic root = new Topic(id, conversation.id, ce.getChild("root"));
            conversation.setRootTopic(root);
            for (Element te : ce.getChild("root").getChildren("topic")) {
                initTopic(conversation, root, te);
            }
            conversations.add(conversation);
        }
    }

    private void initTopic(Conversation conversation, Topic parent, Element te) {
        Topic topic = new Topic(id, conversation.id, te);
        conversation.addSubTopic(parent, topic);
        // recursief alle child topics toevoegen
        for (Element ce : te.getChildren("topic")) {
            initTopic(conversation, topic, ce);
        }
    }

    /**
     * @return   all dialog topics in this quest
     */
    public Collection<Conversation> getConversations() {
        return conversations;
    }

    /**
     * @return   all preconditions for this quest
     */
    public Collection<String> getConditions() {
        return conditions;
    }

    /**
     * 
     * @param index   
     * @return   the quest stage with the given index
     */
    public Stage getStage(int index) {
        if (!stages.containsKey(index)) {
            throw new IndexOutOfBoundsException();
        }
        return stages.get(index);
    }

    public Element toElement() {
        Element quest = new Element(repeat ? "repeat" : "quest");
        quest.setAttribute("name", name != null ? name : id);
        if (initial) {
            quest.setAttribute("init", "1");
        }

        if (!conditions.isEmpty()) {
            Element pre = new Element("pre");
            for (String condition : conditions) {
                pre.addContent(new Element("condition").setText(condition));
            }
            quest.addContent(pre);
        }

        if (variables != null) {
            quest.addContent(variables);
        }

        Element dialog = new Element("dialog");
        //      for(Topic topic : topics) {
        //         dialog.addContent(topic.toElement());
        //      }
        quest.addContent(dialog);

        return quest;
    }
}