simpler way of making item sprite

This commit is contained in:
minjaesong
2022-03-01 19:08:06 +09:00
parent 7e90387afc
commit 6906d24e59
11 changed files with 108 additions and 65 deletions

View File

@@ -11,13 +11,13 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.modulebasegame.gameactors.BlockBox import net.torvald.terrarum.modulebasegame.gameactors.BlockBox
import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase
import net.torvald.terrarum.modulebasegame.gameactors.FixtureInventory import net.torvald.terrarum.modulebasegame.gameactors.FixtureInventory
import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import net.torvald.tsvm.* import net.torvald.tsvm.*
import net.torvald.tsvm.peripheral.GraphicsAdapter import net.torvald.tsvm.peripheral.GraphicsAdapter
import net.torvald.tsvm.peripheral.ReferenceGraphicsAdapter import net.torvald.tsvm.peripheral.ReferenceGraphicsAdapter
@@ -43,7 +43,7 @@ class FixtureHomeComputer : FixtureBase {
density = 1400.0 density = 1400.0
setHitboxDimension(TerrarumAppConfiguration.TILE_SIZE, TerrarumAppConfiguration.TILE_SIZE, 0, -1) setHitboxDimension(TerrarumAppConfiguration.TILE_SIZE, TerrarumAppConfiguration.TILE_SIZE, 0, -1)
makeNewSprite(TextureRegionPack(CommonResourcePool.getAsTextureRegion("dwarventech-sprites-fixtures-desktop_computer.tga").texture, TerrarumAppConfiguration.TILE_SIZE, TerrarumAppConfiguration.TILE_SIZE)) makeNewSprite(FixtureBase.getSpritesheet("dwarventech", "sprites/fixtures/desktop_computer.tga", TILE_SIZE, TILE_SIZE))
sprite!!.setRowsAndFrames(1, 1) sprite!!.setRowsAndFrames(1, 1)
actorValue[AVKey.BASEMASS] = 20.0 actorValue[AVKey.BASEMASS] = 20.0

View File

@@ -1,15 +1,14 @@
package net.torvald.terrarum.modulecomputers.gameitems package net.torvald.terrarum.modulecomputers.gameitems
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.Terrarum import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.TerrarumAppConfiguration
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.mouseInInteractableRange import net.torvald.terrarum.gameitems.mouseInInteractableRange
import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.itemproperties.Material
import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase
import net.torvald.terrarum.modulecomputers.gameactors.FixtureHomeComputer import net.torvald.terrarum.modulecomputers.gameactors.FixtureHomeComputer
/** /**
@@ -26,19 +25,11 @@ class ItemHomeComputer(originalID: ItemID) : GameItem(originalID) {
override val isDynamic = false override val isDynamic = false
override val material = Material() override val material = Material()
override val itemImage: TextureRegion override val itemImage: TextureRegion
get() = CommonResourcePool.getAsTextureRegion("dwarventech-sprites-fixtures-desktop_computer.tga") get() = FixtureItemBase.getItemImageFromSheet("dwarventech", "sprites/fixtures/desktop_computer.tga", TerrarumAppConfiguration.TILE_SIZE, TerrarumAppConfiguration.TILE_SIZE)
override var baseToolSize: Double? = baseMass override var baseToolSize: Double? = baseMass
init { init {
CommonResourcePool.addToLoadingList("dwarventech-sprites-fixtures-desktop_computer.tga") {
// val t = TextureRegion(Texture(ModMgr.getGdxFile("dwarventech", "nonexisting_file!!!")))
val t = TextureRegion(Texture(ModMgr.getGdxFile("dwarventech", "sprites/fixtures/desktop_computer.tga")))
t.flip(false, false)
/*return*/t
}
CommonResourcePool.loadAll()
equipPosition = EquipPosition.HAND_GRIP equipPosition = EquipPosition.HAND_GRIP
} }

View File

@@ -10,6 +10,7 @@ import net.torvald.terrarum.gameactors.PhysProperties
import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import org.dyn4j.geometry.Vector2 import org.dyn4j.geometry.Vector2
typealias BlockBoxIndex = Int typealias BlockBoxIndex = Int
@@ -222,6 +223,18 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange {
override fun flagDespawn() { override fun flagDespawn() {
if (canBeDespawned) flagDespawn = true if (canBeDespawned) flagDespawn = true
} }
/**
* Also see: [net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase.Companion]
*/
companion object {
fun getSpritesheet(module: String, path: String, tileW: Int, tileH: Int): TextureRegionPack {
val id = "$module/${path.replace('\\','/')}"
return (CommonResourcePool.getOrPut(id) {
TextureRegionPack(ModMgr.getGdxFile(module, path), tileW, tileH, flipY = false)
} as TextureRegionPack)
}
}
} }
interface CuedByTerrainChange { interface CuedByTerrainChange {

View File

@@ -7,6 +7,7 @@ import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import org.dyn4j.geometry.Vector2 import org.dyn4j.geometry.Vector2
@@ -23,6 +24,8 @@ class FixtureLogicSignalEmitter : FixtureBase, Electric {
) )
init { init {
val itemImage = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/signal_source.tga")
CommonResourcePool.addToLoadingList("basegame-sprites-fixtures-signal_source.tga") { CommonResourcePool.addToLoadingList("basegame-sprites-fixtures-signal_source.tga") {
val t = TextureRegion(Texture(ModMgr.getGdxFile("basegame", "sprites/fixtures/signal_source.tga"))) val t = TextureRegion(Texture(ModMgr.getGdxFile("basegame", "sprites/fixtures/signal_source.tga")))
t.flip(false, false) t.flip(false, false)
@@ -33,7 +36,7 @@ class FixtureLogicSignalEmitter : FixtureBase, Electric {
density = 1400.0 density = 1400.0
setHitboxDimension(TILE_SIZE, TILE_SIZE, 0, -1) setHitboxDimension(TILE_SIZE, TILE_SIZE, 0, -1)
makeNewSprite(TextureRegionPack(CommonResourcePool.getAsTextureRegion("basegame-sprites-fixtures-signal_source.tga").texture, TILE_SIZE, TILE_SIZE)) makeNewSprite(TextureRegionPack(itemImage.texture, TILE_SIZE, TILE_SIZE))
sprite!!.setRowsAndFrames(1, 1) sprite!!.setRowsAndFrames(1, 1)
actorValue[AVKey.BASEMASS] = MASS actorValue[AVKey.BASEMASS] = MASS

View File

@@ -57,7 +57,7 @@ internal class FixtureTapestry : FixtureBase {
val frame = CommonResourcePool.getOrPut("tapestries-common-frame_$tileFilename.tga") { val frame = CommonResourcePool.getOrPut("tapestries-common-frame_$tileFilename.tga") {
Pixmap(ModMgr.getGdxFilesFromEveryMod("tapestries/common/frame_$tileFilename.tga").last().second) Pixmap(ModMgr.getGdxFilesFromEveryMod("tapestries/common/frame_$tileFilename.tga").last().second)
} as Pixmap } as Pixmap
val canvas = CommonResourcePool.getOrPut("tapestries-common-canvas") { val canvas = CommonResourcePool.getOrPut("tapestries-common-canvas.tga") {
Pixmap(ModMgr.getGdxFilesFromEveryMod("tapestries/common/canvas.tga").last().second) Pixmap(ModMgr.getGdxFilesFromEveryMod("tapestries/common/canvas.tga").last().second)
} as Pixmap } as Pixmap

View File

@@ -41,9 +41,6 @@ internal class FixtureTikiTorch : FixtureBase, Luminous {
) { ) {
// loading textures // loading textures
CommonResourcePool.addToLoadingList("sprites-fixtures-tiki_torch.tga") {
TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/fixtures/tiki_torch.tga"), 16, 32, flipY = false)
}
CommonResourcePool.addToLoadingList("particles-tiki_smoke.tga") { CommonResourcePool.addToLoadingList("particles-tiki_smoke.tga") {
TextureRegionPack(ModMgr.getGdxFile("basegame", "particles/bigger_smoke.tga"), 16, 16) TextureRegionPack(ModMgr.getGdxFile("basegame", "particles/bigger_smoke.tga"), 16, 16)
} }
@@ -55,7 +52,7 @@ internal class FixtureTikiTorch : FixtureBase, Luminous {
lightBoxList.add(Lightbox(Hitbox(6.0, 5.0, 4.0, 3.0), color)) lightBoxList.add(Lightbox(Hitbox(6.0, 5.0, 4.0, 3.0), color))
makeNewSprite(CommonResourcePool.getAsTextureRegionPack("sprites-fixtures-tiki_torch.tga")) makeNewSprite(FixtureBase.getSpritesheet("basegame", "sprites/fixtures/tiki_torch.tga", 16, 32))
sprite!!.setRowsAndFrames(1, 2) sprite!!.setRowsAndFrames(1, 2)
actorValue[AVKey.BASEMASS] = MASS actorValue[AVKey.BASEMASS] = MASS

View File

@@ -1,10 +1,8 @@
package net.torvald.terrarum.modulebasegame.gameitems package net.torvald.terrarum.modulebasegame.gameitems
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.*
import net.torvald.terrarum.INGAME
import net.torvald.terrarum.ItemCodex
import net.torvald.terrarum.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
@@ -12,6 +10,7 @@ import net.torvald.terrarum.gameitems.mouseInInteractableRange
import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.itemproperties.Material
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/** /**
* Created by minjaesong on 2021-12-13. * Created by minjaesong on 2021-12-13.
@@ -70,4 +69,24 @@ open class FixtureItemBase(originalID: ItemID, val fixtureClassName: String) : G
// return true when placed, false when cannot be placed // return true when placed, false when cannot be placed
} }
/**
* Also see: [net.torvald.terrarum.modulebasegame.gameactors.FixtureBase.Companion]
*/
companion object {
/** Always use with Getter! */
fun getItemImageFromSheet(module: String, path: String, tileW: Int, tileH: Int): TextureRegion {
val id = "$module/${path.replace('\\','/')}"
return (CommonResourcePool.getOrPut(id) {
TextureRegionPack(ModMgr.getGdxFile(module, path), tileW, tileH, flipY = false)
} as TextureRegionPack).get(0,0)
}
/** Always use with Getter! */
fun getItemImageFromSingleImage(module: String, path: String): TextureRegion {
val id = "$module/${path.replace('\\','/')}"
return CommonResourcePool.getOrPut(id) {
TextureRegion(Texture(ModMgr.getGdxFile(module, path)))
} as TextureRegion
}
}
} }

View File

@@ -1,9 +1,6 @@
package net.torvald.terrarum.modulebasegame.gameitems package net.torvald.terrarum.modulebasegame.gameitems
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.Terrarum import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.ItemID
@@ -22,11 +19,8 @@ class ItemLogicSignalEmitter(originalID: ItemID) : FixtureItemBase(originalID, "
override val isDynamic = false override val isDynamic = false
override val material = Material() override val material = Material()
override val itemImage: TextureRegion override val itemImage: TextureRegion
get() = CommonResourcePool.getOrPut("basegame-sprites-fixtures-signal_source.tga") { get() = getItemImageFromSingleImage("basegame", "sprites/fixtures/signal_source.tga")
val t = TextureRegion(Texture(ModMgr.getGdxFile("basegame", "sprites/fixtures/signal_source.tga")))
t.flip(false, false)
/*return*/t
} as TextureRegion
override var baseToolSize: Double? = baseMass override var baseToolSize: Double? = baseMass
init { init {

View File

@@ -1,12 +1,9 @@
package net.torvald.terrarum.modulebasegame.gameitems package net.torvald.terrarum.modulebasegame.gameitems
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.itemproperties.Material
import net.torvald.terrarum.modulebasegame.gameactors.FixtureTikiTorch import net.torvald.terrarum.modulebasegame.gameactors.FixtureTikiTorch
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/** /**
* Created by minjaesong on 2019-05-16. * Created by minjaesong on 2019-05-16.
@@ -22,9 +19,8 @@ class ItemTikiTorch(originalID: ItemID) : FixtureItemBase(originalID, "net.torva
override val isDynamic = false override val isDynamic = false
override val material = Material() override val material = Material()
override val itemImage: TextureRegion override val itemImage: TextureRegion
get() = (CommonResourcePool.getOrPut("sprites-fixtures-tiki_torch.tga") { get() = getItemImageFromSheet("basegame", "sprites/fixtures/tiki_torch.tga", 16, 32)
TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/fixtures/tiki_torch.tga"), 16, 32, flipY = false)
} as TextureRegionPack).get(0,0)
override var baseToolSize: Double? = baseMass override var baseToolSize: Double? = baseMass
init { init {

Binary file not shown.

View File

@@ -7,7 +7,7 @@ digraph g {
subgraph cluster_legend { subgraph cluster_legend {
label=Legend label=Legend
"raw materials" [style=filled,fillcolor=mistyrose] "raw materials" [style=filled,fillcolor=mistyrose]
"manufactured materials" [shape=box,style=filled,fillcolor=lightsteelblue] "manufactured materials" [shape=trapezium,style=filled,fillcolor=lightsteelblue]
concepts [shape=component] concepts [shape=component]
"useable items" [shape=box,style=filled,fillcolor=khaki] "useable items" [shape=box,style=filled,fillcolor=khaki]
"ingredient only" [shape=box,style=filled] "ingredient only" [shape=box,style=filled]
@@ -59,27 +59,32 @@ digraph g {
} }
/* raw materials */ /* raw materials */
wood [style=filled,fillcolor=mistyrose] wood [style=filled,fillcolor="#d5bc89"]
stone [style=filled,fillcolor=mistyrose] stone [style=filled,fillcolor="#babfc5"]
malachite [style=filled,fillcolor=mistyrose] coal [style=filled,fillcolor="#606060",fontcolor=white]
hematite [style=filled,fillcolor=mistyrose]
coal [style=filled,fillcolor=mistyrose]
quartz [style=filled,fillcolor=mistyrose] quartz [style=filled,fillcolor=mistyrose]
ilmenite [style=filled,fillcolor=mistyrose] sand [style=filled,fillcolor="#f0ecca"]
gold [style=filled,fillcolor=mistyrose]
sand [style=filled,fillcolor=mistyrose] malachite [style=filled,fillcolor="#54b295",fontcolor=white]
hematite [style=filled,fillcolor="#cb8c6d",fontcolor=white]
ilmenite [style=filled,fillcolor="#df6e88",fontcolor=white] // kinda fake colour for playability
gold [style=filled,fillcolor="#dbba5e"]
sphalerite [style=filled,fillcolor="#5c9abb",fontcolor=white] // fluoresces lead-oxide yellow
/* manufactured materials */ /* manufactured materials */
steel [shape=trapezium,style=filled,fillcolor=lightsteelblue] steel [shape=trapezium,style=filled,fillcolor="#4e5152",fontcolor=white]
iron [shape=trapezium,style=filled,fillcolor=lightsteelblue] iron [shape=trapezium,style=filled,fillcolor="#a08778",fontcolor=white]
copper [shape=trapezium,style=filled,fillcolor=lightsteelblue] copper [shape=trapezium,style=filled,fillcolor="#d69544",fontcolor=white]
titanium [shape=trapezium,style=filled,fillcolor=lightsteelblue] titanium [shape=trapezium,style=filled,fillcolor="#daddd9"]
glass [shape=trapezium,style=filled,fillcolor=lightsteelblue] glass [shape=trapezium,style=filled,fillcolor="#79b883",fontcolor=white]
zinc [shape=trapezium,style=filled,fillcolor="#8a8d8e",fontcolor=white]
brass [shape=trapezium,style=filled,fillcolor="#d6af44"]
/* concepts */ /* concepts */
thermal [shape=component] thermal [shape=component]
electricity [shape=component] electricity [shape=component]
kinetic [shape=component] kinetic [shape=component]
information [shape=component] information [shape=component]
"sequential logic" [shape=component] /* implies electronic memory */ "sequential logic" [shape=component] // implies electronic memory
radio [shape=component] radio [shape=component]
telecommunication [shape=component] telecommunication [shape=component]
teleportation [shape=component] teleportation [shape=component]
@@ -88,15 +93,16 @@ digraph g {
networking [shape=component] networking [shape=component]
"haute couture" [shape=component] "haute couture" [shape=component]
"world portal" [shape=component] "world portal" [shape=component]
"hand tools" [shape=component] /* pickaxe, axe, etc. */ "hand tools" [shape=component] // pickaxe, axe, etc.
"weapons&armours" [shape=component] "weapons&armours" [shape=component]
"motorised tools" [shape=component] /* drill, chainsaw, etc. */ "motorised tools" [shape=component] // drill, chainsaw, etc.
machines [shape=component] /* electric machines */ machines [shape=component] // electric machines
"nonelectric machines" [shape=component] "rotating machines" [shape=component] // machines whose main method of operaton is spinning (e.g. macerator, powder mixer, grindstone, gristmill)
"electromechanical components" [shape=component] // e.g. signal-controlled clutch
/* useable items */ /* useable items */
furnace [shape=box,style=filled,fillcolor=khaki] furnace [shape=box,style=filled,fillcolor=khaki]
torch [shape=box,style=filled,fillcolor=khaki] torch [shape=box,style=filled,fillcolor=khaki]
"light fixture" [shape=box,style=filled,fillcolor=khaki] /* Both lamps and blinkenlight(s) */ "light fixture" [shape=box,style=filled,fillcolor=khaki] // Both lamps and blinkenlight(s)
furnitures [shape=box,style=filled,fillcolor=khaki] furnitures [shape=box,style=filled,fillcolor=khaki]
office [shape=box,style=filled,fillcolor=khaki] office [shape=box,style=filled,fillcolor=khaki]
"logic gate" [shape=box,style=filled,fillcolor=khaki] "logic gate" [shape=box,style=filled,fillcolor=khaki]
@@ -107,13 +113,19 @@ digraph g {
rtty [shape=box,style=filled,fillcolor=khaki] rtty [shape=box,style=filled,fillcolor=khaki]
"digital billboard" [shape=box,style=filled,fillcolor=khaki] "digital billboard" [shape=box,style=filled,fillcolor=khaki]
"CRT display" [shape=box,style=filled,fillcolor=khaki] "CRT display" [shape=box,style=filled,fillcolor=khaki]
"personal computer" [shape=box,style=filled,fillcolor=khaki] /* small computer with single integrated */ "personal computer" [shape=box,style=filled,fillcolor=khaki] // small computer with single integrated
mainframe [shape=box,style=filled,fillcolor=khaki] /* big computer that can have multiple terminals */ mainframe [shape=box,style=filled,fillcolor=khaki] // big computer that can have multiple terminals
windmill [shape=box,style=filled,fillcolor=khaki]
engine [shape=box,style=filled,fillcolor=khaki]
motor [shape=box,style=filled,fillcolor=khaki]
clutch [shape=box,style=filled,fillcolor=khaki]
gear [shape=box,style=filled,fillcolor=khaki]
shaft [shape=box,style=filled,fillcolor=khaki]
belt [shape=box,style=filled,fillcolor=khaki]
/* ingredient items */ /* ingredient items */
engine [shape=box,style=filled]
LED [shape=box,style=filled] LED [shape=box,style=filled]
"computing unit" [shape=box,style=filled] /* motherboard+cpu+ram+powersupply combined */ "computing unit" [shape=box,style=filled] // motherboard+cpu+ram+powersupply combined
"quartz oscillator" [shape=box,style=filled] "quartz oscillator" [shape=box,style=filled]
"quartz lens" [shape=box,style=filled] "quartz lens" [shape=box,style=filled]
@@ -143,6 +155,7 @@ digraph g {
electricity -> machines electricity -> machines
steel -> machines steel -> machines
brass -> furnitures
wood -> furnitures wood -> furnitures
wood -> "hand tools" wood -> "hand tools"
iron -> "hand tools" iron -> "hand tools"
@@ -221,6 +234,20 @@ digraph g {
"weapons&armours" -> "arming sword" [lhead=cluster_weaponarmour] "weapons&armours" -> "arming sword" [lhead=cluster_weaponarmour]
"motorised tools" -> breaker [lhead=cluster_electrictools] "motorised tools" -> breaker [lhead=cluster_electrictools]
kinetic -> "nonelectric machines" kinetic -> "rotating machines"
steel -> "nonelectric machines" steel -> "rotating machines"
wood -> windmill -> kinetic
electricity -> motor -> kinetic
kinetic -> shaft
kinetic -> gear
kinetic -> belt
kinetic -> clutch
electricity -> "electromechanical components"
kinetic -> "electromechanical components"
copper -> brass
sphalerite -> zinc -> brass
} }