mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-17 14:04:05 +09:00
more Kotlin (Everything is now Kotlin except for RNGs and FastMath), more sunlight tinkering, a lantern
Former-commit-id: b284424580831956f8383b97ccfc1bdd1e03feeb Former-commit-id: ec788cf7ef74f91fb54b905817febd22b6da6d54
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 346 KiB After Width: | Height: | Size: 347 KiB |
@@ -12,6 +12,12 @@ import java.io.IOException
|
|||||||
*/
|
*/
|
||||||
object JsonWriter {
|
object JsonWriter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialise a class to the file as JSON, using Google GSON.
|
||||||
|
*
|
||||||
|
* @param c: a class
|
||||||
|
* @param path: path to write a file
|
||||||
|
*/
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun writeToFile(c: Any, path: String) {
|
fun writeToFile(c: Any, path: String) {
|
||||||
val classElem = Gson().toJsonTree(c)
|
val classElem = Gson().toJsonTree(c)
|
||||||
@@ -21,6 +27,12 @@ object JsonWriter {
|
|||||||
writer.close()
|
writer.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialise JsonObject to the file as JSON, using Google GSON.
|
||||||
|
*
|
||||||
|
* @param jsonObject
|
||||||
|
* @param path: path to write a file
|
||||||
|
*/
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun writeToFile(jsonObject: JsonObject, path: String) {
|
fun writeToFile(jsonObject: JsonObject, path: String) {
|
||||||
val writer = FileWriter(path)
|
val writer = FileWriter(path)
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
package com.Torvald.Point;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-15.
|
|
||||||
*/
|
|
||||||
public class Point2f {
|
|
||||||
|
|
||||||
private float x;
|
|
||||||
private float y;
|
|
||||||
|
|
||||||
public Point2f(float x, float y) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(float x, float y) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getX() {
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getY() {
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
22
src/com/Torvald/Point/Point2f.kt
Normal file
22
src/com/Torvald/Point/Point2f.kt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package com.Torvald.Point
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-15.
|
||||||
|
*/
|
||||||
|
class Point2f(x: Float, y: Float) {
|
||||||
|
|
||||||
|
var x: Float = 0.toFloat()
|
||||||
|
private set
|
||||||
|
var y: Float = 0.toFloat()
|
||||||
|
private set
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.x = x
|
||||||
|
this.y = y
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun set(x: Float, y: Float) {
|
||||||
|
this.x = x
|
||||||
|
this.y = y
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.Actors;
|
|
||||||
|
|
||||||
import com.Torvald.Point.Point2f;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-15.
|
|
||||||
*/
|
|
||||||
public class Hitbox {
|
|
||||||
|
|
||||||
private Point2f hitboxStart;
|
|
||||||
private Point2f hitboxEnd;
|
|
||||||
private float width;
|
|
||||||
private float height;
|
|
||||||
|
|
||||||
public Hitbox(float x1, float y1, float width, float height) {
|
|
||||||
hitboxStart = new Point2f(x1, y1);
|
|
||||||
hitboxEnd = new Point2f(x1 + width, y1 + height);
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Point2f getHitboxStart() {
|
|
||||||
return hitboxStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Point2f getHitboxEnd() {
|
|
||||||
return hitboxEnd;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getWidth() {
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getHeight() {
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns bottom-centered point of hitbox.
|
|
||||||
* @return pointX
|
|
||||||
*/
|
|
||||||
public float getPointedX() {
|
|
||||||
return hitboxStart.getX() + (width / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns bottom-centered point of hitbox.
|
|
||||||
* @return pointY
|
|
||||||
*/
|
|
||||||
public float getPointedY() {
|
|
||||||
return hitboxEnd.getY();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set to the point top left
|
|
||||||
* @param x1
|
|
||||||
* @param y1
|
|
||||||
* @param width
|
|
||||||
* @param height
|
|
||||||
*/
|
|
||||||
public void set(float x1, float y1, float width, float height) {
|
|
||||||
hitboxStart = new Point2f(x1, y1);
|
|
||||||
hitboxEnd = new Point2f(x1 + width, y1 + height);
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPosition(float x1, float y1) {
|
|
||||||
hitboxStart = new Point2f(x1, y1);
|
|
||||||
hitboxEnd = new Point2f(x1 + width, y1 + height);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPositionX(float x) {
|
|
||||||
setPosition(x, getPosY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPositionY(float y) {
|
|
||||||
setPosition(getPosX(), y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPositionFromPoint(float x1, float y1) {
|
|
||||||
hitboxStart = new Point2f(x1 - (width / 2), y1 - height);
|
|
||||||
hitboxEnd = new Point2f(hitboxStart.getX() + width, hitboxStart.getY() + height);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPositionXFromPoint(float x) {
|
|
||||||
setPositionFromPoint(x, getPointedY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPositionYFromPoint(float y) {
|
|
||||||
setPositionFromPoint(getPointedX(), y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void translatePosX(float d) {
|
|
||||||
setPositionX(getPosX() + d);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void translatePosY(float d) {
|
|
||||||
setPositionY(getPosY() + d);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDimension(float w, float h) {
|
|
||||||
width = w;
|
|
||||||
height = h;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns x value of start point
|
|
||||||
* @return top-left point posX
|
|
||||||
*/
|
|
||||||
public float getPosX() {
|
|
||||||
return hitboxStart.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns y value of start point
|
|
||||||
* @return top-left point posY
|
|
||||||
*/
|
|
||||||
public float getPosY() {
|
|
||||||
return hitboxStart.getY();
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getCenteredX() {
|
|
||||||
return (hitboxStart.getX() + hitboxEnd.getX()) * 0.5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getCenteredY() {
|
|
||||||
return (hitboxStart.getY() + hitboxEnd.getY()) * 0.5f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
115
src/com/Torvald/Terrarum/Actors/Hitbox.kt
Normal file
115
src/com/Torvald/Terrarum/Actors/Hitbox.kt
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
package com.Torvald.Terrarum.Actors
|
||||||
|
|
||||||
|
import com.Torvald.Point.Point2f
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-15.
|
||||||
|
*/
|
||||||
|
class Hitbox(x1: Float, y1: Float, width: Float, height: Float) {
|
||||||
|
|
||||||
|
var hitboxStart: Point2f
|
||||||
|
private set
|
||||||
|
var hitboxEnd: Point2f
|
||||||
|
private set
|
||||||
|
var width: Float = 0.toFloat()
|
||||||
|
private set
|
||||||
|
var height: Float = 0.toFloat()
|
||||||
|
private set
|
||||||
|
|
||||||
|
init {
|
||||||
|
hitboxStart = Point2f(x1, y1)
|
||||||
|
hitboxEnd = Point2f(x1 + width, y1 + height)
|
||||||
|
this.width = width
|
||||||
|
this.height = height
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns bottom-centered point of hitbox.
|
||||||
|
* @return pointX
|
||||||
|
*/
|
||||||
|
val pointedX: Float
|
||||||
|
get() = hitboxStart.x + width / 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns bottom-centered point of hitbox.
|
||||||
|
* @return pointY
|
||||||
|
*/
|
||||||
|
val pointedY: Float
|
||||||
|
get() = hitboxEnd.y
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set to the point top left
|
||||||
|
* @param x1
|
||||||
|
* *
|
||||||
|
* @param y1
|
||||||
|
* *
|
||||||
|
* @param width
|
||||||
|
* *
|
||||||
|
* @param height
|
||||||
|
*/
|
||||||
|
operator fun set(x1: Float, y1: Float, width: Float, height: Float) {
|
||||||
|
hitboxStart = Point2f(x1, y1)
|
||||||
|
hitboxEnd = Point2f(x1 + width, y1 + height)
|
||||||
|
this.width = width
|
||||||
|
this.height = height
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPosition(x1: Float, y1: Float) {
|
||||||
|
hitboxStart = Point2f(x1, y1)
|
||||||
|
hitboxEnd = Point2f(x1 + width, y1 + height)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPositionX(x: Float) {
|
||||||
|
setPosition(x, posY)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPositionY(y: Float) {
|
||||||
|
setPosition(posX, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPositionFromPoint(x1: Float, y1: Float) {
|
||||||
|
hitboxStart = Point2f(x1 - width / 2, y1 - height)
|
||||||
|
hitboxEnd = Point2f(hitboxStart.x + width, hitboxStart.y + height)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPositionXFromPoint(x: Float) {
|
||||||
|
setPositionFromPoint(x, pointedY)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPositionYFromPoint(y: Float) {
|
||||||
|
setPositionFromPoint(pointedX, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun translatePosX(d: Float) {
|
||||||
|
setPositionX(posX + d)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun translatePosY(d: Float) {
|
||||||
|
setPositionY(posY + d)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setDimension(w: Float, h: Float) {
|
||||||
|
width = w
|
||||||
|
height = h
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns x value of start point
|
||||||
|
* @return top-left point posX
|
||||||
|
*/
|
||||||
|
val posX: Float
|
||||||
|
get() = hitboxStart.x
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns y value of start point
|
||||||
|
* @return top-left point posY
|
||||||
|
*/
|
||||||
|
val posY: Float
|
||||||
|
get() = hitboxStart.y
|
||||||
|
|
||||||
|
val centeredX: Float
|
||||||
|
get() = (hitboxStart.x + hitboxEnd.x) * 0.5f
|
||||||
|
|
||||||
|
val centeredY: Float
|
||||||
|
get() = (hitboxStart.y + hitboxEnd.y) * 0.5f
|
||||||
|
}
|
||||||
@@ -26,7 +26,6 @@ object PFSigrid {
|
|||||||
p.sprite!!.setDelay(200)
|
p.sprite!!.setDelay(200)
|
||||||
p.sprite!!.setRowsAndFrames(1, 1)
|
p.sprite!!.setRowsAndFrames(1, 1)
|
||||||
p.sprite!!.setAsVisible()
|
p.sprite!!.setAsVisible()
|
||||||
p.sprite!!.composeSprite()
|
|
||||||
|
|
||||||
p.spriteGlow = SpriteAnimation()
|
p.spriteGlow = SpriteAnimation()
|
||||||
p.spriteGlow!!.setDimension(28, 51)
|
p.spriteGlow!!.setDimension(28, 51)
|
||||||
@@ -34,7 +33,6 @@ object PFSigrid {
|
|||||||
p.spriteGlow!!.setDelay(200)
|
p.spriteGlow!!.setDelay(200)
|
||||||
p.spriteGlow!!.setRowsAndFrames(1, 1)
|
p.spriteGlow!!.setRowsAndFrames(1, 1)
|
||||||
p.spriteGlow!!.setAsVisible()
|
p.spriteGlow!!.setAsVisible()
|
||||||
p.spriteGlow!!.composeSprite()
|
|
||||||
|
|
||||||
p.actorValue = ActorValue()
|
p.actorValue = ActorValue()
|
||||||
p.actorValue.set("scale", 1.0f)
|
p.actorValue.set("scale", 1.0f)
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ class PhysTestBall : ActorWithBody {
|
|||||||
override fun drawBody(gc: GameContainer, g: Graphics) {
|
override fun drawBody(gc: GameContainer, g: Graphics) {
|
||||||
g.color = Color.orange
|
g.color = Color.orange
|
||||||
g.fillOval(
|
g.fillOval(
|
||||||
hitbox!!.getPosX(),
|
hitbox!!.posX,
|
||||||
hitbox!!.getPosY(),
|
hitbox!!.posY,
|
||||||
hitbox!!.getWidth(),
|
hitbox!!.width,
|
||||||
hitbox!!.getHeight())
|
hitbox!!.height)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.FileSystems;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-02-10.
|
|
||||||
*/
|
|
||||||
public class CatStdout implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
|
|
||||||
Echo echo = new Echo();
|
|
||||||
|
|
||||||
if (args.length == 1) {
|
|
||||||
printUsage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Files.lines(FileSystems.getDefault().getPath(args[1])).forEach(echo::execute);
|
|
||||||
}
|
|
||||||
catch (IOException e) {
|
|
||||||
echo.execute("CatStdout: could not read file -- IOException");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
new Echo().execute("usage: cat 'path/to/text/file");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
32
src/com/Torvald/Terrarum/ConsoleCommand/CatStdout.kt
Normal file
32
src/com/Torvald/Terrarum/ConsoleCommand/CatStdout.kt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import java.io.IOException
|
||||||
|
import java.nio.file.FileSystems
|
||||||
|
import java.nio.file.Files
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-02-10.
|
||||||
|
*/
|
||||||
|
class CatStdout : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
|
||||||
|
val echo = Echo()
|
||||||
|
|
||||||
|
if (args.size == 1) {
|
||||||
|
printUsage()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Files.lines(FileSystems.getDefault().getPath(args[1])).forEach({ echo.execute(it) })
|
||||||
|
}
|
||||||
|
catch (e: IOException) {
|
||||||
|
echo.execute("CatStdout: could not read file -- IOException")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
Echo().execute("usage: cat 'path/to/text/file")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
import com.Torvald.Terrarum.UserInterface.ConsoleWindow;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-16.
|
|
||||||
*/
|
|
||||||
class Echo implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
String[] argsWoHeader = new String[args.length - 1];
|
|
||||||
for (int i = 0; i < argsWoHeader.length; i++)
|
|
||||||
argsWoHeader[i] = args[i + 1];
|
|
||||||
|
|
||||||
Arrays.asList(argsWoHeader).forEach(
|
|
||||||
((ConsoleWindow) Terrarum.game.consoleHandler.getUI())::sendMessage
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void execute(String single_line) {
|
|
||||||
((ConsoleWindow) Terrarum.game.consoleHandler.getUI())
|
|
||||||
.sendMessage(single_line);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
26
src/com/Torvald/Terrarum/ConsoleCommand/Echo.kt
Normal file
26
src/com/Torvald/Terrarum/ConsoleCommand/Echo.kt
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
import com.Torvald.Terrarum.UserInterface.ConsoleWindow
|
||||||
|
|
||||||
|
import java.util.Arrays
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-16.
|
||||||
|
*/
|
||||||
|
internal class Echo : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
val argsWoHeader = Array<String>(args.size - 1, {it -> args[it + 1]})
|
||||||
|
|
||||||
|
argsWoHeader.forEach(
|
||||||
|
{ (Terrarum.game.consoleHandler.UI as ConsoleWindow).sendMessage(it) })
|
||||||
|
}
|
||||||
|
|
||||||
|
fun execute(single_line: String) {
|
||||||
|
(Terrarum.game.consoleHandler.UI as ConsoleWindow).sendMessage(single_line)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.JsonWriter;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-02-10.
|
|
||||||
*/
|
|
||||||
public class ExportAV implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
if (args.length == 2) {
|
|
||||||
try {
|
|
||||||
JsonWriter.INSTANCE.writeToFile(Terrarum.game.player.getActorValue()
|
|
||||||
, Terrarum.defaultDir + "/Exports/" + args[1] + ".json"
|
|
||||||
);
|
|
||||||
|
|
||||||
new Echo().execute("ExportAV: exported to " + args[1] + ".json");
|
|
||||||
}
|
|
||||||
catch (IOException e) {
|
|
||||||
new Echo().execute("ExportAV: IOException raised.");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
printUsage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
echo.execute("Export ActorValue as JSON format.");
|
|
||||||
echo.execute("Usage: exportav (id) filename-without-extension");
|
|
||||||
echo.execute("blank ID for player");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
38
src/com/Torvald/Terrarum/ConsoleCommand/ExportAV.kt
Normal file
38
src/com/Torvald/Terrarum/ConsoleCommand/ExportAV.kt
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.JsonWriter
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-02-10.
|
||||||
|
*/
|
||||||
|
class ExportAV : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
if (args.size == 2) {
|
||||||
|
try {
|
||||||
|
JsonWriter.writeToFile(
|
||||||
|
Terrarum.game.player.getActorValue(),
|
||||||
|
Terrarum.defaultDir + "/Exports/" + args[1] + ".json")
|
||||||
|
|
||||||
|
Echo().execute("ExportAV: exported to " + args[1] + ".json")
|
||||||
|
}
|
||||||
|
catch (e: IOException) {
|
||||||
|
Echo().execute("ExportAV: IOException raised.")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
val echo = Echo()
|
||||||
|
echo.execute("Export ActorValue as JSON format.")
|
||||||
|
echo.execute("Usage: exportav (id) filename-without-extension")
|
||||||
|
echo.execute("blank ID for player")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,151 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.ColourUtil.Col4096
|
||||||
|
import com.Torvald.RasterWriter
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO
|
||||||
|
import java.awt.*
|
||||||
|
import java.awt.color.ColorSpace
|
||||||
|
import java.awt.image.*
|
||||||
|
import java.io.*
|
||||||
|
import java.util.Hashtable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-17.
|
||||||
|
*/
|
||||||
|
class ExportMap : ConsoleCommand {
|
||||||
|
|
||||||
|
//private var mapData: ByteArray? = null
|
||||||
|
// private var mapDataPointer = 0
|
||||||
|
|
||||||
|
private val colorTable = Hashtable<Byte, Col4096>()
|
||||||
|
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
if (args.size == 2) {
|
||||||
|
buildColorTable()
|
||||||
|
|
||||||
|
var mapData = ByteArray(Terrarum.game.map.width * Terrarum.game.map.height * 3)
|
||||||
|
var mapDataPointer = 0
|
||||||
|
|
||||||
|
for (tile in Terrarum.game.map.layerTerrain) {
|
||||||
|
val colArray = (colorTable as java.util.Map<Byte, Col4096>)
|
||||||
|
.getOrDefault(tile, Col4096(0xFFF)).toByteArray()
|
||||||
|
|
||||||
|
for (i in 0..2) {
|
||||||
|
mapData[mapDataPointer + i] = colArray[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
mapDataPointer += 3
|
||||||
|
}
|
||||||
|
|
||||||
|
val dir = Terrarum.defaultDir + "/Exports/"
|
||||||
|
val dirAsFile = File(dir)
|
||||||
|
if (!dirAsFile.exists()) {
|
||||||
|
dirAsFile.mkdir()
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
RasterWriter.writePNG_RGB(
|
||||||
|
Terrarum.game.map.width, Terrarum.game.map.height, mapData, dir + args[1] + ".png")
|
||||||
|
Echo().execute("ExportMap: exported to " + args[1] + ".png")
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (e: IOException) {
|
||||||
|
Echo().execute("ExportMap: IOException raised.")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
|
||||||
|
// mapData = null
|
||||||
|
// mapDataPointer = 0
|
||||||
|
|
||||||
|
// Free up some memory
|
||||||
|
System.gc()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
val echo = Echo()
|
||||||
|
echo.execute("Usage: export <name>")
|
||||||
|
echo.execute("Exports current map into visible image.")
|
||||||
|
echo.execute("The image can be found at %adddata%/Terrarum/Exports")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildColorTable() {
|
||||||
|
colorTable.put(AIR, Col4096(0xCEF))
|
||||||
|
colorTable.put(STONE, Col4096(0x887))
|
||||||
|
colorTable.put(DIRT, Col4096(0x763))
|
||||||
|
colorTable.put(GRASS, Col4096(0x251))
|
||||||
|
|
||||||
|
colorTable.put(COPPER, Col4096(0x6A8))
|
||||||
|
colorTable.put(IRON, Col4096(0xC75))
|
||||||
|
colorTable.put(GOLD, Col4096(0xCB6))
|
||||||
|
colorTable.put(ILMENITE, Col4096(0x8AB))
|
||||||
|
colorTable.put(AURICHALCUM, Col4096(0xD92))
|
||||||
|
colorTable.put(SILVER, Col4096(0xDDD))
|
||||||
|
|
||||||
|
colorTable.put(DIAMOND, Col4096(0x9CE))
|
||||||
|
colorTable.put(RUBY, Col4096(0xB10))
|
||||||
|
colorTable.put(EMERALD, Col4096(0x0B1))
|
||||||
|
colorTable.put(SAPPHIRE, Col4096(0x01B))
|
||||||
|
colorTable.put(TOPAZ, Col4096(0xC70))
|
||||||
|
colorTable.put(AMETHYST, Col4096(0x70C))
|
||||||
|
|
||||||
|
colorTable.put(WATER, Col4096(0x038))
|
||||||
|
colorTable.put(LAVA, Col4096(0xF50))
|
||||||
|
|
||||||
|
colorTable.put(SAND, Col4096(0xDCA))
|
||||||
|
colorTable.put(GRAVEL, Col4096(0x664))
|
||||||
|
|
||||||
|
colorTable.put(ICE_NATURAL, Col4096(0x9AB))
|
||||||
|
colorTable.put(ICE_MAGICAL, Col4096(0x7AC))
|
||||||
|
colorTable.put(ICE_FRAGILE, Col4096(0x6AF))
|
||||||
|
colorTable.put(SNOW, Col4096(0xCDE))
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
private val AIR: Byte = 0
|
||||||
|
|
||||||
|
private val STONE: Byte = 1
|
||||||
|
private val DIRT: Byte = 2
|
||||||
|
private val GRASS: Byte = 3
|
||||||
|
|
||||||
|
private val SAND: Byte = 13
|
||||||
|
private val GRAVEL: Byte = 14
|
||||||
|
|
||||||
|
private val COPPER: Byte = 15
|
||||||
|
private val IRON: Byte = 16
|
||||||
|
private val GOLD: Byte = 17
|
||||||
|
private val SILVER: Byte = 18
|
||||||
|
private val ILMENITE: Byte = 19
|
||||||
|
private val AURICHALCUM: Byte = 20
|
||||||
|
|
||||||
|
private val DIAMOND: Byte = 25
|
||||||
|
private val RUBY: Byte = 21
|
||||||
|
private val EMERALD: Byte = 22
|
||||||
|
private val SAPPHIRE: Byte = 23
|
||||||
|
private val TOPAZ: Byte = 24
|
||||||
|
private val AMETHYST: Byte = 26
|
||||||
|
|
||||||
|
private val SNOW: Byte = 27
|
||||||
|
private val ICE_FRAGILE: Byte = 28
|
||||||
|
private val ICE_NATURAL: Byte = 29
|
||||||
|
private val ICE_MAGICAL: Byte = 30
|
||||||
|
|
||||||
|
private val WATER = 239.toByte()
|
||||||
|
private val LAVA = 255.toByte()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
package com.Torvald.Terrarum.ConsoleCommand;
|
||||||
|
|
||||||
import com.Torvald.ColourUtil.Col4096;
|
import com.Torvald.ColourUtil.Col4096;
|
||||||
@@ -144,3 +292,5 @@ public class ExportMap implements ConsoleCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-18.
|
|
||||||
*/
|
|
||||||
public class ForceGC implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
System.gc();
|
|
||||||
new Echo().execute("Invoked System.gc");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
new Echo().execute("Invoke garbage collection of JVM.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
15
src/com/Torvald/Terrarum/ConsoleCommand/ForceGC.kt
Normal file
15
src/com/Torvald/Terrarum/ConsoleCommand/ForceGC.kt
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-18.
|
||||||
|
*/
|
||||||
|
class ForceGC : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
System.gc()
|
||||||
|
Echo().execute("Invoked System.gc")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
Echo().execute("Invoke garbage collection of JVM.")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Actors.ActorValue;
|
|
||||||
import com.Torvald.Terrarum.Game;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-19.
|
|
||||||
*/
|
|
||||||
public class GetAV implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (args.length == 1) {
|
|
||||||
// print all actorvalue of player
|
|
||||||
ActorValue av = Terrarum.game.player.getActorValue();
|
|
||||||
Set keyset = av.getKeySet();
|
|
||||||
|
|
||||||
keyset.forEach(
|
|
||||||
elem -> echo.execute(elem + " = " + av.get((String) elem))
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (args.length != 3 && args.length != 2) {
|
|
||||||
printUsage();
|
|
||||||
}
|
|
||||||
else if (args.length == 2) {
|
|
||||||
echo.execute("player." + args[1] + " = "
|
|
||||||
+ Terrarum.game.player.getActorValue().get(args[1])
|
|
||||||
+ " ("
|
|
||||||
+ Terrarum.game.player.getActorValue().get(args[1]).getClass()
|
|
||||||
.getSimpleName()
|
|
||||||
+ ")"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if (args.length == 3) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (NullPointerException e) {
|
|
||||||
if (args.length == 2) {
|
|
||||||
echo.execute(args[1] + ": actor value does not exist.");
|
|
||||||
}
|
|
||||||
else if (args.length == 3) {
|
|
||||||
echo.execute(args[2] + ": actor value does not exist.");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new NullPointerException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
echo.execute("Get desired actor value of specific target.");
|
|
||||||
echo.execute("Usage: getav (id) <av>");
|
|
||||||
echo.execute("blank ID for player");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
57
src/com/Torvald/Terrarum/ConsoleCommand/GetAV.kt
Normal file
57
src/com/Torvald/Terrarum/ConsoleCommand/GetAV.kt
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Actors.ActorValue
|
||||||
|
import com.Torvald.Terrarum.Game
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-19.
|
||||||
|
*/
|
||||||
|
class GetAV : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
val echo = Echo()
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (args.size == 1) {
|
||||||
|
// print all actorvalue of player
|
||||||
|
val av = Terrarum.game.player.getActorValue()
|
||||||
|
val keyset = av.keySet
|
||||||
|
|
||||||
|
keyset.forEach { elem -> echo.execute("$elem = ${av[elem as String]}") }
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (args.size != 3 && args.size != 2) {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
else if (args.size == 2) {
|
||||||
|
echo.execute("player." + args[1] + " = "
|
||||||
|
+ Terrarum.game.player.getActorValue()[args[1]]
|
||||||
|
+ " ("
|
||||||
|
+ Terrarum.game.player.getActorValue()[args[1]]!!.javaClass.simpleName
|
||||||
|
+ ")")
|
||||||
|
}
|
||||||
|
else if (args.size == 3) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e: NullPointerException) {
|
||||||
|
if (args.size == 2) {
|
||||||
|
echo.execute(args[1] + ": actor value does not exist.")
|
||||||
|
}
|
||||||
|
else if (args.size == 3) {
|
||||||
|
echo.execute(args[2] + ": actor value does not exist.")
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw NullPointerException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
val echo = Echo()
|
||||||
|
echo.execute("Get desired actor value of specific target.")
|
||||||
|
echo.execute("Usage: getav (id) <av>")
|
||||||
|
echo.execute("blank ID for player")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Actors.Faction.Faction;
|
|
||||||
import com.Torvald.Terrarum.LangPack.Lang;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-02-17.
|
|
||||||
*/
|
|
||||||
public class GetFactioning implements ConsoleCommand {
|
|
||||||
|
|
||||||
private final String PRINT_INDENTATION = " --> ";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
|
|
||||||
if (args.length == 1) { // get all factioning data of player
|
|
||||||
HashSet<Faction> factionSet = Terrarum.game.player.getFaction();
|
|
||||||
|
|
||||||
if (factionSet == null) {
|
|
||||||
echo.execute("The actor has null faction set.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int count = factionSet.size();
|
|
||||||
echo.execute(String.valueOf(count) + Lang.pluralise(" faction", count) + " assigned.");
|
|
||||||
|
|
||||||
for (Faction faction : factionSet) {
|
|
||||||
echo.execute("Faction \"" + faction.getFactionName() + "\"");
|
|
||||||
echo.execute(" Amicable");
|
|
||||||
faction.getFactionAmicable().forEach(
|
|
||||||
s -> echo.execute(PRINT_INDENTATION + s)
|
|
||||||
);
|
|
||||||
|
|
||||||
echo.execute(" Explicit neutral");
|
|
||||||
faction.getFactionNeutral().forEach(
|
|
||||||
s -> echo.execute(PRINT_INDENTATION + s)
|
|
||||||
);
|
|
||||||
|
|
||||||
echo.execute(" Hostile");
|
|
||||||
faction.getFactionHostile().forEach(
|
|
||||||
s -> echo.execute(PRINT_INDENTATION + s)
|
|
||||||
);
|
|
||||||
|
|
||||||
echo.execute(" Fearful");
|
|
||||||
faction.getFactionFearful().forEach(
|
|
||||||
s -> echo.execute(PRINT_INDENTATION + s)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
51
src/com/Torvald/Terrarum/ConsoleCommand/GetFactioning.kt
Normal file
51
src/com/Torvald/Terrarum/ConsoleCommand/GetFactioning.kt
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Actors.Faction.Faction
|
||||||
|
import com.Torvald.Terrarum.LangPack.Lang
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
import java.util.HashSet
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-02-17.
|
||||||
|
*/
|
||||||
|
class GetFactioning : ConsoleCommand {
|
||||||
|
|
||||||
|
private val PRINT_INDENTATION = " --> "
|
||||||
|
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
val echo = Echo()
|
||||||
|
|
||||||
|
if (args.size == 1) {
|
||||||
|
// get all factioning data of player
|
||||||
|
val factionSet = Terrarum.game.player.faction
|
||||||
|
|
||||||
|
if (factionSet == null) {
|
||||||
|
echo.execute("The actor has null faction set.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val count = factionSet.size
|
||||||
|
echo.execute(count.toString() + Lang.pluralise(" faction", count) + " assigned.")
|
||||||
|
|
||||||
|
for (faction in factionSet) {
|
||||||
|
echo.execute("Faction \"" + faction.factionName + "\"")
|
||||||
|
echo.execute(" Amicable")
|
||||||
|
faction.factionAmicable.forEach { s -> echo.execute(PRINT_INDENTATION + s) }
|
||||||
|
|
||||||
|
echo.execute(" Explicit neutral")
|
||||||
|
faction.factionNeutral.forEach { s -> echo.execute(PRINT_INDENTATION + s) }
|
||||||
|
|
||||||
|
echo.execute(" Hostile")
|
||||||
|
faction.factionHostile.forEach { s -> echo.execute(PRINT_INDENTATION + s) }
|
||||||
|
|
||||||
|
echo.execute(" Fearful")
|
||||||
|
faction.factionFearful.forEach { s -> echo.execute(PRINT_INDENTATION + s) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.LangPack.Lang;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-22.
|
|
||||||
*/
|
|
||||||
public class GetLocale implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
new Echo().execute(
|
|
||||||
"Locale: "
|
|
||||||
+ Lang.get("LANGUAGE_THIS")
|
|
||||||
+ " ("
|
|
||||||
+ Lang.get("LANGUAGE_EN")
|
|
||||||
+ ")"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
echo.execute("Usage: getlocale");
|
|
||||||
echo.execute("Get name of locale currently using.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
24
src/com/Torvald/Terrarum/ConsoleCommand/GetLocale.kt
Normal file
24
src/com/Torvald/Terrarum/ConsoleCommand/GetLocale.kt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.LangPack.Lang
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-22.
|
||||||
|
*/
|
||||||
|
class GetLocale : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
Echo().execute(
|
||||||
|
"Locale: "
|
||||||
|
+ Lang.get("LANGUAGE_THIS")
|
||||||
|
+ " ("
|
||||||
|
+ Lang.get("LANGUAGE_EN")
|
||||||
|
+ ")")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
val echo = Echo()
|
||||||
|
echo.execute("Usage: getlocale")
|
||||||
|
echo.execute("Get name of locale currently using.")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
|
|
||||||
import java.io.BufferedWriter;
|
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-02-10.
|
|
||||||
*/
|
|
||||||
public class GsonTest implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
if (args.length == 2) {
|
|
||||||
JsonElement avelem = new Gson().toJsonTree(Terrarum.game.player);
|
|
||||||
|
|
||||||
String jsonString = avelem.toString();
|
|
||||||
|
|
||||||
BufferedWriter bufferedWriter;
|
|
||||||
FileWriter writer;
|
|
||||||
try {
|
|
||||||
writer = new FileWriter(Terrarum.defaultDir + "/Exports/" + args[1] + ".json");
|
|
||||||
bufferedWriter = new BufferedWriter(writer);
|
|
||||||
|
|
||||||
bufferedWriter.write(jsonString);
|
|
||||||
bufferedWriter.close();
|
|
||||||
|
|
||||||
new Echo().execute("GsonTest: exported to " + args[1] + ".json");
|
|
||||||
}
|
|
||||||
catch (IOException e) {
|
|
||||||
new Echo().execute("GsonTest: IOException raised.");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
printUsage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
echo.execute("Usage: gsontest filename-without-extension");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
47
src/com/Torvald/Terrarum/ConsoleCommand/GsonTest.kt
Normal file
47
src/com/Torvald/Terrarum/ConsoleCommand/GsonTest.kt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.google.gson.JsonElement
|
||||||
|
|
||||||
|
import java.io.BufferedWriter
|
||||||
|
import java.io.FileWriter
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-02-10.
|
||||||
|
*/
|
||||||
|
class GsonTest : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
if (args.size == 2) {
|
||||||
|
val avelem = Gson().toJsonTree(Terrarum.game.player)
|
||||||
|
|
||||||
|
val jsonString = avelem.toString()
|
||||||
|
|
||||||
|
val bufferedWriter: BufferedWriter
|
||||||
|
val writer: FileWriter
|
||||||
|
try {
|
||||||
|
writer = FileWriter(Terrarum.defaultDir + "/Exports/" + args[1] + ".json")
|
||||||
|
bufferedWriter = BufferedWriter(writer)
|
||||||
|
|
||||||
|
bufferedWriter.write(jsonString)
|
||||||
|
bufferedWriter.close()
|
||||||
|
|
||||||
|
Echo().execute("GsonTest: exported to " + args[1] + ".json")
|
||||||
|
}
|
||||||
|
catch (e: IOException) {
|
||||||
|
Echo().execute("GsonTest: IOException raised.")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
val echo = Echo()
|
||||||
|
echo.execute("Usage: gsontest filename-without-extension")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,6 @@ class Help : ConsoleCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun printUsage() {
|
override fun printUsage() {
|
||||||
Echo().execute("Prints some utility functions assigned to runction row of the keyboard.")
|
Echo().execute("Prints some utility functions assigned to function row of the keyboard.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-15.
|
|
||||||
*/
|
|
||||||
public class QuitApp implements ConsoleCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
15
src/com/Torvald/Terrarum/ConsoleCommand/QuitApp.kt
Normal file
15
src/com/Torvald/Terrarum/ConsoleCommand/QuitApp.kt
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-15.
|
||||||
|
*/
|
||||||
|
class QuitApp : ConsoleCommand {
|
||||||
|
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
System.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Game;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-15.
|
|
||||||
*/
|
|
||||||
class SetAV implements ConsoleCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
echo.execute("Set actor value of specific target to desired value.");
|
|
||||||
echo.execute("Usage: setav (id) <av> <val>");
|
|
||||||
echo.execute("blank ID for player");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
|
|
||||||
// setav <id or "player"> <av> <val>
|
|
||||||
if (args.length != 4 && args.length != 3) {
|
|
||||||
printUsage();
|
|
||||||
}
|
|
||||||
else if (args.length == 3) {
|
|
||||||
Object val;
|
|
||||||
|
|
||||||
try {
|
|
||||||
val = new Integer(args[2]); // try for integer
|
|
||||||
}
|
|
||||||
catch (NumberFormatException e) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
val = new Float(args[2]); // try for float
|
|
||||||
}
|
|
||||||
catch (NumberFormatException ee) {
|
|
||||||
if (args[2].equalsIgnoreCase("__true")) {
|
|
||||||
val = new Boolean(true);
|
|
||||||
}
|
|
||||||
else if (args[2].equalsIgnoreCase("__false")) {
|
|
||||||
val = new Boolean(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
val = new String(args[2]); // string if not number
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Terrarum.game.player.getActorValue().set(args[1], val);
|
|
||||||
echo.execute("Set " + args[1] + " to " + val);
|
|
||||||
}
|
|
||||||
else if (args.length == 4) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
61
src/com/Torvald/Terrarum/ConsoleCommand/SetAV.kt
Normal file
61
src/com/Torvald/Terrarum/ConsoleCommand/SetAV.kt
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Game
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-15.
|
||||||
|
*/
|
||||||
|
internal class SetAV : ConsoleCommand {
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
val echo = Echo()
|
||||||
|
echo.execute("Set actor value of specific target to desired value.")
|
||||||
|
echo.execute("Usage: setav (id) <av> <val>")
|
||||||
|
echo.execute("blank ID for player")
|
||||||
|
echo.execute("Contaminated (float -> string) actor value will crash the game,")
|
||||||
|
echo.execute(" so make it sure before you issue the command.")
|
||||||
|
echo.execute("Use '__true' and '__false' for boolean value.")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
val echo = Echo()
|
||||||
|
|
||||||
|
// setav <id or "player"> <av> <val>
|
||||||
|
if (args.size != 4 && args.size != 3) {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
else if (args.size == 3) {
|
||||||
|
val `val`: Any
|
||||||
|
|
||||||
|
try {
|
||||||
|
`val` = Integer(args[2]) // try for integer
|
||||||
|
}
|
||||||
|
catch (e: NumberFormatException) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
`val` = args[2].toFloat() // try for float
|
||||||
|
}
|
||||||
|
catch (ee: NumberFormatException) {
|
||||||
|
if (args[2].equals("__true", ignoreCase = true)) {
|
||||||
|
`val` = true
|
||||||
|
}
|
||||||
|
else if (args[2].equals("__false", ignoreCase = true)) {
|
||||||
|
`val` = false
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
`val` = args[2] // string if not number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Terrarum.game.player.getActorValue()[args[1]] = `val`
|
||||||
|
echo.execute("Set " + args[1] + " to " + `val`)
|
||||||
|
}
|
||||||
|
else if (args.size == 4) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.LangPack.Lang;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
import com.Torvald.Terrarum.UserInterface.Notification;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-23.
|
|
||||||
*/
|
|
||||||
public class SetBulletin implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
String[] testMsg = {
|
|
||||||
//Lang.get("ERROR_SAVE_CORRUPTED")
|
|
||||||
//, Lang.get("MENU_LABEL_CONTINUE_QUESTION")
|
|
||||||
"Bulletin test “Hello, world!”",
|
|
||||||
"世界一みんなの人気者 それは彼女のこと アシュリー 달이 차오른다 가자"
|
|
||||||
};
|
|
||||||
send(testMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Actually send notifinator
|
|
||||||
* @param message real message
|
|
||||||
*/
|
|
||||||
public void send(String[] message) {
|
|
||||||
Terrarum.game.sendNotification(message);
|
|
||||||
System.out.println("sent notifinator");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
31
src/com/Torvald/Terrarum/ConsoleCommand/SetBulletin.kt
Normal file
31
src/com/Torvald/Terrarum/ConsoleCommand/SetBulletin.kt
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.LangPack.Lang
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
import com.Torvald.Terrarum.UserInterface.Notification
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-23.
|
||||||
|
*/
|
||||||
|
class SetBulletin : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
val testMsg = arrayOf(
|
||||||
|
Lang["ERROR_SAVE_CORRUPTED"],
|
||||||
|
Lang["MENU_LABEL_CONTINUE_QUESTION"]
|
||||||
|
)
|
||||||
|
send(testMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actually send notifinator
|
||||||
|
* @param message real message
|
||||||
|
*/
|
||||||
|
fun send(message: Array<String>) {
|
||||||
|
Terrarum.game.sendNotification(message)
|
||||||
|
println("sent notifinator")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.ImageFont.GameFontBase;
|
|
||||||
import com.Torvald.Terrarum.LangPack.Lang;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
import org.apache.commons.csv.CSVRecord;
|
|
||||||
import org.newdawn.slick.SlickException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-25.
|
|
||||||
*/
|
|
||||||
public class SetLocale implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
if (args.length == 2) {
|
|
||||||
String prevLocale = Terrarum.Companion.getGameLocale();
|
|
||||||
Terrarum.Companion.setGameLocale(args[1]);
|
|
||||||
try {
|
|
||||||
new Lang();
|
|
||||||
new Echo().execute("Set locale to '" + Terrarum.Companion.getGameLocale() + "'.");
|
|
||||||
}
|
|
||||||
catch (IOException e) {
|
|
||||||
new Echo().execute("could not read lang file.");
|
|
||||||
Terrarum.Companion.setGameLocale(prevLocale);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (args.length == 1) {
|
|
||||||
Echo echo = new Echo();
|
|
||||||
echo.execute("Locales:");
|
|
||||||
|
|
||||||
CSVRecord record = Lang.getRecord("LANGUAGE_ID");
|
|
||||||
record.forEach(field -> echo.execute("] " + field));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
printUsage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
new Echo().execute("Usage: setlocale [locale]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
43
src/com/Torvald/Terrarum/ConsoleCommand/SetLocale.kt
Normal file
43
src/com/Torvald/Terrarum/ConsoleCommand/SetLocale.kt
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.ImageFont.GameFontBase
|
||||||
|
import com.Torvald.Terrarum.LangPack.Lang
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
import org.apache.commons.csv.CSVRecord
|
||||||
|
import org.newdawn.slick.SlickException
|
||||||
|
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-25.
|
||||||
|
*/
|
||||||
|
class SetLocale : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
if (args.size == 2) {
|
||||||
|
val prevLocale = Terrarum.gameLocale
|
||||||
|
Terrarum.gameLocale = args[1]
|
||||||
|
try {
|
||||||
|
Echo().execute("Set locale to '" + Terrarum.gameLocale + "'.")
|
||||||
|
}
|
||||||
|
catch (e: IOException) {
|
||||||
|
Echo().execute("could not read lang file.")
|
||||||
|
Terrarum.gameLocale = prevLocale
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (args.size == 1) {
|
||||||
|
val echo = Echo()
|
||||||
|
echo.execute("Locales:")
|
||||||
|
|
||||||
|
val record = Lang.getRecord("LANGUAGE_ID")
|
||||||
|
record.forEach { field -> echo.execute("] " + field) }
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
Echo().execute("Usage: setlocale [locale]")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Actors.Actor;
|
|
||||||
import com.Torvald.Terrarum.Actors.ActorWithBody;
|
|
||||||
import com.Torvald.Terrarum.Actors.PhysTestBall;
|
|
||||||
import com.Torvald.Terrarum.MapDrawer.MapCamera;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-03-05.
|
|
||||||
*/
|
|
||||||
public class SpawnPhysTestBall implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) throws Exception {
|
|
||||||
if (args.length == 2) {
|
|
||||||
int mouseX = Terrarum.appgc.getInput().getMouseX();
|
|
||||||
int mouseY = Terrarum.appgc.getInput().getMouseY();
|
|
||||||
|
|
||||||
float elasticity = new Float(args[1]);
|
|
||||||
|
|
||||||
ActorWithBody ball = new PhysTestBall();
|
|
||||||
ball.setPosition(mouseX + MapCamera.getCameraX()
|
|
||||||
, mouseY + MapCamera.getCameraY());
|
|
||||||
ball.setElasticity(elasticity);
|
|
||||||
|
|
||||||
Terrarum.game.addActor(ball);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
printUsage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
new Echo().execute("usage: spawnball [elasticity]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
38
src/com/Torvald/Terrarum/ConsoleCommand/SpawnPhysTestBall.kt
Normal file
38
src/com/Torvald/Terrarum/ConsoleCommand/SpawnPhysTestBall.kt
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Actors.Actor
|
||||||
|
import com.Torvald.Terrarum.Actors.ActorWithBody
|
||||||
|
import com.Torvald.Terrarum.Actors.PhysTestBall
|
||||||
|
import com.Torvald.Terrarum.MapDrawer.MapCamera
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-03-05.
|
||||||
|
*/
|
||||||
|
class SpawnPhysTestBall : ConsoleCommand {
|
||||||
|
@Throws(Exception::class)
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
if (args.size == 2) {
|
||||||
|
val mouseX = Terrarum.appgc.input.mouseX
|
||||||
|
val mouseY = Terrarum.appgc.input.mouseY
|
||||||
|
|
||||||
|
val elasticity = args[1].toFloat()
|
||||||
|
|
||||||
|
val ball = PhysTestBall()
|
||||||
|
ball.setPosition(
|
||||||
|
(mouseX + MapCamera.cameraX).toFloat(),
|
||||||
|
(mouseY + MapCamera.cameraY).toFloat()
|
||||||
|
)
|
||||||
|
ball.elasticity = elasticity
|
||||||
|
|
||||||
|
Terrarum.game.addActor(ball)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
Echo().execute("usage: spawnball [elasticity]")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Game;
|
|
||||||
import com.Torvald.Terrarum.MapDrawer.MapDrawer;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-24.
|
|
||||||
*/
|
|
||||||
public class TeleportPlayer implements ConsoleCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
if (args.length != 3) {
|
|
||||||
printUsage();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
int x, y;
|
|
||||||
try {
|
|
||||||
x = new Integer((args[1])) * MapDrawer.getTILE_SIZE() + (MapDrawer.getTILE_SIZE() / 2);
|
|
||||||
y = new Integer((args[2])) * MapDrawer.getTILE_SIZE() + (MapDrawer.getTILE_SIZE() / 2);
|
|
||||||
}
|
|
||||||
catch (NumberFormatException e) {
|
|
||||||
new Echo().execute("Wrong number input.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Terrarum.game.player.setPosition(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
new Echo().execute("Usage: teleport [x-tile] [y-tile]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
36
src/com/Torvald/Terrarum/ConsoleCommand/TeleportPlayer.kt
Normal file
36
src/com/Torvald/Terrarum/ConsoleCommand/TeleportPlayer.kt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Game
|
||||||
|
import com.Torvald.Terrarum.MapDrawer.MapDrawer
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-24.
|
||||||
|
*/
|
||||||
|
class TeleportPlayer : ConsoleCommand {
|
||||||
|
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
if (args.size != 3) {
|
||||||
|
printUsage()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
val x: Int
|
||||||
|
val y: Int
|
||||||
|
try {
|
||||||
|
x = args[1].toInt() * MapDrawer.TILE_SIZE + MapDrawer.TILE_SIZE / 2
|
||||||
|
y = args[2].toInt() * MapDrawer.TILE_SIZE + MapDrawer.TILE_SIZE / 2
|
||||||
|
}
|
||||||
|
catch (e: NumberFormatException) {
|
||||||
|
Echo().execute("Wrong number input.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Terrarum.game.player.setPosition(x.toFloat(), y.toFloat())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
Echo().execute("Usage: teleport [x-tile] [y-tile]")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.ConsoleCommand;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Game;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-19.
|
|
||||||
*/
|
|
||||||
public class ToggleNoClip implements ConsoleCommand {
|
|
||||||
@Override
|
|
||||||
public void execute(String[] args) {
|
|
||||||
boolean status = Terrarum.game.player.isNoClip();
|
|
||||||
|
|
||||||
Terrarum.game.player.setNoClip(!status);
|
|
||||||
new Echo().execute("Set no-clip status to " + String.valueOf(!status));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void printUsage() {
|
|
||||||
new Echo().execute("toggle no-clip status of player");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
20
src/com/Torvald/Terrarum/ConsoleCommand/ToggleNoClip.kt
Normal file
20
src/com/Torvald/Terrarum/ConsoleCommand/ToggleNoClip.kt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package com.Torvald.Terrarum.ConsoleCommand
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Game
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-19.
|
||||||
|
*/
|
||||||
|
class ToggleNoClip : ConsoleCommand {
|
||||||
|
override fun execute(args: Array<String>) {
|
||||||
|
val status = Terrarum.game.player.isNoClip()
|
||||||
|
|
||||||
|
Terrarum.game.player.setNoClip(!status)
|
||||||
|
Echo().execute("Set no-clip status to " + (!status).toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printUsage() {
|
||||||
|
Echo().execute("toggle no-clip status of player")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,403 +0,0 @@
|
|||||||
package com.Torvald.Terrarum;
|
|
||||||
|
|
||||||
import com.Torvald.Rand.HQRNG;
|
|
||||||
import com.Torvald.Terrarum.Actors.*;
|
|
||||||
import com.Torvald.Terrarum.ConsoleCommand.Authenticator;
|
|
||||||
import com.Torvald.Terrarum.ConsoleCommand.CommandDict;
|
|
||||||
import com.Torvald.Terrarum.GameControl.GameController;
|
|
||||||
import com.Torvald.Terrarum.GameControl.KeyMap;
|
|
||||||
import com.Torvald.Terrarum.GameMap.GameMap;
|
|
||||||
import com.Torvald.Terrarum.GameMap.WorldTime;
|
|
||||||
import com.Torvald.Terrarum.MapDrawer.LightmapRenderer;
|
|
||||||
import com.Torvald.Terrarum.MapDrawer.MapCamera;
|
|
||||||
import com.Torvald.Terrarum.MapDrawer.MapDrawer;
|
|
||||||
import com.Torvald.Terrarum.MapGenerator.MapGenerator;
|
|
||||||
import com.Torvald.Terrarum.MapGenerator.RoguelikeRandomiser;
|
|
||||||
import com.Torvald.Terrarum.TileProperties.TilePropCodex;
|
|
||||||
import com.Torvald.Terrarum.TileStat.TileStat;
|
|
||||||
import com.Torvald.Terrarum.UserInterface.*;
|
|
||||||
import com.jme3.math.FastMath;
|
|
||||||
import org.lwjgl.opengl.ARBShaderObjects;
|
|
||||||
import org.lwjgl.opengl.GL11;
|
|
||||||
import org.newdawn.slick.*;
|
|
||||||
import org.newdawn.slick.Graphics;
|
|
||||||
import org.newdawn.slick.fills.GradientFill;
|
|
||||||
import org.newdawn.slick.geom.Rectangle;
|
|
||||||
import org.newdawn.slick.state.BasicGameState;
|
|
||||||
import org.newdawn.slick.state.StateBasedGame;
|
|
||||||
import shader.Shader;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.lang.management.ManagementFactory;
|
|
||||||
import java.util.HashSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 15-12-30.
|
|
||||||
*/
|
|
||||||
public class Game extends BasicGameState {
|
|
||||||
|
|
||||||
public static long memInUse;
|
|
||||||
public static long totalVMMem;
|
|
||||||
int game_mode = 0;
|
|
||||||
|
|
||||||
public GameMap map;
|
|
||||||
|
|
||||||
public HashSet<Actor> actorContainer = new HashSet<>();
|
|
||||||
public HashSet<UIHandler> uiContainer = new HashSet<>();
|
|
||||||
|
|
||||||
public UIHandler consoleHandler;
|
|
||||||
public UIHandler debugWindow;
|
|
||||||
public UIHandler notifinator;
|
|
||||||
|
|
||||||
Player player;
|
|
||||||
|
|
||||||
private Image GRADIENT_IMAGE;
|
|
||||||
private Rectangle skyBox;
|
|
||||||
|
|
||||||
public float screenZoom = 1.0f;
|
|
||||||
public final float ZOOM_MAX = 2.0f;
|
|
||||||
public final float ZOOM_MIN = 0.25f;
|
|
||||||
|
|
||||||
private Shader shader12BitCol;
|
|
||||||
private Shader shaderBlurH;
|
|
||||||
private Shader shaderBlurV;
|
|
||||||
|
|
||||||
public static Authenticator auth = new Authenticator();
|
|
||||||
|
|
||||||
public Game() throws SlickException { }
|
|
||||||
|
|
||||||
|
|
||||||
private boolean useShader;
|
|
||||||
private int shaderProgram = 0;
|
|
||||||
|
|
||||||
|
|
||||||
private final int ENV_COLTEMP_SUNRISE = 2500;
|
|
||||||
private final int ENV_SUNLIGHT_DELTA = MapDrawer.getENV_COLTEMP_NOON() - ENV_COLTEMP_SUNRISE;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(GameContainer gameContainer, StateBasedGame stateBasedGame) throws
|
|
||||||
SlickException {
|
|
||||||
new GameController();
|
|
||||||
KeyMap.build();
|
|
||||||
GameController.setKeyMap(new KeyMap());
|
|
||||||
|
|
||||||
|
|
||||||
shader12BitCol = Shader.makeShader("./res/4096.vrt", "./res/4096.frg");
|
|
||||||
shaderBlurH = Shader.makeShader("./res/blurH.vrt", "./res/blur.frg");
|
|
||||||
shaderBlurV = Shader.makeShader("./res/blurV.vrt", "./res/blur.frg");
|
|
||||||
|
|
||||||
|
|
||||||
GRADIENT_IMAGE = new Image("res/graphics/sky_colour.png");
|
|
||||||
skyBox = new Rectangle(0, 0, Terrarum.WIDTH, Terrarum.HEIGHT);
|
|
||||||
|
|
||||||
new WorldTime();
|
|
||||||
new TilePropCodex();
|
|
||||||
// new ItemPropCodex() -- This is kotlin object and already initialised.
|
|
||||||
|
|
||||||
map = new GameMap(8192, 2048);
|
|
||||||
map.setGravitation(9.8f);
|
|
||||||
|
|
||||||
MapGenerator.attachMap(map);
|
|
||||||
MapGenerator.setSeed(0x51621D2);
|
|
||||||
//MapGenerator.setSeed(new HQRNG().nextLong());
|
|
||||||
MapGenerator.generateMap();
|
|
||||||
|
|
||||||
RoguelikeRandomiser.setSeed(0x540198);
|
|
||||||
//RoguelikeRandomiser.setSeed(new HQRNG().nextLong());
|
|
||||||
|
|
||||||
|
|
||||||
new CommandDict();
|
|
||||||
|
|
||||||
// add new player and put it to actorContainer
|
|
||||||
//player = new Player();
|
|
||||||
player = PFSigrid.build();
|
|
||||||
//player.setNoClip(true);
|
|
||||||
actorContainer.add(player);
|
|
||||||
|
|
||||||
consoleHandler = new UIHandler(new ConsoleWindow());
|
|
||||||
consoleHandler.setPosition(0, 0);
|
|
||||||
|
|
||||||
debugWindow = new UIHandler(new BasicDebugInfoWindow());
|
|
||||||
debugWindow.setPosition(0, 0);
|
|
||||||
|
|
||||||
notifinator = new UIHandler(new Notification());
|
|
||||||
notifinator.setPosition(
|
|
||||||
(Terrarum.WIDTH - notifinator.getUI().getWidth())
|
|
||||||
/ 2
|
|
||||||
, Terrarum.HEIGHT - notifinator.getUI().getHeight()
|
|
||||||
);
|
|
||||||
notifinator.setVisibility(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Player getPlayer() {
|
|
||||||
return player;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(GameContainer gc, StateBasedGame sbg, int delta_t) {
|
|
||||||
setAppTitle();
|
|
||||||
|
|
||||||
// GL at after_sunrise-noon_before_sunset
|
|
||||||
//map.setGlobalLight();
|
|
||||||
|
|
||||||
GameController.processInput(gc.getInput());
|
|
||||||
|
|
||||||
TileStat.update();
|
|
||||||
|
|
||||||
MapDrawer.update(gc, delta_t);
|
|
||||||
MapCamera.update(gc, delta_t);
|
|
||||||
|
|
||||||
actorContainer.forEach(actor -> actor.update(gc, delta_t));
|
|
||||||
actorContainer.forEach(
|
|
||||||
actor -> {
|
|
||||||
if (actor instanceof Visible) {
|
|
||||||
((Visible) actor).updateBodySprite(gc, delta_t);
|
|
||||||
}
|
|
||||||
if (actor instanceof Glowing) {
|
|
||||||
((Glowing) actor).updateGlowSprite(gc, delta_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
uiContainer.forEach(ui -> ui.update(gc, delta_t));
|
|
||||||
|
|
||||||
notifinator.update(gc, delta_t);
|
|
||||||
|
|
||||||
Terrarum.appgc.setVSync(Terrarum.appgc.getFPS() >= Terrarum.VSYNC_TRIGGER_THRESHOLD);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setAppTitle() {
|
|
||||||
Runtime runtime = Runtime.getRuntime();
|
|
||||||
memInUse = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() >> 20;
|
|
||||||
totalVMMem = runtime.maxMemory() >> 20;
|
|
||||||
|
|
||||||
Terrarum.appgc.setTitle(
|
|
||||||
"Simple Slick Game — FPS: "
|
|
||||||
+ Terrarum.appgc.getFPS() + " ("
|
|
||||||
+ String.valueOf(Terrarum.TARGET_INTERNAL_FPS)
|
|
||||||
+ ") — "
|
|
||||||
+ String.valueOf(memInUse) + "M / "
|
|
||||||
+ String.valueOf(totalVMMem) + "M"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) {
|
|
||||||
|
|
||||||
drawSkybox(g);
|
|
||||||
|
|
||||||
// compensate for zoom. UIs have to be treated specially! (see UIHandler)
|
|
||||||
g.translate(
|
|
||||||
-MapCamera.getCameraX() * screenZoom
|
|
||||||
, -MapCamera.getCameraY() * screenZoom
|
|
||||||
);
|
|
||||||
|
|
||||||
MapCamera.renderBehind(gc, g);
|
|
||||||
|
|
||||||
actorContainer.forEach(
|
|
||||||
actor -> { if (actor instanceof Visible) ((Visible) actor).drawBody(gc, g); }
|
|
||||||
);
|
|
||||||
actorContainer.forEach(
|
|
||||||
actor -> { if (actor instanceof Glowing) ((Glowing) actor).drawGlow(gc, g); }
|
|
||||||
);
|
|
||||||
|
|
||||||
LightmapRenderer.renderLightMap();
|
|
||||||
|
|
||||||
MapCamera.renderFront(gc, g);
|
|
||||||
MapDrawer.render(gc, g);
|
|
||||||
|
|
||||||
setBlendModeMul();
|
|
||||||
MapDrawer.drawEnvOverlay(g);
|
|
||||||
LightmapRenderer.draw(g);
|
|
||||||
setBlendModeNormal();
|
|
||||||
|
|
||||||
uiContainer.forEach(ui -> ui.render(gc, g));
|
|
||||||
debugWindow.render(gc, g);
|
|
||||||
consoleHandler.render(gc, g);
|
|
||||||
notifinator.render(gc, g);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean addActor(Actor e) {
|
|
||||||
return actorContainer.add(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean removeActor(Actor e) {
|
|
||||||
return actorContainer.remove(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Color[] getGradientColour(int timeSec) {
|
|
||||||
Color[] colourTable = new Color[2];
|
|
||||||
|
|
||||||
int gradMapWidth = GRADIENT_IMAGE.getWidth();
|
|
||||||
int phase = Math.round((timeSec / WorldTime.DAY_LENGTH) * gradMapWidth);
|
|
||||||
|
|
||||||
//update in every INTERNAL_FRAME frames
|
|
||||||
colourTable[0] = GRADIENT_IMAGE.getColor(phase, 0);
|
|
||||||
colourTable[1] = GRADIENT_IMAGE.getColor(phase, 1);
|
|
||||||
|
|
||||||
return colourTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void keyPressed(int key, char c) {
|
|
||||||
GameController.keyPressed(key, c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void keyReleased(int key, char c) {
|
|
||||||
GameController.keyReleased(key, c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseMoved(int oldx, int oldy, int newx, int newy) {
|
|
||||||
GameController.mouseMoved(oldx, oldy, newx, newy);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseDragged(int oldx, int oldy, int newx, int newy) {
|
|
||||||
GameController.mouseDragged(oldx, oldy, newx, newy);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mousePressed(int button, int x, int y) {
|
|
||||||
GameController.mousePressed(button, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseReleased(int button, int x, int y) {
|
|
||||||
GameController.mouseReleased(button, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mouseWheelMoved(int change) {
|
|
||||||
GameController.mouseWheelMoved(change);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void controllerButtonPressed(int controller, int button) {
|
|
||||||
GameController.controllerButtonPressed(controller, button);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void controllerButtonReleased(int controller, int button) {
|
|
||||||
GameController.controllerButtonReleased(controller, button);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getID() {
|
|
||||||
return Terrarum.SCENE_ID_GAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawSkybox(Graphics g) {
|
|
||||||
Color[] colourTable = getGradientColour(Terrarum.game.map.getWorldTime().elapsedSeconds());
|
|
||||||
GradientFill skyColourFill = new GradientFill(0, 0, colourTable[0], 0, Terrarum.HEIGHT, colourTable[1]);
|
|
||||||
g.fill(skyBox, skyColourFill);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setBlendModeMul() {
|
|
||||||
GL11.glEnable(GL11.GL_BLEND);
|
|
||||||
GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setBlendModeNormal() {
|
|
||||||
GL11.glDisable(GL11.GL_BLEND);
|
|
||||||
Terrarum.appgc.getGraphics().setDrawMode(Graphics.MODE_NORMAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendNotification(String[] msg) {
|
|
||||||
((Notification) notifinator.getUI()).sendNotification(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int createShader(String filename, int shaderType) throws Exception {
|
|
||||||
int shader = 0;
|
|
||||||
try {
|
|
||||||
shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType);
|
|
||||||
|
|
||||||
if(shader == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ARBShaderObjects.glShaderSourceARB(shader, readFileAsString(filename));
|
|
||||||
ARBShaderObjects.glCompileShaderARB(shader);
|
|
||||||
|
|
||||||
if (ARBShaderObjects.glGetObjectParameteriARB(shader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB) == GL11.GL_FALSE)
|
|
||||||
throw new RuntimeException("Error creating shader: " + getLogInfo(shader));
|
|
||||||
|
|
||||||
return shader;
|
|
||||||
}
|
|
||||||
catch(Exception exc) {
|
|
||||||
ARBShaderObjects.glDeleteObjectARB(shader);
|
|
||||||
throw exc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getLogInfo(int obj) {
|
|
||||||
return ARBShaderObjects.glGetInfoLogARB(obj, ARBShaderObjects.glGetObjectParameteriARB(obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String readFileAsString(String filename) throws Exception {
|
|
||||||
StringBuilder source = new StringBuilder();
|
|
||||||
|
|
||||||
FileInputStream in = new FileInputStream(filename);
|
|
||||||
|
|
||||||
Exception exception = null;
|
|
||||||
|
|
||||||
BufferedReader reader;
|
|
||||||
try{
|
|
||||||
reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
|
|
||||||
|
|
||||||
Exception innerExc= null;
|
|
||||||
try {
|
|
||||||
String line;
|
|
||||||
while((line = reader.readLine()) != null)
|
|
||||||
source.append(line).append('\n');
|
|
||||||
}
|
|
||||||
catch(Exception exc) {
|
|
||||||
exception = exc;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
try {
|
|
||||||
reader.close();
|
|
||||||
}
|
|
||||||
catch(Exception exc) {
|
|
||||||
if(innerExc == null)
|
|
||||||
innerExc = exc;
|
|
||||||
else
|
|
||||||
exc.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(innerExc != null)
|
|
||||||
throw innerExc;
|
|
||||||
}
|
|
||||||
catch(Exception exc) {
|
|
||||||
exception = exc;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
try {
|
|
||||||
in.close();
|
|
||||||
}
|
|
||||||
catch(Exception exc) {
|
|
||||||
if(exception == null)
|
|
||||||
exception = exc;
|
|
||||||
else
|
|
||||||
exc.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(exception != null)
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
|
|
||||||
return source.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getMemInUse() {
|
|
||||||
return memInUse;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTotalVMMem() {
|
|
||||||
return totalVMMem;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getSunlightColtemp() {
|
|
||||||
int half_today = WorldTime.DAY_LENGTH / 2;
|
|
||||||
int timeToday = WorldTime.elapsedSeconds();
|
|
||||||
float sunAlt = (timeToday < half_today) ?
|
|
||||||
timeToday / half_today * FastMath.PI
|
|
||||||
: 0f;
|
|
||||||
return Math.round(ENV_COLTEMP_SUNRISE + (ENV_SUNLIGHT_DELTA * FastMath.sin(sunAlt)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -185,7 +185,7 @@ constructor() : BasicGameState() {
|
|||||||
|
|
||||||
// compensate for zoom. UIs have to be treated specially! (see UIHandler)
|
// compensate for zoom. UIs have to be treated specially! (see UIHandler)
|
||||||
g.translate(
|
g.translate(
|
||||||
-MapCamera.getCameraX() * screenZoom, -MapCamera.getCameraY() * screenZoom)
|
-MapCamera.cameraX * screenZoom, -MapCamera.cameraY * screenZoom)
|
||||||
|
|
||||||
MapCamera.renderBehind(gc, g)
|
MapCamera.renderBehind(gc, g)
|
||||||
|
|
||||||
@@ -305,7 +305,5 @@ constructor() : BasicGameState() {
|
|||||||
/**
|
/**
|
||||||
* extension function for org.newdawn.slick.Color
|
* extension function for org.newdawn.slick.Color
|
||||||
*/
|
*/
|
||||||
fun Color.getRGB24(): Int = (this.redByte shl 16) or
|
fun Color.getRGB24(): Int = (this.redByte shl 16) or (this.greenByte shl 8) or (this.blueByte)
|
||||||
(this.greenByte shl 8) or
|
|
||||||
(this.blueByte)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import org.newdawn.slick.Input
|
|||||||
object GameController {
|
object GameController {
|
||||||
|
|
||||||
fun processInput(input: Input) {
|
fun processInput(input: Input) {
|
||||||
val mouseTileX = ((MapCamera.getCameraX() + input.mouseX / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt()
|
val mouseTileX = ((MapCamera.cameraX + input.mouseX / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt()
|
||||||
val mouseTileY = ((MapCamera.getCameraY() + input.mouseY / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt()
|
val mouseTileY = ((MapCamera.cameraY + input.mouseY / Terrarum.game.screenZoom) / MapDrawer.TILE_SIZE).toInt()
|
||||||
|
|
||||||
|
|
||||||
KeyToggler.update(input)
|
KeyToggler.update(input)
|
||||||
|
|||||||
@@ -1,247 +0,0 @@
|
|||||||
/*
|
|
||||||
* MapLoader version 1.2
|
|
||||||
* Release date 2013-05-20
|
|
||||||
* Copyright 2013 SKYHi14
|
|
||||||
*
|
|
||||||
* The program is distributed in GNU GPL Licence version 3.
|
|
||||||
* See http://www.gnu.org/licenses/gpl.html for information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.Torvald.Terrarum.GameMap;
|
|
||||||
|
|
||||||
import org.newdawn.slick.SlickException;
|
|
||||||
|
|
||||||
public class GameMap {
|
|
||||||
|
|
||||||
//layers
|
|
||||||
private volatile MapLayer layerWall;
|
|
||||||
private volatile MapLayer layerTerrain;
|
|
||||||
private volatile MapLayer layerWire;
|
|
||||||
private volatile PairedMapLayer wallDamage;
|
|
||||||
private volatile PairedMapLayer terrainDamage;
|
|
||||||
|
|
||||||
//properties
|
|
||||||
private int width;
|
|
||||||
private int height;
|
|
||||||
private int spawnX;
|
|
||||||
private int spawnY;
|
|
||||||
|
|
||||||
public static transient final int WALL = 0;
|
|
||||||
public static transient final int TERRAIN = 1;
|
|
||||||
public static transient final int WIRE = 2;
|
|
||||||
|
|
||||||
//public World physWorld = new World( new Vec2(0, -TerrarumMain.game.gravitationalAccel) );
|
|
||||||
//physics
|
|
||||||
private float gravitation;
|
|
||||||
private int globalLight;
|
|
||||||
private WorldTime worldTime;
|
|
||||||
|
|
||||||
public static transient final int TILES_SUPPORTED = MapLayer.RANGE * PairedMapLayer.RANGE;
|
|
||||||
public static transient final byte BITS = 1; // 1 for Byte, 2 for Char, 4 for Int, 8 for Long
|
|
||||||
public static transient final byte LAYERS = 4; // terrain, wall (terrainDamage + wallDamage), wire
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param width
|
|
||||||
* @param height
|
|
||||||
* @throws SlickException
|
|
||||||
*/
|
|
||||||
public GameMap(int width, int height) throws SlickException {
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
this.spawnX = width / 2;
|
|
||||||
this.spawnY = 200;
|
|
||||||
|
|
||||||
layerTerrain = new MapLayer(width, height);
|
|
||||||
layerWall = new MapLayer(width, height);
|
|
||||||
layerWire = new MapLayer(width, height);
|
|
||||||
terrainDamage = new PairedMapLayer(width, height);
|
|
||||||
wallDamage = new PairedMapLayer(width, height);
|
|
||||||
|
|
||||||
globalLight = (char) 0;
|
|
||||||
worldTime = new WorldTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGravitation(float g) {
|
|
||||||
gravitation = g;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get 2d array data of terrain
|
|
||||||
*
|
|
||||||
* @return byte[][] terrain layer
|
|
||||||
*/
|
|
||||||
public byte[][] getTerrainArray() {
|
|
||||||
return layerTerrain.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get 2d array data of wall
|
|
||||||
*
|
|
||||||
* @return byte[][] wall layer
|
|
||||||
*/
|
|
||||||
public byte[][] getWallArray() {
|
|
||||||
return layerWall.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get 2d array data of wire
|
|
||||||
*
|
|
||||||
* @return byte[][] wire layer
|
|
||||||
*/
|
|
||||||
public byte[][] getWireArray() {
|
|
||||||
return layerWire.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get paired array data of damage codes.
|
|
||||||
* Format: 0baaaabbbb, aaaa for x = 0, 2, 4, ..., bbbb for x = 1, 3, 5, ...
|
|
||||||
* @return byte[][] damage code pair
|
|
||||||
*/
|
|
||||||
public byte[][] getDamageDataArray() {
|
|
||||||
return terrainDamage.dataPair;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get MapLayer object of terrain
|
|
||||||
*
|
|
||||||
* @return MapLayer terrain layer
|
|
||||||
*/
|
|
||||||
public MapLayer getLayerTerrain() {
|
|
||||||
return layerTerrain;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MapLayer getLayerWall() {
|
|
||||||
return layerWall;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MapLayer getLayerWire() {
|
|
||||||
return layerWire;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PairedMapLayer getTerrainDamage() {
|
|
||||||
return terrainDamage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PairedMapLayer getWallDamage() {
|
|
||||||
return wallDamage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTileFromWall(int x, int y) {
|
|
||||||
return layerWall.getTile(x, y) * PairedMapLayer.RANGE + getWallDamage(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTileFromTerrain(int x, int y) {
|
|
||||||
return layerTerrain.getTile(x, y) * PairedMapLayer.RANGE + getTerrainDamage(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTileFromWire(int x, int y) {
|
|
||||||
return layerWire.getTile(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWallDamage(int x, int y) {
|
|
||||||
return wallDamage.getData(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTerrainDamage(int x, int y) {
|
|
||||||
return terrainDamage.getData(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the tile of wall as specified, with damage value of zero.
|
|
||||||
* @param x
|
|
||||||
* @param y
|
|
||||||
* @param combinedTilenum (tilenum * 16) + damage
|
|
||||||
*/
|
|
||||||
public void setTileWall(int x, int y, int combinedTilenum) {
|
|
||||||
setTileWall(x, y
|
|
||||||
, (byte) (combinedTilenum / PairedMapLayer.RANGE)
|
|
||||||
, combinedTilenum % PairedMapLayer.RANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the tile of wall as specified, with damage value of zero.
|
|
||||||
* @param x
|
|
||||||
* @param y
|
|
||||||
* @param combinedTilenum (tilenum * 16) + damage
|
|
||||||
*/
|
|
||||||
public void setTileTerrain(int x, int y, int combinedTilenum) {
|
|
||||||
setTileTerrain(x, y
|
|
||||||
, (byte) (combinedTilenum / PairedMapLayer.RANGE)
|
|
||||||
, combinedTilenum % PairedMapLayer.RANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTileWall(int x, int y, byte tile, int damage) {
|
|
||||||
layerWall.setTile(x, y, tile);
|
|
||||||
wallDamage.setData(x, y, damage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTileTerrain(int x, int y, byte tile, int damage) {
|
|
||||||
layerTerrain.setTile(x, y, tile);
|
|
||||||
terrainDamage.setData(x, y, damage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTileWire(int x, int y, byte tile) {
|
|
||||||
layerWire.data[y][x] = tile;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTileFrom(int mode, int x, int y) {
|
|
||||||
if (mode == TERRAIN) { return getTileFromTerrain(x, y); }
|
|
||||||
else if (mode == WALL) { return getTileFromWall(x, y); }
|
|
||||||
else if (mode == WIRE) { return getTileFromWire(x, y); }
|
|
||||||
else throw new IllegalArgumentException("illegal mode input: " + String.valueOf(mode));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void overwriteLayerWall(MapLayer layerData) {
|
|
||||||
layerWall = layerData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void overwriteLayerTerrain(MapLayer layerData) {
|
|
||||||
layerTerrain = layerData;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int uint8ToInt32(byte x) {
|
|
||||||
int ret;
|
|
||||||
if ((x & 0b1000_0000) != 0) {
|
|
||||||
ret = x & 0b1111_1111;
|
|
||||||
} else {
|
|
||||||
ret = x;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getGravitation() {
|
|
||||||
return gravitation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getGlobalLight() {
|
|
||||||
return globalLight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGlobalLight(int globalLight) {
|
|
||||||
this.globalLight = globalLight;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldTime getWorldTime() {
|
|
||||||
return worldTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateWorldTime(int delta) {
|
|
||||||
worldTime.update(delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWidth() {
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHeight() {
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSpawnX() {
|
|
||||||
return spawnX;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSpawnY() {
|
|
||||||
return spawnY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
178
src/com/Torvald/Terrarum/GameMap/GameMap.kt
Normal file
178
src/com/Torvald/Terrarum/GameMap/GameMap.kt
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
* MapLoader version 1.2
|
||||||
|
* Release date 2013-05-20
|
||||||
|
* Copyright 2013 SKYHi14
|
||||||
|
*
|
||||||
|
* The program is distributed in GNU GPL Licence version 3.
|
||||||
|
* See http://www.gnu.org/licenses/gpl.html for information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.Torvald.Terrarum.GameMap
|
||||||
|
|
||||||
|
import org.newdawn.slick.SlickException
|
||||||
|
|
||||||
|
class GameMap
|
||||||
|
/**
|
||||||
|
* @param width
|
||||||
|
* *
|
||||||
|
* @param height
|
||||||
|
* *
|
||||||
|
* @throws SlickException
|
||||||
|
*/
|
||||||
|
@Throws(SlickException::class)
|
||||||
|
constructor(//properties
|
||||||
|
val width: Int, val height: Int) {
|
||||||
|
|
||||||
|
//layers
|
||||||
|
val layerWall: MapLayer
|
||||||
|
/**
|
||||||
|
* Get MapLayer object of terrain
|
||||||
|
|
||||||
|
* @return MapLayer terrain layer
|
||||||
|
*/
|
||||||
|
val layerTerrain: MapLayer
|
||||||
|
val layerWire: MapLayer
|
||||||
|
val wallDamage: PairedMapLayer
|
||||||
|
val terrainDamage: PairedMapLayer
|
||||||
|
val spawnX: Int
|
||||||
|
val spawnY: Int
|
||||||
|
|
||||||
|
//public World physWorld = new World( new Vec2(0, -TerrarumMain.game.gravitationalAccel) );
|
||||||
|
//physics
|
||||||
|
var gravitation: Float = 0.toFloat()
|
||||||
|
var globalLight: Int = 0
|
||||||
|
val worldTime: WorldTime
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.spawnX = width / 2
|
||||||
|
this.spawnY = 200
|
||||||
|
|
||||||
|
layerTerrain = MapLayer(width, height)
|
||||||
|
layerWall = MapLayer(width, height)
|
||||||
|
layerWire = MapLayer(width, height)
|
||||||
|
terrainDamage = PairedMapLayer(width, height)
|
||||||
|
wallDamage = PairedMapLayer(width, height)
|
||||||
|
|
||||||
|
globalLight = 0.toChar().toInt()
|
||||||
|
worldTime = WorldTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get 2d array data of terrain
|
||||||
|
|
||||||
|
* @return byte[][] terrain layer
|
||||||
|
*/
|
||||||
|
val terrainArray: Array<ByteArray>
|
||||||
|
get() = layerTerrain.data
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get 2d array data of wall
|
||||||
|
|
||||||
|
* @return byte[][] wall layer
|
||||||
|
*/
|
||||||
|
val wallArray: Array<ByteArray>
|
||||||
|
get() = layerWall.data
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get 2d array data of wire
|
||||||
|
|
||||||
|
* @return byte[][] wire layer
|
||||||
|
*/
|
||||||
|
val wireArray: Array<ByteArray>
|
||||||
|
get() = layerWire.data
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get paired array data of damage codes.
|
||||||
|
* Format: 0baaaabbbb, aaaa for x = 0, 2, 4, ..., bbbb for x = 1, 3, 5, ...
|
||||||
|
* @return byte[][] damage code pair
|
||||||
|
*/
|
||||||
|
val damageDataArray: Array<ByteArray>
|
||||||
|
get() = terrainDamage.dataPair
|
||||||
|
|
||||||
|
fun getTileFromWall(x: Int, y: Int): Int {
|
||||||
|
return layerWall.getTile(x, y) * PairedMapLayer.RANGE + getWallDamage(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getTileFromTerrain(x: Int, y: Int): Int {
|
||||||
|
return layerTerrain.getTile(x, y) * PairedMapLayer.RANGE + getTerrainDamage(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getTileFromWire(x: Int, y: Int): Int {
|
||||||
|
return layerWire.getTile(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getWallDamage(x: Int, y: Int): Int {
|
||||||
|
return wallDamage.getData(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getTerrainDamage(x: Int, y: Int): Int {
|
||||||
|
return terrainDamage.getData(x, y)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the tile of wall as specified, with damage value of zero.
|
||||||
|
* @param x
|
||||||
|
* *
|
||||||
|
* @param y
|
||||||
|
* *
|
||||||
|
* @param combinedTilenum (tilenum * 16) + damage
|
||||||
|
*/
|
||||||
|
fun setTileWall(x: Int, y: Int, combinedTilenum: Int) {
|
||||||
|
setTileWall(x, y, (combinedTilenum / PairedMapLayer.RANGE).toByte(), combinedTilenum % PairedMapLayer.RANGE)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the tile of wall as specified, with damage value of zero.
|
||||||
|
* @param x
|
||||||
|
* *
|
||||||
|
* @param y
|
||||||
|
* *
|
||||||
|
* @param combinedTilenum (tilenum * 16) + damage
|
||||||
|
*/
|
||||||
|
fun setTileTerrain(x: Int, y: Int, combinedTilenum: Int) {
|
||||||
|
setTileTerrain(x, y, (combinedTilenum / PairedMapLayer.RANGE).toByte(), combinedTilenum % PairedMapLayer.RANGE)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setTileWall(x: Int, y: Int, tile: Byte, damage: Int) {
|
||||||
|
layerWall.setTile(x, y, tile)
|
||||||
|
wallDamage.setData(x, y, damage)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setTileTerrain(x: Int, y: Int, tile: Byte, damage: Int) {
|
||||||
|
layerTerrain.setTile(x, y, tile)
|
||||||
|
terrainDamage.setData(x, y, damage)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setTileWire(x: Int, y: Int, tile: Byte) {
|
||||||
|
layerWire.data[y][x] = tile
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getTileFrom(mode: Int, x: Int, y: Int): Int {
|
||||||
|
if (mode == TERRAIN) {
|
||||||
|
return getTileFromTerrain(x, y)
|
||||||
|
}
|
||||||
|
else if (mode == WALL) {
|
||||||
|
return getTileFromWall(x, y)
|
||||||
|
}
|
||||||
|
else if (mode == WIRE) {
|
||||||
|
return getTileFromWire(x, y)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw IllegalArgumentException("illegal mode input: " + mode.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateWorldTime(delta: Int) {
|
||||||
|
worldTime.update(delta)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
@Transient val WALL = 0
|
||||||
|
@Transient val TERRAIN = 1
|
||||||
|
@Transient val WIRE = 2
|
||||||
|
|
||||||
|
@Transient val TILES_SUPPORTED = MapLayer.RANGE * PairedMapLayer.RANGE
|
||||||
|
@Transient val BITS: Byte = 1 // 1 for Byte, 2 for Char, 4 for Int, 8 for Long
|
||||||
|
@Transient val LAYERS: Byte = 4 // terrain, wall (terrainDamage + wallDamage), wire
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.GameMap;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Spliterator;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-17.
|
|
||||||
*/
|
|
||||||
public class MapLayer implements Iterable<Byte> {
|
|
||||||
|
|
||||||
byte[][] data;
|
|
||||||
|
|
||||||
public int width;
|
|
||||||
public int height;
|
|
||||||
|
|
||||||
public static transient final int RANGE = 256;
|
|
||||||
|
|
||||||
public MapLayer(int width, int height) {
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
|
|
||||||
data = new byte[height][width];
|
|
||||||
|
|
||||||
for (int i = 0; i < height; i++) {
|
|
||||||
for (int j = 0; j < width; j++) {
|
|
||||||
data[i][j] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an iterator over elements of type {@code T}.
|
|
||||||
*
|
|
||||||
* @return an Iterator.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Iterator<Byte> iterator() {
|
|
||||||
return new Iterator<Byte>() {
|
|
||||||
|
|
||||||
private int iteratorCount = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasNext() {
|
|
||||||
return iteratorCount < width * height;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Byte next() {
|
|
||||||
int y = iteratorCount / width;
|
|
||||||
int x = iteratorCount % width;
|
|
||||||
// advance counter
|
|
||||||
iteratorCount += 1;
|
|
||||||
|
|
||||||
return data[y][x];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs the given action for each element of the {@code Iterable}
|
|
||||||
* until all elements have been processed or the action throws an
|
|
||||||
* exception. Unless otherwise specified by the implementing class,
|
|
||||||
* actions are performed in the order of iteration (if an iteration order
|
|
||||||
* is specified). Exceptions thrown by the action are relayed to the
|
|
||||||
* caller.
|
|
||||||
*
|
|
||||||
* @param action The action to be performed for each element
|
|
||||||
* @throws NullPointerException if the specified action is null
|
|
||||||
* @implSpec <p>The default implementation behaves as if:
|
|
||||||
* <pre>{@code
|
|
||||||
* for (T t : this)
|
|
||||||
* action.accept(t);
|
|
||||||
* }</pre>
|
|
||||||
* @since 1.8
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void forEach(Consumer action) {
|
|
||||||
for (Byte b : this) {
|
|
||||||
action.accept(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a {@link java.util.Spliterator} over the elements described by this
|
|
||||||
* {@code Iterable}.
|
|
||||||
*
|
|
||||||
* @return a {@code Spliterator} over the elements described by this
|
|
||||||
* {@code Iterable}.
|
|
||||||
* @implSpec The default implementation creates an
|
|
||||||
* <em><a href="Spliterator.html#binding">early-binding</a></em>
|
|
||||||
* spliterator from the iterable's {@code Iterator}. The spliterator
|
|
||||||
* inherits the <em>fail-fast</em> properties of the iterable's iterator.
|
|
||||||
* @implNote The default implementation should usually be overridden. The
|
|
||||||
* spliterator returned by the default implementation has poor splitting
|
|
||||||
* capabilities, is unsized, and does not report any spliterator
|
|
||||||
* characteristics. Implementing classes can nearly always provide a
|
|
||||||
* better implementation.
|
|
||||||
* @since 1.8
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Spliterator spliterator() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
int getTile(int x, int y) {
|
|
||||||
return uint8ToInt32(data[y][x]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setTile(int x, int y, byte tile) {
|
|
||||||
data[y][x] = tile;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int uint8ToInt32(byte x) {
|
|
||||||
int ret;
|
|
||||||
if ((x & 0b1000_0000) != 0) {
|
|
||||||
ret = (x & 0b0111_1111) | (x & 0b1000_0000);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = x;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
58
src/com/Torvald/Terrarum/GameMap/MapLayer.kt
Normal file
58
src/com/Torvald/Terrarum/GameMap/MapLayer.kt
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
package com.Torvald.Terrarum.GameMap
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
import java.util.Spliterator
|
||||||
|
import java.util.function.Consumer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-17.
|
||||||
|
*/
|
||||||
|
class MapLayer(var width: Int, var height: Int) : Iterable<Byte> {
|
||||||
|
|
||||||
|
internal var data: Array<ByteArray>
|
||||||
|
|
||||||
|
init {
|
||||||
|
data = Array(height) { ByteArray(width) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator over elements of type `T`.
|
||||||
|
|
||||||
|
* @return an Iterator.
|
||||||
|
*/
|
||||||
|
override fun iterator(): Iterator<Byte> {
|
||||||
|
return object : Iterator<Byte> {
|
||||||
|
|
||||||
|
private var iteratorCount = 0
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean {
|
||||||
|
return iteratorCount < width * height
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun next(): Byte {
|
||||||
|
val y = iteratorCount / width
|
||||||
|
val x = iteratorCount % width
|
||||||
|
// advance counter
|
||||||
|
iteratorCount += 1
|
||||||
|
|
||||||
|
return data[y][x]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun getTile(x: Int, y: Int): Int {
|
||||||
|
return uint8ToInt32(data[y][x])
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun setTile(x: Int, y: Int, tile: Byte) {
|
||||||
|
data[y][x] = tile
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun uint8ToInt32(x: Byte): Int = java.lang.Byte.toUnsignedInt(x)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
@Transient @JvmStatic val RANGE = 256
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.GameMap;
|
|
||||||
|
|
||||||
import com.Torvald.Point.Point2f;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
|
|
||||||
public class MapPoint {
|
|
||||||
private Point2f startPoint;
|
|
||||||
private Point2f endPoint;
|
|
||||||
|
|
||||||
public MapPoint(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MapPoint(Point2f p1, Point2f p2){
|
|
||||||
setPoint(p1, p2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MapPoint(int x1, int y1, int x2, int y2){
|
|
||||||
setPoint(x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPoint(Point2f p1, Point2f p2){
|
|
||||||
startPoint = p1;
|
|
||||||
endPoint = p2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPoint(int x1, int y1, int x2, int y2){
|
|
||||||
startPoint = new Point2f(x1, y1);
|
|
||||||
endPoint = new Point2f(x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Point2f getStartPoint(){
|
|
||||||
return startPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Point2f getEndPoint(){
|
|
||||||
return endPoint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
35
src/com/Torvald/Terrarum/GameMap/MapPoint.kt
Normal file
35
src/com/Torvald/Terrarum/GameMap/MapPoint.kt
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package com.Torvald.Terrarum.GameMap
|
||||||
|
|
||||||
|
import com.Torvald.Point.Point2f
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
|
||||||
|
class MapPoint {
|
||||||
|
var startPoint: Point2f? = null
|
||||||
|
private set
|
||||||
|
var endPoint: Point2f? = null
|
||||||
|
private set
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(p1: Point2f, p2: Point2f) {
|
||||||
|
setPoint(p1, p2)
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(x1: Int, y1: Int, x2: Int, y2: Int) {
|
||||||
|
setPoint(x1, y1, x2, y2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPoint(p1: Point2f, p2: Point2f) {
|
||||||
|
startPoint = p1
|
||||||
|
endPoint = p2
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setPoint(x1: Int, y1: Int, x2: Int, y2: Int) {
|
||||||
|
startPoint = Point2f(x1.toFloat(), y1.toFloat())
|
||||||
|
endPoint = Point2f(x2.toFloat(), y2.toFloat())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.GameMap;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Spliterator;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-02-15.
|
|
||||||
*/
|
|
||||||
public class PairedMapLayer implements Iterable<Byte> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 0b_xxxx_yyyy, x for lower index, y for higher index
|
|
||||||
*
|
|
||||||
* e.g.
|
|
||||||
*
|
|
||||||
* 0110 1101 is interpreted as
|
|
||||||
* 6 for tile 0, 13 for tile 1.
|
|
||||||
*/
|
|
||||||
byte[][] dataPair;
|
|
||||||
|
|
||||||
public int width;
|
|
||||||
public int height;
|
|
||||||
|
|
||||||
public static transient final int RANGE = 16;
|
|
||||||
|
|
||||||
public PairedMapLayer(int width, int height) {
|
|
||||||
this.width = width / 2;
|
|
||||||
this.height = height;
|
|
||||||
|
|
||||||
dataPair = new byte[height][width / 2];
|
|
||||||
|
|
||||||
for (int i = 0; i < height; i++) {
|
|
||||||
for (int j = 0; j < width / 2; j++) {
|
|
||||||
dataPair[i][j] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an iterator over elements of type {@code T}.
|
|
||||||
* Note: this iterator will return combined damage, that is 0bxxxx_yyyy as whole.
|
|
||||||
*
|
|
||||||
* @return an Iterator.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Iterator<Byte> iterator() {
|
|
||||||
return new Iterator<Byte>() {
|
|
||||||
|
|
||||||
private int iteratorCount = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasNext() {
|
|
||||||
return iteratorCount < width * height;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Byte next() {
|
|
||||||
int y = iteratorCount / width;
|
|
||||||
int x = iteratorCount % width;
|
|
||||||
// advance counter
|
|
||||||
iteratorCount += 1;
|
|
||||||
|
|
||||||
return dataPair[y][x];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs the given action for each element of the {@code Iterable}
|
|
||||||
* until all elements have been processed or the action throws an
|
|
||||||
* exception. Unless otherwise specified by the implementing class,
|
|
||||||
* actions are performed in the order of iteration (if an iteration order
|
|
||||||
* is specified). Exceptions thrown by the action are relayed to the
|
|
||||||
* caller.
|
|
||||||
*
|
|
||||||
* Note: this iterator will return combined damage, that is 0bxxxx_yyyy as whole.
|
|
||||||
*
|
|
||||||
* @param action The action to be performed for each element
|
|
||||||
* @throws NullPointerException if the specified action is null
|
|
||||||
* @implSpec <p>The default implementation behaves as if:
|
|
||||||
* <pre>{@code
|
|
||||||
* for (T t : this)
|
|
||||||
* action.accept(t);
|
|
||||||
* }</pre>
|
|
||||||
* @since 1.8
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void forEach(Consumer action) {
|
|
||||||
for (Byte b : this) {
|
|
||||||
action.accept(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a {@link Spliterator} over the elements described by this
|
|
||||||
* {@code Iterable}.
|
|
||||||
*
|
|
||||||
* @return a {@code Spliterator} over the elements described by this
|
|
||||||
* {@code Iterable}.
|
|
||||||
* @implSpec The default implementation creates an
|
|
||||||
* <em><a href="Spliterator.html#binding">early-binding</a></em>
|
|
||||||
* spliterator from the iterable's {@code Iterator}. The spliterator
|
|
||||||
* inherits the <em>fail-fast</em> properties of the iterable's iterator.
|
|
||||||
* @implNote The default implementation should usually be overridden. The
|
|
||||||
* spliterator returned by the default implementation has poor splitting
|
|
||||||
* capabilities, is unsized, and does not report any spliterator
|
|
||||||
* characteristics. Implementing classes can nearly always provide a
|
|
||||||
* better implementation.
|
|
||||||
* @since 1.8
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Spliterator<Byte> spliterator() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
int getData(int x, int y) {
|
|
||||||
if ((x & 0x1) == 0)
|
|
||||||
// higher four bits for i = 0, 2, 4, ...
|
|
||||||
return (dataPair[y][x / 2] & 0xF0) >>> 4;
|
|
||||||
else
|
|
||||||
// lower four bits for i = 1, 3, 5, ...
|
|
||||||
return dataPair[y][x / 2] & 0x0F;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setData(int x, int y, int data) {
|
|
||||||
if (data < 0 || data >= 16) throw new IllegalArgumentException("[PairedMapLayer] " + data + ": invalid data value.");
|
|
||||||
if ((x & 0x1) == 0)
|
|
||||||
// higher four bits for i = 0, 2, 4, ...
|
|
||||||
dataPair[y][x / 2] = (byte) (dataPair[y][x / 2] & 0x0F | (data & 0xF) << 4);
|
|
||||||
else
|
|
||||||
// lower four bits for i = 1, 3, 5, ...
|
|
||||||
dataPair[y][x / 2] = (byte) (dataPair[y][x / 2] & 0xF0 | (data & 0xF));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
82
src/com/Torvald/Terrarum/GameMap/PairedMapLayer.kt
Normal file
82
src/com/Torvald/Terrarum/GameMap/PairedMapLayer.kt
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package com.Torvald.Terrarum.GameMap
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
import java.util.Spliterator
|
||||||
|
import java.util.function.Consumer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-02-15.
|
||||||
|
*/
|
||||||
|
class PairedMapLayer(width: Int, var height: Int) : Iterable<Byte> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 0b_xxxx_yyyy, x for lower index, y for higher index
|
||||||
|
|
||||||
|
* e.g.
|
||||||
|
|
||||||
|
* 0110 1101 is interpreted as
|
||||||
|
* 6 for tile 0, 13 for tile 1.
|
||||||
|
*/
|
||||||
|
internal var dataPair: Array<ByteArray>
|
||||||
|
|
||||||
|
var width: Int = 0
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.width = width / 2
|
||||||
|
|
||||||
|
dataPair = Array(height) { ByteArray(width / 2) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator over elements of type `T`.
|
||||||
|
* Note: this iterator will return combined damage, that is 0bxxxx_yyyy as whole.
|
||||||
|
|
||||||
|
* @return an Iterator.
|
||||||
|
*/
|
||||||
|
override fun iterator(): Iterator<Byte> {
|
||||||
|
return object : Iterator<Byte> {
|
||||||
|
|
||||||
|
private var iteratorCount = 0
|
||||||
|
|
||||||
|
override fun hasNext(): Boolean {
|
||||||
|
return iteratorCount < width * height
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun next(): Byte {
|
||||||
|
val y = iteratorCount / width
|
||||||
|
val x = iteratorCount % width
|
||||||
|
// advance counter
|
||||||
|
iteratorCount += 1
|
||||||
|
|
||||||
|
return dataPair[y][x]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun getData(x: Int, y: Int): Int {
|
||||||
|
if (x and 0x1 == 0)
|
||||||
|
// higher four bits for i = 0, 2, 4, ...
|
||||||
|
return (java.lang.Byte.toUnsignedInt(dataPair[y][x / 2]) and 0xF0) ushr 4
|
||||||
|
else
|
||||||
|
// lower four bits for i = 1, 3, 5, ...
|
||||||
|
return java.lang.Byte.toUnsignedInt(dataPair[y][x / 2]) and 0x0F
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun setData(x: Int, y: Int, data: Int) {
|
||||||
|
if (data < 0 || data >= 16) throw IllegalArgumentException("[PairedMapLayer] $data: invalid data value.")
|
||||||
|
if (x and 0x1 == 0)
|
||||||
|
// higher four bits for i = 0, 2, 4, ...
|
||||||
|
dataPair[y][x / 2] =
|
||||||
|
(java.lang.Byte.toUnsignedInt(dataPair[y][x / 2]) and 0x0F
|
||||||
|
or (data and 0xF shl 4)).toByte()
|
||||||
|
else
|
||||||
|
// lower four bits for i = 1, 3, 5, ...
|
||||||
|
dataPair[y][x / 2] = (java.lang.Byte.toUnsignedInt(dataPair[y][x / 2]) and 0xF0
|
||||||
|
or (data and 0xF)).toByte()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
@Transient val RANGE = 16
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,179 +0,0 @@
|
|||||||
package com.Torvald.Terrarum.LangPack;
|
|
||||||
|
|
||||||
import com.Torvald.CSVFetcher;
|
|
||||||
import com.Torvald.ImageFont.GameFontWhite;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
import org.apache.commons.csv.CSVRecord;
|
|
||||||
import org.newdawn.slick.SlickException;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Hashtable;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 16-01-22.
|
|
||||||
*/
|
|
||||||
public class Lang {
|
|
||||||
|
|
||||||
private static final String CSV_COLUMN_FIRST = "STRING_ID";
|
|
||||||
/**
|
|
||||||
* Get record by its STRING_ID
|
|
||||||
*/
|
|
||||||
private static Hashtable<String, CSVRecord> lang;
|
|
||||||
private static final String FALLBACK_LANG_CODE = "enUS";
|
|
||||||
|
|
||||||
private static final int HANGUL_SYL_START = 0xAC00;
|
|
||||||
|
|
||||||
private static final String PATH_TO_CSV = "./res/locales/";
|
|
||||||
private static final String CSV_MAIN = "polyglot.csv";
|
|
||||||
private static final String NAMESET_PREFIX = "nameset_";
|
|
||||||
|
|
||||||
private static final int[] HANGUL_POST_INDEX_ALPH = { // 0: 는, 가, ... 1: 은, 이, ...
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
private static final int[] HANGUL_POST_RO_INDEX_ALPH = { // 0: 로 1: 으로
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
private static String[] ENGLISH_WORD_NORMAL_PLURAL = {
|
|
||||||
"photo"
|
|
||||||
};
|
|
||||||
|
|
||||||
private static String[] FRENCH_WORD_NORMAL_PLURAL = {
|
|
||||||
"bal"
|
|
||||||
, "banal"
|
|
||||||
, "fatal"
|
|
||||||
, "final"
|
|
||||||
};
|
|
||||||
|
|
||||||
public Lang() throws IOException {
|
|
||||||
lang = new Hashtable<>();
|
|
||||||
|
|
||||||
List<CSVRecord> langPackCSV = CSVFetcher.INSTANCE.readCSV(PATH_TO_CSV + CSV_MAIN);
|
|
||||||
|
|
||||||
File file = new File(PATH_TO_CSV);
|
|
||||||
FilenameFilter filter = new FilenameFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(File dir, String name) {
|
|
||||||
return name.contains(".csv") && !name.contains(CSV_MAIN) && !name.contains(NAMESET_PREFIX);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
for (String csvfilename : file.list(filter)) {
|
|
||||||
List<CSVRecord> csv = CSVFetcher.INSTANCE.readCSV(PATH_TO_CSV + csvfilename);
|
|
||||||
csv.forEach(langPackCSV::add);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill lang table
|
|
||||||
langPackCSV.forEach(this::appendToLangByStringID);
|
|
||||||
|
|
||||||
|
|
||||||
Arrays.sort(ENGLISH_WORD_NORMAL_PLURAL);
|
|
||||||
Arrays.sort(FRENCH_WORD_NORMAL_PLURAL);
|
|
||||||
|
|
||||||
try { ((GameFontWhite)Terrarum.gameFontWhite).reloadUnihan(); }
|
|
||||||
catch (SlickException e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void appendToLangByStringID(CSVRecord record) {
|
|
||||||
lang.put(record.get(CSV_COLUMN_FIRST), record);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CSVRecord getRecord(String key) {
|
|
||||||
CSVRecord record = lang.get(key);
|
|
||||||
if (record == null) {
|
|
||||||
System.out.println("[Lang] No such record.");
|
|
||||||
throw new NullPointerException();
|
|
||||||
}
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String get(String key) {
|
|
||||||
String value = null;
|
|
||||||
try { value = lang.get(key).get(Terrarum.Companion.getGameLocale()); }
|
|
||||||
catch (IllegalArgumentException e) { value = key; }
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String pluraliseLang(String key, int count) {
|
|
||||||
return (count > 1) ? get(key + "_PLURAL") : get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String pluralise(String word, int count) {
|
|
||||||
if (count < 2) return word;
|
|
||||||
|
|
||||||
switch (Terrarum.Companion.getGameLocale()) {
|
|
||||||
case ("fr"):
|
|
||||||
if (Arrays.binarySearch(FRENCH_WORD_NORMAL_PLURAL, word) >= 0) {
|
|
||||||
return word + "s";
|
|
||||||
}
|
|
||||||
if (word.endsWith("al") || word.endsWith("au") || word.endsWith("eu") || word
|
|
||||||
.endsWith("eau")) {
|
|
||||||
return word.substring(0, word.length() - 2) + "ux";
|
|
||||||
}
|
|
||||||
else if (word.endsWith("ail")) {
|
|
||||||
return word.substring(0, word.length() - 3) + "ux";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return word + "s";
|
|
||||||
}
|
|
||||||
case ("en"): default:
|
|
||||||
if (Arrays.binarySearch(ENGLISH_WORD_NORMAL_PLURAL, word) >= 0) {
|
|
||||||
return word + "s";
|
|
||||||
}
|
|
||||||
else if (word.endsWith("f")) { // f -> ves
|
|
||||||
return word.substring(0, word.length() - 2) + "ves";
|
|
||||||
}
|
|
||||||
else if (word.endsWith("o") || word.endsWith("z")) { // o -> oes
|
|
||||||
return word + "es";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return word + "s";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String postEunNeun(String word) {
|
|
||||||
char lastChar = getLastChar(word);
|
|
||||||
|
|
||||||
if (isHangul(lastChar)) {
|
|
||||||
int index = lastChar - HANGUL_SYL_START;
|
|
||||||
return (index % 28 == 0) ? word + "는" : word + "은";
|
|
||||||
}
|
|
||||||
else if ((lastChar >= 'A' && lastChar <= 'Z')
|
|
||||||
|| (lastChar >= 'a' && lastChar <= 'z')) {
|
|
||||||
int index = (lastChar - 0x41) % 0x20;
|
|
||||||
return (HANGUL_POST_INDEX_ALPH[index] == 0) ? word + "는" : word + "은";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return "은(는)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String postIiGa(String word) {
|
|
||||||
char lastChar = getLastChar(word);
|
|
||||||
|
|
||||||
if (isHangul(lastChar)) {
|
|
||||||
int index = lastChar - HANGUL_SYL_START;
|
|
||||||
return (index % 28 == 0) ? word + "가" : word + "이";
|
|
||||||
}
|
|
||||||
else if ((lastChar >= 'A' && lastChar <= 'Z')
|
|
||||||
|| (lastChar >= 'a' && lastChar <= 'z')) {
|
|
||||||
int index = (lastChar - 0x41) % 0x20;
|
|
||||||
return (HANGUL_POST_INDEX_ALPH[index] == 0) ? word + "가" : word + "이";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return "이(가)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isHangul(char c) {
|
|
||||||
return (c >= 0xAC00 && c <= 0xD7A3);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static char getLastChar(String s) {
|
|
||||||
return s.charAt(s.length() - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
190
src/com/Torvald/Terrarum/LangPack/Lang.kt
Normal file
190
src/com/Torvald/Terrarum/LangPack/Lang.kt
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
package com.Torvald.Terrarum.LangPack
|
||||||
|
|
||||||
|
import com.Torvald.CSVFetcher
|
||||||
|
import com.Torvald.ImageFont.GameFontWhite
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
import org.apache.commons.csv.CSVRecord
|
||||||
|
import org.newdawn.slick.SlickException
|
||||||
|
|
||||||
|
import java.io.*
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by minjaesong on 16-01-22.
|
||||||
|
*/
|
||||||
|
object Lang {
|
||||||
|
|
||||||
|
private val CSV_COLUMN_FIRST = "STRING_ID"
|
||||||
|
/**
|
||||||
|
* Get record by its STRING_ID
|
||||||
|
*/
|
||||||
|
private var lang: HashMap<String, CSVRecord>
|
||||||
|
private val FALLBACK_LANG_CODE = "enUS"
|
||||||
|
|
||||||
|
private val HANGUL_SYL_START = 0xAC00
|
||||||
|
|
||||||
|
private val PATH_TO_CSV = "./res/locales/"
|
||||||
|
private val CSV_MAIN = "polyglot.csv"
|
||||||
|
private val NAMESET_PREFIX = "nameset_"
|
||||||
|
|
||||||
|
private val HANGUL_POST_INDEX_ALPH = intArrayOf(// 0: 는, 가, ... 1: 은, 이, ...
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
|
private val HANGUL_POST_RO_INDEX_ALPH = intArrayOf(// 0: 로 1: 으로
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
|
|
||||||
|
private val ENGLISH_WORD_NORMAL_PLURAL = arrayOf("photo")
|
||||||
|
|
||||||
|
private val FRENCH_WORD_NORMAL_PLURAL = arrayOf("bal", "banal", "fatal", "final")
|
||||||
|
|
||||||
|
init {
|
||||||
|
lang = HashMap<String, CSVRecord>()
|
||||||
|
|
||||||
|
// read polyglot.csv first and use this list as a pivot
|
||||||
|
var langPackCSV: List<CSVRecord> = CSVFetcher.readCSV(PATH_TO_CSV + CSV_MAIN)
|
||||||
|
|
||||||
|
// append CSV records to the main langpack
|
||||||
|
val file = File(PATH_TO_CSV)
|
||||||
|
val filter = FilenameFilter { dir, name -> name.contains(".csv") && !name.contains(NAMESET_PREFIX) }
|
||||||
|
for (csvfilename in file.list(filter)) {
|
||||||
|
val csv = CSVFetcher.readCSV(PATH_TO_CSV + csvfilename)
|
||||||
|
//csv.forEach({ langPackCSV. })
|
||||||
|
csv.forEach { it -> lang.put(it.get(CSV_COLUMN_FIRST), it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// lang.put(record.get(CSV_COLUMN_FIRST), record)
|
||||||
|
|
||||||
|
// Fill lang table
|
||||||
|
// langPackCSV.forEach({ this.appendToLangByStringID(it) })
|
||||||
|
|
||||||
|
|
||||||
|
Arrays.sort(ENGLISH_WORD_NORMAL_PLURAL)
|
||||||
|
Arrays.sort(FRENCH_WORD_NORMAL_PLURAL)
|
||||||
|
|
||||||
|
try {
|
||||||
|
(Terrarum.gameFontWhite as GameFontWhite).reloadUnihan()
|
||||||
|
}
|
||||||
|
catch (e: SlickException) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getRecord(key: String): CSVRecord {
|
||||||
|
val record = lang[key]
|
||||||
|
if (record == null) {
|
||||||
|
println("[Lang] No such record: $key")
|
||||||
|
throw NullPointerException()
|
||||||
|
}
|
||||||
|
return record
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun get(key: String): String {
|
||||||
|
var value: String
|
||||||
|
try {
|
||||||
|
value = lang[key]!!.get(Terrarum.gameLocale)
|
||||||
|
}
|
||||||
|
catch (e: IllegalArgumentException) {
|
||||||
|
value = key
|
||||||
|
}
|
||||||
|
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pluraliseLang(key: String, count: Int): String {
|
||||||
|
return if (count > 1) get(key + "_PLURAL") else get(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pluralise(word: String, count: Int): String {
|
||||||
|
if (count < 2) return word
|
||||||
|
|
||||||
|
when (Terrarum.gameLocale) {
|
||||||
|
"fr" -> {
|
||||||
|
if (Arrays.binarySearch(FRENCH_WORD_NORMAL_PLURAL, word) >= 0) {
|
||||||
|
return word + "s"
|
||||||
|
}
|
||||||
|
if (word.endsWith("al") || word.endsWith("au") || word.endsWith("eu") || word.endsWith("eau")) {
|
||||||
|
return word.substring(0, word.length - 2) + "ux"
|
||||||
|
}
|
||||||
|
else if (word.endsWith("ail")) {
|
||||||
|
return word.substring(0, word.length - 3) + "ux"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return word + "s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"en" -> {
|
||||||
|
if (Arrays.binarySearch(ENGLISH_WORD_NORMAL_PLURAL, word) >= 0) {
|
||||||
|
return word + "s"
|
||||||
|
}
|
||||||
|
else if (word.endsWith("f")) {
|
||||||
|
// f -> ves
|
||||||
|
return word.substring(0, word.length - 2) + "ves"
|
||||||
|
}
|
||||||
|
else if (word.endsWith("o") || word.endsWith("z")) {
|
||||||
|
// o -> oes
|
||||||
|
return word + "es"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return word + "s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
if (Arrays.binarySearch(ENGLISH_WORD_NORMAL_PLURAL, word) >= 0) {
|
||||||
|
return word + "s"
|
||||||
|
}
|
||||||
|
else if (word.endsWith("f")) {
|
||||||
|
return word.substring(0, word.length - 2) + "ves"
|
||||||
|
}
|
||||||
|
else if (word.endsWith("o") || word.endsWith("z")) {
|
||||||
|
return word + "es"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return word + "s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun postEunNeun(word: String): String {
|
||||||
|
val lastChar = getLastChar(word)
|
||||||
|
|
||||||
|
if (isHangul(lastChar)) {
|
||||||
|
val index = lastChar.toInt() - HANGUL_SYL_START
|
||||||
|
return if (index % 28 == 0) word + "는" else word + "은"
|
||||||
|
}
|
||||||
|
else if (lastChar >= 'A' && lastChar <= 'Z' || lastChar >= 'a' && lastChar <= 'z') {
|
||||||
|
val index = (lastChar.toInt() - 0x41) % 0x20
|
||||||
|
return if (HANGUL_POST_INDEX_ALPH[index] == 0) word + "는" else word + "은"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "은(는)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun postIiGa(word: String): String {
|
||||||
|
val lastChar = getLastChar(word)
|
||||||
|
|
||||||
|
if (isHangul(lastChar)) {
|
||||||
|
val index = lastChar.toInt() - HANGUL_SYL_START
|
||||||
|
return if (index % 28 == 0) word + "가" else word + "이"
|
||||||
|
}
|
||||||
|
else if (lastChar >= 'A' && lastChar <= 'Z' || lastChar >= 'a' && lastChar <= 'z') {
|
||||||
|
val index = (lastChar.toInt() - 0x41) % 0x20
|
||||||
|
return if (HANGUL_POST_INDEX_ALPH[index] == 0) word + "가" else word + "이"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "이(가)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isHangul(c: Char): Boolean {
|
||||||
|
return c.toInt() >= 0xAC00 && c.toInt() <= 0xD7A3
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getLastChar(s: String): Char {
|
||||||
|
return s[s.length - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun appendToLangByStringID(record: CSVRecord) {
|
||||||
|
lang.put(record.get(CSV_COLUMN_FIRST), record)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -96,11 +96,11 @@ object LightmapRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val for_y_start = div16(MapCamera.getCameraY()) - 1 // fix for premature lightmap rendering
|
val for_x_start = div16(MapCamera.cameraX) - 1 // fix for premature lightmap rendering
|
||||||
val for_x_start = div16(MapCamera.getCameraX()) - 1 // on topmost/leftmost side
|
val for_y_start = div16(MapCamera.cameraY) - 1 // on topmost/leftmost side
|
||||||
|
|
||||||
val for_y_end = clampHTile(for_y_start + div16(MapCamera.getRenderHeight()) + 2) + 1 // same fix as above
|
|
||||||
val for_x_end = clampWTile(for_x_start + div16(MapCamera.getRenderWidth()) + 2) + 1
|
val for_x_end = clampWTile(for_x_start + div16(MapCamera.getRenderWidth()) + 2) + 1
|
||||||
|
val for_y_end = clampHTile(for_y_start + div16(MapCamera.getRenderHeight()) + 2) + 1 // same fix as above
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updating order:
|
* Updating order:
|
||||||
|
|||||||
@@ -19,8 +19,10 @@ import java.util.*
|
|||||||
object MapCamera {
|
object MapCamera {
|
||||||
private val map: GameMap = Terrarum.game.map;
|
private val map: GameMap = Terrarum.game.map;
|
||||||
|
|
||||||
internal var cameraX = 0
|
var cameraX = 0
|
||||||
internal var cameraY = 0
|
private set
|
||||||
|
var cameraY = 0
|
||||||
|
private set
|
||||||
|
|
||||||
private val TSIZE = MapDrawer.TILE_SIZE
|
private val TSIZE = MapDrawer.TILE_SIZE
|
||||||
|
|
||||||
@@ -122,6 +124,7 @@ object MapCamera {
|
|||||||
, TileNameCode.ORE_ILMENITE
|
, TileNameCode.ORE_ILMENITE
|
||||||
, TileNameCode.ORE_AURICHALCUM
|
, TileNameCode.ORE_AURICHALCUM
|
||||||
|
|
||||||
|
, TileNameCode.WATER
|
||||||
, TileNameCode.WATER_1
|
, TileNameCode.WATER_1
|
||||||
, TileNameCode.WATER_2
|
, TileNameCode.WATER_2
|
||||||
, TileNameCode.WATER_3
|
, TileNameCode.WATER_3
|
||||||
@@ -153,7 +156,6 @@ object MapCamera {
|
|||||||
, TileNameCode.LAVA_13
|
, TileNameCode.LAVA_13
|
||||||
, TileNameCode.LAVA_14
|
, TileNameCode.LAVA_14
|
||||||
, TileNameCode.LAVA_15
|
, TileNameCode.LAVA_15
|
||||||
, TileNameCode.LAVA
|
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -444,18 +446,9 @@ object MapCamera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun div16(x: Int): Int = x and 0x7FFFFFFF shr 4
|
||||||
fun div16(x: Int): Int {
|
fun mod16(x: Int): Int = x and 15
|
||||||
return x and 0x7FFFFFFF shr 4
|
fun quantise16(x: Int): Int = x and 0xFFFFFFF0.toInt()
|
||||||
}
|
|
||||||
|
|
||||||
fun mod16(x: Int): Int {
|
|
||||||
return x and 15
|
|
||||||
}
|
|
||||||
|
|
||||||
fun quantise16(x: Int): Int {
|
|
||||||
return x and 0xFFFFFFF0.toInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun clampW(x: Int): Int {
|
fun clampW(x: Int): Int {
|
||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
@@ -477,7 +470,6 @@ object MapCamera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun clampWTile(x: Int): Int {
|
fun clampWTile(x: Int): Int {
|
||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
return 0
|
return 0
|
||||||
@@ -488,7 +480,6 @@ object MapCamera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun clampHTile(x: Int): Int {
|
fun clampHTile(x: Int): Int {
|
||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
return 0
|
return 0
|
||||||
@@ -499,55 +490,21 @@ object MapCamera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
fun getRenderWidth(): Int = renderWidth
|
||||||
fun getRenderWidth(): Int {
|
fun getRenderHeight(): Int = renderHeight
|
||||||
return renderWidth
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
fun getRenderStartX(): Int = div16(cameraX)
|
||||||
fun getRenderHeight(): Int {
|
fun getRenderStartY(): Int = div16(cameraY)
|
||||||
return renderHeight
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
fun getRenderEndX(): Int = clampWTile(getRenderStartX() + div16(renderWidth) + 2)
|
||||||
fun getRenderStartX(): Int {
|
fun getRenderEndY(): Int = clampHTile(getRenderStartY() + div16(renderHeight) + 2)
|
||||||
return div16(cameraX)
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
private fun isConnectSelf(b: Int): Boolean = TILES_CONNECT_SELF.contains(b)
|
||||||
fun getRenderStartY(): Int {
|
private fun isConnectMutual(b: Int): Boolean = TILES_CONNECT_MUTUAL.contains(b)
|
||||||
return div16(cameraY)
|
private fun isWallSticker(b: Int): Boolean = TILES_WALL_STICKER.contains(b)
|
||||||
}
|
private fun isPlatform(b: Int): Boolean = TILES_WALL_STICKER_CONNECT_SELF.contains(b)
|
||||||
|
|
||||||
@JvmStatic
|
private fun isBlendMul(b: Int): Boolean = TILES_BLEND_MUL.contains(b)
|
||||||
fun getRenderEndX(): Int {
|
|
||||||
return clampWTile(getRenderStartX() + div16(renderWidth) + 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun getRenderEndY(): Int {
|
|
||||||
return clampHTile(getRenderStartY() + div16(renderHeight) + 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isConnectSelf(b: Int): Boolean {
|
|
||||||
return Arrays.asList(*TILES_CONNECT_SELF).contains(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isConnectMutual(b: Int): Boolean {
|
|
||||||
return Arrays.asList(*TILES_CONNECT_MUTUAL).contains(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isWallSticker(b: Int): Boolean {
|
|
||||||
return Arrays.asList(*TILES_WALL_STICKER).contains(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isPlatform(b: Int): Boolean {
|
|
||||||
return Arrays.asList(*TILES_WALL_STICKER_CONNECT_SELF).contains(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isBlendMul(b: Int): Boolean {
|
|
||||||
return Arrays.asList(*TILES_BLEND_MUL).contains(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setBlendModeMul() {
|
private fun setBlendModeMul() {
|
||||||
GL11.glEnable(GL11.GL_BLEND)
|
GL11.glEnable(GL11.GL_BLEND)
|
||||||
@@ -558,14 +515,4 @@ object MapCamera {
|
|||||||
GL11.glDisable(GL11.GL_BLEND)
|
GL11.glDisable(GL11.GL_BLEND)
|
||||||
Terrarum.appgc.graphics.setDrawMode(Graphics.MODE_NORMAL)
|
Terrarum.appgc.graphics.setDrawMode(Graphics.MODE_NORMAL)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun getCameraX(): Int {
|
|
||||||
return cameraX
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun getCameraY(): Int {
|
|
||||||
return cameraY
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -54,7 +54,12 @@ object MapDrawer {
|
|||||||
|
|
||||||
g.color = getColourFromMap(colTemp)
|
g.color = getColourFromMap(colTemp)
|
||||||
//g.color = getColourFromMap(3022)
|
//g.color = getColourFromMap(3022)
|
||||||
g.fillRect(MapCamera.getCameraX() * zoom, MapCamera.getCameraY() * zoom, Terrarum.WIDTH * if (zoom < 1) 1f / zoom else zoom, Terrarum.HEIGHT * if (zoom < 1) 1f / zoom else zoom)
|
g.fillRect(
|
||||||
|
MapCamera.cameraX * zoom,
|
||||||
|
MapCamera.cameraY * zoom,
|
||||||
|
Terrarum.WIDTH * if (zoom < 1) 1f / zoom else zoom,
|
||||||
|
Terrarum.HEIGHT * if (zoom < 1) 1f / zoom else zoom
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,305 +0,0 @@
|
|||||||
package com.Torvald.Terrarum;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import com.Torvald.ImageFont.GameFontWhite;
|
|
||||||
import com.Torvald.JsonFetcher;
|
|
||||||
import com.Torvald.JsonWriter;
|
|
||||||
import com.Torvald.Terrarum.LangPack.Lang;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import org.lwjgl.input.Controllers;
|
|
||||||
import org.newdawn.slick.*;
|
|
||||||
import org.newdawn.slick.state.StateBasedGame;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by minjaesong on 15-12-30.
|
|
||||||
*/
|
|
||||||
public class Terrarum extends StateBasedGame {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To be used with physics simulator
|
|
||||||
*/
|
|
||||||
public static final int 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
|
|
||||||
*/
|
|
||||||
public static final int TARGET_INTERNAL_FPS = 100;
|
|
||||||
|
|
||||||
public static AppGameContainer appgc;
|
|
||||||
|
|
||||||
public static final int WIDTH = 1060;
|
|
||||||
public static final int HEIGHT = 742; // IMAX ratio
|
|
||||||
public static boolean VSYNC = true;
|
|
||||||
public static final int VSYNC_TRIGGER_THRESHOLD = 56;
|
|
||||||
|
|
||||||
public static Game game;
|
|
||||||
public static GameConfig gameConfig;
|
|
||||||
|
|
||||||
public static String OSName;
|
|
||||||
public static String OSVersion;
|
|
||||||
public static String OperationSystem;
|
|
||||||
public static String defaultDir;
|
|
||||||
public static String defaultSaveDir;
|
|
||||||
|
|
||||||
public static String gameLocale = ""; // locale override
|
|
||||||
|
|
||||||
public static Font gameFontWhite;
|
|
||||||
|
|
||||||
public static final int SCENE_ID_HOME = 1;
|
|
||||||
public static final int SCENE_ID_GAME = 3;
|
|
||||||
|
|
||||||
public static boolean hasController = false;
|
|
||||||
public static final float CONTROLLER_DEADZONE = 0.1f;
|
|
||||||
|
|
||||||
private static String configDir;
|
|
||||||
|
|
||||||
public Terrarum(String gamename) throws SlickException {
|
|
||||||
super(gamename);
|
|
||||||
|
|
||||||
gameConfig = new GameConfig();
|
|
||||||
|
|
||||||
getDefaultDirectory();
|
|
||||||
createDirs();
|
|
||||||
|
|
||||||
boolean readFromDisk = readConfigJson();
|
|
||||||
if (!readFromDisk) readConfigJson();
|
|
||||||
|
|
||||||
// get locale from config
|
|
||||||
gameLocale = gameConfig.getAsString("language");
|
|
||||||
|
|
||||||
// if game locale were not set, use system locale
|
|
||||||
if (gameLocale.length() < 4)
|
|
||||||
gameLocale = getSysLang();
|
|
||||||
|
|
||||||
System.out.println("[Terrarum] Locale: " + gameLocale);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initStatesList(GameContainer gc) throws SlickException {
|
|
||||||
gameFontWhite = new GameFontWhite();
|
|
||||||
|
|
||||||
try { new Lang(); }
|
|
||||||
catch (IOException e) { e.printStackTrace(); }
|
|
||||||
|
|
||||||
hasController = (gc.getInput().getControllerCount() > 0);
|
|
||||||
if (hasController) {
|
|
||||||
for (int c = 0; c < Controllers.getController(0).getAxisCount(); c++) {
|
|
||||||
Controllers.getController(0).setDeadZone(c, CONTROLLER_DEADZONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
appgc.getInput().enableKeyRepeat();
|
|
||||||
|
|
||||||
game = new Game();
|
|
||||||
addState(game);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
appgc = new AppGameContainer(new Terrarum("Terrarum"));
|
|
||||||
appgc.setDisplayMode(WIDTH, HEIGHT, false);
|
|
||||||
|
|
||||||
appgc.setTargetFrameRate(TARGET_INTERNAL_FPS);
|
|
||||||
appgc.setVSync(VSYNC);
|
|
||||||
appgc.setMaximumLogicUpdateInterval(1000 / TARGET_INTERNAL_FPS);
|
|
||||||
appgc.setMinimumLogicUpdateInterval(1000 / TARGET_INTERNAL_FPS - 1);
|
|
||||||
|
|
||||||
appgc.setShowFPS(false);
|
|
||||||
appgc.setUpdateOnlyWhenVisible(false);
|
|
||||||
|
|
||||||
appgc.start();
|
|
||||||
}
|
|
||||||
catch (SlickException ex)
|
|
||||||
{
|
|
||||||
Logger.getLogger(Terrarum.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void getDefaultDirectory(){
|
|
||||||
OSName = System.getProperty("os.name");
|
|
||||||
OSVersion = System.getProperty("os.version");
|
|
||||||
|
|
||||||
String 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";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createDirs(){
|
|
||||||
File[] dirs = {
|
|
||||||
new File(defaultSaveDir),
|
|
||||||
};
|
|
||||||
|
|
||||||
for (File d : dirs){
|
|
||||||
if (!d.exists()){
|
|
||||||
d.mkdirs();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createConfigJson() throws IOException {
|
|
||||||
File configFile = new File(configDir);
|
|
||||||
|
|
||||||
if (!configFile.exists() || configFile.length() == 0) {
|
|
||||||
JsonWriter.writeToFile(DefaultConfig.fetch(), configDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean readConfigJson() {
|
|
||||||
try {
|
|
||||||
// read from disk and build config from it
|
|
||||||
JsonObject jsonObject = JsonFetcher.readJson(configDir);
|
|
||||||
|
|
||||||
// make config
|
|
||||||
jsonObject.entrySet().forEach(
|
|
||||||
entry -> gameConfig.set(entry.getKey(), entry.getValue())
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (IOException e) {
|
|
||||||
// write default config to game dir. Call this method again to read config from it.
|
|
||||||
try {
|
|
||||||
createConfigJson();
|
|
||||||
}
|
|
||||||
catch (IOException e1) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getSysLang() {
|
|
||||||
String lan = System.getProperty("user.language");
|
|
||||||
String country = System.getProperty("user.country");
|
|
||||||
|
|
||||||
// exception handling
|
|
||||||
if (lan.equals("en")) country = "US";
|
|
||||||
else if (lan.equals("fr")) country = "FR";
|
|
||||||
else if (lan.equals("de")) country = "DE";
|
|
||||||
else if (lan.equals("ko")) country = "KR";
|
|
||||||
|
|
||||||
return lan + country;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
public static int getConfigInt(String key) {
|
|
||||||
int cfg = 0;
|
|
||||||
try {
|
|
||||||
cfg = gameConfig.getAsInt(key);
|
|
||||||
}
|
|
||||||
catch (NullPointerException e) {
|
|
||||||
try {
|
|
||||||
cfg = DefaultConfig.fetch().get(key).getAsInt();
|
|
||||||
}
|
|
||||||
catch (NullPointerException e1) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
public static float getConfigFloat(String key) {
|
|
||||||
float cfg = 0;
|
|
||||||
try {
|
|
||||||
cfg = gameConfig.getAsFloat(key);
|
|
||||||
}
|
|
||||||
catch (NullPointerException e) {
|
|
||||||
try {
|
|
||||||
cfg = DefaultConfig.fetch().get(key).getAsFloat();
|
|
||||||
}
|
|
||||||
catch (NullPointerException e1) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
public static String getConfigString(String key) {
|
|
||||||
String cfg = "";
|
|
||||||
try {
|
|
||||||
cfg = gameConfig.getAsString(key);
|
|
||||||
}
|
|
||||||
catch (NullPointerException e) {
|
|
||||||
try {
|
|
||||||
cfg = DefaultConfig.fetch().get(key).getAsString();
|
|
||||||
}
|
|
||||||
catch (NullPointerException e1) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
public static boolean getConfigBoolean(String key) {
|
|
||||||
boolean cfg = false;
|
|
||||||
try {
|
|
||||||
cfg = gameConfig.getAsBoolean(key);
|
|
||||||
}
|
|
||||||
catch (NullPointerException e) {
|
|
||||||
try {
|
|
||||||
cfg = DefaultConfig.fetch().get(key).getAsBoolean();
|
|
||||||
}
|
|
||||||
catch (NullPointerException e1) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cfg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -46,13 +46,6 @@ constructor(gamename: String) : StateBasedGame(gamename) {
|
|||||||
override fun initStatesList(gc: GameContainer) {
|
override fun initStatesList(gc: GameContainer) {
|
||||||
gameFontWhite = GameFontWhite()
|
gameFontWhite = GameFontWhite()
|
||||||
|
|
||||||
try {
|
|
||||||
Lang()
|
|
||||||
}
|
|
||||||
catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
|
|
||||||
hasController = gc.input.controllerCount > 0
|
hasController = gc.input.controllerCount > 0
|
||||||
if (hasController) {
|
if (hasController) {
|
||||||
for (c in 0..Controllers.getController(0).axisCount - 1) {
|
for (c in 0..Controllers.getController(0).axisCount - 1) {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
"10"; "2";"TILE_PLATFORM_EBONY" ; "394758"; "1"; "N/A"; "0"; "0"; "0"; "0"; "0"; "10"; "2"; "0";"16"
|
"10"; "2";"TILE_PLATFORM_EBONY" ; "394758"; "1"; "N/A"; "0"; "0"; "0"; "0"; "0"; "10"; "2"; "0";"16"
|
||||||
"10"; "3";"TILE_PLATFORM_BIRCH" ; "394758"; "1"; "N/A"; "0"; "0"; "0"; "0"; "0"; "10"; "3"; "0";"16"
|
"10"; "3";"TILE_PLATFORM_BIRCH" ; "394758"; "1"; "N/A"; "0"; "0"; "0"; "0"; "0"; "10"; "3"; "0";"16"
|
||||||
"10"; "4";"TILE_PLATFORM_BLOODROSE" ; "394758"; "1"; "N/A"; "0"; "0"; "0"; "0"; "0"; "10"; "4"; "0";"16"
|
"10"; "4";"TILE_PLATFORM_BLOODROSE" ; "394758"; "1"; "N/A"; "0"; "0"; "0"; "0"; "0"; "10"; "4"; "0";"16"
|
||||||
"11"; "0";"TILE_TORCH" ; "0"; "0"; "N/A"; "0"; "0"; "0"; "0";"16750673"; "11"; "0"; "0";"16"
|
"11"; "0";"TILE_TORCH" ; "0"; "0"; "N/A"; "0"; "0"; "0"; "0";"15304000"; "11"; "0"; "0";"16"
|
||||||
"11"; "1";"TILE_TORCH_FROST" ; "0"; "0"; "N/A"; "0"; "0"; "0"; "0"; "5143807"; "11"; "1"; "0";"16"
|
"11"; "1";"TILE_TORCH_FROST" ; "0"; "0"; "N/A"; "0"; "0"; "0"; "0"; "5143807"; "11"; "1"; "0";"16"
|
||||||
"12"; "0";"TILE_TORCH" ; "394758"; "0"; "N/A"; "0"; "0"; "0"; "0"; "0"; "11"; "0"; "0";"16"
|
"12"; "0";"TILE_TORCH" ; "394758"; "0"; "N/A"; "0"; "0"; "0"; "0"; "0"; "11"; "0"; "0";"16"
|
||||||
"12"; "1";"TILE_TORCH_FROST" ; "394758"; "0"; "N/A"; "0"; "0"; "0"; "0"; "0"; "11"; "1"; "0";"16"
|
"12"; "1";"TILE_TORCH_FROST" ; "394758"; "0"; "N/A"; "0"; "0"; "0"; "0"; "0"; "11"; "1"; "0";"16"
|
||||||
@@ -83,6 +83,7 @@
|
|||||||
"15"; "3";"TILE_SANDSTONE_DESERT" ;"2105376"; "25";"1900"; "0"; "0"; "1"; "1"; "0"; "15"; "3"; "0";"16"
|
"15"; "3";"TILE_SANDSTONE_DESERT" ;"2105376"; "25";"1900"; "0"; "0"; "1"; "1"; "0"; "15"; "3"; "0";"16"
|
||||||
"15"; "4";"TILE_SANDSTONE_BLACK" ;"2105376"; "25";"1900"; "0"; "0"; "1"; "1"; "0"; "15"; "4"; "0";"16"
|
"15"; "4";"TILE_SANDSTONE_BLACK" ;"2105376"; "25";"1900"; "0"; "0"; "1"; "1"; "0"; "15"; "4"; "0";"16"
|
||||||
"15"; "5";"TILE_SANDSTONE_BLACK" ;"2105376"; "25";"1900"; "0"; "0"; "1"; "1"; "0"; "15"; "5"; "0";"16"
|
"15"; "5";"TILE_SANDSTONE_BLACK" ;"2105376"; "25";"1900"; "0"; "0"; "1"; "1"; "0"; "15"; "5"; "0";"16"
|
||||||
|
"16"; "0";"TILE_LANTERN_IRON_REGULAR"; "0"; "0"; "N/A"; "0"; "0"; "0"; "0";"16769944"; "16"; "0"; "0";"16"
|
||||||
"254"; "0";"TILE_WATER" ;"1708813"; "100";"1000"; "1"; "12"; "0"; "0"; "0"; "N/A"; "N/A"; "0";"16"
|
"254"; "0";"TILE_WATER" ;"1708813"; "100";"1000"; "1"; "12"; "0"; "0"; "0"; "N/A"; "N/A"; "0";"16"
|
||||||
"254"; "1";"TILE_WATER" ;"1708813"; "100";"1000"; "1"; "12"; "0"; "0"; "0"; "N/A"; "N/A"; "0";"16"
|
"254"; "1";"TILE_WATER" ;"1708813"; "100";"1000"; "1"; "12"; "0"; "0"; "0"; "N/A"; "N/A"; "0";"16"
|
||||||
"254"; "2";"TILE_WATER" ;"1708813"; "100";"1000"; "1"; "12"; "0"; "0"; "0"; "N/A"; "N/A"; "0";"16"
|
"254"; "2";"TILE_WATER" ;"1708813"; "100";"1000"; "1"; "12"; "0"; "0"; "0"; "N/A"; "N/A"; "0";"16"
|
||||||
|
|||||||
|
Can't render this file because it contains an unexpected character in line 1 and column 18.
|
@@ -137,14 +137,14 @@ class BasicDebugInfoWindow : UICanvas {
|
|||||||
// Hitbox
|
// Hitbox
|
||||||
val zoom = Terrarum.game.screenZoom
|
val zoom = Terrarum.game.screenZoom
|
||||||
g.setColor(Color(0x007f00))
|
g.setColor(Color(0x007f00))
|
||||||
g.drawRect(hitbox.getHitboxStart().getX() * zoom - MapCamera.cameraX * zoom
|
g.drawRect(hitbox.hitboxStart.x * zoom - MapCamera.cameraX * zoom
|
||||||
, hitbox.getHitboxStart().getY() * zoom - MapCamera.cameraY * zoom
|
, hitbox.hitboxStart.y * zoom - MapCamera.cameraY * zoom
|
||||||
, hitbox.getWidth() * zoom
|
, hitbox.width * zoom
|
||||||
, hitbox.getHeight() * zoom)
|
, hitbox.height * zoom)
|
||||||
// ...and its point
|
// ...and its point
|
||||||
g.fillRect(
|
g.fillRect(
|
||||||
(hitbox.getPointedX() - 1) * zoom - MapCamera.cameraX * zoom
|
(hitbox.pointedX - 1) * zoom - MapCamera.cameraX * zoom
|
||||||
, (hitbox.getPointedY() - 1) * zoom - MapCamera.cameraY * zoom
|
, (hitbox.pointedY - 1) * zoom - MapCamera.cameraY * zoom
|
||||||
, 3f, 3f)
|
, 3f, 3f)
|
||||||
g.drawString(
|
g.drawString(
|
||||||
Lang.get("DEV_COLOUR_LEGEND_GREEN") + " : hitbox", (Terrarum.WIDTH - 200).toFloat()
|
Lang.get("DEV_COLOUR_LEGEND_GREEN") + " : hitbox", (Terrarum.WIDTH - 200).toFloat()
|
||||||
@@ -152,14 +152,14 @@ class BasicDebugInfoWindow : UICanvas {
|
|||||||
|
|
||||||
// Next hitbox
|
// Next hitbox
|
||||||
g.setColor(Color.blue)
|
g.setColor(Color.blue)
|
||||||
g.drawRect(nextHitbox!!.getHitboxStart().getX() * zoom - MapCamera.cameraX * zoom
|
g.drawRect(nextHitbox!!.hitboxStart.x * zoom - MapCamera.cameraX * zoom
|
||||||
, nextHitbox.getHitboxStart().getY() * zoom - MapCamera.cameraY * zoom
|
, nextHitbox.hitboxStart.y * zoom - MapCamera.cameraY * zoom
|
||||||
, nextHitbox.getWidth() * zoom
|
, nextHitbox.width * zoom
|
||||||
, nextHitbox.getHeight() * zoom)
|
, nextHitbox.height * zoom)
|
||||||
// ...and its point
|
// ...and its point
|
||||||
g.fillRect(
|
g.fillRect(
|
||||||
(nextHitbox.getPointedX() - 1) * zoom - MapCamera.cameraX * zoom
|
(nextHitbox.pointedX - 1) * zoom - MapCamera.cameraX * zoom
|
||||||
, (nextHitbox.getPointedY() - 1) * zoom - MapCamera.cameraY * zoom
|
, (nextHitbox.pointedY - 1) * zoom - MapCamera.cameraY * zoom
|
||||||
, 3f, 3f)
|
, 3f, 3f)
|
||||||
g.drawString(
|
g.drawString(
|
||||||
Lang.get("DEV_COLOUR_LEGEND_BLUE") + " : nextHitbox", (Terrarum.WIDTH - 200).toFloat()
|
Lang.get("DEV_COLOUR_LEGEND_BLUE") + " : nextHitbox", (Terrarum.WIDTH - 200).toFloat()
|
||||||
|
|||||||
@@ -96,7 +96,10 @@ constructor(val UI: UICanvas) {
|
|||||||
UIGraphicInstance.font = Terrarum.gameFontWhite
|
UIGraphicInstance.font = Terrarum.gameFontWhite
|
||||||
|
|
||||||
UI.render(gc, UIGraphicInstance)
|
UI.render(gc, UIGraphicInstance)
|
||||||
gameGraphicInstance.drawImage(UIDrawnCanvas, posX + MapCamera.getCameraX() * Terrarum.game.screenZoom, posY + MapCamera.getCameraY() * Terrarum.game.screenZoom)// compensate for screenZoom AND camera translation
|
gameGraphicInstance.drawImage(UIDrawnCanvas,
|
||||||
|
posX + MapCamera.cameraX * Terrarum.game.screenZoom,
|
||||||
|
posY + MapCamera.cameraY * Terrarum.game.screenZoom
|
||||||
|
)// compensate for screenZoom AND camera translation
|
||||||
// (see Game.render -> g.translate())
|
// (see Game.render -> g.translate())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,281 +0,0 @@
|
|||||||
|
|
||||||
/* Original code author: Sean Laurvick
|
|
||||||
* This code is based on the original author's code written in Lua.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.Torvald.spriteAnimation;
|
|
||||||
|
|
||||||
import com.Torvald.Terrarum.Game;
|
|
||||||
import com.Torvald.Terrarum.Terrarum;
|
|
||||||
import com.jme3.math.FastMath;
|
|
||||||
import org.newdawn.slick.Graphics;
|
|
||||||
import org.newdawn.slick.Image;
|
|
||||||
import org.newdawn.slick.SlickException;
|
|
||||||
import org.newdawn.slick.SpriteSheet;
|
|
||||||
|
|
||||||
public class SpriteAnimation {
|
|
||||||
|
|
||||||
private SpriteSheet spriteImage;
|
|
||||||
private Image[][] sprites;
|
|
||||||
private int height;
|
|
||||||
private int width;
|
|
||||||
private int currentFrame = 1;
|
|
||||||
private int currentRow = 1;
|
|
||||||
private int nFrames;
|
|
||||||
private int nRows;
|
|
||||||
private int delay = 200;
|
|
||||||
private int delta = 0;
|
|
||||||
private boolean looping = true;
|
|
||||||
private boolean animationRunning = true;
|
|
||||||
private boolean flipHorizontal = false;
|
|
||||||
private boolean flipVertical = false;
|
|
||||||
private boolean visible = false;
|
|
||||||
|
|
||||||
private int offsetX = 0;
|
|
||||||
private int offsetY = 0;
|
|
||||||
|
|
||||||
private float prevScale = 1f;
|
|
||||||
private Image currentImage;
|
|
||||||
|
|
||||||
public SpriteAnimation() throws SlickException{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets spritesheet.
|
|
||||||
* MUST be called AFTER setDimension.
|
|
||||||
* @param imagePath path to the sprite sheet image.
|
|
||||||
* @throws SlickException
|
|
||||||
*/
|
|
||||||
public void setSpriteImage(String imagePath) throws SlickException {
|
|
||||||
spriteImage = new SpriteSheet(imagePath, this.width, this.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets animation delay. Will default to 200 if not called.
|
|
||||||
* @param delay in milliseconds
|
|
||||||
*/
|
|
||||||
public void setDelay(int delay) {
|
|
||||||
this.delay = delay;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets sprite dimension. This is necessary.
|
|
||||||
* @param w
|
|
||||||
* @param h
|
|
||||||
*/
|
|
||||||
public void setDimension(int w, int h) {
|
|
||||||
width = w;
|
|
||||||
height = h;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets sheet rows and animation frames. Will default to
|
|
||||||
* 1, 1 (still image of top left from the sheet) if not called.
|
|
||||||
* @param rows
|
|
||||||
* @param frames
|
|
||||||
*/
|
|
||||||
public void setRowsAndFrames(int rows, int frames) {
|
|
||||||
nRows = rows;
|
|
||||||
nFrames = frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compose (load from spritesheet) as attributes defined.
|
|
||||||
* If attributes were not defined, will throw exception of
|
|
||||||
* SlickException or ArraySizeException.
|
|
||||||
* @throws SlickException
|
|
||||||
*/
|
|
||||||
public void composeSprite() throws SlickException {
|
|
||||||
this.sprites = new Image[this.nRows][this.nFrames];
|
|
||||||
|
|
||||||
for (int i=0; i<this.nRows; i++){
|
|
||||||
for (int j=0; j<this.nFrames; j++){
|
|
||||||
this.sprites[i][j] = spriteImage.getSprite(j, i);
|
|
||||||
this.sprites[i][j].setFilter(Image.FILTER_LINEAR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAsVisible() {
|
|
||||||
visible = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAsInvisible() {
|
|
||||||
visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void update(int delta){
|
|
||||||
if (animationRunning){//skip this if animation is stopped
|
|
||||||
this.delta += delta;
|
|
||||||
|
|
||||||
//check if it's time to advance the frame
|
|
||||||
if ( this.delta >= ( this.delay ) ){
|
|
||||||
//if set to not loop, keep the frame at the last frame
|
|
||||||
if ( this.currentFrame == this.nFrames && !(this.looping) ){
|
|
||||||
this.currentFrame = this.nFrames - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//advance one frame, then reset delta counter
|
|
||||||
this.currentFrame = (this.currentFrame % this.nFrames) + 1;
|
|
||||||
this.delta = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render to specific coordinates. Will assume bottom-center point as image position.
|
|
||||||
* Will round to integer.
|
|
||||||
* @param g
|
|
||||||
* @param posX bottom-center point
|
|
||||||
* @param posY bottom-center point
|
|
||||||
* @param scale
|
|
||||||
*/
|
|
||||||
public void render(Graphics g, float posX, float posY, float scale){
|
|
||||||
scale *= Terrarum.game.getScreenZoom();
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
Image flippedImage = currentImage.getFlippedCopy(flipHorizontal, flipVertical);
|
|
||||||
|
|
||||||
flippedImage.startUse();
|
|
||||||
flippedImage.drawEmbedded(
|
|
||||||
Math.round(posX * Terrarum.game.getScreenZoom())
|
|
||||||
, Math.round(posY * Terrarum.game.getScreenZoom())
|
|
||||||
, FastMath.floor(width * scale)
|
|
||||||
, FastMath.floor(height * scale)
|
|
||||||
);
|
|
||||||
flippedImage.endUse();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void render(Graphics g, float posX, float posY){
|
|
||||||
render(g, posX, posY, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void switchSprite(int newRow){
|
|
||||||
currentRow = newRow;
|
|
||||||
|
|
||||||
//if beyond the frame index then reset
|
|
||||||
if (currentFrame > nFrames){
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void switchSprite(int newRow, int newMax){
|
|
||||||
if (newMax > 0){
|
|
||||||
nFrames = newMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
currentRow = newRow;
|
|
||||||
|
|
||||||
//if beyond the frame index then reset
|
|
||||||
if (currentFrame > nFrames){
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void switchSpriteDelay(int newDelay){
|
|
||||||
if (newDelay > 0){
|
|
||||||
delay = newDelay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void switchSprite(int newRow, int newMax, int newDelay){
|
|
||||||
if (newMax > 0){
|
|
||||||
nFrames = newMax;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newDelay > 0){
|
|
||||||
delay = newDelay;
|
|
||||||
}
|
|
||||||
|
|
||||||
currentRow = newRow;
|
|
||||||
|
|
||||||
//if beyond the frame index then reset
|
|
||||||
if (currentFrame > nFrames){
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reset(){
|
|
||||||
currentFrame = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void start(){ //starts the animation
|
|
||||||
animationRunning = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void start(int selectFrame){ //starts the animation
|
|
||||||
animationRunning = true;
|
|
||||||
|
|
||||||
//optional: seleft the frame no which to start the animation
|
|
||||||
currentFrame = selectFrame;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stop(){
|
|
||||||
animationRunning = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stop(int selectFrame){
|
|
||||||
animationRunning = false;
|
|
||||||
|
|
||||||
currentFrame = selectFrame;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void flip(boolean horizontal, boolean vertical){
|
|
||||||
flipHorizontal = horizontal;
|
|
||||||
flipVertical = vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean flippedHorizontal() {
|
|
||||||
return flipHorizontal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean flippedVertical() {
|
|
||||||
return flipVertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWidth(){
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHeight(){
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Image getScaledSprite(float scale) {
|
|
||||||
Image selectedImage = sprites[currentRow - 1][currentFrame - 1];
|
|
||||||
|
|
||||||
// resample
|
|
||||||
/*float nearestResampleScale = (scale > 1) ? Math.round(scale) : 1;
|
|
||||||
float linearResampleScale = scale / nearestResampleScale;
|
|
||||||
|
|
||||||
// scale 1.8 -> resample in 2(nearest), then resample in 0.9(linear)
|
|
||||||
// scale by nearestResampleScale (2, 3, ...)
|
|
||||||
selectedImage.setFilter(Image.FILTER_NEAREST);
|
|
||||||
Image selImgNearestScaled = selectedImage.getScaledCopy(nearestResampleScale);
|
|
||||||
// scale by linearResampleScale (.x)
|
|
||||||
Image selImgLinearScaled;
|
|
||||||
if (scale % 1 > 0) {
|
|
||||||
selImgNearestScaled.setFilter(Image.FILTER_LINEAR);
|
|
||||||
selImgLinearScaled = selImgNearestScaled.getScaledCopy(linearResampleScale);
|
|
||||||
return selImgLinearScaled;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return selImgNearestScaled;
|
|
||||||
}*/
|
|
||||||
selectedImage.setFilter(Image.FILTER_NEAREST);
|
|
||||||
return selectedImage.getScaledCopy(scale);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
261
src/com/Torvald/spriteAnimation/SpriteAnimation.kt
Normal file
261
src/com/Torvald/spriteAnimation/SpriteAnimation.kt
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
/* Original code author: Sean Laurvick
|
||||||
|
* This code is based on the original author's code written in Lua.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.Torvald.spriteAnimation
|
||||||
|
|
||||||
|
import com.Torvald.Terrarum.Game
|
||||||
|
import com.Torvald.Terrarum.Terrarum
|
||||||
|
import com.jme3.math.FastMath
|
||||||
|
import org.newdawn.slick.Graphics
|
||||||
|
import org.newdawn.slick.Image
|
||||||
|
import org.newdawn.slick.SlickException
|
||||||
|
import org.newdawn.slick.SpriteSheet
|
||||||
|
|
||||||
|
class SpriteAnimation @Throws(SlickException::class)
|
||||||
|
constructor() {
|
||||||
|
|
||||||
|
private var spriteImage: SpriteSheet? = null
|
||||||
|
var height: Int = 0
|
||||||
|
private set
|
||||||
|
var width: Int = 0
|
||||||
|
private set
|
||||||
|
private var currentFrame = 1
|
||||||
|
private var currentRow = 1
|
||||||
|
private var nFrames: Int = 0
|
||||||
|
private var nRows: Int = 0
|
||||||
|
private var delay = 200
|
||||||
|
private var delta = 0
|
||||||
|
private val looping = true
|
||||||
|
private var animationRunning = true
|
||||||
|
private var flipHorizontal = false
|
||||||
|
private var flipVertical = false
|
||||||
|
private var visible = false
|
||||||
|
|
||||||
|
private val offsetX = 0
|
||||||
|
private val offsetY = 0
|
||||||
|
|
||||||
|
private var prevScale = 1f
|
||||||
|
private var currentImage: Image? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets spritesheet.
|
||||||
|
* MUST be called AFTER setDimension.
|
||||||
|
* @param imagePath path to the sprite sheet image.
|
||||||
|
* *
|
||||||
|
* @throws SlickException
|
||||||
|
*/
|
||||||
|
@Throws(SlickException::class)
|
||||||
|
fun setSpriteImage(imagePath: String) {
|
||||||
|
spriteImage = SpriteSheet(imagePath, this.width, this.height)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets animation delay. Will default to 200 if not called.
|
||||||
|
* @param delay in milliseconds
|
||||||
|
*/
|
||||||
|
fun setDelay(delay: Int) {
|
||||||
|
this.delay = delay
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets sprite dimension. This is necessary.
|
||||||
|
* @param w
|
||||||
|
* *
|
||||||
|
* @param h
|
||||||
|
*/
|
||||||
|
fun setDimension(w: Int, h: Int) {
|
||||||
|
width = w
|
||||||
|
height = h
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets sheet rows and animation frames. Will default to
|
||||||
|
* 1, 1 (still image of top left from the sheet) if not called.
|
||||||
|
* @param rows
|
||||||
|
* *
|
||||||
|
* @param frames
|
||||||
|
*/
|
||||||
|
fun setRowsAndFrames(rows: Int, frames: Int) {
|
||||||
|
nRows = rows
|
||||||
|
nFrames = frames
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setAsVisible() {
|
||||||
|
visible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setAsInvisible() {
|
||||||
|
visible = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun update(delta: Int) {
|
||||||
|
if (animationRunning) {
|
||||||
|
//skip this if animation is stopped
|
||||||
|
this.delta += delta
|
||||||
|
|
||||||
|
//check if it's time to advance the frame
|
||||||
|
if (this.delta >= this.delay) {
|
||||||
|
//if set to not loop, keep the frame at the last frame
|
||||||
|
if (this.currentFrame == this.nFrames && !this.looping) {
|
||||||
|
this.currentFrame = this.nFrames - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
//advance one frame, then reset delta counter
|
||||||
|
this.currentFrame = this.currentFrame % this.nFrames + 1
|
||||||
|
this.delta = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render to specific coordinates. Will assume bottom-center point as image position.
|
||||||
|
* Will round to integer.
|
||||||
|
* @param g
|
||||||
|
* *
|
||||||
|
* @param posX bottom-center point
|
||||||
|
* *
|
||||||
|
* @param posY bottom-center point
|
||||||
|
* *
|
||||||
|
* @param scale
|
||||||
|
*/
|
||||||
|
@JvmOverloads fun render(g: Graphics, posX: Float, posY: Float, scale: Float = 1f) {
|
||||||
|
var scale = scale
|
||||||
|
scale *= Terrarum.game.screenZoom
|
||||||
|
|
||||||
|
// 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 flippedImage = currentImage!!.getFlippedCopy(flipHorizontal, flipVertical)
|
||||||
|
|
||||||
|
flippedImage.startUse()
|
||||||
|
flippedImage.drawEmbedded(
|
||||||
|
Math.round(posX * Terrarum.game.screenZoom).toFloat(),
|
||||||
|
Math.round(posY * Terrarum.game.screenZoom).toFloat(),
|
||||||
|
FastMath.floor(width * scale).toFloat(),
|
||||||
|
FastMath.floor(height * scale).toFloat()
|
||||||
|
)
|
||||||
|
flippedImage.endUse()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun switchSprite(newRow: Int) {
|
||||||
|
currentRow = newRow
|
||||||
|
|
||||||
|
//if beyond the frame index then reset
|
||||||
|
if (currentFrame > nFrames) {
|
||||||
|
reset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun switchSprite(newRow: Int, newMax: Int) {
|
||||||
|
if (newMax > 0) {
|
||||||
|
nFrames = newMax
|
||||||
|
}
|
||||||
|
|
||||||
|
currentRow = newRow
|
||||||
|
|
||||||
|
//if beyond the frame index then reset
|
||||||
|
if (currentFrame > nFrames) {
|
||||||
|
reset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun switchSpriteDelay(newDelay: Int) {
|
||||||
|
if (newDelay > 0) {
|
||||||
|
delay = newDelay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun switchSprite(newRow: Int, newMax: Int, newDelay: Int) {
|
||||||
|
if (newMax > 0) {
|
||||||
|
nFrames = newMax
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newDelay > 0) {
|
||||||
|
delay = newDelay
|
||||||
|
}
|
||||||
|
|
||||||
|
currentRow = newRow
|
||||||
|
|
||||||
|
//if beyond the frame index then reset
|
||||||
|
if (currentFrame > nFrames) {
|
||||||
|
reset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reset() {
|
||||||
|
currentFrame = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun start() {
|
||||||
|
//starts the animation
|
||||||
|
animationRunning = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun start(selectFrame: Int) {
|
||||||
|
//starts the animation
|
||||||
|
animationRunning = true
|
||||||
|
|
||||||
|
//optional: seleft the frame no which to start the animation
|
||||||
|
currentFrame = selectFrame
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stop() {
|
||||||
|
animationRunning = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stop(selectFrame: Int) {
|
||||||
|
animationRunning = false
|
||||||
|
|
||||||
|
currentFrame = selectFrame
|
||||||
|
}
|
||||||
|
|
||||||
|
fun flip(horizontal: Boolean, vertical: Boolean) {
|
||||||
|
flipHorizontal = horizontal
|
||||||
|
flipVertical = vertical
|
||||||
|
}
|
||||||
|
|
||||||
|
fun flippedHorizontal(): Boolean {
|
||||||
|
return flipHorizontal
|
||||||
|
}
|
||||||
|
|
||||||
|
fun flippedVertical(): Boolean {
|
||||||
|
return flipVertical
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getScaledSprite(scale: Float): Image {
|
||||||
|
val selectedImage = spriteImage!!.getSprite(currentFrame - 1, currentRow - 1)
|
||||||
|
//Image selectedImage = sprites[currentRow - 1][currentFrame - 1];
|
||||||
|
|
||||||
|
// resample
|
||||||
|
/*float nearestResampleScale = (scale > 1) ? Math.round(scale) : 1;
|
||||||
|
float linearResampleScale = scale / nearestResampleScale;
|
||||||
|
|
||||||
|
// scale 1.8 -> resample in 2(nearest), then resample in 0.9(linear)
|
||||||
|
// scale by nearestResampleScale (2, 3, ...)
|
||||||
|
selectedImage.setFilter(Image.FILTER_NEAREST);
|
||||||
|
Image selImgNearestScaled = selectedImage.getScaledCopy(nearestResampleScale);
|
||||||
|
// scale by linearResampleScale (.x)
|
||||||
|
Image selImgLinearScaled;
|
||||||
|
if (scale % 1 > 0) {
|
||||||
|
selImgNearestScaled.setFilter(Image.FILTER_LINEAR);
|
||||||
|
selImgLinearScaled = selImgNearestScaled.getScaledCopy(linearResampleScale);
|
||||||
|
return selImgLinearScaled;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return selImgNearestScaled;
|
||||||
|
}*/
|
||||||
|
selectedImage.filter = Image.FILTER_NEAREST
|
||||||
|
return selectedImage.getScaledCopy(scale)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user