diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..917de8a
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..79ee123
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 74dd639..b2c751a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab03/Functions.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab03/Functions.kt
new file mode 100644
index 0000000..1973d7f
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab03/Functions.kt
@@ -0,0 +1,41 @@
+package ca.bcit.comp3717.lab03
+
+fun printByKey(k: Int, m: Map) {
+ println(m[k]);
+}
+
+val printByValue = fun(v: String?)
+{
+ println(v);
+};
+
+val getValue = { m: Map, k: Int -> m[k]; };
+
+fun getAndPrint(g: (m: Map, k: Int) -> String?, m: Map, k: Int)
+{
+ println(g(m, k));
+}
+
+fun consumeValue(action: (String) -> Unit, v: String)
+{
+ action(v);
+}
+
+fun main()
+{
+ val facts: Map = mapOf(1492 to "Christopher Columbus discovers America",
+ 1601 to "William Shakespear writes Hamlet",
+ 1632 to "Galileo discovered the acceleration of gravity on Earth to be 9.8m/s",
+ 1838 to "Rouphly 9.46 trillion km, the light-year is first used as a measurement in astronomy",
+ 2020 to "Covid 19 Pandemic");
+
+ facts.forEach(::println);
+
+ println()
+
+ printByKey(1492, facts);
+ printByValue(facts[1601]);
+ println(getValue(facts, 1632))
+ getAndPrint(getValue, facts, 1838);
+ consumeValue(::println, getValue(facts, 2020).toString());
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Dwarf.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Dwarf.kt
new file mode 100644
index 0000000..c5e1595
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Dwarf.kt
@@ -0,0 +1,10 @@
+package ca.bcit.comp3717.lab04
+
+class Dwarf : Minion()
+{
+ override val race: String = "Dwarf";
+ override val baseHealth: Int = 8;
+ override val baseSpeed: Int = 2;
+ override val backpackSize: Int = 8;
+ override val catchphrase: String = "Wheres' me trusty ol hammer?";
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Elf.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Elf.kt
new file mode 100644
index 0000000..7cbd868
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Elf.kt
@@ -0,0 +1,10 @@
+package ca.bcit.comp3717.lab04
+
+class Elf : Minion()
+{
+ override val race: String = "Elf";
+ override val baseHealth: Int = 2;
+ override val baseSpeed: Int = 8;
+ override val backpackSize: Int = 3;
+ override val catchphrase: String = "My arrows never miss!";
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Gather.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Gather.kt
new file mode 100644
index 0000000..dff880c
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Gather.kt
@@ -0,0 +1,28 @@
+package ca.bcit.comp3717.lab04
+
+class Gather(minion: Minion): Mission(minion), Repeatable
+{
+ override fun determineMissionTime(): Int
+ {
+ return (minion.backpackSize + minion.baseSpeed) * (1..4).random();
+ }
+
+ override fun reward(time: Int): String
+ {
+ return when (time)
+ {
+ in 10..21 -> "bronze"
+ in 22..33 -> "silver"
+ in 34..50 -> "gold"
+ else -> "nothing"
+ };
+ }
+
+ override fun repeat(times: Int, listener: MissionListener): Unit
+ {
+ for (i in 1..times)
+ {
+ start(listener);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Hunt.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Hunt.kt
new file mode 100644
index 0000000..35eca66
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Hunt.kt
@@ -0,0 +1,20 @@
+package ca.bcit.comp3717.lab04
+
+class Hunt(minion: Minion): Mission(minion)
+{
+ override fun determineMissionTime(): Int
+ {
+ return (minion.baseHealth + minion.baseSpeed) * (0..4).random();
+ }
+
+ override fun reward(time: Int): String
+ {
+ return when (time)
+ {
+ in 11..20 -> "mouse"
+ in 21..30 -> "fox"
+ in 31..50 -> "buffalo"
+ else -> "nothing"
+ };
+ }
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Main.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Main.kt
new file mode 100644
index 0000000..12b2191
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Main.kt
@@ -0,0 +1,45 @@
+package ca.bcit.comp3717.lab04
+
+fun main()
+{
+ val thing1 = Dwarf();
+ val thing2 = Elf()
+ val manager = MissionManager();
+
+ val mission1 = Gather(thing1);
+ val mission2 = Hunt(thing2);
+
+ manager.selectRepeatable(mission1, 1, object: MissionListener {
+ override fun missionStart(minion: Minion): Unit
+ {
+ println("A ${minion.race} was sent to gather resources");
+ }
+
+ override fun missionProgress(): Unit
+ {
+ println("...");
+ }
+
+ override fun missionComplete(minion: Minion, reward: String): Unit
+ {
+ println("A ${minion.race} has returned from a gather and found ${reward}!\n");
+ }
+ });
+
+ manager.select(mission2, object: MissionListener {
+ override fun missionStart(minion: Minion): Unit
+ {
+ println("A ${minion.race} started a hunt!");
+ }
+
+ override fun missionProgress(): Unit
+ {
+ println("...");
+ }
+
+ override fun missionComplete(minion: Minion, reward: String): Unit
+ {
+ println("An ${minion.race} has returned from a hunt, and found ${reward}!\n");
+ }
+ });
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Minion.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Minion.kt
new file mode 100644
index 0000000..bdaa3c2
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Minion.kt
@@ -0,0 +1,10 @@
+package ca.bcit.comp3717.lab04
+
+abstract class Minion
+{
+ abstract val race: String;
+ abstract val baseHealth: Int;
+ abstract val baseSpeed: Int;
+ abstract val backpackSize: Int;
+ abstract val catchphrase: String;
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Mission.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Mission.kt
new file mode 100644
index 0000000..12717a4
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Mission.kt
@@ -0,0 +1,26 @@
+package ca.bcit.comp3717.lab04
+
+abstract class Mission(protected val minion: Minion)
+{
+ init
+ {
+ println(minion.catchphrase);
+ }
+
+ fun start(listener: MissionListener): Unit
+ {
+ val time = determineMissionTime();
+ val reward = reward(time);
+
+ listener.missionStart(minion)
+ for (i in 0..2)
+ {
+ listener.missionProgress();
+ Thread.sleep(1000);
+ }
+
+ listener.missionComplete(minion, reward);
+ }
+ protected abstract fun determineMissionTime(): Int
+ protected abstract fun reward(time: Int): String
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/MissionListener.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/MissionListener.kt
new file mode 100644
index 0000000..8da5205
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/MissionListener.kt
@@ -0,0 +1,8 @@
+package ca.bcit.comp3717.lab04
+
+interface MissionListener
+{
+ fun missionStart(minion: Minion): Unit
+ fun missionProgress(): Unit
+ fun missionComplete(minion: Minion, message: String): Unit
+}
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/MissionManager.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/MissionManager.kt
new file mode 100644
index 0000000..1e9a379
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/MissionManager.kt
@@ -0,0 +1,14 @@
+package ca.bcit.comp3717.lab04
+
+class MissionManager
+{
+ fun select(mission: Mission, listener: MissionListener): Unit
+ {
+ mission.start(listener);
+ }
+
+ fun selectRepeatable(mission: Repeatable, i: Int, listener: MissionListener): Unit
+ {
+ mission.repeat(i, listener);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/ca/bcit/comp3717/lab04/Repeatable.kt b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Repeatable.kt
new file mode 100644
index 0000000..16bb5b7
--- /dev/null
+++ b/app/src/main/kotlin/ca/bcit/comp3717/lab04/Repeatable.kt
@@ -0,0 +1,6 @@
+package ca.bcit.comp3717.lab04
+
+interface Repeatable
+{
+ fun repeat(times: Int, listener: MissionListener)
+}
\ No newline at end of file