diff --git a/src/main/scala/wordbots/CodeGenerator.scala b/src/main/scala/wordbots/CodeGenerator.scala index d5bafbd..d124afa 100644 --- a/src/main/scala/wordbots/CodeGenerator.scala +++ b/src/main/scala/wordbots/CodeGenerator.scala @@ -235,6 +235,7 @@ object CodeGenerator { case Half(num, RoundedDown) => s"(Math.floor(${g(num)} / 2))" case Half(num, RoundedUp) => s"(Math.ceil(${g(num)} / 2))" case MaximumEnergyAmount(player) => s"maximumEnergyAmount(${g(player)})" + case NumberOfObjectsDestroyedThisTurn => s"numberOfObjectsDestroyedThisTurn()" case ThatMuch => "thatMuch()" case Times(n1, n2) => s"((${g(n1)}) * (${g(n2)}))" diff --git a/src/main/scala/wordbots/Lexicon.scala b/src/main/scala/wordbots/Lexicon.scala index 46da639..6d52a36 100644 --- a/src/main/scala/wordbots/Lexicon.scala +++ b/src/main/scala/wordbots/Lexicon.scala @@ -472,6 +472,7 @@ object Lexicon { (PP/PP, λ {c: GlobalCondition => NotGC(c)}) )) + ("number" -> (Num/PP, λ {c: Collection => Count(c)})) + + ("number of objects destroyed this turn" -> (NP, NumberOfObjectsDestroyedThisTurn: Sem)) + (("object".s :+ "objects '") -> (N, AllObjects: Sem)) + ("odd" -> (NP/N, λ {attr: Attribute => AttributeComparison(attr, IsOdd)})) + ("of" -> Seq( diff --git a/src/main/scala/wordbots/Semantics.scala b/src/main/scala/wordbots/Semantics.scala index c2b51d4..174b15b 100644 --- a/src/main/scala/wordbots/Semantics.scala +++ b/src/main/scala/wordbots/Semantics.scala @@ -223,6 +223,7 @@ object Semantics { case class EnergyAmount(player: TargetPlayer) extends Number case class Half(num: Number, rounding: Rounding) extends Number case class MaximumEnergyAmount(player: TargetPlayer) extends Number + case object NumberOfObjectsDestroyedThisTurn extends Number case object ThatMuch extends Number // salient amount case class Times(num1: Number, num2: Number) extends Number diff --git a/src/main/scala/wordbots/Server.scala b/src/main/scala/wordbots/Server.scala index 5d38016..af6b1f9 100644 --- a/src/main/scala/wordbots/Server.scala +++ b/src/main/scala/wordbots/Server.scala @@ -12,7 +12,6 @@ import org.http4s.server.blaze.BlazeBuilder import io.circe._ import io.circe.generic.auto._ import io.circe.syntax._ -import org.log4s.MDC.result import scalaz.Memo import scalaz.concurrent.Task import wordbots.Semantics.AstNode diff --git a/src/test/scala/wordbots/ParserSpec.scala b/src/test/scala/wordbots/ParserSpec.scala index b80b093..f12daec 100644 --- a/src/test/scala/wordbots/ParserSpec.scala +++ b/src/test/scala/wordbots/ParserSpec.scala @@ -307,12 +307,13 @@ class ParserSpec extends FlatSpec with Matchers { parse("Give 1 health to all robots you control") shouldEqual parse("Give all robots you control 1 health") parse("All friendly robots lose 1 speed and 1 health and 1 attack") shouldEqual MultipleActions(Seq( - SaveTarget(ObjectsMatchingConditions(Robot,List(ControlledBy(Self)))), - ModifyAttribute(SavedTargetObject,Speed,Minus(Scalar(1))), - ModifyAttribute(SavedTargetObject,Health,Minus(Scalar(1))), - ModifyAttribute(SavedTargetObject,Attack,Minus(Scalar(1))) + SaveTarget(ObjectsMatchingConditions(Robot, List(ControlledBy(Self)))), + ModifyAttribute(SavedTargetObject, Speed, Minus(Scalar(1))), + ModifyAttribute(SavedTargetObject, Health, Minus(Scalar(1))), + ModifyAttribute(SavedTargetObject, Attack, Minus(Scalar(1))) )) - parse("Choose a tile") shouldEqual SaveTarget(ChooseT(AllTiles,Scalar(1))) + parse("Choose a tile") shouldEqual SaveTarget(ChooseT(AllTiles, Scalar(1))) + parse("Lose life equal to the number of objects destroyed this turn") shouldEqual DealDamage(Self, NumberOfObjectsDestroyedThisTurn) } it should "treat 'with' as 'that has'" in {