diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 000000000..992ca8389 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/Terrarum_renewed.iml b/Terrarum_renewed.iml index efe4488c4..95c716382 100644 --- a/Terrarum_renewed.iml +++ b/Terrarum_renewed.iml @@ -2,79 +2,40 @@ - + + diff --git a/src/net/torvald/aa/ColouredFastFont.kt b/src/net/torvald/aa/ColouredFastFont.kt deleted file mode 100644 index d38304afc..000000000 --- a/src/net/torvald/aa/ColouredFastFont.kt +++ /dev/null @@ -1,102 +0,0 @@ -package net.torvald.aa - -import net.torvald.terrarum.virtualcomputer.terminal.Terminal -import org.newdawn.slick.Color -import org.newdawn.slick.Font -import org.newdawn.slick.Image -import org.newdawn.slick.SpriteSheet -import java.util.* - -/** - * Based on multisheet slick spritesheef font (net.torvald.imagefont.GameFontBase) of my game project. - * Again, based on my Ba-AA project (github.com/minjaesong/ba-aa) - * - * Created by minjaesong on 16-08-12. - * Adopted by minjaesong on 16-09-07. - */ -class ColouredFastFont(val vt: Terminal, fontRef: String, val fontW: Int, val fontH: Int) : Font { - - val colouredSheet = ArrayList() // index zero: dark grey - private var sheetW = 0 - private var sheetH = 0 - - - private lateinit var sheetImageBuffer: Image - - init { - val getSizeImg = Image(fontRef) - sheetW = getSizeImg.width - sheetH = getSizeImg.height - - getSizeImg.destroy() - - sheetImageBuffer = Image(sheetW, sheetH) - - for (i in 0..vt.coloursCount - 1) { - val sheet = SpriteSheet("$fontRef.$i.tga", fontW, fontH) - colouredSheet.add(sheet) - - //sheetImageBuffer.graphics.clear() - } - - sheetImageBuffer.destroy() - } - - private fun getIndexX(ch: Char) = ch.toInt() % (sheetW / fontW) - private fun getIndexY(ch: Char) = ch.toInt() / (sheetW / fontW) - - override fun getHeight(p0: String): Int = fontH - - override fun getWidth(p0: String): Int { - throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override fun getLineHeight(): Int = fontH - - override fun drawString(p0: Float, p1: Float, p2: String) { - throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - - override fun drawString(p0: Float, p1: Float, p2: String, p3: Color) { - //search colour - var colourIndex = -1 - for (i in 0..vt.coloursCount - 1) { - if (vt.getColor(i) == p3) { - colourIndex = i - break - } - } - - if (colourIndex >= 0) { - - - colouredSheet[colourIndex].startUse() - - - for (i in 0..p2.length - 1) { - val ch = p2[i] - - colouredSheet[colourIndex].renderInUse( - p0.floorInt() + (i * fontW), - p1.floorInt(), - getIndexX(ch), - getIndexY(ch) - ) - } - - - colouredSheet[colourIndex].endUse() - } - else { - //System.err.println("[ColouredFastFont] unmatched colour! $p3") - } - - } - - override fun drawString(p0: Float, p1: Float, p2: String, p3: Color, p4: Int, p5: Int) { - throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - fun Float.floorInt() = this.toInt() -} diff --git a/src/net/torvald/terrarum/GameConfig.kt b/src/net/torvald/terrarum/GameConfig.kt deleted file mode 100644 index 9bf92588c..000000000 --- a/src/net/torvald/terrarum/GameConfig.kt +++ /dev/null @@ -1,6 +0,0 @@ -package net.torvald.terrarum - -/** - * Created by minjaesong on 15-12-30. - */ -class GameConfig : KVHashMap() diff --git a/src/net/torvald/terrarum/KVHashMap.kt b/src/net/torvald/terrarum/KVHashMap.kt index 01a6f41b3..1d8459c70 100644 --- a/src/net/torvald/terrarum/KVHashMap.kt +++ b/src/net/torvald/terrarum/KVHashMap.kt @@ -4,16 +4,15 @@ import com.google.gson.JsonPrimitive import java.util.* import java.util.function.Consumer +typealias ActorValue = KVHashMap +typealias GameConfig = KVHashMap + /** * Created by minjaesong on 15-12-30. */ -open class KVHashMap { +class KVHashMap { - private val hashMap: HashMap - - init { - hashMap = HashMap() - } + private val hashMap = HashMap() /** * Add key-value pair to the configuration table. @@ -104,7 +103,8 @@ open class KVHashMap { get() = hashMap.keys fun remove(key: String) { - hashMap.remove(key, hashMap[key]) + if (hashMap[key] != null) + hashMap.remove(key, hashMap[key]!!) } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/StateGraphicComputerTest.kt b/src/net/torvald/terrarum/StateGraphicComputerTest.kt index 62cdcfdc2..55b5d09c1 100644 --- a/src/net/torvald/terrarum/StateGraphicComputerTest.kt +++ b/src/net/torvald/terrarum/StateGraphicComputerTest.kt @@ -2,7 +2,7 @@ package net.torvald.terrarum import net.torvald.random.HQRNG import net.torvald.terrarum.gameactors.roundInt -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.peripheral.PeripheralVideoCard import net.torvald.terrarum.virtualcomputer.terminal.GraphicsTerminal import org.lwjgl.opengl.GL11 @@ -16,7 +16,7 @@ import java.util.* * Created by SKYHi14 on 2017-02-23. */ class StateGraphicComputerTest : BasicGameState() { - val computer = BaseTerrarumComputer(8) + val computer = TerrarumComputer(8) val monitor = GraphicsTerminal(computer) init { @@ -30,7 +30,8 @@ class StateGraphicComputerTest : BasicGameState() { override fun init(container: GameContainer?, game: StateBasedGame?) { val vcard = (computer.getPeripheral("ppu") as PeripheralVideoCard).vram - (0..3).forEach { vcard.sprites[it].setPaletteSet(64,33,12,62) } + // it's a-me, Mario! + /*(0..3).forEach { vcard.sprites[it].setPaletteSet(64,33,12,62) } vcard.sprites[0].setAll(intArrayOf( 0,0,0,0,0,1,1,1, @@ -71,46 +72,18 @@ class StateGraphicComputerTest : BasicGameState() { 0,1,1,1,0,0,0,0, 0,0,2,2,2,0,0,0, 0,0,2,2,2,2,0,0 - )) + ))*/ } - var angle = 0.0 - override fun update(container: GameContainer, game: StateBasedGame?, delta: Int) { Terrarum.appgc.setTitle("VT — F: ${container.fps}" + - " — M: ${Terrarum.memInUse}M / ${Terrarum.memTotal}M / ${Terrarum.memXmx}M") + " — M: ${Terrarum.memInUse}M / ${Terrarum.memTotal}M / ${Terrarum.memXmx}M" + + " ${Random().nextInt(100)}") monitor.update(container, delta) computer.update(container, delta) - val vcard = (computer.getPeripheral("ppu") as PeripheralVideoCard) - val sprites = vcard.vram.sprites - - angle += delta / 1000.0 - - (0..3).forEach { vcard.vram.sprites[it].setPaletteSet(64,26,12,62) } - - sprites[0].posX = (Math.cos(angle) * 80 + 100).roundInt() - 8 - sprites[0].posY = (Math.sin(angle) * 0 + 100).roundInt() - 8 - - sprites[1].posX = (Math.cos(angle) * 80 + 100).roundInt() - sprites[1].posY = (Math.sin(angle) * 0 + 100).roundInt() - 8 - - sprites[2].posX = (Math.cos(angle) * 80 + 100).roundInt() - 8 - sprites[2].posY = (Math.sin(angle) * 0 + 100).roundInt() - - sprites[3].posX = (Math.cos(angle) * 80 + 100).roundInt() - sprites[3].posY = (Math.sin(angle) * 0 + 100).roundInt() - - //sprite.pal0 = (sprite.pal0 + 1) % 65 - //sprite.pal1 = (sprite.pal1 + 1) % 65 - //sprite.pal2 = (sprite.pal2 + 1) % 65 - //sprite.pal3 = (sprite.pal3 + 1) % 65 - //kotlin.repeat(256) { - //vcard.vram.setBackgroundPixel(Random().nextInt(320), Random().nextInt(200), Random().nextInt(64)) - //vcard.vram.setBackgroundPixel(Random().nextInt(320), Random().nextInt(200), 15) - //} } override fun getID() = Terrarum.STATE_ID_TEST_TTY @@ -118,4 +91,8 @@ class StateGraphicComputerTest : BasicGameState() { override fun render(container: GameContainer, game: StateBasedGame?, g: Graphics) { monitor.render(container, g) } + + override fun keyPressed(key: Int, c: Char) { + monitor.keyPressed(key, c) + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/StateVTTest.kt b/src/net/torvald/terrarum/StateVTTest.kt index ef36a843d..a7c2ec7c3 100644 --- a/src/net/torvald/terrarum/StateVTTest.kt +++ b/src/net/torvald/terrarum/StateVTTest.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum import net.torvald.terrarum.gamecontroller.Key -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal import net.torvald.terrarum.virtualcomputer.terminal.Teletype import net.torvald.terrarum.virtualcomputer.terminal.TeletypeTerminal @@ -20,7 +20,7 @@ import org.newdawn.slick.state.StateBasedGame class StateVTTest : BasicGameState() { // HiRes: 100x64, LoRes: 80x25 - val computerInside = BaseTerrarumComputer(8) + val computerInside = TerrarumComputer(8) val vt = SimpleTextTerminal(SimpleTextTerminal.AMETHYST_NOVELTY, 80, 25, computerInside, colour = false, hires = false) diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 67b5ab655..e37bb706d 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -135,7 +135,7 @@ constructor(gamename: String) : StateBasedGame(gamename) { gc.graphics.clear() // clean up any 'dust' in the buffer //addState(StateVTTest()) - //addState(StateGraphicComputerTest()) + addState(StateGraphicComputerTest()) //addState(StateTestingLightning()) //addState(StateSplash()) //addState(StateMonitorCheck()) diff --git a/src/net/torvald/terrarum/console/GetAV.kt b/src/net/torvald/terrarum/console/GetAV.kt index c98ef3038..7f07fa56e 100644 --- a/src/net/torvald/terrarum/console/GetAV.kt +++ b/src/net/torvald/terrarum/console/GetAV.kt @@ -55,7 +55,7 @@ internal object GetAV : ConsoleCommand { Echo("$ccW== ActorValue list for $ccY$actor $ccW==") println("[GetAV] == ActorValue list for '$actor' ==") - if (keyset.size == 0) { + if (keyset.isEmpty()) { Echo("$ccK(nothing)") println("[GetAV] (nothing)") } @@ -114,7 +114,7 @@ internal object GetAV : ConsoleCommand { override fun printUsage() { Echo("${ccW}Get desired ActorValue of specific target.") - Echo("${ccW}Usage: ${ccY}getav ${ccG}(id) ") + Echo("${ccW}Usage: ${ccY}getav $ccG(id) ") Echo("${ccW}blank ID for player") } } diff --git a/src/net/torvald/terrarum/debuggerapp/ActorValueTracker.kt b/src/net/torvald/terrarum/debuggerapp/ActorValueTracker.kt index 865320e2a..cbe3806ff 100644 --- a/src/net/torvald/terrarum/debuggerapp/ActorValueTracker.kt +++ b/src/net/torvald/terrarum/debuggerapp/ActorValueTracker.kt @@ -1,16 +1,13 @@ package net.torvald.terrarum.debuggerapp +import net.torvald.terrarum.ActorValue import net.torvald.terrarum.Terrarum import net.torvald.terrarum.console.Echo import net.torvald.terrarum.console.SetAV -import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.Actor -import net.torvald.terrarum.gameactors.ActorValue import net.torvald.terrarum.gameactors.ActorWithSprite import net.torvald.terrarum.mapdrawer.FeaturesDrawer import java.awt.BorderLayout -import java.awt.Color -import java.awt.Dimension import java.awt.GridLayout import java.awt.event.MouseEvent import java.awt.event.MouseListener diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index eeb98c3db..a8ec9d2ac 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -1,6 +1,7 @@ package net.torvald.terrarum.gameactors import net.torvald.random.HQRNG +import net.torvald.terrarum.ActorValue import net.torvald.terrarum.Terrarum import net.torvald.terrarum.itemproperties.ItemCodex import org.newdawn.slick.GameContainer diff --git a/src/net/torvald/terrarum/gameactors/ActorValue.kt b/src/net/torvald/terrarum/gameactors/ActorValue.kt deleted file mode 100644 index 907267412..000000000 --- a/src/net/torvald/terrarum/gameactors/ActorValue.kt +++ /dev/null @@ -1,8 +0,0 @@ -package net.torvald.terrarum.gameactors - -import net.torvald.terrarum.KVHashMap - -/** - * Created by minjaesong on 16-03-19. - */ -class ActorValue : KVHashMap() \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt b/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt index 0952687d5..f76a2e1f9 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithSprite.kt @@ -354,9 +354,9 @@ open class ActorWithSprite(renderOrder: ActorOrder, val immobileBody: Boolean = isNoSubjectToFluidResistance = isPlayerNoClip } - /** - * Actual physics thing (altering velocity) starts from here - */ + //////////////////////////////////////////////////////////////// + // Codes that modifies velocity (moveDelta and externalForce) // + //////////////////////////////////////////////////////////////// // Combine velo and walk applyMovementVelocity() @@ -376,6 +376,10 @@ open class ActorWithSprite(renderOrder: ActorOrder, val immobileBody: Boolean = // Set 'next' position (hitbox) from canonical and walking velocity setNewNextHitbox() + /////////////////////////////////////////////////////// + // Codes that (SHOULD) displaces nextHitbox directly // + /////////////////////////////////////////////////////// + /** * solveCollision()? * If and only if: @@ -386,6 +390,10 @@ open class ActorWithSprite(renderOrder: ActorOrder, val immobileBody: Boolean = applyNormalForce() } + ////////////////////////////////////////////////////////////// + // Codes that modifies velocity (after hitbox displacement) // + ////////////////////////////////////////////////////////////// + if (!immobileBody) { // TODO test no friction on immobileBody setHorizontalFriction() } @@ -395,6 +403,10 @@ open class ActorWithSprite(renderOrder: ActorOrder, val immobileBody: Boolean = setVerticalFriction() } + + // some spacing // + + // apply our compensation to actual hitbox updateHitbox() diff --git a/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt b/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt index 26b3c1580..00c75dd21 100644 --- a/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt +++ b/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt @@ -4,6 +4,7 @@ import net.torvald.JsonFetcher import net.torvald.random.Fudge3 import net.torvald.terrarum.langpack.Lang import com.google.gson.JsonObject +import net.torvald.terrarum.ActorValue import net.torvald.terrarum.gameactors.ActorHumanoid import org.newdawn.slick.SlickException import java.io.IOException diff --git a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt index 08bc69dec..4d2495fb8 100644 --- a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt +++ b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt @@ -4,6 +4,7 @@ import net.torvald.JsonFetcher import net.torvald.terrarum.gameactors.faction.Faction import net.torvald.spriteanimation.SpriteAnimation import com.google.gson.JsonObject +import net.torvald.terrarum.ActorValue import net.torvald.terrarum.gameactors.ActorHumanoid import net.torvald.terrarum.gameactors.faction.FactionFactory import net.torvald.terrarum.gameitem.EquipPosition diff --git a/src/net/torvald/terrarum/gameactors/ai/LuaAIWrapper.kt b/src/net/torvald/terrarum/gameactors/ai/LuaAIWrapper.kt index 00b41cefb..ffcb7511e 100644 --- a/src/net/torvald/terrarum/gameactors/ai/LuaAIWrapper.kt +++ b/src/net/torvald/terrarum/gameactors/ai/LuaAIWrapper.kt @@ -47,10 +47,10 @@ class LuaAIWrapper(private val scriptPath: String) : ActorAI { override fun update(delta: Int) { // run "update()" function in the script - luag.get("update").call(delta.toLuaValue()) + luag.get("update").call(delta.toLua()) } - var currentExecutionThread = Thread() + lateinit var currentExecutionThread: Thread var threadRun = false fun runCommand(reader: Reader, filename: String) { @@ -109,5 +109,5 @@ class LuaAIWrapper(private val scriptPath: String) : ActorAI { } } - fun Int.toLuaValue(): LuaValue = LuaInteger.valueOf(this) + fun Int.toLua(): LuaValue = LuaInteger.valueOf(this) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/assets/lua/BOOT.lua b/src/net/torvald/terrarum/virtualcomputer/assets/lua/BOOT.lua index 8e0f69d23..7efa9ebd4 100644 --- a/src/net/torvald/terrarum/virtualcomputer/assets/lua/BOOT.lua +++ b/src/net/torvald/terrarum/virtualcomputer/assets/lua/BOOT.lua @@ -1045,7 +1045,7 @@ require("ROMLIB") speaker.enqueue(80, computer.bellpitch) -- term.bell sometimes get squelched -- load bios, if any ---if fs.exists(computer.bootloader) then fs.dofile(computer.bootloader) end +if fs.exists(computer.bootloader) then fs.dofile(computer.bootloader) end -- halt/run luaprompt upon the termination of bios. -- Valid BIOS should load OS and modify 'shell.status' to 'shell.halt' before terminating itself. diff --git a/src/net/torvald/terrarum/virtualcomputer/assets/lua/ROMLIB.lua b/src/net/torvald/terrarum/virtualcomputer/assets/lua/ROMLIB.lua index fd78185fe..f344bac09 100644 --- a/src/net/torvald/terrarum/virtualcomputer/assets/lua/ROMLIB.lua +++ b/src/net/torvald/terrarum/virtualcomputer/assets/lua/ROMLIB.lua @@ -6,7 +6,7 @@ -- ALIASES -- ------------- -_G.io = {} -- we make our own sandbox'd system +--_G.io = {} -- we make our own sandbox'd system --[[fs.dofile = function(p, ...) local f = fs.open(p, "r") @@ -51,7 +51,7 @@ _G.__scanforline__ = function(echo) -- pass '1' to not echo; pass nothing to ech _G.__scanMode__ = "line" local s repeat -- we can do this ONLY IF lua execution process is SEPARATE THREAD - s = machine.getLastStreamInput() + s = machine.__readFromStdin() until s -- input is closed when RETURN is hit. See above comments. return s @@ -75,16 +75,16 @@ end]] -- DELETED: use _G.input.isKeyDown(keycode) --- --- -input.readLine = _G.__scanforline__ +--input.readLine = _G.__scanforline__ -io.__openfile__ = "stdin" +--[[io.__openfile__ = "stdin" io.stdin = "stdin" io.stdout = "stdout" io.stderr = "stderr" -io.open = fs.open +io.open = fs.open]] -io.input = function(luafile) +--[[io.input = function(luafile) io.__openfile__ = luafile end @@ -105,13 +105,18 @@ io.read = function(option) options["*n"] = function() error("Read number is not supported, yet!") end--_readNumber options["*a"] = _readAll options["*l"] = _readLine +end]] + +io.read = function() + return string.char(machine.__readFromStdin()) end ----------------- -- PRINTSTREAM -- ----------------- -io.write = function(...) +-- only useful when IO is "opening" stdin +--[[io.write = function(...) local args = {...} for _, v in ipairs(args) do local s @@ -122,10 +127,10 @@ io.write = function(...) end term.write(s) end -end +end]] -- for some reason, inputstream above kills 'print' function. -- So we rewrite it. -_G.print = function(...) +--[[_G.print = function(...) -- dependent on above io.write reimpl local args = {...} io.write(args[1]) @@ -138,7 +143,7 @@ _G.print = function(...) end io.write("\n") -end +end]] --------------- diff --git a/src/net/torvald/terrarum/virtualcomputer/computer/BaseTerrarumComputer.kt b/src/net/torvald/terrarum/virtualcomputer/computer/TerrarumComputer.kt similarity index 78% rename from src/net/torvald/terrarum/virtualcomputer/computer/BaseTerrarumComputer.kt rename to src/net/torvald/terrarum/virtualcomputer/computer/TerrarumComputer.kt index 867bab8e9..c9a7732ed 100644 --- a/src/net/torvald/terrarum/virtualcomputer/computer/BaseTerrarumComputer.kt +++ b/src/net/torvald/terrarum/virtualcomputer/computer/TerrarumComputer.kt @@ -30,7 +30,7 @@ import java.util.* * @param term : terminal that is connected to the computer fixtures, null if not connected any. * Created by minjaesong on 16-09-10. */ -class BaseTerrarumComputer(peripheralSlots: Int) { +class TerrarumComputer(peripheralSlots: Int) { var maxPeripherals: Int = peripheralSlots private set @@ -42,11 +42,11 @@ class BaseTerrarumComputer(peripheralSlots: Int) { lateinit var luaJ_globals: Globals private set - var termOut: PrintStream? = null + var stdout: PrintStream? = null private set - var termErr: PrintStream? = null + var stderr: PrintStream? = null private set - var termIn: InputStream? = null + var stdin: InputStream? = null private set val processorCycle: Int // number of Lua statement to process per tick (1/100 s) @@ -76,6 +76,10 @@ class BaseTerrarumComputer(peripheralSlots: Int) { val peripheralTable = ArrayList() + var stdinInput: Int = -1 + private set + + // os-related functions. These are called "machine" library-wise. private val startupTimestamp: Long = System.currentTimeMillis() /** Time elapsed since the power is on. */ @@ -119,7 +123,7 @@ class BaseTerrarumComputer(peripheralSlots: Int) { if (peripheralTable.size < maxPeripherals) { peripheralTable.add(peri) peri.loadLib(luaJ_globals) - println("[BaseTerrarumComputer] loading peripheral $peri") + println("[TerrarumComputer] loading peripheral $peri") } else { throw Error("No vacant peripheral slot") @@ -129,7 +133,7 @@ class BaseTerrarumComputer(peripheralSlots: Int) { fun detachPeripheral(peri: Peripheral) { if (peripheralTable.contains(peri)) { peripheralTable.remove(peri) - println("[BaseTerrarumComputer] unloading peripheral $peri") + println("[TerrarumComputer] unloading peripheral $peri") } else { throw IllegalArgumentException("Peripheral not exists: $peri") @@ -144,13 +148,13 @@ class BaseTerrarumComputer(peripheralSlots: Int) { fun initSandbox(term: Teletype) { luaJ_globals = JsePlatform.debugGlobals() - termOut = TerminalPrintStream(term) - termErr = TerminalPrintStream(term) - termIn = TerminalInputStream(term) + stdout = TerminalPrintStream(this) + stderr = TerminalPrintStream(this) + stdin = TerminalInputStream(this) - luaJ_globals.STDOUT = termOut - luaJ_globals.STDERR = termErr - luaJ_globals.STDIN = termIn + luaJ_globals.STDOUT = stdout + luaJ_globals.STDERR = stderr + luaJ_globals.STDIN = stdin luaJ_globals["bit"] = luaJ_globals["bit32"] @@ -191,73 +195,80 @@ class BaseTerrarumComputer(peripheralSlots: Int) { } } - var threadTimer = 0 - val threadMaxTime = 2000 - fun update(gc: GameContainer, delta: Int) { input = gc.input - 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() - } - + if (currentExecutionThread.state == Thread.State.TERMINATED) { + threadRun = false } + + if (!isHalted) { driveBeepQueueManager(delta) } - else { - currentExecutionThread.interrupt() - } } fun keyPressed(key: Int, c: Char) { + stdinInput = c.toInt() + + System.err.println("TerrarumComputer.keyPressed got input: $stdinInput") + + + // wake thread + runnableRunCommand.resume() + + + synchronized(stdin!!) { + (stdin as java.lang.Object).notifyAll() + } } - var currentExecutionThread = Thread() - var threadRun = false + fun openStdin() { + System.err.println("TerrarumComputer.openStdin") + + + stdinInput = -1 + // sleep the thread + runnableRunCommand.pause() + } + + lateinit var currentExecutionThread: Thread + private set + lateinit var runnableRunCommand: ThreadRunCommand + private set + private var threadRun = false fun runCommand(line: String, env: String) { - if (!threadRun && !isHalted) { - currentExecutionThread = Thread(ThreadRunCommand(luaJ_globals, line, env)) + if (!threadRun) { + runnableRunCommand = ThreadRunCommand(luaJ_globals, line, env) + currentExecutionThread = Thread(null, runnableRunCommand, "LuaJ Separated") currentExecutionThread.start() threadRun = true } } fun runCommand(reader: Reader, filename: String) { - if (!threadRun && !isHalted) { - currentExecutionThread = Thread(ThreadRunCommand(luaJ_globals, reader, filename)) + if (!threadRun) { + runnableRunCommand = ThreadRunCommand(luaJ_globals, reader, filename) + currentExecutionThread = Thread(null, runnableRunCommand, "LuaJ Separated") 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 + private val mode: Int + private val arg1: Any + private val arg2: String + private val lua: Globals + + @Volatile private var running = true + @Volatile private var paused = false + private val pauseLock = java.lang.Object() constructor(luaInstance: Globals, line: String, env: String) { mode = 0 @@ -274,6 +285,32 @@ class BaseTerrarumComputer(peripheralSlots: Int) { } override fun run() { + synchronized(pauseLock) { + if (!running) { // may have changed while waiting to + // synchronize on pauseLock + return + } + if (paused) { + try { + pauseLock.wait() // will cause this Thread to block until + // another thread calls pauseLock.notifyAll() + // Note that calling wait() will + // relinquish the synchronized lock that this + // thread holds on pauseLock so another thread + // can acquire the lock to call notifyAll() + // (link with explanation below this code) + } + catch (ex: InterruptedException) { + return + } + + if (!running) { // running might have changed since we paused + return + } + } + } + + try { val chunk: LuaValue if (mode == 0) @@ -291,15 +328,35 @@ class BaseTerrarumComputer(peripheralSlots: Int) { lua.STDERR.println("${SimpleTextTerminal.ASCII_DLE}${e.message}${SimpleTextTerminal.ASCII_DC4}") } } + + fun stop() { + running = false + // you might also want to do this: + //interrupt() + } + + fun pause() { + // you may want to throw an IllegalStateException if !running + paused = true + } + + fun resume() { + synchronized(pauseLock) { + paused = false + pauseLock.notifyAll() // Unblocks thread + + System.err.println("ThreadRunCommand resume()") + } + } } - class LuaFunGetTotalMem(val computer: BaseTerrarumComputer) : ZeroArgFunction() { + class LuaFunGetTotalMem(val computer: TerrarumComputer) : ZeroArgFunction() { override fun call(): LuaValue { return LuaValue.valueOf(computer.memSize) } } - class ComputerEmitTone(val computer: BaseTerrarumComputer) : TwoArgFunction() { + class ComputerEmitTone(val computer: TerrarumComputer) : TwoArgFunction() { override fun call(millisec: LuaValue, freq: LuaValue): LuaValue { computer.playTone(millisec.checkint(), freq.checkdouble()) return LuaValue.NONE @@ -357,7 +414,7 @@ class BaseTerrarumComputer(peripheralSlots: Int) { //AL.destroy() - if (DEBUG) println("[BaseTerrarumComputer] !! Beep queue clear") + if (DEBUG) println("[TerrarumComputer] !! Beep queue clear") } fun enqueueBeep(duration: Int, freq: Double) { diff --git a/src/net/torvald/terrarum/virtualcomputer/luaapi/Filesystem.kt b/src/net/torvald/terrarum/virtualcomputer/luaapi/Filesystem.kt index e11aa0bad..0f2e34e48 100644 --- a/src/net/torvald/terrarum/virtualcomputer/luaapi/Filesystem.kt +++ b/src/net/torvald/terrarum/virtualcomputer/luaapi/Filesystem.kt @@ -5,7 +5,7 @@ import org.luaj.vm2.lib.OneArgFunction import org.luaj.vm2.lib.TwoArgFunction import org.luaj.vm2.lib.ZeroArgFunction import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.luaapi.Term.Companion.checkIBM437 import java.io.* import java.nio.file.Files @@ -26,7 +26,7 @@ import java.util.* * Don't convert '\' to '/'! Rev-slash is used for escape character in sh, and we're sh-compatible! * Use .absoluteFile whenever possible; there's fuckin oddity! (http://bugs.java.com/bugdatabase/view_bug.do;:YfiG?bug_id=4483097) */ -internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { +internal class Filesystem(globals: Globals, computer: TerrarumComputer) { init { // load things. WARNING: THIS IS MANUAL! @@ -101,7 +101,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { /** actual directory: /Saves//computers// * directs media/ directory to / directory */ - fun BaseTerrarumComputer.getRealPath(luapath: LuaValue) : String { + fun TerrarumComputer.getRealPath(luapath: LuaValue) : String { // direct mounted paths to real path val computerDir = Terrarum.currentSaveDir.absolutePath + "/computers/" /* if not begins with "(/?)media/", direct to boot @@ -138,7 +138,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { * * actual directory: /Saves//computers// */ - class ListFiles(val computer: BaseTerrarumComputer) : OneArgFunction() { + class ListFiles(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -155,7 +155,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { } /** Don't use this. Use isFile */ - class FileExists(val computer: BaseTerrarumComputer) : OneArgFunction() { + class FileExists(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -163,7 +163,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { } } - class IsDirectory(val computer: BaseTerrarumComputer) : OneArgFunction() { + class IsDirectory(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -174,7 +174,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { } } - class IsFile(val computer: BaseTerrarumComputer) : OneArgFunction() { + class IsFile(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -198,7 +198,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { } } - class IsReadOnly(val computer: BaseTerrarumComputer) : OneArgFunction() { + class IsReadOnly(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -207,7 +207,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { } /** we have 4GB file size limit */ - class GetSize(val computer: BaseTerrarumComputer) : OneArgFunction() { + class GetSize(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -220,7 +220,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { /** * difference with ComputerCraft: it returns boolean, true on successful. */ - class Mkdir(val computer: BaseTerrarumComputer) : OneArgFunction() { + class Mkdir(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -231,7 +231,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { /** * moves a directory, overwrites the target */ - class Mv(val computer: BaseTerrarumComputer) : TwoArgFunction() { + class Mv(val computer: TerrarumComputer) : TwoArgFunction() { override fun call(from: LuaValue, to: LuaValue) : LuaValue { Filesystem.ensurePathSanity(from) Filesystem.ensurePathSanity(to) @@ -250,7 +250,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { * copies a directory, overwrites the target * difference with ComputerCraft: it returns boolean, true on successful. */ - class Cp(val computer: BaseTerrarumComputer) : TwoArgFunction() { + class Cp(val computer: TerrarumComputer) : TwoArgFunction() { override fun call(from: LuaValue, to: LuaValue) : LuaValue { Filesystem.ensurePathSanity(from) Filesystem.ensurePathSanity(to) @@ -266,7 +266,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { /** * difference with ComputerCraft: it returns boolean, true on successful. */ - class Rm(val computer: BaseTerrarumComputer) : OneArgFunction() { + class Rm(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -276,7 +276,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { } } - class ConcatPath(val computer: BaseTerrarumComputer) : TwoArgFunction() { + class ConcatPath(val computer: TerrarumComputer) : TwoArgFunction() { override fun call(base: LuaValue, local: LuaValue) : LuaValue { Filesystem.ensurePathSanity(base) Filesystem.ensurePathSanity(local) @@ -312,7 +312,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { * writeBytes = function(string as bytearray) * } */ - class OpenFile(val computer: BaseTerrarumComputer) : TwoArgFunction() { + class OpenFile(val computer: TerrarumComputer) : TwoArgFunction() { override fun call(path: LuaValue, mode: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) @@ -387,7 +387,7 @@ internal class Filesystem(globals: Globals, computer: BaseTerrarumComputer) { } } - class GetParentDir(val computer: BaseTerrarumComputer) : OneArgFunction() { + class GetParentDir(val computer: TerrarumComputer) : OneArgFunction() { override fun call(path: LuaValue) : LuaValue { Filesystem.ensurePathSanity(path) diff --git a/src/net/torvald/terrarum/virtualcomputer/luaapi/HostAccessProvider.kt b/src/net/torvald/terrarum/virtualcomputer/luaapi/HostAccessProvider.kt index 23264fa37..249090759 100644 --- a/src/net/torvald/terrarum/virtualcomputer/luaapi/HostAccessProvider.kt +++ b/src/net/torvald/terrarum/virtualcomputer/luaapi/HostAccessProvider.kt @@ -1,8 +1,9 @@ package net.torvald.terrarum.virtualcomputer.luaapi +import net.torvald.terrarum.gameactors.ai.toLua import org.luaj.vm2.lib.OneArgFunction import org.luaj.vm2.lib.ZeroArgFunction -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.luaapi.Term.Companion.checkIBM437 import net.torvald.terrarum.virtualcomputer.terminal.Teletype import org.luaj.vm2.* @@ -14,22 +15,19 @@ import org.luaj.vm2.* * * Created by minjaesong on 16-09-19. */ -internal class HostAccessProvider(globals: Globals, computer: BaseTerrarumComputer) { +internal class HostAccessProvider(globals: Globals, computer: TerrarumComputer) { init { globals["machine"] = LuaTable() globals["machine"]["println"] = PrintLn() globals["machine"]["isHalted"] = IsHalted(computer) - globals["machine"]["closeInputString"] = NativeCloseInputString(computer.term) - globals["machine"]["closeInputKey"] = NativeCloseInputKey(computer.term) - globals["machine"]["openInput"] = NativeOpenInput(computer.term) - globals["machine"]["getLastStreamInput"] = NativeGetLastStreamInput(computer.term) - globals["machine"]["getLastKeyPress"] = NativeGetLastKeyPress(computer.term) + + globals["machine"]["__readFromStdin"] = NativeReadStdin(computer) globals["machine"]["milliTime"] = NativeGetMilliTime(computer) - globals["machine"]["sleep"] = NativeBusySleep(computer) + globals["machine"]["sleep"] = NativeThreadSleep(computer) globals["__haltsystemexplicit__"] = HaltComputer(computer) } @@ -44,53 +42,19 @@ internal class HostAccessProvider(globals: Globals, computer: BaseTerrarumComput } } - class IsHalted(val computer: BaseTerrarumComputer): ZeroArgFunction() { + class IsHalted(val computer: TerrarumComputer): ZeroArgFunction() { override fun call(): LuaValue { return LuaValue.valueOf(computer.isHalted) } } - class NativeCloseInputString(val term: Teletype) : ZeroArgFunction() { + class NativeReadStdin(val computer: TerrarumComputer) : ZeroArgFunction() { override fun call(): LuaValue { - term.closeInputString() - return LuaValue.NONE + return computer.stdin!!.read().toLua() } } - class NativeCloseInputKey(val term: Teletype) : ZeroArgFunction() { - override fun call(): LuaValue { - //term.closeInputKey() - return LuaValue.NONE - } - } - - class NativeOpenInput(val term: Teletype) : LuaFunction() { - override fun call(): LuaValue { - term.openInput(true) - return LuaValue.NONE - } - - override fun call(echo: LuaValue): LuaValue { - term.openInput(if (echo.checkint() == 1) false else true) - return LuaValue.NONE - } - } - - class NativeGetLastStreamInput(val term: Teletype) : ZeroArgFunction() { - override fun call(): LuaValue { - return if (term.lastStreamInput == null) LuaValue.NIL - else LuaValue.valueOf(term.lastStreamInput) - } - } - - class NativeGetLastKeyPress(val term: Teletype) : ZeroArgFunction() { - override fun call(): LuaValue { - return if (term.lastKeyPress == null) LuaValue.NIL - else LuaValue.valueOf(term.lastKeyPress!!) - } - } - - class HaltComputer(val computer: BaseTerrarumComputer) : ZeroArgFunction() { + class HaltComputer(val computer: TerrarumComputer) : ZeroArgFunction() { override fun call() : LuaValue { computer.isHalted = true computer.luaJ_globals.load("""print(DC4.."system halted")""").call() @@ -99,18 +63,15 @@ internal class HostAccessProvider(globals: Globals, computer: BaseTerrarumComput } /** Time elapsed since the power is on. */ - class NativeGetMilliTime(val computer: BaseTerrarumComputer) : ZeroArgFunction() { + class NativeGetMilliTime(val computer: TerrarumComputer) : ZeroArgFunction() { override fun call(): LuaValue { return LuaValue.valueOf(computer.milliTime) } } - class NativeBusySleep(val computer: BaseTerrarumComputer) : OneArgFunction() { + class NativeThreadSleep(val computer: TerrarumComputer) : OneArgFunction() { override fun call(mills: LuaValue): LuaValue { - val starttime = computer.milliTime - val sleeptime = mills.checkint() - if (sleeptime > 1000) throw LuaError("Cannot busy-sleep more than a second.") - while (computer.milliTime - starttime < sleeptime) { } + computer.currentExecutionThread.join(mills.checklong()) return LuaValue.NONE } } diff --git a/src/net/torvald/terrarum/virtualcomputer/luaapi/Input.kt b/src/net/torvald/terrarum/virtualcomputer/luaapi/Input.kt index 015d71f5d..254cce590 100644 --- a/src/net/torvald/terrarum/virtualcomputer/luaapi/Input.kt +++ b/src/net/torvald/terrarum/virtualcomputer/luaapi/Input.kt @@ -5,12 +5,12 @@ import org.luaj.vm2.LuaTable import org.luaj.vm2.LuaValue import org.luaj.vm2.lib.OneArgFunction import net.torvald.terrarum.gamecontroller.Key -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer /** * Created by minjaesong on 16-09-25. */ -class Input(globals: Globals, computer: BaseTerrarumComputer) { +class Input(globals: Globals, computer: TerrarumComputer) { init { globals["input"] = LuaTable() @@ -23,7 +23,7 @@ class Input(globals: Globals, computer: BaseTerrarumComputer) { val keys_caps = intArrayOf(Key.CAPS_LOCK, Key.BACKSPACE, Key.L_CONTROL) } - class IsKeyDown(val host: BaseTerrarumComputer) : OneArgFunction() { + class IsKeyDown(val host: TerrarumComputer) : OneArgFunction() { override fun call(keyCode: LuaValue): LuaValue { val key = keyCode.checkint() diff --git a/src/net/torvald/terrarum/virtualcomputer/luaapi/PcSpeakerDriver.kt b/src/net/torvald/terrarum/virtualcomputer/luaapi/PcSpeakerDriver.kt index ff49d02a0..f61e232d4 100644 --- a/src/net/torvald/terrarum/virtualcomputer/luaapi/PcSpeakerDriver.kt +++ b/src/net/torvald/terrarum/virtualcomputer/luaapi/PcSpeakerDriver.kt @@ -5,7 +5,7 @@ import org.luaj.vm2.LuaTable import org.luaj.vm2.LuaValue import org.luaj.vm2.lib.TwoArgFunction import org.luaj.vm2.lib.ZeroArgFunction -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import org.luaj.vm2.LuaFunction import org.luaj.vm2.lib.OneArgFunction @@ -16,7 +16,7 @@ import org.luaj.vm2.lib.OneArgFunction * * Created by minjaesong on 16-09-27. */ -class PcSpeakerDriver(val globals: Globals, host: BaseTerrarumComputer) { +class PcSpeakerDriver(val globals: Globals, host: TerrarumComputer) { init { globals["speaker"] = LuaTable() @@ -67,7 +67,7 @@ class PcSpeakerDriver(val globals: Globals, host: BaseTerrarumComputer) { } } - class EnqueueTone(val host: BaseTerrarumComputer) : TwoArgFunction() { + class EnqueueTone(val host: TerrarumComputer) : TwoArgFunction() { /** * @param freq: number (hertz) or string (A-4, A4, B#2, ...) */ @@ -84,7 +84,7 @@ class PcSpeakerDriver(val globals: Globals, host: BaseTerrarumComputer) { } } - class ClearQueue(val host: BaseTerrarumComputer) : ZeroArgFunction() { + class ClearQueue(val host: TerrarumComputer) : ZeroArgFunction() { override fun call(): LuaValue { host.clearBeepQueue() return LuaValue.NONE diff --git a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralInternet.kt b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralInternet.kt index 263c0a7e7..45b19c96a 100644 --- a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralInternet.kt +++ b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralInternet.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum.virtualcomputer.peripheral import org.luaj.vm2.Globals -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import org.luaj.vm2.LuaTable import org.luaj.vm2.LuaValue import org.luaj.vm2.lib.OneArgFunction @@ -14,7 +14,7 @@ import java.net.URL * * Created by minjaesong on 16-09-24. */ -internal class PeripheralInternet(val host: BaseTerrarumComputer) +internal class PeripheralInternet(val host: TerrarumComputer) : Peripheral("internet"){ override fun loadLib(globals: Globals) { diff --git a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralPSG.kt b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralPSG.kt index 3613bbb5d..05360ea53 100644 --- a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralPSG.kt +++ b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralPSG.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.virtualcomputer.peripheral -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import org.luaj.vm2.Globals import org.luaj.vm2.LuaTable import org.luaj.vm2.LuaValue @@ -11,7 +11,7 @@ import org.luaj.vm2.LuaValue * * Created by minjaesong on 16-09-27. */ -internal class PeripheralPSG(val host: BaseTerrarumComputer) +internal class PeripheralPSG(val host: TerrarumComputer) : Peripheral("psg") { override fun loadLib(globals: Globals) { diff --git a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt index f49e779c3..d9f6f39cc 100644 --- a/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt +++ b/src/net/torvald/terrarum/virtualcomputer/peripheral/PeripheralVideoCard.kt @@ -2,17 +2,10 @@ package net.torvald.terrarum.virtualcomputer.peripheral import net.torvald.terrarum.gameactors.DecodeTapestry import net.torvald.terrarum.gameactors.ai.toLua -import net.torvald.terrarum.getPixel -import org.luaj.vm2.Globals -import org.luaj.vm2.LuaTable -import org.luaj.vm2.LuaValue -import org.luaj.vm2.lib.OneArgFunction +import org.luaj.vm2.* +import org.luaj.vm2.lib.* import org.luaj.vm2.lib.ThreeArgFunction -import org.luaj.vm2.lib.TwoArgFunction -import org.luaj.vm2.lib.ZeroArgFunction -import org.lwjgl.opengl.GL11 import org.newdawn.slick.* -import java.util.* /** * Created by SKYHi14 on 2017-02-08. @@ -20,8 +13,8 @@ import java.util.* class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : Peripheral("ppu") { companion object { - val blockW = 8 - val blockH = 8 + val blockW = 8 // MUST BE 8 + val blockH = 8 // MUST BE 8 /** * Converts consecutive lua table indexed from 1 as IntArray. @@ -51,7 +44,7 @@ class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : val frameBufferImage = frameBuffer.image // hard-coded 8x8 - var fontRom = Array(256, { Array(blockH, { 0 }).toIntArray() }) + var fontRom = Array(256, { IntArray(blockH) }) init { // build it for first time @@ -61,10 +54,20 @@ class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : } val CLUT = VRAM.CLUT - val coloursCount = CLUT.size + val colorsCount = CLUT.size val luaSpriteTable = LuaTable() + var color = 15 // black + set(value) { + if (value >= colorsCount || value < 0) { + throw IllegalArgumentException("Unknown colour: $value") + } + else { + field = value + } + } + init { fun composeSpriteObject(spriteIndex: Int) : LuaValue { val sprite = vram.sprites[spriteIndex] @@ -109,16 +112,29 @@ class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : override fun loadLib(globals: Globals) { globals["ppu"] = LuaTable() - globals["ppu"]["setForeColor"] = SetForeColor(this) - globals["ppu"]["getForeColor"] = GetForeColor(this) - globals["ppu"]["setBackColor"] = SetBackColor(this) - globals["ppu"]["getBackColor"] = GetBackColor(this) + globals["ppu"]["setTextForeColor"] = SetTextForeColor(this) + globals["ppu"]["getTextForeColor"] = GetTextForeColor(this) + globals["ppu"]["setTextBackColor"] = SetTextBackColor(this) + globals["ppu"]["getTextBackColor"] = GetTextBackColor(this) + globals["ppu"]["setColor"] = SetDrawColor(this) + globals["ppu"]["getColor"] = GetDrawColor(this) globals["ppu"]["emitChar"] = EmitChar(this) globals["ppu"]["clearAll"] = ClearAll(this) globals["ppu"]["clearBack"] = ClearBackground(this) globals["ppu"]["clearFore"] = ClearForeground(this) globals["ppu"]["getSpritesCount"] = GetSpritesCount(this) + globals["ppu"]["getWidth"] = GetWidth(this) + globals["ppu"]["getHeight"] = GetHeight(this) + + + globals["ppu"]["getSprite"] = GetSprite(this) + + globals["ppu"]["drawRectBack"] = DrawRectBack(this) + globals["ppu"]["drawRectFore"] = DrawRectFore(this) + globals["ppu"]["fillRectBack"] = FillRectBack(this) + globals["ppu"]["fillRectFore"] = FillRectFore(this) + globals["ppu"]["drawString"] = DrawString(this) } private val spriteBuffer = ImageBuffer(VSprite.width, VSprite.height) @@ -171,44 +187,23 @@ class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : img.destroy() } - fun ImageBuffer.softwareRender(other: ImageBuffer, posX: Int, posY: Int) { - for (y in 0..other.height - 1) { - for (x in 0..other.width - 1) { - val ix = posX + x - val iy = posY + y - if (ix >= 0 && iy >= 0 && ix < this.width && iy < this.height) { - if (other.rgba[4 * (y * other.width + x) + 3] != 0.toByte()) { // if not transparent - this.rgba[4 * (iy * this.texWidth + ix) + 0] = other.rgba[4 * (y * other.texWidth + x) + 0] - this.rgba[4 * (iy * this.texWidth + ix) + 1] = other.rgba[4 * (y * other.texWidth + x) + 1] - this.rgba[4 * (iy * this.texWidth + ix) + 2] = other.rgba[4 * (y * other.texWidth + x) + 2] - this.rgba[4 * (iy * this.texWidth + ix) + 3] = other.rgba[4 * (y * other.texWidth + x) + 3] - } - } - } - } - } + private var textColorFore = 49 // white + private var textColorBack = 64 // transparent - private var foreColor = 49 // white - private var backColor = 64 // transparent - - fun drawChar(c: Char, x: Int, y: Int, colFore: Int = foreColor, colBack: Int = backColor) { + fun drawChar(c: Char, x: Int, y: Int, colFore: Int = textColorFore, colBack: Int = textColorBack) { val glyph = fontRom[c.toInt()] - val fore = CLUT[colFore] - val back = CLUT[colBack] // software render - for (gy in 0..blockH - 1) { - for (gx in 0..blockW - 1) { - val glyAlpha = glyph[gy].ushr(gx).and(1) + for (gy in 0..blockH - 1) { for (gx in 0..blockW - 1) { + val glyAlpha = glyph[gy] and (1 shl gx) - if (glyAlpha != 0) { - vram.foreground.setRGBA(x * blockW + gx, y * blockH + gy, fore.red, fore.green, fore.blue, fore.alpha) - } - else { - vram.foreground.setRGBA(x * blockW + gx, y * blockH + gy, back.red, back.green, back.blue, back.alpha) - } + if (glyAlpha != 0) { + vram.setForegroundPixel(x + gx, y + gy, colFore) } - } + else { + vram.setForegroundPixel(x + gx, y + gy, colBack) + } + }} } @@ -231,9 +226,61 @@ class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : } } + fun drawRectBack(x: Int, y: Int, w: Int, h: Int, c: Int = color) { + (0..w - 1).forEach { + vram.setBackgroundPixel(x + it, y, c) + vram.setBackgroundPixel(x + it, y + h - 1, c) + } + (1..h - 2).forEach { + vram.setBackgroundPixel(x, y + it, c) + vram.setBackgroundPixel(x + w - 1, y + it, c) + } + } + + fun fillRectBack(x: Int, y: Int, w: Int, h: Int, c: Int = color) { + for (py in 0..h - 1) { for (px in 0..w - 1) { + vram.setBackgroundPixel(x + px, y + py, c) + }} + } + + fun drawRectFore(x: Int, y: Int, w: Int, h: Int, c: Int = color) { + (0..w - 1).forEach { + vram.setForegroundPixel(x + it, y, c) + vram.setForegroundPixel(x + it, y + h - 1, c) + } + (1..h - 2).forEach { + vram.setForegroundPixel(x, y + it, c) + vram.setForegroundPixel(x + w - 1, y + it, c) + } + } + + fun fillRectFore(x: Int, y: Int, w: Int, h: Int, c: Int = color) { + for (py in 0..h - 1) { for (px in 0..w - 1) { + vram.setForegroundPixel(x + px, y + py, c) + }} + } + + fun getSprite(index: Int) = vram.sprites[index] + private fun ImageBuffer.softwareRender(other: ImageBuffer, posX: Int, posY: Int) { + for (y in 0..other.height - 1) { + for (x in 0..other.width - 1) { + val ix = posX + x + val iy = posY + y + if (ix >= 0 && iy >= 0 && ix < this.width && iy < this.height) { + if (other.rgba[4 * (y * other.texWidth + x) + 3] != 0.toByte()) { // if not transparent + this.rgba[4 * (iy * this.texWidth + ix) + 0] = other.rgba[4 * (y * other.texWidth + x) + 0] + this.rgba[4 * (iy * this.texWidth + ix) + 1] = other.rgba[4 * (y * other.texWidth + x) + 1] + this.rgba[4 * (iy * this.texWidth + ix) + 2] = other.rgba[4 * (y * other.texWidth + x) + 2] + this.rgba[4 * (iy * this.texWidth + ix) + 3] = other.rgba[4 * (y * other.texWidth + x) + 3] + } + } + } + } + } + /** * Array be like, in binary; notice that glyphs are flipped horizontally: * ... @@ -268,27 +315,51 @@ class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : buildFontRom("./assets/graphics/fonts/milky.tga") } + /////////////////// + // Lua functions // + /////////////////// - class SetForeColor(val videoCard: PeripheralVideoCard) : OneArgFunction() { + class SetTextForeColor(val videoCard: PeripheralVideoCard) : OneArgFunction() { override fun call(arg: LuaValue): LuaValue { - videoCard.foreColor = arg.checkint() + videoCard.textColorFore = arg.checkint() return LuaValue.NONE } } - class GetForeColor(val videoCard: PeripheralVideoCard) : ZeroArgFunction() { + class GetTextForeColor(val videoCard: PeripheralVideoCard) : ZeroArgFunction() { override fun call(): LuaValue { - return videoCard.foreColor.toLua() + return videoCard.textColorFore.toLua() } } - class SetBackColor(val videoCard: PeripheralVideoCard) : OneArgFunction() { + class SetTextBackColor(val videoCard: PeripheralVideoCard) : OneArgFunction() { override fun call(arg: LuaValue): LuaValue { - videoCard.backColor = arg.checkint() + videoCard.textColorBack = arg.checkint() return LuaValue.NONE } } - class GetBackColor(val videoCard: PeripheralVideoCard) : ZeroArgFunction() { + class GetTextBackColor(val videoCard: PeripheralVideoCard) : ZeroArgFunction() { override fun call(): LuaValue { - return videoCard.backColor.toLua() + return videoCard.textColorBack.toLua() + } + } + class SetDrawColor(val videoCard: PeripheralVideoCard) : OneArgFunction() { + override fun call(arg: LuaValue): LuaValue { + videoCard.color = arg.checkint() + return LuaValue.NONE + } + } + class GetDrawColor(val videoCard: PeripheralVideoCard) : ZeroArgFunction() { + override fun call(): LuaValue { + return videoCard.color.toLua() + } + } + class GetWidth(val videoCard: PeripheralVideoCard) : ZeroArgFunction() { + override fun call(): LuaValue { + return videoCard.width.toLua() + } + } + class GetHeight(val videoCard: PeripheralVideoCard) : ZeroArgFunction() { + override fun call(): LuaValue { + return videoCard.height.toLua() } } class EmitChar(val videoCard: PeripheralVideoCard) : ThreeArgFunction() { @@ -326,6 +397,41 @@ class PeripheralVideoCard(val termW: Int = 40, val termH: Int = 25) : return videoCard.luaSpriteTable[arg.checkint() - 1] } } + class DrawRectBack(val videoCard: PeripheralVideoCard) : FourArgFunction() { + override fun call(arg1: LuaValue, arg2: LuaValue, arg3: LuaValue, arg4: LuaValue): LuaValue { + videoCard.drawRectBack(arg1.checkint(), arg2.checkint(), arg3.checkint(), arg4.checkint()) + return LuaValue.NONE + } + } + class FillRectBack(val videoCard: PeripheralVideoCard) : FourArgFunction() { + override fun call(arg1: LuaValue, arg2: LuaValue, arg3: LuaValue, arg4: LuaValue): LuaValue { + videoCard.fillRectBack(arg1.checkint(), arg2.checkint(), arg3.checkint(), arg4.checkint()) + return LuaValue.NONE + } + } + class DrawRectFore(val videoCard: PeripheralVideoCard) : FourArgFunction() { + override fun call(arg1: LuaValue, arg2: LuaValue, arg3: LuaValue, arg4: LuaValue): LuaValue { + videoCard.drawRectFore(arg1.checkint(), arg2.checkint(), arg3.checkint(), arg4.checkint()) + return LuaValue.NONE + } + } + class FillRectFore(val videoCard: PeripheralVideoCard) : FourArgFunction() { + override fun call(arg1: LuaValue, arg2: LuaValue, arg3: LuaValue, arg4: LuaValue): LuaValue { + videoCard.fillRectFore(arg1.checkint(), arg2.checkint(), arg3.checkint(), arg4.checkint()) + return LuaValue.NONE + } + } + class DrawString(val videoCard: PeripheralVideoCard) : ThreeArgFunction() { + override fun call(arg1: LuaValue, arg2: LuaValue, arg3: LuaValue): LuaValue { + val str = arg1.checkjstring() + val x = arg2.checkint() + val y = arg3.checkint() + str.forEachIndexed { i, c -> + videoCard.drawChar(c, x + blockW * i, y) + } + return LuaValue.NONE + } + } ///////////// // Sprites // @@ -404,7 +510,7 @@ class VRAM(pxlWidth: Int, pxlHeight: Int, nSprites: Int) { fun setForegroundPixel(x: Int, y: Int, color: Int) { val col = CLUT[color] - background.setRGBA(x, y, col.red, col.green, col.blue, col.alpha) + foreground.setRGBA(x, y, col.red, col.green, col.blue, col.alpha) } } @@ -467,4 +573,27 @@ class VSprite { setPixel(i % width, i / width, data[i]) } } -} \ No newline at end of file +} + + +abstract class FourArgFunction : LibFunction() { + + abstract override fun call(arg1: LuaValue, arg2: LuaValue, arg3: LuaValue, arg4: LuaValue): LuaValue + + override fun call(): LuaValue { + return call(LuaValue.NIL, LuaValue.NIL, LuaValue.NIL, LuaValue.NIL) + } + + override fun call(arg: LuaValue): LuaValue { + return call(arg, LuaValue.NIL, LuaValue.NIL, LuaValue.NIL) + } + + override fun call(arg1: LuaValue, arg2: LuaValue): LuaValue { + return call(arg1, arg2, LuaValue.NIL, LuaValue.NIL) + } + + override fun invoke(varargs: Varargs): Varargs { + return call(varargs.arg1(), varargs.arg(2), varargs.arg(3), varargs.arg(4)) + } + +} diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/GraphicsTerminal.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/GraphicsTerminal.kt index 36222c199..33cd828b2 100644 --- a/src/net/torvald/terrarum/virtualcomputer/terminal/GraphicsTerminal.kt +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/GraphicsTerminal.kt @@ -2,7 +2,9 @@ package net.torvald.terrarum.virtualcomputer.terminal import net.torvald.terrarum.blendMul import net.torvald.terrarum.gameactors.DecodeTapestry -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.gameactors.abs +import net.torvald.terrarum.gamecontroller.Key +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.peripheral.PeripheralVideoCard import org.newdawn.slick.Color import org.newdawn.slick.GameContainer @@ -15,12 +17,12 @@ import org.newdawn.slick.Image * * Created by SKYHi14 on 2017-02-08. */ -class GraphicsTerminal(private val host: BaseTerrarumComputer) : Terminal { +class GraphicsTerminal(private val host: TerrarumComputer) : Terminal { lateinit var videoCard: PeripheralVideoCard override val width: Int; get() = videoCard.termW override val height: Int; get() = videoCard.termH - override val coloursCount: Int; get() = videoCard.coloursCount + override val coloursCount: Int; get() = videoCard.colorsCount override var cursorX = 0 override var cursorY = 0 override var cursorBlink = true @@ -78,7 +80,7 @@ class GraphicsTerminal(private val host: BaseTerrarumComputer) : Terminal { } override fun keyPressed(key: Int, c: Char) { - //TODO("not implemented") + host.keyPressed(key, c) } override fun writeChars(s: String) { @@ -97,7 +99,9 @@ class GraphicsTerminal(private val host: BaseTerrarumComputer) : Terminal { override fun emitChar(bufferChar: Int, x: Int, y: Int) { videoCard.drawChar( - bufferChar.and(0xFF).toChar(), x, y, + bufferChar.and(0xFF).toChar(), + x * PeripheralVideoCard.blockW, + y * PeripheralVideoCard.blockH, CLUT16_TO_64[bufferChar.ushr(8).and(0xF)], CLUT16_TO_64[bufferChar.ushr(12).and(0xF)] ) @@ -117,7 +121,12 @@ class GraphicsTerminal(private val host: BaseTerrarumComputer) : Terminal { override var lastKeyPress: Int? = null override fun emitChar(c: Char, x: Int, y: Int) { - videoCard.drawChar(c, x, y, CLUT16_TO_64[foreColour]) + videoCard.drawChar( + c, + x * PeripheralVideoCard.blockW, + y * PeripheralVideoCard.blockH, + CLUT16_TO_64[foreColour] + ) } override fun printChar(c: Char) { @@ -167,7 +176,7 @@ class GraphicsTerminal(private val host: BaseTerrarumComputer) : Terminal { } override fun clear() { - videoCard.clearAll() + videoCard.clearForeground() } override fun clearLine() { @@ -175,11 +184,28 @@ class GraphicsTerminal(private val host: BaseTerrarumComputer) : Terminal { } override fun newLine() { - //TODO("not implemented") + cursorX = 0; cursorY += 1; wrap() } override fun scroll(amount: Int) { - //TODO("not implemented") + val rgba = videoCard.vram.foreground.rgba + val displacement = amount.abs() * PeripheralVideoCard.blockH * videoCard.vram.foreground.texWidth * 4 + if (amount >= 0) { + System.arraycopy( + rgba, displacement, + rgba, 0, + rgba.size - displacement + ) + (rgba.size - 1 downTo rgba.size - displacement + 1).forEach { rgba[it] = 0.toByte() } + } + else { + System.arraycopy( + rgba, 0, + rgba, displacement, + rgba.size - displacement + ) + (0..displacement - 1).forEach { rgba[it] = 0.toByte() } + } } /** diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/SimpleTextTerminal.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/SimpleTextTerminal.kt index e5dfa66e5..7b3032af4 100644 --- a/src/net/torvald/terrarum/virtualcomputer/terminal/SimpleTextTerminal.kt +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/SimpleTextTerminal.kt @@ -1,12 +1,11 @@ package net.torvald.terrarum.virtualcomputer.terminal import net.torvald.aa.AAFrame -import net.torvald.aa.ColouredFastFont import net.torvald.terrarum.* import net.torvald.terrarum.gameactors.DecodeTapestry import net.torvald.terrarum.gameactors.abs import net.torvald.terrarum.gamecontroller.Key -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import org.lwjgl.BufferUtils import org.lwjgl.openal.AL import org.lwjgl.openal.AL10 @@ -21,7 +20,7 @@ import java.util.* * Created by minjaesong on 16-09-07. */ open class SimpleTextTerminal( - phosphorColour: Color, override val width: Int, override val height: Int, private val host: BaseTerrarumComputer, + phosphorColour: Color, override val width: Int, override val height: Int, private val host: TerrarumComputer, colour: Boolean = false, hires: Boolean = false ) : Terminal { @@ -64,7 +63,7 @@ open class SimpleTextTerminal( open protected val fontImg = Image(fontRef) open val fontW = fontImg.width / 16 open val fontH = fontImg.height / 16 - open protected val font = ColouredFastFont(this, fontRef, fontW, fontH) + open protected val font = SpriteSheetFont(SpriteSheet(fontRef, fontW, fontH), 0.toChar()) val borderSize = 20 override val displayW = fontW * width + 2 * borderSize diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalInputStream.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalInputStream.kt index 24cc1d614..ffcbb4a57 100644 --- a/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalInputStream.kt +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalInputStream.kt @@ -1,13 +1,42 @@ package net.torvald.terrarum.virtualcomputer.terminal -import org.lwjgl.input.Keyboard +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import java.io.InputStream /** * Created by minjaesong on 16-09-10. */ -class TerminalInputStream(val term: Teletype) : InputStream() { +class TerminalInputStream(val host: TerrarumComputer) : InputStream() { + + private val pauseLock = java.lang.Object() + override fun read(): Int { - return -1 + System.err.println("TerminalInputStream.read called") + + //System.err.println(Thread.currentThread().name) + // would display "LuaJ Separated", which means this InputStream will not block main thread + + + host.openStdin() + + + synchronized(this) { + (this as java.lang.Object).wait() + } + + System.err.println("TerminalInputStream.read exit") + + + + return host.stdinInput } + + override fun read(b: ByteArray?): Int { + TODO() + } + + override fun read(b: ByteArray?, off: Int, len: Int): Int { + TODO() + } + } \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalPrintStream.kt b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalPrintStream.kt index 66d6c4045..0da8f079a 100644 --- a/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalPrintStream.kt +++ b/src/net/torvald/terrarum/virtualcomputer/terminal/TerminalPrintStream.kt @@ -1,15 +1,14 @@ package net.torvald.terrarum.virtualcomputer.terminal +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import java.io.OutputStream import java.io.PrintStream /** * Created by minjaesong on 16-09-10. */ -class TerminalPrintStream(val term: Teletype) : PrintStream(TerminalOutputStream(term)) { +class TerminalPrintStream(val host: TerrarumComputer) : PrintStream(TerminalOutputStream(host)) -} - -class TerminalOutputStream(val term: Teletype) : OutputStream() { - override fun write(b: Int) = term.printChar(b.and(0xFF).toChar()) +class TerminalOutputStream(val host: TerrarumComputer) : OutputStream() { + override fun write(b: Int) = host.term.printChar(b.and(0xFF).toChar()) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureBasicTerminal.kt b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureBasicTerminal.kt index 45b087e70..0b5c8bd44 100644 --- a/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureBasicTerminal.kt +++ b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureBasicTerminal.kt @@ -2,7 +2,7 @@ package net.torvald.terrarum.virtualcomputer.worldobject import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.FixtureBase -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal import net.torvald.terrarum.virtualcomputer.terminal.Terminal import net.torvald.terrarum.virtualcomputer.worldobject.ui.UITextTerminal @@ -14,7 +14,7 @@ import java.util.* */ class FixtureBasicTerminal(phosphor: Color) : FixtureBase() { - val computer = BaseTerrarumComputer(8) + val computer = TerrarumComputer(8) val vt: Terminal = SimpleTextTerminal(phosphor, 80, 25, computer) val ui = UITextTerminal(vt) diff --git a/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureComputerBase.kt b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureComputerBase.kt index f563148f2..ae694720c 100644 --- a/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureComputerBase.kt +++ b/src/net/torvald/terrarum/virtualcomputer/worldobject/FixtureComputerBase.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum.virtualcomputer.worldobject import net.torvald.terrarum.gameactors.FixtureBase -import net.torvald.terrarum.virtualcomputer.computer.BaseTerrarumComputer +import net.torvald.terrarum.virtualcomputer.computer.TerrarumComputer import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal import net.torvald.terrarum.virtualcomputer.terminal.Terminal import org.newdawn.slick.GameContainer @@ -17,7 +17,7 @@ open class FixtureComputerBase() : FixtureBase() { /** Connected terminal */ var terminal: FixtureBasicTerminal? = null - var computerInside: BaseTerrarumComputer? = null + var computerInside: TerrarumComputer? = null init { // UUID of the "brain" @@ -33,7 +33,7 @@ open class FixtureComputerBase() : FixtureBase() { fun attachTerminal(uuid: String) { val fetchedTerminal = getTerminalByUUID(uuid) - computerInside = BaseTerrarumComputer(8) + computerInside = TerrarumComputer(8) computerInside!!.attachTerminal(fetchedTerminal!!) actorValue["computerid"] = computerInside!!.UUID } diff --git a/work_files/UI/.gitattributes b/work_files/UI/.gitattributes new file mode 100644 index 000000000..ca82ef549 --- /dev/null +++ b/work_files/UI/.gitattributes @@ -0,0 +1 @@ +*.{psd,tga,ogg} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file