()
-
- // read prop in csv
+ // read prop in csv and fill itemCodex
+ // read from save (if applicable) and fill dynamicItemDescription
}
fun getProp(code: Int): InventoryItem {
- if (code < ITEM_UNIQUE_MAX) // generic item
- return itemCodex[code]
+ if (code < ITEM_STATIC_MAX) // generic item
+ return itemCodex[code] // from CSV
+ else if (code < ITEM_DYNAMIC_MAX) {
+ TODO("read from dynamicitem description (JSON)")
+ }
else {
val a = Terrarum.ingame.getActorByID(code) // actor item
if (a is CanBeAnItem) return a.itemData
@@ -41,4 +49,6 @@ object ItemPropCodex {
throw IllegalArgumentException("Attempted to get item data of actor that cannot be an item. ($a)")
}
}
+
+ fun hasItem(itemID: Int): Boolean = dynamicItemDescription.containsKey(itemID)
}
\ No newline at end of file
diff --git a/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt b/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt
index 314101280..1253f7d9a 100644
--- a/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt
+++ b/src/net/torvald/terrarum/mapdrawer/LightmapRenderer.kt
@@ -191,6 +191,8 @@ object LightmapRenderer {
}
}
+ // O(36n) == O(n) where n is a size of the map.
+ // Because of inevitable overlaps on the area, it only works with ADDITIVE blend (aka maxblend)
try {
// Round 1
for (y in for_y_start - overscan_open..for_y_end) {
@@ -230,6 +232,8 @@ object LightmapRenderer {
private fun calculate(x: Int, y: Int): Int = calculate(x, y, false)
private fun calculate(x: Int, y: Int, doNotCalculateAmbient: Boolean): Int {
+ // O(9n) == O(n) where n is a size of the map.
+
var lightLevelThis: Int = 0
val thisTerrain = Terrarum.ingame.world.getTileFromTerrain(x, y)
val thisWall = Terrarum.ingame.world.getTileFromWall(x, y)
diff --git a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt
index 40b84f2be..ff2796077 100644
--- a/src/net/torvald/terrarum/mapdrawer/MapCamera.kt
+++ b/src/net/torvald/terrarum/mapdrawer/MapCamera.kt
@@ -1,14 +1,14 @@
package net.torvald.terrarum.mapdrawer
-import net.torvald.terrarum.gamemap.GameWorld
-import net.torvald.terrarum.gamemap.PairedMapLayer
+import net.torvald.terrarum.gameworld.GameWorld
+import net.torvald.terrarum.gameworld.PairedMapLayer
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.tileproperties.TileNameCode
import net.torvald.terrarum.tileproperties.TilePropCodex
import com.jme3.math.FastMath
import net.torvald.terrarum.concurrent.ThreadPool
-import net.torvald.terrarum.setBlendMul
-import net.torvald.terrarum.setBlendNormal
+import net.torvald.terrarum.blendMul
+import net.torvald.terrarum.blendNormal
import org.lwjgl.opengl.GL11
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
@@ -247,15 +247,15 @@ object MapCamera {
/**
* render to camera
*/
- setBlendNormal()
+ blendNormal()
drawTiles(WALL, false)
drawTiles(TERRAIN, false)
}
fun renderFront(gc: GameContainer, g: Graphics) {
- setBlendMul()
+ blendMul()
drawTiles(TERRAIN, true)
- setBlendNormal()
+ blendNormal()
}
private fun drawTiles(mode: Int, drawModeTilesBlendMul: Boolean) {
diff --git a/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt b/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt
index 1e3369187..552d5720c 100644
--- a/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt
+++ b/src/net/torvald/terrarum/mapdrawer/MapDrawer.kt
@@ -1,6 +1,6 @@
package net.torvald.terrarum.mapdrawer
-import net.torvald.terrarum.gamemap.GameWorld
+import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.tileproperties.TileNameCode
import net.torvald.terrarum.tilestats.TileStats
diff --git a/src/net/torvald/terrarum/mapgenerator/WorldGenerator.kt b/src/net/torvald/terrarum/mapgenerator/WorldGenerator.kt
index 88a87c653..119c84f3d 100644
--- a/src/net/torvald/terrarum/mapgenerator/WorldGenerator.kt
+++ b/src/net/torvald/terrarum/mapgenerator/WorldGenerator.kt
@@ -1,7 +1,7 @@
package net.torvald.terrarum.mapgenerator
import net.torvald.random.HQRNG
-import net.torvald.terrarum.gamemap.GameWorld
+import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.tileproperties.TileNameCode
import com.jme3.math.FastMath
import com.sudoplay.joise.Joise
diff --git a/src/net/torvald/terrarum/tileproperties/TileProp.kt b/src/net/torvald/terrarum/tileproperties/TileProp.kt
index 8811a6a3f..935672d19 100644
--- a/src/net/torvald/terrarum/tileproperties/TileProp.kt
+++ b/src/net/torvald/terrarum/tileproperties/TileProp.kt
@@ -1,7 +1,7 @@
package net.torvald.terrarum.tileproperties
import net.torvald.terrarum.Terrarum
-import net.torvald.terrarum.gamemap.WorldTime
+import net.torvald.terrarum.gameworld.WorldTime
/**
* Created by minjaesong on 16-02-16.
diff --git a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt
index 1af0fa1b2..6fb9611e8 100644
--- a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt
+++ b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt
@@ -1,8 +1,8 @@
package net.torvald.terrarum.tileproperties
import net.torvald.CSVFetcher
-import net.torvald.terrarum.gamemap.MapLayer
-import net.torvald.terrarum.gamemap.PairedMapLayer
+import net.torvald.terrarum.gameworld.MapLayer
+import net.torvald.terrarum.gameworld.PairedMapLayer
import org.apache.commons.csv.CSVRecord
import java.io.IOException
diff --git a/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt b/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt
index c4f8a7129..10f5b1261 100644
--- a/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt
+++ b/src/net/torvald/terrarum/tileproperties/TilePropUtil.kt
@@ -3,7 +3,7 @@ package net.torvald.terrarum.tileproperties
import com.jme3.math.FastMath
import net.torvald.random.HQRNG
import net.torvald.terrarum.Terrarum
-import net.torvald.terrarum.gamemap.WorldTime
+import net.torvald.terrarum.gameworld.WorldTime
import net.torvald.terrarum.mapdrawer.LightmapRenderer
import net.torvald.terrarum.toInt
import net.torvald.terrarum.weather.WeatherMixer
diff --git a/src/net/torvald/terrarum/tilestats/TileStats.kt b/src/net/torvald/terrarum/tilestats/TileStats.kt
index 747d17d4f..30e2afbd4 100644
--- a/src/net/torvald/terrarum/tilestats/TileStats.kt
+++ b/src/net/torvald/terrarum/tilestats/TileStats.kt
@@ -1,8 +1,8 @@
package net.torvald.terrarum.tilestats
import net.torvald.terrarum.gameactors.Player
-import net.torvald.terrarum.gamemap.GameWorld
-import net.torvald.terrarum.gamemap.MapLayer
+import net.torvald.terrarum.gameworld.GameWorld
+import net.torvald.terrarum.gameworld.MapLayer
import net.torvald.terrarum.mapdrawer.MapCamera
import net.torvald.terrarum.mapdrawer.MapDrawer
import net.torvald.terrarum.Terrarum
diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt
index 59d009ebe..3c0af8471 100644
--- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt
+++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt
@@ -2,14 +2,14 @@ package net.torvald.terrarum.ui
import com.jme3.math.FastMath
import net.torvald.imagefont.GameFontBase
-import net.torvald.terrarum.gamemap.PairedMapLayer
+import net.torvald.terrarum.gameworld.PairedMapLayer
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.mapdrawer.LightmapRenderer
import net.torvald.terrarum.mapdrawer.MapCamera
import net.torvald.terrarum.mapdrawer.MapDrawer
import net.torvald.terrarum.Terrarum
-import net.torvald.terrarum.setBlendNormal
-import net.torvald.terrarum.setBlendScreen
+import net.torvald.terrarum.blendNormal
+import net.torvald.terrarum.blendScreen
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
@@ -201,7 +201,7 @@ class BasicDebugInfoWindow : UICanvas {
g.drawString("255", x.toFloat() + w + 1 - 8*3, y.toFloat() + h + 2)
g.drawString("Histogramme", x + w / 2 - 5.5f * 8, y.toFloat() + h + 2)
- setBlendScreen()
+ blendScreen()
for (c in 0..2) {
for (i in 0..255) {
var histogram_value = if (i == 255) 0 else histogram.get(c)[i]
@@ -220,7 +220,7 @@ class BasicDebugInfoWindow : UICanvas {
g.fillRect(bar_x, bar_y, bar_w, bar_h)
}
}
- setBlendNormal()
+ blendNormal()
}
private fun line(i: Int): Float = i * 10f
diff --git a/src/net/torvald/terrarum/ui/ConsoleWindow.kt b/src/net/torvald/terrarum/ui/ConsoleWindow.kt
index 2e4fd1890..3b1418185 100644
--- a/src/net/torvald/terrarum/ui/ConsoleWindow.kt
+++ b/src/net/torvald/terrarum/ui/ConsoleWindow.kt
@@ -84,7 +84,7 @@ class ConsoleWindow : UICanvas, KeyboardControlled {
historyIndex = -1
// execute
- if (key == Key.RET && commandInputPool!!.length > 0) {
+ if (key == Key.RETURN && commandInputPool!!.length > 0) {
commandHistory.add(commandInputPool!!.toString())
executeCommand()
commandInputPool = StringBuilder()
diff --git a/src/net/torvald/terrarum/ui/ItemSlotImageBuilder.kt b/src/net/torvald/terrarum/ui/ItemSlotImageBuilder.kt
index 6c447e9b0..0afe31d2b 100644
--- a/src/net/torvald/terrarum/ui/ItemSlotImageBuilder.kt
+++ b/src/net/torvald/terrarum/ui/ItemSlotImageBuilder.kt
@@ -1,6 +1,6 @@
package net.torvald.terrarum.ui
-import net.torvald.terrarum.setBlendNormal
+import net.torvald.terrarum.blendNormal
import org.newdawn.slick.Color
import org.newdawn.slick.Image
import org.newdawn.slick.SpriteSheet
diff --git a/src/net/torvald/terrarum/ui/MessageWindow.kt b/src/net/torvald/terrarum/ui/MessageWindow.kt
index d035e2dd6..47b8ad152 100644
--- a/src/net/torvald/terrarum/ui/MessageWindow.kt
+++ b/src/net/torvald/terrarum/ui/MessageWindow.kt
@@ -2,8 +2,8 @@ package net.torvald.terrarum.ui
import net.torvald.imagefont.GameFontWhite
import com.jme3.math.FastMath
-import net.torvald.terrarum.setBlendDisable
-import net.torvald.terrarum.setBlendNormal
+import net.torvald.terrarum.blendDisable
+import net.torvald.terrarum.blendNormal
import org.lwjgl.opengl.GL11
import org.newdawn.slick.*
@@ -55,7 +55,7 @@ constructor(override var width: Int, isBlackVariant: Boolean) : UICanvas {
}
override fun render(gc: GameContainer, g: Graphics) {
- setBlendDisable()
+ blendDisable()
drawSegments(g)
g.setDrawMode(Graphics.MODE_ALPHA_MAP)
@@ -69,7 +69,7 @@ constructor(override var width: Int, isBlackVariant: Boolean) : UICanvas {
g.drawString(messagesList[i], (messageWindowRadius + 4).toFloat(), (messageWindowRadius + GLYPH_HEIGHT * i).toFloat())
}
- setBlendNormal()
+ blendNormal()
}
override fun processInput(input: Input) {
diff --git a/src/net/torvald/terrarum/ui/UICanvas.kt b/src/net/torvald/terrarum/ui/UICanvas.kt
index 085204df5..ee8b63512 100644
--- a/src/net/torvald/terrarum/ui/UICanvas.kt
+++ b/src/net/torvald/terrarum/ui/UICanvas.kt
@@ -49,4 +49,6 @@ interface UICanvas {
* Do not modify handler!!.openCloseCounter here.
*/
fun endClosing(gc: GameContainer, delta: Int)
-}
\ No newline at end of file
+}
+
+const val OPENCLOSE_GENERIC = 200
\ No newline at end of file
diff --git a/src/net/torvald/terrarum/virtualcomputers/API.kt b/src/net/torvald/terrarum/virtualcomputers/API.kt
new file mode 100644
index 000000000..f1976bd45
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/API.kt
@@ -0,0 +1,10 @@
+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/LuaConsole.java b/src/net/torvald/terrarum/virtualcomputers/terminal/LuaConsole.java
new file mode 100644
index 000000000..c42a0eeb8
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/terminal/LuaConsole.java
@@ -0,0 +1,194 @@
+/*
+ * $Id: LuaConsole.java 79 2012-01-08 11:08:32Z andre@naef.com $
+ * See LICENSE.txt for license terms.
+ */
+
+package net.torvald.terrarum.virtualcomputers.terminal;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+import li.cil.repack.com.naef.jnlua.LuaException;
+import li.cil.repack.com.naef.jnlua.LuaRuntimeException;
+import li.cil.repack.com.naef.jnlua.LuaState;
+
+/**
+ * A simple Lua console.
+ *
+ *
+ * The console collects input until a line with the sole content of the word
+ * go is encountered. At that point, the collected input is run as a Lua
+ * chunk. If the Lua chunk loads and runs successfully, the console displays the
+ * returned values of the chunk as well as the execution time based on a
+ * System.nanoTime() measurement. Otherwise, the console shows the
+ * error that has occurred.
+ *
+ *
+ *
+ * Expressions can be printed by prepending = to the expression at the
+ * beginning of a chunk. The console translates = into
+ * return followed by a space and executes the chunk immediately.
+ * No separate go is required. Therefore, expressions printed this way
+ * must be entered on a single line.
+ *
+ */
+public class LuaConsole {
+ // -- 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);
+ }
+
+ // -- State
+ private LuaState luaState;
+
+ // -- Construction
+ /**
+ * Creates a new instance.
+ */
+ public LuaConsole() {
+ this(EMPTY_ARGS);
+ }
+
+ /**
+ * Creates a new instance with the specified command line arguments. The
+ * arguments are passed to Lua as the argv global variable.
+ *
+ * @param args
+ */
+ public LuaConsole(String[] args) {
+ 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
+ System.out.println(String.format("JNLua %s Console using Lua %s.",
+ LuaState.VERSION, LuaState.LUA_VERSION));
+ System.out.print("Type 'go' on an empty line to evaluate a chunk. ");
+ System.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) {
+ System.out.print("IO error: ");
+ System.out.print(e.getMessage());
+ System.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) {
+ System.out.print(", ");
+ }
+ switch (luaState.type(i)) {
+ case BOOLEAN:
+ System.out.print(Boolean.valueOf(luaState.toBoolean(i)));
+ break;
+ case NUMBER:
+ case STRING:
+ System.out.print(luaState.toString(i));
+ break;
+ default:
+ System.out.print(luaState.typeName(i));
+ }
+ }
+ System.out.print("\t#msec=");
+ System.out.print(String.format("%.3f", (stop - start) / 1000000.0));
+ System.out.println();
+ } catch (LuaRuntimeException e) {
+ e.printLuaStackTrace();
+ } catch (LuaException e) {
+ System.err.println(e.getMessage());
+ }
+ }
+}
diff --git a/src/net/torvald/terrarum/virtualcomputers/terminal/SimpleTextTerminal.kt b/src/net/torvald/terrarum/virtualcomputers/terminal/SimpleTextTerminal.kt
new file mode 100644
index 000000000..7c001f380
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/terminal/SimpleTextTerminal.kt
@@ -0,0 +1,259 @@
+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/terminal/Terminal.kt b/src/net/torvald/terrarum/virtualcomputers/terminal/Terminal.kt
new file mode 100644
index 000000000..11c995e59
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/terminal/Terminal.kt
@@ -0,0 +1,56 @@
+package net.torvald.terrarum.virtualcomputers.terminal
+
+import org.newdawn.slick.Color
+import org.newdawn.slick.GameContainer
+import org.newdawn.slick.Graphics
+import org.newdawn.slick.Input
+
+/**
+ * A tty (terminal)
+ *
+ * Framebuffer : use net.torvald.aa.AAFrame
+ *
+ * Background color is fixed; text color is variable
+ *
+ * Created by minjaesong on 16-09-07.
+ */
+interface Terminal {
+ val width: Int
+ val height: Int
+ val coloursCount: Int
+ var cursorX: Int
+ var cursorY: Int
+ var cursorBlink: Boolean
+ var backColour: Int
+ var foreColour: 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)
+
+ // API calls
+ fun setCursor(x: Int, y: Int)
+ /** Emits a bufferChar. Does not move cursor */
+ fun emitChar(bufferChar: Int)
+ /** Emits a char. Does not move cursor */
+ fun emitChar(c: Char)
+ /** Prints a char and move cursor accordingly. */
+ fun printChar(c: Char)
+ /** Emits a string. Does not move cursor */
+ fun emitString(s: String)
+ /** Emits a string and move cursor accordingly. */
+ fun printString(s: String, x: Int = cursorX, y: Int = cursorY)
+ fun clear()
+ fun clearLine()
+ fun scroll(amount: Int = 1)
+ fun setColour(back: Int, fore: Int)
+ fun resetColour()
+ fun beep(freq: Int = 1000, duration: Int = 200)
+}
\ 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
new file mode 100644
index 000000000..be02165ea
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/worldobject/ComputerPartsCodex.kt
@@ -0,0 +1,29 @@
+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/FixturesBasicTerminal.kt b/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesBasicTerminal.kt
new file mode 100644
index 000000000..5a88f0cd3
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesBasicTerminal.kt
@@ -0,0 +1,25 @@
+package net.torvald.terrarum.virtualcomputers.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 org.newdawn.slick.Color
+import java.util.*
+
+/**
+ * Created by minjaesong on 16-09-08.
+ */
+class FixturesBasicTerminal(phosphor: Color) : FixturesBase() {
+
+ val terminal: Terminal = SimpleTextTerminal(phosphor, 80, 25)
+ val ui = UITextTerminal(terminal)
+
+ init {
+ collisionFlag = COLLISION_PLATFORM
+
+ actorValue[AVKey.UUID] = UUID.randomUUID().toString()
+ }
+
+}
\ 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
new file mode 100644
index 000000000..7d30d7da7
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/worldobject/FixturesComputerBase.kt
@@ -0,0 +1,51 @@
+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/src/net/torvald/terrarum/virtualcomputers/worldobject/ui/UITextTerminal.kt b/src/net/torvald/terrarum/virtualcomputers/worldobject/ui/UITextTerminal.kt
new file mode 100644
index 000000000..381e871f2
--- /dev/null
+++ b/src/net/torvald/terrarum/virtualcomputers/worldobject/ui/UITextTerminal.kt
@@ -0,0 +1,90 @@
+package net.torvald.terrarum.virtualcomputers.worldobject.ui
+
+import net.torvald.terrarum.ui.*
+import net.torvald.terrarum.virtualcomputers.terminal.Terminal
+import org.newdawn.slick.GameContainer
+import org.newdawn.slick.Graphics
+import org.newdawn.slick.Image
+import org.newdawn.slick.Input
+
+/**
+ * Created by minjaesong on 16-09-08.
+ */
+class UITextTerminal(val terminal: Terminal) : UICanvas, KeyboardControlled, MouseControlled {
+ override fun mouseMoved(oldx: Int, oldy: Int, newx: Int, newy: Int) {
+ throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override fun keyPressed(key: Int, c: Char) {
+ throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override fun keyReleased(key: Int, c: Char) {
+ throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override fun mouseDragged(oldx: Int, oldy: Int, newx: Int, newy: Int) {
+ throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
+ }
+
+ override var width: Int = terminal.displayW// + some
+ override var height: Int = terminal.displayH// + frame
+ private var terminalDisplay = Image(terminal.displayW, terminal.displayH)
+
+ override fun mousePressed(button: Int, x: Int, y: Int) {
+ // monitor on/off, reset switch
+ }
+
+ override fun mouseReleased(button: Int, x: Int, y: Int) {
+ }
+
+ override fun mouseWheelMoved(change: Int) {
+ }
+
+ /**
+ * Usage: (in StateInGame:) uiHandlerField.ui.handler = uiHandlerField
+ */
+ override var handler: UIHandler? = null
+
+ /**
+ * In milliseconds
+ *
+ * Timer itself is implemented in the handler.
+ */
+ override var openCloseTime: Int = OPENCLOSE_GENERIC
+
+ override fun update(gc: GameContainer, delta: Int) {
+ terminal.update(gc, delta)
+ }
+
+ override fun render(gc: GameContainer, g: Graphics) {
+ terminal.render(gc, terminalDisplay.graphics)
+ }
+
+ override fun processInput(input: Input) {
+ }
+
+ /**
+ * Do not modify handler!!.openCloseCounter here.
+ */
+ override fun doOpening(gc: GameContainer, delta: Int) {
+ }
+
+ /**
+ * Do not modify handler!!.openCloseCounter here.
+ */
+ override fun doClosing(gc: GameContainer, delta: Int) {
+ }
+
+ /**
+ * Do not modify handler!!.openCloseCounter here.
+ */
+ override fun endOpening(gc: GameContainer, delta: Int) {
+ }
+
+ /**
+ * Do not modify handler!!.openCloseCounter here.
+ */
+ override fun endClosing(gc: GameContainer, delta: Int) {
+ }
+}
\ No newline at end of file
diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt
index 360722320..121c3ca62 100644
--- a/src/net/torvald/terrarum/weather/WeatherMixer.kt
+++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt
@@ -6,7 +6,7 @@ import net.torvald.colourutil.CIELChUtil
import net.torvald.colourutil.ColourUtil
import net.torvald.random.HQRNG
import net.torvald.terrarum.Terrarum
-import net.torvald.terrarum.gamemap.WorldTime
+import net.torvald.terrarum.gameworld.WorldTime
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
@@ -96,6 +96,9 @@ object WeatherMixer {
globalLightNow.b = gradCol.b
}
+ /**
+ * Get a GL of specific time
+ */
fun getGlobalLightOfTime(timeInSec: Int): Color =
getGradientColour(currentWeather.globalLightColourMap, 0, timeInSec)
diff --git a/src/org/dyn4j/geometry/Vector2.kt b/src/org/dyn4j/geometry/Vector2.kt
index 95902b369..114a4b664 100644
--- a/src/org/dyn4j/geometry/Vector2.kt
+++ b/src/org/dyn4j/geometry/Vector2.kt
@@ -23,7 +23,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
- * Kotlin translated and modified code Copyright (c) 2016 Torvald aka skyhi14.
+ * Kotlin translated and modified code Copyright (c) 2016 Minjaesong (Torvald).
*/
package org.dyn4j.geometry