new library commons-codec, authenticator for cheats, cyrillic support, unicode han logographic support, test for Actor that is 'Luminous', ascii punctuation kerning for Hangul

Former-commit-id: 1d083344abc3d6f08dfb252021c68f2a6cc7e068
Former-commit-id: 3b6dd15580a698bfe36b1dae24d6b2daeaf369c7
This commit is contained in:
Song Minjae
2016-02-20 02:22:16 +09:00
parent 0ce19ea6bd
commit b4c2108dc3
48 changed files with 415 additions and 114 deletions

View File

@@ -8,6 +8,8 @@
<root url="jar://$PROJECT_DIR$/lib/gson-2.5-javadoc.jar!/" />
<root url="file://$PROJECT_DIR$/lib/javadoc" />
<root url="file://$PROJECT_DIR$/lib/apidocs" />
<root url="jar://$PROJECT_DIR$/lib/commons-codec-1.10-javadoc.jar!/" />
<root url="https://commons.apache.org/proper/commons-csv/archives/1.1/apidocs/index.html" />
</JAVADOC>
<NATIVE>
<root url="file://$PROJECT_DIR$/lib/native" />

Binary file not shown.

BIN
lib/commons-codec-1.10.jar Normal file

Binary file not shown.

View File

@@ -21,7 +21,7 @@
"17";"TILE_ORE_NATURAL_GOLD" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "17"; "0";"16"
"18";"TILE_ORE_NATURAL_SILVER" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "18"; "0";"16"
"19";"TILE_ORE_RUTILE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "19"; "0";"16"
"20";"TILE_ORE_AURICHALCUMITE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "20"; "0";"16"
"20";"TILE_ORE_AURICHALCUMITE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "20"; "0";"16"
"21";"TILE_GEM_RUBY" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "21"; "0";"16"
"22";"TILE_GEM_EMERALD" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "22"; "0";"16"
"23";"TILE_GEM_SAPPHIRE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "23"; "0";"16"
Can't render this file because it contains an unexpected character in line 1 and column 12.

View File

@@ -3,10 +3,10 @@ Un royaume de solitude, ma place est là pour toujours
Der Wind, er heult so wie der Sturm ganz tief in mir
Het werd mij te veel, hoe ik mijn best ook deed
[han logographics not supported]
别让他们进来看见,做好女孩,就像妳的从前
Visa ingenting, vad du än gör, allt är förstört
ありの ままの すがた みせるのよ
ありのままの姿見せるのよ
Libre soy, libre soy, ¡libertad sin vuelta atrás!
Wszystkim wbrew na ten gest mnie stać
Jöjjön száz orkán, és közben a szívemen ül a jég
@@ -17,7 +17,7 @@ Non è un difetto, è una virtù! e non la fermerò mai più,
내 맘대로 자유롭게 살래!
Сад је крај, сад је крај На крилима ветра сам
[han logographics not supported]
誰亦要隨心講忘掉昨天悲歌
Estou aqui, e vou ficar! Venha a tempestade
Kuasaku buat hidup bercelaru

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

View File

@@ -222,7 +222,7 @@ TERM_PHYS_MASS=質量
##########
DEV_MEMORY_SHORT_CAP=メモリー
DEV_MEMORY_A_OF_B=%2$sM 中 %1$sM
DEV_MEMORY_A_OF_B=%2$sM%1$sM
DEV_COLOUR_LEGEND_GREEN=緑
DEV_COLOUR_LEGEND_BLUE=青
@@ -255,8 +255,8 @@ CREDITS_POLYGLOT=Translated by the Polyglot Project.
## Languages #
################
LANGUAGE_ENGLISH=えい ご
LANGUAGE_FRENCH=フランス ご
LANGUAGE_ENGLISH=英語
LANGUAGE_FRENCH=フランス
LANGUAGE_JAPANESE=日本語
LANGUAGE_JAPANESE_KANA=日本語・仮名
LANGUAGE_KOREAN=かんこく ご
LANGUAGE_KOREAN=韓国語

View File

@@ -17,16 +17,21 @@ public class GameFontBase implements Font {
static SpriteSheet extASheetEF;
static SpriteSheet kanaSheet;
static SpriteSheet cjkPunct;
static SpriteSheet uniHan;
static SpriteSheet cyrilic;
static SpriteSheet cyrilicEF;
static final int JUNG_COUNT = 21;
static final int JONG_COUNT = 28;
static final int W_CJK = 10;
static final int W_UNIHAN = 16;
static final int W_CJK_DRAW = 11;
static final int W_LATIN_WIDE = 9; // width of regular letters, including m
static final int W_LATIN_NARROW = 5; // width of letter f, t, i, l
static final int H = 20;
static final int H_HANGUL = 16;
static final int H_UNIHAN = 16;
static final int H_KANA = 20;
static final int SHEET_ASCII_EM = 0;
@@ -37,17 +42,24 @@ public class GameFontBase implements Font {
static final int SHEET_EXTA_EF = 5;
static final int SHEET_KANA = 6;
static final int SHEET_CJK_PUNCT = 7;
static final int SHEET_UNIHAN = 8;
static final int SHEET_CYRILIC_EM = 9;
static final int SHEET_CYRILIC_EF = 10;
static SpriteSheet[] sheetKey;
static final Character[] asciiEFList = {
' ','!','"','\'','(',')','I','[',']','`','f','i','j','l','t','{'
,'|','}',0xA1,'Ì','Í','Î','Ï','ì','í','î','ï','·'
' ','!','"','\'','(',')',',','.',':',';','I','[',']','`','f','i'
,'j','l','t','{','|','}',0xA1,'Ì','Í','Î','Ï','ì','í','î','ï','·'
};
static final Character[] extAEFList = {
0x12E, 0x12F, 0x130, 0x131, 0x135, 0x13A, 0x13C, 0x142, 0x163, 0x167, 0x17F
};
static final Character[] cyrilecEFList = {
0x406, 0x407, 0x456, 0x457, 0x458
};
/**
* Runic letters list used for game. The set is
* Younger Futhark + Medieval rune 'e' + Punct + Runic Almanac
@@ -111,6 +123,18 @@ public class GameFontBase implements Font {
return (c >= 0x3000 && c < 0x3040);
}
private boolean isUniHan(char c) {
return (c >= 0x3400 && c < 0xA000);
}
private boolean isCyrilic(char c) {
return (c >= 0x400 && c < 0x460);
}
private boolean isCyrilicEF(char c) {
return (Arrays.asList(cyrilecEFList).contains(c));
}
private int asciiEFindexX(char c) {
return (Arrays.asList(asciiEFList).indexOf(c) % 16);
}
@@ -151,18 +175,49 @@ public class GameFontBase implements Font {
return (c - 0x3000) / 16;
}
private int uniHanIndexX(char c) {
return (c - 0x3400) % 256;
}
private int uniHanIndexY(char c) {
return (c - 0x3400) / 256;
}
private int cyrilicIndexX(char c) {
return (c - 0x400) % 16;
}
private int cyrilicIndexY(char c) {
return (c - 0x400) / 16;
}
private int cyrilicEFindexX(char c) {
return (Arrays.asList(cyrilecEFList).indexOf(c) % 16);
}
private int cyrilicEFindexY(char c) {
return (Arrays.asList(cyrilecEFList).indexOf(c) / 16);
}
@Override
public int getWidth(String s) {
int len = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (getSheetType(c)) {
case SHEET_ASCII_EF:
len += W_LATIN_NARROW; break;
case SHEET_HANGUL: case SHEET_KANA: case SHEET_CJK_PUNCT:
case SHEET_KANA: case SHEET_CJK_PUNCT:
len += W_CJK_DRAW; break;
case SHEET_HANGUL:
len += W_CJK_DRAW;
break;
case SHEET_UNIHAN:
len += W_UNIHAN; break;
default:
len += W_LATIN_WIDE;
}
}
return len;
@@ -204,12 +259,31 @@ public class GameFontBase implements Font {
}
hangulSheet.endUse();
// unihan fonts
uniHan.startUse();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (isUniHan(ch)) {
uniHan.renderInUse(
Math.round(x
+ getWidth(s.substring(0, i))
)
, Math.round((H - H_HANGUL) / 2 + y)
, uniHanIndexX(ch)
, uniHanIndexY(ch)
);
}
}
uniHan.endUse();
//ascii fonts
int prevInstance = -1;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (!isHangul(ch)) {
if (!isHangul(ch) && !isUniHan(ch)) {
// if not init, enduse first
if (prevInstance != -1) {
@@ -245,6 +319,14 @@ public class GameFontBase implements Font {
sheetX = cjkPunctIndexX(ch);
sheetY = cjkPunctIndexY(ch);
break;
case SHEET_CYRILIC_EM:
sheetX = cyrilicIndexX(ch);
sheetY = cyrilicIndexY(ch);
break;
case SHEET_CYRILIC_EF:
sheetX = cyrilicEFindexX(ch);
sheetY = cyrilicEFindexY(ch);
break;
default:
sheetX = ch % 16;
sheetY = ch / 16;
@@ -253,9 +335,9 @@ public class GameFontBase implements Font {
try {
sheetKey[prevInstance].renderInUse(
Math.round(x
+ getWidth(s.substring(0, i))
)
Math.round(x + getWidth(s.substring(0, i)))
// pull punct right next to hangul to the left
+ ((i > 0 && isHangul(s.charAt(i - 1))) ? -2 : 0)
, Math.round(y)
- ((prevInstance == SHEET_CJK_PUNCT) ? 1 : 0)
, sheetX
@@ -263,11 +345,11 @@ public class GameFontBase implements Font {
);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("char: '" + ch + "' (" + String.valueOf((int) ch) + ")");
System.out.println("sheet: " + prevInstance);
System.out.println("sheetX: " + sheetX);
System.out.println("sheetY: " + sheetY);
e.printStackTrace();
// System.out.println("ArrayIndexOutOfBoundsException")
// System.out.println("char: '" + ch + "' (" + String.valueOf((int) ch) + ")");
// System.out.println("sheet: " + prevInstance);
// System.out.println("sheetX: " + sheetX);
// System.out.println("sheetY: " + sheetY);
}
}
@@ -279,14 +361,22 @@ public class GameFontBase implements Font {
}
private int getSheetType(char c) {
// EFs
if (isAsciiEF(c)) return SHEET_ASCII_EF;
else if (isHangul(c)) return SHEET_HANGUL;
else if (isRunic(c)) return SHEET_RUNIC;
else if (isExtA(c)) return SHEET_EXTA_EM;
else if (isExtAEF(c)) return SHEET_EXTA_EF;
else if (isCyrilicEF(c)) return SHEET_CYRILIC_EF;
// fixed width
else if (isRunic(c)) return SHEET_RUNIC;
else if (isHangul(c)) return SHEET_HANGUL;
else if (isKana(c)) return SHEET_KANA;
else if (isUniHan(c)) return SHEET_UNIHAN;
else if (isAscii(c)) return SHEET_ASCII_EM;
else if (isExtA(c)) return SHEET_EXTA_EM;
else if (isCyrilic(c)) return SHEET_CYRILIC_EM;
// fixed width punctuations
else if (isCJKPunct(c)) return SHEET_CJK_PUNCT;
else return SHEET_ASCII_EM;
else return SHEET_ASCII_EM; // fallback
}
@Override

View File

@@ -42,9 +42,21 @@ public class GameFontWhite extends GameFontBase {
"./res/graphics/fonts/cjkpunct.png"
, W_CJK, H_KANA
);
uniHan = new SpriteSheet(
"./res/graphics/fonts/unifont_unihan.png"
, W_UNIHAN, H_UNIHAN
);
cyrilic = new SpriteSheet(
"./res/graphics/fonts/cyrilic_majuscule.png"
, W_LATIN_WIDE, H
);
cyrilicEF = new SpriteSheet(
"./res/graphics/fonts/cyrilic_ef.png"
, W_LATIN_NARROW, H
);
SpriteSheet[] shk = {
asciiSheet
asciiSheet
, asciiSheetEF
, hangulSheet
, runicSheet
@@ -52,6 +64,9 @@ public class GameFontWhite extends GameFontBase {
, extASheetEF
, kanaSheet
, cjkPunct
, uniHan
, cyrilic
, cyrilicEF
};
sheetKey = shk;
}

View File

@@ -77,7 +77,7 @@ public class ActorWithBody implements Actor, Visible, Glowing {
private final int CONTACT_AREA_BOTTOM = 2;
private final int CONTACT_AREA_LEFT = 3;
private final int UD_COMPENSATOR_MAX = 100;
private final int UD_COMPENSATOR_MAX = TSIZE;
private final int LR_COMPENSATOR_MAX = TSIZE;
private final int TILE_CLIMB_RATE = 4;
@@ -155,17 +155,15 @@ public class ActorWithBody implements Actor, Visible, Glowing {
if (veloY > VELO_HARD_LIMIT) veloY = VELO_HARD_LIMIT;
// Set 'next' positions to fiddle with
if (!playerNoClip()) {
updateNextHitboxY();
updateVerticalPos();
clampNextHitbox();
updateHitboxY();
updateNextHitboxY();
updateVerticalPos();
clampNextHitbox();
updateHitboxY();
updateNextHitboxX();
updateHorizontalPos();
clampNextHitbox();
updateHitboxX();
}
updateNextHitboxX();
updateHorizontalPos();
clampNextHitbox();
updateHitboxX();
clampHitbox();
}
@@ -200,16 +198,18 @@ public class ActorWithBody implements Actor, Visible, Glowing {
}
private void updateVerticalPos() {
if (collidedBottomAndAdjusted()) {
grounded = true;
veloY = 0;
}
else {
grounded = false;
}
if (!playerNoClip()) {
if (collidedBottomAndAdjusted()) {
grounded = true;
veloY = 0;
}
else {
grounded = false;
}
if (collidedTopAndAdjusted()) {
veloY = 0;
if (collidedTopAndAdjusted()) {
veloY = 0;
}
}
}
@@ -254,20 +254,22 @@ public class ActorWithBody implements Actor, Visible, Glowing {
}
private void updateHorizontalPos() {
if (collidedRightAndAdjusted()) { // treat as 'event--collided right'
veloX = 0;
walledRight = true;
if (!playerNoClip()) {
if (collidedRightAndAdjusted()) { // treat as 'event--collided right'
veloX = 0;
walledRight = true;
// TODO remove above two lines and implement tile climb (multi-frame calculation.)
// Use variable TILE_CLIMB_RATE
}
else if (collidedLeftAndAdjusted()) { // treat as 'event--collided left'
veloX = 0;
walledLeft = true;
}
else {
walledRight = false;
walledLeft = false;
// TODO remove above two lines and implement tile climb (multi-frame calculation.)
// Use variable TILE_CLIMB_RATE
}
else if (collidedLeftAndAdjusted()) { // treat as 'event--collided left'
veloX = 0;
walledLeft = true;
}
else {
walledRight = false;
walledLeft = false;
}
}
}

View File

@@ -0,0 +1,11 @@
package com.Torvald.Terrarum.Actors;
/**
* Created by minjaesong on 16-02-19.
*/
public interface Luminous {
void setLuminance(int RGB);
int getLuminance();
}

View File

@@ -62,7 +62,7 @@ public class PBFSigrid {
p.actorValue.set("intelligent", true);
p.setHitboxDimension(17, 47, 9, 0);
p.setHitboxDimension(17, 46, 9, 0);
p.inventory = new ActorInventory(0x7FFFFFFF, true);

View File

@@ -3,6 +3,9 @@ package com.Torvald.Terrarum.Actors;
import com.Torvald.Terrarum.Actors.Faction.Faction;
import com.Torvald.Terrarum.GameControl.EnumKeyFunc;
import com.Torvald.Terrarum.GameControl.KeyMap;
import com.Torvald.Terrarum.MapDrawer.LightmapRenderer;
import com.Torvald.Terrarum.MapDrawer.MapCamera;
import com.Torvald.Terrarum.MapDrawer.MapDrawer;
import com.Torvald.Terrarum.Terrarum;
import com.Torvald.spriteAnimation.SpriteAnimation;
import com.jme3.math.FastMath;
@@ -18,7 +21,7 @@ import java.util.HashSet;
/**
* Created by minjaesong on 15-12-31.
*/
public class Player extends ActorWithBody implements Controllable, Pocketed, Factionable {
public class Player extends ActorWithBody implements Controllable, Pocketed, Factionable, Luminous {
@Nullable public Controllable vehicleRiding;
@@ -50,6 +53,10 @@ public class Player extends ActorWithBody implements Controllable, Pocketed, Fac
private final float AXIS_POSMAX = 1.0f;
private final int GAMEPAD_JUMP = 5;
private final int TSIZE = MapDrawer.TILE_SIZE;
private int LUMINANCE_RGB = 0xFFFFFF;
private HashSet<Faction> factionSet = new HashSet<>();
/**
@@ -78,6 +85,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed, Fac
updateMovementControl();
if (noClip) { super.setGrounded(true); }
}
private void updatePhysicalInfos() {
@@ -536,4 +545,14 @@ public class Player extends ActorWithBody implements Controllable, Pocketed, Fac
public void clearFactionAssigning() {
factionSet.clear();
}
@Override
public void setLuminance(int RGB) {
LUMINANCE_RGB = RGB;
}
@Override
public int getLuminance() {
return LUMINANCE_RGB;
}
}

View File

@@ -0,0 +1,44 @@
package com.Torvald.Terrarum.ConsoleCommand;
import com.Torvald.Terrarum.Terrarum;
import com.Torvald.Terrarum.UserInterface.ConsoleWindow;
import org.apache.commons.codec.digest.DigestUtils;
import org.newdawn.slick.SlickException;
/**
* Created by minjaesong on 16-02-19.
*/
public class Authenticator implements ConsoleCommand {
private static final String A = "0d34076fc15db1b7c7a0943045699eba6f186ec1"; // alpine
// or 'srisrimahasri'
private static boolean B = false;
@Override
public void execute(String[] args) {
if (args.length == 2) {
String pwd = args[1];
String hashedPwd = DigestUtils.sha1Hex(pwd);
if (A.equalsIgnoreCase(hashedPwd)) {
new Echo().execute(((B) ? "Dis" : "") + "authenticated.");
B = !B;
((ConsoleWindow) (Terrarum.game.consoleHandler.getUI())).reset();
}
}
else {
printUsage();
}
}
public boolean C() {
return B;
}
@Override
public void printUsage() {
CommandInterpreter.echoUnknownCmd("auth");
}
}

View File

@@ -1,6 +1,7 @@
package com.Torvald.Terrarum.ConsoleCommand;
import com.Torvald.Terrarum.LangPack.Lang;
import com.Torvald.Terrarum.Terrarum;
import java.util.ArrayList;
import java.util.Formatter;
@@ -17,18 +18,28 @@ public class CommandInterpreter {
for (CommandInput single_command : cmd) {
try {
ConsoleCommand commandObj = CommandDict.getCommand(single_command.getName().toLowerCase());
commandObj.execute(single_command.toStringArray());
if (single_command.getName().equalsIgnoreCase("auth")) {
Terrarum.game.auth.execute(single_command.toStringArray());
}
else if (single_command.getName().equalsIgnoreCase("qqq")) {
new QuitApp().execute(single_command.toStringArray());
}
else if (single_command.getName().equalsIgnoreCase("zoom")) {
new Zoom().execute(single_command.toStringArray());
}
else {
if (Terrarum.game.auth.C()) {
ConsoleCommand commandObj = CommandDict.getCommand(
single_command.getName().toLowerCase());
commandObj.execute(single_command.toStringArray());
}
else {
throw new NullPointerException(); // if not authorised, say "Unknown command"
}
}
}
catch (NullPointerException e) {
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
new Echo().execute(
formatter.format(Lang.get("DEV_MESSAGE_CONSOLE_COMMAND_UNKNOWN")
, single_command.getName()
).toString()
);
echoUnknownCmd(single_command.getName());
}
}
}
@@ -64,6 +75,17 @@ public class CommandInterpreter {
return parsedCommands;
}
static void echoUnknownCmd(String cmdname) {
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
new Echo().execute(
formatter.format(Lang.get("DEV_MESSAGE_CONSOLE_COMMAND_UNKNOWN")
, cmdname
).toString()
);
}
}
class CommandInput {

View File

@@ -7,7 +7,7 @@ public class QuitApp implements ConsoleCommand {
@Override
public void execute(String[] args) {
System.exit(0);
System.exit(1);
}
@Override

View File

@@ -1,6 +1,7 @@
package com.Torvald.Terrarum;
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;
@@ -61,6 +62,8 @@ public class Game extends BasicGameState {
private Shader shaderBlurH;
private Shader shaderBlurV;
public static Authenticator auth = new Authenticator();
public Game() throws SlickException { }
@Override

View File

@@ -45,9 +45,21 @@ public class LightmapRenderer {
}
public static void addLantern(int x, int y, LightmapLantern lantern) {
// TODO check for duplicates
lanterns.add(lantern);
public static void addLantern(int x, int y, int intensity) {
LightmapLantern thisLantern = new LightmapLantern(x, y, intensity);
for (int i = lanterns.size() - 1; i >= 0; i--) {
LightmapLantern lanternInList = lanterns.get(i);
// found duplicates
if (lanternInList.getX() == x && lanternInList.getY() == y) {
// add colour
int addedL = addRaw(intensity, lanternInList.getIntensity());
lanternInList.intensity = addedL;
return;
}
}
//else
lanterns.add(thisLantern);
}
public static void removeLantern(int x, int y) {
@@ -260,6 +272,18 @@ public class LightmapRenderer {
}
}
// mix actor Luminous
// test player TODO for all actor.Luminous in the game
int tileX = Math.round(Terrarum.game.getPlayer().getHitbox().getPointedX() / TSIZE);
int tileY = Math.round(Terrarum.game.getPlayer().getHitbox().getPointedY() / TSIZE)
- 1;
int lum = Terrarum.game.getPlayer().getLuminance();
if (x == tileX && y == tileY) {
lightColorR = getR(lum);
lightColorG = getG(lum);
lightColorB = getB(lum);
}
float[] bgrVal = new float[3]; // {B, G, R}
// test for each R, G, B channel
@@ -375,7 +399,15 @@ public class LightmapRenderer {
return getRawB(rgb) / 255f;
}
private static int constructRGBFromFloat(int r, int g, int b) {
private static int addRaw(int rgb1, int rgb2) {
int newR = clampByte(getRawR(rgb1) + getRawB(rgb2));
int newG = clampByte(getRawG(rgb1) + getRawG(rgb2));
int newB = clampByte(getRawB(rgb1) + getRawB(rgb2));
return constructRGBFromInt(newR, newG, newB);
}
private static int constructRGBFromInt(int r, int g, int b) {
if (r < 0 || r > 0xFF) { throw new IllegalArgumentException("Red: out of range"); }
if (g < 0 || g > 0xFF) { throw new IllegalArgumentException("Green: out of range"); }
if (b < 0 || b > 0xFF) { throw new IllegalArgumentException("Blue: out of range"); }
@@ -391,14 +423,14 @@ public class LightmapRenderer {
int intG = Math.round(g * 0xFF);
int intB = Math.round(b * 0xFF);
return constructRGBFromFloat(intR, intG, intB);
return constructRGBFromInt(intR, intG, intB);
}
private static int colourLinearMix(int colA, int colB) {
int r = (getRawR(colA) + getRawR(colB)) >> 1;
int g = (getRawG(colA) + getRawG(colB)) >> 1;
int b = (getRawB(colA) + getRawB(colB)) >> 1;
return constructRGBFromFloat(r, g, b);
return constructRGBFromInt(r, g, b);
}
/**
@@ -417,7 +449,7 @@ public class LightmapRenderer {
int bSide = max(getRawG(side1), getRawG(side2), getRawG(corner) / 2);
int b = arithmeticAverage(bSide, getRawG(thisTile));
return constructRGBFromFloat(r, g, b);
return constructRGBFromInt(r, g, b);
}
private static int quantise16(int x) {
@@ -454,13 +486,15 @@ public class LightmapRenderer {
}
private static int clampZero(int i) {
if (i < 0) return 0;
else return i;
return (i < 0) ? 0 : i;
}
private static float clampZero(float i) {
if (i < 0) return 0;
else return i;
return (i < 0) ? 0 : i;
}
private static int clampByte(int i) {
return (i < 0) ? 0 : (i > 0xFF) ? 0xFF : i;
}
public static int[][] getStaticLightMap() {

View File

@@ -125,6 +125,14 @@ public class MapGenerator {
, "Carving out cave..."
);
fillByMapNoFilterUnderground(
generate2DSimplexNoiseWorldSize(1f, 1f)
, 0.9f
, AIR
, STONE
, "Collapsing caves..."
);
/*fillByMapInverseGradFilter(
generate2DSimplexNoiseWorldSize(2.5f, 2.5f)
, 1.02f
@@ -223,9 +231,9 @@ public class MapGenerator {
float[][] noiseMap = new float[height][width];
SimplexNoise simplexNoise = new SimplexNoise(CAVEGEN_LARGEST_FEATURE, CAVEGEN_PERTURB_RATE
, 0x51621D);
, seed);
SimplexNoise simplexNoisePerturbMap = new SimplexNoise(CAVEGEN_LARGEST_FEATURE_PERTURB, 0.5f
, 0x51621D ^ random.nextLong());
, seed ^ random.nextLong());
float xEnd=width * yStretch;
float yEnd=height * xStretch;
@@ -293,8 +301,11 @@ public class MapGenerator {
/** higher = denser.
* Recommended: (width or height) * 3
*/
float xEnd=height * yStretch;
float yEnd=width * xStretch;
float xEnd=width * yStretch;
float yEnd=height * xStretch;
float lowestNoiseVal = 10000f;
float highestNoiseVal = -10000f;
float[][] result=new float[sizeY][sizeX];
@@ -302,22 +313,31 @@ public class MapGenerator {
for(int j=0;j<sizeX;j++){
int x=(int)(xStart+i*((xEnd-xStart)/sizeX));
int y=(int)(yStart+j*((yEnd-yStart)/sizeY));
result[i][j]=(float) (0.5*(1+simplexNoise.getNoise(x,y)));
float noiseValue = (float) (0.5*(1+simplexNoise.getNoise(x,y)));
if (noiseValue < lowestNoiseVal) lowestNoiseVal = noiseValue;
if (noiseValue > highestNoiseVal) highestNoiseVal = noiseValue;
result[i][j] = noiseValue;
}
}
// Auto-scaling noise
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
float noiseInit = result[y][x] - lowestNoiseVal;
float noiseFin = noiseInit * (1f / (highestNoiseVal - lowestNoiseVal));
result[y][x] = noiseFin;
}
}
return result;
}
private static float[] generateWhiteNoiseArray(long seed) {
float[] noiseArray = new float[MapGenerator.width + 1];
for (int i = 0; i < noiseArray.length; i++) {
noiseArray[i] = random.nextFloat();
}
return noiseArray;
}
private static int[] generateOcean(int[] noiseArrayLocal) {
int oceanLeftP1 = noiseArrayLocal[OCEAN_WIDTH];
int oceanRightP1 = noiseArrayLocal[noiseArrayLocal.length - OCEAN_WIDTH];
@@ -557,7 +577,8 @@ public class MapGenerator {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (map[i][j] > gradientQuadratic(i, noiseGradientStart, noiseGrdCaveEnd) / scarcity) {
if (map[i][j] > gradientQuadratic(i, noiseGradientStart, noiseGrdCaveEnd) *
scarcity) {
MapGenerator.map.getTerrainArray()[i][j] = tile;
}
}
@@ -577,7 +598,7 @@ public class MapGenerator {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (map[i][j] > getNoiseGradient(i, noiseGradientStart, noiseGradientEnd) / scarcity
if (map[i][j] > getNoiseGradient(i, noiseGradientStart, noiseGradientEnd) * scarcity
&& MapGenerator.map.getTileFromTerrain(j, i) == replaceFrom) {
MapGenerator.map.getTerrainArray()[i][j] = tile;
}
@@ -598,7 +619,8 @@ public class MapGenerator {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (map[i][j] > getNoiseGradientInversed(i, noiseGradientEnd, noiseGradientStart) / scarcity
if (map[i][j] > getNoiseGradientInversed(i, noiseGradientEnd, noiseGradientStart)
* scarcity
&& MapGenerator.map.getTileFromTerrain(j, i) == replaceFrom) {
MapGenerator.map.getTerrainArray()[i][j] = tile;
}
@@ -621,7 +643,7 @@ public class MapGenerator {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (map[i][j] > noiseGradientStart / scarcity
if (map[i][j] > noiseGradientStart * scarcity
&& MapGenerator.map.getTileFromTerrain(j, i) == replaceFrom) {
MapGenerator.map.getTerrainArray()[i][j] = tile;
}
@@ -629,12 +651,27 @@ public class MapGenerator {
}
}
private static void fillByMapNoFilterUnderground(float[][] map, float scarcity, byte replaceFrom, byte
tile, String message) {
System.out.println("[MapGenerator] " + message);
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (map[i][j] > noiseGradientStart * scarcity
&& MapGenerator.map.getTileFromTerrain(j, i) == replaceFrom
&& MapGenerator.map.getTileFromWall(j, i) == STONE) {
MapGenerator.map.getTerrainArray()[i][j] = tile;
}
}
}
}
private static void fillByMap(float[][] map, float scarcity, byte replaceFrom, byte[] tile, String message) {
System.out.println("[MapGenerator] " + message);
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (map[i][j] > getNoiseGradient(i, noiseGradientStart, noiseGradientEnd) / scarcity
if (map[i][j] > getNoiseGradient(i, noiseGradientStart, noiseGradientEnd) * scarcity
&& MapGenerator.map.getTileFromTerrain(j, i) == replaceFrom) {
MapGenerator.map.getTerrainArray()[i][j]
= tile[random.nextInt(tile.length)];

View File

@@ -6,6 +6,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import com.Torvald.ImageFont.GameFontWhite;
import com.Torvald.Terrarum.ConsoleCommand.Authenticator;
import com.Torvald.Terrarum.LangPack.Lang;
import org.lwjgl.input.Controllers;
import org.newdawn.slick.*;
@@ -41,7 +42,7 @@ public class Terrarum extends StateBasedGame {
public static String defaultDir;
public static String defaultSaveDir;
public static String gameLocale = "jp_kana";
public static String gameLocale = "ko";
public static Font gameFontWhite;

View File

@@ -21,7 +21,7 @@
"17";"TILE_ORE_NATURAL_GOLD" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "17"; "0";"16"
"18";"TILE_ORE_NATURAL_SILVER" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "18"; "0";"16"
"19";"TILE_ORE_RUTILE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "19"; "0";"16"
"20";"TILE_ORE_AURICHALCUMITE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "20"; "0";"16"
"20";"TILE_ORE_AURICHALCUMITE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "20"; "0";"16"
"21";"TILE_GEM_RUBY" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "21"; "0";"16"
"22";"TILE_GEM_EMERALD" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "22"; "0";"16"
"23";"TILE_GEM_SAPPHIRE" ; "32"; "25"; "0"; "N/A"; "1"; "0"; "0"; "23"; "0";"16"
Can't render this file because it contains an unexpected character in line 1 and column 12.

View File

@@ -16,15 +16,15 @@ public class ConsoleWindow implements UICanvas {
Color UIColour = new Color(0x90000000);
private StringBuffer commandInputPool = new StringBuffer();
private String prevCommand = "";
private StringBuffer commandInputPool;
private String prevCommand;
private int inputCursorPos = 0;
private int inputCursorPos;
private final int MESSAGES_MAX = 5000;
private String[] messages = new String[MESSAGES_MAX];
private int messageDisplayPos = 0;
private int messagesCount = 0;
private String[] messages;
private int messageDisplayPos;
private int messagesCount;
private final int LINE_HEIGHT = 20;
private final int MESSAGES_DISPLAY_COUNT = 9;
@@ -34,11 +34,7 @@ public class ConsoleWindow implements UICanvas {
public ConsoleWindow() {
super();
width = Terrarum.WIDTH;
height = 200;
sendMessage(Lang.get("DEV_MESSAGE_CONSOLE_CODEX"));
reset();
}
@Override
@@ -182,6 +178,20 @@ public class ConsoleWindow implements UICanvas {
}
public void reset() {
width = Terrarum.WIDTH;
height = 200;
messages = new String[MESSAGES_MAX];
messageDisplayPos = 0;
messagesCount = 0;
inputCursorPos = 0;
prevCommand = "";
commandInputPool = new StringBuffer();
if (Terrarum.game.auth.C()) sendMessage(Lang.get("DEV_MESSAGE_CONSOLE_CODEX"));
}
@Override
public int getWidth() {
return width;

View File

@@ -0,0 +1,11 @@
== Shutdown codes
bit 0 0 0 0 0 0 0 0
index 8 7 6 5 4 3 2 1
all zero: nominal
1: exit by console command 'qqq'
8: erratic, reserved by Java