package scalevalapokalypsi.Model.Entities import scala.collection.mutable.{Buffer, Map} import scala.collection.immutable import scalevalapokalypsi.Model.* /** 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 name the player's name * @param initialLocation the player’s initial location */ class Player( adventure: Adventure, name: String, initialLocation: Area ) extends Entity(adventure, name, initialLocation): private val observations: Buffer[String] = Buffer.empty private val observedEvents: Buffer[Event] = Buffer.empty private var pendingSingEffect: Option[SingEffect] = None // private var verseToSing: Option[String] = None override def getVerseAgainst: Vector[String] = Vector( "Pian pimeässä suossa", "lepäät levä ympärilläs", "lauluasi lausumahan", "et sikaa paremmin pysty" ) override def observe(event: Event): Unit = this.observedEvents.append(event) def readAndClearObservations(): Vector[String] = val res1 = this.observations val res2 = this.observedEvents.map(_.descriptionFor(this)) val res = (res1 ++ res2).toVector observations.clear() observedEvents.clear() res.filter(s => !(s.isEmpty)) /** Returns whether this player has a pending sing effect. */ def isSinging: Boolean = this.pendingSingEffect.isDefined /** Makes this player start singing, i.e. gives it this sing effect to * complete. * * @param effect the effect to apply based on the song. */ def setSingEffect(effect: SingEffect): Unit = this.pendingSingEffect = Some(effect) def getVerses: Option[Vector[String]] = this.pendingSingEffect.map(_.getVerses) // def getSingEffectTarget: Option[Entity] = // this.pendingSingEffect.map(_.target) /** Applies the pending sing effect and informs the surronding Entities * about the effects of the song. * * @param singQuality the quality of the song */ def applySingEffect(singQuality: Float): Unit = val qualityDescriptions = if singQuality < .10 then ("säälittävää", "epsilonin suuruinen") else if singQuality < .30 then ("heikkoa", "vähäinen") else if singQuality < .60 then ("keskinkertaista", "huomattavissa") else if singQuality < .80 then ("hyvää", "huomattava") else ("erinomaista", "merkittävä") val quality = s"Laulu on ${qualityDescriptions(0)} ja sen vaikutus on ${qualityDescriptions(1)}." val event = Event(immutable.Map.empty, s"$quality") this.location.observeEvent(event) this.pendingSingEffect .map(ef => ef(singQuality)) .map(this.location.observeEvent(_)) this.pendingSingEffect = None end Player