Skip to content

Commit

Permalink
Start decorating the card's border
Browse files Browse the repository at this point in the history
  • Loading branch information
smelc committed Jan 16, 2020
1 parent 4e1e7f9 commit c9fe442
Show file tree
Hide file tree
Showing 9 changed files with 76 additions and 18 deletions.
13 changes: 8 additions & 5 deletions cardgen/src/commonMain/kotlin/card/card.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<Bitmap>, val font: BitmapFont, val tiles: Map<Tile, BitmapSlice<Bitmap>>)

Expand All @@ -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;
Expand All @@ -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)
}

Expand Down
8 changes: 5 additions & 3 deletions cardgen/src/commonMain/kotlin/creatures/creatures.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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? {
Expand Down
20 changes: 20 additions & 0 deletions cardgen/src/commonMain/kotlin/creatures/teamColor.kt
Original file line number Diff line number Diff line change
@@ -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)
}

20 changes: 11 additions & 9 deletions cardgen/src/commonMain/kotlin/main.kt
Original file line number Diff line number Diff line change
@@ -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"]
Expand All @@ -39,6 +40,7 @@ fun Stage.prepareCard(creature: Creature, cbmp: BitmapSlice<Bitmap>, 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)
Expand Down
10 changes: 10 additions & 0 deletions cardgen/src/commonMain/kotlin/twod/direction.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
enum class Direction {
BOTTOM,
BOTTOM_RIGHT,
RIGHT,
TOP_RIGHT,
TOP,
TOP_LEFT,
LEFT,
BOTTOM_LEFT,
}
23 changes: 22 additions & 1 deletion cardgen/src/commonMain/kotlin/twod/shapes.kt
Original file line number Diff line number Diff line change
@@ -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.*

Expand All @@ -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<IntLine> {
Expand All @@ -36,3 +43,17 @@ fun RectangleInt.innerBorders(): List<IntLine> {
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)
}
Binary file added inspiration/1c1ad828390327.55bddd8a5f847.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added inspiration/CGLcfvpVAAAyYFt.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mockup/card.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit c9fe442

Please sign in to comment.