diff --git a/Known problems.md b/Known problems.md index d5c38fee8..17ad40760 100644 --- a/Known problems.md +++ b/Known problems.md @@ -5,15 +5,21 @@ * Arm behind the body seems unnatural -### Phys ### +### Physics ### -* Actor stick to wall and not get off -* Actor with mass <2 behaves erratically # Resolved # * Cannot fit into single-tile width pit Cause: Player/NPC looks slim enough to fit, but don't fit in the game - Solution: Draw them wider, allow them to fit into the pit (Phys resolver will glitch?) - __Solved__ — Player/NPC hitbox now have a width of 15 pixels. + Solution: Player/NPC hitbox now have a width of 15 pixels. + +* Actor stick to wall and not get off + Cause: Unknown + Solution: Changed collision detection method to CCD (continuous collision detection) + +* Actor with mass <2 behaves erratically + Details: Velocity becomes NaN when jumped + Cause: Floating-point precision error? + Solution: Changed every physics variable that uses Float to Double \ No newline at end of file diff --git a/README.md b/README.md index c2bc287b8..76f5c6efe 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,10 @@ Any contribution in this project must be made sorely in English, so be sure to u ### Contributing translations ### -* Writing text -You will need to fiddle with .csv files in ./res/locales -* Languagus with apparent grammatical gender -Any gender discrimination should *not* exist in this game, so please choose vocabularies that is gender-neutral. If such behaviour is not possible in the target language, please use male gender, but try your best to avoid the situation. +* Writing text + You will need to fiddle with .csv files in ./res/locales +* Languagus with apparent grammatical gender + Any gender discrimination should *not* exist in this game, so please choose vocabularies that is gender-neutral. If such behaviour is not possible in the target language, please use male gender, but try your best to avoid the situation. Note: Right-to-left languages (arabic, hebrew, etc.) are not supported. diff --git a/res/graphics/terrain/terrain.png b/res/graphics/terrain/terrain.png index def1de3a6..026aecf94 100644 Binary files a/res/graphics/terrain/terrain.png and b/res/graphics/terrain/terrain.png differ diff --git a/src/net/torvald/terrarum/Game.kt b/src/net/torvald/terrarum/Game.kt index bb28169ef..e3f738c5e 100644 --- a/src/net/torvald/terrarum/Game.kt +++ b/src/net/torvald/terrarum/Game.kt @@ -253,6 +253,8 @@ constructor() : BasicGameState() { notifier.render(gc, g) } + private fun getGradientColour(row: Int, phase: Int) = GRADIENT_IMAGE!!.getColor(phase, row) + private fun getGradientColour(row: Int): Color { val gradMapWidth = GRADIENT_IMAGE!!.width val phase = Math.round( @@ -260,7 +262,19 @@ constructor() : BasicGameState() { ) //update in every INTERNAL_FRAME frames - return GRADIENT_IMAGE!!.getColor(phase, row) + return getGradientColour(row, phase) + } + + /** + * @param time in seconds + */ + private fun getGradientColourByTime(row: Int, time: Int): Color { + val gradMapWidth = GRADIENT_IMAGE!!.width + val phase = Math.round( + time.toFloat() / WorldTime.DAY_LENGTH.toFloat() * gradMapWidth + ) + + return getGradientColour(row, phase) } override fun keyPressed(key: Int, c: Char) { @@ -358,6 +372,7 @@ constructor() : BasicGameState() { private val globalLightByTime: Int get() = getGradientColour(2).getRGB24().rgb24ExpandToRgb30() + fun globalLightByTime(t: Int): Int = getGradientColourByTime(2, t).getRGB24().rgb24ExpandToRgb30() fun Color.getRGB24(): Int = (this.redByte shl 16) or (this.greenByte shl 8) or (this.blueByte) /** Remap 8-bit value (0.0-1.0) to 10-bit value (0.0-4.0) by prepending two bits of zero for each R, G and B. */ diff --git a/src/net/torvald/terrarum/gameactors/Player.kt b/src/net/torvald/terrarum/gameactors/Player.kt index e9b956bf4..f4965bcae 100644 --- a/src/net/torvald/terrarum/gameactors/Player.kt +++ b/src/net/torvald/terrarum/gameactors/Player.kt @@ -5,8 +5,6 @@ import net.torvald.terrarum.gamecontroller.EnumKeyFunc import net.torvald.terrarum.gamecontroller.KeyMap import net.torvald.terrarum.mapdrawer.MapDrawer import net.torvald.terrarum.Terrarum -import net.torvald.spriteanimation.SpriteAnimation -import org.dyn4j.geometry.ChainedVector2 import org.dyn4j.geometry.Vector2 import org.lwjgl.input.Controller import org.lwjgl.input.Controllers @@ -113,10 +111,23 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan } /** - + * This code directly controls VELOCITY for walking, called walkX and walkY. + * + * In theory, we must add ACCELERATION to the velocity, but unfortunately it's arduous task + * with this simulation code base. + * + * Reason: we have naïve friction code that is not adaptive at all and to add proper walking code to + * this code base, ACCELERATION must be changed (in other words, we must deal with JERK) accordingly + * to the FRICTION. + * + * So I'm adding walkX/Y and getting the ActorWithBody.setNewNextHitbox to use the velocity value of + * walkX/Y + velocity, which is stored in variable moveDelta. + * + * Be warned. + * * @param left (even if the game is joypad controlled, you must give valid value) - * * * @param absAxisVal (set AXIS_POSMAX if keyboard controlled) + * @author minjaesong */ private fun walkHorizontal(left: Boolean, absAxisVal: Float) { readonly_totalX = //veloX + diff --git a/src/net/torvald/terrarum/tileproperties/TileNameCode.kt b/src/net/torvald/terrarum/tileproperties/TileNameCode.kt index 5572fccb9..9daa03af4 100644 --- a/src/net/torvald/terrarum/tileproperties/TileNameCode.kt +++ b/src/net/torvald/terrarum/tileproperties/TileNameCode.kt @@ -107,6 +107,10 @@ object TileNameCode { val SANDSTONE_BLACK = TilePropCodex.idDamageToIndex(15, 4) val SANDSTONE_GREEN = TilePropCodex.idDamageToIndex(15, 5) + val LANTERN = TilePropCodex.idDamageToIndex(16, 0) + val SUNSTONE = TilePropCodex.idDamageToIndex(16, 1) + val DAYLIGHT_CAPACITOR = TilePropCodex.idDamageToIndex(16, 2) + val WATER_1 = TilePropCodex.idDamageToIndex(255, 0) val WATER_2 = TilePropCodex.idDamageToIndex(255, 1) val WATER_3 = TilePropCodex.idDamageToIndex(255, 2) diff --git a/src/net/torvald/terrarum/tileproperties/TileProp.kt b/src/net/torvald/terrarum/tileproperties/TileProp.kt index e12693e82..ece5730d1 100644 --- a/src/net/torvald/terrarum/tileproperties/TileProp.kt +++ b/src/net/torvald/terrarum/tileproperties/TileProp.kt @@ -1,5 +1,8 @@ package net.torvald.terrarum.tileproperties +import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.gamemap.WorldTime + /** * Created by minjaesong on 16-02-16. */ @@ -7,8 +10,7 @@ class TileProp { var id: Int = 0 - var damage: Int = 0 - var name: String = "" + var nameKey: String = "" /** * @param opacity Raw RGB value, without alpha @@ -29,7 +31,17 @@ class TileProp { /** * @param luminosity Raw RGB value, without alpha */ - var luminosity: Int = 0 + private var realLum: Int = 0 + var luminosity: Int + set(value) { + realLum = value + } + get() = if (id == TileNameCode.SUNSTONE) + Terrarum.game.map.globalLight + else if (id == TileNameCode.DAYLIGHT_CAPACITOR) + Terrarum.game.globalLightByTime(WorldTime.DAY_LENGTH / 2) + else + realLum var drop: Int = 0 var dropDamage: Int = 0 diff --git a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt index 262fed553..0a993440e 100644 --- a/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt +++ b/src/net/torvald/terrarum/tileproperties/TilePropCodex.kt @@ -67,10 +67,9 @@ class TilePropCodex { } private fun setProp(prop: TileProp, record: CSVRecord) { - prop.name = record.get("name") + prop.nameKey = record.get("name") - prop.id = intVal(record, "id") - prop.damage = intVal(record, "dmg") + prop.id = idDamageToIndex(intVal(record, "id"), intVal(record, "dmg")) prop.opacity = intVal(record, "opacity") prop.strength = intVal(record, "strength") @@ -85,8 +84,8 @@ class TilePropCodex { prop.isWallable = boolVal(record, "wall") prop.isFallable = boolVal(record, "fall") - print(formatNum3(prop.id) + ":" + formatNum2(prop.damage)) - println("\t" + prop.name) + print(formatNum3(intVal(record, "id")) + ":" + formatNum2(intVal(record, "dmg"))) + println("\t" + prop.nameKey) } private fun intVal(rec: CSVRecord, s: String): Int { diff --git a/src/net/torvald/terrarum/tileproperties/tileprop.csv b/src/net/torvald/terrarum/tileproperties/tileprop.csv index 43247f85d..be11fb108 100644 --- a/src/net/torvald/terrarum/tileproperties/tileprop.csv +++ b/src/net/torvald/terrarum/tileproperties/tileprop.csv @@ -84,6 +84,8 @@ "15"; "4";"TILE_SANDSTONE_BLACK" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "4"; "0";"16" "15"; "5";"TILE_SANDSTONE_BLACK" ; "33587232"; "25";"1900"; "0"; "1"; "1"; "0"; "15"; "5"; "0";"16" "16"; "0";"TILE_LANTERN_IRON_REGULAR"; "8396808"; "0"; "N/A"; "0"; "0"; "0"; "267619480"; "16"; "0"; "0";"16" + "16"; "1";"TILE_SUNSTONE" ; "33587232"; "0"; "N/A"; "0"; "1"; "0"; "0"; "16"; "1"; "0";"16" + "16"; "2";"TILE_DAYLIGHT_CAPACITOR" ; "33587232"; "0"; "N/A"; "0"; "1"; "0"; "0"; "16"; "2"; "0";"16" "254"; "0";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0";"16" "254"; "1";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0";"16" "254"; "2";"TILE_LAVA" ;"260301048"; "100";"2600"; "1"; "0"; "0"; "205574144"; "N/A"; "N/A"; "0";"16" @@ -123,6 +125,9 @@ # movr: Movement resistance, (walkspeedmax) / (1 + (n/16)), 16 halves movement speed # dsty: density. As we are putting water an 1000, it is identical to specific gravity. [g/l] +# Sunstone: Artificial sunlight, change colour over time in sync with sunlight +# Sunlight capacitor: daylight at 11h of 22h day + # Defalut torch : L 70 a 51 b 59; real candlelight colour taken from properly configured camera. # 16 colour palette : Old Apple Macintosh 16-colour palette