diff options
Diffstat (limited to 'src/scalevalapokalypsi/Model/Adventure.scala')
-rw-r--r-- | src/scalevalapokalypsi/Model/Adventure.scala | 253 |
1 files changed, 149 insertions, 104 deletions
diff --git a/src/scalevalapokalypsi/Model/Adventure.scala b/src/scalevalapokalypsi/Model/Adventure.scala index dd55727..9f538c5 100644 --- a/src/scalevalapokalypsi/Model/Adventure.scala +++ b/src/scalevalapokalypsi/Model/Adventure.scala @@ -1,6 +1,6 @@ package scalevalapokalypsi.Model -import scala.collection.mutable.Map +import scala.collection.mutable.{Map,Buffer} import scala.collection.immutable import scalevalapokalypsi.Model.Entities.* import scalevalapokalypsi.Model.Entities.NPCs.* @@ -24,6 +24,18 @@ import scala.math.min */ class Adventure(val playerNames: Vector[String]): + // Structure: + // * Area definitions + // * Area neighbor definitions + // * Item definitions + // * Public values for containing entities + // * NPC definitions & adding them + // * Adding players + // * Public methods + + + // Area definitions + private val chieftainsGates = Area( "Kyläpäällikön portti", "Olet kyläpäällikön talon porttien edessä. Kylänraitti jatkuu pohjoiseen." @@ -34,7 +46,7 @@ class Adventure(val playerNames: Vector[String]): ) private val bar = Area( "Baari", - "[TODO] Olet baarissa. Tavallisesti täällä soisi musiikki ja ihmiset tanssivat ilosta, mutta nyt täällä nuokkuu vain muutama ihmistä baaritiskillä." + "Olet baarissa. Tavallisesti täällä soisi musiikki ja ihmiset tanssivat ilosta, mutta nyt täällä nuokkuu vain muutama ihmistä baaritiskillä." ) private val villageNorth = Area( "Kylän pohjoinen portti", @@ -54,7 +66,7 @@ class Adventure(val playerNames: Vector[String]): ) private val northForest = Area( "Luumetsä", - "[TODO] Olet metsässä Luukallion pohjoispuolella. Kuulet ympäriltäsi epämääräisiä ääniä." + "Olet metsässä Luukallion pohjoispuolella. Kuulet ympäriltäsi epämääräisiä ääniä." ) private val northOfNorthForest = Area( "Luumetsä", @@ -70,7 +82,7 @@ class Adventure(val playerNames: Vector[String]): ) private val eastForest = Area( "Luumetsä", - "[TODO] idk mitä täällä on?" + "Olet Luumetsässä. Luukallio kohoaa lännessä." ) private val southForest = Area( "Luumetsä", @@ -105,8 +117,8 @@ class Adventure(val playerNames: Vector[String]): "Olet varastohuoneessa. Näet täällä tynnyreitä, joiden sisältö ei näytä siltä, että tahdot koskea siihen. Tavarat huoneessa näyttävät siltä, että niitä saatettaisiin käyttää joihinkin kulttimenoihin. Luulet, että yksi tynnyreistä on täynnä verta." ) private val otherCaveRoom = Area( - "Idk", - "[TODO] mitä tänne?" + "Sellihuone", + "Olet huoneessa, joka on täynnä sellejä. Selleihin on lukittu pahoinvoivan näköisiä ihmisiä, joilla on paiseita." ) private val bossFightRoom = Area( "Suuri huone kallion sisässä", @@ -126,6 +138,8 @@ class Adventure(val playerNames: Vector[String]): ) + // Area neighbor definitions + chieftainsGates .setNeighbors(Vector("pohjoiseen" -> villageMain)) villageMain .setNeighbors(Vector("etelään" -> chieftainsGates, "baariin" -> bar, "pohjoiseen" -> villageNorth)) bar .setNeighbors(Vector("ulos" -> villageMain)) @@ -143,7 +157,7 @@ class Adventure(val playerNames: Vector[String]): northOfNorthForest.setNeighbors(Vector("pohjoiseen" -> northOfNorthForest, "itään" -> northOfNorthForest, "länteen" -> northOfNorthForest, "etelään" -> northForest)) eastOfEastForest .setNeighbors(Vector("pohjoiseen" -> eastOfEastForest, "itään" -> eastOfEastForest, "länteen" -> eastForest, "etelään" -> eastOfEastForest)) southOfSouthForest.setNeighbors(Vector("pohjoiseen" -> southForest, "itään" -> southOfSouthForest, "länteen" -> southOfSouthForest, "etelään" -> southOfSouthForest)) - caveDescent .setNeighbors(Vector("ulos" -> southForest, "syvemmälle" -> secondCaveDescent)) + caveDescent .setNeighbors(Vector("syvemmälle" -> secondCaveDescent)) secondCaveDescent .setNeighbors(Vector("ylemmäs" -> caveDescent, "syvemmälle" -> bossDoor)) bossDoor .setNeighbors(Vector("länteen" -> storageRoom, "itään" -> otherCaveRoom, "ulos" -> secondCaveDescent)) storageRoom .setNeighbors(Vector("ulos" -> bossDoor)) @@ -154,17 +168,80 @@ class Adventure(val playerNames: Vector[String]): chieftainsHouse.addItem(Item("siivilä", "mystinen, musta esine, jonka pohjassa on reikiä ja jota koristaa yliviivattua silmää kuvastava logo", 1)) + // Item definitions + + private val oluttuoppi = Item("oluttuoppi", "Tuopillinen kylmää ja kuohuvaa juomaa. Se tuoksuu aika tujulta.", 1) + + object SeparatorScroll extends Item( + "separoitumisen laulukäärö", + "Laulukäärö, joka antaa sanat separoitumisen laululle, joka saa aikaan raon jopa harmaaseen kiveen.", + 1 + ): + + class SeparatorEffect(actor: Entity) extends SingEffect(actor): + def getVerses: Vector[String] = + Vector( + "Separoidu kova kivi", + "jakaudu ja ratkeapi", + "laske minut syvyyksiisi", + "kalmankylmiin lähteisiisi" + ) + + def apply(quality: Float): Event = + if actor.location == southForest && quality > .1 && !southForest.hasNeighbor("kallion sisään") then + southForest.setNeighbor("kallion sisään", caveDescent) + caveDescent.setNeighbor("ulos", southForest) + Event( + Vector(actor -> "Kivi halkeaa rytinällä. Nyt näet sisään soihduilla valaistuun käytävään, joka johtaa kallion uumeniin.").toMap, + s"Näet kun kivi halkeaa kahtia henkilön ${actor.name} laulun voimasta. Kallion sisästä paljastuu käytävä." + ) + else if actor.location == southForest && quality <= .1 then + Event( + Vector(actor -> "Kivi natisee liitoksissaan, mutta jää odottamaan voimallisempaa laulua.").toMap, + s"Kivi natisee hieman kun ${actor.name} laulaa, mutta mitään merkittävää ei tapahdu." + ) + else + Event(Vector(actor -> "Laulat laulun, mutta mitään ei tapahdu.").toMap, "") + end SeparatorEffect + + override def use(user: Entity): Option[Event] = + user match + case p: Player => + p.setSingEffect(SeparatorEffect(p)) + Some(Event( + Vector(user -> "Avaat käärön varovasti ja aloitat separoitumisen laulun.").toMap, + s"${user.name} alkaa laulamaan kääröstä." + )) + case other => + None + end use + + end SeparatorScroll + + + // Public values for containing entities + val entities: Map[String, Entity] = Map() val players: Map[String, Player] = Map() - playerNames.foreach(this.addPlayer(_)) val npcs: Map[String, NPC] = Map() + + // Adding players + + playerNames.foreach(this.addPlayer(_)) + + + // NPC definitions & adding them + private val zombieAttrs = Vector( ("mädäntyvä kyläläinen rääsyissä", westForest, 20), ("mädäntyvä kyläläinen mekossa", westForest, 20), - ("räsyinen olento Joukon vaatteissa", northOfNorthForest, 10) + ("räsyinen olento Joukon vaatteissa", northOfNorthForest, 10), + ("vaappuva paiseinen henkilö", otherCaveRoom, 30), + ("epämuodostunut henkilö", otherCaveRoom, 20), + ("kädetön olento", otherCaveRoom, 20) ) zombieAttrs.foreach(z => val zombie = Zombie(this, z(0), z(1), z(2)) @@ -200,109 +277,77 @@ class Adventure(val playerNames: Vector[String]): "ZzzzZzZZZz..." end VillageChieftainGuard - - object Bartender extends NPC(this, "baarin pitäjä", bar, 100, 100): - - private var dialogIndex = 0 - private val dialogs = Vector( - "Onnea matkaan. Tarjoan sinulle tuopin olutta rohkaisuksi.", - "Onnea matkaan." + val bartender = Villager( + this, + "Baarin pitäjä", + bar, + Vector( + ( + "Onnea matkaan. Talo tarjoaa tuopin olutta rohkaisuksi.", + Some((me: Entity) => + me.location.addItem(oluttuoppi) + Event(immutable.Map.empty, "Baarimikko kaataa tuoppiin olutta ja asettaa sen pöydälle.") + ) + ), + ("Onnea matkaan", None) + ) + ) + val hermit = Villager( + this, + "erakkotietäjä", + hutInFieldForest, + Vector( + "Olen kuullut tuollaisista riimuista. Ota tämä käärö mukaasi ja laula sen mukaisesti näkemäsi sisäänkäynnin luona." -> + Some((me: Villager) => + me.location.addItem(SeparatorScroll) + Event(immutable.Map.empty, "Tietäjä loihtii esiin laulukäärön, joka leijailee maahan jalkojesi juureen.") + ), + "Onnea matkaan. Muista valmistautua huolella, ennen kuin avaat portin." -> + None ) + ) + val uolevi = Villager(this, "Uolevi", southForest, + Vector( + "Tunnen synkeän pulssin, joka virtaa tämän kiven alla. Uskon, että tämä on jonkinlainen sisäänkäynti, mutta en tunne sitä avaavaa loitsua. Mene sinä sen erakoituneen tietäjän luokse pyytämään neuvoa, niin minä jään tänne pitämään vahtia." -> + Some((me: Entity) => + this.npcs += hermit.name -> hermit + this.hutInFieldForest.addEntity(hermit) + Event(immutable.Map.empty, "") + ) + , + "Ai, et tiedä sitä erakkoa? Löydät hänen majansa kyllä kylän eteläpuolelta." -> None + ) + ) - def act(): Unit = () - 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( - immutable.Map.empty, - "Baarimikko kaataa tuoppiin olutta ja asettaa oluttuopin pöydälle." - ) - ) - dialogIndex = min(dialogIndex + 1, this.dialogs.length) - dialogs(dialogIndex - 1) - end getDialog - - end Bartender - - //object Hermit extends NPC(this, "Tietäjäerakko", hutInFieldForest, 100, 100): - // - // private var scrollRecipients = - -// object ShoutingCultist extends Cultist(this, "Kaapupäinen henkilö", secondCaveDescent, 100, 100): -// private var hasShouted = false -// override def act(): Unit = -// val playerLocations = players.values.map(_.location) -// if !hasShouted && playerLocations contains caveDescent then -// caveDescent.observe(Event(immutable.Map.empty, "Kuulet huudon: “Tunkeilija! Valmistautukaa!”")) -// hasShouted = true -// super.act() -// end ShoutingCultist -// val cultist2 = Cultist(this, "Silmätön kaljupää", secondCaveDescent) + val cultist1 = Cultist(this, "Kaapupäinen henkilö", secondCaveDescent) + val cultist2 = Cultist(this, "Silmätön kaljupää", secondCaveDescent) + val cultist3 = Cultist(this, "Silmitön kaljupää", otherCaveRoom) + + val cthulthu = Cthulthu(this, bossFightRoom) + val miikkulainen = Miikkulainen(this, bossFightRoom) - this.npcs += Bartender.name -> Bartender - this.bar.addEntity(Bartender) + this.npcs += bartender.name -> bartender + this.bar.addEntity(bartender) this.npcs += JoukosDad.name -> JoukosDad this.bar.addEntity(JoukosDad) this.npcs += VillageChieftainGuard.name -> VillageChieftainGuard this.chieftainsGates.addEntity(VillageChieftainGuard) -// this.npcs += ShoutingCultist.name -> ShoutingCultist -// this.secondCaveDescent.addEntity(ShoutingCultist) -// this.npcs += cultist2 -// this.secondCaveDescent.addEntity(cultist2) - - - object SeparatorScroll extends Item( - "separoitumisen laulukäärö", - "Laulukäärö, joka antaa sanat separoitumisen laululle, joka saa aikaan raon jopa harmaaseen kiveen.", - 1 - ): - - class SeparatorEffect(actor: Entity) extends SingEffect(actor): - def getVerses: Vector[String] = - Vector( - "Separoidu kova kivi", - "jakaudu ja ratkeapi", - "laske minut syvyyksiisi", - "kalmankylmiin lähteisiisi" - ) - - def apply(quality: Float): Event = - if actor.location == southForest && quality > .1 && !southForest.hasNeighbor("kallion sisään") then - southForest.setNeighbor("kallion sisään", caveDescent) - Event( - Vector(actor -> "Kivi halkeaa rytinällä. Nyt näet sisään soihduilla valaistuun käytävään, joka johtaa kallion uumeniin.").toMap, - s"Näet kun kivi halkeaa kahtia henkilön ${actor.name} laulun voimasta. Kallion sisästä paljastuu käytävä." - ) - else if actor.location == southForest && quality <= .1 then - Event( - Vector(actor -> "Kivi natisee liitoksissaan, mutta jää odottamaan voimallisempaa laulua.").toMap, - s"Kivi natisee hieman kun ${actor.name} laulaa, mutta mitään merkittävää ei tapahdu." - ) - else - Event(Vector(actor -> "Laulat laulun, mutta mitään ei tapahdu.").toMap, "") - end SeparatorEffect - - override def use(user: Entity): Option[Event] = - user match - case p: Player => - p.setSingEffect(SeparatorEffect(p)) - Some(Event( - Vector(user -> "Avaat käärön varovasti ja aloitat separoitumisen laulun.").toMap, - s"${user.name} alkaa laulamaan kääröstä." - )) - case other => - None - end use - - end SeparatorScroll - - bar.addItem(SeparatorScroll) + this.npcs += cultist1.name -> cultist1 + this.secondCaveDescent.addEntity(cultist1) + this.npcs += cultist2.name -> cultist2 + this.secondCaveDescent.addEntity(cultist2) + this.npcs += cultist3.name -> cultist3 + this.otherCaveRoom.addEntity(cultist3) + this.npcs += uolevi.name -> uolevi + this.southForest.addEntity(uolevi) + this.npcs += cthulthu.name -> cthulthu + this.bossFightRoom.addEntity(cthulthu) + this.npcs += miikkulainen.name -> miikkulainen + this.bossFightRoom.addEntity(miikkulainen) + + + // Public methods def takeNpcTurns(): Unit = npcs.values.foreach(_.act()) |