utterly broken miracle build
This commit is contained in:
parent
4ca6806010
commit
42ecec5e7f
13 changed files with 763 additions and 13 deletions
3
Luxe/assets/wip/Human.image.lx
Normal file
3
Luxe/assets/wip/Human.image.lx
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
image = {
|
||||||
|
source = "assets/wip/Human.png"
|
||||||
|
}
|
||||||
BIN
Luxe/assets/wip/Human.png
Normal file
BIN
Luxe/assets/wip/Human.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 156 B |
18
Luxe/blocks/human/human.modifier.lx
Normal file
18
Luxe/blocks/human/human.modifier.lx
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
modifier = {
|
||||||
|
description = "Moves to a point in space at a constant speed."
|
||||||
|
field = "human"
|
||||||
|
display = "Human"
|
||||||
|
class = "Human"
|
||||||
|
dependency = []
|
||||||
|
|
||||||
|
blocks = {
|
||||||
|
data={
|
||||||
|
fields = [
|
||||||
|
{ name="active" type="boolean" default=true }
|
||||||
|
{ name="name" type="id32" default="unnamed" }
|
||||||
|
{ name="color" type="float3" default=[1, 0, 0] }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
514
Luxe/blocks/human/human.modifier.wren
Normal file
514
Luxe/blocks/human/human.modifier.wren
Normal file
|
|
@ -0,0 +1,514 @@
|
||||||
|
|
||||||
|
//-- this file is generated! don't try editing it.
|
||||||
|
|
||||||
|
import "luxe: io" for IO
|
||||||
|
import "luxe: bytes" for Byter, Bytes
|
||||||
|
import "luxe: world" for Block
|
||||||
|
|
||||||
|
//`blocks/human/human > runtime` types
|
||||||
|
|
||||||
|
class ModifierRuntime {
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
} //new
|
||||||
|
|
||||||
|
} //ModifierRuntime
|
||||||
|
|
||||||
|
//`blocks/human/human > runtime` compilers
|
||||||
|
|
||||||
|
class ModifierRuntimeCompiler {
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes_count(instance) {
|
||||||
|
|
||||||
|
var size = 4 //version
|
||||||
|
|
||||||
|
size = size + 0
|
||||||
|
|
||||||
|
return size
|
||||||
|
|
||||||
|
} //bytes_count
|
||||||
|
|
||||||
|
validate(from_source_id, elements) {
|
||||||
|
|
||||||
|
var fields = {
|
||||||
|
"type": false, //:luxe:internal
|
||||||
|
"uuid": false, //:luxe:internal
|
||||||
|
"luxe.self.modifier": false, //:luxe:internal
|
||||||
|
}
|
||||||
|
for(element in elements) {
|
||||||
|
var instance = element.value
|
||||||
|
for(field in instance) {
|
||||||
|
if(fields[field.key] == null) {
|
||||||
|
Fiber.abort("node `%(element.key)` in `%(from_source_id)` has extra field `%(field.key)`")
|
||||||
|
} //if not found
|
||||||
|
} //each field
|
||||||
|
for(field in fields) {
|
||||||
|
var required = field.value
|
||||||
|
if(required && instance[field.key] == null) {
|
||||||
|
Fiber.abort("node `%(element.key)` in `%(from_source_id)` is missing a required field `%(field.key)` (and the field has no default value)")
|
||||||
|
}
|
||||||
|
} //each field
|
||||||
|
} //each element
|
||||||
|
|
||||||
|
} //validate
|
||||||
|
|
||||||
|
write(compiler, instance, out) {
|
||||||
|
|
||||||
|
//version
|
||||||
|
out.write_int32(0)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
} //write
|
||||||
|
|
||||||
|
bytes_count_block() {
|
||||||
|
|
||||||
|
return 8
|
||||||
|
|
||||||
|
} //bytes_count_block
|
||||||
|
|
||||||
|
write_block(compiler, out) {
|
||||||
|
|
||||||
|
//source id
|
||||||
|
out.write_uint32(compiler.string.hash("blocks/human/human > runtime"))
|
||||||
|
|
||||||
|
//fields count
|
||||||
|
out.write_int32(0)
|
||||||
|
|
||||||
|
} //write_block
|
||||||
|
|
||||||
|
write(instance) {
|
||||||
|
|
||||||
|
var size = bytes_count(instance)
|
||||||
|
var out = Byter.new(size+8)
|
||||||
|
|
||||||
|
out.write_string("LUXEMRTM")
|
||||||
|
|
||||||
|
write(instance, out)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
} //write
|
||||||
|
|
||||||
|
} //ModifierRuntimeCompiler
|
||||||
|
|
||||||
|
//`blocks/human/human > runtime` block types
|
||||||
|
|
||||||
|
class BlockModifierRuntime {
|
||||||
|
|
||||||
|
field { "human" }
|
||||||
|
source { "blocks/human/human > runtime" }
|
||||||
|
|
||||||
|
construct new(block) {
|
||||||
|
_block = block
|
||||||
|
_inst_type = instance_type
|
||||||
|
_inst = _inst_type.new(_block, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
_block = Block.create()
|
||||||
|
_inst_type = instance_type
|
||||||
|
_inst = _inst_type.new(_block, 0)
|
||||||
|
Block.set_type(_block, "blocks/human/human > runtime")
|
||||||
|
} //new
|
||||||
|
|
||||||
|
instance_type {
|
||||||
|
|
||||||
|
class BlockInstModifierRuntime {
|
||||||
|
slot { _slot }
|
||||||
|
entity { Block.get_handle(_block, _slot) }
|
||||||
|
block_set_slot(value) {
|
||||||
|
_slot=value
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
construct new(block, slot) {
|
||||||
|
_block = block
|
||||||
|
_slot = slot
|
||||||
|
} //new
|
||||||
|
block { _block }
|
||||||
|
} //BlockInstModifierRuntime
|
||||||
|
|
||||||
|
return BlockInstModifierRuntime
|
||||||
|
|
||||||
|
} //instance_type
|
||||||
|
|
||||||
|
block { _block }
|
||||||
|
count { Block.get_count(_block) }
|
||||||
|
add() { Block.add(_block) }
|
||||||
|
append(other_block) { Block.append(_block, other_block) }
|
||||||
|
each(c, fn) {
|
||||||
|
for(i in 0 ... c) {
|
||||||
|
fn.call(0, _inst.block_set_slot(i))
|
||||||
|
}
|
||||||
|
} //each
|
||||||
|
|
||||||
|
[slot, inst] { _inst.block_set_slot(slot) }
|
||||||
|
|
||||||
|
[slot] { _inst_type.new(_block, slot) }
|
||||||
|
} //BlockModifierRuntime
|
||||||
|
|
||||||
|
|
||||||
|
//`blocks/human/human > data` types
|
||||||
|
|
||||||
|
class ModifierData {
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
_active = true
|
||||||
|
_name = "unnamed"
|
||||||
|
_color = [1, 0, 0]
|
||||||
|
} //new
|
||||||
|
|
||||||
|
active { _active }
|
||||||
|
active=(vvv) { _active = vvv }
|
||||||
|
|
||||||
|
name { _name }
|
||||||
|
name=(vvv) { _name = vvv }
|
||||||
|
|
||||||
|
color { _color }
|
||||||
|
color=(vvv) { _color = vvv }
|
||||||
|
|
||||||
|
} //ModifierData
|
||||||
|
|
||||||
|
//`blocks/human/human > data` compilers
|
||||||
|
|
||||||
|
class ModifierDataCompiler {
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes_count(instance) {
|
||||||
|
|
||||||
|
var size = 4 //version
|
||||||
|
|
||||||
|
size = size + 4 // active
|
||||||
|
|
||||||
|
size = size + 4 // name
|
||||||
|
|
||||||
|
size = size + 12 // color
|
||||||
|
|
||||||
|
size = size + 0
|
||||||
|
|
||||||
|
return size
|
||||||
|
|
||||||
|
} //bytes_count
|
||||||
|
|
||||||
|
validate(from_source_id, elements) {
|
||||||
|
|
||||||
|
var fields = {
|
||||||
|
"type": false, //:luxe:internal
|
||||||
|
"uuid": false, //:luxe:internal
|
||||||
|
"luxe.self.modifier": false, //:luxe:internal
|
||||||
|
"active": false,
|
||||||
|
"name": false,
|
||||||
|
"color": false,
|
||||||
|
}
|
||||||
|
for(element in elements) {
|
||||||
|
var instance = element.value
|
||||||
|
for(field in instance) {
|
||||||
|
if(fields[field.key] == null) {
|
||||||
|
Fiber.abort("node `%(element.key)` in `%(from_source_id)` has extra field `%(field.key)`")
|
||||||
|
} //if not found
|
||||||
|
} //each field
|
||||||
|
for(field in fields) {
|
||||||
|
var required = field.value
|
||||||
|
if(required && instance[field.key] == null) {
|
||||||
|
Fiber.abort("node `%(element.key)` in `%(from_source_id)` is missing a required field `%(field.key)` (and the field has no default value)")
|
||||||
|
}
|
||||||
|
} //each field
|
||||||
|
} //each element
|
||||||
|
|
||||||
|
} //validate
|
||||||
|
|
||||||
|
write(compiler, instance, out) {
|
||||||
|
|
||||||
|
//version
|
||||||
|
out.write_int32(0)
|
||||||
|
|
||||||
|
var active = instance["active"]
|
||||||
|
if(active == null) active = true
|
||||||
|
out.write_int32(active ? 1 : 0)
|
||||||
|
|
||||||
|
|
||||||
|
var name = instance["name"]
|
||||||
|
if(name == null) name = "unnamed"
|
||||||
|
out.write_uint32((name && name != "") ? compiler.string.hash(name) : 0)
|
||||||
|
|
||||||
|
|
||||||
|
var color = instance["color"]
|
||||||
|
if(color == null) color = [1, 0, 0]
|
||||||
|
out.write_float32(color[0])
|
||||||
|
out.write_float32(color[1])
|
||||||
|
out.write_float32(color[2])
|
||||||
|
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
} //write
|
||||||
|
|
||||||
|
bytes_count_block() {
|
||||||
|
|
||||||
|
return 52
|
||||||
|
|
||||||
|
} //bytes_count_block
|
||||||
|
|
||||||
|
write_block(compiler, out) {
|
||||||
|
|
||||||
|
//source id
|
||||||
|
out.write_uint32(compiler.string.hash("blocks/human/human > data"))
|
||||||
|
|
||||||
|
//fields count
|
||||||
|
out.write_int32(3)
|
||||||
|
|
||||||
|
// active
|
||||||
|
out.write_uint32(compiler.string.hash("active"))
|
||||||
|
out.write_uint32(1710517951) //type boolean
|
||||||
|
var active_default = true
|
||||||
|
out.write_int32(active_default ? 1 : 0)
|
||||||
|
|
||||||
|
|
||||||
|
// name
|
||||||
|
out.write_uint32(compiler.string.hash("name"))
|
||||||
|
out.write_uint32(2729592961) //type id32
|
||||||
|
var name_default = "unnamed"
|
||||||
|
out.write_uint32((name_default && name_default != "") ? compiler.string.hash(name_default) : 0)
|
||||||
|
|
||||||
|
|
||||||
|
// color
|
||||||
|
out.write_uint32(compiler.string.hash("color"))
|
||||||
|
out.write_uint32(1025475970) //type float3
|
||||||
|
var color_default = [1, 0, 0]
|
||||||
|
out.write_float32(color_default[0])
|
||||||
|
out.write_float32(color_default[1])
|
||||||
|
out.write_float32(color_default[2])
|
||||||
|
|
||||||
|
|
||||||
|
} //write_block
|
||||||
|
|
||||||
|
write(instance) {
|
||||||
|
|
||||||
|
var size = bytes_count(instance)
|
||||||
|
var out = Byter.new(size+8)
|
||||||
|
|
||||||
|
out.write_string("LUXEMDTA")
|
||||||
|
|
||||||
|
write(instance, out)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
} //write
|
||||||
|
|
||||||
|
} //ModifierDataCompiler
|
||||||
|
|
||||||
|
//`blocks/human/human > data` block types
|
||||||
|
|
||||||
|
class BlockModifierData {
|
||||||
|
|
||||||
|
field { "human" }
|
||||||
|
source { "blocks/human/human > data" }
|
||||||
|
|
||||||
|
construct new(block) {
|
||||||
|
_block = block
|
||||||
|
_inst_type = instance_type
|
||||||
|
_inst = _inst_type.new(_block, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
_block = Block.create()
|
||||||
|
_inst_type = instance_type
|
||||||
|
_inst = _inst_type.new(_block, 0)
|
||||||
|
Block.add(_block, "active", "boolean", true)
|
||||||
|
Block.add(_block, "name", "id32", "unnamed")
|
||||||
|
Block.add(_block, "color", "float3", [1, 0, 0])
|
||||||
|
Block.set_type(_block, "blocks/human/human > data")
|
||||||
|
} //new
|
||||||
|
|
||||||
|
instance_type {
|
||||||
|
|
||||||
|
class BlockInstModifierData {
|
||||||
|
active { Block.get(_block, "active", _slot) }
|
||||||
|
active=(v) { Block.set(_block, "active", _slot, v) }
|
||||||
|
name { Block.get(_block, "name", _slot) }
|
||||||
|
name=(v) { Block.set(_block, "name", _slot, v) }
|
||||||
|
color { Block.get(_block, "color", _slot) }
|
||||||
|
color=(v) { Block.set(_block, "color", _slot, v) }
|
||||||
|
slot { _slot }
|
||||||
|
entity { Block.get_handle(_block, _slot) }
|
||||||
|
block_set_slot(value) {
|
||||||
|
_slot=value
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
construct new(block, slot) {
|
||||||
|
_block = block
|
||||||
|
_slot = slot
|
||||||
|
} //new
|
||||||
|
block { _block }
|
||||||
|
} //BlockInstModifierData
|
||||||
|
|
||||||
|
return BlockInstModifierData
|
||||||
|
|
||||||
|
} //instance_type
|
||||||
|
|
||||||
|
block { _block }
|
||||||
|
count { Block.get_count(_block) }
|
||||||
|
add() { Block.add(_block) }
|
||||||
|
append(other_block) { Block.append(_block, other_block) }
|
||||||
|
each(c, fn) {
|
||||||
|
for(i in 0 ... c) {
|
||||||
|
fn.call(0, _inst.block_set_slot(i))
|
||||||
|
}
|
||||||
|
} //each
|
||||||
|
|
||||||
|
[slot, inst] { _inst.block_set_slot(slot) }
|
||||||
|
|
||||||
|
[slot] { _inst_type.new(_block, slot) }
|
||||||
|
} //BlockModifierData
|
||||||
|
|
||||||
|
|
||||||
|
//`blocks/human/human > world` types
|
||||||
|
|
||||||
|
class ModifierWorld {
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
} //new
|
||||||
|
|
||||||
|
} //ModifierWorld
|
||||||
|
|
||||||
|
//`blocks/human/human > world` compilers
|
||||||
|
|
||||||
|
class ModifierWorldCompiler {
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes_count(instance) {
|
||||||
|
|
||||||
|
var size = 4 //version
|
||||||
|
|
||||||
|
size = size + 0
|
||||||
|
|
||||||
|
return size
|
||||||
|
|
||||||
|
} //bytes_count
|
||||||
|
|
||||||
|
validate(from_source_id, elements) {
|
||||||
|
|
||||||
|
var fields = {
|
||||||
|
"type": false, //:luxe:internal
|
||||||
|
"uuid": false, //:luxe:internal
|
||||||
|
"luxe.self.modifier": false, //:luxe:internal
|
||||||
|
}
|
||||||
|
for(element in elements) {
|
||||||
|
var instance = element.value
|
||||||
|
for(field in instance) {
|
||||||
|
if(fields[field.key] == null) {
|
||||||
|
Fiber.abort("node `%(element.key)` in `%(from_source_id)` has extra field `%(field.key)`")
|
||||||
|
} //if not found
|
||||||
|
} //each field
|
||||||
|
for(field in fields) {
|
||||||
|
var required = field.value
|
||||||
|
if(required && instance[field.key] == null) {
|
||||||
|
Fiber.abort("node `%(element.key)` in `%(from_source_id)` is missing a required field `%(field.key)` (and the field has no default value)")
|
||||||
|
}
|
||||||
|
} //each field
|
||||||
|
} //each element
|
||||||
|
|
||||||
|
} //validate
|
||||||
|
|
||||||
|
write(compiler, instance, out) {
|
||||||
|
|
||||||
|
//version
|
||||||
|
out.write_int32(0)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
} //write
|
||||||
|
|
||||||
|
bytes_count_block() {
|
||||||
|
|
||||||
|
return 8
|
||||||
|
|
||||||
|
} //bytes_count_block
|
||||||
|
|
||||||
|
write_block(compiler, out) {
|
||||||
|
|
||||||
|
//source id
|
||||||
|
out.write_uint32(compiler.string.hash("blocks/human/human > world"))
|
||||||
|
|
||||||
|
//fields count
|
||||||
|
out.write_int32(0)
|
||||||
|
|
||||||
|
} //write_block
|
||||||
|
|
||||||
|
write(instance) {
|
||||||
|
|
||||||
|
var size = bytes_count(instance)
|
||||||
|
var out = Byter.new(size+8)
|
||||||
|
|
||||||
|
out.write_string("LUXEMWLD")
|
||||||
|
|
||||||
|
write(instance, out)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
} //write
|
||||||
|
|
||||||
|
} //ModifierWorldCompiler
|
||||||
|
|
||||||
|
//`blocks/human/human > world` block types
|
||||||
|
|
||||||
|
class BlockModifierWorld {
|
||||||
|
|
||||||
|
field { "human" }
|
||||||
|
source { "blocks/human/human > world" }
|
||||||
|
|
||||||
|
construct new(block) {
|
||||||
|
_block = block
|
||||||
|
_inst_type = instance_type
|
||||||
|
_inst = _inst_type.new(_block, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
_block = Block.create()
|
||||||
|
_inst_type = instance_type
|
||||||
|
_inst = _inst_type.new(_block, 0)
|
||||||
|
Block.set_type(_block, "blocks/human/human > world")
|
||||||
|
} //new
|
||||||
|
|
||||||
|
instance_type {
|
||||||
|
|
||||||
|
class BlockInstModifierWorld {
|
||||||
|
slot { _slot }
|
||||||
|
entity { Block.get_handle(_block, _slot) }
|
||||||
|
block_set_slot(value) {
|
||||||
|
_slot=value
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
construct new(block, slot) {
|
||||||
|
_block = block
|
||||||
|
_slot = slot
|
||||||
|
} //new
|
||||||
|
block { _block }
|
||||||
|
} //BlockInstModifierWorld
|
||||||
|
|
||||||
|
return BlockInstModifierWorld
|
||||||
|
|
||||||
|
} //instance_type
|
||||||
|
|
||||||
|
block { _block }
|
||||||
|
count { Block.get_count(_block) }
|
||||||
|
add() { Block.add(_block) }
|
||||||
|
append(other_block) { Block.append(_block, other_block) }
|
||||||
|
each(c, fn) {
|
||||||
|
for(i in 0 ... c) {
|
||||||
|
fn.call(0, _inst.block_set_slot(i))
|
||||||
|
}
|
||||||
|
} //each
|
||||||
|
|
||||||
|
[slot, inst] { _inst.block_set_slot(slot) }
|
||||||
|
|
||||||
|
[slot] { _inst_type.new(_block, slot) }
|
||||||
|
} //BlockModifierWorld
|
||||||
|
|
||||||
91
Luxe/blocks/human/human.wren
Normal file
91
Luxe/blocks/human/human.wren
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
import "luxe: io" for IO
|
||||||
|
import "luxe: world" for World, Entity, Modifiers, ModifierSystem, Transform, Sprite
|
||||||
|
import "math/vector" for Vector
|
||||||
|
import "math/util" for Util
|
||||||
|
|
||||||
|
//User facing API
|
||||||
|
//This is what the user of your modifier will interact with
|
||||||
|
class Human {
|
||||||
|
|
||||||
|
static create(entity) { Modifiers.create(This, entity) }
|
||||||
|
static destroy(entity) { Modifiers.destroy(This, entity) }
|
||||||
|
static has(entity) { Modifiers.has(This, entity) }
|
||||||
|
|
||||||
|
static set_color(entity, color){
|
||||||
|
var data = Modifiers.get(This, entity)
|
||||||
|
data.color = color
|
||||||
|
if(Sprite.has(entity)){
|
||||||
|
Sprite.set_color(entity, color.r, color.g, color.b, color.a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} //Human
|
||||||
|
|
||||||
|
//Your modifier system implementation.
|
||||||
|
//This speaks to the engine and your user facing API
|
||||||
|
//to do the actual work. You'll get notified when things change
|
||||||
|
//in the world and respond to them here.
|
||||||
|
class HumanSystem is ModifierSystem {
|
||||||
|
|
||||||
|
player_start{[26, 90]}
|
||||||
|
player_size{[10, 12]}
|
||||||
|
|
||||||
|
construct new() {
|
||||||
|
//called when your system is first created.
|
||||||
|
}
|
||||||
|
|
||||||
|
init(world) {
|
||||||
|
_world = world
|
||||||
|
//called when your modifier is created in a world
|
||||||
|
|
||||||
|
_material = Util.material_from_image_path("assets/wip/Human")
|
||||||
|
}
|
||||||
|
|
||||||
|
destroy() {
|
||||||
|
//called when your modifier is removed from a world
|
||||||
|
}
|
||||||
|
|
||||||
|
attach(entity, data) {
|
||||||
|
//called when attached to an entity
|
||||||
|
update()
|
||||||
|
}
|
||||||
|
|
||||||
|
detach(entity, data) {
|
||||||
|
//called when detached from an entity, like on destroy
|
||||||
|
update()
|
||||||
|
}
|
||||||
|
|
||||||
|
tick(delta) {
|
||||||
|
//called usually once every frame.
|
||||||
|
//called when the world that this modifier lives in, is ticked
|
||||||
|
each {|entity, data|
|
||||||
|
System.print("%(Transform.get_pos(entity))")
|
||||||
|
}
|
||||||
|
} //tick
|
||||||
|
|
||||||
|
update(){
|
||||||
|
var i = 0
|
||||||
|
var size = Vector.new(player_size)
|
||||||
|
var start = Vector.new(player_start) + size / 2
|
||||||
|
each {|entity, data|
|
||||||
|
if(!data.active){
|
||||||
|
Transform.destroy(entity)
|
||||||
|
Sprite.destroy(entity)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var pos = start
|
||||||
|
pos.x = pos.x + size.x * i
|
||||||
|
if(!Transform.has(entity)){
|
||||||
|
Transform.create(entity)
|
||||||
|
}
|
||||||
|
if(!Sprite.has(entity)){
|
||||||
|
Sprite.create(entity, _material, 10, 12)
|
||||||
|
Sprite.set_color(entity, data.color.r, data.color.g, data.color.b, 1)
|
||||||
|
}
|
||||||
|
Transform.set_pos(entity, pos.x, pos.y)
|
||||||
|
i = i + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} //HumanSystem
|
||||||
|
|
||||||
|
var Modifier = HumanSystem //required
|
||||||
|
|
@ -6,11 +6,12 @@ import "math/vector" for Vector
|
||||||
|
|
||||||
class Tooltip{
|
class Tooltip{
|
||||||
depth{100}
|
depth{100}
|
||||||
|
color{[1, 1, 1, 1]}
|
||||||
|
|
||||||
construct new(app){
|
construct new(app){
|
||||||
_ent = Entity.create(app.ui)
|
_ent = Entity.create(app.ui)
|
||||||
_mat_font = Assets.material("luxe: material/font")
|
_mat_font = Assets.material("luxe: material/font")
|
||||||
Text.create(_ent, _mat_font, 8, "assets/fonts/BabyBlocks", [0.2, 0.01, 0.05, 1])
|
Text.create(_ent, _mat_font, 8, "assets/fonts/BabyBlocks", color)
|
||||||
|
|
||||||
Transform.create(_ent)
|
Transform.create(_ent)
|
||||||
Transform.set_pos(_ent, 64, 128, depth)
|
Transform.set_pos(_ent, 64, 128, depth)
|
||||||
|
|
|
||||||
|
|
@ -64,11 +64,9 @@ class Ui{
|
||||||
UIImage.set_image(button, adventureButtons)
|
UIImage.set_image(button, adventureButtons)
|
||||||
ImageButton.set_tooltip(button, "Adventure!")
|
ImageButton.set_tooltip(button, "Adventure!")
|
||||||
ImageButton.set_tile_uv(button, tiles, [1, 0])
|
ImageButton.set_tile_uv(button, tiles, [1, 0])
|
||||||
ImageButton.set_state_change(button) { |data|
|
ImageButton.set_state_change(button) { |data|
|
||||||
System.print(data)
|
|
||||||
if(data["press"]){
|
if(data["press"]){
|
||||||
ui_mode = Ui.Planning
|
ui_mode = Ui.Planning
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UIList.add(list, button)
|
UIList.add(list, button)
|
||||||
|
|
@ -117,7 +115,6 @@ class Ui{
|
||||||
ImageButton.set_tooltip(button, "Info")
|
ImageButton.set_tooltip(button, "Info")
|
||||||
ImageButton.set_tile_uv(button, tiles, [1, 0])
|
ImageButton.set_tile_uv(button, tiles, [1, 0])
|
||||||
ImageButton.set_state_change(button) { |data|
|
ImageButton.set_state_change(button) { |data|
|
||||||
System.print(data)
|
|
||||||
if(data["press"]){
|
if(data["press"]){
|
||||||
ui_mode = Ui.Info
|
ui_mode = Ui.Info
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,13 @@ import "math/vector" for Vector
|
||||||
import "math/rect" for AABB
|
import "math/rect" for AABB
|
||||||
import "math/util" for Util
|
import "math/util" for Util
|
||||||
import "blocks/tooltip" for Tooltip
|
import "blocks/tooltip" for Tooltip
|
||||||
|
import "blocks/human/human" for Human
|
||||||
|
import "random" for Random
|
||||||
|
|
||||||
class game is Game {
|
class game is Game {
|
||||||
|
|
||||||
construct ready() {
|
construct ready() {
|
||||||
|
//simple example... in theory (should print `0, 1, a` and `1, 2, b` cause thats the union)
|
||||||
|
//Util.for_all([[0, 1, 2], [1, 2], ["a", "b", "c", "d"]]){|a, b, c|System.print("%(a), %(b), %(c)")}
|
||||||
|
|
||||||
Globals["Game"] = this
|
Globals["Game"] = this
|
||||||
|
|
||||||
|
|
@ -73,6 +76,18 @@ class game is Game {
|
||||||
|
|
||||||
var material = Util.material_from_image_path("assets/wip/Room")
|
var material = Util.material_from_image_path("assets/wip/Room")
|
||||||
Sprite.create(bg, material, 128, 128)
|
Sprite.create(bg, material, 128, 128)
|
||||||
|
|
||||||
|
create_human()
|
||||||
|
create_human()
|
||||||
|
}
|
||||||
|
|
||||||
|
create_human(){
|
||||||
|
var human = Entity.create(app.world, "human")
|
||||||
|
var humanMat = Util.material_from_image_path("assets/wip/Human")
|
||||||
|
Human.create(human)
|
||||||
|
System.print(Util.hsv(Random.new().float(), 1, 1))
|
||||||
|
//var rand = Random.new().float()
|
||||||
|
//Human.set_color(human, Util.hsv(rand, 1, 1))
|
||||||
}
|
}
|
||||||
|
|
||||||
app { _app }
|
app { _app }
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
|
import "math/vector" for Vector
|
||||||
|
import "luxe: math" for Math
|
||||||
|
import "math/repNum" for RepNum
|
||||||
|
import "math/Util" for Util
|
||||||
|
|
||||||
class M{
|
class M{
|
||||||
static inv_lerp(from, to, inter){
|
static inv_lerp(from, to, inter){
|
||||||
|
|
@ -7,11 +9,51 @@ class M{
|
||||||
}
|
}
|
||||||
|
|
||||||
static lerp(from, to, value){
|
static lerp(from, to, value){
|
||||||
return from + value * (to - from)
|
if(from is Num && to is Num) return from + (to - from) * value
|
||||||
|
if(from is Sequence != to is Sequence) {
|
||||||
|
if(from is Sequence){
|
||||||
|
to = RepNum.new(to, from.count)
|
||||||
|
} else {
|
||||||
|
from = RepNum.new(from, to.count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(value is Num) value = RepNum.new(value)
|
||||||
|
|
||||||
|
System.print("%(from.toList) %(to.toList)")
|
||||||
|
|
||||||
|
var result = []
|
||||||
|
Util.for_all([from, to, value]) { |from, to, value|
|
||||||
|
System.print(from)
|
||||||
|
result.add(lerp(from, to, value))
|
||||||
|
}
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
static remap(min_in, max_in, min_out, max_out, value){
|
static remap(min_in, max_in, min_out, max_out, value){
|
||||||
var inter = inv_lerp(min_in, max_in, value)
|
var inter = inv_lerp(min_in, max_in, value)
|
||||||
return lerp(min_out, max_out, inter)
|
return lerp(min_out, max_out, inter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static clamp(value, min, max){
|
||||||
|
//if its a simple number, we assume so are the bounds
|
||||||
|
if(value is Num){
|
||||||
|
return Math.max(Math.min(value, max), min)
|
||||||
|
}
|
||||||
|
|
||||||
|
//otherwise we assume its a sequence
|
||||||
|
//if bounds are numbers, just use them
|
||||||
|
if(min is Num && max is Num){
|
||||||
|
return value.map {|val| clamp(val, min, max)}.toList
|
||||||
|
}
|
||||||
|
if(min is Sequence && max is Sequence){
|
||||||
|
var result = []
|
||||||
|
Util.for_all([value, min, max]) { |value, min, max|
|
||||||
|
result.add(clamp(value, min, max))
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
System.print("can't clamp %(value.type) between %(min.type) and %(max.type)")
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
20
Luxe/math/repNum.wren
Normal file
20
Luxe/math/repNum.wren
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
class RepNum is Sequence{
|
||||||
|
static new(value){
|
||||||
|
return new(value, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
construct new(value, count){
|
||||||
|
_value = value
|
||||||
|
_count = count
|
||||||
|
}
|
||||||
|
|
||||||
|
iterate(iter){
|
||||||
|
if(_count < 0) return true
|
||||||
|
if(!iter) return 0
|
||||||
|
if(iter >= _count) return null
|
||||||
|
return iter + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
iteratorValue(iter){_value}
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
import "luxe: assets" for Assets
|
import "luxe: assets" for Assets
|
||||||
import "luxe: render" for Material
|
import "luxe: render" for Material
|
||||||
|
import "math/math" for M
|
||||||
|
import "math/Vector" for Vector
|
||||||
|
|
||||||
class Util{
|
class Util{
|
||||||
static material_from_image_path(path){
|
static material_from_image_path(path){
|
||||||
var image = Assets.image("assets/wip/Room")
|
var image = Assets.image(path)
|
||||||
return material_from_image(image)
|
return material_from_image(image)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -18,4 +20,34 @@ class Util{
|
||||||
to[i] = from[i]
|
to[i] = from[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static for_all(sequences, fn){
|
||||||
|
var count = sequences.count
|
||||||
|
var counter = (0...count)
|
||||||
|
var iterators = List.filled(count, null)
|
||||||
|
counter.each{|i| iterators[i] = sequences[i].iterate(iterators[i])}
|
||||||
|
while(iterators.all{|iter| iter}){
|
||||||
|
var values = (0...count).map{|i| sequences[i].iteratorValue(iterators[i])}
|
||||||
|
fn.call(values)
|
||||||
|
counter.each{|i| iterators[i] = sequences[i].iterate(iterators[i])}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//hue value saturation to rgb colors. all values in 0-1 range
|
||||||
|
static hsv(h, s, v){
|
||||||
|
//hue to rgb
|
||||||
|
h = h % 1
|
||||||
|
var col = [
|
||||||
|
(h * 6 - 3).abs - 1,
|
||||||
|
2 - (h * 6 - 2).abs,
|
||||||
|
2 - (h * 6 - 4).abs
|
||||||
|
]
|
||||||
|
col = M.clamp(col, 0, 1)
|
||||||
|
//then add saturation
|
||||||
|
col = M.lerp(1, col, s)
|
||||||
|
//and value
|
||||||
|
col = col.map{|comp| comp * v}
|
||||||
|
|
||||||
|
return col.toList + [1] //poor womans add
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
|
|
||||||
class Vector {
|
class Vector is Sequence{
|
||||||
x{_x}
|
x{_x}
|
||||||
x=(val){_x = val}
|
x=(val){_x = val}
|
||||||
|
|
||||||
|
|
@ -44,7 +44,7 @@ class Vector {
|
||||||
_y = -_y
|
_y = -_y
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
static or_lt(one, other){
|
static or_lt(one, other){
|
||||||
return one.x < other.x || one.y < other.y
|
return one.x < other.x || one.y < other.y
|
||||||
}
|
}
|
||||||
|
|
@ -62,6 +62,23 @@ class Vector {
|
||||||
_x = 0
|
_x = 0
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iterate(iter){
|
||||||
|
if(!iter) return 0
|
||||||
|
if(iter > 1) return null
|
||||||
|
return iter + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
iteratorValue(iter){[iter]}
|
||||||
|
|
||||||
|
[index]{
|
||||||
|
if(index == 0){
|
||||||
|
return x
|
||||||
|
} else if(index == 1){
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
+(other){
|
+(other){
|
||||||
if(other is Num) {
|
if(other is Num) {
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ class Renderer {
|
||||||
clear(ctx){
|
clear(ctx){
|
||||||
var layer = RenderLayerDesc.new()
|
var layer = RenderLayerDesc.new()
|
||||||
layer.dest.color[0].render_target = target
|
layer.dest.color[0].render_target = target
|
||||||
layer.dest.color[0].clear_color = [1,1,1,1]
|
layer.dest.color[0].clear_color = [0,0,0,1]
|
||||||
layer.dest.color[0].load_action = LoadAction.clear
|
layer.dest.color[0].load_action = LoadAction.clear
|
||||||
layer.dest.depth.load_action = LoadAction.clear
|
layer.dest.depth.load_action = LoadAction.clear
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue