aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/Model/Entity.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/Model/Entity.scala')
-rw-r--r--src/main/scala/Model/Entity.scala61
1 files changed, 42 insertions, 19 deletions
diff --git a/src/main/scala/Model/Entity.scala b/src/main/scala/Model/Entity.scala
index c18ffea..37fdbc2 100644
--- a/src/main/scala/Model/Entity.scala
+++ b/src/main/scala/Model/Entity.scala
@@ -1,14 +1,35 @@
package o1game.Model
-import scala.collection.mutable.Map
+import scala.collection.mutable.{Buffer,Map}
-/** A `Player` object represents a player character controlled by the real-life user
+
+
+/** A `Player` object represents a player character controlled by one real-life player
* of the program.
*
* A player object’s state is mutable: the player’s location and possessions can change,
* for instance.
*
* @param startingArea the player’s initial location */
+class Player(name: String, initialLocation: Area) extends Entity(name, initialLocation):
+
+ private val observations: Buffer[String] = Buffer.empty
+
+ override def observe(observation: String): Unit =
+ this.observations.append(observation)
+
+ def readAndClearObservations(): Vector[String] =
+ val res = this.observations.toVector
+ observations.clear()
+ res
+
+end Player
+
+/** An in-game entity.
+ *
+ * @param name the name of the entity
+ * @param initialLocation the Area where the entity is instantiated
+ */
class Entity(val name: String, initialLocation: Area):
private var currentLocation: Area = initialLocation
private var quitCommandGiven = false // one-way flag
@@ -17,35 +38,43 @@ class Entity(val name: String, initialLocation: Area):
/** Determines if the player has indicated a desire to quit the game. */
def hasQuit = this.quitCommandGiven // TODO: This is probably unneccessary?
+ /** Does nothing, except possibly in inherited classes. */
+ def observe(observation: String): Unit =
+ println("no observation made.")
+ ()
+
/** Returns the player’s current location. */
def location = this.currentLocation
/** Attempts to move the player in the given direction. This is successful if there
* is an exit from the player’s current location towards the direction name. Returns
* a description of the result: "You go DIRECTION." or "You can't go DIRECTION." */
- def go(direction: String) =
+ def go(direction: String): (String, String) =
val destination = this.location.neighbor(direction)
if destination.isDefined then
this.currentLocation.removeEntity(this.name)
this.currentLocation = destination.getOrElse(this.currentLocation)
destination.foreach(_.addEntity(this))
- s"You go $direction."
+ (s"You go $direction.", s"$name goes $direction")
else
- "You can't go " + direction + "."
+ (
+ s"You can't go $direction.",
+ s"$name tries to go $direction and stumbles in their feet."
+ )
- def pickUp(itemName: String): String =
+ def pickUp(itemName: String): (String, String) =
this.currentLocation.removeItem(itemName) match
case Some(i) =>
this.inventory += i.name -> i
- s"You pick up the ${i.name}"
- case None => s"There is no $itemName here to pick up."
+ (s"You pick up the ${i.name}", s"$name picks up the ${i.name}")
+ case None => (s"There is no $itemName here to pick up.", "WHAAAT THIS SHOULDN'T HAPPEN???")
- def drop(itemName: String): String =
+ def drop(itemName: String): (String, String) =
this.inventory.remove(itemName) match
case Some(item) =>
this.currentLocation.addItem(item)
- s"You drop the $itemName"
- case None => "You don't have that!"
+ (s"You drop the $itemName", s"$name drops the $itemName")
+ case None => ("You don't have that!", s"$name reaches their backpack to drop $itemName but miserably fails to find it there.")
/** Tells whether this entity can drop the specified item
* (if an action were to specify so).
@@ -57,14 +86,8 @@ class Entity(val name: String, initialLocation: Area):
/** Causes the player to rest for a short while (this has no substantial effect in game terms).
* Returns a description of what happened. */
- def rest() =
- "You rest for a while. Better get a move on, though."
-
- /** Signals that the player wants to quit the game. Returns a description of what happened within
- * the game as a result (which is the empty string, in this case). */
- def quit() =
- this.quitCommandGiven = true
- ""
+ def rest(): (String, String) =
+ ("You rest for a while. Better get a move on, though.", "")
/** Returns a brief description of the player’s state, for debugging purposes. */
override def toString = "Now at: " + this.location.name