now dropped items can produce light (e.g. dropped torch)

This commit is contained in:
minjaesong
2022-09-11 17:10:01 +09:00
parent 430ad4e703
commit bec47e81e2
15 changed files with 140 additions and 140 deletions

View File

@@ -1,4 +1,4 @@
"id";"drop";"world";"name";"shdr";"shdg";"shdb";"shduv";"str";"dsty";"mate";"solid";"wall";"grav";"dlfn";"fv";"fr";"lumr";"lumg";"lumb";"lumuv";"colour";"vscs";"refl";"tags" "id";"drop";"spawn";"name";"shdr";"shdg";"shdb";"shduv";"str";"dsty";"mate";"solid";"wall";"grav";"dlfn";"fv";"fr";"lumr";"lumg";"lumb";"lumuv";"colour";"vscs";"refl";"tags"
"0";"0";"0";"BLOCK_AIR";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1";"NULL";"0";"1";"N/A";"0";"0";"4";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"" "0";"0";"0";"BLOCK_AIR";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1";"NULL";"0";"1";"N/A";"0";"0";"4";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";""
"16";"17";"17";"BLOCK_STONE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ROCK,NATURAL" "16";"17";"17";"BLOCK_STONE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ROCK,NATURAL"
"17";"17";"17";"BLOCK_STONE_QUARRIED";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ROCK" "17";"17";"17";"BLOCK_STONE_QUARRIED";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ROCK"
@@ -55,10 +55,10 @@
"162";"162";"162";"BLOCK_PLATFORM_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"5";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM" "162";"162";"162";"BLOCK_PLATFORM_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"5";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM"
"163";"163";"163";"BLOCK_PLATFORM_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"5";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM" "163";"163";"163";"BLOCK_PLATFORM_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"5";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM"
"164";"164";"164";"BLOCK_PLATFORM_BLOODROSE";"0.0312";"0.0312";"0.0312";"0.0312";"5";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM" "164";"164";"164";"BLOCK_PLATFORM_BLOODROSE";"0.0312";"0.0312";"0.0312";"0.0312";"5";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM"
"176";"176";"192";"BLOCK_TORCH";"0.0312";"0.0312";"0.0312";"0.0312";"1";"800";"FXTR";"0";"0";"N/A";"1";"0";"16";"1.0000";"0.6372";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "176";"176";"176";"BLOCK_TORCH";"0.0312";"0.0312";"0.0312";"0.0312";"1";"800";"FXTR";"0";"0";"N/A";"1";"0";"16";"1.0000";"0.6372";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT"
"177";"177";"193";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"1";"0";"16";"0.3048";"0.4848";"1.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "177";"177";"177";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"1";"0";"16";"0.3048";"0.4848";"1.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT"
"192";"176";"192";"BLOCK_TORCH";"0.0312";"0.0312";"0.0312";"0.0312";"1";"800";"FXTR";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT,UNLIT" "192";"176";"176";"BLOCK_TORCH";"0.0312";"0.0312";"0.0312";"0.0312";"1";"800";"FXTR";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT,UNLIT"
"193";"177";"193";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT,UNLIT" "193";"177";"177";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT,UNLIT"
"208";"208";"208";"BLOCK_ILLUMINATOR_WHITE";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"0.9270";"0.9414";"0.8519";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "208";"208";"208";"BLOCK_ILLUMINATOR_WHITE";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"0.9270";"0.9414";"0.8519";"0.0000";"N/A";"N/A";"0.0";"LIGHT"
"209";"209";"209";"BLOCK_ILLUMINATOR_YELLOW";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"1.0000";"0.8408";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "209";"209";"209";"BLOCK_ILLUMINATOR_YELLOW";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"1.0000";"0.8408";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT"
"210";"210";"210";"BLOCK_ILLUMINATOR_ORANGE";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"1.0000";"0.5294";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "210";"210";"210";"BLOCK_ILLUMINATOR_ORANGE";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"1.0000";"0.5294";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT"
@@ -123,7 +123,7 @@
# #
# id: Block ID. ID equal to or greater than 4096 is for fluids, mainly for lighting calculation. # id: Block ID. ID equal to or greater than 4096 is for fluids, mainly for lighting calculation.
# drop: Which item the DroppedItem actually adds to your inventory # drop: Which item the DroppedItem actually adds to your inventory
# world: Which item the DroppedItem should impersonate when spawned # spawn: Which item the DroppedItem should impersonate when spawned
# #
# Drop and World can point to the item from other modules (usually 'basegame') # Drop and World can point to the item from other modules (usually 'basegame')
# To achieve that, specify the full ID, e.g. basegame:32 # To achieve that, specify the full ID, e.g. basegame:32
1 id drop world spawn name shdr shdg shdb shduv str dsty mate solid wall grav dlfn fv fr lumr lumg lumb lumuv colour vscs refl tags
2 0 0 0 BLOCK_AIR 0.0312 0.0312 0.0312 0.0312 1 1 NULL 0 1 N/A 0 0 4 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0
3 16 17 17 BLOCK_STONE 0.1252 0.1252 0.1252 0.1252 48 2400 ROCK 1 1 N/A 0 4 16 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0 ROCK,NATURAL
4 17 17 17 BLOCK_STONE_QUARRIED 0.1252 0.1252 0.1252 0.1252 48 2400 ROCK 1 1 N/A 0 4 16 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0 ROCK
55 162 162 162 BLOCK_PLATFORM_EBONY 0.0312 0.0312 0.0312 0.0312 5 1200 WOOD 0 0 N/A 0 0 16 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0 PLATFORM
56 163 163 163 BLOCK_PLATFORM_BIRCH 0.0312 0.0312 0.0312 0.0312 5 670 WOOD 0 0 N/A 0 0 16 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0 PLATFORM
57 164 164 164 BLOCK_PLATFORM_BLOODROSE 0.0312 0.0312 0.0312 0.0312 5 900 WOOD 0 0 N/A 0 0 16 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0 PLATFORM
58 176 176 192 176 BLOCK_TORCH 0.0312 0.0312 0.0312 0.0312 1 800 FXTR 0 0 N/A 1 0 16 1.0000 0.6372 0.0000 0.0000 N/A N/A 0.0 LIGHT
59 177 177 193 177 BLOCK_TORCH_FROST 0.0312 0.0312 0.0312 0.0312 1 1100 FXTR 0 0 N/A 1 0 16 0.3048 0.4848 1.0000 0.0000 N/A N/A 0.0 LIGHT
60 192 176 192 176 BLOCK_TORCH 0.0312 0.0312 0.0312 0.0312 1 800 FXTR 0 0 N/A 0 0 16 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0 LIGHT,UNLIT
61 193 177 193 177 BLOCK_TORCH_FROST 0.0312 0.0312 0.0312 0.0312 1 1100 FXTR 0 0 N/A 0 0 16 0.0000 0.0000 0.0000 0.0000 N/A N/A 0.0 LIGHT,UNLIT
62 208 208 208 BLOCK_ILLUMINATOR_WHITE 0.0312 0.0312 0.0312 0.0312 1 2500 GLAS 1 1 N/A 0 0 16 0.9270 0.9414 0.8519 0.0000 N/A N/A 0.0 LIGHT
63 209 209 209 BLOCK_ILLUMINATOR_YELLOW 0.0312 0.0312 0.0312 0.0312 1 2500 GLAS 1 1 N/A 0 0 16 1.0000 0.8408 0.0000 0.0000 N/A N/A 0.0 LIGHT
64 210 210 210 BLOCK_ILLUMINATOR_ORANGE 0.0312 0.0312 0.0312 0.0312 1 2500 GLAS 1 1 N/A 0 0 16 1.0000 0.5294 0.0000 0.0000 N/A N/A 0.0 LIGHT
123 # drop: Which item the DroppedItem actually adds to your inventory
124 # world: Which item the DroppedItem should impersonate when spawned # spawn: Which item the DroppedItem should impersonate when spawned
125 #
126 # Drop and World can point to the item from other modules (usually 'basegame')
127 # To achieve that, specify the full ID, e.g. basegame:32
128 # When no module ID is specified, the current module will be assumed.
129 #

View File

@@ -184,7 +184,7 @@ class BlockCodex {
// otherModname:id -> as-is // otherModname:id -> as-is
// id -> thisModname:id // id -> thisModname:id
prop.drop = record.get("drop").let { if (it == null) "" else if (it.contains(':')) it else "$modname:$it" } prop.drop = record.get("drop").let { if (it == null) "" else if (it.contains(':')) it else "$modname:$it" }
prop.world = record.get("world").let { if (it == null) "" else if (it.contains(':')) it else "$modname:$it" } prop.world = record.get("spawn").let { if (it == null) "" else if (it.contains(':')) it else "$modname:$it" }
prop.shadeColR = record.floatVal("shdr") prop.shadeColR = record.floatVal("shdr")
prop.shadeColG = record.floatVal("shdg") prop.shadeColG = record.floatVal("shdg")

View File

@@ -28,7 +28,7 @@ import java.util.Properties;
public class CSVEditor extends JFrame { public class CSVEditor extends JFrame {
/** Default columns. When you open existing csv, it should overwrite this. */ /** Default columns. When you open existing csv, it should overwrite this. */
private String[] columns = new String[]{"id", "drop", "world", "name", "shdr", "shdg", "shdb", "shduv", "str", "dsty", "mate", "solid", "wall", "grav", "dlfn", "fv", "fr", "lumr", "lumg", "lumb", "lumuv", "colour", "vscs", "refl","tags"}; private String[] columns = new String[]{"id", "drop", "spawn", "name", "shdr", "shdg", "shdb", "shduv", "str", "dsty", "mate", "solid", "wall", "grav", "dlfn", "fv", "fr", "lumr", "lumg", "lumb", "lumuv", "colour", "vscs", "refl","tags"};
private final int FOUR_DIGIT = 42; private final int FOUR_DIGIT = 42;
private final int SIX_DIGIT = 50; private final int SIX_DIGIT = 50;
private final int TWO_DIGIT = 30; private final int TWO_DIGIT = 30;
@@ -515,7 +515,7 @@ public class CSVEditor extends JFrame {
private String captionProperties = """ private String captionProperties = """
id=ID of this block id=ID of this block
drop=Which item the DroppedItem actually adds to your inventory drop=Which item the DroppedItem actually adds to your inventory
world=Which item the DroppedItem should impersonate when spawned spawn=Which item the DroppedItem should impersonate when spawned
name=String identifier of the block name=String identifier of the block
shdr=Shade Red (light absorption). Valid range 0.01.0+ shdr=Shade Red (light absorption). Valid range 0.01.0+
shdg=Shade Green (light absorption). Valid range 0.01.0+ shdg=Shade Green (light absorption). Valid range 0.01.0+

View File

@@ -41,6 +41,28 @@ open class ActorWithBody : Actor {
var physProp = PhysProperties.HUMANOID_DEFAULT var physProp = PhysProperties.HUMANOID_DEFAULT
// copied from old interface Luminous
/**
* Arguments:
*
* Hitbox(x-offset, y-offset, width, height)
* (Use ArrayList for normal circumstances)
*
* NOTE: MUST NOT SERIALISE (use `@Transient`)
*/
open var lightBoxList: List<Lightbox> = emptyList()
/**
* Arguments:
*
* Hitbox(x-offset, y-offset, width, height)
* (Use ArrayList for normal circumstances)
*
* NOTE: MUST NOT SERIALISE (use `@Transient`)
*/
open var shadeBoxList: List<Lightbox> = emptyList()
// end of Luminous
protected constructor() : super() protected constructor() : super()
constructor(renderOrder: RenderOrder, physProp: PhysProperties, id: ActorID? = null) : super(renderOrder, id) { constructor(renderOrder: RenderOrder, physProp: PhysProperties, id: ActorID? = null) : super(renderOrder, id) {

View File

@@ -22,8 +22,10 @@ class Lightbox() {
* For actors that either emits or blocks lights * For actors that either emits or blocks lights
* *
* Created by minjaesong on 2016-02-19. * Created by minjaesong on 2016-02-19.
*
* the interface Luminous is merged with the ActorWithBody -- minjaesong on 2022-09-11
*/ */
interface Luminous { /*interface Luminous {
/** /**
* Arguments: * Arguments:
@@ -44,4 +46,4 @@ interface Luminous {
* NOTE: MUST NOT SERIALISE (use `@Transient`) * NOTE: MUST NOT SERIALISE (use `@Transient`)
*/ */
val shadeBoxList: List<Lightbox> val shadeBoxList: List<Lightbox>
} }*/

View File

@@ -3,7 +3,9 @@ package net.torvald.terrarum.gameitems
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.ReferencingRanges.PREFIX_ACTORITEM
import net.torvald.terrarum.ReferencingRanges.PREFIX_DYNAMICITEM import net.torvald.terrarum.ReferencingRanges.PREFIX_DYNAMICITEM
import net.torvald.terrarum.ReferencingRanges.PREFIX_VIRTUALTILE
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
@@ -407,3 +409,11 @@ fun mouseInInteractableRangeTools(actor: ActorWithBody, item: GameItem?, reachMu
//fun IntRange.pickRandom() = HQRNG().nextInt(this.last - this.first + 1) + this.first // count() on 200 million entries? Se on vitun hyvää idea //fun IntRange.pickRandom() = HQRNG().nextInt(this.last - this.first + 1) + this.first // count() on 200 million entries? Se on vitun hyvää idea
//fun IntArray.pickRandom(): Int = this[HQRNG().nextInt(this.size)] //fun IntArray.pickRandom(): Int = this[HQRNG().nextInt(this.size)]
//fun DoubleArray.pickRandom(): Double = this[HQRNG().nextInt(this.size)] //fun DoubleArray.pickRandom(): Double = this[HQRNG().nextInt(this.size)]
fun ItemID.isItem() = this.startsWith("item@")
fun ItemID.isWire() = this.startsWith("wire@")
fun ItemID.isDynamic() = this.startsWith("$PREFIX_DYNAMICITEM:")
fun ItemID.isActor() = this.startsWith("$PREFIX_ACTORITEM@")
fun ItemID.isVirtual() = this.startsWith("$PREFIX_VIRTUALTILE@")
fun ItemID.isBlock() = !this.contains('@')
fun ItemID.isWall() = this.startsWith("wall@")

View File

@@ -8,8 +8,7 @@ import net.torvald.terrarum.ReferencingRanges
import net.torvald.terrarum.ReferencingRanges.PREFIX_ACTORITEM import net.torvald.terrarum.ReferencingRanges.PREFIX_ACTORITEM
import net.torvald.terrarum.ReferencingRanges.PREFIX_DYNAMICITEM import net.torvald.terrarum.ReferencingRanges.PREFIX_DYNAMICITEM
import net.torvald.terrarum.Terrarum import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.*
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.CanBeAnItem import net.torvald.terrarum.modulebasegame.gameactors.CanBeAnItem
import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase
@@ -132,27 +131,23 @@ class ItemCodex {
fun getItemImage(itemID: ItemID?): TextureRegion? { fun getItemImage(itemID: ItemID?): TextureRegion? {
if (itemID == null) return null if (itemID == null) return null
// dynamic item if (itemID.isDynamic()) {
if (itemID.startsWith("$PREFIX_DYNAMICITEM:")) {
return getItemImage(dynamicToStaticID(itemID)) return getItemImage(dynamicToStaticID(itemID))
} }
// item else if (itemID.isItem()) {
else if (itemID.startsWith("item@")) {
return itemCodex[itemID]?.itemImage return itemCodex[itemID]?.itemImage
} }
// wires else if (itemID.isWire()) {
else if (itemID.startsWith("wire@")) {
return itemCodex[itemID]?.itemImage return itemCodex[itemID]?.itemImage
} }
// wall else if (itemID.isWall()) {
else if (itemID.startsWith("wall@")) {
val itemSheetNumber = App.tileMaker.tileIDtoItemSheetNumber(itemID.substring(5)) val itemSheetNumber = App.tileMaker.tileIDtoItemSheetNumber(itemID.substring(5))
return BlocksDrawer.tileItemWall.get( return BlocksDrawer.tileItemWall.get(
itemSheetNumber % App.tileMaker.TILES_IN_X, itemSheetNumber % App.tileMaker.TILES_IN_X,
itemSheetNumber / App.tileMaker.TILES_IN_X itemSheetNumber / App.tileMaker.TILES_IN_X
) )
} }
// terrain // else: terrain
else { else {
val itemSheetNumber = App.tileMaker.tileIDtoItemSheetNumber(itemID) val itemSheetNumber = App.tileMaker.tileIDtoItemSheetNumber(itemID)
return BlocksDrawer.tileItemTerrain.get( return BlocksDrawer.tileItemTerrain.get(

View File

@@ -9,7 +9,6 @@ import net.torvald.spriteanimation.HasAssembledSprite
import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.spriteanimation.SheetSpriteAnimation
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.App.printdbg
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED
import net.torvald.terrarum.gameactors.* import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.gameactors.faction.Faction import net.torvald.terrarum.gameactors.faction.Faction
import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.GameItem
@@ -28,7 +27,7 @@ import org.dyn4j.geometry.Vector2
* *
* Created by minjaesong on 2016-10-24. * Created by minjaesong on 2016-10-24.
*/ */
open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, LandHolder, HistoricalFigure { open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, LandHolder, HistoricalFigure {
protected constructor() protected constructor()
@@ -100,15 +99,10 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
* Hitbox(x-offset, y-offset, width, height) * Hitbox(x-offset, y-offset, width, height)
* (Use ArrayList for normal circumstances) * (Use ArrayList for normal circumstances)
*/ */
override val lightBoxList: List<Lightbox> @Transient override var lightBoxList: List<Lightbox> = listOf(Lightbox(Hitbox(2.0, 2.0, baseHitboxW - 3.0, baseHitboxH - 3.0), Cvec(0)))
get() = arrayOf(Lightbox(Hitbox(2.0, 2.0, baseHitboxW - 3.0, baseHitboxH - 3.0), actorValueColour)).toList() // things are asymmetric!! // the actual values are update on the update()
// use getter; dimension of the player may change by time. @Transient override var shadeBoxList: List<Lightbox> = listOf(Lightbox(Hitbox(2.0, 2.0, baseHitboxW - 3.0, baseHitboxH - 3.0), Cvec(0)))
// scaling of the lightbox is performed on the LightmapRenderer. Getter is still required because of the changing actorValueColour. Lightbox.light cannot be `() -> Cvec` due to performance and serialising issue. // the actual values are update on the update()
override val shadeBoxList: List<Lightbox>
get() = arrayOf(Lightbox(Hitbox(2.0, 2.0, baseHitboxW - 3.0, baseHitboxH - 3.0), actorValueShade)).toList() // things are asymmetric!!
// use getter; dimension of the player may change by time.
// scaling of the shadebox is performed on the LightmapRenderer. Getter is still required because of the changing actorValueColour. Lightbox.light cannot be `() -> Cvec` due to performance and serialising issue.
@Transient val BASE_DENSITY = 980.0 @Transient val BASE_DENSITY = 980.0
@@ -201,6 +195,11 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
} }
override fun update(delta: Float) { override fun update(delta: Float) {
// update lightbox
lightBoxList[0].light = actorValueColour
shadeBoxList[0].light = actorValueShade
super.update(delta) super.update(delta)
if (vehicleRiding is IngamePlayer) if (vehicleRiding is IngamePlayer)

View File

@@ -3,16 +3,14 @@ package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.jme3.math.FastMath import com.jme3.math.FastMath
import net.torvald.gdx.graphics.Cvec
import net.torvald.terrarum.BlockCodex import net.torvald.terrarum.BlockCodex
import net.torvald.terrarum.INGAME import net.torvald.terrarum.INGAME
import net.torvald.terrarum.ItemCodex import net.torvald.terrarum.ItemCodex
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitems.*
import net.torvald.terrarum.gameactors.PhysProperties
import net.torvald.terrarum.gameactors.drawBodyInGoodPosition
import net.torvald.terrarum.gameitems.ItemID
/** /**
* Created by minjaesong on 2016-03-15. * Created by minjaesong on 2016-03-15.
@@ -38,6 +36,14 @@ open class DroppedItem : ActorWithBody {
fun canBePickedUp() = timeSinceSpawned > NO_PICKUP_TIME && !flagDespawn fun canBePickedUp() = timeSinceSpawned > NO_PICKUP_TIME && !flagDespawn
private val randKey1 = (Math.random() * 256).toInt()
private val randKey2 = (Math.random() * 256).toInt()
override var lightBoxList = listOf(Lightbox(this.hitbox.clone().setPosition(0.0, 0.0), Cvec(0)))
// the Cvec will be calculated dynamically on Update
override var shadeBoxList = listOf(Lightbox(this.hitbox.clone().setPosition(0.0, 0.0), Cvec(0)))
// the Cvec will be calculated dynamically on Update
/** /**
* @param topLeftX world-wise coord * @param topLeftX world-wise coord
* @param topLeftY world-wise coord * @param topLeftY world-wise coord
@@ -45,12 +51,12 @@ open class DroppedItem : ActorWithBody {
constructor(itemID: ItemID, topLeftX: Double, topLeftY: Double) : super(RenderOrder.MIDTOP, PhysProperties.PHYSICS_OBJECT) { constructor(itemID: ItemID, topLeftX: Double, topLeftY: Double) : super(RenderOrder.MIDTOP, PhysProperties.PHYSICS_OBJECT) {
this.itemID = itemID this.itemID = itemID
if (itemID.startsWith("actor@")) if (itemID.isActor())
throw RuntimeException("Attempted to create DroppedItem actor of a real actor; the real actor must be dropped instead.") throw RuntimeException("Attempted to create DroppedItem actor of a real actor; the real actor must be dropped instead.")
isVisible = true isVisible = true
avBaseMass = if (itemID.startsWith("item@") || itemID.startsWith("wire@")) avBaseMass = if (itemID.isItem() || itemID.isWire())
(ItemCodex[itemID]?.mass ?: 2.0).coerceAtMost(2.0) (ItemCodex[itemID]?.mass ?: 2.0).coerceAtMost(2.0)
else else
BlockCodex[itemID].density / 1000.0 // block and wall BlockCodex[itemID].density / 1000.0 // block and wall
@@ -73,7 +79,6 @@ open class DroppedItem : ActorWithBody {
Math.cos(Math.random() * Math.PI / 2 + Math.PI / 2) * magn Math.cos(Math.random() * Math.PI / 2 + Math.PI / 2) * magn
else else
Math.cos(Math.random() * Math.PI) * magn Math.cos(Math.random() * Math.PI) * magn
} }
override fun drawBody(batch: SpriteBatch) { override fun drawBody(batch: SpriteBatch) {
@@ -104,6 +109,12 @@ open class DroppedItem : ActorWithBody {
} }
override fun update(delta: Float) { override fun update(delta: Float) {
if (this.itemID.isBlock() || this.itemID.isItem()) {
BlockCodex[this.itemID].let {
this.lightBoxList[0].light = it.getLumCol(randKey1, randKey2)
}
}
super.update(delta) super.update(delta)
timeSinceSpawned += delta timeSinceSpawned += delta

View File

@@ -22,7 +22,7 @@ import kotlin.math.absoluteValue
* *
* Created by minjaesong on 2022-07-15. * Created by minjaesong on 2022-07-15.
*/ */
open class FixtureSwingingDoorBase : FixtureBase, Luminous { open class FixtureSwingingDoorBase : FixtureBase {
/* OVERRIDE THESE TO CUSTOMISE */ /* OVERRIDE THESE TO CUSTOMISE */
var tw = 2 // tilewise width of the door when opened var tw = 2 // tilewise width of the door when opened
@@ -45,8 +45,10 @@ open class FixtureSwingingDoorBase : FixtureBase, Luminous {
private var pixelwiseHitboxHeight = TILE_SIZE * tilewiseHitboxHeight private var pixelwiseHitboxHeight = TILE_SIZE * tilewiseHitboxHeight
private var tilewiseDistToAxis = tw - twClosed private var tilewiseDistToAxis = tw - twClosed
@Transient override val lightBoxList: ArrayList<Lightbox> = ArrayList() @Transient override var lightBoxList = listOf(Lightbox(Hitbox(TILE_SIZED * tilewiseDistToAxis, 0.0, TILE_SIZED * twClosed, TILE_SIZED * th), Cvec(0)))
@Transient override val shadeBoxList: ArrayList<Lightbox> = ArrayList() // the Cvec will be calculated dynamically on Update
@Transient override var shadeBoxList = listOf(Lightbox(Hitbox(TILE_SIZED * tilewiseDistToAxis, 0.0, TILE_SIZED * twClosed, TILE_SIZED * th), Cvec(0)))
// the Cvec will be calculated dynamically on Update
protected var doorState = 0 // -1: open toward left, 0: closed, 1: open toward right protected var doorState = 0 // -1: open toward left, 0: closed, 1: open toward right
protected var doorStateTimer: Second = 0f protected var doorStateTimer: Second = 0f
@@ -123,8 +125,7 @@ open class FixtureSwingingDoorBase : FixtureBase, Luminous {
// define light/shadebox // define light/shadebox
// TODO: redefine when opened to left/right // TODO: redefine when opened to left/right
(if (isOpacityActuallyLuminosity) lightBoxList else shadeBoxList).add( (if (isOpacityActuallyLuminosity) lightBoxList else shadeBoxList)[0].light = opacity
Lightbox(Hitbox(TILE_SIZED * tilewiseDistToAxis, 0.0, TILE_SIZED * twClosed, TILE_SIZED * th), opacity))
// define physical size // define physical size
setHitboxDimension(TILE_SIZE * tilewiseHitboxWidth, TILE_SIZE * tilewiseHitboxHeight, 0, 0) setHitboxDimension(TILE_SIZE * tilewiseHitboxWidth, TILE_SIZE * tilewiseHitboxHeight, 0, 0)
@@ -148,8 +149,7 @@ open class FixtureSwingingDoorBase : FixtureBase, Luminous {
// define light/shadebox // define light/shadebox
// TODO: redefine when opened to left/right // TODO: redefine when opened to left/right
(if (isOpacityActuallyLuminosity) lightBoxList else shadeBoxList).add( (if (isOpacityActuallyLuminosity) lightBoxList else shadeBoxList)[0].light = opacity
Lightbox(Hitbox(TILE_SIZED * tilewiseDistToAxis, 0.0, TILE_SIZED * twClosed, TILE_SIZED * th), opacity))
} }

View File

@@ -1,8 +1,6 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.gdx.graphics.Cvec
import net.torvald.random.HQRNG
import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.spriteanimation.SheetSpriteAnimation
import net.torvald.terrarum.BlockCodex import net.torvald.terrarum.BlockCodex
import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.CommonResourcePool
@@ -12,7 +10,6 @@ import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Hitbox
import net.torvald.terrarum.gameactors.Lightbox import net.torvald.terrarum.gameactors.Lightbox
import net.torvald.terrarum.gameactors.Luminous
import net.torvald.terrarum.gameparticles.ParticleVanishingSprite import net.torvald.terrarum.gameparticles.ParticleVanishingSprite
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
@@ -21,20 +18,12 @@ import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/** /**
* Created by minjaesong on 2016-06-17. * Created by minjaesong on 2016-06-17.
*/ */
internal class FixtureTikiTorch : FixtureBase, Luminous { internal class FixtureTikiTorch : FixtureBase {
private val rng = HQRNG() private val rndHash1 = (Math.random() * 256).toInt()
private val rndHash1 = rng.nextInt() private val rndHash2 = (Math.random() * 256).toInt()
private val rndHash2 = rng.nextInt()
private var color: Cvec @Transient override var lightBoxList = listOf(Lightbox(Hitbox(6.0, 5.0, 4.0, 3.0), BlockCodex[Block.TORCH].getLumCol(rndHash1, rndHash2)))
get() = try { BlockCodex[Block.TORCH].getLumCol(rndHash1, rndHash2) } catch (e: NullPointerException) { Cvec() }
set(value) {
throw UnsupportedOperationException()
}
@Transient override val lightBoxList: ArrayList<Lightbox> = ArrayList(1)
@Transient override val shadeBoxList: ArrayList<Lightbox> = ArrayList(1)
constructor() : super( constructor() : super(
BlockBox(BlockBox.NO_COLLISION, 1, 2), BlockBox(BlockBox.NO_COLLISION, 1, 2),
@@ -51,8 +40,6 @@ internal class FixtureTikiTorch : FixtureBase, Luminous {
setHitboxDimension(16, 32, 0, 0) setHitboxDimension(16, 32, 0, 0)
lightBoxList.add(Lightbox(Hitbox(6.0, 5.0, 4.0, 3.0), color))
makeNewSprite(FixtureBase.getSpritesheet("basegame", "sprites/fixtures/tiki_torch.tga", 16, 32)).let { makeNewSprite(FixtureBase.getSpritesheet("basegame", "sprites/fixtures/tiki_torch.tga", 16, 32)).let {
it.setRowsAndFrames(1,2) it.setRowsAndFrames(1,2)
} }
@@ -64,18 +51,20 @@ internal class FixtureTikiTorch : FixtureBase, Luminous {
private var spawnTimer = 0f private var spawnTimer = 0f
override fun update(delta: Float) { override fun update(delta: Float) {
lightBoxList[0].light = BlockCodex[Block.TORCH].getLumCol(rndHash1, rndHash2)
super.update(delta) super.update(delta)
if (spawnTimer >= nextDelay) { if (spawnTimer >= nextDelay) {
(Terrarum.ingame as TerrarumIngame).addParticle(ParticleVanishingSprite( (Terrarum.ingame as TerrarumIngame).addParticle(ParticleVanishingSprite(
CommonResourcePool.getAsTextureRegionPack("particles-tiki_smoke.tga"), CommonResourcePool.getAsTextureRegionPack("particles-tiki_smoke.tga"),
25f, true, hitbox.centeredX, hitbox.startY, false, rng.nextInt(256) 25f, true, hitbox.centeredX, hitbox.startY, false, (Math.random() * 256).toInt()
)) ))
spawnTimer -= nextDelay spawnTimer -= nextDelay
nextDelay = rng.nextFloat() * 0.25f + 0.25f nextDelay = Math.random().toFloat() * 0.25f + 0.25f
(sprite as? SheetSpriteAnimation)?.delays?.set(0, rng.nextFloat() * 0.4f + 0.1f) (sprite as? SheetSpriteAnimation)?.delays?.set(0, Math.random().toFloat() * 0.4f + 0.1f)
} }
spawnTimer += delta spawnTimer += delta

View File

@@ -1,13 +1,13 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import net.torvald.gdx.graphics.Cvec import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameactors.* import net.torvald.terrarum.gameactors.PhysProperties
import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.ItemID
/** /**
* Created by minjaesong on 2016-04-26. * Created by minjaesong on 2016-04-26.
*/ */
class ItemCarrying : ActorWithBody, Luminous { class ItemCarrying : ActorWithBody {
var itemID: ItemID = ""; private set var itemID: ItemID = ""; private set
@@ -20,30 +20,6 @@ class ItemCarrying : ActorWithBody, Luminous {
// just let the solver use AABB; it's cheap but works just enough // just let the solver use AABB; it's cheap but works just enough
/**
* Recommended implementation:
*
override var color: Int
get() = actorValue.getAsInt(AVKey.LUMINOSITY) ?: 0
set(value) {
actorValue[AVKey.LUMINOSITY] = value
}
*/
private var color: Cvec
get() = throw UnsupportedOperationException()
set(value) {
}
/**
* Arguments:
*
* Hitbox(x-offset, y-offset, width, height)
* (Use ArrayList for normal circumstances)
*/
override val lightBoxList: List<Lightbox>
get() = throw UnsupportedOperationException()
override val shadeBoxList: List<Lightbox>
get() = throw UnsupportedOperationException()
init { init {
} }

View File

@@ -3,14 +3,15 @@ package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.gdx.graphics.Cvec import net.torvald.gdx.graphics.Cvec
import net.torvald.terrarum.BlockCodex
import net.torvald.terrarum.INGAME
import net.torvald.terrarum.Point2d import net.torvald.terrarum.Point2d
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameactors.Hitbox
import net.torvald.terrarum.gameactors.Lightbox
import net.torvald.terrarum.gameactors.PhysProperties
import org.dyn4j.geometry.Vector2 import org.dyn4j.geometry.Vector2
import java.util.*
import net.torvald.terrarum.*
import net.torvald.terrarum.gameactors.*
/** /**
* Simplest projectile. * Simplest projectile.
@@ -19,7 +20,7 @@ import net.torvald.terrarum.gameactors.*
*/ */
// TODO simplified, lightweight physics (does not call PhysicsSolver) // TODO simplified, lightweight physics (does not call PhysicsSolver)
open class ProjectileSimple : ActorWithBody, Luminous, Projectile { open class ProjectileSimple : ActorWithBody, Projectile {
private var type: Int = 0 private var type: Int = 0
var damage: Int = 0 var damage: Int = 0
@@ -38,8 +39,8 @@ open class ProjectileSimple : ActorWithBody, Luminous, Projectile {
* Hitbox(x-offset, y-offset, width, height) * Hitbox(x-offset, y-offset, width, height)
* (Use ArrayList for normal circumstances) * (Use ArrayList for normal circumstances)
*/ */
@Transient override val lightBoxList = ArrayList<Lightbox>() @Transient override var lightBoxList = listOf(Lightbox(Hitbox(-4.0, -4.0, 8.0, 8.0), color)) // lightbox sized 8x8 centered to the bullet
@Transient override val shadeBoxList = ArrayList<Lightbox>()
private val lifetimeMax = 2500 private val lifetimeMax = 2500
private var lifetimeCounter = 0f private var lifetimeCounter = 0f
@@ -57,8 +58,6 @@ open class ProjectileSimple : ActorWithBody, Luminous, Projectile {
setPosition(fromPoint.x, fromPoint.y) setPosition(fromPoint.x, fromPoint.y)
posPre = Point2d(fromPoint.x, fromPoint.y) posPre = Point2d(fromPoint.x, fromPoint.y)
// lightbox sized 8x8 centered to the bullet
lightBoxList.add(Lightbox(Hitbox(-4.0, -4.0, 8.0, 8.0), color))
//this.externalV.set(velocity) //this.externalV.set(velocity)
damage = bulletDatabase[type][OFFSET_DAMAGE] as Int damage = bulletDatabase[type][OFFSET_DAMAGE] as Int

View File

@@ -5,6 +5,7 @@ import net.torvald.terrarum.*
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.gameitems.isWall
import net.torvald.terrarum.gameitems.mouseInInteractableRange import net.torvald.terrarum.gameitems.mouseInInteractableRange
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
@@ -40,7 +41,7 @@ object BlockBase {
if (!ret1) return@mouseInInteractableRange -1L if (!ret1) return@mouseInInteractableRange -1L
} }
val isWall = itemID.startsWith("wall@") val isWall = itemID.isWall()
val terrainUnderCursor = ingame.world.getTileFromTerrain(mouseTile.x, mouseTile.y) val terrainUnderCursor = ingame.world.getTileFromTerrain(mouseTile.x, mouseTile.y)
val wallUnderCursor = ingame.world.getTileFromWall(mouseTile.x, mouseTile.y) val wallUnderCursor = ingame.world.getTileFromWall(mouseTile.x, mouseTile.y)

View File

@@ -12,10 +12,8 @@ import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.blockproperties.BlockProp import net.torvald.terrarum.blockproperties.BlockProp
import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.blockproperties.Fluid
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameactors.Luminous
import net.torvald.terrarum.gameworld.BlockAddress import net.torvald.terrarum.gameworld.BlockAddress
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.modulebasegame.IngameRenderer
import net.torvald.terrarum.modulebasegame.ui.abs import net.torvald.terrarum.modulebasegame.ui.abs
import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.realestate.LandUtil
@@ -349,46 +347,44 @@ object LightmapRenderer {
lanternMap.clear() lanternMap.clear()
shadowMap.clear() shadowMap.clear()
actorContainer.forEach { actorContainer.forEach {
if (it is Luminous) { val lightBoxCopy = it.lightBoxList.subList(0, it.lightBoxList.size) // make copy to prevent ConcurrentModificationException
val lightBoxCopy = it.lightBoxList.subList(0, it.lightBoxList.size) // make copy to prevent ConcurrentModificationException val shadeBoxCopy = it.shadeBoxList.subList(0, it.shadeBoxList.size) // make copy to prevent ConcurrentModificationException
val shadeBoxCopy = it.shadeBoxList.subList(0, it.shadeBoxList.size) // make copy to prevent ConcurrentModificationException val scale = it.scale
val scale = it.scale
// put lanterns to the area the luminantBox is occupying // put lanterns to the area the luminantBox is occupying
lightBoxCopy.forEach { (lightBox, colour) -> lightBoxCopy.forEach { (lightBox, colour) ->
val lightBoxX = it.hitbox.startX + (lightBox.startX * scale) val lightBoxX = it.hitbox.startX + (lightBox.startX * scale)
val lightBoxY = it.hitbox.startY + (lightBox.startY * scale) val lightBoxY = it.hitbox.startY + (lightBox.startY * scale)
val lightBoxW = lightBox.width * scale val lightBoxW = lightBox.width * scale
val lightBoxH = lightBox.height * scale val lightBoxH = lightBox.height * scale
for (y in lightBoxY.div(TILE_SIZE).floorInt() for (y in lightBoxY.div(TILE_SIZE).floorInt()
..lightBoxY.plus(lightBoxH).div(TILE_SIZE).floorInt()) { ..lightBoxY.plus(lightBoxH).div(TILE_SIZE).floorInt()) {
for (x in lightBoxX.div(TILE_SIZE).floorInt() for (x in lightBoxX.div(TILE_SIZE).floorInt()
..lightBoxX.plus(lightBoxW).div(TILE_SIZE).floorInt()) { ..lightBoxX.plus(lightBoxW).div(TILE_SIZE).floorInt()) {
val oldLight = lanternMap[LandUtil.getBlockAddr(world, x, y)] ?: Cvec(0) // if two or more luminous actors share the same block, mix the light val oldLight = lanternMap[LandUtil.getBlockAddr(world, x, y)] ?: Cvec(0) // if two or more luminous actors share the same block, mix the light
val actorLight = colour val actorLight = colour
lanternMap[LandUtil.getBlockAddr(world, x, y)] = oldLight.maxAndAssign(actorLight) lanternMap[LandUtil.getBlockAddr(world, x, y)] = oldLight.maxAndAssign(actorLight)
}
} }
} }
}
// put shades to the area the luminantBox is occupying // put shades to the area the luminantBox is occupying
shadeBoxCopy.forEach { (shadeBox, colour) -> shadeBoxCopy.forEach { (shadeBox, colour) ->
val lightBoxX = it.hitbox.startX + (shadeBox.startX * scale) val lightBoxX = it.hitbox.startX + (shadeBox.startX * scale)
val lightBoxY = it.hitbox.startY + (shadeBox.startY * scale) val lightBoxY = it.hitbox.startY + (shadeBox.startY * scale)
val lightBoxW = shadeBox.width * scale val lightBoxW = shadeBox.width * scale
val lightBoxH = shadeBox.height * scale val lightBoxH = shadeBox.height * scale
for (y in lightBoxY.div(TILE_SIZE).floorInt() for (y in lightBoxY.div(TILE_SIZE).floorInt()
..lightBoxY.plus(lightBoxH).div(TILE_SIZE).floorInt()) { ..lightBoxY.plus(lightBoxH).div(TILE_SIZE).floorInt()) {
for (x in lightBoxX.div(TILE_SIZE).floorInt() for (x in lightBoxX.div(TILE_SIZE).floorInt()
..lightBoxX.plus(lightBoxW).div(TILE_SIZE).floorInt()) { ..lightBoxX.plus(lightBoxW).div(TILE_SIZE).floorInt()) {
val oldLight = shadowMap[LandUtil.getBlockAddr(world, x, y)] ?: Cvec(0) // if two or more luminous actors share the same block, mix the light val oldLight = shadowMap[LandUtil.getBlockAddr(world, x, y)] ?: Cvec(0) // if two or more luminous actors share the same block, mix the light
val actorLight = colour val actorLight = colour
shadowMap[LandUtil.getBlockAddr(world, x, y)] = oldLight.maxAndAssign(actorLight) shadowMap[LandUtil.getBlockAddr(world, x, y)] = oldLight.maxAndAssign(actorLight)
}
} }
} }
} }