mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
more AI, divided ACCELBUFF and ACCELMULT_MOVEMENT
Former-commit-id: f3b4c390c363612dcc58c3d50cb7a47ba7452567 Former-commit-id: 95f71db97104cf55af7aba8e0289eb89efc078a4
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -2,6 +2,7 @@ package net.torvald.terrarum
|
||||
|
||||
import com.google.gson.JsonPrimitive
|
||||
import java.util.*
|
||||
import java.util.function.Consumer
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 15-12-30.
|
||||
@@ -102,4 +103,8 @@ open class KVHashMap {
|
||||
val keySet: Set<Any>
|
||||
get() = hashMap.keys
|
||||
|
||||
fun remove(key: String) {
|
||||
hashMap.remove(key, hashMap[key])
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,11 +4,9 @@ import net.torvald.imagefont.GameFontBase
|
||||
import net.torvald.random.HQRNG
|
||||
import net.torvald.terrarum.audio.AudioResourceLibrary
|
||||
import net.torvald.terrarum.concurrent.ThreadPool
|
||||
import net.torvald.terrarum.console.*
|
||||
import net.torvald.terrarum.gameactors.ActorHumanoid
|
||||
import net.torvald.terrarum.gameactors.*
|
||||
import net.torvald.terrarum.console.Authenticator
|
||||
import net.torvald.terrarum.console.CommandDict
|
||||
import net.torvald.terrarum.console.SetGlobalLightOverride
|
||||
import net.torvald.terrarum.gameactors.physicssolver.CollisionSolver
|
||||
import net.torvald.terrarum.gamecontroller.GameController
|
||||
import net.torvald.terrarum.gamecontroller.Key
|
||||
@@ -227,6 +225,12 @@ constructor() : BasicGameState() {
|
||||
debugWindow.update(gc, delta)
|
||||
notifier.update(gc, delta)
|
||||
|
||||
// update debuggers using javax.swing //
|
||||
if (Authenticator.b()) {
|
||||
AVTracker.update()
|
||||
ActorsList.update()
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////
|
||||
// app-related updates //
|
||||
|
||||
@@ -224,7 +224,6 @@ constructor(gamename: String) : StateBasedGame(gamename) {
|
||||
|
||||
val STATE_ID_TOOL_NOISEGEN = 0x200
|
||||
|
||||
//var hasController = false
|
||||
var controller: org.lwjgl.input.Controller? = null
|
||||
private set
|
||||
val CONTROLLER_DEADZONE = 0.1f
|
||||
|
||||
@@ -16,7 +16,6 @@ internal object SetAV : ConsoleCommand {
|
||||
val ccM = GameFontBase.colToCode["m"]
|
||||
|
||||
override fun printUsage() {
|
||||
|
||||
Echo("${ccW}Set actor value of specific target to desired value.")
|
||||
Echo("${ccW}Usage: ${ccY}setav ${ccG}(id) <av> <val>")
|
||||
Echo("${ccW}blank ID for player. Data type will be inferred automatically.")
|
||||
|
||||
@@ -18,6 +18,8 @@ object AVKey {
|
||||
*/
|
||||
const val ACCEL = "accel"
|
||||
const val ACCELBUFF = "$ACCEL$BUFF"
|
||||
/** internal value used by ActorHumanoid to implement friction in walkfunction */
|
||||
const val ACCELMULT_MOVEMENT = "__accelmultmvmt"
|
||||
const val SCALE = "scale"
|
||||
const val SCALEBUFF = "$SCALE$BUFF" // aka PHYSIQUE
|
||||
/** pixels */
|
||||
|
||||
@@ -220,14 +220,14 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
|
||||
private fun updateMovementControl() {
|
||||
if (!noClip) {
|
||||
if (grounded) {
|
||||
actorValue[AVKey.ACCELBUFF] = 1.0
|
||||
actorValue[AVKey.ACCELMULT_MOVEMENT] = 1.0
|
||||
}
|
||||
else {
|
||||
actorValue[AVKey.ACCELBUFF] = ACCEL_MULT_IN_FLIGHT
|
||||
actorValue[AVKey.ACCELMULT_MOVEMENT] = ACCEL_MULT_IN_FLIGHT
|
||||
}
|
||||
}
|
||||
else {
|
||||
actorValue[AVKey.ACCELBUFF] = 1.0
|
||||
actorValue[AVKey.ACCELMULT_MOVEMENT] = 1.0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1165,6 +1165,7 @@ open class ActorWithBody : Actor() {
|
||||
val avAcceleration: Double
|
||||
get() = actorValue.getAsDouble(AVKey.ACCEL)!! *
|
||||
actorValue.getAsDouble(AVKey.ACCELBUFF)!! *
|
||||
(actorValue.getAsDouble(AVKey.ACCELMULT_MOVEMENT) ?: 1.0) *
|
||||
scale.sqrt()
|
||||
val avSpeedCap: Double
|
||||
get() = actorValue.getAsDouble(AVKey.SPEED)!! *
|
||||
|
||||
@@ -27,14 +27,18 @@ open class HumanoidNPC(luaScript: EncapsulatedString, born: GameDate) : ActorHum
|
||||
|
||||
/**
|
||||
* Initialised in init block.
|
||||
* Use function "function update(delta)" to step the AI.
|
||||
* Use lua function "update(delta)" to step the AI.
|
||||
*/
|
||||
protected val luaInstance: LuaValue
|
||||
|
||||
private val aiLuaAPI: AILuaAPI
|
||||
|
||||
init {
|
||||
luag["io"] = LuaValue.NIL
|
||||
luag["os"] = LuaValue.NIL
|
||||
luag["luajava"] = LuaValue.NIL
|
||||
aiLuaAPI = AILuaAPI(luag, this)
|
||||
// load the script and execute it (initialises target script)
|
||||
luaInstance = luag.load(luaScript.getString(), luaScript.javaClass.simpleName)
|
||||
luaInstance.call()
|
||||
}
|
||||
@@ -77,8 +81,8 @@ open class HumanoidNPC(luaScript: EncapsulatedString, born: GameDate) : ActorHum
|
||||
|
||||
override fun update(gc: GameContainer, delta: Int) {
|
||||
super.update(gc, delta)
|
||||
aiLuaAPI.update(delta)
|
||||
|
||||
// run "update()" function in the script
|
||||
luag.get("update").call(delta.toLuaValue())
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import org.luaj.vm2.lib.ZeroArgFunction
|
||||
/**
|
||||
* Created by minjaesong on 16-10-24.
|
||||
*/
|
||||
internal class AILuaAPI(val g: Globals, actor: ActorWithBody) {
|
||||
internal class AILuaAPI(g: Globals, actor: ActorWithBody) {
|
||||
|
||||
init {
|
||||
if (actor !is AIControlled)
|
||||
@@ -36,10 +36,11 @@ internal class AILuaAPI(val g: Globals, actor: ActorWithBody) {
|
||||
g["ai"]["moveRight"] = MoveRight(actor)
|
||||
g["ai"]["moveTo"] = MoveTo(actor)
|
||||
g["ai"]["jump"] = Jump(actor)
|
||||
}
|
||||
|
||||
fun update(delta: Int) {
|
||||
// set up variables
|
||||
|
||||
g["game"] = LuaValue.tableOf()
|
||||
g["game"]["version"] = GameVersion()
|
||||
g["game"]["versionRaw"] = GameVersionRaw()
|
||||
}
|
||||
|
||||
companion object {
|
||||
@@ -47,35 +48,43 @@ internal class AILuaAPI(val g: Globals, actor: ActorWithBody) {
|
||||
* Reads arbitrary ActorWithBody and returns its information as Lua table
|
||||
*/
|
||||
fun composeActorObject(actor: ActorWithBody): LuaTable {
|
||||
val t = LuaValue.tableOf()
|
||||
val t: LuaTable = LuaValue.tableOf()
|
||||
|
||||
t["name"] = actor.actorValue.getAsString(AVKey.NAME)
|
||||
t["posX"] = actor.hitbox.centeredX
|
||||
t["posY"] = actor.hitbox.centeredY
|
||||
t["name"] = actor.actorValue.getAsString(AVKey.NAME).toLua()
|
||||
t["posX"] = actor.hitbox.centeredX.toLua()
|
||||
t["posY"] = actor.hitbox.centeredY.toLua()
|
||||
|
||||
t["veloX"] = actor.veloX
|
||||
t["veloY"] = actor.veloY
|
||||
t["veloX"] = actor.veloX.toLua()
|
||||
t["veloY"] = actor.veloY.toLua()
|
||||
|
||||
t["width"] = actor.hitbox.width
|
||||
t["height"] = actor.hitbox.height
|
||||
t["width"] = actor.hitbox.width.toLua()
|
||||
t["height"] = actor.hitbox.height.toLua()
|
||||
|
||||
t["mass"] = actor.mass
|
||||
t["mass"] = actor.mass.toLua()
|
||||
|
||||
t["collisionType"] = actor.collisionType
|
||||
t["collisionType"] = actor.collisionType.toLua()
|
||||
|
||||
t["strength"] = actor.avStrength
|
||||
t["strength"] = actor.avStrength.toLua()
|
||||
|
||||
val lumrgb: Int = actor.actorValue.getAsInt(AVKey.LUMINOSITY) ?: 0
|
||||
val MUL_2 = LightmapRenderer.MUL_2
|
||||
val MUL = LightmapRenderer.MUL
|
||||
val CHMAX = LightmapRenderer.CHANNEL_MAX
|
||||
t["luminosityRGB"] = lumrgb
|
||||
t["luminosityRGB"] = lumrgb.toLua()
|
||||
t["luminosity"] = (lumrgb.div(MUL_2).and(CHMAX).times(3) +
|
||||
lumrgb.div(MUL).and(CHMAX).times(4) +
|
||||
lumrgb.and(1023)) / 8 // quick luminosity calculation
|
||||
lumrgb.and(1023)).div(8.0).toLua() // quick luminosity calculation
|
||||
|
||||
return t
|
||||
}
|
||||
|
||||
fun Double.toLua() = LuaValue.valueOf(this)
|
||||
fun Int.toLua() = LuaValue.valueOf(this)
|
||||
fun String.toLua() = LuaValue.valueOf(this)
|
||||
fun Double?.toLua() = if (this == null) LuaValue.NIL else this.toLua()
|
||||
fun Int?.toLua() = if (this == null) LuaValue.NIL else this.toLua()
|
||||
fun String?.toLua() = if (this == null) LuaValue.NIL else this.toLua()
|
||||
|
||||
}
|
||||
|
||||
class GetSelfActorInfo(val actor: ActorWithBody) : ZeroArgFunction() {
|
||||
@@ -203,4 +212,18 @@ internal class AILuaAPI(val g: Globals, actor: ActorWithBody) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
class GameVersion() : ZeroArgFunction() {
|
||||
override fun call(): LuaValue {
|
||||
return Terrarum.VERSION_STRING.toLua()
|
||||
}
|
||||
}
|
||||
|
||||
class GameVersionRaw() : ZeroArgFunction() {
|
||||
override fun call(): LuaValue {
|
||||
return Terrarum.VERSION_RAW.toLua()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package net.torvald.terrarum.gameactors.ai.scripts
|
||||
|
||||
/**
|
||||
* Encapsulated text file
|
||||
*
|
||||
* Created by SKYHi14 on 2016-12-28.
|
||||
*/
|
||||
abstract class EncapsulatedString {
|
||||
|
||||
@@ -3,19 +3,16 @@ package net.torvald.terrarum.ui
|
||||
import com.jme3.math.FastMath
|
||||
import net.torvald.imagefont.GameFontBase
|
||||
import net.torvald.terrarum.gameworld.PairedMapLayer
|
||||
import net.torvald.terrarum.langpack.Lang
|
||||
import net.torvald.terrarum.mapdrawer.LightmapRenderer
|
||||
import net.torvald.terrarum.mapdrawer.MapCamera
|
||||
import net.torvald.terrarum.mapdrawer.MapDrawer
|
||||
import net.torvald.terrarum.Terrarum
|
||||
import net.torvald.terrarum.blendNormal
|
||||
import net.torvald.terrarum.blendScreen
|
||||
import net.torvald.terrarum.gameactors.ActorHumanoid
|
||||
import org.newdawn.slick.Color
|
||||
import org.newdawn.slick.GameContainer
|
||||
import org.newdawn.slick.Graphics
|
||||
import org.newdawn.slick.Input
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 16-03-14.
|
||||
@@ -63,9 +60,6 @@ class BasicDebugInfoWindow : UICanvas {
|
||||
|
||||
val player = Terrarum.ingame.player
|
||||
|
||||
val sb = StringBuilder()
|
||||
val formatter = Formatter(sb)
|
||||
|
||||
val mouseTileX = ((MapCamera.cameraX + gc.input.mouseX / Terrarum.ingame.screenZoom) / MapDrawer.TILE_SIZE).toInt()
|
||||
val mouseTileY = ((MapCamera.cameraY + gc.input.mouseY / Terrarum.ingame.screenZoom) / MapDrawer.TILE_SIZE).toInt()
|
||||
|
||||
@@ -112,7 +106,7 @@ class BasicDebugInfoWindow : UICanvas {
|
||||
val rawB = valRaw.rawB()
|
||||
|
||||
lightVal = if (valRaw == -1) "—"
|
||||
else valRaw.toInt().toString() + " (" +
|
||||
else valRaw.toString() + " (" +
|
||||
rawR.toString() + " " +
|
||||
rawG.toString() + " " +
|
||||
rawB.toString() + ")"
|
||||
@@ -182,11 +176,11 @@ class BasicDebugInfoWindow : UICanvas {
|
||||
}
|
||||
|
||||
private fun printLine(g: Graphics, l: Int, s: String) {
|
||||
g.drawString(s, 10f, line(l).toFloat())
|
||||
g.drawString(s, 10f, line(l))
|
||||
}
|
||||
|
||||
private fun printLineColumn(g: Graphics, col: Int, row: Int, s: String) {
|
||||
g.drawString(s, (10 + column(col)).toFloat(), line(row).toFloat())
|
||||
g.drawString(s, (10 + column(col)), line(row))
|
||||
}
|
||||
|
||||
val histogramW = 256
|
||||
@@ -194,9 +188,9 @@ class BasicDebugInfoWindow : UICanvas {
|
||||
|
||||
private fun drawHistogram(g: Graphics, histogram: LightmapRenderer.Histogram, x: Int, y: Int) {
|
||||
val uiColour = Color(0xAA000000.toInt())
|
||||
val barR = Color(0xDD0000.toInt())
|
||||
val barG = Color(0x00DD00.toInt())
|
||||
val barB = Color(0x0000DD.toInt())
|
||||
val barR = Color(0xDD0000)
|
||||
val barG = Color(0x00DD00)
|
||||
val barB = Color(0x0000DD)
|
||||
val barColour = arrayOf(barR, barG, barB)
|
||||
val w = histogramW.toFloat()
|
||||
val h = histogramH.toFloat()
|
||||
|
||||
Reference in New Issue
Block a user