LibGDX, here I am.

This commit is contained in:
minjaesong
2017-06-22 02:31:07 +09:00
parent ae00e2b8a6
commit 8e5e95e5a9
356 changed files with 3125 additions and 21138 deletions

View File

@@ -1,16 +1,13 @@
package net.torvald.aa
import net.torvald.terrarum.gameworld.toUint
import net.torvald.terrarum.virtualcomputer.terminal.SimpleTextTerminal
import org.newdawn.slick.*
/**
* @param terminal: for sending redraw only
*
* Created by minjaesong on 16-08-10.
*/
class AAFrame @Throws(SlickException::class)
constructor(var width: Int, var height: Int, var terminal: SimpleTextTerminal) {
/*class AAFrame(var width: Int, var height: Int, var terminal: SimpleTextTerminal) {
/**
* 0000_0000_00000000
@@ -94,4 +91,4 @@ constructor(var width: Int, var height: Int, var terminal: SimpleTextTerminal) {
private fun checkOOB(x: Int, y: Int) = (x < 0 || y < 0 || x >= width || y >= height)
fun getColourKey(x: Int, y: Int): Int = frameBuffer[y * width + x].toInt().ushr(8).and(0xFF)
}
}*/

View File

@@ -7,8 +7,7 @@ import net.torvald.colourutil.CIELabUtil.toLab
import net.torvald.colourutil.CIEXYZUtil.toXYZ
import net.torvald.colourutil.CIEXYZUtil.toColor
import net.torvald.colourutil.CIELabUtil.toXYZ
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* Cylindrical modification of CIELab colour space
*

View File

@@ -6,7 +6,7 @@ import net.torvald.colourutil.CIEXYZUtil.toColor
import net.torvald.colourutil.CIEXYZUtil.toRGB
import net.torvald.colourutil.CIEXYZUtil.toXYZ
import net.torvald.colourutil.CIELabUtil.toXYZ
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* A modification of CIEXYZ that is useful for surface colours

View File

@@ -1,7 +1,7 @@
package net.torvald.colourutil
import com.jme3.math.FastMath
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
import net.torvald.colourutil.CIELabUtil.toXYZ
import net.torvald.colourutil.CIEXYZUtil.toColor
import net.torvald.colourutil.CIEXYZUtil.toRGB

View File

@@ -1,7 +1,7 @@
package net.torvald.colourutil
import com.jme3.math.FastMath
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* Created by minjaesong on 2017-01-12.

View File

@@ -1,6 +1,6 @@
package net.torvald.colourutil
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* 6-Step RGB with builtin utils.
@@ -31,18 +31,18 @@ class Col216 : LimitedColours {
create(r, g, b)
}
override fun createSlickColor(raw: Int): Color {
override fun createGdxColor(raw: Int): Color {
assertRaw(raw)
val r = raw / MUL_2
val g = raw % MUL_2 / MUL
val b = raw % MUL
return createSlickColor(r, g, b)
return createGdxColor(r, g, b)
}
override fun createSlickColor(r: Int, g: Int, b: Int): Color {
override fun createGdxColor(r: Int, g: Int, b: Int): Color {
assertRGB(r, g, b)
return Color(LOOKUP[r], LOOKUP[g], LOOKUP[b])
return Color((LOOKUP[r] shl 24) + (LOOKUP[g] shl 16) + (LOOKUP[b] shl 8) + 255)
}
override fun create(raw: Int) {
@@ -55,7 +55,7 @@ class Col216 : LimitedColours {
raw = (MUL_2 * r + MUL * g + b).toByte()
}
override fun toSlickColour(): Color = createSlickColor(raw.toUint())
override fun toGdxColour(): Color = createGdxColor(raw.toUint())
private fun assertRaw(i: Int) {
if (i >= COLOUR_RANGE_SIZE || i < 0) {

View File

@@ -1,72 +0,0 @@
package com.torvald.colourutil
import org.newdawn.slick.Color
/**
* 40-Step RGB with builtin utils.
* Created by minjaesong on 16-02-20.
*/
class Col40 : LimitedColours {
var raw: Char = ' '
private set
override fun createSlickColor(raw: Int): Color {
assertRaw(raw)
val r = raw / MUL_2
val g = raw % MUL_2 / MUL
val b = raw % MUL
return createSlickColor(r, g, b)
}
override fun createSlickColor(r: Int, g: Int, b: Int): Color {
assertRGB(r, g, b)
return Color(LOOKUP[r] shl 16 or (LOOKUP[g] shl 8) or LOOKUP[b])
}
override fun create(raw: Int) {
assertRaw(raw)
this.raw = raw.toChar()
}
override fun create(r: Int, g: Int, b: Int) {
assertRGB(r, g, b)
raw = (MUL_2 * r + MUL * g + b).toChar()
}
constructor() {
}
constructor(c: Color) {
create(
Math.round(c.r * (MUL - 1)),
Math.round(c.g * (MUL - 1)),
Math.round(c.b * (MUL - 1)))
}
private fun assertRaw(i: Int) {
if (i >= COLOUR_DOMAIN_SIZE || i < 0) {
println("i: " + i.toString())
throw IllegalArgumentException()
}
}
private fun assertRGB(r: Int, g: Int, b: Int) {
if (r !in 0..MAX_STEP || g !in 0..MAX_STEP || b !in 0..MAX_STEP) {
println("r: " + r.toString())
println("g: " + g.toString())
println("b: " + b.toString())
throw IllegalArgumentException()
}
}
companion object {
@Transient private val LOOKUP = intArrayOf(0, 7, 13, 20, 26, 33, 39, 46, 52, 59, 65, 72, 78, 85, 92, 98, 105, 111, 118, 124, 131, 137, 144, 150, 157, 163, 170, 177, 183, 190, 196, 203, 209, 216, 222, 229, 235, 242, 248, 255)
const val MUL = 40
const val MUL_2 = MUL * MUL
const val MAX_STEP = MUL - 1
const val COLOUR_DOMAIN_SIZE = MUL_2 * MUL
}
}

View File

@@ -1,6 +1,6 @@
package net.torvald.colourutil
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* 12-bit (16-step) RGB with builtin utils.
@@ -41,7 +41,7 @@ class Col4096 : LimitedColours {
* *
* @return
*/
override fun createSlickColor(raw: Int): Color {
override fun createGdxColor(raw: Int): Color {
assertRaw(raw)
val a: Int
@@ -57,22 +57,22 @@ class Col4096 : LimitedColours {
a = raw and 0xF000 shr 12
return Color(
r.shl(4) or r, g.shl(4) or g, b.shl(4) or b, a.shl(4) or a)
(r.shl(4) or r).shl(24) + (g.shl(4) or g).shl(16) + (b.shl(4) or b).shl(8) + (a.shl(4) or a))
}
else {
return Color(
r.shl(4) or r, g.shl(4) or g, b.shl(4) or b)
(r.shl(4) or r).shl(24) + (g.shl(4) or g).shl(16) + (b.shl(4) or b).shl(8) + 255)
}
}
override fun createSlickColor(r: Int, g: Int, b: Int): Color {
override fun createGdxColor(r: Int, g: Int, b: Int): Color {
assertARGB(0, r, g, b)
return createSlickColor(r.shl(8) or g.shl(4) or b)
return createGdxColor(r.shl(8) or g.shl(4) or b)
}
fun createSlickColor(a: Int, r: Int, g: Int, b: Int): Color {
assertARGB(a, r, g, b)
return createSlickColor(a.shl(12) or r.shl(8) or g.shl(4) or b)
return createGdxColor(a.shl(12) or r.shl(8) or g.shl(4) or b)
}
override fun create(raw: Int) {
@@ -107,7 +107,7 @@ class Col4096 : LimitedColours {
return ret
}
override fun toSlickColour(): Color = createSlickColor(raw.toUint())
override fun toGdxColour(): Color = createGdxColor(raw.toUint())
private fun assertRaw(i: Int) {
if (i > 0xFFFF || i < 0) {

View File

@@ -1,10 +1,8 @@
package net.torvald.colourutil
import net.torvald.terrarum.getPixel
import net.torvald.terrarum.weather.toColor
import org.newdawn.slick.Color
import org.newdawn.slick.Image
import com.badlogic.gdx.graphics.Color
import net.torvald.colourutil.CIEXYZUtil.toColor
import net.torvald.terrarum.GdxColorMap
import net.torvald.terrarum.ModMgr
/**
@@ -12,7 +10,7 @@ import net.torvald.terrarum.ModMgr
* Created by minjaesong on 16-07-26.
*/
object ColourTemp {
private var clut = Image(ModMgr.getPath("basegame", "colourmap/black_body_col_1000_40000_K.tga"))
private var clut = GdxColorMap(ModMgr.getGdxFile("basegame", "colourmap/black_body_col_1000_40000_K.tga"))
private fun colTempToImagePos(K: Int): Int {
if (K < 1000 || K >= 40000) throw IllegalArgumentException("K: out of range. ($K)")
@@ -21,7 +19,7 @@ object ColourTemp {
/** returns sRGB-normalised colour */
operator fun invoke(temp: Int): Color =
clut.getPixel(colTempToImagePos(temp), 0).toColor()
clut.get(colTempToImagePos(temp))
/** returns CIExyY-based colour converted to slick.color
* @param CIE_Y 0.0 - 1.0+ */

View File

@@ -1,13 +1,13 @@
package net.torvald.colourutil
import com.jme3.math.FastMath
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* Created by minjaesong on 16-07-26.
*/
object ColourUtil {
fun toSlickColor(r: Int, g: Int, b: Int) = Color(r.shl(16) or g.shl(8) or b)
fun toColor(r: Int, g: Int, b: Int) = Color(r.shl(24) or g.shl(16) or b.shl(8) or 0xff)
/**
* Use CIELabUtil.getGradient for natural-looking colour

View File

@@ -1,7 +1,7 @@
package net.torvald.colourutil
import com.jme3.math.FastMath
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* OBSOLETE; use CIELchUtil for natural-looking colour
@@ -17,9 +17,6 @@ object HSVUtil {
* @param S 0-1 Saturation
* *
* @param V 0-1 Value
* *
* @return org.newdawn.slick.Color
* *
* @link http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
*/
fun toRGB(H: Float, S: Float, V: Float, alpha: Float = 1f): Color {

View File

@@ -1,17 +1,17 @@
package net.torvald.colourutil
import org.newdawn.slick.Color
import com.badlogic.gdx.graphics.Color
/**
* Created by minjaesong on 16-02-11.
*/
interface LimitedColours {
fun createSlickColor(raw: Int): Color
fun createSlickColor(r: Int, g: Int, b: Int): Color
fun createGdxColor(raw: Int): Color
fun createGdxColor(r: Int, g: Int, b: Int): Color
fun create(raw: Int)
fun create(r: Int, g: Int, b: Int)
fun toSlickColour(): Color
fun toGdxColour(): Color
}

View File

@@ -1,79 +0,0 @@
package net.torvald.imagefont
import org.newdawn.slick.Color
import org.newdawn.slick.Font
import org.newdawn.slick.SpriteSheet
import java.util.*
/**
* Created by minjaesong on 16-04-15.
*/
class TinyAlphNum : Font {
internal val fontSheet: SpriteSheet
internal val W = 8
internal val H = 8
/*private val chars = arrayOf(
'0','1','2','3','4','5','6','7',
'8','9','[','#','@',':','>','?',
' ','A','B','C','D','E','F','G',
'H','I','&','.',']','(','<','\\',
'^','J','K','L','M','N','O','P',
'Q','R','-','¤','*',')',';','\'',
'+','/','S','T','U','V','W','X',
'Y','Z','_',',','%','=','"','!'
)
private val mappingTable = HashMap<Int, Int>()*/
init {
fontSheet = SpriteSheet("./assets/graphics/fonts/milky.tga", W, H)
//chars.forEachIndexed { i, c -> mappingTable[c.toInt()] = i }
}
override fun getHeight(str: String): Int = H
override fun getWidth(str: String): Int {
var ret = 0
for (i in 0..str.length - 1) {
val c = str.codePointAt(i).toChar()
if (!c.isColourCode())
ret += W
}
return ret
}
override fun getLineHeight(): Int = H
override fun drawString(x: Float, y: Float, text: String) = drawString(x, y, text, Color.white)
override fun drawString(x: Float, y: Float, text: String, col: Color) {
var thisCol = col
var textPosOffset = 0
for (i in 0..text.length - 1) {
//val index = charToSpriteNum(text.toUpperCase().codePointAt(i))
val ch = text[i]
val index = ch.toInt() and 0xFF
if (ch.isColourCode()) {
thisCol = GameFontBase.colourKey[ch]!!
continue
}
fontSheet.getSubImage(index % 16, index / 16).drawWithShadow(
x + textPosOffset, y, thisCol, false
)
textPosOffset += W
}
}
override fun drawString(x: Float, y: Float, text: String, col: Color, startIndex: Int, endIndex: Int) {
throw UnsupportedOperationException()
}
//private fun charToSpriteNum(ch: Int): Int? = mappingTable[ch]
fun Char.isColourCode() = GameFontBase.colourKey.containsKey(this)
}

View File

@@ -1,328 +0,0 @@
package net.torvald.slick.opengl;
/*
* A utility to load .tga.gz
*
* Created by SKYHi14 on 2017-04-19.
*/
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.zip.GZIPInputStream;
import org.lwjgl.BufferUtils;
import org.newdawn.slick.opengl.LoadableImageData;
/**
* A utility to load TGAs. Note: NOT THREAD SAFE
*
* Fresh cut of code but largely influeneced by the TGA loading class
* provided as part of the Java Monkey Engine (JME). Why not check out
* what they're doing over at http://www.jmonkeyengine.com. kudos to
* Mark Powell.
*
* @author Kevin Glass
*/
public class TGAGzImageData implements LoadableImageData {
/** The width of the texture that needs to be generated */
private int texWidth;
/** The height of the texture that needs to be generated */
private int texHeight;
/** The width of the TGA image */
private int width;
/** The height of the TGA image */
private int height;
/** The bit depth of the image */
private short pixelDepth;
/**
* Create a new TGA Loader
*/
public TGAGzImageData() {
}
/**
* Flip the endian-ness of the short
*
* @param signedShort The short to flip
* @return The flipped short
*/
private short flipEndian(short signedShort) {
int input = signedShort & 0xFFFF;
return (short) (input << 8 | (input & 0xFF00) >>> 8);
}
/**
* @see org.newdawn.slick.opengl.ImageData#getDepth()
*/
public int getDepth() {
return pixelDepth;
}
/**
* @see org.newdawn.slick.opengl.ImageData#getWidth()
*/
public int getWidth() {
return width;
}
/**
* @see org.newdawn.slick.opengl.ImageData#getHeight()
*/
public int getHeight() {
return height;
}
/**
* @see org.newdawn.slick.opengl.ImageData#getTexWidth()
*/
public int getTexWidth() {
return texWidth;
}
/**
* @see org.newdawn.slick.opengl.ImageData#getTexHeight()
*/
public int getTexHeight() {
return texHeight;
}
/**
* @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream)
*/
public ByteBuffer loadImage(InputStream fis) throws IOException {
return loadImage(fis,true, null);
}
/**
* @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream, boolean, int[])
*/
public ByteBuffer loadImage(InputStream fis, boolean flipped, int[] transparent) throws IOException {
return loadImage(fis, flipped, false, transparent);
}
/**
* @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream, boolean, boolean, int[])
*/
public ByteBuffer loadImage(InputStream fis, boolean flipped, boolean forceAlpha, int[] transparent) throws IOException {
if (transparent != null) {
forceAlpha = true;
}
byte red = 0;
byte green = 0;
byte blue = 0;
byte alpha = 0;
BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(fis, 8192), 16384);
DataInputStream dis = new DataInputStream(bis);
// Read in the Header
short idLength = (short) dis.read();
short colorMapType = (short) dis.read();
short imageType = (short) dis.read();
short cMapStart = flipEndian(dis.readShort());
short cMapLength = flipEndian(dis.readShort());
short cMapDepth = (short) dis.read();
short xOffset = flipEndian(dis.readShort());
short yOffset = flipEndian(dis.readShort());
if (imageType != 2) {
throw new IOException("Slick only supports uncompressed RGB(A) TGA images");
}
width = flipEndian(dis.readShort());
height = flipEndian(dis.readShort());
pixelDepth = (short) dis.read();
if (pixelDepth == 32) {
forceAlpha = false;
}
texWidth = get2Fold(width);
texHeight = get2Fold(height);
short imageDescriptor = (short) dis.read();
if ((imageDescriptor & 0x0020) == 0) {
flipped = !flipped;
}
// Skip image ID
if (idLength > 0) {
bis.skip(idLength);
}
byte[] rawData = null;
if ((pixelDepth == 32) || (forceAlpha)) {
pixelDepth = 32;
rawData = new byte[texWidth * texHeight * 4];
} else if (pixelDepth == 24) {
rawData = new byte[texWidth * texHeight * 3];
} else {
throw new RuntimeException("Only 24 and 32 bit TGAs are supported");
}
if (pixelDepth == 24) {
if (flipped) {
for (int i = height-1; i >= 0; i--) {
for (int j = 0; j < width; j++) {
blue = dis.readByte();
green = dis.readByte();
red = dis.readByte();
int ofs = ((j + (i * texWidth)) * 3);
rawData[ofs] = red;
rawData[ofs + 1] = green;
rawData[ofs + 2] = blue;
}
}
} else {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
blue = dis.readByte();
green = dis.readByte();
red = dis.readByte();
int ofs = ((j + (i * texWidth)) * 3);
rawData[ofs] = red;
rawData[ofs + 1] = green;
rawData[ofs + 2] = blue;
}
}
}
} else if (pixelDepth == 32) {
if (flipped) {
for (int i = height-1; i >= 0; i--) {
for (int j = 0; j < width; j++) {
blue = dis.readByte();
green = dis.readByte();
red = dis.readByte();
if (forceAlpha) {
alpha = (byte) 255;
} else {
alpha = dis.readByte();
}
int ofs = ((j + (i * texWidth)) * 4);
rawData[ofs] = red;
rawData[ofs + 1] = green;
rawData[ofs + 2] = blue;
rawData[ofs + 3] = alpha;
if (alpha == 0) {
rawData[ofs + 2] = (byte) 0;
rawData[ofs + 1] = (byte) 0;
rawData[ofs] = (byte) 0;
}
}
}
} else {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
blue = dis.readByte();
green = dis.readByte();
red = dis.readByte();
if (forceAlpha) {
alpha = (byte) 255;
} else {
alpha = dis.readByte();
}
int ofs = ((j + (i * texWidth)) * 4);
if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) {
rawData[ofs] = red;
rawData[ofs + 1] = green;
rawData[ofs + 2] = blue;
rawData[ofs + 3] = alpha;
} else {
rawData[ofs] = red;
rawData[ofs + 1] = green;
rawData[ofs + 2] = blue;
rawData[ofs + 3] = alpha;
}
if (alpha == 0) {
rawData[ofs + 2] = 0;
rawData[ofs + 1] = 0;
rawData[ofs] = 0;
}
}
}
}
}
fis.close();
if (transparent != null) {
for (int i=0;i<rawData.length;i+=4) {
boolean match = true;
for (int c=0;c<3;c++) {
if (rawData[i+c] != transparent[c]) {
match = false;
}
}
if (match) {
rawData[i+3] = 0;
}
}
}
// Get a pointer to the image memory
ByteBuffer scratch = BufferUtils.createByteBuffer(rawData.length);
scratch.put(rawData);
int perPixel = pixelDepth / 8;
if (height < texHeight-1) {
int topOffset = (texHeight-1) * (texWidth*perPixel);
int bottomOffset = (height-1) * (texWidth*perPixel);
for (int x=0;x<texWidth*perPixel;x++) {
scratch.put(topOffset+x, scratch.get(x));
scratch.put(bottomOffset+(texWidth*perPixel)+x, scratch.get((texWidth*perPixel)+x));
}
}
if (width < texWidth-1) {
for (int y=0;y<texHeight;y++) {
for (int i=0;i<perPixel;i++) {
scratch.put(((y+1)*(texWidth*perPixel))-perPixel+i, scratch.get(y*(texWidth*perPixel)+i));
scratch.put((y*(texWidth*perPixel))+(width*perPixel)+i, scratch.get((y*(texWidth*perPixel))+((width-1)*perPixel)+i));
}
}
}
scratch.flip();
return scratch;
}
/**
* Get the closest greater power of 2 to the fold number
*
* @param fold The target number
* @return The power of 2
*/
private int get2Fold(int fold) {
int ret = 2;
while (ret < fold) {
ret *= 2;
}
return ret;
}
/**
* @see org.newdawn.slick.opengl.ImageData#getImageBufferData()
*/
public ByteBuffer getImageBufferData() {
throw new RuntimeException("TGAImageData doesn't store it's image.");
}
/**
* @see org.newdawn.slick.opengl.LoadableImageData#configureEdging(boolean)
*/
public void configureEdging(boolean edging) {
}
}

View File

@@ -4,50 +4,44 @@
package net.torvald.spriteanimation
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.jme3.math.FastMath
import net.torvald.terrarum.gameactors.ActorWithPhysics
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import org.newdawn.slick.SlickException
import org.newdawn.slick.SpriteSheet
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
class SpriteAnimation(val parentActor: ActorWithPhysics, val cellWidth: Int, val cellHeight: Int) {
class SpriteAnimation(val parentActor: ActorWithPhysics) {
private lateinit var textureRegion: TextureRegionPack
private var spriteImage: SpriteSheet? = null
var currentFrame = 0
var currentRow = 0
var nFrames: Int = 1
private set
var nRows: Int = 1
private set
var delay = 200
private var delta = 0
var delay = 200f
private var delta = 0f
val looping = true
private var animationRunning = true
private var flipHorizontal = false
private var flipVertical = false
var flipHorizontal = false
var flipVertical = false
private val visible: Boolean
get() = parentActor.isVisible
private val offsetX = 0
private val offsetY = 0
private var prevScale = 1f
private var currentImage: Image? = null
var cellWidth: Int = 0
var cellHeight: Int = 0
/**
* Sets spritesheet.
* MUST be called AFTER setDimension.
* @param imagePath path to the sprite sheet image.
* *
* @throws SlickException
*/
fun setSpriteImage(imagePath: String) {
spriteImage = SpriteSheet(imagePath, cellWidth, cellHeight)
}
var colorFilter = Color.WHITE
fun setSpriteImage(image: Image) {
spriteImage = SpriteSheet(image, cellWidth, cellHeight)
fun setSpriteImage(regionPack: TextureRegionPack) {
textureRegion = regionPack
cellWidth = regionPack.tileW
cellHeight = regionPack.tileH
}
/**
@@ -62,7 +56,7 @@ class SpriteAnimation(val parentActor: ActorWithPhysics, val cellWidth: Int, val
this.nFrames = nFrames
}
fun update(delta: Int) {
fun update(delta: Float) {
if (animationRunning) {
//skip this if animation is stopped
this.delta += delta
@@ -76,7 +70,7 @@ class SpriteAnimation(val parentActor: ActorWithPhysics, val cellWidth: Int, val
//advance one frame, then reset delta counter
this.currentFrame = this.currentFrame % this.nFrames
this.delta = 0
this.delta = 0f
}
}
}
@@ -92,25 +86,17 @@ class SpriteAnimation(val parentActor: ActorWithPhysics, val cellWidth: Int, val
* *
* @param scale
*/
@JvmOverloads fun render(g: Graphics, posX: Float, posY: Float, scale: Float = 1f) {
@JvmOverloads fun render(batch: SpriteBatch, posX: Float, posY: Float, scale: Float = 1f) {
if (cellWidth == 0 || cellHeight == 0) {
throw Error("Sprite width or height is set to zero! ($cellWidth, $cellHeight); master: $parentActor")
}
// Null checking
if (currentImage == null) {
currentImage = getScaledSprite(scale)
}
if (visible) {
// re-scale image if scale has been changed
if (prevScale != scale) {
currentImage = getScaledSprite(scale)
prevScale = scale
}
val region = textureRegion.get(currentRow, currentFrame)
region.flip(flipHorizontal, !flipVertical)
batch.color = colorFilter
val flippedImage = currentImage!!.getFlippedCopy(flipHorizontal, flipVertical)
flippedImage.draw(
batch.draw(region,
Math.round(posX).toFloat(),
FastMath.floor(posY).toFloat(),
FastMath.floor(cellWidth * scale).toFloat(),
@@ -128,7 +114,7 @@ class SpriteAnimation(val parentActor: ActorWithPhysics, val cellWidth: Int, val
}
}
fun setSpriteDelay(newDelay: Int) {
fun setSpriteDelay(newDelay: Float) {
if (newDelay > 0) {
delay = newDelay
}
@@ -169,17 +155,4 @@ class SpriteAnimation(val parentActor: ActorWithPhysics, val cellWidth: Int, val
flipVertical = vertical
}
fun flippedHorizontal(): Boolean {
return flipHorizontal
}
fun flippedVertical(): Boolean {
return flipVertical
}
private fun getScaledSprite(scale: Float): Image {
val selectedImage = spriteImage!!.getSprite(currentFrame, currentRow)
selectedImage.filter = Image.FILTER_NEAREST
return selectedImage.getScaledCopy(scale)
}
}

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum
import com.badlogic.gdx.Input
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonObject
import net.torvald.terrarum.gamecontroller.Key
@@ -20,7 +20,7 @@ object DefaultConfig {
jsonObject.addProperty("smoothlighting", true)
jsonObject.addProperty("imtooyoungtodie", false) // perma-death
jsonObject.addProperty("language", Terrarum.sysLang)
jsonObject.addProperty("language", TerrarumGDX.sysLang)
jsonObject.addProperty("notificationshowuptime", 6500)
jsonObject.addProperty("multithread", true) // experimental!
@@ -47,31 +47,31 @@ object DefaultConfig {
// control-keyboard (Java key codes. This is what Minecraft also uses)
jsonObject.addProperty("keyup", Key.E)
jsonObject.addProperty("keyleft", Key.S)
jsonObject.addProperty("keydown", Key.D)
jsonObject.addProperty("keyright", Key.F)
jsonObject.addProperty("keyup", Input.Keys.E)
jsonObject.addProperty("keyleft", Input.Keys.S)
jsonObject.addProperty("keydown", Input.Keys.D)
jsonObject.addProperty("keyright", Input.Keys.F)
jsonObject.addProperty("keymovementaux", Key.A) // movement-auxiliary, or hookshot
jsonObject.addProperty("keyinventory", Key.W)
jsonObject.addProperty("keyinteract", Key.R)
jsonObject.addProperty("keyclose", Key.C)
jsonObject.addProperty("keymovementaux", Input.Keys.A) // movement-auxiliary, or hookshot
jsonObject.addProperty("keyinventory", Input.Keys.W)
jsonObject.addProperty("keyinteract", Input.Keys.R)
jsonObject.addProperty("keyclose", Input.Keys.C)
jsonObject.addProperty("keygamemenu", Key.TAB)
jsonObject.addProperty("keygamemenu", Input.Keys.TAB)
jsonObject.addProperty("keyquicksel", Key.CAPS_LOCK) // pie menu
val keyquickselalt = JsonArray(); keyquickselalt.add(Key.BACKSPACE); keyquickselalt.add(Key.L_COMMAND); keyquickselalt.add(Key.L_CONTROL)
val keyquickselalt = JsonArray(); keyquickselalt.add(Input.Keys.BACKSPACE); keyquickselalt.add(Key.L_COMMAND); keyquickselalt.add(Input.Keys.CONTROL_LEFT)
// Colemak, Workman and some typers use CapsLock as Backspace, Apple-JIS and HHKB has Control in place of CapsLock and often re-assigned to Command
// so these keys are treated as the same.
// FOR ~~FUCKS~~ERGONOMICS' SAKE DON'T USE CTRL AND ALT AS A KEY!
jsonObject.add("keyquickselalt", keyquickselalt)
jsonObject.addProperty("keyjump", Key.SPACE)
jsonObject.addProperty("keyjump", Input.Keys.SPACE)
val keyquickbars = JsonArray(); for (i in 2..11) keyquickbars.add(i) // NUM_1 to NUM_0
jsonObject.add("keyquickbars", keyquickbars)
jsonObject.addProperty("mouseprimary", 0) // left mouse
jsonObject.addProperty("mousesecondary", 1) // right mouse
jsonObject.addProperty("mouseprimary", Input.Buttons.LEFT) // left mouse
jsonObject.addProperty("mousesecondary", Input.Buttons.RIGHT) // right mouse
jsonObject.addProperty("pcgamepadenv", "console")

View File

@@ -0,0 +1,57 @@
package net.torvald.terrarum
import com.badlogic.gdx.files.FileHandle
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Pixmap
import javax.naming.OperationNotSupportedException
/**
* Created by minjaesong on 2017-06-17.
*/
typealias XRGB888 = Int
class GdxColorMap {
constructor(imageFile: FileHandle) {
val pixmap = Pixmap(imageFile)
width = pixmap.width
height = pixmap.height
is2D = pixmap.height == 1
data = kotlin.IntArray(pixmap.width * pixmap.height, {
pixmap.getPixel(it % pixmap.width, it / pixmap.width)
})
pixmap.dispose()
}
constructor(xrgb888: XRGB888) {
data = intArrayOf(xrgb888.shl(24) + xrgb888.shl(16) + xrgb888.shl(8) + 255)
width = 1
height = 1
is2D = false
}
constructor(gradStart: XRGB888, gradEnd: XRGB888) {
data = intArrayOf(gradStart.shl(24) + gradStart.shl(16) + gradStart.shl(8) + 255,
gradEnd.shl(24) + gradEnd.shl(16) + gradEnd.shl(8) + 255)
width = 1
height = 2
is2D = true
}
private val data: IntArray
val width: Int
val height: Int
val is2D: Boolean
fun get(x: Int, y: Int): Color = Color(data[y * width + x])
operator fun get(x: Int): Color = if (!is2D) throw OperationNotSupportedException("This is 2D color map") else Color(data[x])
fun getRaw(x: Int, y: Int): RGBA8888 = data[y * width + x]
fun getRaw(x: Int): RGBA8888 = if (!is2D) throw OperationNotSupportedException("This is 2D color map") else data[x]
}

View File

@@ -1,5 +1,7 @@
package net.torvald.terrarum
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.files.FileHandle
import net.torvald.terrarum.utils.CSVFetcher
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.ItemCodex
@@ -115,6 +117,9 @@ object ModMgr {
checkExistence(module)
return "$modDir/$module/${path.sanitisePath()}"
}
fun getGdxFile(module: String, path: String): FileHandle {
return Gdx.files.internal(getPath(module, path))
}
fun getFile(module: String, path: String): File {
checkExistence(module)
return FileSystems.getDefault().getPath(getPath(module, path)).toFile()

View File

@@ -1,347 +0,0 @@
package net.torvald.terrarum
import com.jme3.math.FastMath
import net.torvald.terrarum.gameactors.floor
import net.torvald.terrarum.gameactors.floorInt
import net.torvald.terrarum.gameworld.toUint
import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.nio.ByteOrder
/**
* Software rendering test for blur
*
* Created by minjaesong on 2017-01-12.
*/
class StateBlurTest : BasicGameState() {
/** Warning: the image must have a bit depth of 32! (use 32-bit PNG or TGA) */
private val testImage = Image("./assets/test_texture.tga")
private val bluredImage = ImageBuffer(testImage.width, testImage.height)
override fun init(gc: GameContainer, sbg: StateBasedGame) {
/*testImage.flushPixelData()
System.arraycopy(
testImage.texture.textureData, 0,
bluredImage.rgba, 0, testImage.texture.textureData.size
)*/
//kotlin.repeat(3) { fastBoxBlur(bluredImage, 3) }
}
override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle("${Terrarum.NAME} — F: ${Terrarum.appgc.fps}")
theta += delta / 500f
if (theta > FastMath.TWO_PI)
theta -= FastMath.TWO_PI
}
override fun getID() = Terrarum.STATE_ID_TEST_BLUR
var theta = 0f
override fun render(gc: GameContainer, sbg: StateBasedGame, g: Graphics) {
System.arraycopy(
testImage.texture.textureData, 0,
bluredImage.rgba, 0, testImage.texture.textureData.size
)
kotlin.repeat(3) { fastBoxBlur(bluredImage, 3) }
g.background = Color(0x404040)
val image = bluredImage.image // ImageBuffer.getImage() always HARDCOPIES texture data by
// allocating new ByteBuffer. We need variable so that we can destroy() it manually
g.drawImage(image,
Terrarum.WIDTH.minus(testImage.width).div(2f).floor() + FastMath.cos(theta) * 120,
Terrarum.HEIGHT.minus(testImage.height).div(2f).floor() + FastMath.sin(theta) * 40
)
g.flush()
image.destroy() // You are done and you will be terminated, for the perkeleen memory's sake
}
private val isLE: Boolean
get() = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN
/** three iterations of box blur \simeq gaussian blur */
fun fastBoxBlur(from: Image, to: ImageBuffer, radius: Int) {
/** 0xRRGGBBAA */
fun getPixelData(index: Int): Int {
val r = from.texture.textureData[4 * index + if (isLE) 0 else 2].toUint()
val g = from.texture.textureData[4 * index + 1].toUint()
val b = from.texture.textureData[4 * index + if (isLE) 2 else 0].toUint()
if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
return r.shl(16) or g.shl(8) or b
}
else {
return b.shl(16) or g.shl(8) or r
}
}
/** alpha will be passed through */
fun setPixelData(index: Int, value: Int) {
val r = value.ushr(24).and(0xff)
val g = value.ushr(16).and(0xff)
val b = value.ushr(8).and(0xff)
to.rgba[4 * index + if (isLE) 0 else 2] = r.toByte()
to.rgba[4 * index + 1] = g.toByte()
to.rgba[4 * index + if (isLE) 2 else 0] = b.toByte()
}
if (radius < 1) {
return
}
val w = to.texWidth
val h = to.texHeight
val wm = w - 1
val hm = h - 1
val wh = w * h
val div = radius + radius + 1
val r = IntArray(wh)
val g = IntArray(wh)
val b = IntArray(wh)
var rsum: Int
var gsum: Int
var bsum: Int
var x: Int
var y: Int
var i: Int
var p: Int
var p1: Int
var p2: Int
var yp: Int
var yi: Int
var yw: Int
val vmin = IntArray(Math.max(w, h))
val vmax = IntArray(Math.max(w, h))
//img.getPixels(pix, 0, w, 0, 0, w, h)
val dv = IntArray(256 * div)
i = 0
while (i < 256 * div) {
dv[i] = i / div
i++
}
yi = 0
yw = yi
y = 0
while (y < h) {
bsum = 0
gsum = bsum
rsum = gsum
i = -radius
while (i <= radius) {
p = getPixelData(yi + Math.min(wm, Math.max(i, 0)))
rsum += p and 0xff0000 shr 16
gsum += p and 0x00ff00 shr 8
bsum += p and 0x0000ff
i++
}
x = 0
while (x < w) {
r[yi] = dv[rsum]
g[yi] = dv[gsum]
b[yi] = dv[bsum]
if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm)
vmax[x] = Math.max(x - radius, 0)
}
p1 = getPixelData(yw + vmin[x])
p2 = getPixelData(yw + vmax[x])
rsum += (p1 and 0xff0000) - (p2 and 0xff0000) shr 16
gsum += (p1 and 0x00ff00) - (p2 and 0x00ff00) shr 8
bsum += (p1 and 0x0000ff) - (p2 and 0x0000ff)
yi++
x++
}
yw += w
y++
}
x = 0
while (x < w) {
bsum = 0
gsum = bsum
rsum = gsum
yp = -radius * w
i = -radius
while (i <= radius) {
yi = Math.max(0, yp) + x
rsum += r[yi]
gsum += g[yi]
bsum += b[yi]
yp += w
i++
}
yi = x
y = 0
while (y < h) {
setPixelData(yi, dv[rsum].shl(24) or dv[gsum].shl(16) or dv[bsum].shl(8))
if (x == 0) {
vmin[y] = Math.min(y + radius + 1, hm) * w
vmax[y] = Math.max(y - radius, 0) * w
}
p1 = x + vmin[y]
p2 = x + vmax[y]
rsum += r[p1] - r[p2]
gsum += g[p1] - g[p2]
bsum += b[p1] - b[p2]
yi += w
y++
}
x++
}
}
fun fastBoxBlur(img: ImageBuffer, radius: Int) {
/** 0xRRGGBBAA */
fun getPixelData(index: Int): Int {
val r = img.rgba[4 * index].toUint()
val g = img.rgba[4 * index + 1].toUint()
val b = img.rgba[4 * index + 2].toUint()
return r.shl(16) or g.shl(8) or b
}
/** alpha will be passed through */
fun setPixelData(index: Int, value: Int) {
val r = value.ushr(24).and(0xff)
val g = value.ushr(16).and(0xff)
val b = value.ushr(8).and(0xff)
img.rgba[4 * index] = r.toByte()
img.rgba[4 * index + 1] = g.toByte()
img.rgba[4 * index + 2] = b.toByte()
}
if (radius < 1) {
return
}
val w = img.texWidth
val h = img.texHeight
val wm = w - 1
val hm = h - 1
val wh = w * h
val div = radius + radius + 1
val r = IntArray(wh)
val g = IntArray(wh)
val b = IntArray(wh)
var rsum: Int
var gsum: Int
var bsum: Int
var x: Int
var y: Int
var i: Int
var p: Int
var p1: Int
var p2: Int
var yp: Int
var yi: Int
var yw: Int
val vmin = IntArray(Math.max(w, h))
val vmax = IntArray(Math.max(w, h))
//img.getPixels(pix, 0, w, 0, 0, w, h)
val dv = IntArray(256 * div)
i = 0
while (i < 256 * div) {
dv[i] = i / div
i++
}
yi = 0
yw = yi
y = 0
while (y < h) {
bsum = 0
gsum = bsum
rsum = gsum
i = -radius
while (i <= radius) {
p = getPixelData(yi + Math.min(wm, Math.max(i, 0)))
rsum += p and 0xff0000 shr 16
gsum += p and 0x00ff00 shr 8
bsum += p and 0x0000ff
i++
}
x = 0
while (x < w) {
r[yi] = dv[rsum]
g[yi] = dv[gsum]
b[yi] = dv[bsum]
if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm)
vmax[x] = Math.max(x - radius, 0)
}
p1 = getPixelData(yw + vmin[x])
p2 = getPixelData(yw + vmax[x])
rsum += (p1 and 0xff0000) - (p2 and 0xff0000) shr 16
gsum += (p1 and 0x00ff00) - (p2 and 0x00ff00) shr 8
bsum += (p1 and 0x0000ff) - (p2 and 0x0000ff)
yi++
x++
}
yw += w
y++
}
x = 0
while (x < w) {
bsum = 0
gsum = bsum
rsum = gsum
yp = -radius * w
i = -radius
while (i <= radius) {
yi = Math.max(0, yp) + x
rsum += r[yi]
gsum += g[yi]
bsum += b[yi]
yp += w
i++
}
yi = x
y = 0
while (y < h) {
setPixelData(yi, dv[rsum].shl(24) or dv[gsum].shl(16) or dv[bsum].shl(8))
if (x == 0) {
vmin[y] = Math.min(y + radius + 1, hm) * w
vmax[y] = Math.max(y - radius, 0) * w
}
p1 = x + vmin[y]
p2 = x + vmax[y]
rsum += r[p1] - r[p2]
gsum += g[p1] - g[p2]
bsum += b[p1] - b[p2]
yi += w
y++
}
x++
}
}
}

View File

@@ -1,55 +0,0 @@
package net.torvald.terrarum
import net.torvald.terrarum.gamecontroller.Key
import net.torvald.terrarum.gamecontroller.KeyToggler
import net.torvald.terrarum.gameworld.fmod
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
/**
* Created by SKYHi14 on 2017-03-15.
*/
class StateControllerRumbleTest : BasicGameState() {
override fun init(container: GameContainer?, game: StateBasedGame?) {
}
override fun update(container: GameContainer, game: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle("${GAME_NAME} — Do not pull out the controller!")
KeyToggler.update(container.input)
if (Terrarum.controller != null) {
for (i in 0..minOf(rumblerCount - 1, 9)) {
Terrarum.controller!!.setRumblerStrength(i, if (KeyToggler.isOn(2 + i)) 1f else 0f)
}
}
}
private var rumblerCount = Terrarum.controller?.rumblerCount ?: 0
override fun getID() = Terrarum.STATE_ID_TOOL_RUMBLE_DIAGNOSIS
override fun render(gc: GameContainer, game: StateBasedGame, g: Graphics) {
g.font = Terrarum.fontGame
g.color = Color.white
if (Terrarum.controller != null) {
g.drawString("Controller: ${Terrarum.controller!!.name}", 10f, 10f)
g.drawString("Rumbler count: ${rumblerCount}", 10f, 30f)
g.drawString("Rumblers", 10f, 70f)
for (i in 0..minOf(rumblerCount - 1, 9)) {
g.color = if (KeyToggler.isOn(2 + i)) Color(0x55ff55) else Color(0x808080)
//g.drawString("$i", 10f + i * 16f, 90f)
g.drawString("$i${Terrarum.controller!!.getRumblerName(i)}", 10f, 90f + 20 * i)
}
}
else {
g.drawString("Controller not found.", 10f, 10f)
}
}
}

View File

@@ -1,160 +0,0 @@
package net.torvald.terrarum
import net.torvald.imagefont.GameFontImpl
import net.torvald.terrarum.langpack.Lang
import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
/**
* Created by minjaesong on 16-06-28.
*/
class StateFontTester : BasicGameState() {
val textToPrint = """
ABCDEFGHIJKLM
NOPQRSTUVWXYZ
abcdefghijklm
nopqrstuvwxyz
1234567890
"""
lateinit var canvas: Graphics
//lateinit var segfont: Font
lateinit var mtfont: Font
override fun init(gc: GameContainer, game: StateBasedGame) {
canvas = Graphics(1024, 1024)
}
override fun update(gc: GameContainer, game: StateBasedGame, delta: Int) {
}
override fun render(gc: GameContainer, game: StateBasedGame, g: Graphics) {
g.background = Color(0x282828)
g.font = Terrarum.fontGame
g.drawString("ABCDEFGHIJKLMN", 10f, 10f)
g.drawString("OPQRSTÜVWXYZÆŒ", 10f, 30f)
g.drawString("abcdefghijklmno", 160f, 10f)
g.drawString("pqrstuvwxyzßæœ", 160f, 30f)
g.drawString("1234567890?!", 320f, 10f)
//g.drawString("minimum kerning keming Narnu Namu", 320f, 30f)
//g.drawString("Syö salmiakkia perkele", 480f, 10f)
/*val text = arrayOf(
"The bitmap font for game developers who seek good font that has real multilingual support,",
"for free (as in freedom AND without cost).",
"",
"There are many bitmap fonts on the internet. You care for the multilingual support, but alas!",
"most of them do not support your language, vector fonts take too much time to load, and even",
"then their legibility suffers because fuck built-in antialias.",
"You somehow found a fine one, and it makes your game look like a linux terminal, and you say:",
"“Well, better than nothing *sigh*; No, its ugly.”",
"You speak Japanese, and you wish to support it, but then このクソなfontは only good for Japanese,",
"it is not even multilingual, and their English look ugly and inconsistent anyway.",
"Eventually you just use different fonts together, and the result was always mildly infuriating.",
"",
"No more suffering. This font has everything you need.",
"",
"while (isVisible(BadFonts)) { ripAndTear(BadFonts).scope(Guts); }",
"How multilingual? Real multilingual!",
"",
"Příliš žluťoučký kůň úpěl ďábelské ódy",
"Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich",
"διαφυλάξτε γενικά τη ζωή σας από βαθειά ψυχικά τραύματα",
"ΔΙΑΦΥΛΆΞΤΕ ΓΕΝΙΚΆ ΤΗ ΖΩΉ ΣΑΣ ΑΠΌ ΒΑΘΕΙΆ ΨΥΧΙΚΆ ΤΡΑΎΜΑΤΑ",
"Pack my box with five dozen liquor jugs",
"Voix ambiguë d'un cœur qui au zéphyr préfère les jattes de kiwi",
"정 참판 양반댁 규수 큰 교자 타고 혼례 치른 날 하얬다 도럄직한 퀡봹퉪헰",
"Kæmi ný öxi hér, ykist þjófum nú bæði víl og ádrepa",
"Árvíztűrő tükörfúrógép Kŕdeľ ďatľov učí koňa žrať kôru",
"とりなくこゑす ゆめさませ みよあけわたる ひんかしを そらいろはえて おきつへに ほふねむれゐぬ もやのうち",
"鳥啼ク声ス 夢覚マセ 見ヨ明ク渡ル 東ヲ 空色栄エテ 沖ツ辺ニ 帆船群レヰヌ 靄ノ中",
"Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila",
"Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства",
"Pijamalı hasta yağız şoföre çabucak güvendi",
"Also supports: Unicode „quotation marks“—dashes…「括弧」‼",
"ASCII Latin-1 Latin_Ext-A Latin_Ext-B Greek Cyrillic CJK-Ideo Kana Hangul_Syllables",
"",
"…not seeing your language/writing system? Let me know on the Issue Tracker!"
)*/
val text = arrayOf(
"x64またはx86-64とは、x86アーキテクチャを64ビットに拡張した命令セットアーキテクチャ。",
"実際には、AMDが発表したAMD64命令セット、続けてインテルが採用したIntel 64命令セット (かつてIA-32eまたはEM64Tと呼ばれていた)",
"などを含む、各社のAMD64互換命令セットの総称である。x86命令セットと互換性を持っていることから、広義にはx86にx64を含む場合がある。",
"",
"x86-64는 x86 명령어 집합 아키텍처의 64비트 모임이다. x86-64 명령어 집합은 에뮬레이션 없이 인텔의 x86를 지원하며 AMD64로 이름 붙인",
"AMD에 의해 고안되었다. 이 아키텍처는 인텔 64라는 이름으로 인텔에 의해 복제되기도 했다. (옘힐, 클래카마스 기술, CT, IA-32e, EM64T 등으로",
"불렸음) 이로써 x86-64 또는 x64의 이름을 일상적으로 사용하기에 이르렀다.",
"",
"x86-64 (также AMD64/Intel64/EM64T) — 64-битное расширение, набор команд для архитектуры x86, разработанное",
"компанией AMD, позволяющее выполнять программы в 64-разрядном режиме. Это расширение архитектуры x86 с",
"почти полной обратной совместимостью.",
"",
"Επίσης η x86-64 έχει καταχωρητές γενικής χρήσης 64-bit και πολλές άλλες βελτιώσεις. Η αρχική προδιαγραφή",
"δημιουργήθηκε από την AMD και έχει υλοποιηθεί από την AMD, την Intel, τη VIA και άλλες εταιρείες. Διατηρεί πλήρη",
"συμβατότητα προς τα πίσω με κώδικα 32-bit.",
"",
"x86-64 (簡稱x64) 是64位版本的x86指令集向后相容於16位及32位的x86架構。x64於1999年由AMD設計AMD首次公開",
"64位元集以擴充給x86稱為「AMD64」。其後也為英特爾所採用現時英特爾稱之為「Intel 64」在之前曾使用過「Clackamas",
"Technology」 (CT)、「IA-32e」及「EM64T」",
"",
"x86-64, ou x64, est une extension du jeu d'instructions x86 d'Intel, introduite par la société AMD avec la gamme",
"AMD64. Intel utilisera cette extension en l'appelant initialement EM64T renommé aujourd'hui en Intel 64.",
"",
"Amd64 (також x86-64/intel64/em64t/x64) — 64-бітова архітектура мікропроцесора і відповідний набір інструкцій,",
"розроблені компанією AMD. Це розширення архітектури x86 з повною зворотною сумісністю.",
"",
"x86-64 е наименованието на наборът от 64-битови разширения към x86 процесорната архитектура. Като синоним",
"на това наименование, се използват и съкращенията AMD64 (използвано от AMD), EM64T и IA-32e (използвани от",
"Intel) и x64 (използвано от Microsoft)."
)
val SP = "${0x3000.toChar()}${0x3000.toChar()}"
/*val text = arrayOf(
"${0xe006.toChar()} ${Lang["GAME_INVENTORY_USE"p]}$SP${0xe011.toChar()}..${0xe019.toChar()} ${Lang["GAME_INVENTORY_REGISTER"]}$SP${0xe034.toChar()} ${Lang["GAME_INVENTORY_DROP"]}"
)*/
Terrarum.gameLocale = "bgBG"
text.forEachIndexed { i, s ->
g.drawString(s, 10f, 70f + 20 * i)
}
/*val text = arrayOf(
"ru: Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства",
"bg: Под южно дърво, цъфтящо в синьо, бягаше малко пухкаво зайче",
"sr: Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу"
)*/
/*val text = arrayOf(
"……退魔の剣に選ばれし ハイラルの勇者よ",
"その たゆまぬ努力と 結実せに剣技を認め……",
"女神ハイリアの名において祝福を授けん……",
"空を舞い 時を回り 黄昏に染まろうとも……",
"結ばれし剣は 勇者の魂と共に……",
"さらなる力が そなたと そして退魔の剣に宿らんことを……"
)*/
/*(0..text.size - 1).forEach {
g.drawString(text[it], 10f, 70f + 20 * it)
}*/
}
override fun getID(): Int = Terrarum.STATE_ID_TEST_FONT
}

View File

@@ -1,131 +0,0 @@
package net.torvald.terrarum
import net.torvald.random.HQRNG
import net.torvald.terrarum.Terrarum.delta
import net.torvald.terrarum.gameactors.roundInt
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
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.util.*
/**
* Created by SKYHi14 on 2017-02-23.
*/
class StateGraphicComputerTest : BasicGameState() {
val computer = TerrarumComputer(8)
val monitor = GraphicsTerminal(computer)
val monitorUI: Image
val monitorUIG: Graphics
init {
val videocard = PeripheralVideoCard(computer)
monitor.attachVideoCard(videocard)
computer.attachTerminal(monitor)
computer.attachPeripheral(videocard)
monitorUI = Image(videocard.width, videocard.height * 2)
monitorUIG = monitorUI.graphics
}
override fun init(container: GameContainer?, game: StateBasedGame?) {
/*val vcard = (computer.getPeripheral("ppu") as PeripheralVideoCard).vram
// it's a-me, Mario!
(0..3).forEach {
vcard.sprites[it].setPaletteSet(64,33,12,62)
vcard.sprites[it].isVisible = true
vcard.sprites[it].drawWide = true
}
vcard.sprites[0].setAll(intArrayOf(
0,0,0,0,0,1,1,1,
0,0,0,0,1,1,1,1,
0,0,0,0,2,2,2,3,
0,0,0,2,3,2,3,3,
0,0,0,2,3,2,2,3,
0,0,0,2,2,3,3,3,
0,0,0,0,0,3,3,3,
0,0,0,0,2,2,1,2
))
vcard.sprites[1].setAll(intArrayOf(
1,1,0,0,0,0,0,0,
1,1,1,1,1,0,0,0,
3,2,3,0,0,0,0,0,
3,2,3,3,3,0,0,0,
3,3,2,3,3,3,0,0,
3,2,2,2,2,0,0,0,
3,3,3,3,0,0,0,0,
2,2,0,0,0,0,0,0
))
vcard.sprites[2].setAll(intArrayOf(
0,0,0,2,2,2,1,2,
0,0,2,2,2,2,1,1,
0,0,3,3,2,1,3,1,
0,0,3,3,3,1,1,1,
0,0,3,3,1,1,1,1,
0,0,0,0,1,1,1,0,
0,0,0,2,2,2,0,0,
0,0,2,2,2,2,0,0
))
vcard.sprites[3].setAll(intArrayOf(
2,1,2,2,2,0,0,0,
1,1,2,2,2,2,0,0,
1,3,1,2,3,3,0,0,
1,1,1,3,3,3,0,0,
1,1,1,1,3,3,0,0,
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.delta = delta
Terrarum.appgc.setTitle("VT — F: ${container.fps}" +
" — 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).vram
val sprites = vcard.sprites
angle += delta / 1000.0
sprites[0].posX = (Math.cos(angle) * 80 + 100).roundInt() - 16
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() - 16
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()*/
}
override fun getID() = Terrarum.STATE_ID_TEST_TTY
override fun render(container: GameContainer, game: StateBasedGame?, g: Graphics) {
monitor.render(container, monitorUIG)
g.drawImage(monitorUI, 30f, 30f)
}
override fun keyPressed(key: Int, c: Char) {
monitor.keyPressed(key, c)
}
}

View File

@@ -1,14 +1,16 @@
package net.torvald.terrarum
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Screen
import com.badlogic.gdx.graphics.*
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.glutils.FrameBuffer
import net.torvald.dataclass.CircularArray
import net.torvald.imagefont.GameFontBase
import net.torvald.random.HQRNG
import net.torvald.terrarum.Terrarum.HALFH
import net.torvald.terrarum.Terrarum.HALFW
import net.torvald.terrarum.Terrarum.delta
import net.torvald.terrarum.blockproperties.BlockPropUtil
import net.torvald.terrarum.blockstats.BlockStats
import net.torvald.terrarum.concurrent.ThreadParallel
import net.torvald.terrarum.console.*
import net.torvald.terrarum.gameactors.ActorHumanoid
import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.gameactors.physicssolver.CollisionSolver
import net.torvald.terrarum.gamecontroller.GameController
@@ -16,30 +18,33 @@ import net.torvald.terrarum.gamecontroller.Key
import net.torvald.terrarum.gamecontroller.KeyToggler
import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.WorldSimulator
import net.torvald.terrarum.worlddrawer.LightmapRenderer
import net.torvald.terrarum.worlddrawer.LightmapRenderer.constructRGBFromInt
import net.torvald.terrarum.weather.WeatherMixer
import net.torvald.terrarum.worlddrawer.BlocksDrawer
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.worlddrawer.FeaturesDrawer.TILE_SIZE
import net.torvald.terrarum.worlddrawer.LightmapRenderer
import net.torvald.terrarum.worlddrawer.WorldCamera
import net.torvald.terrarum.worldgenerator.WorldGenerator
import net.torvald.terrarum.worldgenerator.RoguelikeRandomiser
import net.torvald.terrarum.blockproperties.BlockPropUtil
import net.torvald.terrarum.blockstats.BlockStats
import net.torvald.terrarum.ui.*
import net.torvald.terrarum.weather.WeatherMixer
import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.util.*
import java.util.ArrayList
import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock
import javax.swing.JOptionPane
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
import net.torvald.random.HQRNG
import net.torvald.terrarum.ui.*
import net.torvald.terrarum.worldgenerator.RoguelikeRandomiser
import net.torvald.terrarum.worldgenerator.WorldGenerator
/**
* Created by minjaesong on 15-12-30.
* Created by minjaesong on 2017-06-16.
*/
class StateInGame : BasicGameState() {
class StateInGameGDX(val batch: SpriteBatch) : Screen {
private val ACTOR_UPDATE_RANGE = 4096
lateinit var world: GameWorld
@@ -48,7 +53,7 @@ class StateInGame : BasicGameState() {
* list of Actors that is sorted by Actors' referenceID
*/
val ACTORCONTAINER_INITIAL_SIZE = 64
val PARTICLES_MAX = Terrarum.getConfigInt("maxparticles")
val PARTICLES_MAX = TerrarumGDX.getConfigInt("maxparticles")
val actorContainer = ArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
val actorContainerInactive = ArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
val particlesContainer = CircularArray<ParticleBase>(PARTICLES_MAX)
@@ -68,10 +73,8 @@ class StateInGame : BasicGameState() {
val ZOOM_MAX = 4.0f
val ZOOM_MIN = 0.5f
val worldDrawFrameBuffer = Image(Terrarum.WIDTH.div(ZOOM_MIN).ceilInt(), Terrarum.HEIGHT.div(ZOOM_MIN).ceilInt())
val worldG = worldDrawFrameBuffer.graphics
val backDrawFrameBuffer = Image(Terrarum.WIDTH, Terrarum.HEIGHT)
val backG = backDrawFrameBuffer.graphics
var worldDrawFrameBuffer = FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.width.div(ZOOM_MIN).ceilInt(), Gdx.graphics.height.div(ZOOM_MIN).ceilInt(), false)
var backDrawFrameBuffer = FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.width, Gdx.graphics.height, false)
//private lateinit var shader12BitCol: Shader // grab LibGDX if you want some shader
//private lateinit var shaderBlur: Shader
@@ -114,13 +117,70 @@ class StateInGame : BasicGameState() {
inline val canPlayerControl: Boolean
get() = !paused // FIXME temporary behab (block movement if the game is paused or paused by UIs)
@Throws(SlickException::class)
override fun init(gameContainer: GameContainer, stateBasedGame: StateBasedGame) {
// state init code. Executed before the game goes into any "state" in states in StateBasedGame.java
var particlesActive = 0
private set
//////////////
// GDX code //
//////////////
var camera = OrthographicCamera(Gdx.graphics.width.toFloat(), Gdx.graphics.height.toFloat())
// invert Y
fun initViewPort(width: Int, height: Int, aspect: Float) {
val width = width.toFloat()
val height = height.toFloat()
// Get the window size in pixels
val w = Gdx.graphics.width.toFloat()
val h = Gdx.graphics.height.toFloat()
val vw: Float
val vh: Float // Viewport size in screen coordinates
val ox: Float
val oy: Float // Viewport offset in screen coordinates
// Check aspect ratio
if (w > h * aspect) {
// Black bars on the sides
vh = h
vw = Math.round(vh * aspect).toFloat()
oy = 0f
ox = (w - vw) / 2
}
else {
// Black bars on top and bottom
vw = w
vh = Math.round(vw * (1 / aspect)).toFloat()
ox = 0f
oy = (h - vh) / 2
}
// Create camera with the desired resolution
camera = OrthographicCamera(width, height)
// Move camera center to push 0,0 into the corner
camera.translate(width / 2, height / 2)
// Set Y to point downwards
camera.setToOrtho(true, width, height)
// Update camera matrix
camera.update()
// Set viewport to restrict drawing
Gdx.gl20.glViewport(ox.toInt(), oy.toInt(), vw.toInt(), vh.toInt())
}
override fun enter(gc: GameContainer, sbg: StateBasedGame) {
override fun show() {
// Set up viewport on first load
initViewPort(Gdx.graphics.width, Gdx.graphics.height, Gdx.graphics.width.toFloat() / Gdx.graphics.height.toFloat())
}
fun enter() {
// load things when the game entered this "state"
// load necessary shaders
//shader12BitCol = Shader.makeShader("./assets/4096.vert", "./assets/4096.frag")
@@ -163,10 +223,10 @@ class StateInGame : BasicGameState() {
notifier = UIHandler(Notification())
notifier.UI.handler = notifier
notifier.setPosition(
(Terrarum.WIDTH - notifier.UI.width) / 2, Terrarum.HEIGHT - notifier.UI.height)
(Gdx.graphics.width - notifier.UI.width) / 2, Gdx.graphics.height - notifier.UI.height)
// set smooth lighting as in config
KeyToggler.forceSet(KEY_LIGHTMAP_SMOOTH, Terrarum.getConfigBoolean("smoothlighting"))
KeyToggler.forceSet(KEY_LIGHTMAP_SMOOTH, TerrarumGDX.getConfigBoolean("smoothlighting"))
@@ -175,10 +235,10 @@ class StateInGame : BasicGameState() {
uiInventoryPlayer = UIHandler(
UIInventory(player,
width = 840,
height = Terrarum.HEIGHT - 160,
height = Gdx.graphics.height - 160,
categoryWidth = 210
),
toggleKey = Terrarum.getConfigInt("keyinventory")
toggleKey = TerrarumGDX.getConfigInt("keyinventory")
)
uiInventoryPlayer.setPosition(
-uiInventoryPlayer.UI.width,
@@ -193,34 +253,34 @@ class StateInGame : BasicGameState() {
// pie menu
uiPieMenu = UIHandler(UIPieMenu())
uiPieMenu.setPosition(HALFW, HALFH)
uiPieMenu.setPosition(TerrarumGDX.HALFW, TerrarumGDX.HALFH)
// vital metre
// fill in getter functions by
// (uiAliases[UI_QUICK_BAR]!!.UI as UIVitalMetre).vitalGetterMax = { some_function }
uiVitalPrimary = UIHandler(UIVitalMetre(player, { 80f }, { 100f }, Color.red, 2), customPositioning = true)
uiVitalPrimary.setAsAlwaysVisible()
uiVitalSecondary = UIHandler(UIVitalMetre(player, { 73f }, { 100f }, Color(0x00dfff), 1), customPositioning = true)
uiVitalSecondary.setAsAlwaysVisible()
uiVitalItem = UIHandler(UIVitalMetre(player, { null }, { null }, Color(0xffcc00), 0), customPositioning = true)
uiVitalItem.setAsAlwaysVisible()
//uiVitalPrimary = UIHandler(UIVitalMetre(player, { 80f }, { 100f }, Color.red, 2), customPositioning = true)
//uiVitalPrimary.setAsAlwaysVisible()
//uiVitalSecondary = UIHandler(UIVitalMetre(player, { 73f }, { 100f }, Color(0x00dfff), 1), customPositioning = true)
//uiVitalSecondary.setAsAlwaysVisible()
//uiVitalItem = UIHandler(UIVitalMetre(player, { null }, { null }, Color(0xffcc00), 0), customPositioning = true)
//uiVitalItem.setAsAlwaysVisible()
// basic watch-style notification bar (temperature, new mail)
uiWatchBasic = UIHandler(UIBasicNotifier(player))
uiWatchBasic.setAsAlwaysVisible()
uiWatchBasic.setPosition(Terrarum.WIDTH - uiWatchBasic.UI.width, 0)
uiWatchBasic.setPosition(Gdx.graphics.width - uiWatchBasic.UI.width, 0)
uiWatchTierOne = UIHandler(UITierOneWatch(player))
uiWatchTierOne.setAsAlwaysVisible()
uiWatchTierOne.setPosition(Terrarum.WIDTH - uiWatchTierOne.UI.width, uiWatchBasic.UI.height - 2)
uiWatchTierOne.setPosition(Gdx.graphics.width - uiWatchTierOne.UI.width, uiWatchBasic.UI.height - 2)
// batch-process uiAliases
uiAliases = arrayListOf(
// drawn first
uiVitalPrimary,
uiVitalSecondary,
uiVitalItem,
//uiVitalPrimary,
//uiVitalSecondary,
//uiVitalItem,
uiPieMenu,
uiQuickBar,
uiWatchBasic,
@@ -234,27 +294,26 @@ class StateInGame : BasicGameState() {
)
uiAlasesPausing.forEach { addUI(it) } // put them all to the UIContainer
uiAliases.forEach { addUI(it) } // put them all to the UIContainer
// audio test
//AudioResourceLibrary.ambientsWoods[0].play()
}
var particlesActive = 0
private set
override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) {
///////////////
// prod code //
///////////////
override fun render(delta: Float) {
Gdx.graphics.setTitle(GAME_NAME +
" — F: ${Gdx.graphics.framesPerSecond} (${TerrarumGDX.TARGET_INTERNAL_FPS})" +
" — M: ${TerrarumGDX.memInUse}M / ${TerrarumGDX.memTotal}M / ${TerrarumGDX.memXmx}M"
)
/** UPDATE CODE GOES HERE */
particlesActive = 0
Terrarum.delta = delta
setAppTitle()
KeyToggler.update(gc.input)
GameController.processInput(gc, delta, gc.input)
KeyToggler.update()
GameController.processInput(delta)
if (!paused) {
@@ -265,26 +324,22 @@ class StateInGame : BasicGameState() {
BlockPropUtil.dynamicLumFuncTickClock()
world.updateWorldTime(delta)
//WorldSimulator(player, delta)
WeatherMixer.update(gc, delta)
WeatherMixer.update(delta)
BlockStats.update()
if (!(CommandDict["setgl"] as SetGlobalLightOverride).lightOverride)
world.globalLight = constructRGBFromInt(
WeatherMixer.globalLightNow.redByte,
WeatherMixer.globalLightNow.greenByte,
WeatherMixer.globalLightNow.blueByte
)
world.globalLight = WeatherMixer.globalLightNow.toRGB10()
///////////////////////////
// input-related updates //
///////////////////////////
uiContainer.forEach { it.processInput(gc, delta, gc.input) }
uiContainer.forEach { it.processInput(delta) }
////////////////////////////
// camera-related updates //
////////////////////////////
FeaturesDrawer.update(gc, delta)
FeaturesDrawer.update(delta)
WorldCamera.update()
@@ -298,8 +353,8 @@ class StateInGame : BasicGameState() {
wakeDormantActors()
// determine whether the actor should keep being activated or be dormant
KillOrKnockdownActors()
updateActors(gc, delta)
particlesContainer.forEach { if (!it.flagDespawn) particlesActive++; it.update(gc, delta) }
updateActors(delta)
particlesContainer.forEach { if (!it.flagDespawn) particlesActive++; it.update(delta) }
// TODO thread pool(?)
CollisionSolver.process()
}
@@ -308,9 +363,9 @@ class StateInGame : BasicGameState() {
////////////////////////
// ui-related updates //
////////////////////////
uiContainer.forEach { it.update(gc, delta) }
debugWindow.update(gc, delta)
notifier.update(gc, delta)
uiContainer.forEach { it.update(delta) }
debugWindow.update(delta)
notifier.update(delta)
// update debuggers using javax.swing //
if (Authenticator.b()) {
@@ -325,9 +380,183 @@ class StateInGame : BasicGameState() {
/////////////////////////
// determine if lightmap blending should be done
Terrarum.setConfig("smoothlighting", KeyToggler.isOn(KEY_LIGHTMAP_SMOOTH))
TerrarumGDX.setConfig("smoothlighting", KeyToggler.isOn(KEY_LIGHTMAP_SMOOTH))
/** RENDER CODE GOES HERE */
renderGame(batch, delta)
}
private fun renderGame(batch: SpriteBatch, delta: Float) {
Gdx.gl.glClearColor(.157f, .157f, .157f, 0f)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
camera.position.set(-WorldCamera.x.toFloat(), -WorldCamera.y.toFloat(), 0f) // make camara work
batch.projectionMatrix = camera.combined
TerrarumGDX.GLOBAL_RENDER_TIMER += 1
// clean the shit beforehand
worldDrawFrameBuffer.inAction {
Gdx.gl.glClearColor(0f,0f,0f,1f)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
}
backDrawFrameBuffer.inAction {
Gdx.gl.glClearColor(0f,0f,0f,1f)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
}
blendNormal()
backDrawFrameBuffer.inAction {
batch.inUse {
WeatherMixer.render(batch) // drawing to gwin so that any lights from lamp wont "leak" to the skybox
// e.g. Bright blue light on sunset
}
}
blendNormal()
/////////////////////////////
// draw map related stuffs //
/////////////////////////////
worldDrawFrameBuffer.inAction {
batch.inUse {
BlocksDrawer.renderWall(batch)
actorsRenderBehind.forEach { it.drawBody(batch) }
actorsRenderBehind.forEach { it.drawGlow(batch) }
particlesContainer.forEach { it.drawBody(batch) }
particlesContainer.forEach { it.drawGlow(batch) }
BlocksDrawer.renderTerrain(batch)
/////////////////
// draw actors //
/////////////////
actorsRenderMiddle.forEach { it.drawBody(batch) }
actorsRenderMidTop.forEach { it.drawBody(batch) }
player?.drawBody(batch)
actorsRenderFront.forEach { it.drawBody(batch) }
// --> Change of blend mode <-- introduced by childs of ActorWithBody //
/////////////////////////////
// draw map related stuffs //
/////////////////////////////
LightmapRenderer.renderLightMap()
BlocksDrawer.renderFront(batch, false)
// --> blendNormal() <-- by BlocksDrawer.renderFront
FeaturesDrawer.render(batch)
FeaturesDrawer.drawEnvOverlay(batch)
if (!KeyToggler.isOn(KEY_LIGHTMAP_RENDER)) blendMul()
else blendNormal()
LightmapRenderer.draw(batch)
//////////////////////
// draw actor glows //
//////////////////////
actorsRenderMiddle.forEach { it.drawGlow(batch) }
actorsRenderMidTop.forEach { it.drawGlow(batch) }
player?.drawGlow(batch)
actorsRenderFront.forEach { it.drawGlow(batch) }
// --> blendLightenOnly() <-- introduced by childs of ActorWithBody //
////////////////////////
// debug informations //
////////////////////////
blendNormal()
// draw reference ID if debugWindow is open
if (debugWindow.isVisible) {
actorContainer.forEachIndexed { i, actor ->
if (actor is ActorWithBody) {
batch.color = Color.WHITE
TerrarumGDX.fontSmallNumbers.draw(batch,
actor.referenceID.toString(),
actor.hitbox.startX.toFloat(),
actor.hitbox.canonicalY.toFloat() + 4
)
}
}
}
// debug physics
if (KeyToggler.isOn(Key.F11)) {
actorContainer.forEachIndexed { i, actor ->
if (actor is ActorWithPhysics) {
/*shapeRenderer.inUse(ShapeRenderer.ShapeType.Line) {
shapeRenderer.color = Color(1f, 0f, 1f, 1f)
//shapeRenderer.lineWidth = 1f
shapeRenderer.rect(
actor.hitbox.startX.toFloat(),
actor.hitbox.startY.toFloat(),
actor.hitbox.width.toFloat(),
actor.hitbox.height.toFloat()
)
}*/
// velocity
batch.color = Color.CHARTREUSE//GameFontBase.codeToCol["g"]
TerrarumGDX.fontSmallNumbers.draw(batch,
"${0x7F.toChar()}X ${actor.externalForce.x}",
actor.hitbox.startX.toFloat(),
actor.hitbox.canonicalY.toFloat() + 4 + 8
)
TerrarumGDX.fontSmallNumbers.draw(batch,
"${0x7F.toChar()}Y ${actor.externalForce.y}",
actor.hitbox.startX.toFloat(),
actor.hitbox.canonicalY.toFloat() + 4 + 8 * 2
)
}
}
}
// fluidmap debug
if (KeyToggler.isOn(Key.F4))
WorldSimulator.drawFluidMapDebug(batch)
}
}
/////////////////
// GUI Predraw //
/////////////////
//worldG.flush()
//backG.drawImage(worldDrawFrameBuffer.getScaledCopy(screenZoom), 0f, 0f)
//backG.flush()
/////////////////////
// draw UIs ONLY! //
/////////////////////
uiContainer.forEach { if (it != consoleHandler) it.render(batch) }
debugWindow.render(batch)
// make sure console draws on top of other UIs
consoleHandler.render(batch)
notifier.render(batch)
//////////////////
// GUI Postdraw //
//////////////////
//backG.flush()
//gwin.drawImage(backDrawFrameBuffer, 0f, 0f)
// centre marker
/*gwin.color = Color(0x00FFFF)
gwin.lineWidth = 1f
gwin.drawLine(Gdx.graphics.width / 2f, 0f, Gdx.graphics.width / 2f, Gdx.graphics.height.toFloat())
gwin.drawLine(0f, Gdx.graphics.height / 2f, Gdx.graphics.width.toFloat(), Gdx.graphics.height / 2f)*/
}
private fun repossessActor() {
// check if currently pocessed actor is removed from game
if (!theGameHasActor(player)) {
@@ -345,7 +574,7 @@ class StateInGame : BasicGameState() {
}
playableActorDelegate = newActor
WorldSimulator(player, delta)
WorldSimulator(player, Gdx.graphics.deltaTime)
}
private fun changePossession(refid: Int) {
@@ -360,192 +589,9 @@ class StateInGame : BasicGameState() {
// accept new delegate
playableActorDelegate = PlayableActorDelegate(getActorByID(refid) as ActorHumanoid)
playableActorDelegate!!.actor.collisionType = ActorWithPhysics.COLLISION_KINEMATIC
WorldSimulator(player, delta)
WorldSimulator(player, Gdx.graphics.deltaTime)
}
private fun setAppTitle() {
Terrarum.appgc.setTitle(
Terrarum.NAME +
" — F: ${Terrarum.appgc.fps} (${Terrarum.TARGET_INTERNAL_FPS})" +
" — M: ${Terrarum.memInUse}M / ${Terrarum.memTotal}M / ${Terrarum.memXmx}M"
)
}
override fun render(gc: GameContainer, sbg: StateBasedGame, gwin: Graphics) {
Terrarum.GLOBAL_RENDER_TIMER += 1
// clean the shit beforehand
worldG.clear()
backG.clear()
blendNormal()
drawSkybox(backG) // drawing to gwin so that any lights from lamp wont "leak" to the skybox
// e.g. Bright blue light on sunset
// make camara work
worldG.translate(-WorldCamera.x.toFloat(), -WorldCamera.y.toFloat())
blendNormal()
/////////////////////////////
// draw map related stuffs //
/////////////////////////////
BlocksDrawer.renderWall(worldG)
actorsRenderBehind.forEach { it.drawBody(worldG) }
actorsRenderBehind.forEach { it.drawGlow(worldG) }
particlesContainer.forEach { it.drawBody(worldG) }
particlesContainer.forEach { it.drawGlow(worldG) }
BlocksDrawer.renderTerrain(worldG)
/////////////////
// draw actors //
/////////////////
actorsRenderMiddle.forEach { it.drawBody(worldG) }
actorsRenderMidTop.forEach { it.drawBody(worldG) }
player?.drawBody(worldG)
actorsRenderFront.forEach { it.drawBody(worldG) }
// --> Change of blend mode <-- introduced by childs of ActorWithBody //
/////////////////////////////
// draw map related stuffs //
/////////////////////////////
LightmapRenderer.renderLightMap()
BlocksDrawer.renderFront(worldG, false)
// --> blendNormal() <-- by BlocksDrawer.renderFront
FeaturesDrawer.render(gc, worldG)
FeaturesDrawer.drawEnvOverlay(worldG)
if (!KeyToggler.isOn(KEY_LIGHTMAP_RENDER)) blendMul()
else blendNormal()
LightmapRenderer.draw(worldG)
//////////////////////
// draw actor glows //
//////////////////////
actorsRenderMiddle.forEach { it.drawGlow(worldG) }
actorsRenderMidTop.forEach { it.drawGlow(worldG) }
player?.drawGlow(worldG)
actorsRenderFront.forEach { it.drawGlow(worldG) }
// --> blendLightenOnly() <-- introduced by childs of ActorWithBody //
////////////////////////
// debug informations //
////////////////////////
blendNormal()
// draw reference ID if debugWindow is open
if (debugWindow.isVisible) {
actorContainer.forEachIndexed { i, actor ->
if (actor is ActorWithBody) {
worldG.color = Color.white
worldG.font = Terrarum.fontSmallNumbers
worldG.drawString(
actor.referenceID.toString(),
actor.hitbox.startX.toFloat(),
actor.hitbox.canonicalY.toFloat() + 4
)
}
}
}
// debug physics
if (KeyToggler.isOn(Key.F11)) {
actorContainer.forEachIndexed { i, actor ->
if (actor is ActorWithPhysics) {
worldG.color = Color(1f, 0f, 1f, 1f)
worldG.font = Terrarum.fontSmallNumbers
worldG.lineWidth = 1f
worldG.drawRect(
actor.hitbox.startX.toFloat(),
actor.hitbox.startY.toFloat(),
actor.hitbox.width.toFloat(),
actor.hitbox.height.toFloat()
)
// velocity
worldG.color = GameFontBase.codeToCol["g"]
worldG.drawString(
"${0x7F.toChar()}X ${actor.externalForce.x}",
actor.hitbox.startX.toFloat(),
actor.hitbox.canonicalY.toFloat() + 4 + 8
)
worldG.drawString(
"${0x7F.toChar()}Y ${actor.externalForce.y}",
actor.hitbox.startX.toFloat(),
actor.hitbox.canonicalY.toFloat() + 4 + 8 * 2
)
}
}
}
// fluidmap debug
if (KeyToggler.isOn(Key.F4))
WorldSimulator.drawFluidMapDebug(worldG)
/////////////////
// GUI Predraw //
/////////////////
worldG.flush()
backG.drawImage(worldDrawFrameBuffer.getScaledCopy(screenZoom), 0f, 0f)
backG.flush()
/////////////////////
// draw UIs ONLY! //
/////////////////////
uiContainer.forEach { if (it != consoleHandler) it.render(gc, sbg, backG) }
debugWindow.render(gc, sbg, backG)
// make sure console draws on top of other UIs
consoleHandler.render(gc, sbg, backG)
notifier.render(gc, sbg, backG)
//////////////////
// GUI Postdraw //
//////////////////
backG.flush()
gwin.drawImage(backDrawFrameBuffer, 0f, 0f)
// centre marker
/*gwin.color = Color(0x00FFFF)
gwin.lineWidth = 1f
gwin.drawLine(Terrarum.WIDTH / 2f, 0f, Terrarum.WIDTH / 2f, Terrarum.HEIGHT.toFloat())
gwin.drawLine(0f, Terrarum.HEIGHT / 2f, Terrarum.WIDTH.toFloat(), Terrarum.HEIGHT / 2f)*/
}
override fun keyPressed(key: Int, c: Char) {
if (key == Key.GRAVE || key == Key.ESCAPE) {
consoleHandler.toggleOpening()
}
else if (key == Key.F3) {
debugWindow.toggleOpening()
}
GameController.keyPressed(key, c)
}
override fun keyReleased(key: Int, c: Char) { GameController.keyReleased(key, c) }
override fun mouseMoved(oldx: Int, oldy: Int, newx: Int, newy: Int) { GameController.mouseMoved(oldx, oldy, newx, newy) }
override fun mouseDragged(oldx: Int, oldy: Int, newx: Int, newy: Int) { GameController.mouseDragged(oldx, oldy, newx, newy) }
override fun mousePressed(button: Int, x: Int, y: Int) { GameController.mousePressed(button, x, y) }
override fun mouseReleased(button: Int, x: Int, y: Int) { GameController.mouseReleased(button, x, y) }
override fun mouseWheelMoved(change: Int) { GameController.mouseWheelMoved(change) }
override fun controllerButtonPressed(controller: Int, button: Int) { GameController.controllerButtonPressed(controller, button) }
override fun controllerButtonReleased(controller: Int, button: Int) { GameController.controllerButtonReleased(controller, button) }
override fun getID(): Int = Terrarum.STATE_ID_GAME
private fun drawSkybox(g: Graphics) = WeatherMixer.render(g)
/** Send message to notifier UI and toggle the UI as opened. */
fun sendNotification(msg: Array<String>) {
(notifier.UI as Notification).sendNotification(msg)
@@ -600,17 +646,16 @@ class StateInGame : BasicGameState() {
*
* NOTE: concurrency for actor updating is currently disabled because of it's poor performance
*/
fun updateActors(gc: GameContainer, delta: Int) {
if (false) { // don't multithread this for now, it's SLOWER //if (Terrarum.MULTITHREAD && actorContainer.size > Terrarum.THREADS) {
fun updateActors(delta: Float) {
if (false) { // don't multithread this for now, it's SLOWER //if (TerrarumGDX.MULTITHREAD && actorContainer.size > TerrarumGDX.THREADS) {
val actors = actorContainer.size.toFloat()
// set up indices
for (i in 0..Terrarum.THREADS - 1) {
for (i in 0..TerrarumGDX.THREADS - 1) {
ThreadParallel.map(
i,
ThreadActorUpdate(
actors.div(Terrarum.THREADS).times(i).roundInt(),
actors.div(Terrarum.THREADS).times(i.plus(1)).roundInt() - 1,
gc, delta
actors.div(TerrarumGDX.THREADS).times(i).roundInt(),
actors.div(TerrarumGDX.THREADS).times(i.plus(1)).roundInt() - 1
),
"ActorUpdate"
)
@@ -620,18 +665,18 @@ class StateInGame : BasicGameState() {
}
else {
actorContainer.forEach {
it.update(gc, delta)
it.update(delta)
if (it is Pocketed) {
it.inventory.forEach { inventoryEntry ->
inventoryEntry.item.effectWhileInPocket(gc, delta)
inventoryEntry.item.effectWhileInPocket(delta)
if (it.equipped(inventoryEntry.item)) {
inventoryEntry.item.effectWhenEquipped(gc, delta)
inventoryEntry.item.effectWhenEquipped(delta)
}
}
}
}
AmmoMeterProxy(player!!, uiVitalItem.UI as UIVitalMetre)
//AmmoMeterProxy(player!!, uiVitalItem.UI as UIVitalMetre)
}
}
@@ -646,26 +691,26 @@ class StateInGame : BasicGameState() {
min(// take min of normal position and wrapped (x < 0) position
(a.hitbox.centeredX - p.hitbox.centeredX).sqr() +
(a.hitbox.centeredY - p.hitbox.centeredY).sqr(),
(a.hitbox.centeredX - p.hitbox.centeredX + world.width * TILE_SIZE).sqr() +
(a.hitbox.centeredX - p.hitbox.centeredX + world.width * FeaturesDrawer.TILE_SIZE).sqr() +
(a.hitbox.centeredY - p.hitbox.centeredY).sqr(),
(a.hitbox.centeredX - p.hitbox.centeredX - world.width * TILE_SIZE).sqr() +
(a.hitbox.centeredX - p.hitbox.centeredX - world.width * FeaturesDrawer.TILE_SIZE).sqr() +
(a.hitbox.centeredY - p.hitbox.centeredY).sqr()
)
private fun distToCameraSqr(a: ActorWithBody) =
min(
(a.hitbox.startX - WorldCamera.x).sqr() +
(a.hitbox.startY - WorldCamera.y).sqr(),
(a.hitbox.startX - WorldCamera.x + world.width * TILE_SIZE).sqr() +
(a.hitbox.startX - WorldCamera.x + world.width * FeaturesDrawer.TILE_SIZE).sqr() +
(a.hitbox.startY - WorldCamera.y).sqr(),
(a.hitbox.startX - WorldCamera.x - world.width * TILE_SIZE).sqr() +
(a.hitbox.startX - WorldCamera.x - world.width * FeaturesDrawer.TILE_SIZE).sqr() +
(a.hitbox.startY - WorldCamera.y).sqr()
)
/** whether the actor is within screen */
private fun ActorWithBody.inScreen() =
distToCameraSqr(this) <=
(Terrarum.WIDTH.plus(this.hitbox.width.div(2)).times(1 / Terrarum.ingame!!.screenZoom).sqr() +
Terrarum.HEIGHT.plus(this.hitbox.height.div(2)).times(1 / Terrarum.ingame!!.screenZoom).sqr())
(Gdx.graphics.width.plus(this.hitbox.width.div(2)).times(1 / TerrarumGDX.ingame!!.screenZoom).sqr() +
Gdx.graphics.height.plus(this.hitbox.height.div(2)).times(1 / TerrarumGDX.ingame!!.screenZoom).sqr())
/** whether the actor is within update range */
@@ -879,4 +924,29 @@ class StateInGame : BasicGameState() {
lock.unlock()
}
}
override fun pause() {
// TODO no pause when off-focus on desktop
}
override fun resume() {
}
override fun hide() {
}
override fun resize(width: Int, height: Int) {
worldDrawFrameBuffer.dispose()
worldDrawFrameBuffer = FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.width.div(ZOOM_MIN).ceilInt(), Gdx.graphics.height.div(ZOOM_MIN).ceilInt(), false)
backDrawFrameBuffer.dispose()
backDrawFrameBuffer = FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.width, Gdx.graphics.height, false)
// Set up viewport when window is resized
initViewPort(width, height, width.toFloat() / height.toFloat())
}
override fun dispose() {
worldDrawFrameBuffer.dispose()
backDrawFrameBuffer.dispose()
}
}

View File

@@ -1,323 +0,0 @@
package net.torvald.terrarum
import net.torvald.terrarum.Terrarum.STATE_ID_TEST_INPUT
import net.torvald.terrarum.gameactors.roundInt
import net.torvald.terrarum.gameworld.toUint
import net.torvald.terrarum.virtualcomputer.terminal.ALException
import org.lwjgl.BufferUtils
import org.lwjgl.openal.AL
import org.lwjgl.openal.AL10
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.nio.ByteBuffer
import java.util.ArrayList
import javax.sound.midi.*
import kotlin.experimental.and
/**
* Midi input test for Spieluhr (this game's version of Note Block)
*
* Spieluhrs can make sound ranged from C1 to C6
* (61 keys, which is the most common Midi Keyboard configuration)
*
* There is some latency if you are on Windows. Mac and Linux should be okay
* because real musicians use Mac anyway, for a reason.
*
* Created by SKYHi14 on 2017-03-17.
*/
class StateMidiInputTest : BasicGameState() {
var midiKeyboard: MidiDevice? = null
val beeperSlave = BeeperSlave()
val preferredDeviceList = arrayOf(
"USB MIDI"
)
val avoidedDeviceList = arrayOf(
"Real Time Sequencer"
)
init {
val midiDevInfo = MidiSystem.getMidiDeviceInfo()
midiDevInfo.forEach {
//println(it)
val device = MidiSystem.getMidiDevice(it)
try {
if (!avoidedDeviceList.contains(device.deviceInfo.name)) {
device.transmitter // test if tranmitter available
//println("Transmitter: $it")
midiKeyboard = device
}
}
catch (e: MidiUnavailableException) {
//println("(no transmitter found)")
}
//println()
}
//midiKeyboard = MidiSystem.getMidiDevice()
}
override fun init(container: GameContainer?, game: StateBasedGame?) {
if (midiKeyboard != null) {
midiKeyboard!!.open()
midiKeyboard!!.transmitter.receiver = MidiInputReceiver(beeperSlave)
println("Opened Midi device ${midiKeyboard!!.deviceInfo.name}")
}
else {
println("Midi keyboard not found, using computer keyboard as a controller.")
}
}
override fun update(container: GameContainer?, game: StateBasedGame?, delta: Int) {
beeperSlave.runBeepQueueManager(delta)
}
override fun getID() = STATE_ID_TEST_INPUT
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
g.font = Terrarum.fontGame
g.drawString("Listening from ${midiKeyboard!!.deviceInfo.name}", 10f, 10f)
}
class MidiInputReceiver(val slave: BeeperSlave) : Receiver {
override fun send(message: MidiMessage, timeStamp: Long) {
//println("MIDI Event ${message}")
val parsedEvent = ParseMidiMessage(message)
println(parsedEvent ?: "Don't care")
if (parsedEvent != null) {
if (!parsedEvent.isNoteOff) {
slave.enqueueBeep(100, parsedEvent.frequency())
}
}
}
override fun close() {
}
}
}
class BeeperSlave {
///////////////////
// BEEPER DRIVER //
///////////////////
private val beepMaxLen = 10000
// let's regard it as a tracker...
private val beepQueue = ArrayList<Pair<Int, Double>>()
private var beepCursor = -1
private var beepQueueLineExecTimer: Millisec = 0
private var beepQueueFired = false
fun update(delta: Int) {
runBeepQueueManager(delta)
}
fun runBeepQueueManager(delta: Int) {
// start emitTone queue
if (beepQueue.size > 0 && beepCursor == -1) {
beepCursor = 0
}
// advance emitTone queue
if (beepCursor >= 0 && beepQueueLineExecTimer >= beepQueueGetLenOfPtn(beepCursor)) {
beepQueueLineExecTimer -= beepQueueGetLenOfPtn(beepCursor)
beepCursor += 1
beepQueueFired = false
}
// complete emitTone queue
if (beepCursor >= beepQueue.size) {
clearBeepQueue()
}
// actually play queue
if (beepCursor >= 0 && beepQueue.size > 0 && !beepQueueFired) {
playTone(beepQueue[beepCursor].first, beepQueue[beepCursor].second)
beepQueueFired = true
// delete sources that is finished. AL is limited to 256 sources. If you exceed it,
// we won't get any more sounds played.
AL10.alSourcei(oldBeepSource, AL10.AL_BUFFER, 0)
AL10.alDeleteSources(oldBeepSource)
AL10.alDeleteBuffers(oldBeepBuffer)
}
if (beepQueueFired) beepQueueLineExecTimer += delta
}
fun clearBeepQueue() {
beepQueue.clear()
beepCursor = -1
beepQueueLineExecTimer = 0
//AL.destroy()
}
fun enqueueBeep(duration: Int, freq: Double) {
beepQueue.add(Pair(Math.min(duration, beepMaxLen), freq))
}
fun beepQueueGetLenOfPtn(ptnIndex: Int) = beepQueue[ptnIndex].first
////////////////////
// TONE GENERATOR //
////////////////////
private val sampleRate = 44100
private var beepSource: Int = -1
private var beepBuffer: Int = -1
private var oldBeepSource: Int = -1
private var oldBeepBuffer: Int = -1
var audioData: ByteBuffer? = null
/**
* @param duration : milliseconds
* @param rampUp
* @param rampDown
*
* ,---. (true, true) ,---- (true, false) ----. (false, true) ----- (false, false)
*/
private fun makeAudioData(duration: Millisec, freq: Double,
rampUp: Boolean = true, rampDown: Boolean = true): ByteBuffer {
val audioData = BufferUtils.createByteBuffer(duration.times(sampleRate).div(1000))
val realDuration = duration * sampleRate / 1000
val chopSize = freq / sampleRate
val amp = Math.max(4600.0 / freq, 1.0)
val nHarmonics = if (freq >= 22050.0) 1
else if (freq >= 11025.0) 2
else if (freq >= 5512.5) 3
else if (freq >= 2756.25) 4
else if (freq >= 1378.125) 5
else if (freq >= 689.0625) 6
else 7
val transitionThre = 974.47218
// TODO volume ramping?
if (freq == 0.0) {
for (x in 0..realDuration - 1) {
audioData.put(0x00.toByte())
}
}
else if (freq < transitionThre) { // chopper generator (for low freq)
for (x in 0..realDuration - 1) {
var sine: Double = amp * Math.cos(Math.PI * 2 * x * chopSize)
if (sine > 0.79) sine = 0.79
else if (sine < -0.79) sine = -0.79
audioData.put(
(0.5 + 0.5 * sine).times(0xFF).roundInt().toByte()
)
}
}
else { // harmonics generator (for high freq)
for (x in 0..realDuration - 1) {
var sine: Double = 0.0
for (k in 1..nHarmonics) { // mix only odd harmonics in order to make a squarewave
sine += Math.sin(Math.PI * 2 * (2*k - 1) * chopSize * x) / (2*k - 1)
}
audioData.put(
(0.5 + 0.5 * sine).times(0xFF).roundInt().toByte()
)
}
}
audioData.rewind()
return audioData
}
fun playTone(leninmilli: Int, freq: Double) {
/*audioData = makeAudioData(leninmilli, freq)
if (!AL.isCreated()) AL.create()
// Clear error stack.
AL10.alGetError()
oldBeepBuffer = beepBuffer
beepBuffer = AL10.alGenBuffers()
checkALError()
try {
AL10.alBufferData(beepBuffer, AL10.AL_FORMAT_MONO8, audioData, sampleRate)
checkALError()
oldBeepSource = beepSource
beepSource = AL10.alGenSources()
checkALError()
try {
AL10.alSourceQueueBuffers(beepSource, beepBuffer)
checkALError()
AL10.alSource3f(beepSource, AL10.AL_POSITION, 0f, 0f, 1f)
AL10.alSourcef(beepSource, AL10.AL_REFERENCE_DISTANCE, 1f)
AL10.alSourcef(beepSource, AL10.AL_MAX_DISTANCE, 1f)
AL10.alSourcef(beepSource, AL10.AL_GAIN, 0.3f)
checkALError()
AL10.alSourcePlay(beepSource)
checkALError()
}
catch (e: ALException) {
AL10.alDeleteSources(beepSource)
}
}
catch (e: ALException) {
AL10.alDeleteSources(beepSource)
}*/
}
// Custom implementation of Util.checkALError() that uses our custom exception.
private fun checkALError() {
val errorCode = AL10.alGetError()
if (errorCode != AL10.AL_NO_ERROR) {
throw ALException(errorCode)
}
}
}
object ParseMidiMessage {
operator fun invoke(message: MidiMessage): MidiKeyEvent? {
val bytes = message.message
val header = bytes[0].toUint().ushr(4) // 0b0000 - 0b1111
if (header == 0b1000) { // note off
return MidiKeyEvent(true, bytes[1].toInt(), bytes[2].toInt()) // no need for uint()
}
else if (header == 0b1001) { // note on
return MidiKeyEvent(false, bytes[1].toInt(), bytes[2].toInt()) // no need for uint()
}
else { // don't care
return null
}
}
data class MidiKeyEvent(val isNoteOff: Boolean, val key: Int, val velocity: Int) {
override fun toString() = "${if (isNoteOff) "Off" else "On "} $key v$velocity"
/**
* @param tuning frequency of middle A (default: 440.0)
*/
fun frequency(tuning: Double = 440.0): Double {
val a3 = 69 // midi note number for middle A
return tuning * Math.pow(2.0, (key - a3) / 12.0)
}
}
}

View File

@@ -1,171 +0,0 @@
package net.torvald.terrarum
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.ui.*
import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.util.*
/**
* Created by minjaesong on 16-07-06.
*/
class StateMonitorCheck : BasicGameState() {
private lateinit var uiMonitorCheck: UIHandler
override fun init(gc: GameContainer, g: StateBasedGame) {
uiMonitorCheck = UIHandler(MonitorCheckUI())
uiMonitorCheck.isVisible = true
}
override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) {
uiMonitorCheck.update(gc, delta)
}
override fun render(gc: GameContainer, sbg: StateBasedGame, g: Graphics) {
uiMonitorCheck.render(gc, sbg, g)
}
override fun keyPressed(key: Int, c: Char) {
//uiMonitorCheck.setAsClose()
}
override fun getID(): Int = Terrarum.STATE_ID_CONFIG_CALIBRATE
class MonitorCheckUI : UICanvas {
override var width = Terrarum.WIDTH
override var height = Terrarum.HEIGHT
override var openCloseTime = 150
override var handler: UIHandler? = null
private val backgroundCol = Color(0x404040)
private val colourLUT = IntArray(32, { 255.times(it + 1).div(32) })
val pictograms = ArrayList<Image>()
val imageGallery: UIItemImageGallery
val instructionY = Terrarum.HEIGHT / 2//Terrarum.HEIGHT * 9 / 16
val anykeyY = Terrarum.HEIGHT * 15 / 16
val maru_alt = Regex("CN|JP|K[RP]|TW")
init {
if (Terrarum.gameLocale.length >= 4 && Terrarum.gameLocale.contains(maru_alt))
pictograms.add(Image("./assets/graphics/gui/monitor_good_alt_maru.tga"))
else
pictograms.add(Image("./assets/graphics/gui/monitor_good.tga"))
pictograms.add(Image("./assets/graphics/gui/monitor_bad.tga"))
imageGallery = UIItemImageGallery(
this, 0, instructionY, Terrarum.WIDTH, anykeyY - instructionY, pictograms
)
}
override fun update(gc: GameContainer, delta: Int) {
}
override fun render(gc: GameContainer, g: Graphics) {
val titleY = Terrarum.HEIGHT * 7 / 16
val barWidthAll = Terrarum.WIDTH.div(100).times(100) * 9 / 10
val barWidth: Int = barWidthAll / 32 + 1
val barHeight = 90
val yCentre = Terrarum.HEIGHT.shr(1)
val barNumberGap = 5
g.background = Color.black
// draw bars
for (i in 0..31) {
val labelW = g.font.getWidth(i.plus(1).toString())
val labelH = g.font.lineHeight
val barXstart = center(Terrarum.WIDTH, barWidthAll) + i.times(barWidth)
val barYstart = center(yCentre, barHeight)
// bar start point indicator
if (i == 0) {
g.color = backgroundCol
g.drawLine(
barXstart.toFloat(), barYstart - barNumberGap - labelH.toFloat(),
barXstart.toFloat(), barYstart - barNumberGap.toFloat()
)
}
// bar numbers
if (i.plus(1) and 0x1 == 0 || i.plus(1) == 1) {
g.color = Color.white
g.drawString(
i.plus(1).toString(),
barXstart + center(barWidth, labelW).toFloat(),
barYstart - barNumberGap - labelH.toFloat()
)
}
// actual bar
g.color = Color(colourLUT[i], colourLUT[i], colourLUT[i])
g.fillRect(
barXstart.toFloat(),
barYstart.toFloat(),
barWidth.toFloat(),
barHeight.toFloat()
)
}
// messages background
g.color = backgroundCol
g.fillRect(
0f, Terrarum.HEIGHT.shr(1).toFloat(),
Terrarum.WIDTH.toFloat(), Terrarum.HEIGHT.shr(1).plus(1).toFloat()
)
// labels
g.color = Color.white
Typography.printCentered(
g, Lang["MENU_MONITOR_CALI_TITLE"],
titleY,
this
)
// message text
/*(1..12).forEach {
Typography.printCentered(
g, Lang["MENU_MONITOR_CALI_LABEL_$it"],
instructionY + it.minus(2).times(g.font.lineHeight),
this
)
}*/
// message pictogram
imageGallery.render(gc, g)
// anykey
Typography.printCentered(
g, Lang["MENU_LABEL_PRESS_ANYKEY"],
anykeyY,
this
)
}
override fun processInput(gc: GameContainer, delta: Int, input: Input) {
}
override fun doOpening(gc: GameContainer, delta: Int) {
}
override fun doClosing(gc: GameContainer, delta: Int) {
}
override fun endOpening(gc: GameContainer, delta: Int) {
}
override fun endClosing(gc: GameContainer, delta: Int) {
}
private fun center(x1: Int, x2: Int) = x1.minus(x2).div(2)
}
}

View File

@@ -1,43 +0,0 @@
package net.torvald.terrarum
import net.torvald.imagefont.NewRunes
import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
/**
* Created by SKYHi14 on 2017-03-24.
*/
class StateNewRunesTest : BasicGameState() {
lateinit var runes: NewRunes
override fun init(gc: GameContainer, game: StateBasedGame) {
runes = NewRunes()
runes.scale = 2
}
override fun update(gc: GameContainer, game: StateBasedGame, delta: Int) {
}
override fun render(gc: GameContainer, game: StateBasedGame, g: Graphics) {
g.background = Color(0x282828)
g.font = runes
g.color = Color(0x00c0f3)
val text = arrayOf(
"ㅎㅏㅣㄹㅏㄹㅍㅏㄴㅌㅏㅈㅣ",
"ㅈㅔㄹㄷㅏㅢㅈㅓㄴㅅㅓㄹ.", // <<insert troll_face here>>
".22884646ㄴㄱ."
)
text.forEachIndexed { index, s ->
g.drawString(s, 30f, 30f + (runes.lineHeight * index))
}
}
override fun getID(): Int = Terrarum.STATE_ID_TEST_FONT
}

View File

@@ -1,284 +0,0 @@
package net.torvald.terrarum
import com.sudoplay.joise.Joise
import com.sudoplay.joise.module.*
import net.torvald.random.HQRNG
import net.torvald.terrarum.concurrent.ThreadParallel
import net.torvald.terrarum.gameactors.roundInt
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.ImageBuffer
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.util.*
/**
* WARNING! HAS SERIOUS MEMORY LEAK
*
* Created by SKYHi14 on 2017-01-30.
*/
class StateNoiseTester : BasicGameState() {
companion object {
val imagesize = 512
val sampleDensity = 1.0
val noiseImageBuffer = ImageBuffer(imagesize, imagesize)
var generating = false
}
override fun init(p0: GameContainer?, p1: StateBasedGame?) {
generateNoiseImage()
}
private fun noise(seed: Long): Joise {
/* Init */
val joiseSeed = seed
val lowlandMagic: Long = 0x44A21A114DBE56 // maria lindberg
val highlandMagic: Long = 0x0114E091 // olive oyl
val mountainMagic: Long = 0x115AA4DE2504 // lisa anderson
val selectionMagic: Long = 0x44E10D9B100 // melody blue
val ground_gradient = ModuleGradient()
ground_gradient.setGradient(0.0, 0.0, 0.0, 1.0)
/* Lowlands */
val lowland_shape_fractal = ModuleFractal()
lowland_shape_fractal.setType(ModuleFractal.FractalType.FBM)
lowland_shape_fractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
lowland_shape_fractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
lowland_shape_fractal.setNumOctaves(2)
lowland_shape_fractal.setFrequency(1.0)
lowland_shape_fractal.seed = joiseSeed xor lowlandMagic
val lowland_autocorrect = ModuleAutoCorrect()
lowland_autocorrect.setSource(lowland_shape_fractal)
lowland_autocorrect.setLow(0.0)
lowland_autocorrect.setHigh(1.0)
val lowland_scale = ModuleScaleOffset()
lowland_scale.setSource(lowland_autocorrect)
lowland_scale.setScale(0.2)
lowland_scale.setOffset(-0.25)
val lowland_y_scale = ModuleScaleDomain()
lowland_y_scale.setSource(lowland_scale)
lowland_y_scale.setScaleY(0.0)
val lowland_terrain = ModuleTranslateDomain()
lowland_terrain.setSource(ground_gradient)
lowland_terrain.setAxisYSource(lowland_y_scale)
/* highlands */
val highland_shape_fractal = ModuleFractal()
highland_shape_fractal.setType(ModuleFractal.FractalType.RIDGEMULTI)
highland_shape_fractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
highland_shape_fractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
highland_shape_fractal.setNumOctaves(2)
highland_shape_fractal.setFrequency(2.0)
highland_shape_fractal.seed = joiseSeed xor highlandMagic
val highland_autocorrect = ModuleAutoCorrect()
highland_autocorrect.setSource(highland_shape_fractal)
highland_autocorrect.setLow(0.0)
highland_autocorrect.setHigh(1.0)
val highland_scale = ModuleScaleOffset()
highland_scale.setSource(highland_autocorrect)
highland_scale.setScale(0.45)
highland_scale.setOffset(0.0)
val highland_y_scale = ModuleScaleDomain()
highland_y_scale.setSource(highland_scale)
highland_y_scale.setScaleY(0.0)
val highland_terrain = ModuleTranslateDomain()
highland_terrain.setSource(ground_gradient)
highland_terrain.setAxisYSource(highland_y_scale)
/* mountains */
val mountain_shape_fractal = ModuleFractal()
mountain_shape_fractal.setType(ModuleFractal.FractalType.BILLOW)
mountain_shape_fractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
mountain_shape_fractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
mountain_shape_fractal.setNumOctaves(4)
mountain_shape_fractal.setFrequency(1.0)
mountain_shape_fractal.seed = joiseSeed xor mountainMagic
val mountain_autocorrect = ModuleAutoCorrect()
mountain_autocorrect.setSource(mountain_shape_fractal)
mountain_autocorrect.setLow(0.0)
mountain_autocorrect.setHigh(1.0)
val mountain_scale = ModuleScaleOffset()
mountain_scale.setSource(mountain_autocorrect)
mountain_scale.setScale(0.75)
mountain_scale.setOffset(0.25)
val mountain_y_scale = ModuleScaleDomain()
mountain_y_scale.setSource(mountain_scale)
mountain_y_scale.setScaleY(0.1) // controls "quirkiness" of the mountain
val mountain_terrain = ModuleTranslateDomain()
mountain_terrain.setSource(ground_gradient)
mountain_terrain.setAxisYSource(mountain_y_scale)
/* selection */
val terrain_type_fractal = ModuleFractal()
terrain_type_fractal.setType(ModuleFractal.FractalType.FBM)
terrain_type_fractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
terrain_type_fractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
terrain_type_fractal.setNumOctaves(3)
terrain_type_fractal.setFrequency(0.5)
terrain_type_fractal.seed = joiseSeed xor selectionMagic
val terrain_autocorrect = ModuleAutoCorrect()
terrain_autocorrect.setSource(terrain_type_fractal)
terrain_autocorrect.setLow(0.0)
terrain_autocorrect.setHigh(1.0)
val terrain_type_cache = ModuleCache()
terrain_type_cache.setSource(terrain_autocorrect)
val highland_mountain_select = ModuleSelect()
highland_mountain_select.setLowSource(highland_terrain)
highland_mountain_select.setHighSource(mountain_terrain)
highland_mountain_select.setControlSource(terrain_type_cache)
highland_mountain_select.setThreshold(0.55)
highland_mountain_select.setFalloff(0.15)
val highland_lowland_select = ModuleSelect()
highland_lowland_select.setLowSource(lowland_terrain)
highland_lowland_select.setHighSource(highland_mountain_select)
highland_lowland_select.setControlSource(terrain_type_cache)
highland_lowland_select.setThreshold(0.25)
highland_lowland_select.setFalloff(0.15)
val ground_select = ModuleSelect()
ground_select.setLowSource(0.0)
ground_select.setHighSource(1.0)
ground_select.setThreshold(0.5)
ground_select.setControlSource(highland_lowland_select)
val joise = Joise(ground_select)
return joise
}
fun generateNoiseImage() {
val noiseModule = noise(HQRNG().nextLong()) // change noise function here
for (y in 0..imagesize - 1) {
for (x in 0..imagesize - 1) {
noiseImageBuffer.setRGBA(x, y, 0, 0, 0, 255)
}
}
for (i in 0..Terrarum.THREADS - 1) {
ThreadParallel.map(
i,
ThreadRunNoiseSampling(
imagesize.toFloat().div(Terrarum.THREADS).times(i).roundInt(),
imagesize.toFloat().div(Terrarum.THREADS).times(i.plus(1)).roundInt() - 1,
noiseModule
),
"SampleJoiseMap"
)
}
ThreadParallel.startAll()
}
override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle(
Terrarum.NAME +
" — F: ${Terrarum.appgc.fps} (${Terrarum.TARGET_INTERNAL_FPS})" +
" — M: ${Terrarum.memInUse}M / ${Terrarum.memTotal}M / ${Terrarum.memXmx}M"
)
if (ThreadParallel.allFinished()) generating = false
}
override fun getID() = Terrarum.STATE_ID_TOOL_NOISEGEN
override fun render(gc: GameContainer, sbg: StateBasedGame, g: Graphics) {
g.color = Color.red
g.drawString("Press SPACE to generate new noise", 8f, 8f)
g.drawString("CPUs: ${Terrarum.THREADS}", Terrarum.WIDTH - 90f, 8f)
g.background = Color.cyan
g.drawImage(noiseImageBuffer.image,//noiseImage,
Terrarum.WIDTH.minus(imagesize).div(2).toFloat(),
Terrarum.HEIGHT.minus(imagesize).div(2).toFloat()
)
}
override fun keyPressed(key: Int, c: Char) {
if (c == ' ' && !generating) {
println("Generating noise, may take a while")
generating = true
generateNoiseImage()
}
}
class ThreadRunNoiseSampling(val startIndex: Int, val endIndex: Int, val joise: Joise) : Runnable {
/*override fun run() {
for (sy in startIndex..endIndex) {
for (sx in 0..imagesize - 1) {
val y = sy.toDouble() / imagesize
val x = sx.toDouble() / imagesize
val sampleOffset = sampleDensity
// 4-D toroidal sampling (looped H and V)
val sampleTheta1 = x * Math.PI * 2.0
val sampleTheta2 = y * Math.PI * 2.0
val sampleX = Math.sin(sampleTheta1) * sampleDensity + sampleDensity
val sampleY = Math.cos(sampleTheta1) * sampleDensity + sampleDensity
val sampleZ = Math.sin(sampleTheta2) * sampleDensity + sampleDensity
val sampleW = Math.cos(sampleTheta2) * sampleDensity + sampleDensity
val noise = joise.get(
sampleX, sampleY, sampleZ, sampleW
) // autocorrection REQUIRED!
val noiseCol = noise.times(255f).toInt()
noiseImageBuffer.setRGBA(sx, sy, noiseCol, noiseCol, noiseCol, 255)
}
}
}*/
override fun run() {
for (sy in startIndex..endIndex) {
for (sx in 0..imagesize - 1) {
val y = sy.toDouble() / imagesize * 1.5 -.6
val x = sx.toDouble() / imagesize
val sampleOffset = sampleDensity
// 4-D toroidal sampling (looped H and V)
val sampleTheta1 = x * Math.PI * 2.0
val sampleX = Math.sin(sampleTheta1) * sampleDensity + sampleDensity
val sampleZ = Math.cos(sampleTheta1) * sampleDensity + sampleDensity
val sampleY = y
val noise = joise.get(
sampleX, sampleY, sampleZ
) // autocorrection REQUIRED!
val noiseCol = noise.times(255f).toInt()
noiseImageBuffer.setRGBA(sx, sy, noiseCol, noiseCol, noiseCol, 255)
}
}
}
}
}

View File

@@ -1,203 +0,0 @@
package net.torvald.terrarum
import com.sudoplay.joise.Joise
import com.sudoplay.joise.module.*
import net.torvald.terrarum.Terrarum.STATE_ID_TOOL_NOISEGEN
import net.torvald.terrarum.concurrent.ThreadParallel
import net.torvald.terrarum.gameactors.roundInt
import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.util.*
/**
* Created by minjaesong on 2016-12-21.
*/
class StateNoiseTexGen : BasicGameState() {
companion object {
val imagesize = 512
val sampleDensity = 1.0
val noiseImageBuffer = ImageBuffer(imagesize, imagesize)
var generating = false
}
override fun init(p0: GameContainer?, p1: StateBasedGame?) {
generateNoiseImage()
}
private fun noiseRidged(): Joise {
val ridged = ModuleFractal()
ridged.setType(ModuleFractal.FractalType.RIDGEMULTI)
ridged.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
ridged.setNumOctaves(4)
ridged.setFrequency(1.0)
ridged.seed = Random().nextLong()
val ridged_autocorrect = ModuleAutoCorrect()
ridged_autocorrect.setRange(0.0, 1.0)
ridged_autocorrect.setSource(ridged)
return Joise(ridged_autocorrect)
}
private fun noiseBrownian(): Joise {
val ridged = ModuleFractal()
ridged.setType(ModuleFractal.FractalType.FBM)
ridged.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
ridged.setNumOctaves(8)
ridged.setFrequency(1.0)
ridged.seed = Random().nextLong()
val ridged_autocorrect = ModuleAutoCorrect()
ridged_autocorrect.setRange(0.0, 1.0)
ridged_autocorrect.setSource(ridged)
return Joise(ridged_autocorrect)
}
private fun noiseBrownianGranite(): Joise {
val ridged = ModuleFractal()
ridged.setType(ModuleFractal.FractalType.FBM)
ridged.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
ridged.setNumOctaves(2)
ridged.setFrequency(16.0)
ridged.seed = Random().nextLong()
val brownian_select = ModuleSelect()
brownian_select.setControlSource(ridged)
brownian_select.setThreshold(0.8)
brownian_select.setLowSource(0.0)
brownian_select.setHighSource(1.0)
return Joise(brownian_select)
}
private fun noiseBillowFractal(): Joise {
val ridged = ModuleFractal()
ridged.setType(ModuleFractal.FractalType.BILLOW)
ridged.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
ridged.setNumOctaves(8)
ridged.setFrequency(1.0)
ridged.seed = Random().nextLong()
val ridged_autocorrect = ModuleAutoCorrect()
ridged_autocorrect.setRange(0.0, 1.0)
ridged_autocorrect.setSource(ridged)
return Joise(ridged_autocorrect)
}
private fun noiseSimplex(): Joise {
val simplex = ModuleFractal()
simplex.seed = Random().nextLong()
simplex.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.SIMPLEX)
simplex.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.LINEAR)
simplex.setNumOctaves(2)
simplex.setFrequency(1.0)
val simplex_autocorrect = ModuleAutoCorrect()
simplex_autocorrect.setRange(0.0, 1.0)
simplex_autocorrect.setSource(simplex)
return Joise(simplex_autocorrect)
}
private fun noiseCellular(): Joise {
val cellgen = ModuleCellGen()
cellgen.seed = Random().nextLong()
val cellular = ModuleCellular()
cellular.setCellularSource(cellgen)
cellular.setCoefficients(-1.0, 1.0, 0.0, 0.0)
val cellular_autocorrect = ModuleAutoCorrect()
cellular_autocorrect.setRange(0.0, 1.0)
cellular_autocorrect.setSource(cellular)
return Joise(cellular_autocorrect)
}
fun generateNoiseImage() {
val noiseModule = noiseBrownianGranite() // change noise function here
for (y in 0..imagesize - 1) {
for (x in 0..imagesize - 1) {
noiseImageBuffer.setRGBA(x, y, 0, 0, 0, 255)
}
}
for (i in 0..Terrarum.THREADS - 1) {
ThreadParallel.map(
i,
ThreadRunNoiseSampling(
imagesize.toFloat().div(Terrarum.THREADS).times(i).roundInt(),
imagesize.toFloat().div(Terrarum.THREADS).times(i.plus(1)).roundInt() - 1,
noiseModule
),
"SampleJoiseMap"
)
}
ThreadParallel.startAll()
}
override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle("${Terrarum.NAME} — F: ${Terrarum.appgc.fps}")
if (ThreadParallel.allFinished()) generating = false
}
override fun getID() = STATE_ID_TOOL_NOISEGEN
override fun render(gc: GameContainer, sbg: StateBasedGame, g: Graphics) {
g.color = Color.red
g.drawString("Press SPACE to generate new noise", 8f, 8f)
g.drawString("CPUs: ${Terrarum.THREADS}", Terrarum.WIDTH - 90f, 8f)
g.background = Color.cyan
val img = noiseImageBuffer.image
g.drawImage(img,//noiseImage,
Terrarum.WIDTH.minus(imagesize).div(2).toFloat(),
Terrarum.HEIGHT.minus(imagesize).div(2).toFloat()
)
img.destroy()
}
override fun keyPressed(key: Int, c: Char) {
if (c == ' ' && !generating) {
println("Generating noise, may take a while")
generating = true
generateNoiseImage()
}
}
class ThreadRunNoiseSampling(val startIndex: Int, val endIndex: Int, val joise: Joise) : Runnable {
override fun run() {
for (sy in startIndex..endIndex) {
for (sx in 0..imagesize - 1) {
val y = sy.toDouble() / imagesize
val x = sx.toDouble() / imagesize
val sampleOffset = sampleDensity
// 4-D toroidal sampling (looped H and V)
val sampleTheta1 = x * Math.PI * 2.0
val sampleTheta2 = y * Math.PI * 2.0
val sampleX = Math.sin(sampleTheta1) * sampleDensity + sampleDensity
val sampleY = Math.cos(sampleTheta1) * sampleDensity + sampleDensity
val sampleZ = Math.sin(sampleTheta2) * sampleDensity + sampleDensity
val sampleW = Math.cos(sampleTheta2) * sampleDensity + sampleDensity
val noise = joise.get(
sampleX, sampleY, sampleZ, sampleW
) // autocorrection REQUIRED!
val noiseCol = noise.times(255f).toInt()
noiseImageBuffer.setRGBA(sx, sy, noiseCol, noiseCol, noiseCol, 255)
}
}
}
}
}

View File

@@ -1,100 +0,0 @@
package net.torvald.terrarum
import org.lwjgl.opengl.*
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import org.newdawn.slick.opengl.renderer.SGL
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import shader.Shader
import org.lwjgl.opengl.GL11
import org.lwjgl.opengl.ARBShaderObjects
import com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.close
import jdk.nashorn.internal.runtime.ScriptingFunctions.readLine
import net.torvald.terrarum.Terrarum.STATE_ID_TEST_SHADER
import net.torvald.terrarum.gameworld.fmod
import org.newdawn.slick.Color
import org.newdawn.slick.opengl.TextureImpl
import java.io.InputStreamReader
import java.io.BufferedReader
import java.io.File
import java.io.FileInputStream
/**
* Created by SKYHi14 on 2017-01-23.
*/
class StateShaderTest : BasicGameState() {
override fun getID() = STATE_ID_TEST_SHADER
override fun init(container: GameContainer?, game: StateBasedGame?) {
}
private lateinit var shaderTest: Shader
private lateinit var testImage: Image
override fun enter(container: GameContainer?, game: StateBasedGame?) {
shaderTest = Shader.makeShader("./assets/test.vert", "./assets/test.frag")
testImage = Image("./assets/test_texture.tga")
//testImage = Image("./logo_repository.png")
}
override fun update(container: GameContainer?, game: StateBasedGame?, delta: Int) {
Terrarum.appgc.setTitle("${Terrarum.NAME} — F: ${Terrarum.appgc.fps}")
}
override fun render(container: GameContainer?, game: StateBasedGame?, g: Graphics?) {
val x = 10f
val y = 10f
val width = testImage.width
val height = testImage.height
val textureWidth = testImage.textureWidth
val textureHeight = testImage.textureHeight
val textureOffsetX = testImage.textureOffsetX
val textureOffsetY = testImage.textureOffsetY
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT)
// bind texture
// glBegin(SGL.GL_QUADS)
// do shader
// glEnd()
//testImage.bind()
GL11.glBegin(GL11.GL_QUADS)
//GL20.glUseProgram(0)
shaderTest.startShader()
//GL13.glActiveTexture(testImage.texture.textureID)
//GL11.glBindTexture(GL13.GL_TEXTURE0, testImage.texture.textureID)
//testImage.bind()
shaderTest.setUniformIntVariable("u_texture", 0)
/*GL11.glTexCoord2f(textureOffsetX, textureOffsetY)
GL11.glVertex3f(x, y, 0f)
GL11.glTexCoord2f(textureOffsetX, textureOffsetY + textureHeight)
GL11.glVertex3f(x, y + height, 0f)
GL11.glTexCoord2f(textureOffsetX + textureWidth, textureOffsetY + textureHeight)
GL11.glVertex3f(x + width, y + height, 0f)
GL11.glTexCoord2f(textureOffsetX + textureWidth, textureOffsetY)
GL11.glVertex3f(x + width, y, 0f)*/
g!!.color = Color.orange
g!!.fillRect(10f, 10f, 512f, 512f)
GL20.glUseProgram(0)
GL11.glEnd()
}
}

View File

@@ -1,138 +0,0 @@
package net.torvald.terrarum
import com.jme3.math.FastMath
import net.torvald.terrarum.gameactors.roundInt
import net.torvald.terrarum.gamecontroller.Key
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.ui.DrawUtil
import net.torvald.terrarum.ui.NullUI
import net.torvald.terrarum.ui.UIItemImageGallery
import net.torvald.terrarum.ui.Typography
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.util.*
/**
* Created by minjaesong on 16-08-04.
*/
class StateSplash : BasicGameState() {
val pictogramCollection = ArrayList<Image>()
val virtualImageHeight = 100
var imageBoardHeight = 0
var imageBoardOffset = 0
lateinit var fadeSheet: Image
lateinit var thisG: Graphics
var opacity = 0f
val fadeTime = 500
var fadeTimer = -1
var anykey_hit = false
val backgroundColour = Color(0x303030)
val deltathre = 500
val auto_dismiss = 6500
var opened = false
var init = false
lateinit var imageGallery: UIItemImageGallery
override fun init(container: GameContainer?, game: StateBasedGame?) {
// pre-load lang
Lang["MENU_LANGUAGE_THIS"]
pictogramCollection.add(Image("./assets/graphics/gui/health_take_a_break.tga"))
pictogramCollection.add(Image("./assets/graphics/gui/health_distance.tga"))
fadeSheet = Image(Terrarum.WIDTH, Terrarum.HEIGHT)
thisG = fadeSheet.graphics
thisG.font = Terrarum.fontGame
imageBoardHeight = Terrarum.HEIGHT - thisG.font.lineHeight.times(6)
imageBoardOffset = thisG.font.lineHeight.times(3)
imageGallery = UIItemImageGallery(
NullUI(), 0, imageBoardOffset, Terrarum.WIDTH, imageBoardHeight, pictogramCollection
)
}
override fun update(container: GameContainer, game: StateBasedGame, delta: Int) {
// next splash or load next scene
if (anykey_hit && opacity < 0.0001f) {
game.enterState(Terrarum.STATE_ID_GAME)
}
// fade-in
if (delta < deltathre) {
init = true
fadeTimer += delta
if (opacity < 1f && !anykey_hit) {
opacity = FastMath.interpolateLinear(
fadeTimer.toFloat() / fadeTime, 0f, 1f
)
}
else if (opacity > 0f && anykey_hit) {
opacity = FastMath.interpolateLinear(
fadeTimer.toFloat() / fadeTime, 1f, 0f
)
}
if (!opened && fadeTimer >= fadeTime && !anykey_hit) {
fadeTimer = 0
opened = true
}
}
// auto dismiss
if (opened && fadeTimer >= auto_dismiss) {
doAnykeyThingy()
}
}
override fun getID(): Int = Terrarum.STATE_ID_SPLASH
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
thisG.color = backgroundColour
thisG.fillRect(0f, 0f, fadeSheet.width.toFloat(), fadeSheet.height.toFloat())
thisG.color = Color.white
Typography.printCentered(thisG, Lang["APP_WARNING_HEALTH_AND_SAFETY"],
thisG.font.lineHeight * 2)
Typography.printCentered(thisG, Lang["MENU_LABEL_PRESS_ANYKEY"],
Terrarum.HEIGHT - thisG.font.lineHeight.times(3))
imageGallery.render(container, thisG)
g.drawImage(fadeSheet, 0f, 0f, Color(1f, 1f, 1f, opacity))
}
override fun keyPressed(key: Int, c: Char) {
doAnykeyThingy()
}
override fun controllerButtonPressed(controller: Int, button: Int) {
doAnykeyThingy()
}
private fun doAnykeyThingy() {
if (!anykey_hit) {
anykey_hit = true
fadeTimer = 0
}
}
}

View File

@@ -1,65 +0,0 @@
package net.torvald.terrarum
import net.torvald.terrarum.gamecontroller.Key
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
/**
* Created by SKYHi14 on 2017-04-22.
*/
class StateStutterTest : BasicGameState() {
private val testImage = Image(4096, 1728)
private val testImageG = testImage.graphics
override fun init(container: GameContainer?, game: StateBasedGame?) {
}
override fun update(container: GameContainer, game: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle("${Terrarum.NAME} — F: ${Terrarum.appgc.fps}")
if (container.input.isKeyDown(Key.UP))
dy -= moveDelta
if (container.input.isKeyDown(Key.DOWN))
dy += moveDelta
if (container.input.isKeyDown(Key.LEFT))
dx -= moveDelta
if (container.input.isKeyDown(Key.RIGHT))
dx += moveDelta
}
override fun getID() = Terrarum.STATE_ID_TEST_REFRESHRATE
private var imageMade = false
private var moveDelta = 3
private var dx = 0
private var dy = 0
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
if (!imageMade) {
testImageG.font = Terrarum.fontGame
testImageG.color = Color.white
(0x3400..0x9FFF).forEach {
testImageG.drawString(
"${it.toChar()}",
(it - 0x3400) % 256 * 16f,
(it - 0x3400) / 256 * 16f
)
}
testImageG.flush()
imageMade = true
}
g.translate(-dx.toFloat(), -dy.toFloat())
g.drawImage(testImage, 0f, 0f)
}
}

View File

@@ -1,137 +0,0 @@
package net.torvald.terrarum
import com.jme3.math.FastMath
import net.torvald.colourutil.ColourTemp
import net.torvald.point.Point2d
import net.torvald.random.HQRNG
import net.torvald.random.TileableValueNoise
import net.torvald.terrarum.gameactors.floorInt
import net.torvald.terrarum.gameactors.roundInt
import net.torvald.terrarum.virtualcomputer.terminal.ALException
import org.apache.commons.csv.CSVRecord
import org.lwjgl.BufferUtils
import org.lwjgl.openal.AL
import org.lwjgl.openal.AL10
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
import java.io.ByteArrayInputStream
import java.nio.ByteBuffer
import java.util.*
import javax.sound.sampled.AudioFormat
import javax.sound.sampled.AudioInputStream
import javax.sound.sampled.AudioSystem
/**
* Created by minjaesong on 16-09-05.
*/
class StateTestingLightning : BasicGameState() {
val lightning_start = Point2d(50.0, 100.0)
val lightning_end = Point2d(750.0, 300.0)
val bolt = LightingBolt(lightning_start, lightning_end, 50)
override fun init(container: GameContainer?, game: StateBasedGame?) {
reseed(genOnly = true)
}
override fun update(container: GameContainer?, game: StateBasedGame?, delta: Int) {
/*timer += delta
if (timer > regenTime) {
timer -= regenTime
reseed()
}*/
}
override fun getID() = Terrarum.STATE_ID_TEST_GFX
private var timer = 0
private var regenTime = 17
private var seed = System.nanoTime()
val samples = 128
val lightningXgen = TileableValueNoise(8, 0.67f, samples, 8)
val lightningYgen = TileableValueNoise(8, 0.58f, samples, 4)
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
g.color = ColourTemp(7500)
g.lineWidth = 3f
//g.drawLine(lightning_start, lightning_end)
//bolt.draw(g)
// TODO rotational transformmation for the points
// (newX, newY) = (x cos(theta) - y sin(theta), x sin(theta) + y cos(theta))
val ampY = 40f
val ampX = 6
val xoff = 10f
val yoff = 300f
for (x in 0..lightningYgen.width - 1) {
val pXstart = (x + lightningXgen[x ]) * ampX + xoff
val pXend = (x + 1 + lightningXgen[x + 1]) * ampX + xoff
val pYstart = lightningYgen[x ] * ampY + yoff
val pYend = lightningYgen[x + 1] * ampY + yoff
g.drawLine(pXstart, pYstart, pXend, pYend)
}
g.color = Color.red
g.lineWidth = 1f
g.drawLine(xoff, yoff, xoff + lightningYgen.width * ampX, yoff)
}
override fun keyPressed(key: Int, c: Char) {
if (c == ' ') reseed()
}
private fun reseed(genOnly: Boolean = false) {
if (!genOnly) seed = System.nanoTime()
lightningXgen.generate(0x51621DL xor seed)
lightningYgen.generate(seed)
}
}
class LightingBolt(val start: Point2d, val end: Point2d, val segments: Int) {
val mainBolt = LinkedList<Point2d>() //Pair<Length, Y-Pos>
val boltYDev = 20.0
init {
val length = start.length(end)
for (i in 0..segments - 1) {
mainBolt.add(
Point2d(
start.x + length / segments * i,
start.y + HQRNG().nextFloat().times(2.0).minus(1.0).times(boltYDev)
)
)
}
}
fun draw(g: Graphics) {
for (i in 0..segments - 1) {
val startpoint = mainBolt[i]
val endpoint = if (i == segments - 1) end else mainBolt[i + 1]
g.drawLine(startpoint, endpoint)
}
}
fun Graphics.drawLine(p1: Point2d, p2: Point2d) {
drawLine(p1.x.toFloat(), p1.y.toFloat(), p2.x.toFloat(), p2.y.toFloat())
}
}

View File

@@ -1,109 +0,0 @@
package net.torvald.terrarum
import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.itemproperties.IVKey
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.itemproperties.Material
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.ui.*
import org.newdawn.slick.*
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
/**
* Created by SKYHi14 on 2017-03-13.
*/
class StateUITest : BasicGameState() {
val ui: UIHandler
private val actor = object : Actor(RenderOrder.FRONT), Pocketed {
override fun update(gc: GameContainer, delta: Int) {
TODO("not implemented")
}
override fun run() {
TODO("not implemented")
}
override fun onActorValueChange(key: String, value: Any?) {
}
override var inventory: ActorInventory = ActorInventory(this, 100, ActorInventory.CAPACITY_MODE_WEIGHT)
}
init {
ui = UIHandler(UIInventory(actor, 900, Terrarum.HEIGHT - 160, 220))
ui.posX = 0
ui.posY = 60
ui.isVisible = true
// these are the test codes.
// Item properties must be pre-composed using CSV/JSON, and read and made into the item instance
// using factory/builder pattern. @see ItemCodex
actor.inventory.add(object : GameItem() {
init {
itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.HAMMER
}
override var dynamicID: Int = 5656
override val originalID = dynamicID
override val isUnique: Boolean = true
override var originalName: String = "Test tool"
override var baseMass: Double = 12.0
override var baseToolSize: Double? = 8.0
override var inventoryCategory: String = GameItem.Category.TOOL
override var maxDurability: Int = 143
override var durability: Float = 64f
override var stackable = false
override val isDynamic = true
override val material = Material(0,0,0,0,0,0,0,0,0,0.0)
})
actor.inventory.getByDynamicID(5656)!!.item.name = "Test tool"
actor.inventory.add(object : GameItem() {
init {
itemProperties[IVKey.ITEMTYPE] = IVKey.ItemType.ARTEFACT
}
override var dynamicID: Int = 4633
override val originalID = dynamicID
override val isUnique: Boolean = true
override var originalName: String = "CONTEXT_ITEM_QUEST_NOUN"
override var baseMass: Double = 1.4
override var baseToolSize: Double? = null
override var inventoryCategory: String = GameItem.Category.MISC
override var stackable = false
override val isDynamic = false
override val material = Material(0,0,0,0,0,0,0,0,0,0.0)
})
actor.inventory.add(ItemCodex[16], 543)
actor.inventory.getByDynamicID(Block.STONE)!!.item equipTo actor
}
override fun init(container: GameContainer?, game: StateBasedGame?) {
}
override fun update(container: GameContainer, game: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle("${Terrarum.NAME} — F: ${Terrarum.appgc.fps}")
ui.update(container, delta)
}
override fun getID() = Terrarum.STATE_ID_TEST_UI1
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
blendNormal()
g.color = Color.green
g.fillRect(0f, 0f, 2048f, 2048f)
ui.render(container, game, g)
}
}

View File

@@ -1,64 +0,0 @@
package net.torvald.terrarum
import net.torvald.terrarum.gamecontroller.Key
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
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import org.newdawn.slick.state.BasicGameState
import org.newdawn.slick.state.StateBasedGame
/**
* ComputerCraft/OpenComputers like-alike, just for fun!
*
* Created by minjaesong on 16-09-07.
*/
class StateVTTest : BasicGameState() {
// HiRes: 100x64, LoRes: 80x25
val computerInside = TerrarumComputer(peripheralSlots = 8)
val vt = SimpleTextTerminal(SimpleTextTerminal.BLUE_NOVELTY, 80, 25,
computerInside, colour = false, hires = false)
val vtUI = Image(vt.displayW, vt.displayH)
init {
computerInside.attachTerminal(vt)
}
override fun init(container: GameContainer, game: StateBasedGame) {
//vt.openInput()
}
override fun update(container: GameContainer, game: StateBasedGame, delta: Int) {
Terrarum.appgc.setTitle("VT — F: ${container.fps}" +
" — M: ${Terrarum.memInUse}M / ${Terrarum.memXmx}M")
vt.update(container, delta)
computerInside.update(container, delta)
}
override fun getID() = Terrarum.STATE_ID_TEST_TTY
private val paperColour = Color(0xfffce6)
val vtUIrenderX = Terrarum.WIDTH.minus(vtUI.width).div(2f)
val vtUIrenderY = Terrarum.HEIGHT.minus(vtUI.height).div(2f)
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
vt.render(container, vtUI.graphics)
blendNormal()
g.drawImage(vtUI, vtUIrenderX, vtUIrenderY)
}
override fun keyPressed(key: Int, c: Char) {
vt.keyPressed(key, c)
}
}

View File

@@ -1,689 +0,0 @@
package net.torvald.terrarum
import com.google.gson.JsonArray
import com.google.gson.JsonPrimitive
import net.torvald.imagefont.GameFontImpl
import net.torvald.terrarum.utils.JsonFetcher
import net.torvald.terrarum.utils.JsonWriter
import net.torvald.imagefont.TinyAlphNum
import net.torvald.terrarum.gamecontroller.mouseTileX
import net.torvald.terrarum.gamecontroller.mouseTileY
import net.torvald.terrarum.gameworld.toUint
import net.torvald.terrarum.langpack.Lang
import org.lwjgl.input.Controllers
import org.lwjgl.opengl.*
import org.newdawn.slick.*
import org.newdawn.slick.opengl.Texture
import org.newdawn.slick.state.StateBasedGame
import java.io.File
import java.io.IOException
import java.nio.ByteOrder
import java.text.SimpleDateFormat
import java.util.*
import java.util.logging.FileHandler
import java.util.logging.Level
import java.util.logging.Logger
import java.util.logging.SimpleFormatter
const val GAME_NAME = "Terrarum"
typealias Millisec = Int
/**
* Created by minjaesong on 15-12-30.
*/
object Terrarum : StateBasedGame(GAME_NAME) {
//////////////////////////////
// GLOBAL IMMUTABLE CONFIGS //
//////////////////////////////
var WIDTH = 1072
var HEIGHT = 742 // IMAX ratio
val RENDER_FPS = getConfigInt("displayfps")
val USE_VSYNC = getConfigBoolean("usevsync")
var VSYNC = USE_VSYNC
val VSYNC_TRIGGER_THRESHOLD = 56
val HALFW: Int
get() = WIDTH.ushr(1)
val HALFH: Int
get() = HEIGHT.ushr(1)
/**
* To be used with physics simulator
*/
val TARGET_FPS = 50
/**
* To be used with render, to achieve smooth frame drawing
* TARGET_INTERNAL_FPS > TARGET_FPS for smooth frame drawing
* Must choose a value so that (1000 / VAL) is still integer
*/
val TARGET_INTERNAL_FPS = 100
/**
* For the events depends on rendering frame (e.g. flicker on post-hit invincibility)
*/
var GLOBAL_RENDER_TIMER = Random().nextInt(1020) + 1
val sysLang: String
get() {
val lan = System.getProperty("user.language")
val country = System.getProperty("user.country")
return lan + country
}
lateinit var appgc: AppGameContainer
var ingame: StateInGame? = null
private val gameConfig = GameConfig()
val OSName = System.getProperty("os.name")
val OSVersion = System.getProperty("os.version")
lateinit var OperationSystem: String // all caps "WINDOWS, "OSX", "LINUX", "SOLARIS", "UNKNOWN"
private set
val isWin81: Boolean
get() = OperationSystem == "WINDOWS" && OSVersion.toDouble() >= 8.1
lateinit var defaultDir: String
private set
lateinit var defaultSaveDir: String
private set
val memInUse: Long
get() = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) shr 20
val memTotal: Long
get() = Runtime.getRuntime().totalMemory() shr 20
val memXmx: Long
get() = Runtime.getRuntime().maxMemory() shr 20
val environment: RunningEnvironment
private val localeSimple = arrayOf("de", "en", "es", "it")
var gameLocale = "lateinit"
set(value) {
if (localeSimple.contains(value.substring(0..1)))
field = value.substring(0..1)
else
field = value
(fontGame as GameFontImpl).reload()
}
private val nullFont = object : Font {
override fun getHeight(str: String?) = 0
override fun drawString(x: Float, y: Float, text: String?) {}
override fun drawString(x: Float, y: Float, text: String?, col: Color?) {}
override fun drawString(x: Float, y: Float, text: String?, col: Color?, startIndex: Int, endIndex: Int) {}
override fun getWidth(str: String?) = 0
override fun getLineHeight() = 0
}
var fontGame: Font = nullFont
private set
var fontSmallNumbers: Font = nullFont
private set
var joypadLabelStart: Char = 0xE000.toChar() // lateinit
var joypadLableSelect: Char = 0xE000.toChar() // lateinit
var joypadLabelNinA: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinB: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinX: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinY: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinL: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinR: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinZL: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinZR: Char = 0xE000.toChar() // lateinit TODO
val joypadLabelLEFT = 0xE068.toChar()
val joypadLabelDOWN = 0xE069.toChar()
val joypadLabelUP = 0xE06A.toChar()
val joypadLabelRIGHT = 0xE06B.toChar()
// 0x0 - 0xF: Game-related
// 0x10 - 0x1F: Config
// 0x100 and onward: unit tests for dev
val STATE_ID_SPLASH = 0x0
val STATE_ID_HOME = 0x1
val STATE_ID_GAME = 0x3
val STATE_ID_CONFIG_CALIBRATE = 0x11
val STATE_ID_TEST_FONT = 0x100
val STATE_ID_TEST_GFX = 0x101
val STATE_ID_TEST_TTY = 0x102
val STATE_ID_TEST_BLUR = 0x103
val STATE_ID_TEST_SHADER = 0x104
val STATE_ID_TEST_REFRESHRATE = 0x105
val STATE_ID_TEST_INPUT = 0x106
val STATE_ID_TEST_UI1 = 0x110
val STATE_ID_TOOL_NOISEGEN = 0x200
val STATE_ID_TOOL_RUMBLE_DIAGNOSIS = 0x201
var controller: org.lwjgl.input.Controller? = null
private set
val CONTROLLER_DEADZONE = 0.1f
/** Available CPU threads */
val THREADS = Runtime.getRuntime().availableProcessors()
/**
* If the game is multithreading.
* True if:
*
* THREADS >= 2 and config "multithread" is true
*/
val MULTITHREAD: Boolean
get() = THREADS >= 2 && getConfigBoolean("multithread")
private lateinit var configDir: String
/**
* 0xAA_BB_XXXX
* AA: Major version
* BB: Minor version
* XXXX: Revision (Repository commits)
*
* e.g. 0x02010034 can be translated as 2.1.52
*/
const val VERSION_RAW = 0x0002018E
const val VERSION_STRING: String =
"${VERSION_RAW.ushr(24)}.${VERSION_RAW.and(0xFF0000).ushr(16)}.${VERSION_RAW.and(0xFFFF)}"
const val NAME = "Terrarum"
var delta: Int = 0
// these properties goes into the GameContainer
var previousState: Int? = null // to be used with temporary states like StateMonitorCheck
val systemArch = System.getProperty("os.arch")
private val thirtyTwoBitArchs = arrayOf("i386", "i686", "ppc", "x86", "x86_32") // I know I should Write Once, Run Everywhere; but just in case :)
val is32Bit = thirtyTwoBitArchs.contains(systemArch)
lateinit var textureWhite: Image
lateinit var textureBlack: Image
init {
// just in case
println("[Terrarum] os.arch = $systemArch")
if (is32Bit) {
println("Java is running in 32 Bit")
}
joypadLabelStart = when (getConfigString("joypadlabelstyle")) {
"nwii" -> 0xE04B.toChar() // + mark
"logitech" -> 0xE05A.toChar() // number 10
else -> 0xE042.toChar() // |> mark (sonyps, msxb360, generic)
}
joypadLableSelect = when (getConfigString("joypadlabelstyle")) {
"nwii" -> 0xE04D.toChar() // - mark
"logitech" -> 0xE059.toChar() // number 9
"sonyps" -> 0xE043.toChar() // solid rectangle
"msxb360" -> 0xE041.toChar() // <| mark
else -> 0xE043.toChar() // solid rectangle
}
getDefaultDirectory()
createDirs()
val readFromDisk = readConfigJson()
if (!readFromDisk) readConfigJson()
environment = try {
Controllers.getController(0)
if (getConfigString("pcgamepadenv") == "console")
RunningEnvironment.CONSOLE
else
RunningEnvironment.PC
}
catch (e: IndexOutOfBoundsException) {
RunningEnvironment.PC
}
}
@Throws(SlickException::class)
override fun initStatesList(gc: GameContainer) {
textureWhite = Image("./assets/graphics/background_white.png")
textureBlack = Image("./assets/graphics/background_black.png")
fontGame = GameFontImpl()
fontSmallNumbers = TinyAlphNum()
gc.input.enableKeyRepeat()
// get locale from config
val gameLocaleFromConfig = gameConfig.getAsString("language") ?: sysLang
// if bad game locale were set, use system locale
if (gameLocaleFromConfig.length < 2)
gameLocale = sysLang
else
gameLocale = gameLocaleFromConfig
println("[Terrarum] Locale: " + gameLocale)
// search for real controller
// exclude controllers with name "Mouse", "keyboard"
val notControllerRegex = Regex("mouse|keyboard")
try {
// gc.input.controllerCount is unreliable
for (i in 0..255) {
val controllerInQuo = Controllers.getController(i)
println("Controller $i: ${controllerInQuo.name}")
// check the name
if (!controllerInQuo.name.toLowerCase().contains(notControllerRegex)) {
controller = controllerInQuo
println("Controller $i selected: ${controller!!.name}")
break
}
}
// test acquired controller
controller!!.getAxisValue(0)
}
catch (controllerDoesNotHaveAnyAxesException: java.lang.ArrayIndexOutOfBoundsException) {
controller = null
}
if (controller != null) {
for (c in 0..controller!!.axisCount - 1) {
controller!!.setDeadZone(c, CONTROLLER_DEADZONE)
}
}
// load languages
Lang
// load modules
ModMgr
gc.graphics.clear() // clean up any 'dust' in the buffer
//addState(StateVTTest())
//addState(StateGraphicComputerTest())
//addState(StateTestingLightning())
//addState(StateSplash())
//addState(StateMonitorCheck())
//addState(StateFontTester())
//addState(StateNoiseTexGen())
//addState(StateBlurTest())
//addState(StateShaderTest())
//addState(StateNoiseTester())
//addState(StateUITest())
//addState(StateControllerRumbleTest())
//addState(StateMidiInputTest())
//addState(StateNewRunesTest())
//addState(StateStutterTest())
ingame = StateInGame(); addState(ingame)
// foolproof
if (stateCount < 1) {
throw Error("Please add or un-comment addState statements")
}
}
private fun getDefaultDirectory() {
val OS = System.getProperty("os.name").toUpperCase()
if (OS.contains("WIN")) {
OperationSystem = "WINDOWS"
defaultDir = System.getenv("APPDATA") + "/Terrarum"
}
else if (OS.contains("OS X")) {
OperationSystem = "OSX"
defaultDir = System.getProperty("user.home") + "/Library/Application Support/Terrarum"
}
else if (OS.contains("NUX") || OS.contains("NIX")) {
OperationSystem = "LINUX"
defaultDir = System.getProperty("user.home") + "/.Terrarum"
}
else if (OS.contains("SUNOS")) {
OperationSystem = "SOLARIS"
defaultDir = System.getProperty("user.home") + "/.Terrarum"
}
else {
OperationSystem = "UNKNOWN"
defaultDir = System.getProperty("user.home") + "/.Terrarum"
}
defaultSaveDir = defaultDir + "/Saves"
configDir = defaultDir + "/config.json"
println("[Terrarum] os.name = $OSName")
println("[Terrarum] os.version = $OSVersion")
}
private fun createDirs() {
val dirs = arrayOf(File(defaultSaveDir))
dirs.forEach { if (!it.exists()) it.mkdirs() }
}
@Throws(IOException::class)
private fun createConfigJson() {
val configFile = File(configDir)
if (!configFile.exists() || configFile.length() == 0L) {
JsonWriter.writeToFile(DefaultConfig.fetch(), configDir)
}
}
private fun readConfigJson(): Boolean {
try {
// read from disk and build config from it
val jsonObject = JsonFetcher(configDir)
// make config
jsonObject.entrySet().forEach { entry -> gameConfig[entry.key] = entry.value }
return true
}
catch (e: IOException) {
// write default config to game dir. Call this method again to read config from it.
try {
createConfigJson()
}
catch (e1: IOException) {
e.printStackTrace()
}
return false
}
}
/**
* Return config from config set. If the config does not exist, default value will be returned.
* @param key
* *
* @return Config from config set or default config if it does not exist.
* *
* @throws NullPointerException if the specified config simply does not exist.
*/
fun getConfigInt(key: String): Int {
val cfg = getConfigMaster(key)
if (cfg is JsonPrimitive)
return cfg.asInt
else
return cfg as Int
}
/**
* Return config from config set. If the config does not exist, default value will be returned.
* @param key
* *
* @return Config from config set or default config if it does not exist.
* *
* @throws NullPointerException if the specified config simply does not exist.
*/
fun getConfigString(key: String): String {
val cfg = getConfigMaster(key)
if (cfg is JsonPrimitive)
return cfg.asString
else
return cfg as String
}
/**
* Return config from config set. If the config does not exist, default value will be returned.
* @param key
* *
* @return Config from config set or default config if it does not exist.
* *
* @throws NullPointerException if the specified config simply does not exist.
*/
fun getConfigBoolean(key: String): Boolean {
val cfg = getConfigMaster(key)
if (cfg is JsonPrimitive)
return cfg.asBoolean
else
return cfg as Boolean
}
fun getConfigIntArray(key: String): IntArray {
val cfg = getConfigMaster(key)
if (cfg is JsonArray) {
val jsonArray = cfg.asJsonArray
return IntArray(jsonArray.size(), { i -> jsonArray[i].asInt })
}
else
return cfg as IntArray
}
private fun getConfigMaster(key: String): Any {
var cfg: Any? = null
try {
cfg = gameConfig[key.toLowerCase()]!!
}
catch (e: NullPointerException) {
try {
cfg = DefaultConfig.fetch()[key.toLowerCase()]
}
catch (e1: NullPointerException) {
e.printStackTrace()
}
}
return cfg!!
}
fun setConfig(key: String, value: Any) {
gameConfig[key] = value
}
val currentSaveDir: File
get() {
val file = File(defaultSaveDir + "/test")
// failsafe?
if (!file.exists()) file.mkdir()
return file // TODO TEST CODE
}
// for external scripts (e.g. Groovy)
@JvmStatic fun getMouseTileX(): Int = appgc.mouseTileX
@JvmStatic fun getMouseTileY(): Int = appgc.mouseTileY
}
fun main(args: Array<String>) {
System.setProperty("java.library.path", "lib")
System.setProperty("org.lwjgl.librarypath", File("lib").absolutePath)
try {
Terrarum.appgc = AppGameContainer(Terrarum)
Terrarum.appgc.setDisplayMode(Terrarum.WIDTH, Terrarum.HEIGHT, false)
if (Terrarum.RENDER_FPS > 0) {
Terrarum.appgc.setTargetFrameRate(Terrarum.RENDER_FPS)
}
//Terrarum.appgc.setVSync(Terrarum.VSYNC)
Terrarum.appgc.setMaximumLogicUpdateInterval(1000 / Terrarum.TARGET_INTERNAL_FPS) // 10 ms
Terrarum.appgc.setMinimumLogicUpdateInterval(1000 / Terrarum.TARGET_INTERNAL_FPS - 1) // 9 ms
Terrarum.appgc.setMultiSample(0)
Terrarum.appgc.setShowFPS(false)
// game will run normally even if it is not focused
Terrarum.appgc.setUpdateOnlyWhenVisible(false)
Terrarum.appgc.alwaysRender = true
Terrarum.appgc.start()
}
catch (ex: Exception) {
val logger = Logger.getLogger(Terrarum::class.java.name)
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH-mm-ss")
val calendar = Calendar.getInstance()
val filepath = "${Terrarum.defaultDir}/crashlog-${dateFormat.format(calendar.time)}.txt"
val fileHandler = FileHandler(filepath)
logger.addHandler(fileHandler)
val formatter = SimpleFormatter()
fileHandler.formatter = formatter
//logger.info()
println("The game has crashed!")
println("Crash log were saved to $filepath.")
println("================================================================================")
logger.log(Level.SEVERE, null, ex)
}
}
///////////////////////////////////
// customised blending functions //
///////////////////////////////////
fun blendMul() {
// I must say: What the fuck is wrong with you, Slick2D? Your built-it blending is just fucking wrong.
GL11.glEnable(GL11.GL_BLEND)
GL11.glColorMask(true, true, true, true)
GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ONE_MINUS_SRC_ALPHA)
}
fun blendNormal() {
GL11.glEnable(GL11.GL_BLEND)
GL11.glColorMask(true, true, true, true)
//GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA)
// semitransparent textures working as intended with this,
// but needs further investigation in the case of:
// TODO test blend in the situation of semitransparent over semitransparent
GL14.glBlendFuncSeparate(
GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, // blend func for RGB channels
GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA // blend func for alpha channels
)
}
fun blendLightenOnly() {
GL11.glEnable(GL11.GL_BLEND)
GL11.glColorMask(true, true, true, false)
GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE)
GL14.glBlendEquation(GL14.GL_MAX)
}
fun blendAlphaMap() {
GL11.glDisable(GL11.GL_BLEND)
GL11.glColorMask(false, false, false, true)
}
fun blendScreen() {
GL11.glEnable(GL11.GL_BLEND)
GL11.glColorMask(true, true, true, true)
GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_COLOR)
}
fun blendDisable() {
GL11.glDisable(GL11.GL_BLEND)
}
object BlendMode {
const val SCREEN = "GL_BLEND screen"
const val MULTIPLY = "GL_BLEND multiply"
const val NORMAL = "GL_BLEND normal"
const val MAX = "GL_MAX"
fun resolve(mode: String) {
when (mode) {
SCREEN -> blendScreen()
MULTIPLY -> blendMul()
NORMAL -> blendNormal()
MAX -> blendLightenOnly()
else -> throw Error("Unknown blend mode: $mode")
}
}
}
enum class RunningEnvironment {
PC, CONSOLE, MOBILE
}
/** @return Intarray(R, G, B, A) */
fun Texture.getPixel(x: Int, y: Int): IntArray {
val textureWidth = this.textureWidth
val hasAlpha = this.hasAlpha()
val offset = (if (hasAlpha) 4 else 3) * (textureWidth * y + x) // 4: # of channels (RGBA)
if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
return intArrayOf(
this.textureData[offset].toUint(),
this.textureData[offset + 1].toUint(),
this.textureData[offset + 2].toUint(),
if (hasAlpha)
this.textureData[offset + 3].toUint()
else 255
)
}
else {
return intArrayOf(
this.textureData[offset + 2].toUint(),
this.textureData[offset + 1].toUint(),
this.textureData[offset].toUint(),
if (hasAlpha)
this.textureData[offset + 3].toUint()
else 255
)
}
}
/** @return Intarray(R, G, B, A) */
fun Image.getPixel(x: Int, y: Int) = this.texture.getPixel(x, y)
fun Color.toInt() = redByte.shl(16) or greenByte.shl(8) or blueByte
fun Color.to10bit() = redByte.shl(20) or greenByte.shl(10) or blueByte
infix fun Color.screen(other: Color) = Color(
1f - (1f - this.r) * (1f - other.r),
1f - (1f - this.g) * (1f - other.g),
1f - (1f - this.b) * (1f - other.b),
1f - (1f - this.a) * (1f - other.a)
)
infix fun Color.mul(other: Color) = Color( // don't turn into an operator!
this.r * other.r,
this.g * other.g,
this.b * other.b,
this.a * other.a
)
infix fun Color.minus(other: Color) = Color( // don't turn into an operator!
this.r - other.r,
this.g - other.g,
this.b - other.b,
this.a - other.a
)
fun Int.toHex() = this.toLong().and(0xFFFFFFFF).toString(16).padStart(8, '0').toUpperCase()
fun Long.toHex() = {
val sb = StringBuilder()
(0..16).forEach {
}
}

View File

@@ -1,7 +1,610 @@
package net.torvald.terrarum
import com.badlogic.gdx.ApplicationAdapter
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Screen
import com.badlogic.gdx.backends.lwjgl.LwjglApplication
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.GL30
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
import com.google.gson.JsonArray
import com.google.gson.JsonPrimitive
import net.torvald.terrarum.gameactors.ActorWithPhysics.Companion.TILE_SIZE
import net.torvald.terrarum.gamecontroller.GameController
import net.torvald.terrarum.imagefont.TinyAlphNum
import net.torvald.terrarum.utils.JsonFetcher
import net.torvald.terrarum.utils.JsonWriter
import net.torvald.terrarum.worlddrawer.RGB10
import net.torvald.terrarumsansbitmap.gdx.GameFontBase
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import org.lwjgl.input.Controllers
import org.lwjgl.opengl.GL11
import java.io.File
import java.io.IOException
import java.util.*
/**
* Created by minjaesong on 2017-06-15.
*/
object TerrarumGDX {
}
const val GAME_NAME = "Terrarum"
fun main(args: Array<String>) {
val config = LwjglApplicationConfiguration()
config.foregroundFPS = TerrarumGDX.RENDER_FPS
config.backgroundFPS = TerrarumGDX.RENDER_FPS
config.vSyncEnabled = true
config.resizable = false
config.width = 1072
config.height = 742
config.title = GAME_NAME
LwjglApplication(TerrarumGDX, config)
}
typealias RGBA8888 = Int
object TerrarumGDX : ApplicationAdapter() {
lateinit var batch: SpriteBatch
lateinit var shapeRender: ShapeRenderer // DO NOT USE!! for very limited applications e.g. WeatherMixer
inline fun inShapeRenderer(shapeRendererType: ShapeRenderer.ShapeType = ShapeRenderer.ShapeType.Filled, action: (ShapeRenderer) -> Unit) {
shapeRender.begin(shapeRendererType)
action(shapeRender)
shapeRender.end()
}
lateinit var orthoLineTex2px: Texture
lateinit var orthoLineTex3px: Texture
//////////////////////////////
// GLOBAL IMMUTABLE CONFIGS //
//////////////////////////////
val RENDER_FPS = getConfigInt("displayfps")
val USE_VSYNC = getConfigBoolean("usevsync")
var VSYNC = USE_VSYNC
val VSYNC_TRIGGER_THRESHOLD = 56
inline val HALFW: Int
get() = Gdx.graphics.width.ushr(1)
inline val HALFH: Int
get() = Gdx.graphics.height.ushr(1)
/**
* To be used with physics simulator
*/
val TARGET_FPS = 50
/**
* To be used with render, to achieve smooth frame drawing
* TARGET_INTERNAL_FPS > TARGET_FPS for smooth frame drawing
* Must choose a value so that (1000 / VAL) is still integer
*/
val TARGET_INTERNAL_FPS = 100
/**
* For the events depends on rendering frame (e.g. flicker on post-hit invincibility)
*/
var GLOBAL_RENDER_TIMER = Random().nextInt(1020) + 1
val sysLang: String
get() {
val lan = System.getProperty("user.language")
val country = System.getProperty("user.country")
return lan + country
}
lateinit var currentScreen: Screen
var previousScreen: Screen? = null // to be used with temporary states like StateMonitorCheck
var ingame: StateInGameGDX? = null
private val gameConfig = GameConfig()
val OSName = System.getProperty("os.name")
val OSVersion = System.getProperty("os.version")
lateinit var OperationSystem: String // all caps "WINDOWS, "OSX", "LINUX", "SOLARIS", "UNKNOWN"
private set
lateinit var defaultDir: String
private set
lateinit var defaultSaveDir: String
private set
val memInUse: Long
get() = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) shr 20
val memTotal: Long
get() = Runtime.getRuntime().totalMemory() shr 20
val memXmx: Long
get() = Runtime.getRuntime().maxMemory() shr 20
val environment: RunningEnvironment
private val localeSimple = arrayOf("de", "en", "es", "it")
var gameLocale = "lateinit"
set(value) {
if (localeSimple.contains(value.substring(0..1)))
field = value.substring(0..1)
else
field = value
fontGame.reload(value)
}
lateinit var fontGame: GameFontBase
lateinit var fontSmallNumbers: BitmapFont
var joypadLabelStart: Char = 0xE000.toChar() // lateinit
var joypadLableSelect: Char = 0xE000.toChar() // lateinit
var joypadLabelNinA: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinB: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinX: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinY: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinL: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinR: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinZL: Char = 0xE000.toChar() // lateinit TODO
var joypadLabelNinZR: Char = 0xE000.toChar() // lateinit TODO
val joypadLabelLEFT = 0xE068.toChar()
val joypadLabelDOWN = 0xE069.toChar()
val joypadLabelUP = 0xE06A.toChar()
val joypadLabelRIGHT = 0xE06B.toChar()
// 0x0 - 0xF: Game-related
// 0x10 - 0x1F: Config
// 0x100 and onward: unit tests for dev
val STATE_ID_SPLASH = 0x0
val STATE_ID_HOME = 0x1
val STATE_ID_GAME = 0x3
val STATE_ID_CONFIG_CALIBRATE = 0x11
val STATE_ID_TEST_FONT = 0x100
val STATE_ID_TEST_GFX = 0x101
val STATE_ID_TEST_TTY = 0x102
val STATE_ID_TEST_BLUR = 0x103
val STATE_ID_TEST_SHADER = 0x104
val STATE_ID_TEST_REFRESHRATE = 0x105
val STATE_ID_TEST_INPUT = 0x106
val STATE_ID_TEST_UI1 = 0x110
val STATE_ID_TOOL_NOISEGEN = 0x200
val STATE_ID_TOOL_RUMBLE_DIAGNOSIS = 0x201
var controller: org.lwjgl.input.Controller? = null
private set
val CONTROLLER_DEADZONE = 0.1f
/** Available CPU threads */
val THREADS = Runtime.getRuntime().availableProcessors()
/**
* If the game is multithreading.
* True if:
*
* THREADS >= 2 and config "multithread" is true
*/
val MULTITHREAD: Boolean
get() = THREADS >= 2 && getConfigBoolean("multithread")
private lateinit var configDir: String
/**
* 0xAA_BB_XXXX
* AA: Major version
* BB: Minor version
* XXXX: Revision (Repository commits)
*
* e.g. 0x02010034 can be translated as 2.1.52
*/
const val VERSION_RAW = 0x00_02_018E
const val VERSION_STRING: String =
"${VERSION_RAW.ushr(24)}.${VERSION_RAW.and(0xFF0000).ushr(16)}.${VERSION_RAW.and(0xFFFF)}"
const val NAME = "Terrarum"
val systemArch = System.getProperty("os.arch")
val is32BitJVM = !System.getProperty("sun.arch.data.model").contains("64")
init {
println("[Terrarum] os.arch = $systemArch") // debug info
if (is32BitJVM) {
println("32 Bit JVM detected")
}
joypadLabelStart = when (getConfigString("joypadlabelstyle")) {
"nwii" -> 0xE04B.toChar() // + mark
"logitech" -> 0xE05A.toChar() // number 10
else -> 0xE042.toChar() // |> mark (sonyps, msxb360, generic)
}
joypadLableSelect = when (getConfigString("joypadlabelstyle")) {
"nwii" -> 0xE04D.toChar() // - mark
"logitech" -> 0xE059.toChar() // number 9
"sonyps" -> 0xE043.toChar() // solid rectangle
"msxb360" -> 0xE041.toChar() // <| mark
else -> 0xE043.toChar() // solid rectangle
}
getDefaultDirectory()
createDirs()
val readFromDisk = readConfigJson()
if (!readFromDisk) readConfigJson()
environment = try {
Controllers.getController(0) // test if controller exists
if (getConfigString("pcgamepadenv") == "console")
RunningEnvironment.CONSOLE
else
RunningEnvironment.PC
}
catch (e: IndexOutOfBoundsException) {
RunningEnvironment.PC
}
}
override fun create() {
TextureRegionPack.globalFlipY = true // !! TO MAKE LEGACY CODE RENDER ON ITS POSITION !!
Gdx.graphics.isContinuousRendering = true
batch = SpriteBatch()
shapeRender = ShapeRenderer()
orthoLineTex2px = Texture("assets/graphics/ortho_line_tex_2px.tga")
orthoLineTex3px = Texture("assets/graphics/ortho_line_tex_3px.tga")
fontGame = GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap", flipY = true)
fontSmallNumbers = TinyAlphNum
ingame = StateInGameGDX(batch)
ingame!!.enter()
currentScreen = ingame as Screen
}
override fun render() {
currentScreen.render(Gdx.graphics.deltaTime)
}
override fun pause() {
currentScreen.pause()
}
override fun resume() {
currentScreen.resume()
}
override fun dispose() {
currentScreen.dispose()
fontGame.dispose()
fontSmallNumbers.dispose()
//dispose any other resources used in this level
}
override fun resize(width: Int, height: Int) {
currentScreen.resize(width, height)
}
private fun getDefaultDirectory() {
val OS = System.getProperty("os.name").toUpperCase()
if (OS.contains("WIN")) {
OperationSystem = "WINDOWS"
defaultDir = System.getenv("APPDATA") + "/Terrarum"
}
else if (OS.contains("OS X")) {
OperationSystem = "OSX"
defaultDir = System.getProperty("user.home") + "/Library/Application Support/Terrarum"
}
else if (OS.contains("NUX") || OS.contains("NIX")) {
OperationSystem = "LINUX"
defaultDir = System.getProperty("user.home") + "/.Terrarum"
}
else if (OS.contains("SUNOS")) {
OperationSystem = "SOLARIS"
defaultDir = System.getProperty("user.home") + "/.Terrarum"
}
else {
OperationSystem = "UNKNOWN"
defaultDir = System.getProperty("user.home") + "/.Terrarum"
}
defaultSaveDir = defaultDir + "/Saves"
configDir = defaultDir + "/config.json"
println("[Terrarum] os.name = $OSName")
println("[Terrarum] os.version = $OSVersion")
}
private fun createDirs() {
val dirs = arrayOf(File(defaultSaveDir))
dirs.forEach { if (!it.exists()) it.mkdirs() }
}
private fun createConfigJson() {
val configFile = File(configDir)
if (!configFile.exists() || configFile.length() == 0L) {
JsonWriter.writeToFile(DefaultConfig.fetch(), configDir)
}
}
private fun readConfigJson(): Boolean {
try {
// read from disk and build config from it
val jsonObject = JsonFetcher(configDir)
// make config
jsonObject.entrySet().forEach { entry -> gameConfig[entry.key] = entry.value }
return true
}
catch (e: IOException) {
// write default config to game dir. Call this method again to read config from it.
try {
createConfigJson()
}
catch (e1: IOException) {
e.printStackTrace()
}
return false
}
}
/**
* Return config from config set. If the config does not exist, default value will be returned.
* @param key
* *
* @return Config from config set or default config if it does not exist.
* *
* @throws NullPointerException if the specified config simply does not exist.
*/
fun getConfigInt(key: String): Int {
val cfg = getConfigMaster(key)
if (cfg is JsonPrimitive)
return cfg.asInt
else
return cfg as Int
}
/**
* Return config from config set. If the config does not exist, default value will be returned.
* @param key
* *
* @return Config from config set or default config if it does not exist.
* *
* @throws NullPointerException if the specified config simply does not exist.
*/
fun getConfigString(key: String): String {
val cfg = getConfigMaster(key)
if (cfg is JsonPrimitive)
return cfg.asString
else
return cfg as String
}
/**
* Return config from config set. If the config does not exist, default value will be returned.
* @param key
* *
* @return Config from config set or default config if it does not exist.
* *
* @throws NullPointerException if the specified config simply does not exist.
*/
fun getConfigBoolean(key: String): Boolean {
val cfg = getConfigMaster(key)
if (cfg is JsonPrimitive)
return cfg.asBoolean
else
return cfg as Boolean
}
fun getConfigIntArray(key: String): IntArray {
val cfg = getConfigMaster(key)
if (cfg is JsonArray) {
val jsonArray = cfg.asJsonArray
return IntArray(jsonArray.size(), { i -> jsonArray[i].asInt })
}
else
return cfg as IntArray
}
private fun getConfigMaster(key: String): Any {
var cfg: Any? = null
try {
cfg = gameConfig[key.toLowerCase()]!!
}
catch (e: NullPointerException) {
try {
cfg = DefaultConfig.fetch()[key.toLowerCase()]
}
catch (e1: NullPointerException) {
e.printStackTrace()
}
}
return cfg!!
}
fun setConfig(key: String, value: Any) {
gameConfig[key] = value
}
val currentSaveDir: File
get() {
val file = File(defaultSaveDir + "/test")
// failsafe?
if (!file.exists()) file.mkdir()
return file // TODO TEST CODE
}
inline val mouseX: Double
get() = GameController.mouseX.toDouble()
inline val mouseY: Double
get() = GameController.mouseY.toDouble()
@JvmStatic inline val mouseTileX: Int
get() = mouseX.toInt() / TILE_SIZE
@JvmStatic inline val mouseTileY: Int
get() = mouseY.toInt() / TILE_SIZE
inline val mouseScreenX: Int
get() = Gdx.input.x
inline val mouseScreenY: Int
get() = Gdx.input.y
}
inline fun Batch.inUse(action: (Batch) -> Unit) {
this.begin()
action(this)
this.end()
}
inline fun ShapeRenderer.inUse(shapeRendererType: ShapeRenderer.ShapeType = ShapeRenderer.ShapeType.Filled, action: (ShapeRenderer) -> Unit) {
this.begin(shapeRendererType)
action(this)
this.end()
}
/** Use Batch inside of it! */
inline fun FrameBuffer.inAction(action: (FrameBuffer) -> Unit) {
this.begin()
action(this)
this.end()
}
// ShapeRenderer alternative for rects
inline fun SpriteBatch.fillRect(x: Float, y: Float, w: Float, h: Float) {
this.draw(net.torvald.terrarum.TerrarumGDX.orthoLineTex2px, x, y, w, h)
}
inline fun SpriteBatch.drawStraightLine(x: Float, y: Float, p2: Float, thickness: Float, isVertical: Boolean) {
if (!isVertical)
this.fillRect(x, y, p2 - x, thickness)
else
this.fillRect(x, y, thickness, p2 - y)
}
infix fun Color.mul(other: Color): Color = this.mul(other)
inline fun Color.toRGB10(): RGB10 {
val bits = this.toIntBits() // ABGR
// 0bxxRRRRRRRRRRGGGGGGGGGGBBBBBBBBBB
// 0bAAAAAAAABBBBBBBBGGGGGGGGRRRRRRRR
return bits.and(0x0000FF).shl(20) or bits.and(0x00FF00).shl(2) or bits.and(0xFF0000).ushr(16)
}
fun blendMul() {
// I must say: What the fuck is wrong with you, Slick2D? Your built-it blending is just fucking wrong.
TerrarumGDX.batch.enableBlending()
TerrarumGDX.batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA)
Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD) // batch.flush does not touch blend equation
}
fun blendNormal() {
TerrarumGDX.batch.enableBlending()
TerrarumGDX.batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD) // batch.flush does not touch blend equation
}
fun blendLightenOnly() {
TerrarumGDX.batch.enableBlending()
TerrarumGDX.batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE)
Gdx.gl.glBlendEquation(GL30.GL_MAX) // batch.flush does not touch blend equation
}
fun blendScreen() {
TerrarumGDX.batch.enableBlending()
TerrarumGDX.batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_COLOR)
Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD) // batch.flush does not touch blend equation
}
object BlendMode {
const val SCREEN = "GL_BLEND screen"
const val MULTIPLY = "GL_BLEND multiply"
const val NORMAL = "GL_BLEND normal"
const val MAX = "GL_MAX"
fun resolve(mode: String) {
when (mode) {
SCREEN -> blendScreen()
MULTIPLY -> blendMul()
NORMAL -> blendNormal()
MAX -> blendLightenOnly()
else -> throw Error("Unknown blend mode: $mode")
}
}
}
enum class RunningEnvironment {
PC, CONSOLE, MOBILE
}
infix fun Color.screen(other: Color) = Color(
1f - (1f - this.r) * (1f - other.r),
1f - (1f - this.g) * (1f - other.g),
1f - (1f - this.b) * (1f - other.b),
1f - (1f - this.a) * (1f - other.a)
)
infix fun Color.minus(other: Color) = Color( // don't turn into an operator!
this.r - other.r,
this.g - other.g,
this.b - other.b,
this.a - other.a
)
fun Int.toHex() = this.toLong().and(0xFFFFFFFF).toString(16).padStart(8, '0').toUpperCase()
fun Long.toHex() = {
val sb = StringBuilder()
(0..16).forEach {
}
}

View File

@@ -26,7 +26,7 @@ class TestTestTest : ApplicationAdapter() {
batch = SpriteBatch()
img = Texture("assets/test_texture.tga")
gameFont = GameFontBase("assets/graphics/fonts")
gameFont = GameFontBase("assets/graphics/fonts/terrarum-sans-bitmap")
//gameFont = BitmapFont()
}

View File

@@ -1,15 +1,15 @@
package net.torvald.terrarum
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.colourutil.CIELabUtil.darkerLab
import net.torvald.terrarum.gamecontroller.Key
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.ui.UIInventory
import net.torvald.terrarum.ui.UIItem
import net.torvald.terrarum.ui.UIItemTextButton
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
/***
* Note that the UI will not render if either item or itemImage is null.
@@ -23,12 +23,12 @@ class UIItemInventoryElem(
override val width: Int,
var item: GameItem?,
var amount: Int,
var itemImage: Image?,
val mouseOverTextCol: Color = Color(0xfff066),
val mouseoverBackCol: Color = Color(0,0,0,0),
var itemImage: TextureRegion?,
val mouseOverTextCol: Color = Color(0xfff066_ff.toInt()),
val mouseoverBackCol: Color = Color(0),
val mouseoverBackBlendMode: String = BlendMode.NORMAL,
val inactiveTextCol: Color = UIItemTextButton.defaultInactiveCol,
val backCol: Color = Color(0,0,0,0),
val backCol: Color = Color(0),
val backBlendMode: String = BlendMode.NORMAL,
var quickslot: Int? = null,
var equippedSlot: Int? = null,
@@ -45,7 +45,7 @@ class UIItemInventoryElem(
override val height = UIItemInventoryElem.height
private val imgOffset: Float
get() = (this.height - itemImage!!.height).div(2).toFloat() // to snap to the pixel grid
get() = (this.height - itemImage!!.regionHeight).div(2).toFloat() // to snap to the pixel grid
private val textOffsetX = 50f
private val textOffsetY = 8f
@@ -56,7 +56,7 @@ class UIItemInventoryElem(
override fun update(gc: GameContainer, delta: Int) {
override fun update(delta: Float) {
if (item != null) {
}
@@ -64,22 +64,21 @@ class UIItemInventoryElem(
private val fwsp = 0x3000.toChar()
override fun render(gc: GameContainer, g: Graphics) {
g.font = Terrarum.fontGame
override fun render(batch: SpriteBatch) {
// mouseover background
if (item != null || drawBackOnNull) {
// do not highlight even if drawBackOnNull is true
if (mouseUp && item != null) {
BlendMode.resolve(mouseoverBackBlendMode)
g.color = mouseoverBackCol
batch.color = mouseoverBackCol
}
// if drawBackOnNull, just draw background
else {
BlendMode.resolve(backBlendMode)
g.color = backCol
batch.color = backCol
}
g.fillRect(posX.toFloat(), posY.toFloat(), width.toFloat(), height.toFloat())
batch.fillRect(posX.toFloat(), posY.toFloat(), width.toFloat(), height.toFloat())
}
@@ -87,12 +86,12 @@ class UIItemInventoryElem(
blendNormal()
// item image
g.drawImage(itemImage!!, posX + imgOffset, posY + imgOffset)
batch.draw(itemImage, posX + imgOffset, posY + imgOffset)
// if mouse is over, text lights up
// this one-liner sets color
g.color = item!!.nameColour mul if (mouseUp) mouseOverTextCol else inactiveTextCol
g.drawString(
batch.color = item!!.nameColour mul if (mouseUp) mouseOverTextCol else inactiveTextCol
TerrarumGDX.fontGame.draw(batch,
//"$item" + (if (amount > 0 && item!!.stackable) "$fwsp($amount)" else if (amount != 1) "$fwsp!!$amount!!" else "") +
item!!.name + (if (amount > 0 && item!!.stackable) "$fwsp($amount)" else if (amount != 1) "$fwsp!!$amount!!" else "") +
(if (equippedSlot != null) " ${0xE081.toChar()}\$$equippedSlot" else ""),
@@ -105,28 +104,27 @@ class UIItemInventoryElem(
val barFullLen = (width - 8f) - textOffsetX
val barOffset = posX + textOffsetX
if (item!!.maxDurability > 0.0) {
g.color = durabilityBack
g.lineWidth = 3f
g.drawLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen, posY + durabilityBarOffY)
g.color = durabilityCol
g.drawLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen * (item!!.durability / item!!.maxDurability), posY + durabilityBarOffY)
batch.color = durabilityBack
batch.drawStraightLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen, 3f, false)
batch.color = durabilityCol
batch.drawStraightLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen * (item!!.durability / item!!.maxDurability), 3f, false)
}
// quickslot marker (TEMPORARY UNTIL WE GET BETTER DESIGN)
if (quickslot != null) {
val label = quickslot!!.plus(0xE010).toChar()
val labelW = g.font.getWidth("$label")
g.color = Color.white
g.drawString("$label", barOffset + barFullLen - labelW, posY + textOffsetY)
val labelW = TerrarumGDX.fontGame.getWidth("$label")
batch.color = Color.WHITE
TerrarumGDX.fontGame.draw(batch, "$label", barOffset + barFullLen - labelW, posY + textOffsetY)
}
}
}
override fun keyPressed(key: Int, c: Char) {
if (item != null && Terrarum.ingame != null && key in Key.NUM_1..Key.NUM_0) {
val inventory = Terrarum.ingame!!.player?.inventory
if (item != null && TerrarumGDX.ingame != null && key in Key.NUM_1..Key.NUM_0) {
val inventory = TerrarumGDX.ingame!!.player?.inventory
val slot = key - Key.NUM_1
val currentSlotItem = inventory?.getQuickBar(slot)
@@ -159,11 +157,11 @@ class UIItemInventoryElem(
}
override fun mousePressed(button: Int, x: Int, y: Int) {
if (item != null && Terrarum.ingame != null) {
if (item != null && TerrarumGDX.ingame != null) {
// equip da shit
val itemEquipSlot = item!!.equipPosition
val player = Terrarum.ingame!!.player
val player = TerrarumGDX.ingame!!.player
if (item != player?.inventory?.itemEquipped?.get(itemEquipSlot)) { // if this item is unequipped, equip it
player?.equipItem(item!!)
@@ -187,4 +185,4 @@ class UIItemInventoryElem(
override fun controllerButtonReleased(controller: Int, button: Int) {
}
}
}

View File

@@ -1,56 +0,0 @@
package net.torvald.terrarum.audio
import org.lwjgl.BufferUtils
import org.lwjgl.openal.AL10
import org.newdawn.slick.Music
import org.newdawn.slick.openal.Audio
import org.newdawn.slick.openal.AudioImpl
import org.newdawn.slick.openal.MODSound
import org.newdawn.slick.openal.StreamSound
import java.util.*
/**
* Created by minjaesong on 16-07-08.
*/
object AudioMixer {
const val TRACK_COUNT = 32
const val TRACK_AMBIENT_ONE = 0 // music track one
const val TRACK_AMBIENT_ONE_NEXT = 1 // music track two
const val TRACK_AMBIENT_TWO = 2 // music track three
const val TRACK_AMBIENT_TWO_NEXT = 3 // music track four
const val TRACK_UI_ONE = 8
const val TRACK_UI_TWO = 9
const val TRACK_SFX_START = 16
const val TRACK_SFX_END = 31
val tracks = ArrayList<Int>(TRACK_COUNT) // stores index of ALSource
init {
tracks[TRACK_AMBIENT_ONE]
}
fun getAudio(track: Int) = tracks[track]
fun play(channel: Int) {
}
/**
* Queue an SFX to any empty SFX track and play it.
*/
fun queueSfx(audio: Audio) {
}
fun update(delta: Int) {
}
class MixerTrack(val audio: Audio, var volume: Float, var pan: Float) {
}
}

View File

@@ -1,9 +1,9 @@
package net.torvald.terrarum.audio
import org.newdawn.slick.openal.Audio
import org.newdawn.slick.openal.AudioLoader
import java.io.File
import java.io.FileInputStream
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.audio.Music
import com.badlogic.gdx.audio.Sound
import net.torvald.terrarum.ModMgr
import java.util.*
/**
@@ -12,24 +12,21 @@ import java.util.*
object AudioResourceLibrary {
// will play as music
val ambientsForest = ArrayList<Audio>()
val ambientsMeadow = ArrayList<Audio>()
val ambientsWindy = ArrayList<Audio>()
val ambientsWoods = ArrayList<Audio>()
val ambientsForest = ArrayList<Music>()
val ambientsMeadow = ArrayList<Music>()
val ambientsWindy = ArrayList<Music>()
val ambientsWoods = ArrayList<Music>()
// will play as sound effect
val crickets = ArrayList<Audio>()
val crickets = ArrayList<Sound>()
init {
ambientsForest.add(AudioLoader.getStreamingAudio("OGG", File("./assets/sounds/ambient/ambient_forest_01.ogg").toURI().toURL()))
ambientsForest.add(Gdx.audio.newMusic(ModMgr.getGdxFile("basegame", "sounds/ambient/ambient_forest_01.ogg")))
ambientsMeadow.add(Gdx.audio.newMusic(ModMgr.getGdxFile("basegame", "sounds/ambient/ambient_meadow_01.ogg")))
ambientsWindy.add(Gdx.audio.newMusic(ModMgr.getGdxFile("basegame", "sounds/ambient/ambient_windy_01.ogg")))
ambientsWoods.add(Gdx.audio.newMusic(ModMgr.getGdxFile("basegame", "sounds/ambient/ambient_woods_01.ogg")))
ambientsMeadow.add(AudioLoader.getStreamingAudio("OGG", File("./assets/sounds/ambient/ambient_meadow_01.ogg").toURI().toURL()))
ambientsWindy.add(AudioLoader.getStreamingAudio("OGG", File("./assets/sounds/ambient/ambient_windy_01.ogg").toURI().toURL()))
ambientsWoods.add(AudioLoader.getStreamingAudio("OGG", File("./assets/sounds/ambient/ambient_woods_01.ogg").toURI().toURL()))
crickets.add(AudioLoader.getAudio("OGG", FileInputStream("./assets/sounds/ambient/crickets_01.ogg")))
crickets.add(AudioLoader.getAudio("OGG", FileInputStream("./assets/sounds/ambient/crickets_02.ogg")))
crickets.add(Gdx.audio.newSound(ModMgr.getGdxFile("basegame", "sounds/ambient/crickets_01.ogg")))
crickets.add(Gdx.audio.newSound(ModMgr.getGdxFile("basegame", "sounds/ambient/crickets_02.ogg")))
}
}

View File

@@ -1,29 +1,31 @@
package net.torvald.terrarum.blockproperties
import com.badlogic.gdx.Gdx
import com.jme3.math.FastMath
import net.torvald.random.HQRNG
import net.torvald.terrarum.Millisec
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.Second
import net.torvald.terrarum.gameworld.WorldTime
import net.torvald.terrarum.worlddrawer.LightmapRenderer
import net.torvald.terrarum.toInt
import net.torvald.terrarum.toRGB10
import net.torvald.terrarum.weather.WeatherMixer
import net.torvald.terrarum.worlddrawer.RGB10
/**
* Created by minjaesong on 16-06-16.
*/
object BlockPropUtil {
var flickerFuncX: Millisec = 0 // in milliseconds; saves current status (time) of func
val flickerFuncDomain: Millisec = 100 // time between two noise sample, in milliseconds
var flickerFuncX: Second = 0f // saves current status (time) of func
val flickerFuncDomain: Second = 0.1f // time between two noise sample
val flickerFuncRange = 0.012f // intensity [0, 1]
var breathFuncX = 0
var breathFuncX = 0f
val breathRange = 0.02f
val breathCycleDuration: Millisec = 2000 // in milliseconds
val breathCycleDuration: Second = 2f
var pulsateFuncX = 0
var pulsateFuncX = 0f
val pulsateRange = 0.034f
val pulsateCycleDuration: Millisec = 500 // in milliseconds
val pulsateCycleDuration: Second = 0.5f
val random = HQRNG()
@@ -36,7 +38,7 @@ object BlockPropUtil {
}
private fun getTorchFlicker(baseLum: Int): Int {
private fun getTorchFlicker(baseLum: Int): RGB10 {
val funcY = FastMath.interpolateCatmullRom(0.0f, flickerFuncX.toFloat() / flickerFuncDomain,
flickerP0, flickerP1, flickerP2, flickerP3
)
@@ -61,10 +63,10 @@ object BlockPropUtil {
*/
internal fun dynamicLumFuncTickClock() {
// FPS-time compensation
if (Terrarum.appgc.fps > 0) {
flickerFuncX += 1000 / Terrarum.appgc.fps
breathFuncX += 1000 / Terrarum.appgc.fps
pulsateFuncX += 1000 / Terrarum.appgc.fps
if (Gdx.graphics.framesPerSecond > 0) {
flickerFuncX += Gdx.graphics.framesPerSecond
breathFuncX += Gdx.graphics.framesPerSecond
pulsateFuncX += Gdx.graphics.framesPerSecond
}
// flicker-related vars
@@ -93,8 +95,8 @@ object BlockPropUtil {
fun getDynamicLumFunc(baseLum: Int, type: Int): Int {
return when (type) {
1 -> getTorchFlicker(baseLum)
2 -> Terrarum.ingame!!.world.globalLight // current global light
3 -> WeatherMixer.getGlobalLightOfTime(WorldTime.DAY_LENGTH / 2).toInt() // daylight at noon
2 -> TerrarumGDX.ingame!!.world.globalLight // current global light
3 -> WeatherMixer.getGlobalLightOfTime(WorldTime.DAY_LENGTH / 2).toRGB10() // daylight at noon
4 -> getSlowBreath(baseLum)
5 -> getPulsate(baseLum)
else -> baseLum

View File

@@ -1,10 +1,11 @@
package net.torvald.terrarum.blockstats
import com.badlogic.gdx.Gdx
import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.MapLayer
import net.torvald.terrarum.worlddrawer.BlocksDrawer
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import com.jme3.math.FastMath
import java.util.Arrays
@@ -26,11 +27,11 @@ object BlockStats {
// Get stats on no-zoomed screen area. In other words, will behave as if screen zoom were 1.0
// no matter how the screen is zoomed.
val map = Terrarum.ingame!!.world
val player = Terrarum.ingame!!.player
val map = TerrarumGDX.ingame!!.world
val player = TerrarumGDX.ingame!!.player
val renderWidth = FastMath.ceil(Terrarum.WIDTH.toFloat())
val renderHeight = FastMath.ceil(Terrarum.HEIGHT.toFloat())
val renderWidth = FastMath.ceil(Gdx.graphics.width.toFloat())
val renderHeight = FastMath.ceil(Gdx.graphics.height.toFloat())
val noZoomCameraX = Math.round(FastMath.clamp(
(player?.hitbox?.centeredX?.toFloat() ?: 0f) - renderWidth / 2, TSIZE.toFloat(), map.width * TSIZE - renderWidth - TSIZE.toFloat()))

View File

@@ -1,12 +1,12 @@
package net.torvald.terrarum.concurrent
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-05-25.
*/
object ThreadParallel {
private val pool: Array<Thread?> = Array(Terrarum.THREADS, { null })
private val pool: Array<Thread?> = Array(TerrarumGDX.THREADS, { null })
/**
* Map Runnable object to certain index of the thread pool.

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.debuggerapp.ActorValueTracker
import java.util.*
@@ -12,14 +12,14 @@ internal object AVTracker : ConsoleCommand {
override fun execute(args: Array<String>) {
if (args.size < 2) {
jPanelInstances.add(ActorValueTracker(Terrarum.ingame!!.player))
jPanelInstances.add(ActorValueTracker(TerrarumGDX.ingame!!.player))
}
else {
try {
val actorID = args[1].toInt()
if (Terrarum.ingame!!.theGameHasActor(actorID)) {
jPanelInstances.add(ActorValueTracker(Terrarum.ingame!!.getActorByID(actorID)))
if (TerrarumGDX.ingame!!.theGameHasActor(actorID)) {
jPanelInstances.add(ActorValueTracker(TerrarumGDX.ingame!!.getActorByID(actorID)))
}
else {
throw IllegalArgumentException()

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.debuggerapp.ActorsLister
import java.util.*
@@ -12,8 +12,8 @@ internal object ActorsList : ConsoleCommand {
override fun execute(args: Array<String>) {
jPanelInstances.add(ActorsLister(
Terrarum.ingame!!.actorContainer,
Terrarum.ingame!!.actorContainerInactive)
TerrarumGDX.ingame!!.actorContainer,
TerrarumGDX.ingame!!.actorContainerInactive)
)
}

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.ui.ConsoleWindow
import org.apache.commons.codec.digest.DigestUtils
@@ -11,12 +11,12 @@ import org.apache.commons.codec.digest.DigestUtils
* For each releases new password should be set. The new password must:
* - start with next alphabet of previous password
* if previous password started with Z, the new password must start with A
* - be a name appear in the Legend of Zelda series which officially released by Nintendo
* - be a name appear in the Legend of Zelda series which officially released by Nintendo (no CD-i)
* - be lowercase
* - BE CRACKABLE (crackstation.net)
*
* Example passwords would be:
* aryll -> biggoron -> ciela -> ... -> linebeck -> midna -> navi -> ...
* aryll -> beedle -> ciela -> daruk -> ... -> linebeck -> mido -> navi -> ...
*
* Notes:
* do NOT put plaintext anywhere in the code (except for comments maybe)
@@ -39,7 +39,7 @@ internal object Authenticator : ConsoleCommand {
Echo(msg)
println("[Authenticator] " + msg)
a = !a
(Terrarum.ingame!!.consoleHandler.UI as ConsoleWindow).reset()
(TerrarumGDX.ingame!!.consoleHandler.UI as ConsoleWindow).reset()
}
else {
printUsage() // thou shalt not pass!

View File

@@ -1,6 +1,5 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.langpack.Lang
import java.util.Formatter
@@ -10,7 +9,7 @@ import java.util.Formatter
*/
internal object CodexEdictis : ConsoleCommand {
val ccW = GameFontBase.colToCode["o"]
val ccW = 0.toChar()//GameFontBase.colToCode["o"]
override fun execute(args: Array<String>) {
if (args.size == 1) {

View File

@@ -1,9 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.Terrarum
import java.time.LocalDateTime
import java.time.ZonedDateTime
import java.util.ArrayList
@@ -26,10 +23,10 @@ internal object CommandInterpreter {
"tips"
)
private val ccW = GameFontBase.colToCode["w"]
private val ccG = GameFontBase.colToCode["g"]
private val ccY = GameFontBase.colToCode["y"]
private val ccR = GameFontBase.colToCode["r"]
private val ccW = 0.toChar()//GameFontBase.colToCode["w"]
private val ccG = 0.toChar()//GameFontBase.colToCode["g"]
private val ccY = 0.toChar()//GameFontBase.colToCode["y"]
private val ccR = 0.toChar()//GameFontBase.colToCode["r"]
internal fun execute(command: String) {
val cmd: Array<CommandInput?> = parse(command)

View File

@@ -1,11 +1,8 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.ui.ConsoleWindow
import java.util.Arrays
/**
* Created by minjaesong on 16-01-16.
*/
@@ -19,13 +16,13 @@ internal object Echo : ConsoleCommand {
val sb = StringBuilder()
for (ch in single_line) {
if (ch == '\n') {
(Terrarum.ingame!!.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString())
(TerrarumGDX.ingame!!.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString())
sb.delete(0, sb.length - 1)
}
else
sb.append(ch)
}
(Terrarum.ingame!!.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString())
(TerrarumGDX.ingame!!.consoleHandler.UI as ConsoleWindow).sendMessage(sb.toString())
}
operator fun invoke(args: Array<String>) = execute(args)

View File

@@ -1,7 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.ui.ConsoleWindow
/**
@@ -14,7 +13,7 @@ internal object EchoError : ConsoleCommand {
}
fun execute(single_line: String) {
(Terrarum.ingame!!.consoleHandler.UI as ConsoleWindow).sendMessage("${GameFontBase.colToCode["r"]}$single_line")
(TerrarumGDX.ingame!!.consoleHandler.UI as ConsoleWindow).sendMessage(single_line)
}
operator fun invoke(args: Array<String>) = execute(args)

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.utils.JsonWriter
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import java.io.IOException
@@ -13,8 +13,8 @@ internal object ExportAV : ConsoleCommand {
if (args.size == 2) {
try {
JsonWriter.writeToFile(
Terrarum.ingame!!.player!!.actorValue,
Terrarum.defaultDir + "/Exports/" + args[1] + ".json")
TerrarumGDX.ingame!!.player!!.actorValue,
TerrarumGDX.defaultDir + "/Exports/" + args[1] + ".json")
Echo("ExportAV: exported to " + args[1] + ".json")
}

View File

@@ -2,7 +2,7 @@ package net.torvald.terrarum.console
import net.torvald.colourutil.Col4096
import net.torvald.terrarum.utils.RasterWriter
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.blockproperties.Block
import java.io.*
@@ -60,10 +60,10 @@ internal object ExportMap : ConsoleCommand {
override fun execute(args: Array<String>) {
if (args.size == 2) {
var mapData = ByteArray(Terrarum.ingame!!.world.width * Terrarum.ingame!!.world.height * 3)
var mapData = ByteArray(TerrarumGDX.ingame!!.world.width * TerrarumGDX.ingame!!.world.height * 3)
var mapDataPointer = 0
for (tile in Terrarum.ingame!!.world.terrainIterator()) {
for (tile in TerrarumGDX.ingame!!.world.terrainIterator()) {
val colArray = (colorTable as Map<Int, Col4096>)
.getOrElse(tile, { Col4096(0xFFF) }).toByteArray()
@@ -74,7 +74,7 @@ internal object ExportMap : ConsoleCommand {
mapDataPointer += 3
}
val dir = Terrarum.defaultDir + "/Exports/"
val dir = TerrarumGDX.defaultDir + "/Exports/"
val dirAsFile = File(dir)
if (!dirAsFile.exists()) {
dirAsFile.mkdir()
@@ -82,7 +82,7 @@ internal object ExportMap : ConsoleCommand {
try {
RasterWriter.writePNG_RGB(
Terrarum.ingame!!.world.width, Terrarum.ingame!!.world.height, mapData, dir + args[1] + ".png")
TerrarumGDX.ingame!!.world.width, TerrarumGDX.ingame!!.world.height, mapData, dir + args[1] + ".png")
Echo("ExportMap: exported to " + args[1] + ".png")
}

View File

@@ -1,25 +1,24 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-01-19.
*/
internal object GetAV : ConsoleCommand {
val ccW = GameFontBase.colToCode["w"]
val ccG = GameFontBase.colToCode["g"]
val ccY = GameFontBase.colToCode["y"]
val ccM = GameFontBase.colToCode["m"]
val ccK = GameFontBase.colToCode["k"]
val ccO = GameFontBase.colToCode["o"]
val ccW = 0.toChar()//GameFontBase.colToCode["w"]
val ccG = 0.toChar()//GameFontBase.colToCode["g"]
val ccY = 0.toChar()//GameFontBase.colToCode["y"]
val ccM = 0.toChar()//GameFontBase.colToCode["m"]
val ccK = 0.toChar()//GameFontBase.colToCode["k"]
val ccO = 0.toChar()//GameFontBase.colToCode["o"]
override fun execute(args: Array<String>) {
try {
if (args.size == 1 && Terrarum.ingame!!.player != null) {
if (args.size == 1 && TerrarumGDX.ingame!!.player != null) {
// print all actorvalue of player
val av = Terrarum.ingame!!.player!!.actorValue
val av = TerrarumGDX.ingame!!.player!!.actorValue
val keyset = av.keySet
Echo("$ccW== ActorValue list for ${ccY}player $ccW==")
@@ -37,19 +36,19 @@ internal object GetAV : ConsoleCommand {
if (!args[1].isNum()) { // args[1] is ActorValue name
Echo("${ccW}player.$ccM${args[1]} $ccW= " +
ccG +
Terrarum.ingame!!.player!!.actorValue[args[1]] +
TerrarumGDX.ingame!!.player!!.actorValue[args[1]] +
" $ccO" +
Terrarum.ingame!!.player!!.actorValue[args[1]]!!.javaClass.simpleName
TerrarumGDX.ingame!!.player!!.actorValue[args[1]]!!.javaClass.simpleName
)
println("[GetAV] player.${args[1]} = " +
Terrarum.ingame!!.player!!.actorValue[args[1]] +
TerrarumGDX.ingame!!.player!!.actorValue[args[1]] +
" " +
Terrarum.ingame!!.player!!.actorValue[args[1]]!!.javaClass.simpleName
TerrarumGDX.ingame!!.player!!.actorValue[args[1]]!!.javaClass.simpleName
)
}
else {
// args[1] is actor ID
val actor = Terrarum.ingame!!.getActorByID(args[1].toInt())
val actor = TerrarumGDX.ingame!!.getActorByID(args[1].toInt())
val av = actor.actorValue
val keyset = av.keySet
@@ -71,14 +70,14 @@ internal object GetAV : ConsoleCommand {
val id = args[1].toInt()
val av = args[2]
Echo("$ccW$id.$ccM$av $ccW= $ccG" +
Terrarum.ingame!!.getActorByID(id).actorValue[av] +
TerrarumGDX.ingame!!.getActorByID(id).actorValue[av] +
" $ccO" +
Terrarum.ingame!!.getActorByID(id).actorValue[av]!!.javaClass.simpleName
TerrarumGDX.ingame!!.getActorByID(id).actorValue[av]!!.javaClass.simpleName
)
println("$id.$av = " +
Terrarum.ingame!!.getActorByID(id).actorValue[av] +
TerrarumGDX.ingame!!.getActorByID(id).actorValue[av] +
" " +
Terrarum.ingame!!.getActorByID(id).actorValue[av]!!.javaClass.simpleName
TerrarumGDX.ingame!!.getActorByID(id).actorValue[av]!!.javaClass.simpleName
)
}
}

View File

@@ -1,9 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.Factionable
import net.torvald.terrarum.gameactors.Player
@@ -11,12 +9,12 @@ import net.torvald.terrarum.gameactors.Player
* Created by minjaesong on 16-02-17.
*/
internal object GetFactioning : ConsoleCommand {
val ccW = GameFontBase.colToCode["w"]
val ccG = GameFontBase.colToCode["g"]
val ccY = GameFontBase.colToCode["y"]
val ccM = GameFontBase.colToCode["m"]
val ccK = GameFontBase.colToCode["k"]
val ccB = GameFontBase.colToCode["b"]
val ccW = 0.toChar()//GameFontBase.colToCode["w"]
val ccG = 0.toChar()//GameFontBase.colToCode["g"]
val ccY = 0.toChar()//GameFontBase.colToCode["y"]
val ccM = 0.toChar()//GameFontBase.colToCode["m"]
val ccK = 0.toChar()//GameFontBase.colToCode["k"]
val ccB = 0.toChar()//GameFontBase.colToCode["b"]
private val PRINT_INDENTATION = "$ccK --> $ccW"
@@ -25,7 +23,7 @@ internal object GetFactioning : ConsoleCommand {
val error = Error()
fun printOutFactioning(id: Int) {
val a = Terrarum.ingame!!.getActorByID(id)
val a = TerrarumGDX.ingame!!.getActorByID(id)
if (a is Factionable) {
Echo("$ccW== Faction assignment for $ccY${if (id == Player.PLAYER_REF_ID) "player" else id.toString()} $ccW==")
println("[GetFactioning] == Faction assignment for '${if (id == Player.PLAYER_REF_ID) "player" else id.toString()}' ==")

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-01-22.

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-03-20.
@@ -8,7 +8,7 @@ import net.torvald.terrarum.Terrarum
internal object GetTime : ConsoleCommand {
override fun execute(args: Array<String>) {
val worldTime = Terrarum.ingame!!.world.time
val worldTime = TerrarumGDX.ingame!!.world.time
Echo(worldTime.getFormattedTime())
}

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import com.google.gson.Gson
import com.google.gson.JsonElement
@@ -14,14 +14,14 @@ import java.io.IOException
internal object GsonTest : ConsoleCommand {
override fun execute(args: Array<String>) {
if (args.size == 2) {
val avelem = Gson().toJsonTree(Terrarum.ingame!!.player)
val avelem = Gson().toJsonTree(TerrarumGDX.ingame!!.player)
val jsonString = avelem.toString()
val bufferedWriter: BufferedWriter
val writer: FileWriter
try {
writer = FileWriter(Terrarum.defaultDir + "/Exports/" + args[1] + ".json")
writer = FileWriter(TerrarumGDX.defaultDir + "/Exports/" + args[1] + ".json")
bufferedWriter = BufferedWriter(writer)
bufferedWriter.write(jsonString)

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.langpack.Lang
/**

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.ActorInventory
import net.torvald.terrarum.gameactors.Player
import net.torvald.terrarum.gameactors.Pocketed
@@ -11,7 +11,7 @@ import net.torvald.terrarum.itemproperties.ItemCodex
*/
internal object Inventory : ConsoleCommand {
private var target: Pocketed? = Terrarum.ingame!!.player
private var target: Pocketed? = TerrarumGDX.ingame!!.player
override fun execute(args: Array<String>) {
if (args.size == 1) {
@@ -46,7 +46,7 @@ internal object Inventory : ConsoleCommand {
}
private fun setTarget(actorRefId: Int = Player.PLAYER_REF_ID) {
val actor = Terrarum.ingame!!.getActorByID(actorRefId)
val actor = TerrarumGDX.ingame!!.getActorByID(actorRefId)
if (actor !is Pocketed) {
EchoError("Cannot edit inventory of incompatible actor: $actor")
}

View File

@@ -1,8 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.swingapp.IMStringReader
import javax.swing.JFrame
/**
* Created by SKYHi14 on 2017-02-05.
@@ -12,7 +10,6 @@ internal object JavaIMTest : ConsoleCommand {
override fun execute(args: Array<String>) {
IMStringReader(
Terrarum.appgc,
{ Echo("[JavaIMTest -> IMStringReader] $it") }, // send input to Echo
"JavaIMTest"
)

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.langpack.Lang
/**
@@ -11,7 +11,7 @@ internal object KillActor : ConsoleCommand {
if (args.size == 2) {
try {
val actorid = args[1].toInt()
Terrarum.ingame!!.removeActor(actorid)
TerrarumGDX.ingame!!.removeActor(actorid)
}
catch (e: NumberFormatException) {
EchoError("Wrong number input.")

View File

@@ -1,8 +1,7 @@
package net.torvald.terrarum.console
import org.newdawn.slick.Music
import org.newdawn.slick.openal.AudioLoader
import java.io.File
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.audio.Music
/**
* Created by minjaesong on 16-08-02.
@@ -34,7 +33,7 @@ internal object MusicTest : ConsoleCommand {
File("./assets/sounds/test/${args[1]}").absoluteFile.toURI().toURL()
).playAsMusic(1f, 1f, false)*/
music = Music("./assets/sounds/test/${args[1]}")
music = Gdx.audio.newMusic(Gdx.files.internal("./assets/sounds/test/${args[1]}"))
music!!.play()
}

View File

@@ -1,19 +1,18 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-06-16.
*/
internal object Seed : ConsoleCommand {
val ccG = GameFontBase.colToCode["g"]
val ccW = GameFontBase.colToCode["w"]
val ccY = GameFontBase.colToCode["y"]
val ccG = 0.toChar()//GameFontBase.colToCode["g"]
val ccW = 0.toChar()//GameFontBase.colToCode["w"]
val ccY = 0.toChar()//GameFontBase.colToCode["y"]
override fun execute(args: Array<String>) {
Echo("Map$ccW: $ccG${Terrarum.ingame!!.world.generatorSeed}")
println("[seed] Map$ccW: $ccG${Terrarum.ingame!!.world.generatorSeed}")
Echo("Map$ccW: $ccG${TerrarumGDX.ingame!!.world.generatorSeed}")
println("[seed] Map$ccW: $ccG${TerrarumGDX.ingame!!.world.generatorSeed}")
// TODO display randomiser seed
}

View File

@@ -1,19 +1,17 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.StateInGame
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-01-15.
*/
internal object SetAV : ConsoleCommand {
val ccW = GameFontBase.colToCode["w"]
val ccG = GameFontBase.colToCode["g"]
val ccY = GameFontBase.colToCode["y"]
val ccR = GameFontBase.colToCode["r"]
val ccM = GameFontBase.colToCode["m"]
val ccW = 0.toChar()//GameFontBase.colToCode["w"]
val ccG = 0.toChar()//GameFontBase.colToCode["g"]
val ccY = 0.toChar()//GameFontBase.colToCode["y"]
val ccR = 0.toChar()//GameFontBase.colToCode["r"]
val ccM = 0.toChar()//GameFontBase.colToCode["m"]
override fun printUsage() {
Echo("${ccW}Set actor value of specific target to desired value.")
@@ -66,7 +64,7 @@ internal object SetAV : ConsoleCommand {
return
}
Terrarum.ingame!!.player!!.actorValue[args[1]] = newValue
TerrarumGDX.ingame!!.player!!.actorValue[args[1]] = newValue
Echo("${ccW}Set $ccM${args[1]} ${ccW}for ${ccY}player ${ccW}to $ccG$newValue")
println("[SetAV] set ActorValue '${args[1]}' for player to '$newValue'.")
}
@@ -74,7 +72,7 @@ internal object SetAV : ConsoleCommand {
try {
val id = args[1].toInt()
val newValue = parseAVInput(args[3])
val actor = Terrarum.ingame!!.getActorByID(id)
val actor = TerrarumGDX.ingame!!.getActorByID(id)
// check if av is number
if (args[2].isNum()) {

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.ui.Notification
/**
@@ -25,7 +25,7 @@ internal object SetBulletin : ConsoleCommand {
* @param message real message
*/
fun send(message: Array<String>) {
Terrarum.ingame!!.sendNotification(message)
TerrarumGDX.ingame!!.sendNotification(message)
println("sent notifinator")
}
}

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.worlddrawer.LightmapRenderer
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-02-17.
@@ -20,7 +20,7 @@ internal object SetGlobalLightOverride : ConsoleCommand {
val GL = LightmapRenderer.constructRGBFromInt(r, g, b)
lightOverride = true
Terrarum.ingame!!.world.globalLight = GL
TerrarumGDX.ingame!!.world.globalLight = GL
}
catch (e: NumberFormatException) {
Echo("Wrong number input.")
@@ -38,7 +38,7 @@ internal object SetGlobalLightOverride : ConsoleCommand {
Echo("Range: 0-" + (LightmapRenderer.COLOUR_RANGE_SIZE - 1))
}
else {
Terrarum.ingame!!.world.globalLight = GL
TerrarumGDX.ingame!!.world.globalLight = GL
}
}
catch (e: NumberFormatException) {

View File

@@ -1,10 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.Terrarum
import org.apache.commons.csv.CSVRecord
import org.newdawn.slick.SlickException
import net.torvald.terrarum.TerrarumGDX
import java.io.IOException
@@ -14,14 +11,14 @@ import java.io.IOException
internal object SetLocale : ConsoleCommand {
override fun execute(args: Array<String>) {
if (args.size == 2) {
val prevLocale = Terrarum.gameLocale
Terrarum.gameLocale = args[1]
val prevLocale = TerrarumGDX.gameLocale
TerrarumGDX.gameLocale = args[1]
try {
Echo("Set locale to '" + Terrarum.gameLocale + "'.")
Echo("Set locale to '" + TerrarumGDX.gameLocale + "'.")
}
catch (e: IOException) {
Echo("could not read lang file.")
Terrarum.gameLocale = prevLocale
TerrarumGDX.gameLocale = prevLocale
}
}

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.ActorWithPhysics
/**
@@ -10,10 +10,10 @@ internal object SetScale : ConsoleCommand {
override fun execute(args: Array<String>) {
if (args.size == 2 || args.size == 3) {
try {
val targetID = if (args.size == 3) args[1].toInt() else Terrarum.ingame!!.player!!.referenceID
val targetID = if (args.size == 3) args[1].toInt() else TerrarumGDX.ingame!!.player!!.referenceID
val scale = args[if (args.size == 3) 2 else 1].toDouble()
val target = Terrarum.ingame!!.getActorByID(targetID)
val target = TerrarumGDX.ingame!!.getActorByID(targetID)
if (target !is ActorWithPhysics) {
EchoError("Target is not ActorWithPhysics")

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.gameworld.WorldTime
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-03-20.
@@ -11,10 +11,10 @@ internal object SetTime : ConsoleCommand {
if (args.size == 2) {
val timeToSet = WorldTime.parseTime(args[1])
Terrarum.ingame!!.world.time.setTimeOfToday(timeToSet)
TerrarumGDX.ingame!!.world.time.setTimeOfToday(timeToSet)
Echo("Set time to ${Terrarum.ingame!!.world.time.todaySeconds} " +
"(${Terrarum.ingame!!.world.time.hours}h${formatMin(Terrarum.ingame!!.world.time.minutes)})")
Echo("Set time to ${TerrarumGDX.ingame!!.world.time.todaySeconds} " +
"(${TerrarumGDX.ingame!!.world.time.hours}h${formatMin(TerrarumGDX.ingame!!.world.time.minutes)})")
}
else {
printUsage()

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-03-20.
@@ -11,11 +11,11 @@ internal object SetTimeDelta : ConsoleCommand {
override fun execute(args: Array<String>) {
if (args.size == 2) {
Terrarum.ingame!!.world.time.timeDelta = args[1].toInt()
if (Terrarum.ingame!!.world.time.timeDelta == 0)
TerrarumGDX.ingame!!.world.time.timeDelta = args[1].toInt()
if (TerrarumGDX.ingame!!.world.time.timeDelta == 0)
Echo("時間よ止まれ!ザ・ワルド!!")
else
Echo("Set time delta to ${Terrarum.ingame!!.world.time.timeDelta}")
Echo("Set time delta to ${TerrarumGDX.ingame!!.world.time.timeDelta}")
}
else {
printUsage()

View File

@@ -1,7 +1,8 @@
package net.torvald.terrarum.console
import com.badlogic.gdx.Gdx
import net.torvald.terrarum.gameactors.PhysTestBall
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.worlddrawer.WorldCamera
import org.dyn4j.geometry.Vector2
@@ -11,8 +12,8 @@ import org.dyn4j.geometry.Vector2
internal object SpawnPhysTestBall : ConsoleCommand {
@Throws(Exception::class)
override fun execute(args: Array<String>) {
val mouseX = Terrarum.appgc.input.mouseX
val mouseY = Terrarum.appgc.input.mouseY
val mouseX = TerrarumGDX.mouseX
val mouseY = TerrarumGDX.mouseY
if (args.size >= 3) {
val elasticity = args[1].toDouble()
@@ -28,7 +29,7 @@ internal object SpawnPhysTestBall : ConsoleCommand {
ball.elasticity = elasticity
ball.applyForce(Vector2(xvel, yvel))
Terrarum.ingame!!.addNewActor(ball)
TerrarumGDX.ingame!!.addNewActor(ball)
}
else if (args.size == 2) {
val elasticity = args[1].toDouble()
@@ -40,7 +41,7 @@ internal object SpawnPhysTestBall : ConsoleCommand {
)
ball.elasticity = elasticity
Terrarum.ingame!!.addNewActor(ball)
TerrarumGDX.ingame!!.addNewActor(ball)
}
else {
printUsage()

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.DecodeTapestry
import java.io.File
import java.io.FileInputStream
@@ -16,7 +16,7 @@ internal object SpawnTapestry : ConsoleCommand {
}
val tapestry = DecodeTapestry(File(args[1]))
Terrarum.ingame!!.addNewActor(tapestry)
TerrarumGDX.ingame!!.addNewActor(tapestry)
}
override fun printUsage() {

View File

@@ -1,9 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.FixtureTikiTorch
import net.torvald.terrarum.gamecontroller.mouseX
import net.torvald.terrarum.gamecontroller.mouseY
/**
* Created by minjaesong on 2016-12-17.
@@ -11,9 +9,9 @@ import net.torvald.terrarum.gamecontroller.mouseY
internal object SpawnTikiTorch : ConsoleCommand {
override fun execute(args: Array<String>) {
val torch = FixtureTikiTorch()
torch.setPosition(Terrarum.appgc.mouseX, Terrarum.appgc.mouseY)
torch.setPosition(TerrarumGDX.mouseX, TerrarumGDX.mouseY)
Terrarum.ingame!!.addNewActor(torch)
TerrarumGDX.ingame!!.addNewActor(torch)
}
override fun printUsage() {

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.ActorWithPhysics
/**
@@ -23,7 +23,7 @@ internal object Teleport : ConsoleCommand {
return
}
Terrarum.ingame!!.player!!.setPosition(x.toDouble(), y.toDouble())
TerrarumGDX.ingame!!.player!!.setPosition(x.toDouble(), y.toDouble())
}
else if (args.size == 4) {
if (args[2].toLowerCase() != "to") {
@@ -35,20 +35,20 @@ internal object Teleport : ConsoleCommand {
try {
val fromActorID = args[1].toInt()
val targetActorID = if (args[3].toLowerCase() == "player")
Terrarum.ingame!!.player!!.referenceID
TerrarumGDX.ingame!!.player!!.referenceID
else
args[3].toInt()
// if from == target, ignore the action
if (fromActorID == targetActorID) return
if (Terrarum.ingame!!.getActorByID(fromActorID) !is ActorWithPhysics ||
Terrarum.ingame!!.getActorByID(targetActorID) !is ActorWithPhysics) {
if (TerrarumGDX.ingame!!.getActorByID(fromActorID) !is ActorWithPhysics ||
TerrarumGDX.ingame!!.getActorByID(targetActorID) !is ActorWithPhysics) {
throw IllegalArgumentException()
}
else {
fromActor = Terrarum.ingame!!.getActorByID(fromActorID) as ActorWithPhysics
targetActor = Terrarum.ingame!!.getActorByID(targetActorID) as ActorWithPhysics
fromActor = TerrarumGDX.ingame!!.getActorByID(fromActorID) as ActorWithPhysics
targetActor = TerrarumGDX.ingame!!.getActorByID(targetActorID) as ActorWithPhysics
}
}
catch (e: NumberFormatException) {
@@ -79,11 +79,11 @@ internal object Teleport : ConsoleCommand {
y = args[4].toInt() * FeaturesDrawer.TILE_SIZE + FeaturesDrawer.TILE_SIZE / 2
val actorID = args[1].toInt()
if (Terrarum.ingame!!.getActorByID(actorID) !is ActorWithPhysics) {
if (TerrarumGDX.ingame!!.getActorByID(actorID) !is ActorWithPhysics) {
throw IllegalArgumentException()
}
else {
actor = Terrarum.ingame!!.getActorByID(actorID) as ActorWithPhysics
actor = TerrarumGDX.ingame!!.getActorByID(actorID) as ActorWithPhysics
}
}
catch (e: NumberFormatException) {

View File

@@ -1,16 +1,15 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.StateInGame
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-01-19.
*/
internal object ToggleNoClip : ConsoleCommand {
override fun execute(args: Array<String>) {
val status = Terrarum.ingame!!.player!!.isNoClip()
val status = TerrarumGDX.ingame!!.player!!.isNoClip()
Terrarum.ingame!!.player!!.setNoClip(!status)
TerrarumGDX.ingame!!.player!!.setNoClip(!status)
Echo("Set no-clip status to " + (!status).toString())
}

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.langpack.Lang
/**
@@ -9,7 +9,7 @@ import net.torvald.terrarum.langpack.Lang
internal object Version : ConsoleCommand {
override fun execute(args: Array<String>) {
Echo("${Terrarum.NAME} ${Terrarum.VERSION_STRING}")
Echo("${TerrarumGDX.NAME} ${TerrarumGDX.VERSION_STRING}")
Echo("Polyglot language pack version ${Lang.POLYGLOT_VERSION}")
}

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-01-25.
@@ -18,14 +18,14 @@ internal object Zoom : ConsoleCommand {
return
}
if (zoom < Terrarum.ingame!!.ZOOM_MIN) {
zoom = Terrarum.ingame!!.ZOOM_MIN
if (zoom < TerrarumGDX.ingame!!.ZOOM_MIN) {
zoom = TerrarumGDX.ingame!!.ZOOM_MIN
}
else if (zoom > Terrarum.ingame!!.ZOOM_MAX) {
zoom = Terrarum.ingame!!.ZOOM_MAX
else if (zoom > TerrarumGDX.ingame!!.ZOOM_MAX) {
zoom = TerrarumGDX.ingame!!.ZOOM_MAX
}
Terrarum.ingame!!.screenZoom = zoom
TerrarumGDX.ingame!!.screenZoom = zoom
System.gc()

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.debuggerapp
import net.torvald.terrarum.gameactors.ActorValue
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.console.Echo
import net.torvald.terrarum.console.SetAV
import net.torvald.terrarum.gameactors.Actor
@@ -82,11 +82,11 @@ class ActorValueTracker constructor() : JFrame() {
buttonChangeActor.addMouseListener(object : MouseAdapter() {
override fun mousePressed(e: MouseEvent?) {
if (actorIDField.text.toLowerCase() == "player") {
actor = Terrarum.ingame!!.player
actor = TerrarumGDX.ingame!!.player
actorValue = actor!!.actorValue
}
else if (actorIDField.text.isNotBlank()) {
actor = Terrarum.ingame!!.getActorByID(actorIDField.text.toInt()) as ActorWithPhysics
actor = TerrarumGDX.ingame!!.getActorByID(actorIDField.text.toInt()) as ActorWithPhysics
actorValue = actor!!.actorValue
}
}

View File

@@ -1,11 +1,9 @@
package net.torvald.terrarum.gameactors
import net.torvald.random.HQRNG
import net.torvald.terrarum.gameactors.ActorValue
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.itemproperties.ItemCodex.ACTORID_MIN
import org.newdawn.slick.GameContainer
typealias ActorID = Int
@@ -30,7 +28,7 @@ abstract class Actor(val renderOrder: RenderOrder) : Comparable<Actor>, Runnable
val RANGE_FRONT = 0x7000_0000..0x7FFF_FFFF
}
abstract fun update(gc: GameContainer, delta: Int)
abstract fun update(delta: Float)
/**
* Valid RefID is equal to or greater than 16777216.
@@ -59,7 +57,7 @@ abstract class Actor(val renderOrder: RenderOrder) : Comparable<Actor>, Runnable
fun generateUniqueReferenceID(): ActorID {
fun hasCollision(value: ActorID) =
try {
Terrarum.ingame!!.theGameHasActor(value) ||
TerrarumGDX.ingame!!.theGameHasActor(value) ||
value < ItemCodex.ACTORID_MIN ||
value !in when (renderOrder) {
RenderOrder.BEHIND -> RANGE_BEHIND

View File

@@ -1,15 +1,13 @@
package net.torvald.terrarum.gameactors
import com.badlogic.gdx.Gdx
import com.jme3.math.FastMath
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.faction.Faction
import net.torvald.terrarum.gamecontroller.Key
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.Material
import net.torvald.terrarum.realestate.LandUtil
import net.torvald.terrarum.ui.UIInventory
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Input
import java.util.*
/**
@@ -81,8 +79,8 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
@Transient internal const val WALK_ACCEL_BASE: Double = 0.67
@Transient const val BASE_HEIGHT = 40
// 333.33 miliseconds
@Transient const val BASE_ACTION_INTERVAL = 1000.0 / 3.0
// 0.33333 miliseconds
@Transient const val BASE_ACTION_INTERVAL = 1.0 / 3.0
@Transient const val SPRITE_ROW_IDLE = 0
@Transient const val SPRITE_ROW_WALK = 1
@@ -136,7 +134,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
protected var isRightDown = false
protected var isJumpDown = false
protected inline val isGamer: Boolean
get() = this == Terrarum.ingame!!.player
get() = this == TerrarumGDX.ingame!!.player
private val nullItem = object : GameItem() {
@@ -152,8 +150,8 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
override val material = Material(0,0,0,0,0,0,0,0,0,0.0)
}
override fun update(gc: GameContainer, delta: Int) {
super.update(gc, delta)
override fun update(delta: Float) {
super.update(delta)
if (vehicleRiding is Player)
throw Error("Attempted to 'ride' player object. ($vehicleRiding)")
@@ -163,7 +161,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
// don't put this into keyPressed; execution order is important!
updateGamerControlBox(gc.input)
updateGamerControlBox()
updateSprite(delta)
@@ -187,45 +185,45 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
// update inventory items
inventory.forEach {
if (!inventory.itemEquipped.contains(it.item)) { // unequipped
it.item.effectWhileInPocket(gc, delta)
it.item.effectWhileInPocket(delta)
}
else { // equipped
it.item.effectWhenEquipped(gc, delta)
it.item.effectWhenEquipped(delta)
}
}
}
private fun updateGamerControlBox(input: Input) {
private fun updateGamerControlBox() {
if (isGamer) {
isUpDown = input.isKeyDown(Terrarum.getConfigInt("keyup"))
isLeftDown = input.isKeyDown(Terrarum.getConfigInt("keyleft"))
isDownDown = input.isKeyDown(Terrarum.getConfigInt("keydown"))
isRightDown = input.isKeyDown(Terrarum.getConfigInt("keyright"))
isJumpDown = input.isKeyDown(Terrarum.getConfigInt("keyjump"))
isUpDown = Gdx.input.isKeyPressed(TerrarumGDX.getConfigInt("keyup"))
isLeftDown = Gdx.input.isKeyPressed(TerrarumGDX.getConfigInt("keyleft"))
isDownDown = Gdx.input.isKeyPressed(TerrarumGDX.getConfigInt("keydown"))
isRightDown = Gdx.input.isKeyPressed(TerrarumGDX.getConfigInt("keyright"))
isJumpDown = Gdx.input.isKeyPressed(TerrarumGDX.getConfigInt("keyjump"))
if (Terrarum.controller != null) {
axisX = Terrarum.controller!!.getAxisValue(Terrarum.getConfigInt("joypadlstickx"))
axisY = Terrarum.controller!!.getAxisValue(Terrarum.getConfigInt("joypadlsticky"))
axisRX = Terrarum.controller!!.getAxisValue(Terrarum.getConfigInt("joypadrstickx"))
axisRY = Terrarum.controller!!.getAxisValue(Terrarum.getConfigInt("joypadrsticky"))
if (TerrarumGDX.controller != null) {
axisX = TerrarumGDX.controller!!.getAxisValue(TerrarumGDX.getConfigInt("joypadlstickx"))
axisY = TerrarumGDX.controller!!.getAxisValue(TerrarumGDX.getConfigInt("joypadlsticky"))
axisRX = TerrarumGDX.controller!!.getAxisValue(TerrarumGDX.getConfigInt("joypadrstickx"))
axisRY = TerrarumGDX.controller!!.getAxisValue(TerrarumGDX.getConfigInt("joypadrsticky"))
// deadzonning
if (Math.abs(axisX) < Terrarum.CONTROLLER_DEADZONE) axisX = 0f
if (Math.abs(axisY) < Terrarum.CONTROLLER_DEADZONE) axisY = 0f
if (Math.abs(axisRX) < Terrarum.CONTROLLER_DEADZONE) axisRX = 0f
if (Math.abs(axisRY) < Terrarum.CONTROLLER_DEADZONE) axisRY = 0f
if (Math.abs(axisX) < TerrarumGDX.CONTROLLER_DEADZONE) axisX = 0f
if (Math.abs(axisY) < TerrarumGDX.CONTROLLER_DEADZONE) axisY = 0f
if (Math.abs(axisRX) < TerrarumGDX.CONTROLLER_DEADZONE) axisRX = 0f
if (Math.abs(axisRY) < TerrarumGDX.CONTROLLER_DEADZONE) axisRY = 0f
isJumpDown = input.isKeyDown(Terrarum.getConfigInt("keyjump")) ||
Terrarum.controller!!.isButtonPressed(GAMEPAD_JUMP)
isJumpDown = Gdx.input.isKeyPressed(TerrarumGDX.getConfigInt("keyjump")) ||
TerrarumGDX.controller!!.isButtonPressed(GAMEPAD_JUMP)
}
}
}
private inline val hasController: Boolean
get() = if (isGamer) Terrarum.controller != null
get() = if (isGamer) TerrarumGDX.controller != null
else true
override fun processInput(gc: GameContainer, delta: Int, input: Input) {
override fun processInput(delta: Float) {
/**
* L-R stop
@@ -267,11 +265,11 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
// ↑F, ↓S
if (isRightDown && !isLeftDown) {
walkHorizontal(false, AXIS_KEYBOARD)
prevHMoveKey = Terrarum.getConfigInt("keyright")
prevHMoveKey = TerrarumGDX.getConfigInt("keyright")
} // ↓F, ↑S
else if (isLeftDown && !isRightDown) {
walkHorizontal(true, AXIS_KEYBOARD)
prevHMoveKey = Terrarum.getConfigInt("keyleft")
prevHMoveKey = TerrarumGDX.getConfigInt("keyleft")
} // ↓F, ↓S
/*else if (isLeftDown && isRightDown) {
if (prevHMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT)) {
@@ -295,11 +293,11 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
// ↑E, ↓D
if (isDownDown && !isUpDown) {
walkVertical(false, AXIS_KEYBOARD)
prevVMoveKey = Terrarum.getConfigInt("keydown")
prevVMoveKey = TerrarumGDX.getConfigInt("keydown")
} // ↓E, ↑D
else if (isUpDown && !isDownDown) {
walkVertical(true, AXIS_KEYBOARD)
prevVMoveKey = Terrarum.getConfigInt("keyup")
prevVMoveKey = TerrarumGDX.getConfigInt("keyup")
} // ↓E, ↓D
/*else if (isUpDown && isDownDown) {
if (prevVMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP)) {
@@ -337,7 +335,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
override fun keyPressed(key: Int, c: Char) {
// quickslot (quickbar)
val quickbarKeys = Terrarum.getConfigIntArray("keyquickbars")
val quickbarKeys = TerrarumGDX.getConfigIntArray("keyquickbars")
if (key in quickbarKeys) {
actorValue[AVKey.__PLAYER_QUICKSLOTSEL] = quickbarKeys.indexOf(key)
}
@@ -498,7 +496,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
// force update inventory UI
try {
(Terrarum.ingame!!.uiInventoryPlayer.UI as UIInventory).shutUpAndRebuild()
(TerrarumGDX.ingame!!.uiInventoryPlayer.UI as UIInventory).shutUpAndRebuild()
}
catch (LateInitMyArse: kotlin.UninitializedPropertyAccessException) { }
}
@@ -519,7 +517,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
fun Float.abs() = FastMath.abs(this)
private fun updateSprite(delta: Int) {
private fun updateSprite(delta: Float) {
sprite?.update(delta)
spriteGlow?.update(delta)

View File

@@ -1,6 +1,7 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.Terrarum
import com.badlogic.gdx.Gdx
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.blockproperties.BlockCodex
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.ItemCodex
@@ -58,8 +59,8 @@ class ActorInventory(val actor: Pocketed, var maxCapacity: Int, var capacityMode
"These commands are NOT INTERCHANGEABLE; they handle things differently according to the context.")
if (item.originalID == Player.PLAYER_REF_ID || item.originalID == 0x51621D) // do not delete this magic
throw IllegalArgumentException("Attempted to put human player into the inventory.")
if (Terrarum.ingame != null &&
(item.originalID == Terrarum.ingame?.player?.referenceID))
if (TerrarumGDX.ingame != null &&
(item.originalID == TerrarumGDX.ingame?.player?.referenceID))
throw IllegalArgumentException("Attempted to put active player into the inventory.")
if ((!item.stackable || item.dynamicID in ITEM_DYNAMIC) && count > 1)
throw IllegalArgumentException("Attempting to adding stack of item but the item is not stackable; item: $item, count: $count")
@@ -201,7 +202,7 @@ class ActorInventory(val actor: Pocketed, var maxCapacity: Int, var capacityMode
actor.avStrength / 1000.0
else
1.0 // TODO variable: scale, strength
val swingDmgToFrameDmg = Terrarum.delta.toDouble() / actor.actorValue.getAsDouble(AVKey.ACTION_INTERVAL)!!
val swingDmgToFrameDmg = Gdx.graphics.deltaTime.toDouble() / actor.actorValue.getAsDouble(AVKey.ACTION_INTERVAL)!!
// damage the item
newItem.durability -= (baseDamagePerSwing * swingDmgToFrameDmg).toFloat()

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.gameactors
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
/**
* Actor with visible body
@@ -10,6 +10,7 @@ import org.newdawn.slick.Graphics
*/
abstract class ActorWithBody(renderOrder: RenderOrder) : Actor(renderOrder) {
open val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0)
abstract fun drawBody(g: Graphics)
abstract fun drawGlow(g: Graphics)
abstract fun drawBody(batch: SpriteBatch)
abstract fun drawGlow(batch: SpriteBatch)
open var tooltipText = ""
}

View File

@@ -1,5 +1,7 @@
package net.torvald.terrarum.gameactors
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.jme3.math.FastMath
import net.torvald.point.Point2d
import net.torvald.terrarum.*
@@ -12,12 +14,13 @@ import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockProp
import net.torvald.terrarum.gameworld.BlockAddress
import net.torvald.terrarum.realestate.LandUtil
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import org.dyn4j.geometry.Vector2
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import java.util.*
typealias Second = Float
/**
* Base class for every actor that has animated sprites. This includes furnishings, paintings, gadgets, etc.
* Also has all the physics
@@ -41,7 +44,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
var drawMode = BlendMode.NORMAL
@Transient private val world: GameWorld = Terrarum.ingame!!.world
@Transient private val world: GameWorld = TerrarumGDX.ingame!!.world
var hitboxTranslateX: Double = 0.0// relative to spritePosX
protected set
@@ -194,7 +197,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
/**
* Post-hit invincibility, in milliseconds
*/
@Transient val INVINCIBILITY_TIME: Millisec = 500
@Transient val INVINCIBILITY_TIME: Second = 0.5f
@Transient internal val BASE_FRICTION = 0.3
@@ -233,11 +236,9 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
internal var walledTop = false // UNUSED; only for BasicDebugInfoWindow
internal var walledBottom = false // UNUSED; only for BasicDebugInfoWindow
internal var colliding = false
protected inline val gameContainer: GameContainer
get() = Terrarum.appgc
protected inline val updateDelta: Int
get() = Terrarum.delta
protected inline val updateDelta: Float
get() = Gdx.graphics.deltaTime
var isWalkingH = false
@@ -247,24 +248,14 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
// some initialiser goes here...
}
fun makeNewSprite(w: Int, h: Int, image: Image) {
sprite = SpriteAnimation(this, w, h)
sprite!!.setSpriteImage(image)
fun makeNewSprite(textureRegionPack: TextureRegionPack) {
sprite = SpriteAnimation(this)
sprite!!.setSpriteImage(textureRegionPack)
}
fun makeNewSprite(w: Int, h: Int, imageref: String) {
sprite = SpriteAnimation(this, w, h)
sprite!!.setSpriteImage(imageref)
}
fun makeNewSpriteGlow(w: Int, h: Int, image: Image) {
spriteGlow = SpriteAnimation(this, w, h)
spriteGlow!!.setSpriteImage(image)
}
fun makeNewSpriteGlow(w: Int, h: Int, imageref: String) {
spriteGlow = SpriteAnimation(this, w, h)
spriteGlow!!.setSpriteImage(imageref)
fun makeNewSpriteGlow(textureRegionPack: TextureRegionPack) {
spriteGlow = SpriteAnimation(this)
spriteGlow!!.setSpriteImage(textureRegionPack)
}
/**
@@ -314,7 +305,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
inline val feetPosTile: IntArray
get() = intArrayOf(tilewiseHitbox.centeredX.floorInt(), tilewiseHitbox.endY.floorInt())
override fun run() = update(gameContainer, updateDelta)
override fun run() = update(updateDelta)
/**
* Add vector value to the velocity, in the time unit of single frame.
@@ -329,7 +320,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
private val bounceDampenVelThreshold = 0.5
override fun update(gc: GameContainer, delta: Int) {
override fun update(delta: Float) {
if (isUpdate && !flagDespawn) {
if (!assertPrinted) assertInit()
@@ -499,7 +490,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
* weight; gravitational force in action
* W = mass * G (9.8 [m/s^2])
*/
val W: Vector2 = gravitation * Terrarum.TARGET_FPS.toDouble()
val W: Vector2 = gravitation * TerrarumGDX.TARGET_FPS.toDouble()
/**
* Area
*/
@@ -510,7 +501,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
*/
val D: Vector2 = Vector2(externalForce.x.magnSqr(), externalForce.y.magnSqr()) * dragCoefficient * 0.5 * A// * tileDensityFluid.toDouble()
val V: Vector2 = (W - D) / Terrarum.TARGET_FPS.toDouble() * SI_TO_GAME_ACC
val V: Vector2 = (W - D) / TerrarumGDX.TARGET_FPS.toDouble() * SI_TO_GAME_ACC
applyForce(V)
//}
@@ -707,7 +698,7 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
// slam-into-whatever damage (such dirty; much hack; wow)
// vvvv hack (supposed to be 1.0) vvv 50% hack
val collisionDamage = mass * (vectorSum.magnitude / (10.0 / Terrarum.TARGET_FPS).sqr()) / fallDamageDampening.sqr() * GAME_TO_SI_ACC
val collisionDamage = mass * (vectorSum.magnitude / (10.0 / TerrarumGDX.TARGET_FPS).sqr()) / fallDamageDampening.sqr() * GAME_TO_SI_ACC
// kg * m / s^2 (mass * acceleration), acceleration -> (vectorMagn / (0.01)^2).gameToSI()
if (collisionDamage != 0.0) println("Collision damage: $collisionDamage N")
@@ -1193,20 +1184,16 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
)
}
override fun drawGlow(g: Graphics) {
override fun drawGlow(batch: SpriteBatch) {
if (isVisible && spriteGlow != null) {
blendLightenOnly()
val offsetX = if (!spriteGlow!!.flippedHorizontal())
hitboxTranslateX * scale
else
spriteGlow!!.cellWidth * scale - (hitbox.width + hitboxTranslateX * scale)
val offsetX = hitboxTranslateX * scale
val offsetY = spriteGlow!!.cellHeight * scale - hitbox.height - hitboxTranslateY * scale - 1
if (WorldCamera.xCentre > leftsidePadding && centrePosPoint.x <= rightsidePadding) {
// camera center neg, actor center pos
spriteGlow!!.render(g,
spriteGlow!!.render(batch,
(hitbox.startX - offsetX).toFloat() + world.width * TILE_SIZE,
(hitbox.startY - offsetY).toFloat(),
(scale).toFloat()
@@ -1214,14 +1201,14 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
}
else if (WorldCamera.xCentre < rightsidePadding && centrePosPoint.x >= leftsidePadding) {
// camera center pos, actor center neg
spriteGlow!!.render(g,
spriteGlow!!.render(batch,
(hitbox.startX - offsetX).toFloat() - world.width * TILE_SIZE,
(hitbox.startY - offsetY).toFloat(),
(scale).toFloat()
)
}
else {
spriteGlow!!.render(g,
spriteGlow!!.render(batch,
(hitbox.startX - offsetX).toFloat(),
(hitbox.startY - offsetY).toFloat(),
(scale).toFloat()
@@ -1233,21 +1220,17 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
val leftsidePadding = world.width.times(TILE_SIZE) - WorldCamera.width.ushr(1)
val rightsidePadding = WorldCamera.width.ushr(1)
override fun drawBody(g: Graphics) {
override fun drawBody(batch: SpriteBatch) {
if (isVisible && sprite != null) {
BlendMode.resolve(drawMode)
val offsetX = if (!sprite!!.flippedHorizontal())
hitboxTranslateX * scale
else
sprite!!.cellWidth * scale - (hitbox.width + hitboxTranslateX * scale)
val offsetX = hitboxTranslateX * scale
val offsetY = sprite!!.cellHeight * scale - hitbox.height - hitboxTranslateY * scale - 1
if (WorldCamera.xCentre > leftsidePadding && centrePosPoint.x <= rightsidePadding) {
// camera center neg, actor center pos
sprite!!.render(g,
sprite!!.render(batch,
(hitbox.startX - offsetX).toFloat() + world.width * TILE_SIZE,
(hitbox.startY - offsetY).toFloat(),
(scale).toFloat()
@@ -1255,14 +1238,14 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
}
else if (WorldCamera.xCentre < rightsidePadding && centrePosPoint.x >= leftsidePadding) {
// camera center pos, actor center neg
sprite!!.render(g,
sprite!!.render(batch,
(hitbox.startX - offsetX).toFloat() - world.width * TILE_SIZE,
(hitbox.startY - offsetY).toFloat(),
(scale).toFloat()
)
}
else {
sprite!!.render(g,
sprite!!.render(batch,
(hitbox.startX - offsetX).toFloat(),
(hitbox.startY - offsetY).toFloat(),
(scale).toFloat()
@@ -1412,16 +1395,16 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
/**
* [m / s^2] * SI_TO_GAME_ACC -> [px / InternalFrame^2]
*/
@Transient val SI_TO_GAME_ACC = METER / (Terrarum.TARGET_FPS * Terrarum.TARGET_FPS)
@Transient val SI_TO_GAME_ACC = METER / (TerrarumGDX.TARGET_FPS * TerrarumGDX.TARGET_FPS)
/**
* [m / s] * SI_TO_GAME_VEL -> [px / InternalFrame]
*/
@Transient val SI_TO_GAME_VEL = METER / Terrarum.TARGET_FPS
@Transient val SI_TO_GAME_VEL = METER / TerrarumGDX.TARGET_FPS
/**
* [px / InternalFrame^2] * GAME_TO_SI_ACC -> [m / s^2]
*/
@Transient val GAME_TO_SI_ACC = (Terrarum.TARGET_FPS * Terrarum.TARGET_FPS) / METER
@Transient val GAME_TO_SI_ACC = (TerrarumGDX.TARGET_FPS * TerrarumGDX.TARGET_FPS) / METER
/**
@@ -1442,8 +1425,8 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
private fun div16TruncateToMapWidth(x: Int): Int {
if (x < 0)
return 0
else if (x >= Terrarum.ingame!!.world.width shl 4)
return Terrarum.ingame!!.world.width - 1
else if (x >= TerrarumGDX.ingame!!.world.width shl 4)
return TerrarumGDX.ingame!!.world.width - 1
else
return x and 0x7FFFFFFF shr 4
}
@@ -1451,8 +1434,8 @@ open class ActorWithPhysics(renderOrder: RenderOrder, val immobileBody: Boolean
private fun div16TruncateToMapHeight(y: Int): Int {
if (y < 0)
return 0
else if (y >= Terrarum.ingame!!.world.height shl 4)
return Terrarum.ingame!!.world.height - 1
else if (y >= TerrarumGDX.ingame!!.world.height shl 4)
return TerrarumGDX.ingame!!.world.height - 1
else
return y and 0x7FFFFFFF shr 4
}

View File

@@ -1,8 +1,5 @@
package net.torvald.terrarum.gameactors
import org.dyn4j.geometry.Vector2
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Input
/**
* Actors that has movement controlled by Keyboard or AI
@@ -11,7 +8,7 @@ import org.newdawn.slick.Input
*/
interface Controllable {
fun processInput(gc: GameContainer, delta: Int, input: Input)
fun processInput(delta: Float)
fun keyPressed(key: Int, c: Char)

View File

@@ -1,7 +1,5 @@
package net.torvald.terrarum.gameactors
import org.newdawn.slick.SlickException
import java.io.IOException
/**
* Created by minjaesong on 16-02-05.
@@ -12,7 +10,6 @@ object CreatureBuilder {
/**
* @Param jsonFileName with extension
*/
@Throws(IOException::class, SlickException::class)
operator fun invoke(module: String, jsonFileName: String): ActorWithPhysics {
val actor = ActorWithPhysics(Actor.RenderOrder.MIDDLE)
InjectCreatureRaw(actor.actorValue, module, jsonFileName)

View File

@@ -1,14 +1,9 @@
package net.torvald.terrarum.gameactors
import com.jme3.math.FastMath
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Pixmap
import net.torvald.terrarum.gameworld.toUint
import org.newdawn.slick.Color
import org.newdawn.slick.Image
import org.newdawn.slick.ImageBuffer
import org.newdawn.slick.opengl.ImageData
import org.newdawn.slick.opengl.TextureImpl
import java.io.File
import java.nio.ByteBuffer
import java.nio.charset.Charset
import java.util.*
@@ -101,9 +96,10 @@ object DecodeTapestry {
)
private fun Int.fourBitCol() = Color(
this.and(0xF00).shl(12) + this.and(0xF00).shl(8) +
this.and(0x0F0).shl(8) + this.and(0x0F0).shl(4) +
this.and(0x00F).shl(4) + this.and(0x00F)
this.and(0xF00).shl(20) or this.and(0xF00).shl(16) or
this.and(0x0F0).shl(16) or this.and(0x0F0).shl(12) or
this.and(0x00F).shl(12) or this.and(0x00F).shl(8) or
0xFF
)
val MAGIC = "TEAF".toByteArray(charset = Charset.forName("US-ASCII"))
@@ -157,36 +153,24 @@ object DecodeTapestry {
val imageDataSize = file.size - readCounter
val height = imageDataSize / width
val outImageData = ImageBuffer(width, height)
val outImageData = Pixmap(width, height, Pixmap.Format.RGBA8888)
val counterOffset = readCounter
while (readCounter < file.size) {
val ofs = readCounter - counterOffset
val palIndex = file[readCounter].toUint()
if (colourModel == FORMAT_16) {
outImageData.setRGBA(
ofs % width,
ofs / width,
colourIndices16[palIndex].redByte,
colourIndices16[palIndex].greenByte,
colourIndices16[palIndex].blueByte,
255
)
outImageData.setColor(colourIndices16[palIndex])
outImageData.drawPixel(ofs % width, ofs / width)
}
else {
outImageData.setRGBA(
ofs % width,
ofs / width,
colourIndices64[palIndex].redByte,
colourIndices64[palIndex].greenByte,
colourIndices64[palIndex].blueByte,
255
)
outImageData.setColor(colourIndices64[palIndex])
outImageData.drawPixel(ofs % width, ofs / width)
}
readCounter++
}
return TapestryObject(outImageData.image.getScaledCopy(2f), artName, authorName)
return TapestryObject(outImageData, artName, authorName)
}
}

View File

@@ -1,10 +1,9 @@
package net.torvald.terrarum.gameactors
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.blockproperties.BlockCodex
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
/**
* Created by minjaesong on 16-03-15.
@@ -25,14 +24,15 @@ open class DroppedItem(private val item: GameItem) : ActorWithPhysics(Actor.Rend
scale = ItemCodex[item.dynamicID].scale
}
override fun update(gc: GameContainer, delta: Int) {
override fun update(delta: Float) {
super.update(delta)
}
override fun drawBody(g: Graphics) {
super.drawBody(g)
override fun drawGlow(batch: SpriteBatch) {
super.drawGlow(batch)
}
override fun drawGlow(g: Graphics) {
super.drawGlow(g)
override fun drawBody(batch: SpriteBatch) {
super.drawBody(batch)
}
}

View File

@@ -1,7 +1,9 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockCodex
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.util.*
/**
@@ -24,8 +26,8 @@ internal class FixtureTikiTorch : FixtureBase(), Luminous {
lightBoxList = ArrayList(1)
lightBoxList.add(Hitbox(3.0, 0.0, 4.0, 3.0))
makeNewSprite(10, 27, "assets/graphics/sprites/fixtures/tiki_torch.tga")
sprite!!.delay = 200
makeNewSprite(TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/fixtures/tiki_torch.tga"), 10, 27))
sprite!!.delay = 0.2f
sprite!!.setRowsAndFrames(1, 1)
actorValue[AVKey.BASEMASS] = 1.0

View File

@@ -1,7 +1,6 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.gameworld.WorldTime
import org.newdawn.slick.Input
typealias AnyPlayer = HistoricalFigure

View File

@@ -1,13 +1,10 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.ai.ActorAI
import net.torvald.terrarum.gameactors.ai.LuaAIWrapper
import net.torvald.terrarum.gamecontroller.mouseX
import net.torvald.terrarum.gamecontroller.mouseY
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.Material
import org.newdawn.slick.GameContainer
/**
* @param ai AI class. Use LuaAIWrapper for Lua script
@@ -51,11 +48,11 @@ open class HumanoidNPC(
override val isDynamic = false
override val material = Material(0,0,0,0,0,0,0,0,0,0.0)
override fun secondaryUse(gc: GameContainer, delta: Int): Boolean {
override fun secondaryUse(delta: Float): Boolean {
try {
// place the actor to the world
this@HumanoidNPC.setPosition(gc.mouseX, gc.mouseY)
Terrarum.ingame!!.addNewActor(this@HumanoidNPC)
this@HumanoidNPC.setPosition(TerrarumGDX.mouseX, TerrarumGDX.mouseY)
TerrarumGDX.ingame!!.addNewActor(this@HumanoidNPC)
// successful
return true
}
@@ -80,8 +77,8 @@ open class HumanoidNPC(
isVisible = true
}
override fun update(gc: GameContainer, delta: Int) {
super.update(gc, delta)
override fun update(delta: Float) {
super.update(delta)
ai.update(delta)
}

View File

@@ -1,49 +1,50 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.Terrarum
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.g2d.Sprite
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.gameactors.ActorWithPhysics.Companion.SI_TO_GAME_ACC
import net.torvald.terrarum.worlddrawer.FeaturesDrawer.TILE_SIZE
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockCodex
import org.dyn4j.geometry.Vector2
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
/**
* Actors with static sprites and very simple physics
*
* Created by minjaesong on 2017-01-20.
*/
open class ParticleBase(renderOrder: Actor.RenderOrder, maxLifeTime: Int? = null) : Runnable {
open class ParticleBase(renderOrder: Actor.RenderOrder, maxLifeTime: Second? = null) : Runnable {
/** Will NOT actually delete from the CircularArray */
@Volatile var flagDespawn = false
override fun run() = update(Terrarum.appgc, Terrarum.delta)
override fun run() = update(Gdx.graphics.deltaTime)
var isNoSubjectToGrav = false
var dragCoefficient = 3.0
private val lifetimeMax = maxLifeTime ?: 5000
private var lifetimeCounter = 0
private val lifetimeMax = maxLifeTime ?: 5f
private var lifetimeCounter = 0f
open val velocity = Vector2(0.0, 0.0)
open val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0)
open lateinit var body: Image // you might want to use SpriteAnimation
open var glow: Image? = null
open lateinit var body: TextureRegion // you might want to use SpriteAnimation
open var glow: TextureRegion? = null
init {
}
fun update(gc: GameContainer, delta: Int) {
fun update(delta: Float) {
if (!flagDespawn) {
lifetimeCounter += delta
if (velocity.isZero || lifetimeCounter >= lifetimeMax ||
// simple stuck check
BlockCodex[Terrarum.ingame!!.world.getTileFromTerrain(
BlockCodex[TerrarumGDX.ingame!!.world.getTileFromTerrain(
hitbox.canonicalX.div(TILE_SIZE).floorInt(),
hitbox.canonicalY.div(TILE_SIZE).floorInt()
) ?: Block.STONE].isSolid) {
@@ -52,7 +53,7 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, maxLifeTime: Int? = null
// gravity, winds, etc. (external forces)
if (!isNoSubjectToGrav) {
velocity += Terrarum.ingame!!.world.gravitation / dragCoefficient * SI_TO_GAME_ACC
velocity += TerrarumGDX.ingame!!.world.gravitation / dragCoefficient * SI_TO_GAME_ACC
}
@@ -61,15 +62,15 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, maxLifeTime: Int? = null
}
}
fun drawBody(g: Graphics) {
fun drawBody(batch: SpriteBatch) {
if (!flagDespawn) {
g.drawImage(body, hitbox.centeredX.toFloat(), hitbox.centeredY.toFloat())
batch.draw(body, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat())
}
}
fun drawGlow(g: Graphics) {
fun drawGlow(batch: SpriteBatch) {
if (!flagDespawn && glow != null) {
g.drawImage(glow, hitbox.centeredX.toFloat(), hitbox.centeredY.toFloat())
batch.draw(glow, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat())
}
}
}

View File

@@ -1,17 +1,18 @@
package net.torvald.terrarum.gameactors
import org.dyn4j.geometry.Vector2
import org.newdawn.slick.Image
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.ModMgr
/**
* Created by minjaesong on 2017-01-20.
*/
class ParticleTestRain(posX: Double, posY: Double) : ParticleBase(Actor.RenderOrder.BEHIND, 6000) {
class ParticleTestRain(posX: Double, posY: Double) : ParticleBase(Actor.RenderOrder.BEHIND, 6f) {
init {
body = Image("./assets/modules/basegame/weathers/raindrop.tga")
val w = body.width.toDouble()
val h = body.height.toDouble()
body = TextureRegion(Texture(ModMgr.getGdxFile("basegame", "weathers/raindrop.tga")))
val w = body.regionWidth.toDouble()
val h = body.regionHeight.toDouble()
hitbox.setFromWidthHeight(
posX - w.times(0.5),
posY - h.times(0.5),

View File

@@ -1,17 +1,16 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.worlddrawer.FeaturesDrawer.TILE_SIZE
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.TerrarumGDX
import net.torvald.terrarum.worldgenerator.RoguelikeRandomiser
import org.newdawn.slick.Color
import org.newdawn.slick.Graphics
/**
* Created by minjaesong on 16-03-05.
*/
class PhysTestBall : ActorWithPhysics(Actor.RenderOrder.MIDDLE, immobileBody = true) {
private var color = Color.orange
private var color = Color.GOLD
init {
setHitboxDimension(16, 16, 0, 0)
@@ -21,26 +20,27 @@ class PhysTestBall : ActorWithPhysics(Actor.RenderOrder.MIDDLE, immobileBody = t
color = RoguelikeRandomiser.composeColourFrom(RoguelikeRandomiser.POTION_PRIMARY_COLSET)
}
override fun drawBody(g: Graphics) {
g.color = color
g.fillOval(
hitbox.startX.toFloat() - 1f,
hitbox.startY.toFloat() - 1f,
hitbox.width.toFloat(),
hitbox.height.toFloat())
override fun drawBody(batch: SpriteBatch) {
TerrarumGDX.inShapeRenderer {
it.color = color
it.circle(
hitbox.startX.toFloat() - 1f,
hitbox.startY.toFloat() - 1f,
hitbox.width.toFloat()
)
g.fillOval(
hitbox.startX.toFloat() + Terrarum.ingame!!.world.width * TILE_SIZE - 1f,
hitbox.startY.toFloat() - 1f,
hitbox.width.toFloat(),
hitbox.height.toFloat())
g.fillOval(
hitbox.startX.toFloat() - Terrarum.ingame!!.world.width * TILE_SIZE - 1f,
hitbox.startY.toFloat() - 1f,
hitbox.width.toFloat(),
hitbox.height.toFloat())
it.circle(
hitbox.startX.toFloat() + TerrarumGDX.ingame!!.world.width * TILE_SIZE - 1f,
hitbox.startY.toFloat() - 1f,
hitbox.width.toFloat()
)
it.circle(
hitbox.startX.toFloat() - TerrarumGDX.ingame!!.world.width * TILE_SIZE - 1f,
hitbox.startY.toFloat() - 1f,
hitbox.width.toFloat()
)
}
//println(moveDelta)
}

View File

@@ -1,10 +1,5 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.AmmoMeterProxy
import net.torvald.terrarum.gameactors.ActorHumanoid
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Input
/**
* A wrapper to support instant player changing (or possessing other NPCs maybe)
*

View File

@@ -1,6 +1,5 @@
package net.torvald.terrarum.gameactors
import org.newdawn.slick.GameContainer
/**
* Game player (YOU!)
@@ -27,8 +26,8 @@ class Player(born: GameDate) : ActorHumanoid(born) {
collisionType = COLLISION_KINEMATIC
}
override fun update(gc: GameContainer, delta: Int) {
super.update(gc, delta)
override fun update(delta: Float) {
super.update(delta)
}
}

View File

@@ -1,18 +1,14 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.Terrarum
import org.newdawn.slick.SlickException
import java.io.IOException
import net.torvald.terrarum.TerrarumGDX
/**
* Created by minjaesong on 16-02-03.
*/
object PlayerBuilder {
private val JSONPATH = "./assets/raw/"
private val jsonString = String()
operator fun invoke(): Actor {
val p: Actor = Player(Terrarum.ingame!!.world.time.currentTimeAsGameDate)
val p: Actor = Player(TerrarumGDX.ingame!!.world.time.currentTimeAsGameDate)
InjectCreatureRaw(p.actorValue, "basegame", "CreatureHuman.json")
// attach sprite

View File

@@ -3,6 +3,7 @@ package net.torvald.terrarum.gameactors
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.gameactors.ai.LuaAIWrapper
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/**
* Created by minjaesong on 16-03-25.
@@ -23,8 +24,8 @@ object PlayerBuilderCynthia {
p.actorValue[AVKey.NAME] = "Cynthia"
p.makeNewSprite(26, 42, ModMgr.getPath("basegame", "sprites/test_player_2.tga"))
p.sprite!!.delay = 200
p.makeNewSprite(TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/test_player_2.tga"), 26, 42))
p.sprite!!.delay = 0.2f
p.sprite!!.setRowsAndFrames(1, 1)
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 9, 0)

View File

@@ -1,13 +1,11 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.gameactors.ActorValue
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.gameactors.faction.FactionFactory
import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.to10bit
import org.newdawn.slick.Color
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/**
* Created by minjaesong on 16-02-03.
@@ -20,12 +18,13 @@ object PlayerBuilderSigrid {
p.referenceID = 0x51621D // the only constant of this procedural universe
p.makeNewSprite(28, 51, ModMgr.getPath("basegame", "sprites/test_player.tga"))
p.sprite!!.delay = 200
p.makeNewSprite(TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/test_player.tga"), 28, 51))
p.sprite!!.delay = 0.2f
p.sprite!!.setRowsAndFrames(1, 1)
p.makeNewSpriteGlow(28, 51, ModMgr.getPath("basegame", "sprites/test_player_glow.tga"))
p.spriteGlow!!.delay = 200
p.makeNewSpriteGlow(TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/test_player_glow.tga"), 28, 51))
p.spriteGlow!!.delay = 0.2f
p.spriteGlow!!.setRowsAndFrames(1, 1)
p.actorValue[AVKey.SCALE] = 1.0

View File

@@ -2,6 +2,7 @@ package net.torvald.terrarum.gameactors
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/**
* Created by SKYHi14 on 2017-02-10.
@@ -18,8 +19,8 @@ object PlayerBuilderTestSubject1 {
p.actorValue[AVKey.NAME] = "Test Subject 1"
p.makeNewSprite(48, 52, ModMgr.getPath("basegame", "sprites/npc_template_anim_prototype.tga"))
p.sprite!!.delay = 200
p.makeNewSprite(TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/npc_template_anim_prototype.tga"), 48, 52))
p.sprite!!.delay = 0.2f
p.sprite!!.setRowsAndFrames(2, 4)
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0)

View File

@@ -1,6 +1,6 @@
package net.torvald.terrarum.gameactors
import net.torvald.terrarum.Terrarum
import com.badlogic.gdx.Gdx
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.ItemCodex
@@ -27,7 +27,7 @@ interface Pocketed {
}
inventory.itemEquipped[item.equipPosition] = null
item.effectOnUnequip(Terrarum.appgc, Terrarum.delta)
item.effectOnUnequip(Gdx.graphics.deltaTime)
}
// no need for equipSlot(Int)
@@ -49,7 +49,7 @@ interface Pocketed {
if (item.equipPosition >= 0) {
inventory.itemEquipped[item.equipPosition] = item
item.effectWhenEquipped(Terrarum.appgc, Terrarum.delta)
item.effectWhenEquipped(Gdx.graphics.deltaTime)
}
// else do nothing
}
@@ -68,13 +68,13 @@ interface Pocketed {
fun consumePrimary(item: GameItem) {
if (item.primaryUse(Terrarum.appgc, Terrarum.delta)) {
if (item.primaryUse(Gdx.graphics.deltaTime)) {
inventory.consumeItem(this as Actor, item) // consume on successful
}
}
fun consumeSecondary(item: GameItem) {
if (item.secondaryUse(Terrarum.appgc, Terrarum.delta))
if (item.secondaryUse(Gdx.graphics.deltaTime))
inventory.consumeItem(this as Actor, item) // consume on successful
}
}

Some files were not shown because too many files have changed in this diff Show More