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="jar://$PROJECT_DIR$/lib/gson-2.5-javadoc.jar!/" />
<root url="file://$PROJECT_DIR$/lib/javadoc" /> <root url="file://$PROJECT_DIR$/lib/javadoc" />
<root url="file://$PROJECT_DIR$/lib/apidocs" /> <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> </JAVADOC>
<NATIVE> <NATIVE>
<root url="file://$PROJECT_DIR$/lib/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" "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" "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" "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" "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" "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" "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 Der Wind, er heult so wie der Sturm ganz tief in mir
Het werd mij te veel, hoe ik mijn best ook deed 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 Visa ingenting, vad du än gör, allt är förstört
ありの ままの すがた みせるのよ ありのままの姿見せるのよ
Libre soy, libre soy, ¡libertad sin vuelta atrás! Libre soy, libre soy, ¡libertad sin vuelta atrás!
Wszystkim wbrew na ten gest mnie stać Wszystkim wbrew na ten gest mnie stać
Jöjjön száz orkán, és közben a szívemen ül a jég 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 Estou aqui, e vou ficar! Venha a tempestade
Kuasaku buat hidup bercelaru 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_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_GREEN=緑
DEV_COLOUR_LEGEND_BLUE=青 DEV_COLOUR_LEGEND_BLUE=青
@@ -255,8 +255,8 @@ CREDITS_POLYGLOT=Translated by the Polyglot Project.
## Languages # ## Languages #
################ ################
LANGUAGE_ENGLISH=えい ご LANGUAGE_ENGLISH=英語
LANGUAGE_FRENCH=フランス ご LANGUAGE_FRENCH=フランス
LANGUAGE_JAPANESE=日本語 LANGUAGE_JAPANESE=日本語
LANGUAGE_JAPANESE_KANA=日本語・仮名 LANGUAGE_JAPANESE_KANA=日本語・仮名
LANGUAGE_KOREAN=かんこく ご LANGUAGE_KOREAN=韓国語

View File

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

View File

@@ -42,9 +42,21 @@ public class GameFontWhite extends GameFontBase {
"./res/graphics/fonts/cjkpunct.png" "./res/graphics/fonts/cjkpunct.png"
, W_CJK, H_KANA , 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 = { SpriteSheet[] shk = {
asciiSheet asciiSheet
, asciiSheetEF , asciiSheetEF
, hangulSheet , hangulSheet
, runicSheet , runicSheet
@@ -52,6 +64,9 @@ public class GameFontWhite extends GameFontBase {
, extASheetEF , extASheetEF
, kanaSheet , kanaSheet
, cjkPunct , cjkPunct
, uniHan
, cyrilic
, cyrilicEF
}; };
sheetKey = shk; 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_BOTTOM = 2;
private final int CONTACT_AREA_LEFT = 3; 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 LR_COMPENSATOR_MAX = TSIZE;
private final int TILE_CLIMB_RATE = 4; 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; if (veloY > VELO_HARD_LIMIT) veloY = VELO_HARD_LIMIT;
// Set 'next' positions to fiddle with // Set 'next' positions to fiddle with
if (!playerNoClip()) { updateNextHitboxY();
updateNextHitboxY(); updateVerticalPos();
updateVerticalPos(); clampNextHitbox();
clampNextHitbox(); updateHitboxY();
updateHitboxY();
updateNextHitboxX(); updateNextHitboxX();
updateHorizontalPos(); updateHorizontalPos();
clampNextHitbox(); clampNextHitbox();
updateHitboxX(); updateHitboxX();
}
clampHitbox(); clampHitbox();
} }
@@ -200,16 +198,18 @@ public class ActorWithBody implements Actor, Visible, Glowing {
} }
private void updateVerticalPos() { private void updateVerticalPos() {
if (collidedBottomAndAdjusted()) { if (!playerNoClip()) {
grounded = true; if (collidedBottomAndAdjusted()) {
veloY = 0; grounded = true;
} veloY = 0;
else { }
grounded = false; else {
} grounded = false;
}
if (collidedTopAndAdjusted()) { if (collidedTopAndAdjusted()) {
veloY = 0; veloY = 0;
}
} }
} }
@@ -254,20 +254,22 @@ public class ActorWithBody implements Actor, Visible, Glowing {
} }
private void updateHorizontalPos() { private void updateHorizontalPos() {
if (collidedRightAndAdjusted()) { // treat as 'event--collided right' if (!playerNoClip()) {
veloX = 0; if (collidedRightAndAdjusted()) { // treat as 'event--collided right'
walledRight = true; veloX = 0;
walledRight = true;
// TODO remove above two lines and implement tile climb (multi-frame calculation.) // TODO remove above two lines and implement tile climb (multi-frame calculation.)
// Use variable TILE_CLIMB_RATE // Use variable TILE_CLIMB_RATE
} }
else if (collidedLeftAndAdjusted()) { // treat as 'event--collided left' else if (collidedLeftAndAdjusted()) { // treat as 'event--collided left'
veloX = 0; veloX = 0;
walledLeft = true; walledLeft = true;
} }
else { else {
walledRight = false; walledRight = false;
walledLeft = 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.actorValue.set("intelligent", true);
p.setHitboxDimension(17, 47, 9, 0); p.setHitboxDimension(17, 46, 9, 0);
p.inventory = new ActorInventory(0x7FFFFFFF, true); 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.Actors.Faction.Faction;
import com.Torvald.Terrarum.GameControl.EnumKeyFunc; import com.Torvald.Terrarum.GameControl.EnumKeyFunc;
import com.Torvald.Terrarum.GameControl.KeyMap; 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.Terrarum.Terrarum;
import com.Torvald.spriteAnimation.SpriteAnimation; import com.Torvald.spriteAnimation.SpriteAnimation;
import com.jme3.math.FastMath; import com.jme3.math.FastMath;
@@ -18,7 +21,7 @@ import java.util.HashSet;
/** /**
* Created by minjaesong on 15-12-31. * 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; @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 float AXIS_POSMAX = 1.0f;
private final int GAMEPAD_JUMP = 5; private final int GAMEPAD_JUMP = 5;
private final int TSIZE = MapDrawer.TILE_SIZE;
private int LUMINANCE_RGB = 0xFFFFFF;
private HashSet<Faction> factionSet = new HashSet<>(); private HashSet<Faction> factionSet = new HashSet<>();
/** /**
@@ -78,6 +85,8 @@ public class Player extends ActorWithBody implements Controllable, Pocketed, Fac
updateMovementControl(); updateMovementControl();
if (noClip) { super.setGrounded(true); } if (noClip) { super.setGrounded(true); }
} }
private void updatePhysicalInfos() { private void updatePhysicalInfos() {
@@ -536,4 +545,14 @@ public class Player extends ActorWithBody implements Controllable, Pocketed, Fac
public void clearFactionAssigning() { public void clearFactionAssigning() {
factionSet.clear(); 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; package com.Torvald.Terrarum.ConsoleCommand;
import com.Torvald.Terrarum.LangPack.Lang; import com.Torvald.Terrarum.LangPack.Lang;
import com.Torvald.Terrarum.Terrarum;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Formatter; import java.util.Formatter;
@@ -17,18 +18,28 @@ public class CommandInterpreter {
for (CommandInput single_command : cmd) { for (CommandInput single_command : cmd) {
try { try {
ConsoleCommand commandObj = CommandDict.getCommand(single_command.getName().toLowerCase()); if (single_command.getName().equalsIgnoreCase("auth")) {
commandObj.execute(single_command.toStringArray()); 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) { catch (NullPointerException e) {
StringBuilder sb = new StringBuilder(); echoUnknownCmd(single_command.getName());
Formatter formatter = new Formatter(sb);
new Echo().execute(
formatter.format(Lang.get("DEV_MESSAGE_CONSOLE_COMMAND_UNKNOWN")
, single_command.getName()
).toString()
);
} }
} }
} }
@@ -64,6 +75,17 @@ public class CommandInterpreter {
return parsedCommands; 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 { class CommandInput {

View File

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

View File

@@ -1,6 +1,7 @@
package com.Torvald.Terrarum; package com.Torvald.Terrarum;
import com.Torvald.Terrarum.Actors.*; import com.Torvald.Terrarum.Actors.*;
import com.Torvald.Terrarum.ConsoleCommand.Authenticator;
import com.Torvald.Terrarum.ConsoleCommand.CommandDict; import com.Torvald.Terrarum.ConsoleCommand.CommandDict;
import com.Torvald.Terrarum.GameControl.GameController; import com.Torvald.Terrarum.GameControl.GameController;
import com.Torvald.Terrarum.GameControl.KeyMap; import com.Torvald.Terrarum.GameControl.KeyMap;
@@ -61,6 +62,8 @@ public class Game extends BasicGameState {
private Shader shaderBlurH; private Shader shaderBlurH;
private Shader shaderBlurV; private Shader shaderBlurV;
public static Authenticator auth = new Authenticator();
public Game() throws SlickException { } public Game() throws SlickException { }
@Override @Override

View File

@@ -45,9 +45,21 @@ public class LightmapRenderer {
} }
public static void addLantern(int x, int y, LightmapLantern lantern) { public static void addLantern(int x, int y, int intensity) {
// TODO check for duplicates LightmapLantern thisLantern = new LightmapLantern(x, y, intensity);
lanterns.add(lantern);
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) { 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} float[] bgrVal = new float[3]; // {B, G, R}
// test for each R, G, B channel // test for each R, G, B channel
@@ -375,7 +399,15 @@ public class LightmapRenderer {
return getRawB(rgb) / 255f; 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 (r < 0 || r > 0xFF) { throw new IllegalArgumentException("Red: out of range"); }
if (g < 0 || g > 0xFF) { throw new IllegalArgumentException("Green: 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"); } 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 intG = Math.round(g * 0xFF);
int intB = Math.round(b * 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) { private static int colourLinearMix(int colA, int colB) {
int r = (getRawR(colA) + getRawR(colB)) >> 1; int r = (getRawR(colA) + getRawR(colB)) >> 1;
int g = (getRawG(colA) + getRawG(colB)) >> 1; int g = (getRawG(colA) + getRawG(colB)) >> 1;
int b = (getRawB(colA) + getRawB(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 bSide = max(getRawG(side1), getRawG(side2), getRawG(corner) / 2);
int b = arithmeticAverage(bSide, getRawG(thisTile)); int b = arithmeticAverage(bSide, getRawG(thisTile));
return constructRGBFromFloat(r, g, b); return constructRGBFromInt(r, g, b);
} }
private static int quantise16(int x) { private static int quantise16(int x) {
@@ -454,13 +486,15 @@ public class LightmapRenderer {
} }
private static int clampZero(int i) { private static int clampZero(int i) {
if (i < 0) return 0; return (i < 0) ? 0 : i;
else return i;
} }
private static float clampZero(float i) { private static float clampZero(float i) {
if (i < 0) return 0; return (i < 0) ? 0 : i;
else return i; }
private static int clampByte(int i) {
return (i < 0) ? 0 : (i > 0xFF) ? 0xFF : i;
} }
public static int[][] getStaticLightMap() { public static int[][] getStaticLightMap() {

View File

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

View File

@@ -6,6 +6,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.Torvald.ImageFont.GameFontWhite; import com.Torvald.ImageFont.GameFontWhite;
import com.Torvald.Terrarum.ConsoleCommand.Authenticator;
import com.Torvald.Terrarum.LangPack.Lang; import com.Torvald.Terrarum.LangPack.Lang;
import org.lwjgl.input.Controllers; import org.lwjgl.input.Controllers;
import org.newdawn.slick.*; import org.newdawn.slick.*;
@@ -41,7 +42,7 @@ public class Terrarum extends StateBasedGame {
public static String defaultDir; public static String defaultDir;
public static String defaultSaveDir; public static String defaultSaveDir;
public static String gameLocale = "jp_kana"; public static String gameLocale = "ko";
public static Font gameFontWhite; 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" "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" "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" "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" "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" "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" "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); Color UIColour = new Color(0x90000000);
private StringBuffer commandInputPool = new StringBuffer(); private StringBuffer commandInputPool;
private String prevCommand = ""; private String prevCommand;
private int inputCursorPos = 0; private int inputCursorPos;
private final int MESSAGES_MAX = 5000; private final int MESSAGES_MAX = 5000;
private String[] messages = new String[MESSAGES_MAX]; private String[] messages;
private int messageDisplayPos = 0; private int messageDisplayPos;
private int messagesCount = 0; private int messagesCount;
private final int LINE_HEIGHT = 20; private final int LINE_HEIGHT = 20;
private final int MESSAGES_DISPLAY_COUNT = 9; private final int MESSAGES_DISPLAY_COUNT = 9;
@@ -34,11 +34,7 @@ public class ConsoleWindow implements UICanvas {
public ConsoleWindow() { public ConsoleWindow() {
super(); super();
reset();
width = Terrarum.WIDTH;
height = 200;
sendMessage(Lang.get("DEV_MESSAGE_CONSOLE_CODEX"));
} }
@Override @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 @Override
public int getWidth() { public int getWidth() {
return width; 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