package scalevalapokalypsi.Model.Entities import scala.collection.mutable.Buffer 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(name: String, initialLocation: Area) extends Entity(name, initialLocation): private val observations: Buffer[String] = Buffer.empty private val observedEvents: Buffer[Event] = Buffer.empty private var pendingSingEffect: Option[SingEffect] = None override def observeString(observation: String): Unit = this.observations.append(observation) 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 /** 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 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 res = this.pendingSingEffect.map(ef => ef(singQuality)) this.pendingSingEffect = None 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 = res.map(ev => Event( ev.target, s"$quality\n${ev.inFirstPerson}", s"$quality\n${ev.inThirdPerson}" )) event.foreach(this.location.observeEvent(_)) end Player