Advertisement
Guest User

logic

a guest
Nov 26th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 4.01 KB | None | 0 0
  1. package com.game
  2.  
  3. import com.game.model._
  4.  
  5. import scala.annotation.tailrec
  6.  
  7. object MyGame {
  8.  
  9.   val worldState = new WorldState
  10.  
  11.   def main(args: Array[String]): Unit = {
  12.  
  13.     val gameEvent = GameEvent(
  14.       "Падает кирпич на голову", InLocation("dormitory_area"), Seq(
  15.         FollowDecision(
  16.           "Уклониться", IncreasePlayerStat("luck", "1"), PlayerStatApplicability("agility", GreaterThan, "10"),
  17.           Seq(LastDecision("Охереть", NothingChanged, AlwaysApplicable, "Вы просто охерели")), "Вы ловко уклоняетесь"
  18.         ),
  19.         LastDecision("Устремить свой взгляд в небо", Death, AlwaysApplicable, "Типа все")
  20.       ), "Вот уж ситуация!"
  21.     )
  22.  
  23.     receiveEvent(gameEvent)
  24.   }
  25.  
  26.   def receiveEvent(event: GameEvent): Unit = {
  27.     println(event.text)
  28.  
  29.     handleDecisions(event.decisions.filter(_.isApplicableTo(worldState)))
  30.   }
  31.  
  32.   @tailrec
  33.   def handleDecisions(decisions: Seq[Decision]): Unit = {
  34.  
  35.     val selectedDecision = promptForDecision(decisions)
  36.     println(selectedDecision.followingText)
  37.  
  38.     selectedDecision match {
  39.       case FollowDecision(name, consequence, _, followDecisions, _) =>
  40.         println(name)
  41.         applyConsequence(consequence)
  42.         handleDecisions(followDecisions.filter(_.isApplicableTo(worldState)))
  43.       case LastDecision(name, consequence, _, _) =>
  44.         println(name)
  45.         applyConsequence(consequence)
  46.     }
  47.   }
  48.  
  49.   def applyConsequence(consequence: Consequence): Unit =
  50.     worldState.change(consequence)
  51.  
  52.   // Assume for simplicity always first
  53.   def promptForDecision(decisions: Seq[Decision]): Decision = decisions.head
  54. }
  55.  
  56. package com.game
  57.  
  58. package object model {
  59.  
  60.   trait Consequence
  61.   case class IncreasePlayerStat(statName: String, value: String) extends Consequence
  62.   case object NothingChanged extends Consequence
  63.   case object Death extends Consequence
  64.  
  65.   trait TypeOfEquality
  66.   case object GreaterThan extends TypeOfEquality
  67.   case object LessThan extends TypeOfEquality
  68.   case object Equality extends TypeOfEquality
  69.  
  70.   trait Applicability {
  71.     // Будет ли отображаться это действие в списке
  72.     def isApplicable(worldState: WorldState): Boolean = ???
  73.   }
  74.   case class PlayerStatApplicability(statName: String, equality: TypeOfEquality, value: String) extends Applicability
  75.   case object AlwaysApplicable extends Applicability
  76.  
  77.   class Decision(name: String, consequence: Consequence, applicability: Applicability, text: String) {
  78.     // проверить применимость действия
  79.     def isApplicableTo(worldState: WorldState): Boolean = applicability.isApplicable(worldState)
  80.  
  81.     def followingText: String = text
  82.   }
  83.  
  84.   case class FollowDecision(name: String,
  85.                             consequence: Consequence,
  86.                             applicability: Applicability,
  87.                             decisions: Seq[Decision],
  88.                             text: String
  89.                            ) extends Decision(name, consequence, applicability, text)
  90.  
  91.   case class LastDecision(name: String,
  92.                           consequence: Consequence,
  93.                           applicability: Applicability,
  94.                           text: String
  95.                          ) extends Decision(name, consequence, applicability, text)
  96.  
  97.   case class GameEvent(name: String,
  98.                        condition: Condition,
  99.                        decisions: Seq[Decision],
  100.                        text: String)
  101.  
  102.   trait Condition {
  103.     def isMet(worldState: WorldState): Boolean
  104.   }
  105.  
  106.   case class InLocation(name: String) extends Condition {
  107.     // Проверяем что игрок находится на нужной локации
  108.     override def isMet(worldState: WorldState): Boolean = ???
  109.   }
  110.  
  111.   class WorldState {
  112.     // Нужно описывать игрока, локацию и т.д.
  113.     def change(consequence: Consequence): Unit = {}
  114.   }
  115.  
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement