Console: Format is inherent part of console action

This commit is contained in:
Yair Morgenstern
2024-01-04 09:36:29 +02:00
parent 4565907985
commit 24c0894f2b

View File

@ -17,9 +17,10 @@ interface ConsoleCommand {
class ConsoleHintException(val hint:String):Exception()
class ConsoleErrorException(val error:String):Exception()
class ConsoleAction(val action: (console: DevConsolePopup, params: List<String>) -> DevConsoleResponse) : ConsoleCommand {
class ConsoleAction(val format: String, val action: (console: DevConsolePopup, params: List<String>) -> DevConsoleResponse) : ConsoleCommand {
override fun handle(console: DevConsolePopup, params: List<String>): DevConsoleResponse {
return try {
validateFormat(format, params)
action(console, params)
} catch (hintException: ConsoleHintException) {
DevConsoleResponse.hint(hintException.hint)
@ -79,8 +80,7 @@ fun validateFormat(format: String, params:List<String>){
class ConsoleUnitCommands : ConsoleCommandNode {
override val subcommands = hashMapOf<String, ConsoleCommand>(
"add" to ConsoleAction { console, params ->
validateFormat("unit add <civName> <unitName>", params)
"add" to ConsoleAction("unit add <civName> <unitName>") { console, params ->
val selectedTile = console.getSelectedTile()
val civ = console.getCivByName(params[0])
val baseUnit = console.gameInfo.ruleset.units.values.firstOrNull { it.name.toCliInput() == params[1] }
@ -89,15 +89,13 @@ class ConsoleUnitCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"remove" to ConsoleAction { console, params ->
validateFormat("unit remove", params)
"remove" to ConsoleAction("unit remove") { console, params ->
val unit = console.getSelectedUnit()
unit.destroy()
DevConsoleResponse.OK
},
"addpromotion" to ConsoleAction { console, params ->
validateFormat("unit addpromotion <promotionName>", params)
"addpromotion" to ConsoleAction("unit addpromotion <promotionName>") { console, params ->
val unit = console.getSelectedUnit()
val promotion = console.gameInfo.ruleset.unitPromotions.values.firstOrNull { it.name.toCliInput() == params[0] }
?: throw ConsoleErrorException("Unknown promotion")
@ -105,8 +103,7 @@ class ConsoleUnitCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"removepromotion" to ConsoleAction { console, params ->
validateFormat("unit removepromotion <promotionName>", params)
"removepromotion" to ConsoleAction("unit removepromotion <promotionName>") { console, params ->
val unit = console.getSelectedUnit()
val promotion = unit.promotions.getPromotions().firstOrNull { it.name.toCliInput() == params[0] }
?: throw ConsoleErrorException("Promotion not found on unit")
@ -117,8 +114,7 @@ class ConsoleUnitCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"setmovement" to ConsoleAction { console, params ->
validateFormat("unit setmovement <amount>", params)
"setmovement" to ConsoleAction("unit setmovement <amount>") { console, params ->
val movement = params[0].toFloatOrNull()
if (movement == null || movement < 0) throw ConsoleErrorException("Invalid number")
val unit = console.getSelectedUnit()
@ -131,8 +127,7 @@ class ConsoleUnitCommands : ConsoleCommandNode {
class ConsoleCityCommands : ConsoleCommandNode {
override val subcommands = hashMapOf<String, ConsoleCommand>(
"add" to ConsoleAction { console, params ->
validateFormat("city add <civName>", params)
"add" to ConsoleAction("city add <civName>") { console, params ->
val civ = console.getCivByName(params[0])
val selectedTile = console.getSelectedTile()
if (selectedTile.isCityCenter())
@ -141,15 +136,13 @@ class ConsoleCityCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"remove" to ConsoleAction { console, params ->
validateFormat("city remove", params)
"remove" to ConsoleAction("city remove") { console, params ->
val city = console.getSelectedCity()
city.destroyCity(overrideSafeties = true)
DevConsoleResponse.OK
},
"setpop" to ConsoleAction { console, params ->
validateFormat("city setpop <amount>", params)
"setpop" to ConsoleAction("city setpop <amount>") { console, params ->
val city = console.getSelectedCity()
val newPop = console.getInt(params[0])
if (newPop < 1) throw ConsoleErrorException("Population must be at least 1")
@ -157,8 +150,7 @@ class ConsoleCityCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"addtile" to ConsoleAction { console, params ->
validateFormat("city addtile <cityName>", params)
"addtile" to ConsoleAction("city addtile <cityName>") { console, params ->
val selectedTile = console.getSelectedTile()
val city = console.getCity(params[0])
if (selectedTile.neighbors.none { it.getCity() == city })
@ -168,16 +160,14 @@ class ConsoleCityCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"removetile" to ConsoleAction { console, params ->
validateFormat("city removetile", params)
"removetile" to ConsoleAction("city removetile") { console, params ->
val selectedTile = console.getSelectedTile()
val city = console.getSelectedCity()
city.expansion.relinquishOwnership(selectedTile)
DevConsoleResponse.OK
},
"religion" to ConsoleAction { console, params ->
validateFormat("city religion <name> <±pressure>", params)
"religion" to ConsoleAction("city religion <name> <±pressure>") { console, params ->
val city = console.getSelectedCity()
val religion = city.civ.gameInfo.religions.keys.firstOrNull { it.toCliInput() == params[0] }
?: throw ConsoleErrorException("'${params[0]}' is not a known religion")
@ -192,8 +182,7 @@ class ConsoleCityCommands : ConsoleCommandNode {
class ConsoleTileCommands: ConsoleCommandNode {
override val subcommands = hashMapOf<String, ConsoleCommand>(
"setimprovement" to ConsoleAction { console, params ->
validateFormat("tile setimprovement <improvementName> [civName]", params)
"setimprovement" to ConsoleAction("tile setimprovement <improvementName> [civName]") { console, params ->
val selectedTile = console.getSelectedTile()
val improvement = console.gameInfo.ruleset.tileImprovements.values.firstOrNull {
it.name.toCliInput() == params[0]
@ -206,15 +195,13 @@ class ConsoleTileCommands: ConsoleCommandNode {
DevConsoleResponse.OK
},
"removeimprovement" to ConsoleAction { console, params ->
validateFormat("tile removeimprovement", params)
"removeimprovement" to ConsoleAction("tile removeimprovement") { console, params ->
val selectedTile = console.getSelectedTile()
selectedTile.improvementFunctions.changeImprovement(null)
DevConsoleResponse.OK
},
"addfeature" to ConsoleAction { console, params ->
validateFormat("tile addfeature <featureName>", params)
"addfeature" to ConsoleAction("tile addfeature <featureName>") { console, params ->
val selectedTile = console.getSelectedTile()
val feature = console.gameInfo.ruleset.terrains.values
.firstOrNull { it.type == TerrainType.TerrainFeature && it.name.toCliInput() == params[0] }
@ -223,8 +210,7 @@ class ConsoleTileCommands: ConsoleCommandNode {
DevConsoleResponse.OK
},
"removefeature" to ConsoleAction { console, params ->
validateFormat("tile addfeature <featureName>", params)
"removefeature" to ConsoleAction("tile addfeature <featureName>") { console, params ->
val selectedTile = console.getSelectedTile()
val feature = console.gameInfo.ruleset.terrains.values
.firstOrNull { it.type == TerrainType.TerrainFeature && it.name.toCliInput() == params[0] }
@ -237,9 +223,8 @@ class ConsoleTileCommands: ConsoleCommandNode {
class ConsoleCivCommands : ConsoleCommandNode {
override val subcommands = hashMapOf<String, ConsoleCommand>(
"addstat" to ConsoleAction { console, params ->
"addstat" to ConsoleAction("civ addstat [civ] <stat> <amount>") { console, params ->
var statPos = 0
validateFormat("civ addstat [civ] <stat> <amount>", params)
val civ = if (params.size == 2) console.screen.selectedCiv
else {
statPos++
@ -254,8 +239,7 @@ class ConsoleCivCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"setplayertype" to ConsoleAction { console, params ->
validateFormat("civ setplayertype <civName> <ai/human>", params)
"setplayertype" to ConsoleAction("civ setplayertype <civName> <ai/human>") { console, params ->
val civ = console.getCivByName(params[0])
val playerType = PlayerType.values().firstOrNull { it.name.lowercase() == params[1].lowercase() }
?: throw ConsoleErrorException("Invalid player type, valid options are 'ai' or 'human'")
@ -263,16 +247,14 @@ class ConsoleCivCommands : ConsoleCommandNode {
DevConsoleResponse.OK
},
"revealmap" to ConsoleAction { console, params ->
validateFormat("civ revealmap <civName>", params)
"revealmap" to ConsoleAction("civ revealmap <civName>") { console, params ->
val civ = console.getCivByName(params[0])
civ.gameInfo.tileMap.values.asSequence()
.forEach { it.setExplored(civ, true) }
DevConsoleResponse.OK
},
"activatetrigger" to ConsoleAction { console, params ->
validateFormat("civ activatetrigger <civName> <\"trigger\">", params)
"activatetrigger" to ConsoleAction("civ activatetrigger <civName> <\"trigger\">") { console, params ->
val civ = console.getCivByName(params[0])
val unique = Unique(params[1])
if (unique.type == null) throw ConsoleErrorException("Unrecognized trigger")