diff options
Diffstat (limited to 'src/scalevalapokalypsi/Model/Entities')
-rw-r--r-- | src/scalevalapokalypsi/Model/Entities/Entity.scala | 41 | ||||
-rw-r--r-- | src/scalevalapokalypsi/Model/Entities/Player.scala | 53 |
2 files changed, 70 insertions, 24 deletions
diff --git a/src/scalevalapokalypsi/Model/Entities/Entity.scala b/src/scalevalapokalypsi/Model/Entities/Entity.scala index 1592f2e..26dd7dc 100644 --- a/src/scalevalapokalypsi/Model/Entities/Entity.scala +++ b/src/scalevalapokalypsi/Model/Entities/Entity.scala @@ -20,25 +20,46 @@ class Entity( private var quitCommandGiven = false // one-way flag private val inventory: Map[String, Item] = Map() private var hp = initialHP - + + // TODO: add logic for choosing from multiplu lines - can depend on HP etc. + /** Gets a verse to sing when attacking against this entity. + * + * @return the verse to sing against this entity + */ + def getVerseAgainst: String = "Esimerkkirivi laulettavaksi" + def takeDamage(amount: Int): Unit = hp -= amount if hp < 0 then println("Oh no, I died!") - - def condition: String = + + /** Returns a description of the physical condition of this entity, + * i.e. the damage it has taken. + * + * @return a pair of strings, both of which describe the condition of this + * entity, the first of which is in first person and the second in + * third person. + */ + def condition: (String, String) = if hp < maxHP * .25 then - s"$name näyttää maansa myyneeltä." + ("Sinua heikottaa ja tunnet olevasi lähellä häviötä.", + s"$name näyttää maansa myyneeltä.") else if hp < maxHP * .50 then - s"$name näyttää sinnittelevän yhä." + ("Sinnittelet yhä, mutta kuntosi on laskenut suuresti.", + s"$name näyttää sinnittelevän yhä.") else if hp < maxHP * .75 then - s"$name näyttää aavistuksen lannistuneelta." + ("Tunnet koettelemusten vaikutuksen, mutta et anna niiden lannistaa itseäsi", + s"$name näyttää aavistuksen lannistuneelta.") + else if hp < maxHP then + ("Olet voimissasi.", s"$name on yhä voimissaan.") else - s"$name on yhä täysissä voimissaan." + ("Olet täysin kunnossa.", s"$name näyttää kuin vastasyntyneeltä.") /** Does nothing, except possibly in inherited classes. */ - def observe(observation: String): Unit = - println("[debug] entity got observation & discarded it") + def observeString(observation: String): Unit = + println(" [debug] entity got observation string & discarded it") + def observe(event: Event): Unit = + println(" [debug] entity got observation event & discarded it") /** Returns the player’s current location. */ def location = this.currentLocation @@ -83,7 +104,7 @@ class Entity( ) def sayTo(entity: Entity, message: String): (String, String) = - entity.observe(s"${this.name}: \"$message\"") + entity.observeString(s"${this.name}: \"$message\"") (s"You say so to ${entity.name}.", "") def say(message: String): (String, String) = diff --git a/src/scalevalapokalypsi/Model/Entities/Player.scala b/src/scalevalapokalypsi/Model/Entities/Player.scala index 7e441c1..f231c28 100644 --- a/src/scalevalapokalypsi/Model/Entities/Player.scala +++ b/src/scalevalapokalypsi/Model/Entities/Player.scala @@ -15,14 +15,20 @@ import scalevalapokalypsi.Model.* class Player(name: String, initialLocation: Area) extends Entity(name, initialLocation): private val observations: Buffer[String] = Buffer.empty - private var pendingSingEffect: Option[Float => String] = None + private val observedEvents: Buffer[Event] = Buffer.empty + private var pendingSingEffect: Option[SingEffect] = None - override def observe(observation: String): Unit = + 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 res = this.observations.toVector + 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. */ @@ -33,18 +39,37 @@ class Player(name: String, initialLocation: Area) extends Entity(name, initialLo * * @param effect the effect to apply based on the song. */ - def setSingEffect(effect: Float => String): Unit = + def setSingEffect(effect: SingEffect): Unit = this.pendingSingEffect = Some(effect) + + def getSingEffectTarget: Option[Entity] = + this.pendingSingEffect.map(_.target) - /** Applies the pending sing effect. - * - * @param singQuality the quality of the song - * @return a textual description of the effects of the song, - * or None if there was no pending sing effect. - */ - def applySingEffect(singQuality: Float): Option[String] = - val res = this.pendingSingEffect.map(f => f(singQuality)) + /** 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 - res - + 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 |