From 20ffb6159115468707dbc922533b53fc6b5dff6e Mon Sep 17 00:00:00 2001 From: ben_singer Date: Tue, 22 Oct 2024 14:55:42 +0100 Subject: [PATCH] Added ExaminationResult and ExaminationScene --- .../benpollarduk/ktaf/assets/Examinable.kt | 5 ++-- .../ktaf/assets/ExaminableObject.kt | 18 +++++++-------- .../benpollarduk/ktaf/assets/Examination.kt | 4 ++-- .../ktaf/assets/ExaminationRequest.kt | 9 ++++++++ .../ktaf/assets/ExaminationScene.kt | 23 +++++++++++++++++++ .../ktaf/assets/locations/Overworld.kt | 5 ++-- .../ktaf/assets/locations/Region.kt | 3 ++- .../ktaf/assets/locations/Room.kt | 3 ++- .../ktaf/commands/game/Examine.kt | 12 +++++++++- .../frames/ansi/AnsiSceneFrameBuilder.kt | 3 ++- .../frames/html/HtmlSceneFrameBuilder.kt | 3 ++- .../ktaf/assets/ExaminableObjectTest.kt | 10 ++++---- .../characters/NonPlayableCharacterTest.kt | 3 ++- .../ktaf/assets/location/RoomTest.kt | 7 +++--- 14 files changed, 79 insertions(+), 29 deletions(-) create mode 100644 ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationRequest.kt create mode 100644 ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationScene.kt diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examinable.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examinable.kt index f544f3f..639f366 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examinable.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examinable.kt @@ -28,7 +28,8 @@ public interface Examinable : PlayerVisible { public val attributes: AttributeManager /** - * Examine this object to obtain an [ExaminationResult]. + * Examine this object to obtain an [ExaminationResult]. The [scene] that the examination occurs in must be + * specified. */ - public fun examine(): ExaminationResult + public fun examine(scene: ExaminationScene): ExaminationResult } diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObject.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObject.kt index 7edafd9..41442f3 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObject.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObject.kt @@ -17,17 +17,17 @@ public abstract class ExaminableObject : Examinable { * Provides a callback for handling examination of this object. */ public var examination: Examination = { - var description = it.description.getDescription() + var description = it.examinable.description.getDescription() - if (it.commands.any()) { + if (it.examinable.commands.any()) { if (description != "") { description += " " } val newline = NEWLINE - description += "$newline$newline${it.identifier.name} provides the following commands: " + description += "$newline$newline${it.examinable.identifier.name} provides the following commands: " - it.commands.forEach { command -> + it.examinable.commands.forEach { command -> description += "$newline \"${command.commandHelp.command}\" - " + "${command.commandHelp.description.removeSentenceEnd()}, " } @@ -39,15 +39,15 @@ public abstract class ExaminableObject : Examinable { } if (description == "") { - description = it.identifier.name + description = it.examinable.identifier.name } if (description == "") { - description = it::class.simpleName.toString() + description = it.examinable::class.simpleName.toString() } if (attributes.count > 0) { - description += "\n\n" + StringUtilities.getAttributesAsString(it.attributes.toMap()) + description += "\n\n" + StringUtilities.getAttributesAsString(it.examinable.attributes.toMap()) } ExaminationResult(description) @@ -66,8 +66,8 @@ public abstract class ExaminableObject : Examinable { override var commands: List = emptyList() - override fun examine(): ExaminationResult { - return examination(this) + override fun examine(scene: ExaminationScene): ExaminationResult { + return examination(ExaminationRequest(this, scene)) } override var isPlayerVisible: Boolean = true diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examination.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examination.kt index ab0b1a2..c955d44 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examination.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/Examination.kt @@ -1,6 +1,6 @@ package com.github.benpollarduk.ktaf.assets /** - * Provides a lambda signature for a examining the [examinable] that must return a [ExaminationResult]. + * Provides a lambda signature for handling an [examinationRequest] that must return a [ExaminationResult]. */ -public typealias Examination = (examinable: Examinable) -> ExaminationResult +public typealias Examination = (examinationRequest: ExaminationRequest) -> ExaminationResult diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationRequest.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationRequest.kt new file mode 100644 index 0000000..f1bb08f --- /dev/null +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationRequest.kt @@ -0,0 +1,9 @@ +package com.github.benpollarduk.ktaf.assets + +/** + * Represents a request to examine an [examinable] in a [scene]. + */ +public data class ExaminationRequest( + public val examinable: Examinable, + public val scene: ExaminationScene +) diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationScene.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationScene.kt new file mode 100644 index 0000000..c120921 --- /dev/null +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/ExaminationScene.kt @@ -0,0 +1,23 @@ +package com.github.benpollarduk.ktaf.assets + +import com.github.benpollarduk.ktaf.assets.characters.Character +import com.github.benpollarduk.ktaf.assets.characters.PlayableCharacter +import com.github.benpollarduk.ktaf.assets.locations.Room + +/** + * Represents a scene that an examination occurs in with a [examiner] and a [room]. + */ +public data class ExaminationScene( + val examiner: Character, + val room: Room +) { + public companion object { + /** + * Provides a value representing no scene. + */ + public val noScene: ExaminationScene = ExaminationScene( + PlayableCharacter("", ""), + Room("", "") + ) + } +} diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Overworld.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Overworld.kt index 7a1cd8d..1787ff8 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Overworld.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Overworld.kt @@ -3,6 +3,7 @@ package com.github.benpollarduk.ktaf.assets.locations import com.github.benpollarduk.ktaf.assets.Description import com.github.benpollarduk.ktaf.assets.ExaminableObject import com.github.benpollarduk.ktaf.assets.ExaminationResult +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.Identifier import com.github.benpollarduk.ktaf.extensions.equalsExaminable @@ -14,7 +15,7 @@ public class Overworld( override var description: Description ) : ExaminableObject() { /** - * Provides an overworld which is a container of [Region]. The overwold has an [identifier] and a [description]. + * Provides an overlord which is a container of [Region]. The overwold has an [identifier] and a [description]. */ public constructor( identifier: String, @@ -83,7 +84,7 @@ public class Overworld( return true } - override fun examine(): ExaminationResult { + override fun examine(scene: ExaminationScene): ExaminationResult { return ExaminationResult(description.getDescription()) } } diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Region.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Region.kt index 600c022..7bb12b1 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Region.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Region.kt @@ -1,6 +1,7 @@ package com.github.benpollarduk.ktaf.assets.locations import com.github.benpollarduk.ktaf.assets.ExaminationResult +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.Identifier import com.github.benpollarduk.ktaf.extensions.equalsExaminable import com.github.benpollarduk.ktaf.utilities.RegionMaker @@ -191,7 +192,7 @@ public class Region( return jumpToRoom(room) } - override fun examine(): ExaminationResult { + override fun examine(scene: ExaminationScene): ExaminationResult { return ExaminationResult("$Identifier: ${description.getDescription()}") } diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Room.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Room.kt index f045461..098a738 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Room.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/assets/locations/Room.kt @@ -4,6 +4,7 @@ import com.github.benpollarduk.ktaf.assets.ConditionalDescription import com.github.benpollarduk.ktaf.assets.Description import com.github.benpollarduk.ktaf.assets.ExaminableObject import com.github.benpollarduk.ktaf.assets.ExaminationResult +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.Identifier import com.github.benpollarduk.ktaf.assets.Item import com.github.benpollarduk.ktaf.assets.characters.Character @@ -311,7 +312,7 @@ public class Room( this.description = description } - override fun examine(): ExaminationResult { + override fun examine(scene: ExaminationScene): ExaminationResult { val visibleItems = items.filter { it.isPlayerVisible } if (visibleItems.isEmpty()) { diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/commands/game/Examine.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/commands/game/Examine.kt index 14463ef..e4d137a 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/commands/game/Examine.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/commands/game/Examine.kt @@ -1,8 +1,10 @@ package com.github.benpollarduk.ktaf.commands.game import com.github.benpollarduk.ktaf.assets.Examinable +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.interaction.Reaction import com.github.benpollarduk.ktaf.assets.interaction.ReactionResult +import com.github.benpollarduk.ktaf.assets.locations.Room import com.github.benpollarduk.ktaf.commands.Command import com.github.benpollarduk.ktaf.logic.Game @@ -15,6 +17,14 @@ internal class Examine(private val examinable: Examinable?) : Command { return Reaction(ReactionResult.ERROR, "You must specify an examinable.") } - return Reaction(ReactionResult.OK, examinable.examine().description) + return Reaction( + ReactionResult.OK, + examinable.examine( + ExaminationScene( + game.player, + game.overworld.currentRegion?.currentRoom ?: Room("", "") + ) + ).description + ) } } diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/ansi/AnsiSceneFrameBuilder.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/ansi/AnsiSceneFrameBuilder.kt index d382902..3d07bd3 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/ansi/AnsiSceneFrameBuilder.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/ansi/AnsiSceneFrameBuilder.kt @@ -1,5 +1,6 @@ package com.github.benpollarduk.ktaf.rendering.frames.ansi +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.Size import com.github.benpollarduk.ktaf.assets.characters.PlayableCharacter import com.github.benpollarduk.ktaf.assets.locations.Region @@ -89,7 +90,7 @@ public class AnsiSceneFrameBuilder( ) var extendedDescription: String = if (room.items.any()) { - room.examine().description.ensureFinishedSentence() + room.examine(ExaminationScene(playableCharacter, room)).description.ensureFinishedSentence() } else { "There are no items in this area." } diff --git a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/html/HtmlSceneFrameBuilder.kt b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/html/HtmlSceneFrameBuilder.kt index bd187f1..c5e7325 100644 --- a/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/html/HtmlSceneFrameBuilder.kt +++ b/ktaf/src/main/kotlin/com/github/benpollarduk/ktaf/rendering/frames/html/HtmlSceneFrameBuilder.kt @@ -1,5 +1,6 @@ package com.github.benpollarduk.ktaf.rendering.frames.html +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.Item import com.github.benpollarduk.ktaf.assets.Size import com.github.benpollarduk.ktaf.assets.attributes.Attribute @@ -76,7 +77,7 @@ public class HtmlSceneFrameBuilder( htmlPageBuilder.p(room.description.getDescription().ensureFinishedSentence()) var extendedDescription: String = if (room.items.any()) { - room.examine().description.ensureFinishedSentence() + room.examine(ExaminationScene(playableCharacter, room)).description.ensureFinishedSentence() } else { "There are no items in this area." } diff --git a/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObjectTest.kt b/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObjectTest.kt index afbd4d9..e894794 100644 --- a/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObjectTest.kt +++ b/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/ExaminableObjectTest.kt @@ -14,7 +14,7 @@ class ExaminableObjectTest { val examinable = Item("Test", "ABC") // When - val result = examinable.examine() + val result = examinable.examine(ExaminationScene.noScene) // Then Assertions.assertTrue(result.description.contains("ABC")) @@ -26,7 +26,7 @@ class ExaminableObjectTest { val examinable = Item("Test", "") // When - val result = examinable.examine() + val result = examinable.examine(ExaminationScene.noScene) // Then Assertions.assertTrue(result.description.contains("Test")) @@ -38,7 +38,7 @@ class ExaminableObjectTest { val examinable = Item("", "") // When - val result = examinable.examine() + val result = examinable.examine(ExaminationScene.noScene) // Then Assertions.assertTrue(result.description.contains("Item")) @@ -55,7 +55,7 @@ class ExaminableObjectTest { ) // When - val result = examinable.examine() + val result = examinable.examine(ExaminationScene.noScene) // Then Assertions.assertTrue(result.description.contains("ABC")) @@ -68,7 +68,7 @@ class ExaminableObjectTest { examinable.attributes.add("attribute", 0) // When - val result = examinable.examine() + val result = examinable.examine(ExaminationScene.noScene) // Then Assertions.assertTrue(result.description.contains("attribute")) diff --git a/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/characters/NonPlayableCharacterTest.kt b/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/characters/NonPlayableCharacterTest.kt index 21320b4..9729698 100644 --- a/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/characters/NonPlayableCharacterTest.kt +++ b/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/characters/NonPlayableCharacterTest.kt @@ -2,6 +2,7 @@ package com.github.benpollarduk.ktaf.assets.characters import com.github.benpollarduk.ktaf.assets.Examination import com.github.benpollarduk.ktaf.assets.ExaminationResult +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.Item import com.github.benpollarduk.ktaf.assets.interaction.Interaction import com.github.benpollarduk.ktaf.assets.interaction.InteractionEffect @@ -95,7 +96,7 @@ class NonPlayableCharacterTest { ) // When - val result = character.examine() + val result = character.examine(ExaminationScene.noScene) // Then Assertions.assertEquals("ABC", result.description) diff --git a/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/location/RoomTest.kt b/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/location/RoomTest.kt index aa5367a..51a35b0 100644 --- a/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/location/RoomTest.kt +++ b/ktaf/src/test/kotlin/com/github/benpollarduk/ktaf/assets/location/RoomTest.kt @@ -1,5 +1,6 @@ package com.github.benpollarduk.ktaf.assets.location +import com.github.benpollarduk.ktaf.assets.ExaminationScene import com.github.benpollarduk.ktaf.assets.Identifier import com.github.benpollarduk.ktaf.assets.Item import com.github.benpollarduk.ktaf.assets.characters.NonPlayableCharacter @@ -223,7 +224,7 @@ class RoomTest { room.addItem(item) // When - val result = room.examine().description + val result = room.examine(ExaminationScene.noScene).description // Then Assertions.assertTrue(result.contains("Item")) @@ -239,7 +240,7 @@ class RoomTest { room.addItem(item2) // When - val result = room.examine().description + val result = room.examine(ExaminationScene.noScene).description // Then Assertions.assertTrue(result.contains("Item 1")) @@ -416,7 +417,7 @@ class RoomTest { val room = Room("Room", "Room description") // When - val result = room.examine() + val result = room.examine(ExaminationScene.noScene) // Then Assertions.assertEquals("There is nothing to examine.", result.description)