Commit bc6dabb9 authored by Martin LOISEAU's avatar Martin LOISEAU 🎄
Browse files

Rework node list system, improve debug print, more

parent 3490fb0f
......@@ -48,7 +48,7 @@ public class MainActivity extends AppCompatActivity {
//game logic
public ArrayList<Atom> Atoms;
public ArrayList<Node> OpenNodes, EveryNode;
public ArrayList<Node> OpenNodes, EveryNode, NodesToRemove, NodesToAdd;
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -73,6 +73,8 @@ public class MainActivity extends AppCompatActivity {
Atoms = new ArrayList<Atom>();
EveryNode = new ArrayList<Node>();
OpenNodes = new ArrayList<Node>();
NodesToAdd = new ArrayList<Node>();
NodesToRemove = new ArrayList<Node>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Log.d("Debug2", "Current path is: " + Paths.get("").toAbsolutePath().toString());
......@@ -91,7 +93,18 @@ public class MainActivity extends AppCompatActivity {
}
public void CheckOpenNodes() {
mainThread.run();
// this supposedly prevents java.util.ConcurrentModificationException
if(NodesToAdd.size()>0) {
OpenNodes.addAll(NodesToAdd);
NodesToAdd.clear();
}
if(NodesToRemove.size()>0) {
OpenNodes.removeAll(NodesToRemove);
NodesToRemove.clear();
}
if(OpenNodes.size()>0) mainThread.run();
}
public Node GetNode(int ID)
......@@ -104,7 +117,7 @@ public class MainActivity extends AppCompatActivity {
}
}
throw new Error("No existing node has the requested ID.");
throw new Error("No existing node has the requested ID: " + ID);
}
private void initializeListeners() {
......@@ -223,6 +236,13 @@ public class MainActivity extends AppCompatActivity {
if(QRActionRequesting != null) QRActionRequesting.GiveQRResult(data.getStringExtra("QR_CONTENT"));
}
@Override
protected void onPostResume() {
super.onPostResume();
if(QRActionRequesting != null) QRActionRequesting.TriggerEnd();
}
private void requestRecordAudioPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String requiredPermission = Manifest.permission.RECORD_AUDIO;
......
......@@ -3,8 +3,12 @@ package com.example.qrquest;
import android.util.Log;
import com.example.qrquest.atom.Atom;
import com.example.qrquest.atom.QRAtom;
import com.example.qrquest.atom.SpeechAtom;
import com.example.qrquest.node.Node;
import java.util.ArrayList;
public class MainThread implements Runnable {
private MainActivity mainActivity;
public Thread NodeThread;
......@@ -18,16 +22,23 @@ public class MainThread implements Runnable {
public void CheckOpenNodes() {
Log.d("Debug2", "CheckOpenNodes called");
Log.d("Debug2", "Open Nodes:");
for (Node n :
mainActivity.OpenNodes) {Log.d("Debug2", Integer.toString(n.ID));
for (Node n : mainActivity.OpenNodes)
{
String node_info = "ID: " + n.ID + " requires ";
for (Atom a: n.Conditions)
{
node_info += a.displayType() + a.GetStringValue() + " ";
}
Log.d("Debug2", node_info);
}
Log.d("Debug2", "Current Atoms : ");
for (Atom a :
mainActivity.Atoms) {Log.d("Debug2", a.GetStringValue());
for (Atom a : mainActivity.Atoms)
{
Log.d("Debug2", a.displayType() + a.GetStringValue());
}
for (Node n :
mainActivity.OpenNodes) {
for (Node n : mainActivity.OpenNodes)
{
if (n.CheckConditions(mainActivity.Atoms))
{
Log.d("Debug2", "Triggering node " + Integer.toString(n.ID));
......@@ -44,6 +55,6 @@ public class MainThread implements Runnable {
@Override
public void run() {
CheckOpenNodes();
this.CheckOpenNodes();
}
}
......@@ -13,6 +13,7 @@ import com.example.qrquest.actions.ClearNodes;
import com.example.qrquest.actions.RemoveAtom;
import com.example.qrquest.actions.RemoveNode;
import com.example.qrquest.actions.TTSReading;
import com.example.qrquest.atom.Any;
import com.example.qrquest.atom.Atom;
import com.example.qrquest.atom.ItemAtom;
import com.example.qrquest.atom.QRAtom;
......@@ -218,6 +219,7 @@ public class ScenarioLoader {
parser.require(XmlPullParser.END_TAG, ns, "atom");
if(type.equals("QRAtom")) return new QRAtom(Content);
else if(type.equals("SpeechAtom")) return new SpeechAtom(Content);
else if(type.equals("Any")) return new Any(Content);
else return new ItemAtom(Integer.parseInt(Content));
}
......@@ -259,7 +261,8 @@ public class ScenarioLoader {
private Class getClassFromName(String checkedClassString) {
if(checkedClassString.equals("QRAtom")) return QRAtom.class;
else if(checkedClassString.equals("SpeechAtom")) return SpeechAtom.class;
else return ItemAtom.class;
else if(checkedClassString.equals("Any")) return Any.class;
else return ItemAtom.class;
}
private String readText(XmlPullParser parser, String tag) throws IOException, XmlPullParserException {
......
......@@ -33,8 +33,8 @@ public class AbsoluteChecker extends Action {
{
Log.d("Debug2","AbsoluteChecker action reads " + a.GetStringValue());
if(a.GetStringValue().equals(WaitedValue)) mainActivity.OpenNodes.add(mainActivity.GetNode(SuccessNodeID));
else mainActivity.OpenNodes.add(mainActivity.GetNode(FailNodeID));
if(a.GetStringValue().equals(WaitedValue)) mainActivity.NodesToAdd.add(mainActivity.GetNode(SuccessNodeID));
else mainActivity.NodesToAdd.add(mainActivity.GetNode(FailNodeID));
mainActivity.Atoms.remove(a);
}
}
......
......@@ -18,7 +18,6 @@ public abstract class Action {
public void Do()
{
this.node = mainActivity.GetNode(nodeID); // getting the node in order to call the next action when action is over
//throw new Error("Do() Method from action was not overriden");
}
protected void End() { node.CallNextAction(); }
......
......@@ -19,7 +19,8 @@ public class AddNode extends Action {
super.Do();
Node toAdd = mainActivity.GetNode(NodeToAddID);
Log.d("Debug2", "Added Node " + toAdd.ID);
mainActivity.OpenNodes.add(toAdd);
// mainActivity.OpenNodes.add(toAdd);
mainActivity.NodesToAdd.add(toAdd);
End();
}
}
......@@ -24,6 +24,10 @@ public class CaptureQR extends Action {
{
Log.d("Debug2", "CaptureQR action received QR: " + result);
mainActivity.Atoms.add(new QRAtom(result));
}
public void TriggerEnd(){
End();
}
}
......@@ -3,6 +3,7 @@ package com.example.qrquest.actions;
import android.util.Log;
import com.example.qrquest.MainActivity;
import com.example.qrquest.node.Node;
public class ClearNodes extends Action {
......@@ -14,7 +15,11 @@ public class ClearNodes extends Action {
public void Do()
{
super.Do();
this.mainActivity.OpenNodes.clear();
for (Node n: mainActivity.OpenNodes)
{
mainActivity.NodesToRemove.add(n);
}
//this.mainActivity.OpenNodes.clear();
Log.d("Debug2", "Every open node cleared");
End();
}
......
......@@ -18,7 +18,8 @@ public class RemoveNode extends Action {
super.Do();
if(!mainActivity.OpenNodes.contains(mainActivity.GetNode(_nodeToRemoveID))) throw new Error("Tried to remove a node that wasn't open");
Log.d("Debug2", "Removed node " + _nodeToRemoveID);
mainActivity.OpenNodes.remove(mainActivity.GetNode(_nodeToRemoveID));
// mainActivity.OpenNodes.remove(mainActivity.GetNode(_nodeToRemoveID));
mainActivity.NodesToRemove.add(mainActivity.GetNode(_nodeToRemoveID));
End();
}
}
package com.example.qrquest.atom;
public class Any extends Atom {
/*
* This atom will be considered as the same as any other atom of class WantedClass
* It is used to catch unwanted values such as QRatoms or Speechatoms that doesn't trigger
* any node
* Note: an Any atom CANNOT be obtained by the player and will crash the game if in mainActivity.Atoms.
*/
public Class WantedClass;
public Any(String WantedClass)
{
this.WantedClass = getClassFromName(WantedClass);
}
@Override
public boolean hasSameValue(Atom atom) {
return true;
}
@Override
public String GetStringValue() {
return null;
}
@Override
public String displayType() {
return null;
}
}
......@@ -8,6 +8,14 @@ public abstract class Atom {
public boolean isSame(Atom atom)
{
if(this.getClass() == Any.class) throw new Error("Applied is same to Any atom (should be called in parameter)");
if(atom.getClass() == Any.class)
{
Any _Any = (Any)atom;
if(this.getClass() == _Any.WantedClass) return true;
else return false;
}
if(atom.getClass() != this.getClass())
{
return false;
......@@ -18,13 +26,16 @@ public abstract class Atom {
}
}
public boolean hasSameValue(Atom atom)
{
throw new Error(("hasSameValue should be overriden for every final atom class"));
}
public abstract boolean hasSameValue(Atom atom);
public String GetStringValue()
{
throw new Error(("GetValue should be overriden for every final atom class"));
public abstract String GetStringValue();
public abstract String displayType();
protected Class getClassFromName(String checkedClassString) {
if(checkedClassString.equals("QRAtom")) return QRAtom.class;
else if(checkedClassString.equals("SpeechAtom")) return SpeechAtom.class;
else if(checkedClassString.equals("Any")) return Any.class;
else return ItemAtom.class;
}
}
......@@ -16,4 +16,9 @@ public final class ItemAtom extends Atom {
}
public String GetStringValue() { return (Integer.toString(ID)); }
@Override
public String displayType() {
return "[ItemAtom] ";
}
}
......@@ -12,8 +12,13 @@ public final class QRAtom extends Atom {
{
if(atom.getClass() != QRAtom.class) return false;
QRAtom qrAtom = (QRAtom) atom;
return (qrAtom.AtomContent == AtomContent);
return (qrAtom.AtomContent.equals(AtomContent));
}
public String GetStringValue() { return (AtomContent); }
@Override
public String displayType() {
return "[QRAtom] ";
}
}
......@@ -12,8 +12,13 @@ public final class SpeechAtom extends Atom {
{
if(atom.getClass() != SpeechAtom.class) return false;
SpeechAtom sAtom = (SpeechAtom) atom;
return (sAtom.AtomContent == AtomContent);
return (sAtom.AtomContent.equals(AtomContent));
}
public String GetStringValue() { return (AtomContent); }
@Override
public String displayType() {
return "[SpeechAtom] ";
}
}
......@@ -34,7 +34,7 @@ public class Node {
for (Atom a1:AvailableAtoms) {
for(Atom a2:UnresolvedConditions)
{
if(a2.isSame(a1)) UnresolvedConditions.remove(a2);
if(a1.isSame(a2)) UnresolvedConditions.remove(a2);
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<!--
Important nodes:
Important nodes:
2 is map and add every place hub map
1X is a destination enterpoint:
10 home
11 mine
12 port
13 forgeron
Destination enter point:
100 home
200 mine
300 port
400 forgeron
500 menuisier
Items:
200 fer
300 sable
400 miroir
500 cadre
-->
<?xml version="1.0" encoding="utf-8"?>
<liste>
<node>
<id>1</id>
......@@ -20,15 +24,15 @@ Important nodes:
</required_atoms>
<action_list>
<TTSReading>Il était une fois Kouzou, un petit garçon de huit ans qui voulait devenir sorcier. Pour ce faire, il allait tous les jours rendre visite au sorcier Kazar dont la hutte au Nord du village. Kazar était âgé, sévère mais toujours juste. Un jour il dit à Kouzou : "Je pars au rassemblement des grands sorciers. Tu t'occuperas bien de mon chat Ozgor mais surtout n'abîme rien ! Je compte sur toi. Je reviens bientôt".
<TTSReading>Il était une fois Kouzou, <!-- un petit garçon de huit ans qui voulait devenir sorcier. Pour ce faire, il allait tous les jours rendre visite au sorcier Kazar dont la hutte au Nord du village. Kazar était âgé, sévère mais toujours juste. Un jour il dit à Kouzou : "Je pars au rassemblement des grands sorciers. Tu t'occuperas bien de mon chat Ozgor mais surtout n'abîme rien ! Je compte sur toi. Je reviens bientôt".
Dès le premier jour Ozgor essaya de s'échapper et Kouzou lui couru après pour le rattraper. "Ozgor, attention tu vas casser quelquechose !", hélas trop tard ! En sautant de la bibliothèque, Ozgor fit tomber le miroir magique de Kazar le sorcier. Que faire ! Kouzou ouvrit le grimoir des sortilèges de Kazar : "Super, j'ai trouvé la formule qu'il me faut. Il ne me reste plus qu'à fabriquer un miroir et de réciter la formule pour le rendre magique. Kouzou trouve la recette de fabrication d'un miroir : d'abord fabriquer une glace de verre, puis la recouvrir d'une pellicule métallique. Enfin, fabriquer un joli cadre en bois.
Aide Kouzou à fabriquer le miroir afin de le sortir de ce mauvais pas.</TTSReading>
<AddNode>2</AddNode>
Aide Kouzou à fabriquer le miroir afin de le sortir de ce mauvais pas. --></TTSReading>
<RemoveNode>1</RemoveNode>
<AddNode>2</AddNode>
<atom>
<type>ItemAtom</type>
<content>0</content>
</atom>
<AddNode>24</AddNode>
</action_list>
</node>
......@@ -40,16 +44,18 @@ Aide Kouzou à fabriquer le miroir afin de le sortir de ce mauvais pas.</TTSRead
<action_list>
<TTSReading>Choisis une destination !</TTSReading>
<AddNode>10</AddNode>
<AddNode>11</AddNode>
<AddNode>12</AddNode>
<AddNode>13</AddNode>
<CaptureQR>
<AddNode>100</AddNode>
<AddNode>200</AddNode>
<AddNode>300</AddNode>
<AddNode>400</AddNode>
<AddNode>500</AddNode>
<CaptureQR></CaptureQR>
<RemoveNode>2</RemoveNode>
</action_list>
</node>
<node> <!-- Home -->
<id>10</id>
<id>100</id>
<required_atoms>
<atom>
......@@ -59,13 +65,13 @@ Aide Kouzou à fabriquer le miroir afin de le sortir de ce mauvais pas.</TTSRead
</required_atoms>
<action_list>
<TTSReading>Bienvenue à la hutte</TTSReading>
<ClearNodes></ClearNodes>
<TTSReading>Bienvenue à la hutte</TTSReading>
</action_list>
</node>
<node> <!-- Mine -->
<id>11</id>
<id>200</id>
<required_atoms>
<atom>
......@@ -75,13 +81,74 @@ Aide Kouzou à fabriquer le miroir afin de le sortir de ce mauvais pas.</TTSRead
</required_atoms>
<action_list>
<TTSReading>Bienvenue à la mine</TTSReading>
<ClearNodes></ClearNodes>
<TTSReading>Kouzou arrive à la vieille mine de fer du village. À l'intérieur, il pourra trouver le fer dont il a besoin. Mais sur la porte de la mine, il y a un gros cadenas à 3 chiffres. Au dessus du cadenas, il est marqué : "Pour ouvrir le cadenas tu dois savoir multiplier 7 par 8". Quel nombre doit saisir Kouzou pour déverrouiller le cadenas ?</TTSReading>
<CaptureSpeech></CaptureSpeech>
<AddNode>201</AddNode>
<AddNode>202</AddNode>
</action_list>
</node>
<node> <!-- Mine success -->
<id>201</id>
<required_atoms>
<atom>
<type>SpeechAtom</type>
<content>56</content>
</atom>
</required_atoms>
<action_list>
<ClearNodes></ClearNodes>
<TTSReading>Le cadenas est déverouillé et Kouzou a pu prendre tout le fer dont il a besoin.</TTSReading>
<!-- Add fer -->
<atom>
<type>ItemAtom</type>
<content>100</content>
</atom>
<AddNode>2</AddNode>
</action_list>
</node>
<node> <!-- Mine fail (any speech catcher) -->
<id>202</id>
<required_atoms>
<atom>
<type>Any</type>
<content>SpeechAtom</content>
</atom>
</required_atoms>
<action_list>
<ClearNodes></ClearNodes>
<TTSReading>Zut ce n'est pas ça, il faut que je retourne m'entraîner.</TTSReading>
<AddNode>2</AddNode>
</action_list>
</node>
<node> <!-- Mine result checker (unused) -->
<id>250</id>
<required_atoms>
</required_atoms>
<action_list>
<ClearNodes></ClearNodes>
<!-- <AbsoluteChecker>
<waited_value>56</waited_value>
<atom_type>SpeechAtom</atom_type>
<success_node_id>202</success_node_id>
<fail_node_id>203</fail_node_id>
</AbsoluteChecker> -->
</action_list>
</node>
<node> <!-- Port -->
<id>12</id>
<id>300</id>
<required_atoms>
<atom>
......@@ -91,13 +158,13 @@ Aide Kouzou à fabriquer le miroir afin de le sortir de ce mauvais pas.</TTSRead
</required_atoms>
<action_list>
<TTSReading>Bienvenue au port</TTSReading>
<ClearNodes></ClearNodes>
<TTSReading>Bienvenue au port</TTSReading>
</action_list>
</node>
<node> <!-- Forgeron -->
<id>13</id>
<id>400</id>
<required_atoms>
<atom>
......@@ -107,8 +174,41 @@ Aide Kouzou à fabriquer le miroir afin de le sortir de ce mauvais pas.</TTSRead
</required_atoms>
<action_list>
<ClearNodes></ClearNodes>
<TTSReading>Bienvenue chez le forgeron</TTSReading>
</action_list>
</node>
<node> <!-- Menuisier -->
<id>500</id>
<required_atoms>
<atom>
<type>QRAtom</type>
<content>QRQUESTmenuisier</content>
</atom>
</required_atoms>
<action_list>
<ClearNodes></ClearNodes>
<TTSReading>Bienvenue chez le menuisier</TTSReading>
</action_list>
</node>
<node> <!-- Test -->
<id>99</id>
<required_atoms>
</required_atoms>
<action_list>
<ClearNodes></ClearNodes>
<TTSReading>Test</TTSReading>
</action_list>
</node>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment