update to current Kotlin
This commit is contained in:
@@ -1,239 +0,0 @@
|
|||||||
namespace ColossalCave;
|
|
||||||
|
|
||||||
import java.util.*
|
|
||||||
import java.io.*
|
|
||||||
|
|
||||||
/*
|
|
||||||
fun <T> ArrayList<T>.findAll(predicate: {(T) : Boolean}): ArrayList<T> {
|
|
||||||
val result = ArrayList<T>()
|
|
||||||
for(val t in this) {
|
|
||||||
if (predicate(t)) result.add(t)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
fun print(s: String) { System.out?.println(s) }
|
|
||||||
|
|
||||||
namespace World {
|
|
||||||
class Thing(val name: String) {
|
|
||||||
val ldesc: String get() = "This is a nondescript thing"
|
|
||||||
}
|
|
||||||
|
|
||||||
class Room(val name: String): Thing(name) {
|
|
||||||
val west: Room? get() = null
|
|
||||||
val east: Room? get() = null
|
|
||||||
val north: Room? get() = null
|
|
||||||
val south: Room? get() = null
|
|
||||||
var seen: Boolean = false
|
|
||||||
}
|
|
||||||
|
|
||||||
public val items: ArrayList<Item> = ArrayList<Item>()
|
|
||||||
|
|
||||||
class Item(val name: String, var room: Room?): Thing(name) {
|
|
||||||
val isFixed: Boolean get() = false
|
|
||||||
val isListed: Boolean get() = true
|
|
||||||
|
|
||||||
{
|
|
||||||
items.add(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FixedItem(val name: String, var room: Room?): Item(name, room) {
|
|
||||||
val isFixed: Boolean get() = true
|
|
||||||
val isListed: Boolean get() = false
|
|
||||||
}
|
|
||||||
|
|
||||||
fun describeRoom(room: Room) {
|
|
||||||
print(room.name)
|
|
||||||
if (!room.seen) {
|
|
||||||
print(room.ldesc)
|
|
||||||
room.seen = true
|
|
||||||
}
|
|
||||||
for(val item in items) {
|
|
||||||
if (item.room === room && item.isListed) {
|
|
||||||
print("You see " + item.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object AtEndOfRoad: Room("At End of Road") {
|
|
||||||
val ldesc: String = "You are standing at the end of the road before a small brick building." +
|
|
||||||
" Around you is a forest. A small stream flows out of the building and down a gully."
|
|
||||||
|
|
||||||
val west: Room? get() = AtHillInRoad
|
|
||||||
val east: Room? get() = InsideBuilding
|
|
||||||
val south: Room? get() = InAValley
|
|
||||||
}
|
|
||||||
|
|
||||||
object AtHillInRoad: Room("At Hill in Road") {
|
|
||||||
val ldesc: String = "You have walked up a hill, still in the forest. The road slopes back down " +
|
|
||||||
"the other side of the hill. There is a building in the distance."
|
|
||||||
|
|
||||||
val east: Room? get() = AtEndOfRoad
|
|
||||||
}
|
|
||||||
|
|
||||||
val Hill = object: FixedItem("Hill", AtHillInRoad) {
|
|
||||||
val ldesc: String = "It's just a typical hill."
|
|
||||||
}
|
|
||||||
|
|
||||||
object InsideBuilding: Room("Inside Building") {
|
|
||||||
val ldesc: String = "You are inside a building, a well house for a large spring."
|
|
||||||
|
|
||||||
val west: Room? get() = AtEndOfRoad
|
|
||||||
}
|
|
||||||
|
|
||||||
object InAValley: Room("In A Valley") {
|
|
||||||
val ldesc: String = "You are in a valley in the forest beside a stream tumbling along a rocky bed."
|
|
||||||
val north: Room get() = AtEndOfRoad
|
|
||||||
val south: Room get() = AtSlitInStreambed
|
|
||||||
}
|
|
||||||
|
|
||||||
object AtSlitInStreambed: Room("At Slit In Streambed") {
|
|
||||||
val ldesc: String = "At your feet all the water of the stream splashs into a 2-inch slit in the rock." +
|
|
||||||
" Downstream the streambed is bare rock."
|
|
||||||
val north: Room get() = InAValley
|
|
||||||
val south: Room get() = OutsideGrate
|
|
||||||
}
|
|
||||||
|
|
||||||
object OutsideGrate: Room("Outside Grate") {
|
|
||||||
val ldesc: String = "You are in a 20-foot depression floored with bare dirt. Set into the dirt " +
|
|
||||||
"is a strong steel grate mounted in concrete. A dry streambed leads into the depression."
|
|
||||||
val north: Room get() = AtSlitInStreambed
|
|
||||||
}
|
|
||||||
|
|
||||||
val brassLantern = object: Item("Brass Lantern", InsideBuilding) {
|
|
||||||
}
|
|
||||||
|
|
||||||
val setOfKeys = object: Item("A Set of Keys", InsideBuilding) {
|
|
||||||
}
|
|
||||||
|
|
||||||
fun startRoom() = AtEndOfRoad
|
|
||||||
}
|
|
||||||
|
|
||||||
class Player(var room: World.Room) {
|
|
||||||
val inventory: ArrayList<World.Item> = ArrayList<World.Item>()
|
|
||||||
}
|
|
||||||
|
|
||||||
class Command {
|
|
||||||
abstract fun execute(p: Player): Unit
|
|
||||||
}
|
|
||||||
|
|
||||||
object QuitCommand : Command {
|
|
||||||
fun execute(p: Player) {
|
|
||||||
System.exit(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MoveCommand: Command {
|
|
||||||
fun moveTo(p: Player, room: World.Room?) {
|
|
||||||
if (room === null) {
|
|
||||||
System.out?.println("You can't go that way")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
p.room = room as World.Room
|
|
||||||
World.describeRoom(p.room)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object NorthCommand: MoveCommand {
|
|
||||||
fun execute(p: Player) {
|
|
||||||
moveTo(p, p.room.north)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object SouthCommand: MoveCommand {
|
|
||||||
fun execute(p: Player) {
|
|
||||||
moveTo(p, p.room.south)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object WestCommand: MoveCommand {
|
|
||||||
fun execute(p: Player) {
|
|
||||||
moveTo(p, p.room.west)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object EastCommand: MoveCommand {
|
|
||||||
fun execute(p: Player) {
|
|
||||||
moveTo(p, p.room.east)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CommandOnObject(val target: String): Command {
|
|
||||||
fun execute(p: Player) {
|
|
||||||
for(val item in World.items) {
|
|
||||||
if (item.name.equalsIgnoreCase(target) && item.room == p.room) {
|
|
||||||
executeOn(p, item)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out?.println("I don't see any " + target + " here.")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun executeOn(p: Player, item: World.Item)
|
|
||||||
}
|
|
||||||
|
|
||||||
class TakeCommand(val target: String): CommandOnObject(target) {
|
|
||||||
fun executeOn(p: Player, item: World.Item) {
|
|
||||||
if (item.isFixed) {
|
|
||||||
print("You can't have " + item.name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
item.room = null
|
|
||||||
p.inventory.add(item)
|
|
||||||
System.out?.println("Taken")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ExamineCommand(val target: String): CommandOnObject(target) {
|
|
||||||
fun executeOn(p: Player, item: World.Item) {
|
|
||||||
print(item.ldesc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object InventoryCommand: Command {
|
|
||||||
fun execute(p: Player) {
|
|
||||||
if (p.inventory.size() == 0)
|
|
||||||
print("You are empty-handed.")
|
|
||||||
else {
|
|
||||||
print("You are carrying:")
|
|
||||||
for(val item in p.inventory) {
|
|
||||||
print(item.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun parse(cmd: String): Command? {
|
|
||||||
if (cmd == "quit") return QuitCommand
|
|
||||||
if (cmd == "north") return NorthCommand
|
|
||||||
if (cmd == "south") return SouthCommand
|
|
||||||
if (cmd == "west") return WestCommand
|
|
||||||
if (cmd == "east") return EastCommand
|
|
||||||
if (cmd == "inventory") return InventoryCommand
|
|
||||||
if (cmd.startsWith("take")) {
|
|
||||||
val target = cmd.substring(4).trim()
|
|
||||||
return TakeCommand(target)
|
|
||||||
}
|
|
||||||
if (cmd.startsWith("examine")) {
|
|
||||||
val target = cmd.substring(7).trim()
|
|
||||||
return ExamineCommand(target)
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
|
||||||
val p = Player(World.startRoom())
|
|
||||||
World.describeRoom(p.room)
|
|
||||||
val reader = BufferedReader(InputStreamReader(System.`in`))
|
|
||||||
while(true) {
|
|
||||||
System.out?.print("> ")
|
|
||||||
val cmd = reader.readLine() as String
|
|
||||||
val command = parse(cmd)
|
|
||||||
if (command === null)
|
|
||||||
System.out?.println("Unrecognized command");
|
|
||||||
else
|
|
||||||
command.execute(p)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,225 @@
|
|||||||
|
package ColossalCave
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
import java.io.*
|
||||||
|
|
||||||
|
open class Thing(val name : String) {
|
||||||
|
open val ldesc : String get() = "This is a nondescript thing"
|
||||||
|
}
|
||||||
|
|
||||||
|
open class Room(name : String) : Thing(name) {
|
||||||
|
open val west : Room? get() = null
|
||||||
|
open val east : Room? get() = null
|
||||||
|
open val north : Room? get() = null
|
||||||
|
open val south : Room? get() = null
|
||||||
|
var seen : Boolean = false
|
||||||
|
}
|
||||||
|
|
||||||
|
public val items : ArrayList<Item> = ArrayList<Item>()
|
||||||
|
|
||||||
|
open class Item(name : String, var room : Room?) : Thing(name) {
|
||||||
|
open val isFixed : Boolean get() = false
|
||||||
|
open val isListed : Boolean get() = true
|
||||||
|
|
||||||
|
{
|
||||||
|
items.add(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class FixedItem(name : String, room : Room?) : Item(name, room) {
|
||||||
|
override val isFixed : Boolean get() = true
|
||||||
|
override val isListed : Boolean get() = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun describeRoom(room : Room) {
|
||||||
|
println(room.name)
|
||||||
|
if (!room.seen) {
|
||||||
|
println(room.ldesc)
|
||||||
|
room.seen = true
|
||||||
|
}
|
||||||
|
for(val item in items) {
|
||||||
|
if (item.room === room && item.isListed) {
|
||||||
|
println("You see " + item.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object AtEndOfRoad: Room("At End of Road") {
|
||||||
|
override val ldesc : String = "You are standing at the end of the road before a small brick building." +
|
||||||
|
" Around you is a forest. A small stream flows out of the building and down a gully."
|
||||||
|
|
||||||
|
override val west : Room? get() = AtHillInRoad
|
||||||
|
override val east : Room? get() = InsideBuilding
|
||||||
|
override val south : Room? get() = InAValley
|
||||||
|
}
|
||||||
|
|
||||||
|
object AtHillInRoad: Room("At Hill in Road") {
|
||||||
|
override val ldesc : String = "You have walked up a hill, still in the forest. The road slopes back down " +
|
||||||
|
"the other side of the hill. There is a building in the distance."
|
||||||
|
|
||||||
|
override val east : Room? get() = AtEndOfRoad
|
||||||
|
}
|
||||||
|
|
||||||
|
val Hill = object: FixedItem("Hill", AtHillInRoad) {
|
||||||
|
override val ldesc : String = "It's just a typical hill."
|
||||||
|
}
|
||||||
|
|
||||||
|
object InsideBuilding: Room("Inside Building") {
|
||||||
|
override val ldesc : String = "You are inside a building, a well house for a large spring."
|
||||||
|
|
||||||
|
override val west : Room? get() = AtEndOfRoad
|
||||||
|
}
|
||||||
|
|
||||||
|
object InAValley: Room("In A Valley") {
|
||||||
|
override val ldesc : String = "You are in a valley in the forest beside a stream tumbling along a rocky bed."
|
||||||
|
override val north : Room get() = AtEndOfRoad
|
||||||
|
override val south : Room get() = AtSlitInStreambed
|
||||||
|
}
|
||||||
|
|
||||||
|
object AtSlitInStreambed: Room("At Slit In Streambed") {
|
||||||
|
override val ldesc : String = "At your feet all the water of the stream splashs into a 2-inch slit in the rock." +
|
||||||
|
" Downstream the streambed is bare rock."
|
||||||
|
override val north : Room get() = InAValley
|
||||||
|
override val south : Room get() = OutsideGrate
|
||||||
|
}
|
||||||
|
|
||||||
|
object OutsideGrate: Room("Outside Grate") {
|
||||||
|
override val ldesc : String = "You are in a 20-foot depression floored with bare dirt. Set into the dirt " +
|
||||||
|
"is a strong steel grate mounted in concrete. A dry streambed leads into the depression."
|
||||||
|
override val north : Room get() = AtSlitInStreambed
|
||||||
|
}
|
||||||
|
|
||||||
|
val brassLantern = object: Item("Brass Lantern", InsideBuilding) {
|
||||||
|
}
|
||||||
|
|
||||||
|
val setOfKeys = object: Item("A Set of Keys", InsideBuilding) {
|
||||||
|
}
|
||||||
|
|
||||||
|
fun startRoom() = AtEndOfRoad
|
||||||
|
|
||||||
|
class Player(var room : Room) {
|
||||||
|
val inventory : ArrayList<Item> = ArrayList<Item>()
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class Command {
|
||||||
|
abstract fun execute(p : Player) : Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
object QuitCommand : Command() {
|
||||||
|
override fun execute(p : Player) {
|
||||||
|
System.exit(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class MoveCommand : Command() {
|
||||||
|
fun moveTo(p : Player, room : Room?) {
|
||||||
|
if (room === null) {
|
||||||
|
println("You can't go that way")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.room = room as Room
|
||||||
|
describeRoom(p.room)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object NorthCommand: MoveCommand() {
|
||||||
|
override fun execute(p : Player) {
|
||||||
|
moveTo(p, p.room.north)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object SouthCommand: MoveCommand() {
|
||||||
|
override fun execute(p : Player) {
|
||||||
|
moveTo(p, p.room.south)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object WestCommand: MoveCommand() {
|
||||||
|
override fun execute(p : Player) {
|
||||||
|
moveTo(p, p.room.west)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object EastCommand: MoveCommand() {
|
||||||
|
override fun execute(p : Player) {
|
||||||
|
moveTo(p, p.room.east)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class CommandOnObject(val target : String) : Command() {
|
||||||
|
override fun execute(p : Player) {
|
||||||
|
for(val item in items) {
|
||||||
|
if (item.name.equalsIgnoreCase(target) && item.room == p.room) {
|
||||||
|
executeOn(p, item)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println("I don't see any " + target + " here.")
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract fun executeOn(p : Player, item : Item)
|
||||||
|
}
|
||||||
|
|
||||||
|
class TakeCommand(target : String) : CommandOnObject(target) {
|
||||||
|
override fun executeOn(p : Player, item : Item) {
|
||||||
|
if (item.isFixed) {
|
||||||
|
print("You can't have " + item.name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
item.room = null
|
||||||
|
p.inventory.add(item)
|
||||||
|
println("Taken")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExamineCommand(target : String) : CommandOnObject(target) {
|
||||||
|
override fun executeOn(p : Player, item : Item) {
|
||||||
|
println(item.ldesc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object InventoryCommand: Command() {
|
||||||
|
override fun execute(p : Player) {
|
||||||
|
if (p.inventory.size() == 0)
|
||||||
|
println("You are empty-handed.")
|
||||||
|
else {
|
||||||
|
println("You are carrying:")
|
||||||
|
for(val item in p.inventory) {
|
||||||
|
println(item.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun parse(cmd : String) : Command? {
|
||||||
|
if (cmd == "quit") return QuitCommand
|
||||||
|
if (cmd == "north") return NorthCommand
|
||||||
|
if (cmd == "south") return SouthCommand
|
||||||
|
if (cmd == "west") return WestCommand
|
||||||
|
if (cmd == "east") return EastCommand
|
||||||
|
if (cmd == "inventory") return InventoryCommand
|
||||||
|
if (cmd.startsWith("take")) {
|
||||||
|
val target = cmd.substring(4).trim()
|
||||||
|
return TakeCommand(target)
|
||||||
|
}
|
||||||
|
if (cmd.startsWith("examine")) {
|
||||||
|
val target = cmd.substring(7).trim()
|
||||||
|
return ExamineCommand(target)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args : Array<String>) {
|
||||||
|
val p = Player(startRoom())
|
||||||
|
describeRoom(p.room)
|
||||||
|
val reader = BufferedReader(InputStreamReader(System.`in`))
|
||||||
|
while(true) {
|
||||||
|
print("> ")
|
||||||
|
val cmd = reader.readLine() as String
|
||||||
|
val command = parse(cmd)
|
||||||
|
if (command === null)
|
||||||
|
println("Unrecognized command");
|
||||||
|
else
|
||||||
|
command.execute(p)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user