diff options
Diffstat (limited to 'src/scalevalapokalypsi/Model/Action.scala')
-rw-r--r-- | src/scalevalapokalypsi/Model/Action.scala | 75 |
1 files changed, 33 insertions, 42 deletions
diff --git a/src/scalevalapokalypsi/Model/Action.scala b/src/scalevalapokalypsi/Model/Action.scala index 30fbf46..a781ee8 100644 --- a/src/scalevalapokalypsi/Model/Action.scala +++ b/src/scalevalapokalypsi/Model/Action.scala @@ -15,33 +15,25 @@ class Action(input: String): private val verb = commandText.takeWhile( _ != ' ' ) private val modifiers = commandText.drop(verb.length).trim - def takesATurnFor(actor: Player): Boolean = - this.verb match - case "rest" => true - case "go" => actor.location.hasNeighbor(modifiers) - case "get" => actor.location.hasItem(this.modifiers) - case "drop" => actor.canDrop(this.modifiers) - case "say" => false - case "laula" => false - case other => false - /** Causes the given player to take the action represented by this object, - * assuming that the command was understood. Returns a description of what - * happened as a result of the action (such as “You go west.”). The - * description is returned in an `Option` wrapper; if the command was not - * recognized, `None` is returned. + * assuming that the command was understood. Informs the player and the + * entities surrounding it about the result. Returns true if the command + * was understood and possible, false otherwise. * * @param actor the acting player - * @return A textual description of the action, or `None` if the action - * was not recognized. + * @return Boolean indicating whether the action possibly taken takes a + * turn or not. */ - def execute(actor: Player): Option[String] = + def execute(actor: Player): Boolean = val oldLocation = actor.location - val resOption: Option[(String, String)] = this.verb match - case "go" => Some(actor.go(this.modifiers)) - case "rest" => Some(actor.rest()) - case "get" => Some(actor.pickUp(this.modifiers)) - case "say" => + val resOption: Option[(Boolean, Event)] = this.verb match + case "go" => + val result = actor.go(this.modifiers) + result.foreach(r => oldLocation.observeEvent(r)) + result.map((true, _)) + case "rest" => Some((true, actor.rest())) + case "get" => Some((false, actor.pickUp(this.modifiers))) + case "say" => val to = "to" val recipient = modifiers.reverse.takeWhile(_ != ' ').reverse val recipientEntity = actor.location.getEntity(recipient) @@ -52,10 +44,10 @@ class Action(input: String): val message = modifiers.take(modifiers.length - recipient.length - 4) if maybeTo == to then - recipientEntity.map(actor.sayTo(_, message)) + recipientEntity.map(e => (false, actor.sayTo(e, message))) else - Some(actor.say(modifiers)) - case "drop" => Some(actor.drop(this.modifiers)) + Some((false, actor.say(modifiers))) + case "drop" => Some((false, actor.drop(this.modifiers))) case "laula" => val end = modifiers.takeRight("suohon".length) val start = @@ -64,28 +56,27 @@ class Action(input: String): val targetEntity = actor.location.getEntity(start) targetEntity .foreach(e => actor.setSingEffect(DefaultSingAttack(e))) - targetEntity.foreach(_.observeString(s"${actor.name} laulaa sinua suohon!")) - targetEntity.map(e => ( - "Aloitat suohonlaulun.", - s"${actor.name} aloittaa suohonlaulun." - )) + targetEntity.map(t => + (false, Event( + Map.from(Vector((t, s"${actor.name} laulaa sinua suohon!"))), + s"${actor.name} laulaa henkilöä ${t.name} suohon." + )) + ) else None - case "xyzzy" => Some(( - "The grue tastes yummy.", + case "xyzzy" => Some((false, Event( + Map.from(Vector((actor, "The grue tastes yummy."))), s"${actor.name} tastes some grue.") - ) + )) case other => None - resOption.map(_(1)).filter(_.length > 0) - .foreach(s => - actor.location.getEntities.filter(_ != actor).foreach(_.observeString(s)) - if oldLocation != actor.location then - oldLocation.getEntities.foreach(_.observeString(s)) - ) - - resOption.map(_(0)) - + val res: (Boolean, Event) = resOption + .getOrElse((false, Event( + Map.from(Vector((actor, "Tuo ei ole asia, jonka voit tehdä."))), + "" + ))) + actor.location.observeEvent(res(1)) + res(0) /** Returns a textual description of the action object, for debugging purposes. */ override def toString = s"$verb (modifiers: $modifiers)" |