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 * returns a dialog when asked for. * * A NPC object’s state is mutable: the NPC’s location and possessions can change, * for instance. * * @param name the NPC's name * @param initialLocation the NPC’s initial location */ abstract class NPC( name: String, initialLocation: Area, initialHP: Int, maxHp: Int ) extends Entity(name, initialLocation, initialHP, maxHp): def getDialog: String def act(): Unit class Zombie( identifier: String, initialLocation: Area, initialHP: Int = 20 ) extends NPC(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(_)) .map(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." )