package net.torvald.terrarum.modulebasegame.imagefont

import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.graphics.g2d.GlyphLayout
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack

/**
 * Created by minjaesong on 2017-03-24.
 */
class NewRunes : BitmapFont() {
    private val runeSize = 12

    // hard-coded encode map
    private fun codeToEnc(code: Int): Int? = if (code in 0x21..0x3f)
            code - 0x20
        else if (code in 0x3001..0x300f)
            code - 0x3000 + 0x20
        else if (code in 0x3131..0x3163)
            code - 0x3130 + 0x30
        else
            null


    private val runes = TextureRegionPack("./assets/graphics/fonts/newrunes.tga", runeSize, runeSize)

    var scale = 1
    var linegap = 8


    fun getWidth(str: String) = runeSize * str.length



    override fun draw(batch: Batch, str: CharSequence, x: Float, y: Float): GlyphLayout? {
        str.forEachIndexed { index, c ->
            val encodePoint = codeToEnc(c.toInt())

            if (encodePoint != null) {
                batch.draw(
                        runes.get(encodePoint % 16, encodePoint / 16),
                        x + runeSize * index * scale.toFloat(),
                        y * scale.toFloat()
                )
            }
        }

        return null
    }

    override fun usesIntegerPositions() = true
    override fun ownsTexture() = true
    override fun getXHeight() = runeSize.toFloat()
    override fun getCapHeight() = runeSize.toFloat()
    override fun getLineHeight() = (runeSize + linegap) * scale.toFloat()
}

/*
How runes are made:

The new runes are based on Hangul writing system. The runes had two main goals:
 - Implement the principle of its design (specifically, how this letter is altered from its base shape)
    - {KIYEOK, KHIEUKH}, {TIKEUT, THIEUTH, NIEUN}, {PIEUP, PHIEUPH, MIEUM}, {CIEUC, CHIEUCH, SIOS} sets
        are similar in shape
    - Aspirated sounds keep similar shape to their base
    - Vowels are not random; they have rules
    - In non-assembled writing, IEUNG only appears as "-ng" phoneme, so the shape is based on
        old Hangul YESIEUNG, which actually had "-ng" sound
 - "Doensori" are realised by prepending SIOS, much like older Korean orthography
 - Good enough obfuscation


Notes:
 - In some letters (e.g. NIEUN-HIEUH), ligatures may applied
 - EU appear as non-assembled shape; U-shape instead of dash


 */