package scalevalapokalypsi.Model.Entities import scala.collection.mutable.Map import scalevalapokalypsi.Model.* /** 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 private val inventory: Map[String, Item] = Map() /** 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): (String, String) = val destination = this.location.neighbor(direction) if destination.isDefined then val removeSuccess = this.currentLocation.removeEntity(this.name) assert(removeSuccess.isDefined) // Production - assertions off this.currentLocation = destination.getOrElse(this.currentLocation) destination.foreach(_.addEntity(this)) (s"You go $direction.", s"$name goes $direction") else ( s"You can't go $direction.", s"$name tries to go $direction and stumbles in their feet." ) 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}", s"$name picks up the ${i.name}") case None => ( s"There is no $itemName here to pick up.", s"${this.name} tries to pick up something but gets just dirt in their hands." ) def drop(itemName: String): (String, String) = this.inventory.remove(itemName) match case Some(item) => this.currentLocation.addItem(item) (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." ) def sayTo(entity: Entity, message: String): (String, String) = entity.observe(s"${this.name}: \"$message\"") (s"You say so to ${entity.name}.", "") def say(message: String): (String, String) = ("You say that aloud.", s"$name: \"$message\"") /** Tells whether this entity can drop the specified item * (if an action were to specify so). * * @param itemName the name to check * @return whether this entity has this item and can drop it */ def canDrop(itemName: String): Boolean = this.inventory.contains(itemName) /** Causes the player to rest for a turn. * Returns a description of what happened. */ 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 = s"${this.name} at ${this.location.name}" end Entity