diff options
Diffstat (limited to 'src/scalevalapokalypsi/Model/Entities/NPCs')
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 + |