Skip to content

Commit

Permalink
feat(character): add simple character creation
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrick Hoefer committed Dec 18, 2020
1 parent 7d2e3f6 commit b8f56b8
Show file tree
Hide file tree
Showing 11 changed files with 129 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ package com.github.xetra11.ck3workbench.app

import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.snapshots.SnapshotStateList
import com.github.xetra11.ck3workbench.module.character.Character
import com.github.xetra11.ck3workbench.module.character.CK3Character
import com.github.xetra11.ck3workbench.module.character.CharacterTemplate

object StateManager {
val characters: SnapshotStateList<Character> =
val characters: SnapshotStateList<CK3Character> =
mutableStateListOf(
CharacterTemplate.DEFAULT_CHARACTER,
CharacterTemplate.DEFAULT_CHARACTER,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.window.Dialog
import com.github.xetra11.ck3workbench.app.DialogManager
import com.github.xetra11.ck3workbench.module.character.view.CharacterCreateView

@Composable
fun DialogView() {
Expand All @@ -18,6 +19,6 @@ private fun CreateCharacterDialog(){
Dialog(onDismissRequest = {
DialogManager.currentDialog.value = DialogManager.Dialog.NO_DIALOG
}){
Text("Create New Character")
CharacterCreateView()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@ package com.github.xetra11.ck3workbench.module.character
* @author Patrick C. Höfer
*/

data class Character(
val name: String,
val dna: String,
val dynasty: String,
val religion: String,
val culture: String,
val skills: Map<Skill, Short>,
val traits: List<String>,
val birth: String,
val death: String
data class CK3Character(
var name: String,
var dna: String,
var dynasty: String,
var religion: String,
var culture: String,
var skills: Map<Skill, Short>,
var traits: List<String>,
var birth: String,
var death: String
) {
enum class Skill {
MARTIAL,
Expand All @@ -25,14 +25,14 @@ data class Character(
LEARNING
}
companion object {
fun from(map: Map<String, String>): Character {
fun from(map: Map<String, String>): CK3Character {
val name by map
val dna by map
val dynasty by map
val religion by map
val culture by map

return Character(
return CK3Character(
name,
dna,
dynasty,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ package com.github.xetra11.ck3workbench.module.character
* @author Patrick C. Höfer
*/
object CharacterTemplate {
val DEFAULT_CHARACTER = Character(
val DEFAULT_CHARACTER = CK3Character(
"Thorak",
"thorak_dna",
"my_dynastie",
"asatru",
"cheruscii",
skills = mapOf(
Character.Skill.DIPLOMACY to 5,
Character.Skill.MARTIAL to 5,
Character.Skill.STEWARDSHIP to 5,
Character.Skill.INTRIGUE to 5,
Character.Skill.LEARNING to 5,
CK3Character.Skill.DIPLOMACY to 5,
CK3Character.Skill.MARTIAL to 5,
CK3Character.Skill.STEWARDSHIP to 5,
CK3Character.Skill.INTRIGUE to 5,
CK3Character.Skill.LEARNING to 5,
),
traits = listOf(
"ambitious",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ class CharacterScriptImporter {
character?.let {
if (characterState.contains(it)) {
NotificationsService.error("""Character with name "${it.name}" already exists""")
} else {
NotificationsService.notify("""New Character "${it.name}" added!""")
characterState.add(it)
return
}
NotificationsService.notify("""New Character "${it.name}" added!""")
characterState.add(it)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.github.xetra11.ck3workbench.module.character.importer

import com.github.xetra11.ck3workbench.module.character.Character
import com.github.xetra11.ck3workbench.module.character.CK3Character
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.io.File
Expand All @@ -11,13 +11,13 @@ import java.io.File
* @author Patrick C. Höfer
*/
class CharacterScriptReader {
fun readCharacterScript(file: File): Character? {
fun readCharacterScript(file: File): CK3Character? {
return if (file.exists()) {
val lines = file.readLines()
val characterDefinition = extractCharacterDefinition(lines)
removeScriptSections(characterDefinition)
val characterAttributes = transformToAttributes(characterDefinition)
Character.from(characterAttributes)
CK3Character.from(characterAttributes)
} else {
LOG.error("File ${file.absoluteFile} could not be found")
null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.github.xetra11.ck3workbench.module.character.Character
import com.github.xetra11.ck3workbench.module.character.CK3Character

/**
* The list component to show all character in
Expand All @@ -19,7 +19,7 @@ import com.github.xetra11.ck3workbench.module.character.Character
*/
@Composable
fun CharacterList(
characterState: SnapshotStateList<Character>
characterState: SnapshotStateList<CK3Character>
) {
Column(
modifier = Modifier.fillMaxWidth()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.github.xetra11.ck3workbench.module.character.Character
import com.github.xetra11.ck3workbench.module.character.CK3Character

/**
* custom table component for characters
Expand All @@ -24,7 +24,7 @@ import com.github.xetra11.ck3workbench.module.character.Character
@Composable
fun CharacterTable(
modifier: Modifier = Modifier,
characterState: SnapshotStateList<Character>
characterState: SnapshotStateList<CK3Character>
) {
val scrollState = rememberScrollState(0f)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,108 @@ package com.github.xetra11.ck3workbench.module.character.view

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import com.github.xetra11.ck3workbench.app.NotificationsService
import com.github.xetra11.ck3workbench.app.StateManager
import com.github.xetra11.ck3workbench.module.character.CK3Character

@Composable
fun CharacterCreateView() {
Column(modifier = Modifier.fillMaxSize(),
Column(
modifier = Modifier.fillMaxSize().padding(top = 7.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top
) {
Text("Character Creation", fontSize = TextUnit.Sp(15), modifier = Modifier.padding(bottom = 5.dp) )
Text("In here you can create new characters", fontSize = TextUnit.Sp(10) )

val name = remember { mutableStateOf("") }
val dna = remember { mutableStateOf("") }
val religion = remember { mutableStateOf("") }
val dynasty = remember { mutableStateOf("") }
val culture = remember { mutableStateOf("") }
val birth = remember { mutableStateOf("") }
val death = remember { mutableStateOf("") }

Text("Character Creation", fontSize = TextUnit.Sp(15), modifier = Modifier.padding(bottom = 5.dp))
Text("In here you can create new characters", fontSize = TextUnit.Sp(10))
Row {
Column {
TextField(value = name.value, label = { Text("Name") }, onValueChange = {
name.value = it
})
TextField(value = dna.value, label = { Text("dna") }, onValueChange = {
dna.value = it
})
TextField(value = dynasty.value, label = { Text("dynasty") }, onValueChange = {
dynasty.value = it
})
TextField(value = religion.value, label = { Text("religion") }, onValueChange = {
religion.value = it
})
TextField(value = culture.value, label = { Text("culture") }, onValueChange = {
culture.value = it
})
TextField(value = birth.value, label = { Text("birth") }, onValueChange = {
birth.value = it
})
TextField(value = death.value, label = { Text("death") }, onValueChange = {
death.value = it
})
}
}
Button(onClick = {
val characterValues = mapOf(
"name" to name.value,
"dna" to dna.value,
"religion" to religion.value,
"dynasty" to dynasty.value,
"culture" to culture.value,
"birth" to birth.value,
"death" to death.value
)

if (validateInput(characterValues)) {
createNewCharacter(characterValues)
} else {
NotificationsService.error("""Can not create character. Some fields were empty""")
}
}) {
Text("Create")
}
}
}

private fun createNewCharacter(characterValues: Map<String, String>) {
val newCharacter = CK3Character(
characterValues["name"]!!,
characterValues["dna"]!!,
characterValues["dynasty"]!!,
characterValues["religion"]!!,
characterValues["culture"]!!,
mapOf(),
listOf(),
characterValues["birth"]!!,
characterValues["death"]!!
)
if (StateManager.characters.contains(newCharacter)) {
NotificationsService.error("""Character with name "${newCharacter.name}" already exists""")
return
}
StateManager.characters.add(newCharacter)
NotificationsService.notify("""New character "${newCharacter.name}" created""")
}

private fun validateInput(characterValues: Map<String, String>): Boolean {
return characterValues.all { it.value.isNotEmpty() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ package com.github.xetra11.ck3workbench.module.character
* @author Patrick C. Höfer
*/
object CharacterTemplate {
val DEFAULT_CHARACTER = Character(
val DEFAULT_CHARACTER = CK3Character(
"Thorak",
"thorak_dna",
"my_dynastie",
"asatru",
"cheruscii",
skills = mapOf(
Character.Skill.DIPLOMACY to 5,
Character.Skill.MARTIAL to 5,
Character.Skill.STEWARDSHIP to 5,
Character.Skill.INTRIGUE to 5,
Character.Skill.LEARNING to 5,
CK3Character.Skill.DIPLOMACY to 5,
CK3Character.Skill.MARTIAL to 5,
CK3Character.Skill.STEWARDSHIP to 5,
CK3Character.Skill.INTRIGUE to 5,
CK3Character.Skill.LEARNING to 5,
),
traits = listOf(
"ambitious",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.github.xetra11.ck3workbench.module.character.importer

import com.github.xetra11.ck3workbench.module.character.Character
import com.github.xetra11.ck3workbench.module.character.CK3Character
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import java.io.File
Expand All @@ -11,7 +11,7 @@ internal class CharacterScriptReaderTest {
@Test
fun `should parse txt file and convert it into character object`() {
val file = File("src/test/resources/fixtures/character/test_character.txt")
val actual: Character? = characterScriptReader.readCharacterScript(file)
val actual: CK3Character? = characterScriptReader.readCharacterScript(file)

assertThat(actual!!).isNotNull
assertThat(actual.name).isEqualTo("Thorak")
Expand All @@ -21,7 +21,7 @@ internal class CharacterScriptReaderTest {
fun `should log error if file does not exist`() {
val file = File("does/not/exist.txt")

val actual: Character? = characterScriptReader.readCharacterScript(file)
val actual: CK3Character? = characterScriptReader.readCharacterScript(file)

assertThat(actual).isNull()
}
Expand Down

0 comments on commit b8f56b8

Please sign in to comment.