aboutsummaryrefslogtreecommitdiff
path: root/src/scalevalapokalypsi/Model/Entities/NPCs
diff options
context:
space:
mode:
Diffstat (limited to 'src/scalevalapokalypsi/Model/Entities/NPCs')
-rw-r--r--src/scalevalapokalypsi/Model/Entities/NPCs/Bartender.scala52
-rw-r--r--src/scalevalapokalypsi/Model/Entities/NPCs/Cultist.scala53
-rw-r--r--src/scalevalapokalypsi/Model/Entities/NPCs/NPC.scala66
-rw-r--r--src/scalevalapokalypsi/Model/Entities/NPCs/Robber.scala72
-rw-r--r--src/scalevalapokalypsi/Model/Entities/NPCs/Zombie.scala70
5 files changed, 247 insertions, 66 deletions
diff --git a/src/scalevalapokalypsi/Model/Entities/NPCs/Bartender.scala b/src/scalevalapokalypsi/Model/Entities/NPCs/Bartender.scala
new file mode 100644
index 0000000..1743380
--- /dev/null
+++ b/src/scalevalapokalypsi/Model/Entities/NPCs/Bartender.scala
@@ -0,0 +1,52 @@
+/*
+package scalevalapokalypsi.Model.Entities.NPCs
+
+import scalevalapokalypsi.Model.{Area,Event,Item,Adventure}
+import scala.math.min
+
+class Bartender(
+ adventure: Adventure,
+ initialLocation: Area
+) extends NPC(
+ adventure,
+ "baarimikko",
+ initialLocation,
+ 100,
+ 100
+):
+
+
+ private var dialogIndex = 0
+
+ private val dialogs = Vector(
+ "Onnea matkaan. Tarjoan sinulle tuopin olutta rohkaisuksi.",
+ "Onnea matkaan."
+ )
+
+ def getDialog: String =
+
+ if dialogIndex == 0 then
+ this.location.addItem(Item(
+ "oluttuoppi",
+ "Tuopillinen kuohuvaa ja raikasta olutta. Se tuoksuu aika vahvalta.",
+ 1
+ ))
+ this.location.observeEvent(
+ Event(
+ Map.empty,
+ "Baarimikko kaataa tuoppiin olutta ja asettaa oluttuopin pöydälle."
+ )
+ )
+
+ dialogIndex = min(dialogIndex + 1, this.dialogs.length)
+
+ dialogs(dialogIndex - 1)
+
+ end getDialog
+
+
+ def act(): Unit = ()
+
+
+end Bartender
+*/
diff --git a/src/scalevalapokalypsi/Model/Entities/NPCs/Cultist.scala b/src/scalevalapokalypsi/Model/Entities/NPCs/Cultist.scala
new file mode 100644
index 0000000..fa5602e
--- /dev/null
+++ b/src/scalevalapokalypsi/Model/Entities/NPCs/Cultist.scala
@@ -0,0 +1,53 @@
+
+package scalevalapokalypsi.Model.Entities.NPCs
+
+import scala.collection.mutable.Buffer
+import scalevalapokalypsi.Model.*
+import scalevalapokalypsi.Model.Entities.*
+import scala.util.Random
+
+class Cultist(
+ adventure: Adventure,
+ identifier: String,
+ initialLocation: Area,
+ initialHP: Int = 100,
+ maxHP: Int = 100
+) extends NPC(adventure, identifier, initialLocation, initialHP, maxHP):
+
+ private val damage = 20
+
+ override def getDialog: String =
+ "Verta! Lisää verta!"
+
+ override def act(): Unit =
+ val possibleVictims = this.location
+ .getEntities
+ .filter(_ != this)
+ .filter(_ match
+ case c: Cultist => false
+ case other => true
+ )
+ .toVector
+ val index: Int =
+ if possibleVictims.isEmpty then 0
+ else Random.between(0, possibleVictims.length)
+ if !possibleVictims.isEmpty then
+ this.location.observeEvent(
+ this.curse(possibleVictims(index))
+ )
+
+
+ private def curse(entity: Entity): Event =
+ entity.takeDamage(this.damage)
+ Event(
+ Map.from(Vector((
+ entity,
+ s"${this.name} lausuu pimeän loitsun. Näet varjon pyyhältävän sinua kohti ja sinut valtaa kylmyys.\n" +
+ s"${entity.condition(0)}"
+ ))),
+ s"${this.name} käyttää kirousta henkilöön ${entity.name}\n" +
+ s"${entity.condition(1)}"
+ )
+
+end Cultist
+
diff --git a/src/scalevalapokalypsi/Model/Entities/NPCs/NPC.scala b/src/scalevalapokalypsi/Model/Entities/NPCs/NPC.scala
index 944f2e6..7d9996c 100644
--- a/src/scalevalapokalypsi/Model/Entities/NPCs/NPC.scala
+++ b/src/scalevalapokalypsi/Model/Entities/NPCs/NPC.scala
@@ -1,10 +1,8 @@
package scalevalapokalypsi.Model.Entities.NPCs
-import scala.collection.mutable.Buffer
import scalevalapokalypsi.Model.*
import scalevalapokalypsi.Model.Entities.*
-import scala.util.Random
/** A `NPC` object represents a non-playable in-game character controlled by
* the server using this objects `act` method. It can also be "talked to": it
@@ -25,67 +23,3 @@ abstract class NPC(
) extends Entity(adventure, name, initialLocation, initialHP, maxHp):
def getDialog: String
def act(): Unit
-
-class Zombie(
- adventure: Adventure,
- identifier: String,
- initialLocation: Area,
- initialHP: Int = 20
-) extends NPC(adventure, identifier, initialLocation, initialHP, 20):
-
- private val damage = 10
- private val dialogs = Vector(
- "örvlg",
- "grr",
- "äyyrrrgrlgb ww",
- "aaak brzzzwff ååö",
- "äkb glan abglum",
- "öub gpa"
- )
-
- override def getDialog: String =
- val dialogIndex = Random.between(0, this.dialogs.length)
- this.dialogs(dialogIndex)
-
- override def act(): Unit =
- val possibleVictims = this.location
- .getEntities
- .filter(_ != this)
- .toVector
- val index: Int =
- if possibleVictims.isEmpty then 0
- else Random.between(0, possibleVictims.length)
- if possibleVictims.isEmpty then
- val possibleDirections = this.location.getNeighborNames.toVector
- val directionIndex = Random.between(0, possibleDirections.length*2)
- possibleDirections
- .toVector
- .lift(directionIndex)
- .flatMap(this.go(_))
- .foreach(this.location.observeEvent(_))
- else
- this.location.observeEvent(
- this.attack(possibleVictims(index))
- )
-
-
- private def attack(entity: Entity): Event =
- if Random.nextBoolean() then
- entity.takeDamage(this.damage)
- Event(
- Map.from(Vector((
- entity,
- s"${this.name} puree sinua, hyi yäk!\n" +
- s"${entity.condition(0)}"
- ))),
- s"${this.name} puree henkilöä ${entity.name}.\n" +
- s"${entity.condition(1)}"
- )
- else
- Event(
- Map.from(Vector((
- entity,
- s"${this.name} yrittää purra sinua mutta kaatuu ohitsesi."
- ))),
- s"${this.name} yrittää purra henkilöä ${entity.name}, mutta epäonnistuu surkeasti."
- )
diff --git a/src/scalevalapokalypsi/Model/Entities/NPCs/Robber.scala b/src/scalevalapokalypsi/Model/Entities/NPCs/Robber.scala
new file mode 100644
index 0000000..fc009a6
--- /dev/null
+++ b/src/scalevalapokalypsi/Model/Entities/NPCs/Robber.scala
@@ -0,0 +1,72 @@
+
+package scalevalapokalypsi.Model.Entities.NPCs
+
+import scala.collection.mutable.Buffer
+import scalevalapokalypsi.Model.*
+import scalevalapokalypsi.Model.Entities.*
+import scala.util.Random
+
+class Robber(
+ adventure: Adventure,
+ name: String,
+ val weaponName: String,
+ val weaponDamage: Int,
+ val hitChance: Float,
+ initialLocation: Area,
+ initialHP: Int = 20
+) extends NPC(adventure, name, initialLocation, initialHP, 20):
+
+ private val dialogs = Vector(
+ "Rahat tai henki!",
+ "Anna tänne!",
+ "Syödään se ryöstön jälkeen!",
+ "Vesihiisi sihisi hississä ja muumit laaksosta poissaolollaan."
+ )
+
+ override def getDialog: String =
+ val dialogIndex = Random.between(0, this.dialogs.length)
+ this.dialogs(dialogIndex)
+
+ override def act(): Unit =
+ val possibleVictims = this.location
+ .getEntities
+ .filter(_ != this)
+ .filter(_ match
+ case z: Robber => false
+ case other => true
+ )
+ .toVector
+ val index: Int =
+ if possibleVictims.isEmpty then 0
+ else Random.between(0, possibleVictims.length)
+ if !possibleVictims.isEmpty then
+ this.location.observeEvent(
+ this.attack(possibleVictims(index))
+ )
+ //else
+ // this.location.getNeighborNames.filter(this.location.neighbor(_).map(_.getEntities.size > 0).getOrElse(false))
+
+
+ private def attack(entity: Entity): Event =
+ if Random.nextFloat() < this.hitChance then
+ entity.takeDamage(this.weaponDamage)
+ Event(
+ Map.from(Vector((
+ entity,
+ s"${this.name} lyö sinua ${this.weaponName}\n" +
+ s"${entity.condition(0)}"
+ ))),
+ s"${this.name} lyö henkilöä ${entity.name} ${this.weaponName}.\n" +
+ s"${entity.condition(1)}"
+ )
+ else
+ Event(
+ Map.from(Vector((
+ entity,
+ s"${this.name} yrittää lyödä sinua mutta väistät."
+ ))),
+ s"${this.name} yrittää lyödä henkilöä ${entity.name}, mutta tämä väistää."
+ )
+
+end Robber
+
diff --git a/src/scalevalapokalypsi/Model/Entities/NPCs/Zombie.scala b/src/scalevalapokalypsi/Model/Entities/NPCs/Zombie.scala
new file mode 100644
index 0000000..56cb160
--- /dev/null
+++ b/src/scalevalapokalypsi/Model/Entities/NPCs/Zombie.scala
@@ -0,0 +1,70 @@
+
+package scalevalapokalypsi.Model.Entities.NPCs
+
+import scala.collection.mutable.Buffer
+import scalevalapokalypsi.Model.*
+import scalevalapokalypsi.Model.Entities.*
+import scala.util.Random
+
+class Zombie(
+ adventure: Adventure,
+ identifier: String,
+ initialLocation: Area,
+ initialHP: Int = 20
+) extends NPC(adventure, identifier, initialLocation, initialHP, 20):
+
+ private val damage = 10
+ private val dialogs = Vector(
+ "örvlg",
+ "grr",
+ "äyyrrrgrlgb ww",
+ "aaak brzzzwff ååö",
+ "äkb glan abglum",
+ "öub gpa"
+ )
+
+ override def getDialog: String =
+ val dialogIndex = Random.between(0, this.dialogs.length)
+ this.dialogs(dialogIndex)
+
+ override def act(): Unit =
+ val possibleVictims = this.location
+ .getEntities
+ .filter(_ != this)
+ .filter(_ match
+ case z: Zombie => false
+ case other => true
+ )
+ .toVector
+ val index: Int =
+ if possibleVictims.isEmpty then 0
+ else Random.between(0, possibleVictims.length)
+ if !possibleVictims.isEmpty then
+ this.location.observeEvent(
+ this.attack(possibleVictims(index))
+ )
+
+
+ private def attack(entity: Entity): Event =
+ if Random.nextBoolean() then
+ entity.takeDamage(this.damage)
+ Event(
+ Map.from(Vector((
+ entity,
+ s"${this.name} puree sinua, hyi yäk!\n" +
+ s"${entity.condition(0)}"
+ ))),
+ s"${this.name} puree henkilöä ${entity.name}.\n" +
+ s"${entity.condition(1)}"
+ )
+ else
+ Event(
+ Map.from(Vector((
+ entity,
+ s"${this.name} yrittää purra sinua mutta kaatuu ohitsesi."
+ ))),
+ s"${this.name} yrittää purra henkilöä ${entity.name}, mutta epäonnistuu surkeasti."
+ )
+
+end Zombie
+