diff --git a/.idea/libraries/lib.xml b/.idea/libraries/lib.xml index 2c0db4dd7..19151d642 100644 --- a/.idea/libraries/lib.xml +++ b/.idea/libraries/lib.xml @@ -17,6 +17,7 @@ + @@ -25,11 +26,14 @@ - + + + + \ No newline at end of file diff --git a/assets/graphics/fonts/MDA.png.0.png b/assets/graphics/fonts/MDA.png.0.png index 4a503cbce..d57f75692 100644 Binary files a/assets/graphics/fonts/MDA.png.0.png and b/assets/graphics/fonts/MDA.png.0.png differ diff --git a/assets/graphics/fonts/MDA.png.10.png b/assets/graphics/fonts/MDA.png.10.png new file mode 100644 index 000000000..f321b9b07 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.10.png differ diff --git a/assets/graphics/fonts/MDA.png.11.png b/assets/graphics/fonts/MDA.png.11.png new file mode 100644 index 000000000..d7221a428 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.11.png differ diff --git a/assets/graphics/fonts/MDA.png.12.png b/assets/graphics/fonts/MDA.png.12.png new file mode 100644 index 000000000..456c95805 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.12.png differ diff --git a/assets/graphics/fonts/MDA.png.13.png b/assets/graphics/fonts/MDA.png.13.png new file mode 100644 index 000000000..f185ce6e6 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.13.png differ diff --git a/assets/graphics/fonts/MDA.png.14.png b/assets/graphics/fonts/MDA.png.14.png new file mode 100644 index 000000000..6a0b3e31b Binary files /dev/null and b/assets/graphics/fonts/MDA.png.14.png differ diff --git a/assets/graphics/fonts/MDA.png.15.png b/assets/graphics/fonts/MDA.png.15.png new file mode 100644 index 000000000..7011d2322 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.15.png differ diff --git a/assets/graphics/fonts/MDA.png.4.png b/assets/graphics/fonts/MDA.png.4.png new file mode 100644 index 000000000..1f6be0a70 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.4.png differ diff --git a/assets/graphics/fonts/MDA.png.5.png b/assets/graphics/fonts/MDA.png.5.png new file mode 100644 index 000000000..cb1a9d8c1 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.5.png differ diff --git a/assets/graphics/fonts/MDA.png.6.png b/assets/graphics/fonts/MDA.png.6.png new file mode 100644 index 000000000..2d8db80bd Binary files /dev/null and b/assets/graphics/fonts/MDA.png.6.png differ diff --git a/assets/graphics/fonts/MDA.png.7.png b/assets/graphics/fonts/MDA.png.7.png new file mode 100644 index 000000000..2594e1123 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.7.png differ diff --git a/assets/graphics/fonts/MDA.png.8.png b/assets/graphics/fonts/MDA.png.8.png new file mode 100644 index 000000000..03db0f01a Binary files /dev/null and b/assets/graphics/fonts/MDA.png.8.png differ diff --git a/assets/graphics/fonts/MDA.png.9.png b/assets/graphics/fonts/MDA.png.9.png new file mode 100644 index 000000000..8cd5a6f36 Binary files /dev/null and b/assets/graphics/fonts/MDA.png.9.png differ diff --git a/lib/natives/OpenAL32.dll b/lib/OpenAL32.dll old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/OpenAL32.dll rename to lib/OpenAL32.dll diff --git a/lib/natives/OpenAL64.dll b/lib/OpenAL64.dll old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/OpenAL64.dll rename to lib/OpenAL64.dll diff --git a/lib/natives/jinput-dx8.dll b/lib/jinput-dx8.dll old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/jinput-dx8.dll rename to lib/jinput-dx8.dll diff --git a/lib/natives/jinput-dx8_64.dll b/lib/jinput-dx8_64.dll old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/jinput-dx8_64.dll rename to lib/jinput-dx8_64.dll diff --git a/lib/natives/jinput-raw.dll b/lib/jinput-raw.dll old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/jinput-raw.dll rename to lib/jinput-raw.dll diff --git a/lib/natives/jinput-raw_64.dll b/lib/jinput-raw_64.dll old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/jinput-raw_64.dll rename to lib/jinput-raw_64.dll diff --git a/lib/natives/libjinput-linux.so b/lib/libjinput-linux.so old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/libjinput-linux.so rename to lib/libjinput-linux.so diff --git a/lib/natives/libjinput-linux64.so b/lib/libjinput-linux64.so old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/libjinput-linux64.so rename to lib/libjinput-linux64.so diff --git a/lib/natives/libjinput-osx.dylib b/lib/libjinput-osx.dylib old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/libjinput-osx.dylib rename to lib/libjinput-osx.dylib diff --git a/lib/libjnlua5.2.jnilib b/lib/libjnlua5.2.jnilib new file mode 100755 index 000000000..01c4b5113 Binary files /dev/null and b/lib/libjnlua5.2.jnilib differ diff --git a/lib/natives/liblwjgl.dylib b/lib/liblwjgl.dylib old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/liblwjgl.dylib rename to lib/liblwjgl.dylib diff --git a/lib/liblwjgl.so b/lib/liblwjgl.so new file mode 100755 index 000000000..3fe6b16c1 Binary files /dev/null and b/lib/liblwjgl.so differ diff --git a/lib/liblwjgl64.so b/lib/liblwjgl64.so new file mode 100755 index 000000000..690f6354b Binary files /dev/null and b/lib/liblwjgl64.so differ diff --git a/lib/natives/libopenal.so b/lib/libopenal.so old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/libopenal.so rename to lib/libopenal.so diff --git a/lib/natives/libopenal64.so b/lib/libopenal64.so old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/libopenal64.so rename to lib/libopenal64.so diff --git a/lib/natives/lwjgl.dll b/lib/lwjgl.dll old mode 100644 new mode 100755 similarity index 99% rename from lib/natives/lwjgl.dll rename to lib/lwjgl.dll index b26da56c1..7cca39f88 Binary files a/lib/natives/lwjgl.dll and b/lib/lwjgl.dll differ diff --git a/lib/natives/lwjgl64.dll b/lib/lwjgl64.dll old mode 100644 new mode 100755 similarity index 99% rename from lib/natives/lwjgl64.dll rename to lib/lwjgl64.dll index ac5aecd5c..99cbd9884 Binary files a/lib/natives/lwjgl64.dll and b/lib/lwjgl64.dll differ diff --git a/lib/natives/liblwjgl.so b/lib/natives/liblwjgl.so deleted file mode 100644 index ba6e7f696..000000000 Binary files a/lib/natives/liblwjgl.so and /dev/null differ diff --git a/lib/natives/liblwjgl64.so b/lib/natives/liblwjgl64.so deleted file mode 100644 index 8ed0992b3..000000000 Binary files a/lib/natives/liblwjgl64.so and /dev/null differ diff --git a/lib/natives/native.32.bsd.so b/lib/natives/native.32.bsd.so deleted file mode 100755 index 572568d56..000000000 Binary files a/lib/natives/native.32.bsd.so and /dev/null differ diff --git a/lib/natives/native.32.dll b/lib/natives/native.32.dll deleted file mode 100755 index 168b7a112..000000000 Binary files a/lib/natives/native.32.dll and /dev/null differ diff --git a/lib/natives/native.32.dylib b/lib/natives/native.32.dylib deleted file mode 100755 index 255c63e08..000000000 Binary files a/lib/natives/native.32.dylib and /dev/null differ diff --git a/lib/natives/native.32.so b/lib/natives/native.32.so deleted file mode 100755 index 06e4e6e0c..000000000 Binary files a/lib/natives/native.32.so and /dev/null differ diff --git a/lib/natives/native.64.bsd.so b/lib/natives/native.64.bsd.so deleted file mode 100755 index eab8829a2..000000000 Binary files a/lib/natives/native.64.bsd.so and /dev/null differ diff --git a/lib/natives/native.64.dll b/lib/natives/native.64.dll deleted file mode 100755 index 83022b5b7..000000000 Binary files a/lib/natives/native.64.dll and /dev/null differ diff --git a/lib/natives/native.64.dylib b/lib/natives/native.64.dylib deleted file mode 100755 index fcf9084bf..000000000 Binary files a/lib/natives/native.64.dylib and /dev/null differ diff --git a/lib/natives/native.64.so b/lib/natives/native.64.so deleted file mode 100755 index baf1c7d30..000000000 Binary files a/lib/natives/native.64.so and /dev/null differ diff --git a/lib/natives/natives-linux.jar b/lib/natives/natives-linux.jar deleted file mode 100644 index a543ee021..000000000 Binary files a/lib/natives/natives-linux.jar and /dev/null differ diff --git a/lib/natives/natives-mac.jar b/lib/natives/natives-mac.jar deleted file mode 100644 index 220012ba0..000000000 Binary files a/lib/natives/natives-mac.jar and /dev/null differ diff --git a/lib/natives/natives-windows.jar b/lib/natives/natives-windows.jar deleted file mode 100644 index 2fb036fb1..000000000 Binary files a/lib/natives/natives-windows.jar and /dev/null differ diff --git a/lib/natives/openal.dylib b/lib/openal.dylib old mode 100644 new mode 100755 similarity index 100% rename from lib/natives/openal.dylib rename to lib/openal.dylib diff --git a/src/net/torvald/CSVFetcher.kt b/src/net/torvald/CSVFetcher.kt index 197aa0ee1..61f8d34d3 100644 --- a/src/net/torvald/CSVFetcher.kt +++ b/src/net/torvald/CSVFetcher.kt @@ -5,6 +5,7 @@ import org.apache.commons.csv.CSVParser import org.apache.commons.csv.CSVRecord import java.io.IOException +import java.io.InputStreamReader import java.nio.file.FileSystems import java.nio.file.Files @@ -39,6 +40,24 @@ object CSVFetcher { return csvRecordList } + fun readFromString(csv: String): List { + val csvParser = CSVParser.parse( + csv, + CSVFormat.DEFAULT.withIgnoreSurroundingSpaces() + .withHeader() + .withIgnoreEmptyLines() + .withDelimiter(';') + .withCommentMarker('#') + .withNullString("N/A") + .withRecordSeparator('\n') + ) + + val csvRecordList = csvParser.records + csvParser.close() + + return csvRecordList + } + @Throws(IOException::class) fun readCSVasString(path: String): String { csvString = StringBuffer() diff --git a/src/net/torvald/aa/ColouredFastFont.kt b/src/net/torvald/aa/ColouredFastFont.kt index 925348e11..0a12b49ec 100644 --- a/src/net/torvald/aa/ColouredFastFont.kt +++ b/src/net/torvald/aa/ColouredFastFont.kt @@ -1,6 +1,6 @@ package net.torvald.aa -import net.torvald.terrarum.virtualcomputers.terminal.Terminal +import net.torvald.terrarum.virtualcomputer.terminal.Terminal import org.newdawn.slick.Color import org.newdawn.slick.Font import org.newdawn.slick.Image diff --git a/src/net/torvald/colourutil/CIELabUtil.kt b/src/net/torvald/colourutil/CIELabUtil.kt index 907e2067f..ed825a8e2 100644 --- a/src/net/torvald/colourutil/CIELabUtil.kt +++ b/src/net/torvald/colourutil/CIELabUtil.kt @@ -133,12 +133,25 @@ object CIELabUtil { private fun Float.powerOf(exp: Float) = FastMath.pow(this, exp) } -internal val D65 = CIEXYZ(95.047f, 100f, 108.883f) -val epsilon = 216.0.div(24389.0).toFloat() -val kappa = 24389.0.div(27.0).toFloat() +internal val D65 = CIEXYZ(0.95047f, 1.00f, 1.08883f) +val epsilon = 216f/24389f +val kappa = 24389f/27f -data class CIEXYZ(var X: Float = 0f, var Y: Float = 0f, var Z: Float = 0f, val alpha: Float = 1f) +/** Range: X, Y, Z: 0 - 1.0+ (One-based-plus) */ +data class CIEXYZ(var X: Float = 0f, var Y: Float = 0f, var Z: Float = 0f, val alpha: Float = 1f) { + init { + if (X > 2f || Y > 2f || Z > 2f) + throw IllegalArgumentException("Value range error - CIEXYZ is one-based (0.0 - 1.0+): ($X, $Y, $Z)") + } +} +/** + * Range: + * L: 0-100.0 + * u, v: -100+ - 100+ + * (Hundred-based-plus) + */ data class CIELab(var L: Float = 0f, var a: Float = 0f, var b: Float = 0f, val alpha: Float = 1f) +/** Range: r, g, b: 0 - 1.0 (One-based) */ data class RGB(var r: Float = 0f, var g: Float = 0f, var b: Float = 0f, val alpha: Float = 1f) { constructor(color: Color) : this() { r = color.r; g = color.g; b = color.b diff --git a/src/net/torvald/colourutil/CIELuvUtil.kt b/src/net/torvald/colourutil/CIELuvUtil.kt index 4aa996c1e..2d090cab9 100644 --- a/src/net/torvald/colourutil/CIELuvUtil.kt +++ b/src/net/torvald/colourutil/CIELuvUtil.kt @@ -99,4 +99,10 @@ object CIELuvUtil { private fun Float.cube() = this * this * this } +/** + * Range: + * L: 0-100.0 + * u, v: -100+ - 100+ + * (Hundred-based-plus) + */ data class CIELuv(var L: Float = 0f, var u: Float = 0f, var v: Float = 0f, val alpha: Float = 1f) diff --git a/src/net/torvald/terrarum/StateInGame.kt b/src/net/torvald/terrarum/StateInGame.kt index 149db53be..d76e86c74 100644 --- a/src/net/torvald/terrarum/StateInGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -76,11 +76,6 @@ constructor() : BasicGameState() { private val CORES = ThreadPool.POOL_SIZE - val memInUse: Long - get() = ManagementFactory.getMemoryMXBean().heapMemoryUsage.used shr 20 - val totalVMMem: Long - get() = Runtime.getRuntime().maxMemory() shr 20 - val auth = Authenticator() val KEY_LIGHTMAP_RENDER = Key.F7 @@ -231,9 +226,9 @@ constructor() : BasicGameState() { private fun setAppTitle() { Terrarum.appgc.setTitle( - "Simple Slick Game" + + "${Terrarum.NAME}" + " — F: ${Terrarum.appgc.fps} (${Terrarum.TARGET_INTERNAL_FPS})" + - " — M: ${memInUse}M / ${totalVMMem}M") + " — M: ${Terrarum.memInUse}M / ${Terrarum.totalVMMem}M") } override fun render(gc: GameContainer, sbg: StateBasedGame, g: Graphics) { diff --git a/src/net/torvald/terrarum/StateTestingSandbox.kt b/src/net/torvald/terrarum/StateTestingSandbox.kt index 6156bd2a7..b1102618d 100644 --- a/src/net/torvald/terrarum/StateTestingSandbox.kt +++ b/src/net/torvald/terrarum/StateTestingSandbox.kt @@ -1,15 +1,7 @@ package net.torvald.terrarum -import net.torvald.CSVFetcher -import net.torvald.colourutil.CIELabUtil.toXYZ -import net.torvald.colourutil.CIELabUtil.toLab -import net.torvald.colourutil.CIELabUtil.toRGB -import net.torvald.colourutil.CIELuv -import net.torvald.colourutil.CIELuvUtil.toRawRGB -import net.torvald.colourutil.CIELuvUtil.toLuv -import net.torvald.colourutil.RGB + import org.apache.commons.csv.CSVRecord -import org.newdawn.slick.Color import org.newdawn.slick.GameContainer import org.newdawn.slick.Graphics import org.newdawn.slick.state.BasicGameState @@ -20,21 +12,10 @@ import org.newdawn.slick.state.StateBasedGame */ class StateTestingSandbox : BasicGameState() { + + override fun init(container: GameContainer?, game: StateBasedGame?) { - val records = CSVFetcher("./src/net/torvald/terrarum/tileproperties/tileprop_10bcol.csv") - records.forEach { - val tenOpacity = intVal(it, "opacity") - val tenLum = intVal(it, "lumcolor") - val eightOpacity = tenOpacity.and(0xff) or - tenOpacity.ushr(10).and(0xff).shl(8) or - tenOpacity.ushr(20).and(0xff).shl(16) - val eightLum = tenLum.and(0xff) or - tenLum.ushr(10).and(0xff).shl(8) or - tenLum.ushr(20).and(0xff).shl(16) - - println("$eightOpacity\t$eightLum") - } } override fun update(container: GameContainer?, game: StateBasedGame?, delta: Int) { diff --git a/src/net/torvald/terrarum/StateVTTest.kt b/src/net/torvald/terrarum/StateVTTest.kt index c0664e491..d5a73926d 100644 --- a/src/net/torvald/terrarum/StateVTTest.kt +++ b/src/net/torvald/terrarum/StateVTTest.kt @@ -1,14 +1,13 @@ package net.torvald.terrarum import net.torvald.terrarum.gamecontroller.Key -import net.torvald.terrarum.virtualcomputers.terminal.SimpleTextTerminal -import org.newdawn.slick.Color +import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal import org.newdawn.slick.GameContainer import org.newdawn.slick.Graphics import org.newdawn.slick.Image import org.newdawn.slick.state.BasicGameState import org.newdawn.slick.state.StateBasedGame -import java.util.* /** * ComputerCraft/OpenComputers like-alike, just for fun! @@ -17,19 +16,24 @@ import java.util.* */ class StateVTTest : BasicGameState() { - val vt = SimpleTextTerminal(SimpleTextTerminal.ELECTRIC_BLUE, 80, 25) + val vt = SimpleTextTerminal(SimpleTextTerminal.IBM_GREEN, 80, 25) + val computerInside = BaseTerrarumComputer(vt) val vtUI = Image(vt.displayW, vt.displayH) - override fun init(container: GameContainer, game: StateBasedGame) { + init { + } + + override fun init(container: GameContainer, game: StateBasedGame) { + vt.openInput() } override fun update(container: GameContainer, game: StateBasedGame, delta: Int) { - Terrarum.appgc.setTitle("VT — F: ${container.fps}") + Terrarum.appgc.setTitle("VT — F: ${container.fps}" + + " — M: ${Terrarum.memInUse}M / ${Terrarum.totalVMMem}M") vt.update(container, delta) - - + computerInside.update(container, delta) } override fun getID() = Terrarum.STATE_ID_TEST_TTY @@ -46,10 +50,16 @@ class StateVTTest : BasicGameState() { override fun keyPressed(key: Int, c: Char) { super.keyPressed(key, c) + vt.keyPressed(key, c) - if (key == Key.RETURN) - vt.printChar(10.toChar()) - else - vt.printChar(c) + if (key == Key.RETURN) { + val input = vt.closeInput() + + computerInside.runCommand(input, "consoleinput") + + vt.openInput() + + computerInside.runCommand("io.write(_COMPUTER.prompt)", "prompt") + } } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index d00b2c85b..f121a42f7 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -13,6 +13,7 @@ import org.newdawn.slick.* import org.newdawn.slick.state.StateBasedGame import java.io.File import java.io.IOException +import java.lang.management.ManagementFactory import java.text.SimpleDateFormat import java.util.* import java.util.logging.FileHandler @@ -104,8 +105,9 @@ constructor(gamename: String) : StateBasedGame(gamename) { //addState(StateSplash()) //addState(StateMonitorCheck()) //addState(StateFontTester()) - ingame = StateInGame() - addState(ingame) + + //ingame = StateInGame() + //addState(ingame) } companion object { @@ -152,6 +154,11 @@ constructor(gamename: String) : StateBasedGame(gamename) { lateinit var defaultSaveDir: String private set + val memInUse: Long + get() = ManagementFactory.getMemoryMXBean().heapMemoryUsage.used shr 20 + val totalVMMem: Long + get() = Runtime.getRuntime().maxMemory() shr 20 + lateinit var environment: RunningEnvironment private val localeSimple = arrayOf("de", "en", "es", "it") @@ -408,7 +415,9 @@ constructor(gamename: String) : StateBasedGame(gamename) { } } -fun main(args: Array) = Terrarum.main(args) +fun main(args: Array) { + Terrarum.main(args) +} fun blendMul() { GL11.glEnable(GL11.GL_BLEND) diff --git a/src/net/torvald/terrarum/tileproperties/TilePropCSV.kt b/src/net/torvald/terrarum/tileproperties/TilePropCSV.kt new file mode 100644 index 000000000..fd00e36cd --- /dev/null +++ b/src/net/torvald/terrarum/tileproperties/TilePropCSV.kt @@ -0,0 +1,165 @@ +package net.torvald.terrarum.tileproperties + +/** + * Created by minjaesong on 16-09-11. + */ +object TilePropCSV { + const val text = """ + "id";"dmg";"name" ; "opacity";"strength";"dsty";"fluid";"solid";"wall"; "lumcolor";"drop";"ddmg";"fall";"dlfn";"friction" + "0"; "0";"TILE_AIR" ; "8396808"; "0"; "1"; "0"; "0"; "0"; "0"; "0"; "0"; "0"; "0";"4" + "1"; "0";"TILE_STONE" ; "33587232"; "25";"2400"; "0"; "1"; "1"; "0"; "1"; "0"; "0"; "0";"16" + "1"; "1";"TILE_STONE_QUARRIED" ; "33587232"; "25";"2400"; "0"; "1"; "1"; "0"; "1"; "1"; "0"; "0";"16" + "1"; "2";"TILE_STONE_TILE_WHITE" ; "33587232"; "25";"2400"; "0"; "1"; "1"; "0"; "1"; "2"; "0"; "0";"16" + "1"; "3";"TILE_STONE_BRICKS" ; "33587232"; "25";"2400"; "0"; "1"; "1"; "0"; "1"; "3"; "0"; "0";"16" + "2"; "0";"TILE_DIRT" ; "33587232"; "6";"1400"; "0"; "1"; "1"; "0"; "2"; "0"; "0"; "0";"16" + "2"; "1";"TILE_GRASS" ; "33587232"; "6";"1400"; "0"; "1"; "1"; "0"; "2"; "1"; "0"; "0";"16" + "3"; "0";"TILE_PLANK_NORMAL" ; "33587232"; "12"; "740"; "0"; "1"; "1"; "0"; "3"; "0"; "0"; "0";"16" + "3"; "1";"TILE_PLANK_EBONY" ; "33587232"; "12";"1200"; "0"; "1"; "1"; "0"; "3"; "1"; "0"; "0";"16" + "3"; "2";"TILE_PLANK_BIRCH" ; "33587232"; "12"; "670"; "0"; "1"; "1"; "0"; "3"; "2"; "0"; "0";"16" + "3"; "3";"TILE_PLANK_BLOODROSE" ; "33587232"; "12"; "900"; "0"; "1"; "1"; "0"; "3"; "3"; "0"; "0";"16" + "4"; "0";"TILE_TRUNK_NORMAL" ; "33587232"; "12"; "740"; "0"; "1"; "0"; "0"; "3"; "0"; "0"; "0";"16" + "4"; "1";"TILE_TRUNK_EBONY" ; "33587232"; "12";"1200"; "0"; "1"; "0"; "0"; "3"; "1"; "0"; "0";"16" + "4"; "2";"TILE_TRUNK_BIRCH" ; "33587232"; "12"; "670"; "0"; "1"; "0"; "0"; "3"; "2"; "0"; "0";"16" + "4"; "3";"TILE_TRUNK_BLOODROSE" ; "33587232"; "12"; "900"; "0"; "1"; "0"; "0"; "3"; "3"; "0"; "0";"16" + "5"; "0";"TILE_SAND" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "5"; "0"; "1"; "0";"16" + "5"; "1";"TILE_SAND_WHITE" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "5"; "1"; "1"; "0";"16" + "5"; "2";"TILE_SAND_RED" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "5"; "2"; "1"; "0";"16" + "5"; "3";"TILE_SAND_DESERT" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "5"; "3"; "1"; "0";"16" + "5"; "4";"TILE_SAND_BLACK" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "5"; "4"; "1"; "0";"16" + "5"; "5";"TILE_SAND_GREEN" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "5"; "5"; "1"; "0";"16" + "6"; "0";"TILE_GRAVEL" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "6"; "0"; "1"; "0";"16" + "6"; "1";"TILE_GRAVEL_GREY" ; "33587232"; "6";"2400"; "0"; "1"; "0"; "0"; "6"; "1"; "1"; "0";"16" + "7"; "0";"TILE_ORE_MALACHITE" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "7"; "0"; "0"; "0";"16" + "7"; "1";"TILE_ORE_HEMATITE" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "7"; "1"; "0"; "0";"16" + "7"; "2";"TILE_ORE_NATURAL_GOLD" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "7"; "2"; "0"; "0";"16" + "7"; "3";"TILE_ORE_NATURAL_SILVER" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "7"; "3"; "0"; "0";"16" + "7"; "4";"TILE_ORE_RUTILE" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "7"; "4"; "0"; "0";"16" + "7"; "5";"TILE_ORE_AURICHALCUMITE" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "7"; "5"; "0"; "0";"16" + "8"; "0";"TILE_GEM_RUBY" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "8"; "0"; "0"; "0";"16" + "8"; "1";"TILE_GEM_EMERALD" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "8"; "1"; "0"; "0";"16" + "8"; "2";"TILE_GEM_SAPPHIRE" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "8"; "2"; "0"; "0";"16" + "8"; "3";"TILE_GEM_TOPAZ" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "8"; "3"; "0"; "0";"16" + "8"; "4";"TILE_GEM_DIAMOND" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "8"; "4"; "0"; "0";"16" + "8"; "5";"TILE_GEM_AMETHYST" ; "33587232"; "25";"2400"; "0"; "1"; "0"; "0"; "8"; "5"; "0"; "0";"16" + "9"; "0";"TILE_SNOW" ; "33587232"; "6"; "500"; "0"; "1"; "1"; "0"; "9"; "0"; "0"; "0";"16" + "9"; "1";"TILE_ICE_FRAGILE" ; "13644813"; "1"; "930"; "0"; "1"; "0"; "0"; "9"; "1"; "0"; "0";"16" + "9"; "2";"TILE_ICE_NATURAL" ; "27289626"; "25"; "930"; "0"; "1"; "1"; "0"; "9"; "2"; "0"; "0"; "8" + "9"; "3";"TILE_ICE_CLEAR_MAGICAL" ; "33587232"; "25";"3720"; "0"; "1"; "1"; "19955770"; "9"; "3"; "0"; "0"; "8" + "9"; "4";"TILE_GLASS_CRUDE" ; "3146755"; "1";"2500"; "0"; "1"; "1"; "0"; "9"; "4"; "0"; "0";"16" + "9"; "5";"TILE_GLASS_CLEAN" ; "1049601"; "1";"2203"; "0"; "1"; "1"; "0"; "9"; "5"; "0"; "0";"16" + "10"; "0";"TILE_PLATFORM_STONE" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "0"; "0"; "0";"16" + "10"; "1";"TILE_PLATFORM_WOODEN" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "1"; "0"; "0";"16" + "10"; "2";"TILE_PLATFORM_EBONY" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "2"; "0"; "0";"16" + "10"; "3";"TILE_PLATFORM_BIRCH" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "3"; "0"; "0";"16" + "10"; "4";"TILE_PLATFORM_BLOODROSE" ; "8396808"; "1"; "N/A"; "0"; "0"; "0"; "0"; "10"; "4"; "0"; "0";"16" + "11"; "0";"TILE_TORCH" ; "8396808"; "0"; "N/A"; "0"; "0"; "0"; "266453040"; "11"; "0"; "0"; "1";"16" + "11"; "1";"TILE_TORCH_FROST" ; "8396808"; "0"; "N/A"; "0"; "0"; "0"; "81916159"; "11"; "1"; "0"; "1";"16" + "12"; "0";"TILE_TORCH" ; "8396808"; "0"; "N/A"; "0"; "0"; "0"; "0"; "11"; "0"; "0"; "0";"16" + "12"; "1";"TILE_TORCH_FROST" ; "8396808"; "0"; "N/A"; "0"; "0"; "0"; "0"; "11"; "1"; "0"; "0";"16" + "13"; "0";"TILE_ILLUMINATOR_WHITE" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "239319274"; "13"; "0"; "0"; "0";"16" + "13"; "1";"TILE_ILLUMINATOR_YELLOW" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "267607040"; "13"; "1"; "0"; "0";"16" + "13"; "2";"TILE_ILLUMINATOR_ORANGE" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "267546624"; "13"; "2"; "0"; "0";"16" + "13"; "3";"TILE_ILLUMINATOR_RED" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "246415360"; "13"; "3"; "0"; "0";"16" + "13"; "4";"TILE_ILLUMINATOR_FUCHSIA" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "246415543"; "13"; "4"; "0"; "0";"16" + "13"; "5";"TILE_ILLUMINATOR_PURPLE" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "191889643"; "13"; "5"; "0"; "0";"16" + "13"; "6";"TILE_ILLUMINATOR_BLUE" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "52479"; "13"; "6"; "0"; "0";"16" + "13"; "7";"TILE_ILLUMINATOR_CYAN" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "219391"; "13"; "7"; "0"; "0";"16" + "13"; "8";"TILE_ILLUMINATOR_GREEN" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "56884224"; "13"; "8"; "0"; "0";"16" + "13"; "9";"TILE_ILLUMINATOR_GREEN_DARK";"8396808"; "0"; "N/A"; "0"; "1"; "1"; "33660928"; "13"; "9"; "0"; "0";"16" + "13"; "10";"TILE_ILLUMINATOR_BROWN" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "89161728"; "13"; "10"; "0"; "0";"16" + "13"; "11";"TILE_ILLUMINATOR_TAN" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "157392948"; "13"; "11"; "0"; "0";"16" + "13"; "12";"TILE_ILLUMINATOR_GREY_LIGHT";"8396808"; "0"; "N/A"; "0"; "1"; "1"; "198374589"; "13"; "12"; "0"; "0";"16" + "13"; "13";"TILE_ILLUMINATOR_GREY_MED"; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "122803317"; "13"; "13"; "0"; "0";"16" + "13"; "14";"TILE_ILLUMINATOR_GREY_DARK"; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "68224065"; "13"; "14"; "0"; "0";"16" + "13"; "15";"TILE_ILLUMINATOR_BLACK" ; "8396808"; "0"; "N/A"; "0"; "1"; "1"; "116392191"; "13"; "15"; "0"; "0";"16" + "14"; "0";"TILE_ILLUMINATOR_WHITE" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "0"; "0"; "0";"16" + "14"; "1";"TILE_ILLUMINATOR_YELLOW" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "1"; "0"; "0";"16" + "14"; "2";"TILE_ILLUMINATOR_ORANGE" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "2"; "0"; "0";"16" + "14"; "3";"TILE_ILLUMINATOR_RED" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "3"; "0"; "0";"16" + "14"; "4";"TILE_ILLUMINATOR_FUCHSIA" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "4"; "0"; "0";"16" + "14"; "5";"TILE_ILLUMINATOR_PURPLE" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "5"; "0"; "0";"16" + "14"; "6";"TILE_ILLUMINATOR_BLUE" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "6"; "0"; "0";"16" + "14"; "7";"TILE_ILLUMINATOR_CYAN" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "7"; "0"; "0";"16" + "14"; "8";"TILE_ILLUMINATOR_GREEN" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "8"; "0"; "0";"16" + "14"; "9";"TILE_ILLUMINATOR_GREEN_DARK";"33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "9"; "0"; "0";"16" + "14"; "10";"TILE_ILLUMINATOR_BROWN" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "10"; "0"; "0";"16" + "14"; "11";"TILE_ILLUMINATOR_TAN" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "11"; "0"; "0";"16" + "14"; "12";"TILE_ILLUMINATOR_GREY_LIGHT";"33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "12"; "0"; "0";"16" + "14"; "13";"TILE_ILLUMINATOR_GREY_MED"; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "13"; "0"; "0";"16" + "14"; "14";"TILE_ILLUMINATOR_GREY_DARK";"33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "14"; "0"; "0";"16" + "14"; "15";"TILE_ILLUMINATOR_BLACK" ; "33587232"; "0"; "N/A"; "0"; "1"; "1"; "0"; "13"; "15"; "0"; "0";"16" + "15"; "0";"TILE_SANDSTONE" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "0"; "0"; "0";"16" + "15"; "1";"TILE_SANDSTONE_WHITE" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "1"; "0"; "0";"16" + "15"; "2";"TILE_SANDSTONE_RED" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "2"; "0"; "0";"16" + "15"; "3";"TILE_SANDSTONE_DESERT" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "3"; "0"; "0";"16" + "15"; "4";"TILE_SANDSTONE_BLACK" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "4"; "0"; "0";"16" + "15"; "5";"TILE_SANDSTONE_BLACK" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "5"; "0"; "0";"16" + "16"; "0";"TILE_LANTERN_IRON_REGULAR"; "8396808"; "0"; "N/A"; "0"; "0"; "0"; "266453040"; "16"; "0"; "0"; "0";"16" + "16"; "1";"TILE_SUNSTONE" ; "33587232"; "0"; "N/A"; "0"; "1"; "0"; "0"; "16"; "1"; "0"; "2";"16" + "16"; "2";"TILE_DAYLIGHT_CAPACITOR" ; "33587232"; "0"; "N/A"; "0"; "1"; "0"; "0"; "16"; "2"; "0"; "3";"16" +"254"; "0";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "1";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "2";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "3";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "4";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "5";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "6";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "7";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "8";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "9";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "10";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "11";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "12";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "13";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "14";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"254"; "15";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "0";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "1";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "2";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "3";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "4";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "5";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "6";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "7";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "8";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "9";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "10";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "11";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "12";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "13";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "14";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"255"; "15";"TILE_WATER" ; "27282445"; "100";"1000"; "1"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" +"256"; "0";"TILE_NULL" ; "0"; "-1";"2600"; "0"; "0"; "0"; "0"; "N/A"; "N/A"; "0"; "0";"16" + +## Notes ## + +# Friction: 0: frictionless, <16: slippery, 16: regular, >16: sticky +# Opacity/Lumcolor: 30-bit RGB. Only the light diffusers have a opacity value of ZERO. +# Solid: whether the tile has full collision +# movr: Movement resistance, (walkspeedmax) / (1 + (n/16)), 16 halves movement speed +# dsty: density. As we are putting water an 1000, it is identical to specific gravity. [g/l] +# dlfn: dynamic luminosity function. +# 0-static, 1-torch flicker, 2-current global light (sun, star, moon), 3-daylight at noon, +# 4-slow breath, 5-pulsate + + +## Illuminators ## + +# Illuminator white: RGB(228,238,234), simulation of a halophosphate FL lamp (If you want high CRI lamp, collect a daylight!) +# Defalut torch : L 64 a 51 b 59; real candlelight colour taken from properly configured camera. +# Sunstone: Artificial sunlight, change colour over time in sync with sunlight. The light is set by game's code. +# Sunlight capacitor: daylight at noon. Set by game's code. + + +## Tiles ## + +# 16 colour palette : Old Apple Macintosh 16-colour palette +# Magical ice: theoretical __metallic__ ice that might form under super-high pressure (> 5 TPa). Its density is a wild guess. + + +## References ## + +# * Density of various woods : http://www.engineeringtoolbox.com/wood-density-d_40.html +# * Density of various phases of ice : http://www1.lsbu.ac.uk/water/ice_phases.html +""" +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt index 6fb9611e8..6cd89850c 100644 --- a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt +++ b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt @@ -14,7 +14,7 @@ object TilePropCodex { private lateinit var tileProps: Array - val CSV_PATH = "./src/net/torvald/terrarum/tileproperties/tileprop.csv" + val CSV_PATH = "/net/torvald/terrarum/tileproperties/tileprop.csv" const val TILE_UNIQUE_MAX = MapLayer.RANGE * PairedMapLayer.RANGE diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index 3c0af8471..963268de7 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -155,9 +155,9 @@ class BasicDebugInfoWindow : UICanvas { (Terrarum.WIDTH - 2 - 6*8).toFloat(), 10f) g.color = GameFontBase.codeToCol["g"] - g.drawString("${Terrarum.ingame.memInUse}M", + g.drawString("${Terrarum.memInUse}M", (Terrarum.WIDTH - 11 * 8 - 2).toFloat(), 2f) - g.drawString("/${Terrarum.ingame.totalVMMem}M", + g.drawString("/${Terrarum.totalVMMem}M", (Terrarum.WIDTH - 6 * 8 - 2).toFloat(), 2f) /** diff --git a/src/net/torvald/terrarum/virtualcomputer/assets/lua/BRAINFUCK.lua b/src/net/torvald/terrarum/virtualcomputer/assets/lua/BRAINFUCK.lua new file mode 100644 index 000000000..ab82a8745 --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/assets/lua/BRAINFUCK.lua @@ -0,0 +1,47 @@ +--[[ +From https://github.com/prapin/LuaBrainFuck/blob/master/brainfuck.lua + +LuaBrainFuck License +-------------------- + +LuaBrainFuck is placed under the same license as Lua itself, +so licensed under terms of the MIT license reproduced below. +This means that the library is free software and can be used for both academic +and commercial purposes at absolutely no cost. + +=============================================================================== + +Copyright (C) 2012 Patrick Rapin, CH-1543 Grandcour + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +=============================================================================== + +(end of COPYRIGHT) + +Example usage: require "brainfuck" "+++>>> your BF code here <<<---" + ]] +return function(s) + local subst = {["+"]="v=v+1 ", ["-"]="v=v-1 ", [">"]="i=i+1 ", ["<"]="i=i-1 ", + ["."] = "w(v)", [","]="v=r()", ["["]="while v~=0 do ", ["]"]="end "} + local env = setmetatable({ i=0, t=setmetatable({},{__index=function() return 0 end}), + r=function() return io.read(1):byte() end, w=function(c) io.write(string.char(c)) end }, + {__index=function(t,k) return t.t[t.i] end, __newindex=function(t,k,v) t.t[t.i]=v end }) + load(s:gsub("[^%+%-<>%.,%[%]]+",""):gsub(".", subst), "brainfuck", "t", env)() +end \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/assets/lua/ROMBASIC.lua b/src/net/torvald/terrarum/virtualcomputer/assets/lua/ROMBASIC.lua new file mode 100644 index 000000000..5a0f87f08 --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/assets/lua/ROMBASIC.lua @@ -0,0 +1,15 @@ +-- global variables +_COMPUTER = {} -- standard console colours +_COMPUTER["DC1"] = string.char(17) -- black +_COMPUTER["DC2"] = string.char(18) -- white +_COMPUTER["DC3"] = string.char(19) -- dim grey +_COMPUTER["DC4"] = string.char(20) -- light grey +_COMPUTER["prompt"] = function() + io.write(_COMPUTER.DC3 .. "> " .. _COMPUTER.DC4) +end +-- greet user +print("Rom basic " .. _COMPUTER.DC2 .. _VERSION .. _COMPUTER.DC4) +-- print(_COMPUTER.DC2 .. freemem .. _COMPUTER.DC4 .. " bytes free" +print("Ok") +-- prompt start +--_COMPUTER.prompt() diff --git a/src/net/torvald/terrarum/virtualcomputer/computer/BaseTerrarumComputer.kt b/src/net/torvald/terrarum/virtualcomputer/computer/BaseTerrarumComputer.kt new file mode 100644 index 000000000..e27efc7fa --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/computer/BaseTerrarumComputer.kt @@ -0,0 +1,155 @@ +package net.torvald.terrarum.virtualcomputer.computer + +import li.cil.repack.org.luaj.vm2.Globals +import li.cil.repack.org.luaj.vm2.LuaError +import li.cil.repack.org.luaj.vm2.LuaValue +import li.cil.repack.org.luaj.vm2.lib.jse.JsePlatform +import net.torvald.terrarum.virtualcomputer.lualib.TermLib +import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal +import net.torvald.terrarum.virtualcomputer.terminal.Terminal +import net.torvald.terrarum.virtualcomputer.terminal.TerminalInputStream +import net.torvald.terrarum.virtualcomputer.terminal.TerminalPrintStream +import org.newdawn.slick.GameContainer +import java.io.* + +/** + * A part that makes "computer fixtures" actually work + * + * @param term : terminal that is connected to the computer fixtures, null if not connected any. + * + * Created by minjaesong on 16-09-10. + */ +class BaseTerrarumComputer(term: Terminal?) { + + val luaJ_globals: Globals = JsePlatform.standardGlobals() + + var termOut: PrintStream? = null + private set + var termErr: PrintStream? = null + private set + var termIn: InputStream? = null + private set + + init { + if (term != null) { + termOut = TerminalPrintStream(term) + termErr = TerminalPrintStream(term) + termIn = TerminalInputStream(term) + + luaJ_globals.STDOUT = termOut + luaJ_globals.STDERR = termErr + luaJ_globals.STDIN = termIn + + loadTermLib(term) + } + + // ROM BASIC + val inputStream = javaClass.getResourceAsStream("/net/torvald/terrarum/virtualcomputer/assets/lua/ROMBASIC.lua") + runCommand(InputStreamReader(inputStream), "rombasic") + } + + var threadTimer = 0 + val threadMaxTime = 2000 + + fun update(gc: GameContainer, delta: Int) { + if (currentExecutionThread.state == Thread.State.TERMINATED) + unsetThreadRun() + + // time the execution time of the thread + if (threadRun) { + threadTimer += delta + + // if too long, halt + if (threadTimer > threadMaxTime) { + //luaJ_globals.STDERR.println("Interrupted: Too long without yielding.") + //currentExecutionThread.interrupt() + unsetThreadRun() + } + } + } + + var currentExecutionThread = Thread() + var threadRun = false + + fun runCommand(line: String, env: String) { + if (!threadRun) { + currentExecutionThread = Thread(ThreadRunCommand(luaJ_globals, line, env)) + currentExecutionThread.start() + threadRun = true + } + } + + fun runCommand(reader: Reader, filename: String) { + if (!threadRun) { + currentExecutionThread = Thread(ThreadRunCommand(luaJ_globals, reader, filename)) + currentExecutionThread.start() + threadRun = true + } + } + + private fun unsetThreadRun() { + threadRun = false + threadTimer = 0 + } + + class ThreadRunCommand : Runnable { + + val mode: Int + val arg1: Any + val arg2: String + val lua: Globals + + constructor(luaInstance: Globals, line: String, env: String) { + mode = 0 + arg1 = line + arg2 = env + lua = luaInstance + } + + constructor(luaInstance: Globals, reader: Reader, filename: String) { + mode = 1 + arg1 = reader + arg2 = filename + lua = luaInstance + } + + override fun run() { + try { + val chunk: LuaValue + if (mode == 0) + chunk = lua.load(arg1 as String, arg2) + else if (mode == 1) + chunk = lua.load(arg1 as Reader, arg2) + else + throw IllegalArgumentException("Unsupported mode: $mode") + + chunk.call() + } + catch (e: LuaError) { + lua.STDERR.println("${SimpleTextTerminal.ASCII_DC2}${e.message}${SimpleTextTerminal.ASCII_DC4}") + if (DEBUGTHRE) e.printStackTrace(System.err) + } + + lua.load("_COMPUTER.prompt()").call() + } + + val DEBUGTHRE = true + } + + ///////////////////////// + // MANUAU LIBRARY LOAD // + ///////////////////////// + private fun loadTermLib(term: Terminal) { + luaJ_globals["term"] = LuaValue.tableOf() + luaJ_globals["term"]["test"] = TermLib.Test(term) + luaJ_globals["term"]["setCursorPos"] = TermLib.MoveCursor(term) + luaJ_globals["term"]["setcursorpos"] = TermLib.MoveCursor(term) + luaJ_globals["term"]["gotoxy"] = TermLib.MoveCursor(term) // pascal-style alias + luaJ_globals["term"]["getCursorPos"] = TermLib.GetCursorPos(term) + luaJ_globals["term"]["getcursorpos"] = TermLib.GetCursorPos(term) + luaJ_globals["term"]["setCursorBlink"] = TermLib.SetCursorBlink(term) + luaJ_globals["term"]["setcursorblink"] = TermLib.SetCursorBlink(term) + luaJ_globals["term"]["getSize"] = TermLib.GetSize(term) + luaJ_globals["term"]["getsize"] = TermLib.GetSize(term) + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/lualib/TermLib.kt b/src/net/torvald/terrarum/virtualcomputer/lualib/TermLib.kt new file mode 100644 index 000000000..93fc41a4a --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/lualib/TermLib.kt @@ -0,0 +1,68 @@ +package net.torvald.terrarum.virtualcomputer.lualib + +import li.cil.repack.org.luaj.vm2.* +import li.cil.repack.org.luaj.vm2.lib.* +import net.torvald.terrarum.virtualcomputer.terminal.Terminal + +/** + * APIs must have some extent of compatibility with ComputerCraft by dan200 + * + * Created by minjaesong on 16-09-12. + */ +internal class TermLib(val vt: Terminal) : ZeroArgFunction() { + var INSTANCE: TermLib? = null + + init { + if (INSTANCE == null) INSTANCE = this + } + + override fun call(): LuaValue { + throw UnsupportedOperationException("""Invalid usage! +usage: + luaJ_globals["term"] = LuaValue.tableOf() + luaJ_globals["term"]["test"] = TermLib.Test(term) + ... +""") + } + + class Test(val term: Terminal) : ZeroArgFunction() { + override fun call(): LuaValue { + return LuaDouble.valueOf("TermTest") + } + } + + class MoveCursor(val term: Terminal) : TwoArgFunction() { + override fun call(x: LuaValue, y: LuaValue): LuaValue { + term.setCursor(x.checkint(), y.checkint()) + return LuaValue.NONE + } + } + + class GetCursorPos(val term: Terminal) : VarArgFunction() { + override fun invoke(args: Varargs?): Varargs { + val ret = arrayOf(LuaValue.valueOf(term.cursorX), LuaValue.valueOf(term.cursorY)) + return LuaValue.varargsOf(ret) + } + } + + class SetCursorBlink(val term: Terminal) : OneArgFunction() { + override fun call(p0: LuaValue): LuaValue { + term.cursorBlink = p0.toboolean() + return LuaValue.NONE + } + } + + class GetSize(val term: Terminal) : VarArgFunction() { + override fun invoke(args: Varargs?): Varargs { + val ret = arrayOf(LuaValue.valueOf(term.width), LuaValue.valueOf(term.height)) + return LuaValue.varargsOf(ret) + } + } + + class IsColor(val term: Terminal) : ZeroArgFunction() { + override fun call(): LuaValue { + throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. + } + } + +} diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/ColouredTextTerminal.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/ColouredTextTerminal.kt new file mode 100644 index 000000000..a73c487ec --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/ColouredTextTerminal.kt @@ -0,0 +1,51 @@ +package net.torvald.terrarum.virtualcomputer.terminal + +import net.torvald.aa.ColouredFastFont +import org.newdawn.slick.Color +import org.newdawn.slick.GameContainer +import org.newdawn.slick.Graphics +import org.newdawn.slick.Image + +/** + * Created by minjaesong on 16-09-12. + */ +class ColouredTextTerminal(override val width: Int, override val height: Int +) : SimpleTextTerminal(Color.white, width, height) { + override val colours = arrayOf( + Color(0x00, 0x00, 0x00), // black + Color(0xff, 0xff, 0xff), // white + Color(0x55, 0x55, 0x55), // dim grey + Color(0xaa, 0xaa, 0xaa), // light grey + + Color(0xff, 0xff, 0x00), // yellow + Color(0xff, 0x66, 0x00), // orange + Color(0xdd, 0x00, 0x00), // red + Color(0xff, 0x00, 0x99), // magenta + + Color(0x33, 0x00, 0x99), // purple + Color(0x00, 0x00, 0xcc), // blue + Color(0x00, 0x99, 0xff), // cyan + Color(0x66, 0xff, 0x33), // lime + + Color(0x00, 0xaa, 0x00), // green + Color(0x00, 0x66, 0x00), // dark green + Color(0x66, 0x33, 0x00), // brown + Color(0x99, 0x66, 0x33) // tan + ) // THESE ARE THE STANDARD + + override val coloursCount = colours.size + + override val backDefault = 0 + override val foreDefault = 3 + + override var backColour = backDefault + override var foreColour = foreDefault + + override val fontRef = "./assets/graphics/fonts/CGA.png" + override val fontImg = Image(fontRef) + override val fontW = fontImg.width / 16 + override val fontH = fontImg.height / 16 + override val font = ColouredFastFont(this, fontRef, fontW, fontH) + + override val colourScreen = Color.black +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputers/terminal/LuaConsole.java b/src/net/torvald/terrarum/virtualcomputer/terminal/LuaConsole.java similarity index 99% rename from src/net/torvald/terrarum/virtualcomputers/terminal/LuaConsole.java rename to src/net/torvald/terrarum/virtualcomputer/terminal/LuaConsole.java index c42a0eeb8..5acbbe083 100644 --- a/src/net/torvald/terrarum/virtualcomputers/terminal/LuaConsole.java +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/LuaConsole.java @@ -3,7 +3,7 @@ * See LICENSE.txt for license terms. */ -package net.torvald.terrarum.virtualcomputers.terminal; +package net.torvald.terrarum.virtualcomputer.terminal; import java.io.BufferedReader; import java.io.ByteArrayInputStream; diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/SimpleTextTerminal.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/SimpleTextTerminal.kt new file mode 100644 index 000000000..1c8d24c5a --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/SimpleTextTerminal.kt @@ -0,0 +1,411 @@ +package net.torvald.terrarum.virtualcomputer.terminal + +import net.torvald.aa.AAFrame +import net.torvald.aa.ColouredFastFont +import net.torvald.terrarum.blendNormal +import net.torvald.terrarum.blendMul +import net.torvald.terrarum.blendScreen +import org.lwjgl.BufferUtils +import org.lwjgl.openal.AL +import org.lwjgl.openal.AL10 +import org.lwjgl.openal.AL11 +import org.newdawn.slick.* +import java.nio.ByteBuffer + +/** + * Default text terminal, four text colours (black, grey, lgrey, white). + * + * Created by minjaesong on 16-09-07. + */ +open class SimpleTextTerminal( + val phosphor: Color, override val width: Int, override val height: Int +) : Terminal { + /** + * Terminals must support AT LEAST 4 colours. + * Color index 0 must be default background, index 3 must be default foreground + */ + open protected val colours = arrayOf( + Color(0x00, 0x00, 0x00), // black + Color(0xff, 0xff, 0xff), // white + Color(0x55, 0x55, 0x55), // dim grey + Color(0xaa, 0xaa, 0xaa) // light grey + ) // THESE ARE THE STANDARD + + override val coloursCount = colours.size + + open protected val backDefault = 0 // STANDARD + open protected val foreDefault = 3 // STANDARD + + override var backColour = backDefault + override var foreColour = foreDefault + private val colourKey: Int + get() = backColour.shl(4).plus(foreColour).and(0xFF) + + override var cursorX = 0 + override var cursorY = 0 + override var cursorBlink = true + + val screenBuffer = AAFrame(width, height) + + open protected val fontRef = "./assets/graphics/fonts/MDA.png" + open protected val fontImg = Image(fontRef) + open protected val fontW = fontImg.width / 16 + open protected val fontH = fontImg.height / 16 + open protected val font = ColouredFastFont(this, fontRef, fontW, fontH) + + override val displayW = fontW * width + override val displayH = fontH * height + + + private val TABSIZE = 4 + + private val ASCII_NUL = 0.toChar() + + private var cursorBlinkTimer = 0 + private val cursorBlinkLen = 250 + private var cursorBlinkOn = true + + + + override fun getColor(index: Int): Color = colours[index] + + override fun update(gc: GameContainer, delta: Int) { + cursorBlinkTimer = cursorBlinkTimer.plus(delta) + if (cursorBlinkTimer > cursorBlinkLen) { + cursorBlinkTimer -= cursorBlinkLen + cursorBlinkOn = !cursorBlinkOn + } + + wrap() + + // beep AL-related + if (beepSource != null && AL10.alGetSourcei(beepSource!!, AL10.AL_SOURCE_STATE) != AL10.AL_PLAYING) { + AL10.alDeleteSources(beepSource!!) + AL10.alDeleteBuffers(beepBuffer!!) + beepSource = null + beepBuffer == null + } + } + + private fun wrap() { + // wrap cursor + if (cursorX < 0 && cursorY <= 0) { + setCursor(0, 0) + } + else if (cursorX >= width) { + setCursor(0, cursorY + 1) + } + else if (cursorX < 0) { + setCursor(width - 1, cursorY - 1) + } + // auto scroll up + if (cursorY >= height) { + scroll() + } + } + + open protected val colourScreen = Color(0x191919) + + /** + * pass UIcanvas to the parameter "g" + */ + override fun render(gc: GameContainer, g: Graphics) { + g.font = font + + blendNormal() + + for (y in 0..height - 1) { + for (x in 0..width - 1) { + val ch = screenBuffer.getChar(x, y) + + // background + g.color = getColor(screenBuffer.getBackgroundColour(x, y)) + g.fillRect(fontW * x.toFloat(), fontH * y.toFloat(), fontW.toFloat(), fontH.toFloat()) + + // foreground + if (ch.toInt() != 0 && ch.toInt() != 32) { + g.color = getColor(screenBuffer.getForegroundColour(x, y)) + g.drawString( + Character.toString(ch), + fontW * x.toFloat(), fontH * y.toFloat()) + } + } + } + + + // cursor + g.color = getColor(foreDefault) + if (cursorBlinkOn && cursorBlink) + g.fillRect( + fontW * cursorX.toFloat(), + fontH * cursorY.toFloat(), + fontW.toFloat(), + fontH.toFloat() + ) + + + // not-pure-black screen + g.color = colourScreen + blendScreen() + g.fillRect(0f, 0f, displayW.toFloat(), displayH.toFloat()) + + + // colour overlay + g.color = phosphor + blendMul() + g.fillRect(0f, 0f, displayW.toFloat(), displayH.toFloat()) + + + blendNormal() + + } + + override fun setCursor(x: Int, y: Int) { + cursorX = x + cursorY = y + } + + /** Emits a bufferChar. Does not move cursor + * It is also not affected by the control sequences; just print them out as symbol */ + override fun emitChar(bufferChar: Int) { + screenBuffer.drawBuffer(cursorX, cursorY, bufferChar.toChar()) + } + + /** Emits a char. Does not move cursor + * It is also not affected by the control sequences; just print them out as symbol */ + override fun emitChar(c: Char) { + screenBuffer.drawBuffer(cursorX, cursorY, c.toInt().and(0xFF).toChar(), colourKey) + } + + val asciiControlInUse = charArrayOf( + ASCII_NUL, + ASCII_BEL, + ASCII_BS, + ASCII_TAB, + ASCII_LF, + ASCII_FF, + ASCII_CR, + ASCII_DEL, + ASCII_DC1, + ASCII_DC2, + ASCII_DC3, + ASCII_DC4 + ) + + /** Prints a char and move cursor accordingly. */ + override fun printChar(c: Char) { + wrap() + if (c >= ' ' && c.toInt() != 127) { + emitChar(c) + cursorX += 1 + } + else { + when (c) { + ASCII_BEL -> beep() + ASCII_BS -> { cursorX -= 1; wrap() } + ASCII_TAB -> { cursorX = (cursorX).div(TABSIZE).times(TABSIZE) + TABSIZE } + ASCII_LF -> { cursorX = 0; cursorY += 1; wrap() } + ASCII_FF -> clear() + ASCII_CR -> { cursorX = 0 } + ASCII_DEL -> { cursorX -= 1; wrap(); emitChar(colourKey.shl(8)) } + ASCII_DC1, ASCII_DC2, ASCII_DC3, ASCII_DC4 -> { foreColour = c - ASCII_DC1 } + } + } + } + + /** Emits a string and move cursor accordingly. */ + override fun printString(s: String, x: Int, y: Int) { + setCursor(x, y) + emitString(s) + val absCursorPos = cursorX + cursorY * width + s.length + setCursor(absCursorPos % width, absCursorPos / width) + + printChar(ASCII_LF) + } + + /** Emits a string. Does not move cursor */ + override fun emitString(s: String) { + val x = cursorX + val y = cursorY + + for (i in 0..s.length - 1) + printChar(s[i]) + + setCursor(x, y) + } + + override fun clear() { + screenBuffer.clear(backColour) + cursorX = 0 + cursorY = 0 + } + + override fun clearLine() { + for (i in 0..width - 1) + screenBuffer.drawBuffer(i, cursorY, 0.toChar(), colourKey) + } + + override fun scroll(amount: Int) { + val offset = amount * width + for (i in offset..screenBuffer.sizeof.ushr(1) - 1) { + screenBuffer.frameBuffer[i - offset] = screenBuffer.frameBuffer[i] + } + for (c in 1..amount) { + cursorY -= 1 + clearLine() + } + } + + override fun setColour(back: Int, fore: Int) { + backColour = back + foreColour = fore + } + + override fun resetColour() { + backColour = backDefault + foreColour = foreDefault + } + + private val sampleRate = 22050 + private val maxDuration = 10000 + private val beepSamples = maxDuration.div(1000).times(sampleRate) + private var beepSource: Int? = null + private var beepBuffer: Int? = null + + override fun beep(freq: Float, duration: Int) { + throw NotImplementedError("errenous OpenAL behaviour; *grunts*") + + val audioData = BufferUtils.createByteBuffer(duration.times(sampleRate).div(1000)) + + var chop = false + val realDuration = Math.min(maxDuration, duration) + + for (i in 0..realDuration - 1) { + if (i.mod(freq) < 1.0) chop = !chop + audioData.put(if (chop) 0xFF.toByte() else 0x00.toByte()) + } + + audioData.rewind() + + + + // Clear error stack. + AL10.alGetError() + + beepBuffer = AL10.alGenBuffers() + checkALError() + + try { + AL10.alBufferData(beepBuffer!!, AL10.AL_FORMAT_MONO8, audioData, sampleRate) + checkALError() + + beepSource = AL10.alGenSources() + checkALError() + + try { + AL10.alSourceQueueBuffers(beepSource!!, beepBuffer!!) + checkALError() + + AL10.alSource3f(beepSource!!, AL10.AL_POSITION, 0f, 0f, 1f) + AL10.alSourcef(beepSource!!, AL10.AL_REFERENCE_DISTANCE, 1f) + AL10.alSourcef(beepSource!!, AL10.AL_MAX_DISTANCE, 1f) + AL10.alSourcef(beepSource!!, AL10.AL_GAIN, 0.3f) + checkALError() + + AL10.alSourcePlay(beepSource!!) + checkALError() + + } + catch (e: ALException) { + AL10.alDeleteSources(beepSource!!) + } + } + catch (e: ALException) { + if (beepSource != null) AL10.alDeleteSources(beepSource!!) + } + + + /*def checkFinished = AL10.alGetSourcei(source, AL10.AL_SOURCE_STATE) != AL10.AL_PLAYING && { + AL10.alDeleteSources(source) + AL10.alDeleteBuffers(buffer) + true + }*/ + } + + // Custom implementation of Util.checkALError() that uses our custom exception. + private fun checkALError() { + val errorCode = AL10.alGetError() + if (errorCode != AL10.AL_NO_ERROR) { + throw ALException(errorCode) + } + } + + /** for "beep code" on modern BIOS. Pattern: - . */ + override fun beep(pattern: String) { + throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override var lastInputByte: Int = -1 + var sb: StringBuilder = StringBuilder() + private var inputOpen = false + /** + * Technically, this is different from Java's InputStream + */ + fun openInput() { + inputOpen = true + if (DEBUG) println("[SimpleTextTerminal] openInput()") + } + + fun closeInput(): String { + inputOpen = false + val ret = sb.toString() + sb = StringBuilder() + + if (DEBUG) println("[SimpleTextTerminal] closeInput(), $ret") + return ret + } + + override fun keyPressed(key: Int, c: Char) { + lastInputByte = c.toInt() + + if (inputOpen) { + if (c == ASCII_CR) + printChar(ASCII_LF) + else + printChar(c) + if (!asciiControlInUse.contains(c)) sb.append(c) + else if (c == ASCII_DEL && sb.length > 0) sb.deleteCharAt(sb.length - 1) + } + } + + override fun getKeyPress(): Int? = lastInputByte + + private fun isOOB(x: Int, y: Int) = + (x < 0 || y < 0 || x >= width || y >= height) + + companion object { + val AMBER = Color(255, 183, 0) // P3, 602 nm + val IBM_GREEN = Color(74, 255, 0) // P39, 525 nm + val WHITE = Color(228, 234, 255) // P4, 7 500 K + val ELECTRIC_BLUE = Color(0, 239, 255) // imaginary, 486 nm + val RED = Color(250, 0, 0) // <= 645 nm + + val ASCII_BEL = 7.toChar() // *BEEP!* + val ASCII_BS = 8.toChar() // x = x - 1 + val ASCII_TAB = 9.toChar() // move cursor to next (TABSIZE * yy) pos (5 -> 8, 3- > 4, 4 -> 8) + val ASCII_LF = 10.toChar() // new line + val ASCII_FF = 12.toChar() // new page + val ASCII_CR = 13.toChar() // x <- 0 + val ASCII_DEL = 127.toChar() // backspace and delete char + val ASCII_DC1 = 17.toChar() // foreground colour 0 + val ASCII_DC2 = 18.toChar() // foreground colour 1 + val ASCII_DC3 = 19.toChar() // foreground colour 2 + val ASCII_DC4 = 20.toChar() // foreground colour 3 + } + + private val DEBUG = true +} + +class ALException(errorCode: Int) : Exception("ALerror: $errorCode") { + +} diff --git a/src/net/torvald/terrarum/virtualcomputers/terminal/Terminal.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/Terminal.kt similarity index 55% rename from src/net/torvald/terrarum/virtualcomputers/terminal/Terminal.kt rename to src/net/torvald/terrarum/virtualcomputer/terminal/Terminal.kt index 11c995e59..85c58509d 100644 --- a/src/net/torvald/terrarum/virtualcomputers/terminal/Terminal.kt +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/Terminal.kt @@ -1,4 +1,4 @@ -package net.torvald.terrarum.virtualcomputers.terminal +package net.torvald.terrarum.virtualcomputer.terminal import org.newdawn.slick.Color import org.newdawn.slick.GameContainer @@ -24,22 +24,24 @@ interface Terminal { var backColour: Int var foreColour: Int + var lastInputByte: Int + // to be used in UI val displayW: Int val displayH: Int - // more technical - var isInputStreamOpen: Boolean - fun getColor(index: Int): Color fun update(gc: GameContainer, delta: Int) fun render(gc: GameContainer, g: Graphics) + fun keyPressed(key: Int, c: Char) // API calls fun setCursor(x: Int, y: Int) - /** Emits a bufferChar. Does not move cursor */ + /** Emits a bufferChar. Does not move cursor + * It is also not affected by the control sequences; just print them out as symbol */ fun emitChar(bufferChar: Int) - /** Emits a char. Does not move cursor */ + /** Emits a char. Does not move cursor + * It is also not affected by the control sequences; just print them out as symbol */ fun emitChar(c: Char) /** Prints a char and move cursor accordingly. */ fun printChar(c: Char) @@ -52,5 +54,24 @@ interface Terminal { fun scroll(amount: Int = 1) fun setColour(back: Int, fore: Int) fun resetColour() - fun beep(freq: Int = 1000, duration: Int = 200) + /** + * @param freg: Frequency (float) + * @param duration: milliseconds + */ + fun beep(freq: Float = 1000f, duration: Int = 200) + /** for "beep code" on modern BIOS. Pattern: - . */ + fun beep(pattern: String) + /** Requires keyPressed() event to be processed. + * + * null indicates the input stream is waiting for an input + * + * implementation: + * + * private var lastInputByte: Int? = null + * override fun keyPressed(key: Int, c: Char) { + lastInputByte = c.toInt() + lastInputByte = null + } + */ + fun getKeyPress(): Int? } \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalInputStream.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalInputStream.kt new file mode 100644 index 000000000..90a999192 --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalInputStream.kt @@ -0,0 +1,15 @@ +package net.torvald.terrarum.virtualcomputer.terminal + +import org.lwjgl.input.Keyboard +import java.io.InputStream + +/** + * Created by minjaesong on 16-09-10. + */ +class TerminalInputStream(val term: Terminal) : InputStream() { + override fun read(): Int { + val ret = term.lastInputByte + term.lastInputByte = -1 + return ret + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalLuaConsole.java b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalLuaConsole.java new file mode 100644 index 000000000..b898485e0 --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalLuaConsole.java @@ -0,0 +1,170 @@ +package net.torvald.terrarum.virtualcomputer.terminal; + +import li.cil.repack.com.naef.jnlua.LuaException; +import li.cil.repack.com.naef.jnlua.LuaRuntimeException; +import li.cil.repack.com.naef.jnlua.LuaState; + +import java.io.*; + +/** + * Created by minjaesong on 16-09-10. + */ +public class TerminalLuaConsole { + // -- Static + private static final String[] EMPTY_ARGS = new String[0]; + + /** + * Main routine. + * + * @param args + * the command line arguments + */ + public static void main(String[] args) { + LuaConsole luaConsole = new LuaConsole(args); + luaConsole.run(); + System.exit(0); + } + + private PrintStream out; + + // -- State + private LuaState luaState; + + // -- Construction + /** + * Creates a new instance. + */ + public TerminalLuaConsole(Terminal term) { + this(EMPTY_ARGS, term); + } + + /** + * Creates a new instance with the specified command line arguments. The + * arguments are passed to Lua as the argv global variable. + * + * @param args + */ + public TerminalLuaConsole(String[] args, Terminal term) { + out = new TerminalPrintStream(term); + + luaState = new LuaState(); + + // Process arguments + luaState.newTable(args.length, 0); + for (int i = 0; i < args.length; i++) { + luaState.pushString(args[i]); + luaState.rawSet(-2, i + 1); + } + luaState.setGlobal("argv"); + + // Open standard libraries + luaState.openLibs(); + + // Set buffer mode + luaState.load("io.stdout:setvbuf(\"no\")", "=consoleInitStdout"); + luaState.call(0, 0); + luaState.load("io.stderr:setvbuf(\"no\")", "=consoleInitStderr"); + luaState.call(0, 0); + } + + // -- Properties + /** + * Returns the Lua state of this console. + * + * @return the Lua state + */ + public LuaState getLuaState() { + return luaState; + } + + // -- Operations + /** + * Runs the console. + */ + public void run() { + // Banner + out.println(String.format("JNLua %s Console using Lua %s.", + LuaState.VERSION, LuaState.LUA_VERSION)); + out.print("Type 'go' on an empty line to evaluate a chunk. "); + out.println("Type = to print an expression."); + + // Prepare reader + BufferedReader bufferedReader = new BufferedReader( + new InputStreamReader(System.in)); + try { + // Process chunks + chunk: while (true) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + OutputStreamWriter outWriter = new OutputStreamWriter(out, + "UTF-8"); + boolean firstLine = true; + + // Process lines + while (true) { + String line = bufferedReader.readLine(); + if (line == null) { + break chunk; + } + if (line.equals("go")) { + outWriter.flush(); + InputStream in = new ByteArrayInputStream(out + .toByteArray()); + runChunk(in); + continue chunk; + } + if (firstLine && line.startsWith("=")) { + outWriter.write("return " + line.substring(1)); + outWriter.flush(); + InputStream in = new ByteArrayInputStream(out + .toByteArray()); + runChunk(in); + continue chunk; + } + outWriter.write(line); + outWriter.write('\n'); + firstLine = false; + } + } + } catch (IOException e) { + out.print("IO error: "); + out.print(e.getMessage()); + out.println(); + } + } + + /** + * Runs a chunk of Lua code from an input stream. + */ + protected void runChunk(InputStream in) throws IOException { + try { + long start = System.nanoTime(); + luaState.setTop(0); + luaState.load(in, "=console", "t"); + luaState.call(0, LuaState.MULTRET); + long stop = System.nanoTime(); + for (int i = 1; i <= luaState.getTop(); i++) { + if (i > 1) { + out.print(", "); + } + switch (luaState.type(i)) { + case BOOLEAN: + out.print(Boolean.valueOf(luaState.toBoolean(i))); + break; + case NUMBER: + case STRING: + out.print(luaState.toString(i)); + break; + default: + out.print(luaState.typeName(i)); + } + } + out.print("\t#msec="); + out.print(String.format("%.3f", (stop - start) / 1000000.0)); + out.println(); + } catch (LuaRuntimeException e) { + e.printLuaStackTrace(); + } catch (LuaException e) { + System.err.println(e.getMessage()); + } + } +} diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalPrintStream.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalPrintStream.kt new file mode 100644 index 000000000..67a1fe787 --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalPrintStream.kt @@ -0,0 +1,15 @@ +package net.torvald.terrarum.virtualcomputer.terminal + +import java.io.OutputStream +import java.io.PrintStream + +/** + * Created by minjaesong on 16-09-10. + */ +class TerminalPrintStream(val term: Terminal) : PrintStream(TerminalOutputStream(term)) { + +} + +class TerminalOutputStream(val term: Terminal) : OutputStream() { + override fun write(b: Int) = term.printChar(b.and(0xFF).toChar()) +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/worldobject/ComputerPartsCodex.kt b/src/net/torvald/terrarum/virtualcomputer/worldobject/ComputerPartsCodex.kt new file mode 100644 index 000000000..9d87e5ebd --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/worldobject/ComputerPartsCodex.kt @@ -0,0 +1,55 @@ +package net.torvald.terrarum.virtualcomputer.worldobject + +import java.util.* + +/** + * Created by minjaesong on 16-09-08. + */ +object ComputerPartsCodex { + val rams = HashMap() // itemID, capacity in bytes (0 bytes - 8 GBytes) + val processors = HashMap() // itemID, cycles + val harddisks = HashMap() // itemID, capacity in bytes + val diskettes = HashMap() // itemID, capacity in bytes + val opticaldiscs = HashMap() // itemID, capacity in bytes + + init { + // in kilobytes + rams.put(4864, 128.KiB()) // 64k is not enough for Lua, so we start here. + rams.put(4865, 192.KiB()) + rams.put(4866, 256.KiB()) + rams.put(4867, 320.KiB()) // 320 * 2 = "640k ought to be enough for anybody" --Someone that is NOT Bill Gates + rams.put(4868, 480.KiB()) + rams.put(4869, 512.KiB()) + rams.put(4870, 1024.KiB()) // server ops hate it + rams.put(4871, 2048.KiB()) // wait, we can multiplayer? + + processors.put(4872, 1000) + processors.put(4873, 2000) + processors.put(4874, 4000) + processors.put(4875, 8000) // this is totally OP + + harddisks.put(4876, 1.MB()) + harddisks.put(4877, 2.MB()) + harddisks.put(4878, 5.MB()) + harddisks.put(4879, 10.MB()) + + // Floppy disk: your primitive and only choice of removable storage + diskettes.put(4880, 360.kB()) // single-sided + diskettes.put(4881, 720.kB()) // double-sided + diskettes.put(4882, 1440.kB()) // 3.5" HD + diskettes.put(4883, 2880.kB()) // 3.5" ED + + // CD-Rs + opticaldiscs.put(4884, 8.MB()) // arbitrary size + } + + fun getRamSize(itemIndex: Int): Int = rams[itemIndex] ?: 0 + fun getProcessorCycles(itemIndex: Int): Int = processors[itemIndex] ?: 0 + fun getHDDSize(itemIndex: Int): Int = harddisks[itemIndex] ?: 0 + fun getFDDSize(itemIndex: Int): Int = diskettes[itemIndex] ?: 0 + fun getODDSize(itemIndex: Int): Int = opticaldiscs[itemIndex] ?: 0 + + private fun Int.MB() = this * 1000000 // 1 MB == 1 000 000 bytes, bitches! + private fun Int.kB() = this * 1000 + private fun Int.KiB() = this.shr(10) +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesBasicTerminal.kt b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixturesBasicTerminal.kt similarity index 50% rename from src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesBasicTerminal.kt rename to src/net/torvald/terrarum/virtualcomputer/worldobject/FixturesBasicTerminal.kt index 5a88f0cd3..741b1ac0e 100644 --- a/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesBasicTerminal.kt +++ b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixturesBasicTerminal.kt @@ -1,10 +1,10 @@ -package net.torvald.terrarum.virtualcomputers.worldobject +package net.torvald.terrarum.virtualcomputer.worldobject import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.FixturesBase -import net.torvald.terrarum.virtualcomputers.terminal.SimpleTextTerminal -import net.torvald.terrarum.virtualcomputers.terminal.Terminal -import net.torvald.terrarum.virtualcomputers.worldobject.ui.UITextTerminal +import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal +import net.torvald.terrarum.virtualcomputer.terminal.Terminal +import net.torvald.terrarum.virtualcomputer.worldobject.ui.UITextTerminal import org.newdawn.slick.Color import java.util.* @@ -13,8 +13,8 @@ import java.util.* */ class FixturesBasicTerminal(phosphor: Color) : FixturesBase() { - val terminal: Terminal = SimpleTextTerminal(phosphor, 80, 25) - val ui = UITextTerminal(terminal) + val vt: Terminal = SimpleTextTerminal(phosphor, 80, 25) + val ui = UITextTerminal(vt) init { collisionFlag = COLLISION_PLATFORM diff --git a/src/net/torvald/terrarum/virtualcomputer/worldobject/FixturesComputerBase.kt b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixturesComputerBase.kt new file mode 100644 index 000000000..771acc9e4 --- /dev/null +++ b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixturesComputerBase.kt @@ -0,0 +1,95 @@ +package net.torvald.terrarum.virtualcomputer.worldobject + +import net.torvald.terrarum.gameactors.FixturesBase +import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal +import net.torvald.terrarum.virtualcomputer.terminal.Terminal +import org.newdawn.slick.GameContainer +import java.io.PrintStream +import java.security.SecureRandom +import java.util.* + +/** + * Created by minjaesong on 16-09-08. + */ +open class FixturesComputerBase() : FixturesBase() { + + val processorCycle: Int // number of Lua statement to process per tick (1/100 s) + get() = ComputerPartsCodex.getProcessorCycles(actorValue.getAsInt("processor") ?: -1) + val memSize: Int // max: 8 GB + get() { + var size = 0 + for (i in 0..3) + size += ComputerPartsCodex.getRamSize(actorValue.getAsInt("memSlot$i") ?: -1) + + return size + } + + /** Connected terminal */ + var terminal: FixturesBasicTerminal? = null + + var computerInside: BaseTerrarumComputer? = null + + init { + actorValue["memslot0"] = -1 // -1 indicates mem slot is empty + actorValue["memslot1"] = -1 // put index of item here + actorValue["memslot2"] = -1 // ditto. + actorValue["memslot3"] = -1 // do. + + actorValue["processor"] = -1 // do. + + // as in "dev/hda"; refers hard disk drive (and no partitioning) + actorValue["hda"] = "none" // 'UUID rendered as String' or "none" + actorValue["hdb"] = "none" + actorValue["hdc"] = "none" + actorValue["hdd"] = "none" + // as in "dev/fd1"; refers floppy disk drive + actorValue["fd1"] = "none" + actorValue["fd2"] = "none" + actorValue["fd3"] = "none" + actorValue["fd4"] = "none" + // SCSI connected optical drive + actorValue["sda"] = "none" + + // UUID of this device + actorValue["uuid"] = UUID.randomUUID().toString() + + collisionFlag = COLLISION_PLATFORM + + + } + + //////////////////////////////////// + // get the computer actually work // + //////////////////////////////////// + + fun attachTerminal(uuid: String) { + val fetchedTerminal = getTerminalByUUID(uuid) + computerInside = BaseTerrarumComputer(fetchedTerminal) + } + + fun detatchTerminal() { + terminal = null + } + + private fun getTerminalByUUID(uuid: String): Terminal? { + TODO("get terminal by UUID. Return null if not found") + } + + + + //////////////// + // game codes // + //////////////// + + override fun update(gc: GameContainer, delta: Int) { + super.update(gc, delta) + if (terminal != null) terminal!!.update(gc, delta) + } + + fun keyPressed(key: Int, c: Char) { + if (terminal != null) { + terminal!!.vt.keyPressed(key, c) + } + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputers/worldobject/ui/UITextTerminal.kt b/src/net/torvald/terrarum/virtualcomputer/worldobject/ui/UITextTerminal.kt similarity index 95% rename from src/net/torvald/terrarum/virtualcomputers/worldobject/ui/UITextTerminal.kt rename to src/net/torvald/terrarum/virtualcomputer/worldobject/ui/UITextTerminal.kt index 381e871f2..ef3823090 100644 --- a/src/net/torvald/terrarum/virtualcomputers/worldobject/ui/UITextTerminal.kt +++ b/src/net/torvald/terrarum/virtualcomputer/worldobject/ui/UITextTerminal.kt @@ -1,7 +1,7 @@ -package net.torvald.terrarum.virtualcomputers.worldobject.ui +package net.torvald.terrarum.virtualcomputer.worldobject.ui import net.torvald.terrarum.ui.* -import net.torvald.terrarum.virtualcomputers.terminal.Terminal +import net.torvald.terrarum.virtualcomputer.terminal.Terminal import org.newdawn.slick.GameContainer import org.newdawn.slick.Graphics import org.newdawn.slick.Image diff --git a/src/net/torvald/terrarum/virtualcomputers/API.kt b/src/net/torvald/terrarum/virtualcomputers/API.kt deleted file mode 100644 index f1976bd45..000000000 --- a/src/net/torvald/terrarum/virtualcomputers/API.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.torvald.terrarum.virtualcomputers - -/** - * Reference: https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/java/li/cil/oc/api/API.java - * - * Created by minjaesong on 16-09-07. - */ -object API { - // val filesystem = Filesystem() -} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputers/terminal/SimpleTextTerminal.kt b/src/net/torvald/terrarum/virtualcomputers/terminal/SimpleTextTerminal.kt deleted file mode 100644 index 7c001f380..000000000 --- a/src/net/torvald/terrarum/virtualcomputers/terminal/SimpleTextTerminal.kt +++ /dev/null @@ -1,259 +0,0 @@ -package net.torvald.terrarum.virtualcomputers.terminal - -import net.torvald.aa.AAFrame -import net.torvald.aa.ColouredFastFont -import net.torvald.terrarum.blendNormal -import net.torvald.terrarum.blendMul -import org.newdawn.slick.* - -/** - * Default text terminal, four text colours (black, grey, lgrey, white). - * - * Created by minjaesong on 16-09-07. - */ -open class SimpleTextTerminal( - val phosphor: Color, override val width: Int, override val height: Int -) : Terminal { - override val coloursCount = 4 - - private val colors = arrayOf( - Color(0x19, 0x19, 0x19), - Color(0xff, 0xff, 0xff), - Color(0x55, 0x55, 0x55), - Color(0xaa, 0xaa, 0xaa) - ) - - private val backDefault = 0 - private val foreDefault = colors.size - 1 - - override var backColour = backDefault - override var foreColour = foreDefault - private val colourKey: Int - get() = backColour.shl(4).plus(foreColour).and(0xFF) - - override var cursorX = 0 - override var cursorY = 0 - override var cursorBlink = true - - val screenBuffer = AAFrame(width, height) - - private val fontRef = "./assets/graphics/fonts/MDA.png" - private val fontImg = Image(fontRef) - private val fontW = fontImg.width / 16 - private val fontH = fontImg.height / 16 - private val font = ColouredFastFont(this, fontRef, fontW, fontH) - - override var isInputStreamOpen: Boolean - get() = throw UnsupportedOperationException() - set(value) { - } - - override val displayW = fontW * width - override val displayH = fontH * height - - private val TABSIZE = 4 - - private val ASCII_NUL = 0.toChar() - - private val ASCII_BEL = 7.toChar() // *BEEP!* - private val ASCII_BS = 8.toChar() // x = x - 1 - private val ASCII_TAB = 9.toChar() // move cursor to next (TABSIZE * yy) pos (5 -> 8, 3- > 4, 4 -> 8) - private val ASCII_LF = 10.toChar() // new line - private val ASCII_FF = 12.toChar() // new page - private val ASCII_CR = 13.toChar() // x <- 0 - private val ASCII_DEL = 127.toChar() // backspace and delete char - - private var cursorBlinkTimer = 0 - private val cursorBlinkLen = 250 - private var cursorBlinkOn = true - - override fun getColor(index: Int): Color = colors[index] - - override fun update(gc: GameContainer, delta: Int) { - cursorBlinkTimer = cursorBlinkTimer.plus(delta) - if (cursorBlinkTimer > cursorBlinkLen) { - cursorBlinkTimer -= cursorBlinkLen - cursorBlinkOn = !cursorBlinkOn - } - - wrap() - } - - private fun wrap() { - // wrap cursor - if (cursorX < 0 && cursorY <= 0) { - setCursor(0, 0) - } - else if (cursorX >= width) { - setCursor(0, cursorY + 1) - } - else if (cursorX < 0) { - setCursor(width - 1, cursorY - 1) - } - // auto scroll up - if (cursorY >= height) { - scroll() - } - } - - /** - * pass UIcanvas to the parameter "g" - */ - override fun render(gc: GameContainer, g: Graphics) { - g.font = font - - blendNormal() - - for (y in 0..height - 1) { - for (x in 0..width - 1) { - val ch = screenBuffer.getChar(x, y) - - // background - g.color = getColor(screenBuffer.getBackgroundColour(x, y)) - g.fillRect(fontW * x.toFloat(), fontH * y.toFloat(), fontW.toFloat(), fontH.toFloat()) - - // foreground - if (ch.toInt() != 0 && ch.toInt() != 32) { - g.color = getColor(screenBuffer.getForegroundColour(x, y)) - g.drawString( - Character.toString(ch), - fontW * x.toFloat(), fontH * y.toFloat()) - } - } - } - - - // cursor - g.color = getColor(foreColour) - if (cursorBlinkOn && cursorBlink) - g.fillRect( - fontW * cursorX.toFloat(), - fontH * cursorY.toFloat(), - fontW.toFloat(), - fontH.toFloat() - ) - - - - // colour overlay - g.color = phosphor - blendMul() - g.fillRect(0f, 0f, displayW.toFloat(), displayH.toFloat()) - - - blendNormal() - - } - - override fun setCursor(x: Int, y: Int) { - cursorX = x - cursorY = y - } - - /** Emits a bufferChar. Does not move cursor */ - override fun emitChar(bufferChar: Int) { - screenBuffer.drawBuffer(cursorX, cursorY, bufferChar.toChar()) - } - - /** Emits a char. Does not move cursor */ - override fun emitChar(c: Char) { - screenBuffer.drawBuffer(cursorX, cursorY, c.toInt().and(0xFF).toChar(), colourKey) - } - - val asciiControlInUse = charArrayOf( - ASCII_BEL, - ASCII_BS, - ASCII_TAB, - ASCII_LF, - ASCII_FF, - ASCII_CR, - ASCII_DEL - ) - - /** Prints a char and move cursor accordingly. */ - override fun printChar(c: Char) { - wrap() - if (c >= ' ' && c.toInt() != 127) { - emitChar(c) - cursorX += 1 - } - else { - when (c) { - ASCII_BEL -> beep() - ASCII_BS -> { cursorX -= 1; wrap() } - ASCII_TAB -> { cursorX = (cursorX).div(TABSIZE).times(TABSIZE) + TABSIZE } - ASCII_LF -> { cursorX = 0; cursorY += 1; wrap() } - ASCII_FF -> clear() - ASCII_CR -> { cursorX = 0 } - ASCII_DEL -> { cursorX -= 1; wrap(); emitChar(colourKey.shl(8)) } - } - } - } - - /** Emits a string and move cursor accordingly. */ - override fun printString(s: String, x: Int, y: Int) { - setCursor(x, y) - emitString(s) - val absCursorPos = cursorX + cursorY * width + s.length - setCursor(x % width, y / width) - } - - /** Emits a string. Does not move cursor */ - override fun emitString(s: String) { - val x = cursorX - val y = cursorY - - for (i in 0..s.length - 1) - printChar(s[i]) - - setCursor(x, y) - } - - override fun clear() { - screenBuffer.clear(backColour) - cursorX = 0 - cursorY = 0 - } - - override fun clearLine() { - for (i in 0..width - 1) - screenBuffer.drawBuffer(i, cursorY, 0.toChar(), colourKey) - } - - override fun scroll(amount: Int) { - val offset = amount * width - for (i in offset..screenBuffer.sizeof.ushr(1) - 1) { - screenBuffer.frameBuffer[i - offset] = screenBuffer.frameBuffer[i] - } - for (c in 1..amount) { - cursorY -= 1 - clearLine() - } - } - - override fun setColour(back: Int, fore: Int) { - backColour = back - foreColour = fore - } - - override fun resetColour() { - backColour = backDefault - foreColour = foreDefault - } - - override fun beep(freq: Int, duration: Int) { - throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - private fun isOOB(x: Int, y: Int) = - (x < 0 || y < 0 || x >= width || y >= height) - - companion object { - val AMBER = Color(255, 183, 0) // P3, 602 nm - val IBM_GREEN = Color(74, 255, 0) // P39, 525 nm - val WHITE = Color(228, 234, 255) // P4, 7 500 K - val ELECTRIC_BLUE = Color(0, 239, 255) // imaginary, 486 nm - val RED = Color(250, 0, 0) // <= 645 nm - } - -} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputers/worldobject/ComputerPartsCodex.kt b/src/net/torvald/terrarum/virtualcomputers/worldobject/ComputerPartsCodex.kt deleted file mode 100644 index be02165ea..000000000 --- a/src/net/torvald/terrarum/virtualcomputers/worldobject/ComputerPartsCodex.kt +++ /dev/null @@ -1,29 +0,0 @@ -package net.torvald.terrarum.virtualcomputers.worldobject - -import java.util.* - -/** - * Created by minjaesong on 16-09-08. - */ -object ComputerPartsCodex { - val rams = HashMap() // itemID, capacity in bytes (0 bytes - 8 GBytes) - val processors = HashMap() // itemID, cycles - - init { - rams.put(4864, 128.shr(20)) - rams.put(4865, 192.shr(20)) - rams.put(4866, 256.shr(20)) - rams.put(4867, 320.shr(20)) - rams.put(4868, 480.shr(20)) - rams.put(4869, 512.shr(20)) - // two more? - - processors.put(4872, 1000) - processors.put(4873, 2000) - processors.put(4874, 4000) - processors.put(4875, 8000) - } - - fun getRamSize(itemIndex: Int): Int = rams[itemIndex] ?: 0 - fun getProcessorCycles(itemIndex: Int): Int = processors[itemIndex] ?: 0 -} \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesComputerBase.kt b/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesComputerBase.kt deleted file mode 100644 index 7d30d7da7..000000000 --- a/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesComputerBase.kt +++ /dev/null @@ -1,51 +0,0 @@ -package net.torvald.terrarum.virtualcomputers.worldobject - -import net.torvald.terrarum.gameactors.FixturesBase -import java.security.SecureRandom -import java.util.* - -/** - * Created by minjaesong on 16-09-08. - */ -abstract class FixturesComputerBase() : FixturesBase() { - - init { - actorValue["memslot0"] = -1 // -1 indicates mem slot is empty - actorValue["memslot1"] = -1 // put index of item here - actorValue["memslot2"] = -1 // ditto. - actorValue["memslot3"] = -1 // do. - - actorValue["processor"] = -1 // do. - - actorValue["sda0"] = "none" // 'UUID rendered as String' or "none" - actorValue["sda1"] = "none" - actorValue["sda2"] = "none" - actorValue["sda3"] = "none" - actorValue["fd1"] = "none" - actorValue["fd2"] = "none" - actorValue["fd3"] = "none" - actorValue["fd4"] = "none" - - actorValue["uuid"] = UUID.randomUUID().toString() - - collisionFlag = COLLISION_PLATFORM - } - - val processorCycle: Int // number of Lua statement to process per tick (1/100 s) - get() = ComputerPartsCodex.getProcessorCycles(actorValue.getAsInt("processor") ?: -1) - val memSize: Int // max: 8 GB - get() { - var size = 0 - for (i in 0..3) - size += ComputerPartsCodex.getRamSize(actorValue.getAsInt("memSlot$i") ?: -1) - - return size - } - - var terminal: FixturesBase? = null - - - // API-specific - - -} \ No newline at end of file diff --git a/work_files/graphics/terrain/terrain.raw b/work_files/graphics/terrain/terrain.raw deleted file mode 100644 index 8ef162b6b..000000000 Binary files a/work_files/graphics/terrain/terrain.raw and /dev/null differ diff --git a/work_files/weapon_bonus_by_temperature_enchant.gcx b/work_files/weapon_bonus_by_temperature_enchant.gcx new file mode 100644 index 000000000..44b29107d Binary files /dev/null and b/work_files/weapon_bonus_by_temperature_enchant.gcx differ