diff --git a/cardgen/src/commonMain/kotlin/card/card.kt b/cardgen/src/commonMain/kotlin/card/card.kt index e7f2116..bc5f69f 100644 --- a/cardgen/src/commonMain/kotlin/card/card.kt +++ b/cardgen/src/commonMain/kotlin/card/card.kt @@ -8,9 +8,7 @@ import com.soywiz.korim.color.RGBA import com.soywiz.korim.font.BitmapFont import com.soywiz.korma.geom.RectangleInt import creatures.Creature -import twod.Tile -import twod.shrink -import twod.solidInnerBorders +import twod.* data class CardDrawingInput(val creature: Creature, val cbmp: BitmapSlice, val font: BitmapFont, val tiles: Map>) @@ -25,10 +23,15 @@ fun Stage.putBorder(cdi: CardDrawingInput) { var rect: RectangleInt = RectangleInt.invoke(0, 0, width.toInt(), height.toInt()) for (i in 0..4) { rect = rect.shrink() - solidInnerBorders(rect, cdi.creature.team.color) + solidInnerBorders(rect, cdi.creature.team.color.base) } } +fun Stage.putBorderDecoration(cdi: CardDrawingInput) { + var rect: RectangleInt = RectangleInt.invoke(0, 0, width.toInt(), height.toInt()).shrink() + solidPoint(rect.corner(Direction.TOP_LEFT), cdi.creature.team.color.lightest) +} + /** @return The tile's bottom y */ fun Stage.putCreatureTile(cdi: CardDrawingInput): Double { val imgx = (width - (cdi.cbmp.width * creatureScale)) / 2; @@ -51,7 +54,7 @@ fun Stage.putCreatureName(cdi: CardDrawingInput, tileboty: Double): Double { val texty = tileboty val w = width - text(cdi.creature.name, font = cdi.font, textSize = cdi.font.fontSize.toDouble(), color = cdi.creature.team.color) { + text(cdi.creature.name, font = cdi.font, textSize = cdi.font.fontSize.toDouble(), color = cdi.creature.team.color.base) { position((w - textBounds.width) / 2, texty) } diff --git a/cardgen/src/commonMain/kotlin/creatures/creatures.kt b/cardgen/src/commonMain/kotlin/creatures/creatures.kt index 4ddf5d9..06767df 100644 --- a/cardgen/src/commonMain/kotlin/creatures/creatures.kt +++ b/cardgen/src/commonMain/kotlin/creatures/creatures.kt @@ -8,10 +8,12 @@ import com.soywiz.korim.color.RGBA import com.soywiz.korio.file.VfsFile import com.soywiz.korio.serialization.json.Json import com.soywiz.korma.geom.RectangleInt +import creatures.TeamColors.HUMAN_COLORS +import creatures.TeamColors.ORC_COLORS -enum class Team(val color: RGBA) { - HUMAN(RGBA.unclamped(14, 123, 178, 255)), - ORC(Colors.RED); +enum class Team(val color: TeamColor) { + HUMAN(HUMAN_COLORS), + ORC(ORC_COLORS) } private fun findTeam(s: String?): Team? { diff --git a/cardgen/src/commonMain/kotlin/creatures/teamColor.kt b/cardgen/src/commonMain/kotlin/creatures/teamColor.kt new file mode 100644 index 0000000..cecb9d7 --- /dev/null +++ b/cardgen/src/commonMain/kotlin/creatures/teamColor.kt @@ -0,0 +1,20 @@ +package creatures + +import com.soywiz.korim.color.Colors +import com.soywiz.korim.color.RGBA + +data class TeamColor(val base: RGBA, val lighter: RGBA, val lighteR: RGBA, val lightest: RGBA) + +object TeamColors { + val HUMAN_COLORS = TeamColor( + RGBA.unclamped(14, 123, 178, 255), + RGBA.unclamped(26, 145, 207, 255), + RGBA.unclamped(38, 160, 223, 255), + RGBA.unclamped(50, 178, 245, 255)) + val ORC_COLORS = TeamColor( + Colors.RED, + Colors.RED, + Colors.RED, + Colors.RED) +} + diff --git a/cardgen/src/commonMain/kotlin/main.kt b/cardgen/src/commonMain/kotlin/main.kt index 9c8d37b..77410e9 100644 --- a/cardgen/src/commonMain/kotlin/main.kt +++ b/cardgen/src/commonMain/kotlin/main.kt @@ -1,18 +1,19 @@ import card.* -import com.soywiz.korge.* -import com.soywiz.korge.view.* -import com.soywiz.korim.bitmap.* +import com.soywiz.korge.Korge +import com.soywiz.korge.view.Stage +import com.soywiz.korge.view.renderToBitmap +import com.soywiz.korim.bitmap.Bitmap +import com.soywiz.korim.bitmap.BitmapSlice import com.soywiz.korim.color.Colors -import com.soywiz.korim.color.RGBA import com.soywiz.korim.font.BitmapFont import com.soywiz.korim.font.readBitmapFont -import com.soywiz.korim.format.* -import com.soywiz.korio.file.std.* -import com.soywiz.korma.geom.RectangleInt +import com.soywiz.korim.format.PNG +import com.soywiz.korim.format.readBitmap +import com.soywiz.korim.format.writeTo +import com.soywiz.korio.file.std.resourcesVfs +import com.soywiz.korio.file.std.uniVfs import creatures.Creature import twod.Tile -import twod.shrink -import twod.solidInnerBorders suspend fun main() = Korge(width = (24 * 9), height = ((24 * 4) + 12) * 3, bgcolor = Colors["#2b2b2b"]) { val dataJson = resourcesVfs["data.json"] @@ -39,6 +40,7 @@ fun Stage.prepareCard(creature: Creature, cbmp: BitmapSlice, font: Bitma stage.putBackground(cdi) stage.putBorder(cdi) + stage.putBorderDecoration(cdi) val tiley: Double = stage.putCreatureTile(cdi) val texty = stage.putCreatureName(cdi, tiley) stage.putStats(cdi, texty) diff --git a/cardgen/src/commonMain/kotlin/twod/direction.kt b/cardgen/src/commonMain/kotlin/twod/direction.kt new file mode 100644 index 0000000..b471fcd --- /dev/null +++ b/cardgen/src/commonMain/kotlin/twod/direction.kt @@ -0,0 +1,10 @@ +enum class Direction { + BOTTOM, + BOTTOM_RIGHT, + RIGHT, + TOP_RIGHT, + TOP, + TOP_LEFT, + LEFT, + BOTTOM_LEFT, +} \ No newline at end of file diff --git a/cardgen/src/commonMain/kotlin/twod/shapes.kt b/cardgen/src/commonMain/kotlin/twod/shapes.kt index 41b3fa6..d975fc0 100644 --- a/cardgen/src/commonMain/kotlin/twod/shapes.kt +++ b/cardgen/src/commonMain/kotlin/twod/shapes.kt @@ -1,9 +1,12 @@ package twod +import Direction import com.soywiz.korge.view.Container import com.soywiz.korge.view.position import com.soywiz.korge.view.solidRect +import com.soywiz.korim.color.RGB import com.soywiz.korim.color.RGBA +import com.soywiz.korma.geom.PointInt import com.soywiz.korma.geom.RectangleInt import kotlin.math.* @@ -22,8 +25,12 @@ fun Container.solidIntRect(r: RectangleInt, color: RGBA) { solidRect(r.width, r.height, color) { position(r.x, r.y) } } +fun Container.solidPoint(p : PointInt, color: RGBA) { + solidRect(1, 1, color) { position(p.x, p.y) } +} + fun RectangleInt.shrink(): RectangleInt { - return RectangleInt.invoke(x + 1, y +1, max(0, width -2), max(0, height - 2)) + return RectangleInt.invoke(x + 1, y + 1, max(0, width -2), max(0, height - 2)) } fun RectangleInt.innerBorders(): List { @@ -36,3 +43,17 @@ fun RectangleInt.innerBorders(): List { IntLine(x+w-2, y+1, max(0, h-2), false) // right vertical line ) } + +fun RectangleInt.corner(dir: Direction): PointInt { + val offset = when (dir) { + Direction.BOTTOM -> PointInt(width / 2, height) + Direction.BOTTOM_RIGHT -> PointInt(width, height) + Direction.BOTTOM_LEFT -> PointInt(0, height) + Direction.LEFT -> PointInt(0, height / 2) + Direction.RIGHT -> PointInt(width, height / 2) + Direction.TOP -> PointInt(width / 2, height) + Direction.TOP_LEFT -> PointInt(0, 0) + Direction.TOP_RIGHT -> PointInt(width, 0) + } + return PointInt(x + offset.x, y + offset.y) +} diff --git a/inspiration/1c1ad828390327.55bddd8a5f847.png b/inspiration/1c1ad828390327.55bddd8a5f847.png new file mode 100644 index 0000000..04d4ee9 Binary files /dev/null and b/inspiration/1c1ad828390327.55bddd8a5f847.png differ diff --git a/inspiration/CGLcfvpVAAAyYFt.png b/inspiration/CGLcfvpVAAAyYFt.png new file mode 100644 index 0000000..ff90c13 Binary files /dev/null and b/inspiration/CGLcfvpVAAAyYFt.png differ diff --git a/mockup/card.png b/mockup/card.png new file mode 100644 index 0000000..dd4574c Binary files /dev/null and b/mockup/card.png differ