diff options
Diffstat (limited to 'src/main/scala/Model/Entity.scala')
-rw-r--r-- | src/main/scala/Model/Entity.scala | 61 |
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 |