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

@@ -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;