new ID for dynamic item work flawlessly with adding multiple at once

This commit is contained in:
Song Minjae
2017-04-24 21:31:53 +09:00
parent d70cb2524d
commit a72b6f0d1a
10 changed files with 77 additions and 44 deletions

View File

@@ -4,6 +4,7 @@ import net.torvald.random.HQRNG
import net.torvald.terrarum.ActorValue
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.itemproperties.ItemCodex.ACTORID_MIN
import org.newdawn.slick.GameContainer
typealias ActorID = Int
@@ -22,6 +23,13 @@ abstract class Actor(val renderOrder: RenderOrder) : Comparable<Actor>, Runnable
FRONT // fake tiles
}
companion object {
val RANGE_BEHIND = ACTORID_MIN..0x1FFF_FFFF
val RANGE_MIDDLE = 0x2000_0000..0x5FFF_FFFF
val RANGE_MIDTOP = 0x6000_0000..0x6FFF_FFFF
val RANGE_FRONT = 0x7000_0000..0x7FFF_FFFF
}
abstract fun update(gc: GameContainer, delta: Int)
/**
@@ -52,18 +60,12 @@ abstract class Actor(val renderOrder: RenderOrder) : Comparable<Actor>, Runnable
fun hasCollision(value: ActorID) =
try {
Terrarum.ingame!!.theGameHasActor(value) ||
value < ItemCodex.ACTOR_ID_MIN ||
value < when (renderOrder) {
RenderOrder.BEHIND -> ItemCodex.ACTOR_ID_MIN
RenderOrder.MIDDLE -> 0x10000000
RenderOrder.MIDTOP -> 0x60000000
RenderOrder.FRONT -> 0x70000000
} ||
value > when (renderOrder) {
RenderOrder.BEHIND -> 0x0FFFFFFF
RenderOrder.MIDDLE -> 0x5FFFFFFF
RenderOrder.MIDTOP -> 0x6FFFFFFF
RenderOrder.FRONT -> 0x7FFFFFFF
value < ItemCodex.ACTORID_MIN ||
value !in when (renderOrder) {
RenderOrder.BEHIND -> RANGE_BEHIND
RenderOrder.MIDDLE -> RANGE_MIDDLE
RenderOrder.MIDTOP -> RANGE_MIDTOP
RenderOrder.FRONT -> RANGE_FRONT
}
}
catch (gameNotInitialisedException: KotlinNullPointerException) {

View File

@@ -57,18 +57,22 @@ class ActorInventory(val actor: Pocketed, var maxCapacity: Int, var capacityMode
// new item
else {
if (item.isDynamic) {
// assign new ID
println("[ActorInventory] new dynamic item detected: ${item.originalID}")
item.dynamicID = InventoryItem.generateNewDynamicID(this)
// assign new ID for each
repeat(count) {
val newItem = item.clone().generateUniqueDynamicID(this)
itemList.add(InventoryPair(newItem, 1))
}
}
else {
itemList.add(InventoryPair(item, count))
}
itemList.add(InventoryPair(item, count))
}
insertionSortLastElem(itemList)
}
fun remove(itemID: Int, count: Int = 1) = remove(ItemCodex[itemID], count)
fun remove(itemID: Int, count: Int) = remove(ItemCodex[itemID], count)
/** Will check existence of the item using its Dynamic ID; careful with command order!
* e.g. re-assign after this operation */
fun remove(item: InventoryItem, count: Int = 1) {
val existingItem = getByDynamicID(item.dynamicID)
if (existingItem != null) { // if the item already exists
@@ -139,12 +143,23 @@ class ActorInventory(val actor: Pocketed, var maxCapacity: Int, var capacityMode
remove(item, 1)
}
else {
// unpack newly-made dynamic item (e.g. any weapon, floppy disk)
/*if (item.isDynamic && item.originalID == item.dynamicID) {
remove(item.originalID, 1)
item.generateUniqueDynamicID(this)
add(item)
}*/
// calculate damage value
val baseDamagePerSwing = if (actor is ActorHumanoid)
actor.avStrength / 1000.0
else
1.0 // TODO variable: scale, strength
val swingDmgToFrameDmg = Terrarum.delta.toDouble() / actor.actorValue.getAsDouble(AVKey.ACTION_INTERVAL)!!
// damage the item
item.durability -= (baseDamagePerSwing * swingDmgToFrameDmg).toFloat()
if (item.durability <= 0)
remove(item, 1)
@@ -194,11 +209,11 @@ class ActorInventory(val actor: Pocketed, var maxCapacity: Int, var capacityMode
while (low <= high) {
val mid = (low + high).ushr(1) // safe from overflows
val midVal = get(mid).item
val midVal = get(mid).item.dynamicID
if (ID > midVal.dynamicID)
if (ID > midVal)
low = mid + 1
else if (ID < midVal.dynamicID)
else if (ID < midVal)
high = mid - 1
else
return mid // key found

View File

@@ -12,7 +12,7 @@ import org.newdawn.slick.Graphics
class DroppedItem(private val item: InventoryItem) : ActorWithPhysics(Actor.RenderOrder.MIDTOP) {
init {
if (item.dynamicID >= ItemCodex.ACTOR_ID_MIN)
if (item.dynamicID >= ItemCodex.ACTORID_MIN)
throw RuntimeException("Attempted to create DroppedItem actor of a real actor; the real actor must be dropped instead.")
isVisible = true