visible actors are defaulted to Visible, SpriteAnimations now has "parent" actors and uses its Visible property

Former-commit-id: 0e240de4ca38a59724f364df4624c8dc79c0112d
Former-commit-id: b017b24ab7591ea2fd2518308bd5656597c14f47
This commit is contained in:
Song Minjae
2016-12-23 20:49:29 +09:00
parent 106afb4f49
commit 944c71d691
22 changed files with 712 additions and 88 deletions

View File

@@ -45,7 +45,7 @@ object WriteMeta {
// define Strings to be hashed
val props = arrayOf(
TilePropCSV.text
TilePropCSV()
//, (item, mat, ...)
)

View File

@@ -7,13 +7,13 @@ package net.torvald.spriteanimation
import net.torvald.terrarum.StateInGame
import net.torvald.terrarum.Terrarum
import com.jme3.math.FastMath
import net.torvald.terrarum.gameactors.ActorWithBody
import org.newdawn.slick.Graphics
import org.newdawn.slick.Image
import org.newdawn.slick.SlickException
import org.newdawn.slick.SpriteSheet
class SpriteAnimation @Throws(SlickException::class)
constructor() {
class SpriteAnimation(val parentActor: ActorWithBody) {
private var spriteImage: SpriteSheet? = null
var height: Int = 0
@@ -30,7 +30,8 @@ constructor() {
private var animationRunning = true
private var flipHorizontal = false
private var flipVertical = false
private var visible = false
private val visible: Boolean
get() = parentActor.isVisible
private val offsetX = 0
private val offsetY = 0
@@ -81,14 +82,6 @@ constructor() {
nFrames = frames
}
fun setAsVisible() {
visible = true
}
fun setAsInvisible() {
visible = false
}
fun update(delta: Int) {
if (animationRunning) {
//skip this if animation is stopped

View File

@@ -123,11 +123,17 @@ constructor() : BasicGameState() {
// add new player and put it to actorContainer
playableActorDelegate = PlayableActorDelegate(PlayerBuilderSigrid.create())
playableActorDelegate = PlayableActorDelegate(PlayerBuilderSigrid())
//player = PBCynthia.create()
//player.setNoClip(true);
addActor(player)
// test actor
addActor(PlayerBuilderCynthia())
// init console window
consoleHandler = UIHandler(ConsoleWindow())
consoleHandler.setPosition(0, 0)
@@ -488,7 +494,7 @@ constructor() : BasicGameState() {
}
// inactivate distant actors
else if (actor is ActorWithBody && !actor.inUpdateRange()) {
if (actor !is Projectile) { // if it's a projectile, just kill it.
if (actor !is Projectile) { // if it's a projectile, don't inactivate it; just kill it.
actorContainerInactive.add(actor) // naïve add; duplicates are checked when the actor is re-activated
}
actorContainer.removeAt(actorIndex)

View File

@@ -111,10 +111,10 @@ constructor(gamename: String) : StateBasedGame(gamename) {
//addState(StateSplash())
//addState(StateMonitorCheck())
//addState(StateFontTester())
addState(StateNoiseTexGen())
//addState(StateNoiseTexGen())
//ingame = StateInGame()
//addState(ingame)
ingame = StateInGame()
addState(ingame)
}
companion object {
@@ -218,17 +218,17 @@ constructor(gamename: String) : StateBasedGame(gamename) {
var hasController = false
val CONTROLLER_DEADZONE = 0.1f
/** Available CPU cores */
val CORES = Runtime.getRuntime().availableProcessors()
/** Available CPU threads */
val THREADS = Runtime.getRuntime().availableProcessors()
/**
* If the game is multithreading.
* True if:
*
* CORES >= 2 and config "multithread" is true
* THREADS >= 2 and config "multithread" is true
*/
val MULTITHREAD: Boolean
get() = CORES >= 2 && getConfigBoolean("multithread")
get() = THREADS >= 2 && getConfigBoolean("multithread")
private lateinit var configDir: String
@@ -432,6 +432,8 @@ fun main(args: Array<String>) {
Terrarum.main(args)
}
// I must say: What the fuck is wrong with you, Slick2D?!
fun blendMul() {
GL11.glEnable(GL11.GL_BLEND)
GL11.glColorMask(true, true, true, true)
@@ -445,8 +447,8 @@ fun blendNormal() {
// TODO seems working as intended (no more whitened-out semitransparent colour), but needs further investigation
GL14.glBlendFuncSeparate(
GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA,
GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA
GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, // blend func for RGB channels
GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA // blend func for alpha channels
)
}

View File

@@ -7,7 +7,7 @@ import java.util.*
* Created by minjaesong on 16-05-25.
*/
object ThreadPool {
val POOL_SIZE = Terrarum.CORES + 1
val POOL_SIZE = Terrarum.THREADS + 1
private val pool: Array<Thread?> = Array(POOL_SIZE, { null })

View File

@@ -16,7 +16,7 @@ abstract class Actor : Comparable<Actor>, Runnable {
* Valid RefID is equal to or greater than 16777216.
* @return Reference ID. (16777216-0x7FFF_FFFF)
*/
abstract var referenceID: Int
open var referenceID: Int = generateUniqueReferenceID()
abstract var actorValue: ActorValue
abstract var flagDespawn: Boolean

View File

@@ -23,7 +23,6 @@ import java.util.*
*/
open class ActorWithBody : Actor() {
override var referenceID: Int = generateUniqueReferenceID()
override var actorValue: ActorValue = ActorValue()
@Transient internal var sprite: SpriteAnimation? = null
@@ -155,8 +154,8 @@ open class ActorWithBody : Actor() {
@Volatile var grounded = false
override @Volatile var flagDespawn = false
/** Default to 'false' */
var isVisible = false
/** Default to 'true' */
var isVisible = true
/** Default to 'true' */
var isUpdate = true
var isNoSubjectToGrav = false
@@ -255,12 +254,12 @@ open class ActorWithBody : Actor() {
}
fun makeNewSprite(w: Int, h: Int) {
sprite = SpriteAnimation()
sprite = SpriteAnimation(this)
sprite!!.setDimension(w, h)
}
fun makeNewSpriteGlow(w: Int, h: Int) {
spriteGlow = SpriteAnimation()
spriteGlow = SpriteAnimation(this)
spriteGlow!!.setDimension(w, h)
}
@@ -943,6 +942,8 @@ open class ActorWithBody : Actor() {
open fun drawBody(gc: GameContainer, g: Graphics) {
if (isVisible && sprite != null) {
when (drawMode) {
BLEND_NORMAL -> blendNormal()
BLEND_MULTIPLY -> blendMul()

View File

@@ -18,9 +18,9 @@ object CreatureBuilder {
* @Param jsonFileName with extension
*/
@Throws(IOException::class, SlickException::class)
fun create(jsonFileName: String): ActorWithBody {
operator fun invoke(jsonFileName: String): ActorWithBody {
val actor = ActorWithBody()
CreatureRawInjector.inject(actor.actorValue, jsonFileName)
InjectCreatureRaw(actor.actorValue, jsonFileName)
return actor
}

View File

@@ -18,7 +18,6 @@ class FixtureTikiTorch : FixtureBase(), Luminous {
override val lightBoxList: ArrayList<Hitbox>
init {
isVisible = true
density = 1200.0
setHitboxDimension(10, 24, 0, 0)
@@ -26,12 +25,10 @@ class FixtureTikiTorch : FixtureBase(), Luminous {
lightBoxList = ArrayList(1)
lightBoxList.add(Hitbox(3.0, 0.0, 4.0, 3.0))
sprite = SpriteAnimation()
sprite!!.setDimension(10, 27)
makeNewSprite(10, 27)
sprite!!.setSpriteImage("assets/graphics/sprites/fixtures/tiki_torch.png")
sprite!!.setDelay(200)
sprite!!.setRowsAndFrames(1, 1)
sprite!!.setAsVisible()
actorValue[AVKey.BASEMASS] = 1.0
}

View File

@@ -18,22 +18,15 @@ import java.io.Reader
/**
* Created by minjaesong on 16-01-31.
*/
open class HumanoidNPC(aiFile: String, born: GameDate) : ActorHumanoid(born), AIControlled, CanBeAnItem {
open class HumanoidNPC(luaScript: String, born: GameDate) : ActorHumanoid(born), AIControlled, CanBeAnItem {
override val scriptPath: String = aiFile
override val scriptPath: String = ""
companion object {
protected val luag = Globals()
init {
luag.load(JseBaseLib())
luag.load(TableLib())
luag.load(StringLib())
luag.load(TableLib())
luag.load(CoroutineLib())
luag.load(Bit32Lib())
luag.load(PackageLib())
luag.load(JseMathLib())
LoadState.install(luag)
LuaC.install(luag)
}
@@ -77,8 +70,9 @@ open class HumanoidNPC(aiFile: String, born: GameDate) : ActorHumanoid(born), AI
init {
val inputStream = javaClass.getResourceAsStream(scriptPath)
runCommand(InputStreamReader(inputStream), scriptPath)
//val inputStream = javaClass.getResourceAsStream(scriptPath)
//runCommand(InputStreamReader(inputStream), scriptPath)
runCommand(luaScript)
}
@@ -130,6 +124,14 @@ open class HumanoidNPC(aiFile: String, born: GameDate) : ActorHumanoid(born), AI
}
}
fun runCommand(script: String) {
if (!threadRun && !flagDespawn) {
currentExecutionThread = Thread(ThreadRunCommand(luag, script, "="))
currentExecutionThread.start()
threadRun = true
}
}
class ThreadRunCommand : Runnable {
val mode: Int

View File

@@ -12,7 +12,7 @@ import java.security.SecureRandom
/**
* Created by minjaesong on 16-03-25.
*/
object CreatureRawInjector {
object InjectCreatureRaw {
const val JSONPATH = "./assets/raw/creatures/"
private const val MULTIPLIER_RAW_ELEM_SUFFIX = AVKey.MULT
@@ -23,8 +23,7 @@ object CreatureRawInjector {
* @param actorValueRef ActorValue object to be injected.
* @param jsonFileName with extension
*/
@Throws(IOException::class, SlickException::class)
fun inject(actorValueRef: ActorValue, jsonFileName: String) {
operator fun invoke(actorValueRef: ActorValue, jsonFileName: String) {
val jsonObj = JsonFetcher(JSONPATH + jsonFileName)
val elementsInt = arrayOf(AVKey.BASEHEIGHT, AVKey.TOOLSIZE, AVKey.ENCUMBRANCE)

View File

@@ -16,7 +16,6 @@ class PhysTestBall : ActorWithBody() {
init {
setHitboxDimension(16, 16, 0, 0)
isVisible = true
mass = 10.0
density = 200.0

View File

@@ -40,7 +40,6 @@ class Player(born: GameDate) : ActorHumanoid(born) {
* @throws SlickException
*/
init {
isVisible = true
referenceID = PLAYER_REF_ID // forcibly set ID
density = BASE_DENSITY
collisionType = COLLISION_KINEMATIC

View File

@@ -11,9 +11,9 @@ object PlayerBuilder {
private val JSONPATH = "./assets/raw/"
private val jsonString = String()
fun create(): Actor {
operator fun invoke(): Actor {
val p: Actor = Player(Terrarum.ingame.world.time.currentTimeAsGameDate)
CreatureRawInjector.inject(p.actorValue, "CreatureHuman.json")
InjectCreatureRaw(p.actorValue, "CreatureHuman.json")
// attach sprite

View File

@@ -2,6 +2,7 @@ package net.torvald.terrarum.gameactors
import net.torvald.spriteanimation.SpriteAnimation
import net.torvald.terrarum.gameactors.ActorHumanoid
import net.torvald.terrarum.gameactors.ai.scripts.PokemonNPCAI
import net.torvald.terrarum.mapdrawer.MapDrawer
/**
@@ -9,25 +10,25 @@ import net.torvald.terrarum.mapdrawer.MapDrawer
*/
object PlayerBuilderCynthia {
fun create(): Player {
val p: Player = Player(GameDate(100, 143)) // random value thrown
CreatureRawInjector.inject(p.actorValue, "CreatureHuman.json")
operator fun invoke(): ActorWithBody {
//val p: Player = Player(GameDate(100, 143)) // random value thrown
val p: HumanoidNPC = HumanoidNPC(PokemonNPCAI(), GameDate(100, 143)) // random value thrown
InjectCreatureRaw(p.actorValue, "CreatureHuman.json")
p.actorValue[AVKey.__PLAYER_QUICKBARSEL] = 0
p.actorValue["__selectedtile"] = 16
p.makeNewSprite(26, 42)
p.sprite!!.setSpriteImage("assets/graphics/sprites/test_player_2.png")
p.sprite!!.setDelay(200)
p.sprite!!.setRowsAndFrames(1, 1)
p.sprite!!.setAsVisible()
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 9, 0)
p.setPosition((4096 * MapDrawer.TILE_SIZE).toDouble(), (300 * 16).toDouble())
p.setPosition(4096.0 * MapDrawer.TILE_SIZE, 300.0 * MapDrawer.TILE_SIZE)
return p
}
}

View File

@@ -21,7 +21,7 @@ import java.io.IOException
object PlayerBuilderSigrid {
fun create(): Player {
operator fun invoke(): Player {
val p = Player(GameDate(-2147483648, 0)) // XD
p.referenceID = 0x51621D // the only constant of this procedural universe
@@ -30,13 +30,11 @@ object PlayerBuilderSigrid {
p.sprite!!.setSpriteImage("assets/graphics/sprites/test_player.png")
p.sprite!!.setDelay(200)
p.sprite!!.setRowsAndFrames(1, 1)
p.sprite!!.setAsVisible()
p.makeNewSpriteGlow(28, 51)
p.spriteGlow!!.setSpriteImage("assets/graphics/sprites/test_player_glow.tga")
p.spriteGlow!!.setDelay(200)
p.spriteGlow!!.setRowsAndFrames(1, 1)
p.spriteGlow!!.setAsVisible()
p.actorValue = ActorValue()
p.actorValue[AVKey.SCALE] = 1.0

View File

@@ -0,0 +1,10 @@
package net.torvald.terrarum.gameactors.ai.scripts
/**
* Created by SKYHi14 on 2016-12-23.
*/
object PokemonNPCAI {
operator fun invoke(): String = """
"""
}

View File

@@ -29,7 +29,7 @@ object TileCodex {
try {
// todo verify CSV using pre-calculated SHA256 hash
val records = CSVFetcher.readFromString(TilePropCSV.text)
val records = CSVFetcher.readFromString(TilePropCSV())
println("[TileCodex] Building tile properties table")

View File

@@ -4,7 +4,7 @@ package net.torvald.terrarum.tileproperties
* Created by minjaesong on 16-09-11.
*/
object TilePropCSV {
const val text = """
operator fun invoke() = """
"id";"dmg";"name" ; "opacity";"strength";"dsty";"mate";"fluid";"solid";"wall"; "lumcolor";"drop";"ddmg";"fall";"dlfn";"friction"
"0"; "0";"TILE_AIR" ; "8396808"; "0"; "1";"null"; "0"; "0"; "0"; "0"; "0"; "0"; "0"; "0";"4"
"1"; "0";"TILE_STONE" ; "33587232"; "25";"2400";"rock"; "0"; "1"; "1"; "0"; "1"; "0"; "0"; "0";"16"

View File

@@ -151,7 +151,7 @@ class BasicDebugInfoWindow : UICanvas {
g.color = GameFontBase.codeToCol["y"]
g.drawString("${ccY}MEM ", (Terrarum.WIDTH - 15 * 8 - 2).toFloat(), 2f)
//g.drawString("${ccY}FPS $ccG${Terrarum.appgc.fps}", (Terrarum.WIDTH - 6 * 8 - 2).toFloat(), 10f)
g.drawString("${ccY}CPUs ${if (Terrarum.MULTITHREAD) ccG else ccR}${Terrarum.CORES}",
g.drawString("${ccY}CPUs ${if (Terrarum.MULTITHREAD) ccG else ccR}${Terrarum.THREADS}",
(Terrarum.WIDTH - 2 - 6*8).toFloat(), 10f)
g.color = GameFontBase.codeToCol["g"]