diff --git a/Cargo.lock b/Cargo.lock index add19e0d92..396ec396b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1050,7 +1050,7 @@ dependencies = [ [[package]] name = "bones_asset" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "anyhow", "append-only-vec", @@ -1081,7 +1081,7 @@ dependencies = [ [[package]] name = "bones_bevy_renderer" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "anyhow", "bevy", @@ -1098,7 +1098,7 @@ dependencies = [ [[package]] name = "bones_ecs" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "anyhow", "atomicell", @@ -1114,7 +1114,7 @@ dependencies = [ [[package]] name = "bones_framework" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "bones_asset", "bones_lib", @@ -1143,7 +1143,7 @@ dependencies = [ [[package]] name = "bones_lib" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "bones_ecs", "instant", @@ -1152,7 +1152,7 @@ dependencies = [ [[package]] name = "bones_schema" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "append-only-vec", "bones_schema_macros", @@ -1170,7 +1170,7 @@ dependencies = [ [[package]] name = "bones_schema_macros" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "proc-macro2", "quote", @@ -1180,7 +1180,7 @@ dependencies = [ [[package]] name = "bones_scripting" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "async-channel", "bevy_tasks", @@ -1198,7 +1198,7 @@ dependencies = [ [[package]] name = "bones_utils" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "bones_utils_macros", "branches", @@ -1219,7 +1219,7 @@ dependencies = [ [[package]] name = "bones_utils_macros" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#dd2f80d636d3703b9c7990bba4eb677539719343" +source = "git+https://github.com/fishfolk/bones#831a7d83bd427fd89e5bc4de5386089245bf2fff" dependencies = [ "quote", "venial", @@ -1958,14 +1958,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] [[package]] @@ -2131,7 +2131,7 @@ dependencies = [ [[package]] name = "gc-arena" version = "0.4.0" -source = "git+https://github.com/kyren/gc-arena#8f2d8018987b765c4b2cabe43bd9d63de4b8bce0" +source = "git+https://github.com/kyren/gc-arena#bdb328467fb062c8d904cb4ce4d725e2ad816580" dependencies = [ "allocator-api2", "gc-arena-derive", @@ -2142,7 +2142,7 @@ dependencies = [ [[package]] name = "gc-arena-derive" version = "0.4.0" -source = "git+https://github.com/kyren/gc-arena#8f2d8018987b765c4b2cabe43bd9d63de4b8bce0" +source = "git+https://github.com/kyren/gc-arena#bdb328467fb062c8d904cb4ce4d725e2ad816580" dependencies = [ "proc-macro2", "quote", @@ -2814,9 +2814,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23bcac20d47825850fabf1e869bf7c2bbe2daefa0776c3cd2eb7cb74635f6e4a" +checksum = "1f5bcf02928361d18e6edb8ad3bc5b93cba8aa57e2508deb072c2d2ade8bbd0d" dependencies = [ "float_next_after", "lyon_path", @@ -2928,9 +2928,9 @@ checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "log", @@ -3327,9 +3327,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "once_map" @@ -3551,7 +3551,7 @@ dependencies = [ [[package]] name = "piccolo" version = "0.2.0" -source = "git+https://github.com/kyren/piccolo.git#41b6e20daa4b19a9976f3f854c2fe43fb2866009" +source = "git+https://github.com/kyren/piccolo.git?rev=d25ef38#d25ef38068229c96e24704fe499e412d0bef6e84" dependencies = [ "allocator-api2", "anyhow", @@ -3867,9 +3867,9 @@ checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" [[package]] name = "ring" -version = "0.17.6" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", "getrandom 0.2.11", @@ -3920,9 +3920,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", @@ -4573,18 +4573,18 @@ dependencies = [ [[package]] name = "unic-langid" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "398f9ad7239db44fd0f80fe068d12ff22d78354080332a5077dc6f52f14dcf2f" +checksum = "887622f8e7b723780c5e64b04dcc0c9b8f426ada7cca6790cd3ea3bf0f08037a" dependencies = [ "unic-langid-impl", ] [[package]] name = "unic-langid-impl" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35bfd2f2b8796545b55d7d3fd3e89a0613f68a0d1c8bc28cb7ff96b411a35ff" +checksum = "5adeb847e35eed4efbffd9fb2e4d078b91ece56e4d6a3c0d2df55b3a1dac07d5" dependencies = [ "serde", "tinystr", @@ -4592,9 +4592,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" @@ -5101,6 +5101,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -5131,6 +5140,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -5143,6 +5167,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -5155,6 +5185,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -5167,6 +5203,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -5179,6 +5221,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -5191,6 +5239,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -5203,6 +5257,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -5215,6 +5275,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winit" version = "0.28.7" @@ -5247,9 +5313,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" dependencies = [ "memchr", ] @@ -5304,18 +5370,18 @@ checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" [[package]] name = "zerocopy" -version = "0.7.28" +version = "0.7.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d6f15f7ade05d2a4935e34a457b936c23dc70a05cc1d97133dc99e7a3fe0f0e" +checksum = "306dca4455518f1f31635ec308b6b3e4eb1b11758cefafc782827d0aa7acb5c7" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.28" +version = "0.7.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbbad221e3f78500350ecbd7dfa4e63ef945c05f4c61cb7f4d3f84cd0bba649b" +checksum = "be912bf68235a88fbefd1b73415cb218405958d1655b2ece9035a19920bdf6ba" dependencies = [ "proc-macro2", "quote", diff --git a/assets/elements/item/musket/bullet/musket.bullet.yaml b/assets/elements/item/musket/bullet/musket.bullet.yaml index ce6ff93afd..b784315835 100644 --- a/assets/elements/item/musket/bullet/musket.bullet.yaml +++ b/assets/elements/item/musket/bullet/musket.bullet.yaml @@ -1,5 +1,5 @@ lifetime: 1.0 -velocity: [10, 0] +speed: 10 body_diameter: 15 atlas: ./musket_bullet.atlas.yaml diff --git a/assets/elements/item/sniper_rifle/bullet/sniper.bullet.yaml b/assets/elements/item/sniper_rifle/bullet/sniper.bullet.yaml index 329205fca1..ef59dd7bc4 100644 --- a/assets/elements/item/sniper_rifle/bullet/sniper.bullet.yaml +++ b/assets/elements/item/sniper_rifle/bullet/sniper.bullet.yaml @@ -1,5 +1,5 @@ lifetime: 2.0 -velocity: [25, 0] +speed: 25 body_diameter: 7.5 atlas: ./sniper_bullet.atlas.yaml diff --git a/packs/devpack/assets.yaml b/packs/devpack/assets.yaml index af56e9bc11..8138d0c7e7 100644 --- a/packs/devpack/assets.yaml +++ b/packs/devpack/assets.yaml @@ -2,3 +2,5 @@ maps: - ./maps/devlevel_1.map.yaml player_hats: - ./hats/pink_pirate.hat.yaml +map_elements: + - ./items/blunderbass/element.yaml diff --git a/packs/devpack/items/blunderbass/Blunderbass.schema.yaml b/packs/devpack/items/blunderbass/Blunderbass.schema.yaml new file mode 100644 index 0000000000..97106dfb76 --- /dev/null +++ b/packs/devpack/items/blunderbass/Blunderbass.schema.yaml @@ -0,0 +1,6 @@ +name: Blunderbass +full_name: devpack::Blunderbass +kind: !Struct + fields: + - name: cooldown + schema: f32 diff --git a/packs/devpack/items/blunderbass/BlunderbassMeta.schema.yaml b/packs/devpack/items/blunderbass/BlunderbassMeta.schema.yaml new file mode 100644 index 0000000000..a23d6899bc --- /dev/null +++ b/packs/devpack/items/blunderbass/BlunderbassMeta.schema.yaml @@ -0,0 +1,26 @@ +name: BlunderbassMeta +full_name: devpack::BlunderbassMeta +asset_extension: blunderbass +kind: !Struct + fields: + - name: sprite + schema: UntypedHandle # Handle + - name: bullet_sprite + schema: UntypedHandle # Handle + - name: body_size + schema: Vec2 + - name: grab_offset + schema: Vec2 + - name: throw_velocity + schema: f32 + - name: fin_anim + schema: Ustr + - name: cooldown + schema: f32 + - name: bullet_count + schema: u32 + - name: bullet_spread + schema: f32 + - name: bullet + schema: UntypedHandle # Handle + diff --git a/packs/devpack/items/blunderbass/blunderbass.png b/packs/devpack/items/blunderbass/blunderbass.png new file mode 100644 index 0000000000..ee3412a35c Binary files /dev/null and b/packs/devpack/items/blunderbass/blunderbass.png differ diff --git a/packs/devpack/items/blunderbass/blunderbass.yaml b/packs/devpack/items/blunderbass/blunderbass.yaml new file mode 100644 index 0000000000..9fdb67e725 --- /dev/null +++ b/packs/devpack/items/blunderbass/blunderbass.yaml @@ -0,0 +1,10 @@ +sprite: blunderbass.png +bullet_sprite: bullet.png +body_size: [32, 8] +grab_offset: [5, -7] +throw_velocity: 6 +fin_anim: grab_2 +cooldown: 0.75 +bullet_count: 4 +bullet_spread: 0.8 +bullet: ./bullet.yaml diff --git a/packs/devpack/items/blunderbass/bullet.atlas.yaml b/packs/devpack/items/blunderbass/bullet.atlas.yaml new file mode 100644 index 0000000000..71f200d213 --- /dev/null +++ b/packs/devpack/items/blunderbass/bullet.atlas.yaml @@ -0,0 +1,4 @@ +image: ./bullet.png +tile_size: [6, 6] +rows: 1 +columns: 1 diff --git a/packs/devpack/items/blunderbass/bullet.png b/packs/devpack/items/blunderbass/bullet.png new file mode 100644 index 0000000000..dc444106c1 Binary files /dev/null and b/packs/devpack/items/blunderbass/bullet.png differ diff --git a/packs/devpack/items/blunderbass/bullet.yaml b/packs/devpack/items/blunderbass/bullet.yaml new file mode 100644 index 0000000000..bc427b5f2c --- /dev/null +++ b/packs/devpack/items/blunderbass/bullet.yaml @@ -0,0 +1,11 @@ +lifetime: 1.0 +speed: 12 +body_diameter: 15 +atlas: ./bullet.atlas.yaml + +explosion_fps: 12 +explosion_frames: 3 +explosion_volume: 0.025 +explosion_lifetime: 0.4 +explosion_sound: ./bullet_hit_dull.ogg +explosion_atlas: ./explosion.atlas.yaml diff --git a/packs/devpack/items/blunderbass/bullet_hit_dull.ogg b/packs/devpack/items/blunderbass/bullet_hit_dull.ogg new file mode 100644 index 0000000000..572186bf98 Binary files /dev/null and b/packs/devpack/items/blunderbass/bullet_hit_dull.ogg differ diff --git a/packs/devpack/items/blunderbass/element.yaml b/packs/devpack/items/blunderbass/element.yaml new file mode 100644 index 0000000000..f7c711d0ee --- /dev/null +++ b/packs/devpack/items/blunderbass/element.yaml @@ -0,0 +1,4 @@ +name: Blunderbass +category: Weapons +data: blunderbass.yaml +plugin: ./plugin.lua diff --git a/packs/devpack/items/blunderbass/explosion.atlas.yaml b/packs/devpack/items/blunderbass/explosion.atlas.yaml new file mode 100644 index 0000000000..1d4bda39a2 --- /dev/null +++ b/packs/devpack/items/blunderbass/explosion.atlas.yaml @@ -0,0 +1,4 @@ +image: ./explosion.png +tile_size: [21, 21] +rows: 1 +columns: 4 diff --git a/packs/devpack/items/blunderbass/explosion.png b/packs/devpack/items/blunderbass/explosion.png new file mode 100644 index 0000000000..5877871eca Binary files /dev/null and b/packs/devpack/items/blunderbass/explosion.png differ diff --git a/packs/devpack/items/blunderbass/plugin.lua b/packs/devpack/items/blunderbass/plugin.lua new file mode 100644 index 0000000000..af5c9e706c --- /dev/null +++ b/packs/devpack/items/blunderbass/plugin.lua @@ -0,0 +1,120 @@ +local Entities = s"Entities" +local MapElementHydrated = s"MapElementHydrated" +local ElementHandle = s"ElementHandle" +local BlunderbassMeta = s"BlunderbassMeta" +local AtlasSprite = s"AtlasSprite" +local Sprite = s"Sprite" +local Item = s"Item" +local ItemThrow = s"ItemThrow" +local ItemGrab = s"ItemGrab" +local DehydrateOutOfBounds = s"DehydrateOutOfBounds" +local KinematicBody = s"KinematicBody" +local Transform = s"Transform" +local DropItem = s"DropItem" +local ItemUsed = s"ItemUsed" +local Blunderbass = s"Blunderbass" +local DamageRegion = s"DamageRegion" +local DamageRegionOwner = s"DamageRegionOwner" +local Time = s"Time" +local GlobalRng = s"GlobalRng" +local Lifetime = s"Lifetime" +local BulletHandle = s"BulletHandle" +local Bullet = s"Bullet" +local Vec2 = s"Vec2" + +local function hydrate() + local entities = resources:get(Entities) + + for spawner_ent, element_handle in entities:iter_with(ElementHandle, MapElementHydrated:without()) do + local element = assets:get(element_handle[0]) + local blunderbass_meta = assets:get(element.data) + + if schema_of(blunderbass_meta) == BlunderbassMeta then + -- Spawn a blunderbass + local ent = entities:create() + local sprite = Sprite:create(); + sprite.image = blunderbass_meta.sprite + components:insert(ent, element_handle) + components:insert(ent, MapElementHydrated:create()) + components:insert(ent, Blunderbass:create()) + components:insert(ent, sprite) + components:insert(ent, components:get(spawner_ent, Transform)) + components:insert(ent, Item:create()) + local item_grab = ItemGrab:create() + item_grab.fin_anim = blunderbass_meta.fin_anim + item_grab.grab_offset = blunderbass_meta.grab_offset + components:insert(ent, item_grab) + components:insert(ent, ItemThrow:create()) + local dehydrate_out_of_bounds = DehydrateOutOfBounds:create() + dehydrate_out_of_bounds[0] = spawner_ent + components:insert(ent, dehydrate_out_of_bounds) + local body = KinematicBody:create() + body.gravity = assets.root.core.physics.gravity + body.has_mass = true + body.has_friction = true + body.bounciness = 0 + components:insert(ent, body) + + -- Mark spawner as hydrated + components:insert(spawner_ent, MapElementHydrated:create()) + end + end +end + +local function update() + local entities = resources:get(Entities) + local time = resources:get(Time) + local rng = resources:get(GlobalRng) + + for ent, blunderbass in entities:iter_with(Blunderbass) do + if blunderbass.cooldown > 0 then + blunderbass.cooldown = blunderbass.cooldown - time.delta_seconds + end + + local element_handle = components:get(ent, ElementHandle) + local element = assets:get(element_handle[0]) + local blunderbass_meta = assets:get(element.data) + + local used = components:get(ent, ItemUsed) + if used then + if blunderbass.cooldown <= 0 then + local player_ent = used.owner + local player_sprite = components:get(player_ent, AtlasSprite) + local player_transform = components:get(player_ent, Transform) + + -- Spawn bullets + for i = 1, blunderbass_meta.bullet_count do + local bullet_ent = entities:create() + components:insert(bullet_ent, player_transform) + + local bullet_sprite = Sprite:create() + bullet_sprite.image = blunderbass_meta.bullet_sprite + components:insert(bullet_ent, bullet_sprite) + + local bullet_handle = BulletHandle:create() + bullet_handle[0] = blunderbass_meta.bullet + components:insert(bullet_ent, bullet_handle) + + local bullet = Bullet:create() + bullet.owner = player_ent + local direction = Vec2:create() + if player_sprite.flip_x then + direction.x = -1 + else + direction.x = 1 + end + direction.y = (rng:f32() - 0.5) * blunderbass_meta.bullet_spread + bullet.direction = direction + components:insert(bullet_ent, bullet) + end + + blunderbass.cooldown = blunderbass_meta.cooldown + end + + components:remove(ent, ItemUsed) + end + end +end + +session:add_system_to_stage(CoreStage.PreUpdate, hydrate) +session:add_system_to_stage(CoreStage.PostUpdate, update) diff --git a/packs/devpack/maps/devlevel_1.map.yaml b/packs/devpack/maps/devlevel_1.map.yaml index 47813f0e3a..d269c14b53 100644 --- a/packs/devpack/maps/devlevel_1.map.yaml +++ b/packs/devpack/maps/devlevel_1.map.yaml @@ -1240,7 +1240,8 @@ layers: - pos: - 300.0 - 700.0 - element: core:/plugins/anchor/element.yaml + element: core:/elements/item/sword/sword.element.yaml + element: /items/blunderbass/element.yaml - pos: - 480.0 - 118.5 diff --git a/packs/devpack/pack.yaml b/packs/devpack/pack.yaml index fe13c5a8aa..333ec18189 100644 --- a/packs/devpack/pack.yaml +++ b/packs/devpack/pack.yaml @@ -3,4 +3,7 @@ id: devpack_01hgrar12df9rva3mxrh2x3vgj version: 0.1.0 game_version: 0.9.0 root: ./assets.yaml +schemas: + - /items/blunderbass/BlunderbassMeta.schema.yaml + - /items/blunderbass/Blunderbass.schema.yaml diff --git a/src/core/bullet.rs b/src/core/bullet.rs index f56c49d0ea..bcbd13667a 100644 --- a/src/core/bullet.rs +++ b/src/core/bullet.rs @@ -11,6 +11,9 @@ pub fn game_plugin(game: &mut Game) { /// Install this module. pub fn session_plugin(session: &mut Session) { + Bullet::register_schema(); + BulletHandle::register_schema(); + session .stages .add_system_to_stage(CoreStage::PreUpdate, hydrate) @@ -19,9 +22,10 @@ pub fn session_plugin(session: &mut Session) { /// Bullet component. #[derive(Clone, Debug, HasSchema, Default, Copy)] +#[repr(C)] pub struct Bullet { - /// The direction that the bullet is moving on the X axis. - pub direction: f32, + /// The direction that the bullet is moving. + pub direction: Vec2, /// The player entity that shot the bullet. pub owner: Entity, } @@ -30,7 +34,7 @@ pub struct Bullet { #[type_data(metadata_asset("bullet"))] #[repr(C)] pub struct BulletMeta { - pub velocity: Vec2, + pub speed: f32, pub body_diameter: f32, pub atlas: Handle, @@ -45,6 +49,7 @@ pub struct BulletMeta { /// Component containing the bullet's metadata handle. #[derive(Deref, DerefMut, HasSchema, Default, Clone)] +#[repr(C)] pub struct BulletHandle(pub Handle); /// Hydrate bullets. @@ -113,7 +118,7 @@ fn update( let bullet_meta = asset_server.get(bullet_handle.0); let BulletMeta { - velocity, + speed, body_diameter, explosion_fps, explosion_volume, @@ -127,7 +132,7 @@ fn update( // Move bullet let position = { let position = transforms.get_mut(entity).unwrap(); - position.translation += bullet.direction * velocity.extend(0.0); + position.translation += (bullet.direction * *speed).extend(0.0); let emote_size = Vec2::new(*body_diameter * 6.0, *body_diameter * 3.5); emote_regions.insert(entity, EmoteRegion::basic(Emote::Alarm, emote_size, true)); diff --git a/src/core/elements/musket.rs b/src/core/elements/musket.rs index d9b2e351bd..e38119a5f1 100644 --- a/src/core/elements/musket.rs +++ b/src/core/elements/musket.rs @@ -262,7 +262,11 @@ fn update( ent, Bullet { owner: player, - direction: if player_flip_x { -1.0 } else { 1.0 }, + direction: if player_flip_x { + vec2(-1.0, 0.0) + } else { + vec2(1.0, 0.0) + }, }, ); transforms.insert(ent, shoot_animation_transform); diff --git a/src/core/lifetime.rs b/src/core/lifetime.rs index c78ac121ec..8115dad316 100644 --- a/src/core/lifetime.rs +++ b/src/core/lifetime.rs @@ -5,6 +5,8 @@ use std::time::Duration; use crate::{core::FPS, prelude::*}; pub fn install(session: &mut Session) { + Lifetime::register_schema(); + session .stages .add_system_to_stage(CoreStage::PostUpdate, lifetime_system) @@ -19,6 +21,7 @@ pub fn install(session: &mut Session) { /// > /// > Also, the age and lifetime are public, subject to other system's modification. #[derive(Copy, Clone, Default, HasSchema)] +#[repr(C)] pub struct Lifetime { /// How long the entity should be allowed to live in seconds. pub lifetime: f32, diff --git a/src/core/random.rs b/src/core/random.rs index dc3dcfa9dc..11e3a73a3e 100644 --- a/src/core/random.rs +++ b/src/core/random.rs @@ -2,7 +2,13 @@ use crate::prelude::*; -use bones_framework::prelude::HasSchema; +use bones_framework::{ + prelude::bindings::EcsRef, + scripting::lua::{ + bindings::SchemaLuaEcsRefMetatable, + piccolo::{self as lua, AnyCallback}, + }, +}; pub use turborand::prelude::*; pub fn plugin(session: &mut Session) { @@ -13,6 +19,7 @@ pub fn plugin(session: &mut Session) { /// /// Access in a system with [`Res`]. #[derive(Clone, HasSchema, Deref, DerefMut)] +#[type_data(SchemaLuaEcsRefMetatable(lua_metatable))] pub struct GlobalRng(AtomicRng); impl Default for GlobalRng { @@ -20,3 +27,39 @@ impl Default for GlobalRng { Self(AtomicRng::with_seed(7)) } } + +fn lua_metatable(ctx: lua::Context) -> lua::Table { + let metatable = lua::Table::new(&ctx); + + let f32_fn = ctx.registry().stash( + &ctx, + AnyCallback::from_fn(&ctx, |ctx, _fuel, mut stack| { + let this: &EcsRef = stack.consume(ctx)?; + let mut b = this.borrow_mut(); + let global_rng = b.schema_ref_mut()?.cast_into_mut::(); + let n = global_rng.0.f32(); + stack.replace(ctx, n); + Ok(lua::CallbackReturn::Return) + }), + ); + metatable + .set( + ctx, + "__index", + AnyCallback::from_fn(&ctx, move |ctx, _fuel, mut stack| { + let (_this, key): (lua::Value, lua::String) = stack.consume(ctx)?; + + #[allow(clippy::single_match)] + match key.as_bytes() { + b"f32" => { + stack.push_front(ctx.registry().fetch(&f32_fn).into()); + } + _ => (), + } + Ok(lua::CallbackReturn::Return) + }), + ) + .unwrap(); + + metatable +}