From 2960c265676a2f1f42b73ed7f915be90976039bc Mon Sep 17 00:00:00 2001 From: Zicklag Date: Fri, 8 Dec 2023 17:09:06 -0600 Subject: [PATCH] feat: add blunderbass to the devpack. The blunderbass is not fully complete, but this adds a work-in-progress version to the devpack, and makes some Rust updates necessary for the new item including: - Adding `#[repr(C)]` for some more types like `Bullet` and `BulletHandle`. - Adding a lua binding to the `GlobalRng` resource so you can generate random foats in Lua. --- Cargo.lock | 144 +++++++++++++----- .../item/musket/bullet/musket.bullet.yaml | 2 +- .../sniper_rifle/bullet/sniper.bullet.yaml | 2 +- packs/devpack/assets.yaml | 2 + .../items/blunderbass/Blunderbass.schema.yaml | 6 + .../blunderbass/BlunderbassMeta.schema.yaml | 26 ++++ .../devpack/items/blunderbass/blunderbass.png | Bin 0 -> 600 bytes .../items/blunderbass/blunderbass.yaml | 10 ++ .../items/blunderbass/bullet.atlas.yaml | 4 + packs/devpack/items/blunderbass/bullet.png | Bin 0 -> 158 bytes packs/devpack/items/blunderbass/bullet.yaml | 11 ++ .../items/blunderbass/bullet_hit_dull.ogg | Bin 0 -> 4984 bytes packs/devpack/items/blunderbass/element.yaml | 4 + .../items/blunderbass/explosion.atlas.yaml | 4 + packs/devpack/items/blunderbass/explosion.png | Bin 0 -> 380 bytes packs/devpack/items/blunderbass/plugin.lua | 120 +++++++++++++++ packs/devpack/maps/devlevel_1.map.yaml | 3 +- packs/devpack/pack.yaml | 3 + src/core/bullet.rs | 15 +- src/core/elements/musket.rs | 6 +- src/core/lifetime.rs | 3 + src/core/random.rs | 45 +++++- 22 files changed, 361 insertions(+), 49 deletions(-) create mode 100644 packs/devpack/items/blunderbass/Blunderbass.schema.yaml create mode 100644 packs/devpack/items/blunderbass/BlunderbassMeta.schema.yaml create mode 100644 packs/devpack/items/blunderbass/blunderbass.png create mode 100644 packs/devpack/items/blunderbass/blunderbass.yaml create mode 100644 packs/devpack/items/blunderbass/bullet.atlas.yaml create mode 100644 packs/devpack/items/blunderbass/bullet.png create mode 100644 packs/devpack/items/blunderbass/bullet.yaml create mode 100644 packs/devpack/items/blunderbass/bullet_hit_dull.ogg create mode 100644 packs/devpack/items/blunderbass/element.yaml create mode 100644 packs/devpack/items/blunderbass/explosion.atlas.yaml create mode 100644 packs/devpack/items/blunderbass/explosion.png create mode 100644 packs/devpack/items/blunderbass/plugin.lua 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 0000000000000000000000000000000000000000..ee3412a35c9276cab0675194644aa4f51f876b6a GIT binary patch literal 600 zcmeAS@N?(olHy`uVBq!ia0vp^EAl0Z4m0*}aI1_r*vAk26?e?yG#8jinjNb#DI z`jOSeA^ED{-5EPGUu6bshwCXsab`Dfw!OMx^6}3n0;RrI$4=&+qT8|U>CIykY;+Fo zl1RQ~w%Y9h%eEH(WApsx2NAD&$Aus0<_W2IZ5r=*b8q{WO?+YY># z!^SmH&GFQPEA2;QUSEpJj4NJPF2{N7pu9?RSFo&*)en(piLbjK=<jpFb3Ow!JK=#rOc#->$v)9=P@H@3}pnFP{!Qkb63kiQtp#Liq1ut3f^dgH{1 zinM7TTHJE}@>tbb=A@f7M1C@Em1}+7mp^x=O86VLANKk`bRGu&4_!3v|Ad-?KTb`T fzdm67{g1aI&c<<`0ed1a))+ip{an^LB{Ts53VH$L literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc444106c11f8489c6bf7a8d9787066e5ae7dfe9 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ3i-X*q7}lMWc?sl1c)B=-aLkPD z-N@TuAi%7z!7J^eA?jL{A@Sh(KhXvLvJ3A&$`ooTNS&`MxhqI-UeU*ij~g~|GH~Us zZL@f=M{Y^2W0mE{iF3cdUc6OGB*yB3_r|cpyMN5L{~a&$HZ3>wD$ouFPgg&ebxsLQ E09jWz@&Et; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..572186bf98047085e26ed45dc1d5ab510c325f06 GIT binary patch literal 4984 zcmahMdpy%!|K~oE=GthA+OkPy+GLe7xsJJvpW9llD_Mk@sMk~3Tpr1znJG=-v7)F5 zrQ)p~BIJ^cl02o5O6jJH>OGt4ecr#`^Etos`~JSybH3;MJ?H!L+`iohQiOiA?cUjM zW#Fz;YIX{X6%u#Fhwb3V5DE^JvKIvHw^5M4FDZD+B!4xTq>OTAw*9&m<@-O{0i`)L z^8wX8G;tfrX4P8jRRl{*8M_I1STW(dB3SXZfEW&lgf&DN)nw<6usJ~mmAUs)`^|m| zkR1eJI4E-`3CDnsG_vXHS=vKq+a zVouksF)^VFK&9e9%|gI8E^aOk)R=?Js*`&P&1JZ_u4f@)?VA8vUX`3%c&H9QDpfmj z3f-y!D(nI@Z$yAkUl69*U8_SmbH4q=+6M|b%-gk_qh zqvG4~r;1al<`w0o*;XAE7dqv`x)+rfwAO19nvt7VR5jCmqDj&K_7r)%kXP#$#ICBN zQ}GfZT|@3a6X1J$Rl|r}Z<*$>O#CTvyoP!CoI6cqTLVF!Z_vHk#{ccp=x%MSw+`ql z`>aTPK8`S#H6Y>!UQA&OrZHzyhC%n0{^GaEgfXJ2?+MNh2U?ZIGyAPj1c*A znP5YqSUqQXyt&q3-0om*-?8v~OZ3#W_11IjBf`D64S?;3HwF+i=r9z z+@S*2&`iq6KRQ!QzC;}eS|?bB7c9jKMs0F1u6B`a=8&DLEF-fX<8nrA1Q=HVc86el zvZ(xM;j^R1%}>i&Af${%*0N3}WmP0)l_%v)WC|jWipnbrSG1pearx}?|JUcq0~`ZE z2^i;ij58hMNC$x2yZbd|-bMdKz&OTRblf4%t+7|v7C6*DVeZiQu>laIdF#AhM=zSD zgYBoUgnd@_(;fSL;Q!ZXeMFiraICs4VS9o&omB-nl!?lMHe6ZpfCqW3Y@idDDjr7? z!jH7l37a)}xh;1fSC7IwLgiSzEb;y`>{Qvi=Wju_zxAZkGQ=AQBBHri>&o znFU;Cz&6HAS|69o%x8`GvjS&W%vLFPWX8R(o;J|W?Sr`^Qts2E(L*1B7#9|$1p~f; zv`5J?!wZjl!`xvZGZ=_1j0s+QzbR(Jx#;krjWy?%X*xHZw_pxgUv8ou;SNtM+Wcs3 zIXe?Fo{PWQbthlzzlGCdcUYBbS6bIH7_5o zPXjX;KN8Ih_-%Azw#h1i%K);~olR#qT!~9a-w1ME6%9d(?l`5i^hyNuSQ$d`#hcwJ znR+~M6yW)}^kx*llZ-dy(CzURX>|HQ6fc*&9Lw>b;z}f5RJRho)E-}*Mi1Iq)n6EN zki@?egp<^HQ4dx~j2LW^Q#PedoF^cgNrZAjC)vD+2aZs1&;?oGTLQ>tSY8fQ%~T?w zx??4%&F0nl!Z1J>4BFYya)g7Evv629WJGmak$&nd1lN*=R(dq1b4jrgsX;ICA zDk_x#W(8Df*;9ckA1att*b01q05z%_sB$Anz32x4!Hr4)s$#02N-2>m%XGqV*qa97 zXRGRrHsj}v_Zx&)HOh=*Zwjb~WX2CQfaB1k`e|WMWkbs#JG$Y0A*ZLJF388dK{l%f zl|ar^Bd-Unyv2)}T~!yv$R=m}FrHNhRI#f+00L0uMkUpw*g2#Rg+XTkfgM#nR>*lp z7#s9qlP;pzz(x>IH6{%Q)sK=EI3AV@4}iQ^l;yp$DV3mFLdhhImk|+!F|ja9SK;A3L@_rE!YoG?w77OKSKq0Z{jyD^;iSWHd zi(79UdWj&jjO7@RebF6r7%q2M&I5Cq%ozu75(r=r;I=>tU;;m+^!ds$^=ZLG*dJg- ztdRhwjHjN78{Fwu;)>5KvH@Jw1LdELdB=a*l7xiP)I6@p$Xt3kzzi~O8z@J912 zK!OQ^%9C$*LtnA@EdaHUS|iyBp+| z&p}dME9wTrD#bi6I<>0BC>+F;G^ny#TDTs>tpU4|Jcy?5Sa~ym)73bWOJ@_LL7Z2O z1=6re()a@&@;=Gm>lLrYi4|uOZfw?7{JieI! z`np;u1nuT2K@O>h)>LAO^m9}f%2ta|hfI)RV1vaV55cklHyT{dI4oU`)3QfkBYxr} z!t6Odb%{{$gAddZR^!D$7U1Yqxhz5kJ^O{j%PLzr6_5P|N%%-APR0j(i?j#B4=?}3 z34Y<|^q)AeRX_NIbXQPI)a|m&dOi1nD*V`TSl)=_G8gFhvl` zE9|NGbi(F#laqKK4bwDJPL`=+NsFIb3%J;k$`As$z|zjkQVG)3LT*%}nAyeFg6h^j zBHe{(p`4+X4`~zhA>e>hqOngBAXvW8ZOtatFPTKoo@Ev zZ{?y=x|-~V0s_0g0D@XoklMXyr}Ueu&Ka$0E}$9)tqr=S23<2%bZ{VM94@K8-uq}; zK?f8mKbo?#vK#_&2q`Pee{YoA4Cjcl-y0boGaQOTS`t=bKwG+cb@%n=j;00&hWY~I z2>)o0@B=U};fc7k&V8;fV;23x|ermrup|OIw<^Z9J~BGaQc+PSJE5?Rkm{JF7^a zXVZ1|j@anxb^V65N@SRv7=8im48|keU*u>&dXS>)%=WP+*StTvcUhP8jPF@}P~Cj5 zY3QVaJF||V9C89}YEI?%-cXQ0%d7)!b>a|5m|$9nbIAnm$I=EP7v? zb>!GNx-m`x;{%6pX#HH~k$}&oM$KOEk4?Ig97aUlKvgBa@PGa7#hJun>4wmRT?JO^ z1JwCwx4`2r;hrqLTGPHRbpx^A%ix)bWue0*%md%X4*ve=^`LPGx2S{7@LW3a?h)?( zGc*Prp_^;hIpSwKwY90rX7Y2x=@Sc$nSC}on&&hP%{-C9RU_Y%#Y0nXGb=JaJEvF- zpn5|R_G%q$iaLDiTGIMUZE0W9$gK~mO3)86(@mvxS7Ac~E@Q#IzcS~<{1Q)_Acfq&ns;A~ zS9ti@H&(e1t+{_-_(@OVON-~wA&2fx#FV&L0j}F^!QQZ9D)xKQCU%DNtsPS=gm@Wt z(WFQN4#HSw!IJTE`%e5_q+XBIJ>JQ6XZf2VdCs9ok0wf6?kUz(R?Zp@>aM`$^i zsX_m`yK9T)nUR+dUoI>U)MZ*PFr!I+6UVrdK3#H1*z2U;7FPg8IacS7MjqvVdN*`2 zihX0tR^t0TW2E4#qpt?WzrD{RR&1QN=24?nPy893ZlbZ_#Yk+vfy3hUX;zfFoDS$= zqJ7M+CtY{i0#t9~91-olDH)PIRX6T$_!QoE?zU)FG!!}gs&z73XL`$`*~K2FXQG+3 zlOD@W2aTj|pL%Dj(w;srR9hB7RB2Awee$gIxl?rK)!}YR61Z|V=xjN896c&VA$%yE@fv3lsI zOMa)&1p1EiDtj6y?rHvg=6T*jKc+DHPIFm6qLQ?TLN}ABa-}Tz;dKE(USs3DTj%1LJD6JsY zx0a*s3zXY8ZJB@Z+&Xgehvz%K>c@tE-}UbNliY(_#=rK&v{;*78Xh^DSoY8<*=9N~ zX0g8hK9T2(2Yp+Q&ersNa@ZW#wl(KV!Ml`4+M%=h8p)wPtDkrCyTZO0YMRAaA#_T= zixC!#DC9BUqPI=&e7n_Uqn@12n<#vX4(?0b!vln|sn;nZ zAOBkZ`P0-C!_78$?Ib~c-+;XjvtqfwKk0SS)fMAkM~@cdjdKS|b({`LuXviaemP8D z@ean3j?OGNMJmYem^^*5a;x;~^z}D24IidW@4u}UM_yvm_mC;(*r(XYTW>cjwv9=`Z%{Px$Hc3Q5R9J=WnLQGMFc5{`W@v3Zloz1!3><*M16XhX&S1j@Jd};CGiwzGha~*H zAQ8S6@_=s$WH*8Us;a(YA|j!&KAw+@H}i13PReZRQUTy}&M0}VYyilMsyEMhLP%sM zV4&ExNY{h*9e2^xrCN!;F;>VB84NlX86)!((j(Q%8X{`UxvNKK;L8k6@eotTt%f-= zeNyL2Nl~f+rcHAftelh)fGc9^-~V4Q?6*o)l|5Bcn)>F~H}G%lLdonx$s{9`{T*$W zluVKl%I0*==u(@y)M!FkZ&bS!WeJE`-y8P2QAC7YhsUVvV`SzU! zs+)EWOF~LAJ1`p~maTQ07U_p>iKILBmZmOssg8Uf!J7z)UDKWt@Vy-Z0QcLAvMd_A ar}PH(N^AVu^-f*@0000 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 +}