...
 
Commits (52)
[default]
name=Default
device=local
runtime=host
config-opts=
run-opts=
prefix=
app-id=
default=true
[default.environment]
PROFILE=release
RUSTFLAGS=-C link-args=-s -C debuginfo=0 -C opt-level=3
RUST_BACKTRACE=1
......@@ -5,3 +5,7 @@
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
Cargo.lock
rs_game_framework.iml
rs_game_framework.iws
.idea
.vscode
......@@ -24,3 +24,6 @@ pages:
artifacts:
paths:
- public
variables:
GIT_SUBMODULE_STRATEGY: normal
[submodule "tiny_ecs"]
path = tiny_ecs
url = https://gitlab.com/ljcode/tiny_ecs.git
[submodule "vec2d"]
path = vec2d
url = https://gitlab.com/ljcode/vec2d.git
[submodule "cyclone-rs"]
path = cyclone-rs
url = https://gitlab.com/ljcode/cyclone-rs.git
[submodule "tiled-json-rs"]
path = tiled-json-rs
url = https://gitlab.com/ljcode/tiled-json-rs.git
max_width = 100
max_width =80
comment_width = 80
wrap_comments = false
fn_args_density = "Compressed"
fn_single_line = false
fn_args_density = "Tall"
wrap_comments = false
indent_style = "Visual"
brace_style = "PreferSameLine"
struct_field_align_threshold = 20
# struct_field_align_threshold = 20
reorder_imports = true
reorder_imported_names = true
reorder_imports_in_group = true
reorder_extern_crates = true
reorder_extern_crates_in_group = true
[package]
name = "rs_game_framework"
name = "rust_game"
version = "0.1.1"
license = "MPL-2.0"
readme = "README.md"
authors = ["Luke Jones <luke.nukem.jones@gmail.com>"]
authors = ["Luke Jones <jones_ld@protonmail.com>"]
edition = "2018"
[dependencies]
rand = "*"
num-traits = "0.1.40"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"
clippy = { version = "*", optional = true }
tiled-json-rs = { path = "tiled-json-rs"}
tiny_ecs = { path = "tiny_ecs" }
particle2d = { path = "cyclone-rs/particle2d" }
vec_map = "0.8"
[dev-dependencies]
[dependencies.sdl2]
version = "0.31"
version = "0.32"
default-features = false
features = ["image"]
features = ["image", "unsafe_textures"]
[[bin]]
name = "game"
path = "src/main.rs"
[features]
default = []
lag =[]
[profile.release]
lto = true
debug = false
opt-level = 3
debuginfo = 0
panic = "abort"
[profile.debug]
[profile.dev]
lto = true
debug = true
opt-level = 2
panic = "unwind"
[profile.bench]
lto = true
debug = false
opt-level = 3
.PHONY: clean release debug dist zip test deps
default: release
release:
cargo rustc --release -- -C link-args=-s
cp target/release/game ./
debug:
cargo rustc -- -C link-args=-s
dist: clean deps release
zip: dist
zip -q -r game.zip game assets
test:
cargo test
doc:
cargo doc --release --no-deps
clean:
cargo clean
rm -rf game.zip lib/* dist/* ./game
## TODO
1 [] Redo tests
2 [] Document new code
3 [] Texture manager and its lodaing functions
4 [] Scenegraph engine
5 [] Menu support stuff. Perhaps using the ECS with some menu specific components and systems.
#### states.rs
1 [] line 140: Viewport work - Ascpect ratio correction etc.
#### systems.rs
1 [] line 252: Force calculations
#### components mod.rs
1 [] line 8: Trait use to make components a little more generic / enable component grouping? Or use enums for that?
#### lib.rs
* [] line 45: Settings load save
#### world.rs
1 [] line 80: proper sorting out of active entities - Should maybe tie in with viewport work so all off-screen entities are non-active.
2 [] line 137: Render by layers
#### play.rs
1 [] line 61: match tile number against entitiy/components to create, add more creators.
#### general
* [] Logging abiltiies
* [] Investigate using more *data-driven* approach
assets/test_level2_background.csv,assets/test_level2_tiles.csv,assets/test_level2_objects.csv
This diff is collapsed.
This diff is collapsed.
sheet:sprites00.png,,,,,,,,,,,,,,,,,,,,,,,,,,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,15
15,0,15,0,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,0,0,15
15,0,15,0,0,0,15,15,0,15,0,0,0,0,0,0,0,27,0,27,0,0,15,15,0,0,15
15,0,15,15,15,0,0,0,0,15,15,0,0,0,0,0,0,0,0,0,0,0,15,15,0,15,15
15,0,0,0,0,0,0,0,0,0,15,15,15,15,0,0,0,0,0,0,27,0,0,0,0,0,15
15,85,86,87,0,0,2,3,4,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,15
15,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,0,0,27,0,0,28,0,0,0,0,15
15,85,86,87,0,0,0,85,86,87,0,15,15,0,0,15,15,0,0,0,0,0,0,0,0,0,15
15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15
40,40,40,40,40,40,40,0,0,0,0,48,40,40,40,15,15,15,15,15,15,15,15,0,0,0,15
43,43,43,43,43,0,0,0,0,0,0,43,43,43,43,43,43,43,43,43,43,43,15,0,0,0,15
43,43,43,43,43,56,47,0,0,43,0,0,43,43,43,43,43,43,43,56,43,43,15,0,0,15,15
43,43,43,44,43,43,43,47,0,0,0,0,43,43,43,43,43,43,43,43,44,43,15,0,0,128,15
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,44,43,43,43,43,43,15,15,15,15,15
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,91,92,92,92,92,92,92,92,93,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,42,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,91,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,94,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,115,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,115,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,91,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,93,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,-1,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,109,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,20,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,28,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,73,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,37,-1,-1,73,-1,-1,-1,-1,-1,-1,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,39,38,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,-1,-1,73,-1,-1,36,-1,-1,23,-1,-1,-1,-1,-1,-1,-1,-1,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,60,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,111,-1,-1,-1,105,105,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,74,-1,-1,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,105,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,127,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,127,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
24,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24
24,-1,-1,27,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,24,24,24,24,24,-1,-1,24,24,24,24,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,24,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,24,24,24,24,24,24,24,24,24,24,24,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,24,24,-1,-1,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,27,-1,-1,-1,-1,29,30,30,30,30,30,30,30,31,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,46,49,43,45,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24
24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,27,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,24
24,-1,-1,-1,-1,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
24,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,24,29,30,30,30,30,31,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,24
24,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
43,43,43,43,43,43,43,43,43,43,43,47,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24
43,43,43,43,43,43,43,43,43,43,43,43,47,-1,-1,-1,-1,-1,-1,-1,27,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24
43,43,45,-1,-1,50,-1,-1,50,-1,-1,46,43,47,-1,-1,-1,-1,-1,27,27,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,24,-1,24,-1,-1,24,-1,24,-1,-1,-1,-1,-1,24
43,45,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,4,-1,-1,2,3,3,3,3,3,3,4,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,24
43,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,27,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,24,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,24
43,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,10,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,85,86,87,-1,-1,-1,-1,-1,85,86,87,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,-1,-1,-1,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24
5,-1,-1,-1,-1,-1,-1,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,24,24,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,24,24,24,-1,-1,24
5,-1,-1,-1,-1,-1,27,27,27,27,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,48,40,40,40,47,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24
5,-1,-1,-1,27,-1,27,27,27,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,40,40,40,43,43,43,43,43,47,-1,48,40,40,40,47,-1,-1,-1,-1,-1,58,24
5,-1,-1,-1,27,-1,27,27,27,27,27,27,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,40,40,40,40,40,47,48,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,24,24,24,24,24,24,24
51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,40,40,40,40,40,47,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,40,40,47,48,40,47,-1,48,40,40,40,47,48,40,40,40,36,40,43,43,43,43,43,43,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
63,63,63,63,63,63,63,14,43,43,43,43,43,43,43,43,43,43,43,57,57,43,40,40,40,40,40,40,40,40,40,40,40,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,56,43,43,43,43,43,43,43,43
43,43,43,43,43,43,43,14,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
43,43,43,43,43,57,43,14,43,43,43,43,43,43,15,43,43,57,43,57,43,43,43,43,57,43,43,43,43,43,43,43,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,57,43,43,43,43,43,57,43
43,43,43,43,43,43,43,14,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,56,57,43,43,57,43,43,43,43,43,43,57,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
43,43,43,43,43,43,43,14,43,43,43,43,43,56,57,43,43,43,43,43,43,43,43,43,43,43,44,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
43,43,43,43,43,43,43,14,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43
Subproject commit 3cc1b411f972e4f424fdc33c3550d71c87967e60
......@@ -4,116 +4,86 @@
use sdl2::rect::Rect;
use super::*;
use components::parts::*;
use manager::bindings::Bindings;
use manager::world::World;
use resource::SpriteSheets;
use crate::components::parts::*;
use crate::controls::Bindings;
use crate::manager::world::World;
use crate::messaging::PlayerListener;
use crate::particle2d::particle::Particle;
use crate::vec2d::Vec2d;
use tiny_ecs::ECSError;
/// Create a Player entity at the X,Y coords in the World
pub fn player(world: &mut World, x: u32, y: u32, sprite_id: &str, sprite_sheets: &SpriteSheets) {
if let Some(ent) = world.entities.get_free_slot() {
let pos = world.from_tile(x, y);
world.player = ent;
world.entities.mask[ent as usize] = POSITION | VELOCITY | AABB | PHYSICS | INPUT |
PLAYER | SPRITE;
world.entities.parts.position.insert(
ent,
Position::new(pos.x, pos.y, 0.0),
);
world.entities.parts.velocity.insert(
ent,
Velocity::default(),
);
pub fn player(
world: &mut World,
x: u32,
y: u32,
sprite_id: &str,
) -> Result<usize, ECSError> {
let mut player = Particle::new(1.0, 0.85);
player.set_position(Vec2d::new(f64::from(x), f64::from(y)));
player.set_acceleration(Vec2d::new(0.0, -9.81));
let id = world.physics_world.add_particle(player).unwrap();
let particle_ptr = world
.physics_world
.get_particle_ptr(id)
.expect("Couldn't get player pointer");
let tx = sprite_sheets.get_ref(sprite_id);
let rec = Rect::new(0, 0, tx.width(), tx.height());
world.entities.parts.aabb.insert(
ent,
AABB::new(
pos.x,
pos.y,
tx.width(),
tx.height(),
),
);
world.entities.parts.sprite.insert(
ent,
Sprite::new(sprite_id, rec),
);
let rec = Rect::new(0, 0, 16, 16);
// key bindings related to player actions
let mut binds = Bindings::new();
binds.init_player();
world.entities.parts.physics.insert(ent, Physics::default());
let mut binds = Bindings::new();
binds.initialize();
world.entities.parts.input.insert(
ent,
InputTypes::Player(
PlayerInput::new(binds),
),
);
world.entities.parts.player.insert(
ent,
Player::new(1.5, 6.0),
);
world.map_detail.objects.push(ent);
} else {
println!("No more entity slots left");
}
let ent = world
.entities
.new_entity()
.with(ParticleID { id })?
.with(Sprite::new(sprite_id, rec))?
.with(InputTypes::Player(binds))?
.with(Player::new(5.0, 15.0))?
.finalise()?;
// Message listener to act on messages to player entity
world.add_listener(PlayerListener::new(ent, particle_ptr));
world.set_player(ent);
Ok(ent)
}
/// Creates a background tile at X,Y in the World - requires a `sprite_id` and `Rect` for size,
/// the size of the sprite and rectangle don't need to match, the sprite will be drawn to the
/// size of the `Rect`.
pub fn background_tile(world: &mut World, x: u32, y: u32, sprite_id: &str, rec: Rect) {
if let Some(ent) = world.entities.get_free_slot() {
let pos = world.from_tile(x, y);
world.entities.mask[ent as usize] = POSITION | SPRITE;
world.entities.parts.position.insert(
ent,
Position::new(pos.x, pos.y, 0.0),
);
world.entities.parts.sprite.insert(
ent,
Sprite::new(sprite_id, rec),
);
// Insert entity_id in to layer reference
world.map_detail.background.push(ent);
} else {
println!("No more entity slots left");
}
pub fn background_tile(
world: &mut World,
x: u32,
y: u32,
sprite_id: &str,
rec: Rect,
) -> Result<(), ECSError> {
world
.entities
.new_entity()
.with(Sprite::new(sprite_id, rec))?
.finalise()?;
Ok(())
}
/// Creates a foreground tile at X,Y in the World - requires a `sprite_id` and `Rect` for size,
/// the size of the sprite and rectangle don't need to match, the sprite will be drawn to the
/// size of the `Rect` and the `Rect` will also function as a collider AABB. The tile can
/// have physics properties
pub fn level_tile(world: &mut World, x: u32, y: u32, sprite_id: &str, rec: Rect) {
if let Some(ent) = world.entities.get_free_slot() {
let pos = world.from_tile(x, y);
world.entities.mask[ent as usize] = POSITION | AABB | SPRITE | PHYSICS;
world.entities.parts.position.insert(
ent,
Position::new(pos.x, pos.y, 0.0),
);
world.entities.parts.aabb.insert(
ent,
AABB::new(
pos.x,
pos.y,
rec.width(),
rec.height(),
),
);
world.entities.parts.sprite.insert(
ent,
Sprite::new(sprite_id, rec),
);
world.entities.parts.physics.insert(ent, Physics::default());
// Insert entity_id in to layer reference
world.map_detail.foreground.push(ent);
} else {
println!("No more entity slots left");
}
pub fn level_tile(
world: &mut World,
x: u32,
y: u32,
sprite_id: &str,
rec: Rect,
) -> Result<(), ECSError> {
world
.entities
.new_entity()
.with(Sprite::new(sprite_id, rec))?
.finalise()?;
Ok(())
}
/// Creates an object at X,Y in the World - this is used for such things as interactive objects
......@@ -121,31 +91,17 @@ pub fn level_tile(world: &mut World, x: u32, y: u32, sprite_id: &str, rec: Rect)
/// Requires a `sprite_id` and `Rect` for size, the size of the sprite and rectangle don't need
/// to match, the sprite will be drawn to the size of the `Rect` and the `Rect` will also
/// function as a collider AABB
pub fn object_tile(world: &mut World, x: u32, y: u32, sprite_id: &str, rec: Rect) {
if let Some(ent) = world.entities.get_free_slot() {
let pos = world.from_tile(x, y);
world.entities.mask[ent as usize] = POSITION | AABB | SPRITE;
world.entities.parts.position.insert(
ent,
Position::new(pos.x, pos.y, 0.0),
);
world.entities.parts.aabb.insert(
ent,
AABB::new(
pos.x,
pos.y,
rec.width(),
rec.height(),
),
);
world.entities.parts.sprite.insert(
ent,
Sprite::new(sprite_id, rec),
);
world.entities.parts.physics.insert(ent, Physics::default());
// Insert entity_id in to layer reference
world.map_detail.objects.push(ent);
} else {
println!("No more entity slots left");
}
pub fn object_tile(
world: &mut World,
x: u32,
y: u32,
sprite_id: &str,
rec: Rect,
) -> Result<(), ECSError> {
world
.entities
.new_entity()
.with(Sprite::new(sprite_id, rec))?
.finalise()?;
Ok(())
}
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use components::parts::*;
use std::collections::HashMap;
#[derive(Clone, Debug)]
pub enum Message {
Player(PlayerMsg),
Ai(AiMsg),
}
// Maybe store functions pointers here for processing by systems?
// Would save time and code...
#[derive(Clone, Debug)]
pub enum PlayerMsg {
MoveLeft,
MoveUp,
MoveRight,
MoveDown,
Shoot,
Jump,
}
#[allow(unused_variables)]
impl PlayerMsg {
pub fn action(&self, v: &mut Velocity, phy: &mut Physics, p: &mut Player) {
match *self {
PlayerMsg::MoveLeft => v.vel.x = -p.speed,
PlayerMsg::MoveUp => v.vel.y = -p.speed,
PlayerMsg::MoveRight => v.vel.x = p.speed,
PlayerMsg::MoveDown => v.vel.y = p.speed,
PlayerMsg::Shoot => {
println!("Shoot!");
}
PlayerMsg::Jump => v.vel.y = -p.jump_h,
}
}
}
#[derive(Clone, Debug)]
pub enum AiMsg {
Die,
GoAllSkynetOnUs,
}
#[allow(unused_variables)]
impl AiMsg {
pub fn action(&self, v: &mut Velocity, phy: &mut Physics, a: &mut Ai) {
match *self {
AiMsg::Die => {
println!("Skynet died! (Not!)");
}
AiMsg::GoAllSkynetOnUs => {
println!("(Arnie voice) You are terminated!");
}
}
}
}
///
/// The main way of passing messages between components
///
use std::vec;
pub struct MessageBus {
messages: HashMap<u32, Vec<Message>>, // entity id, vec of all messages for that entity
}
impl MessageBus {
pub fn new() -> MessageBus {
MessageBus { messages: HashMap::new() }
}
pub fn insert(&mut self, entity_id: u32, message: Message) {
// See if we can get the existing vec for the entity_id
if self.messages.contains_key(&entity_id) {
if let Some(entry) = self.messages.get_mut(&entity_id) {
entry.push(message)
};
} else {
self.messages.insert(entity_id, vec![message]);
}
}
/// Returns the vector of all messages for the entity_id, if any.
pub fn get_msgs(&mut self, entity_id: &u32) -> Option<&mut Vec<Message>> {
self.messages.get_mut(entity_id)
}
/// Drain all messages for entity_id
pub fn drain(&mut self, entity_id: &u32) -> Option<vec::Drain<Message>> {
if let Some(msgs) = self.messages.get_mut(entity_id) {
// return a Drain<T> iterator
return Some(msgs.drain(0..));
}
None
}
}
......@@ -2,92 +2,24 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/// Systems that the World uses
pub mod systems;
/// The possible messages between components
pub mod messages;
/// Methods for creating entities
///
/// Generally, these methods can conpose an entity from any parts
/// required and then push a mask in to the entity list which works
/// by the index number in the list being the entity ID for parts and
/// the mask containing the parts used.
pub mod create;
/// Parts for creating entities with
pub mod parts;
use std::collections::HashMap;
const MAX_ENTS: usize = 10_000;
macro_rules! Entities {
($([$bf_shift:expr, $bf_name:ident, $m_name:ident, $ty:ty]),+) => {
pub const EMPTY: u32 = 0;
$(pub const $bf_name: u32 = 1<<$bf_shift;)+
/// A struct of `HashMap` for each entity part type
///
/// The objects stored in each `HashMap` are keyed to the
/// entity ID number for quick loop up
pub struct Parts {
$(pub $m_name: HashMap<u32, $ty>,)+
}
///
/// Stores all entities
///
/// Enables ability to pass the required arrays to Systems. We can't do this if the
/// World struct contains them because of ownership conflicts in Rust.
pub struct Entities {
/// Used to keep track of which index number has which components. The
/// index number that the entity is created at is then used as the key
/// for the object hashmaps in `_entities`
///
/// Eg: POSITION + AABB (= 5, can be used for collidable object positions)
pub mask: [u32; MAX_ENTS],
/// The struct of HashMaps for each entity part type
pub parts: Parts,
/// `next_free` is used to keep track of how far the array has been used.
/// For example if only 42 entities have been created then when inserting a new entity
/// `create` will iterate through to find either first `EMPTY` or insert at `next_free`
/// and increment
pub next_free: u32
}
impl Entities {
pub fn new() -> Entities {
Entities {
mask: [EMPTY; MAX_ENTS],
parts: Parts {
$($m_name: HashMap::new(),)+
},
next_free: 1
}
}
/// Remove the specified entity index and set as `EMPTY`
pub fn remove(&mut self, ent: u32) {
if self.mask[ent as usize] != EMPTY as u32 {
$(self.parts.$m_name.remove(&ent);)+
}
}
/// Find the first `EMPTY` ID number to use
pub fn get_free_slot(&mut self) -> Option<u32> {
for index in 0..self.next_free {
if self.mask[index as usize] == EMPTY as u32 {
self.next_free += 1;
return Some(index);
}
}
None
}
}
}
}
/// Parts that can be used to compose entities
///
/// Parts can (and should) be used with systems, and as such
/// they shouldn't have any methods attached to them - instead
/// a system will do the work required.
pub mod parts;
Entities!(
[0, POSITION, position, parts::Position],
[1, VELOCITY, velocity, parts::Velocity],
[2, AABB, aabb, parts::AABB],
[3, PHYSICS, physics, parts::Physics],
[4, INPUT, input, parts::InputTypes],
[5, SPRITE, sprite, parts::Sprite],
[6, ANIMATION, animation, parts::Animation],
[7, PLAYER, player, parts::Player],
[8, AI, ai, parts::Ai],
[9, HEALTH, health, parts::Health],
[10, ARMOUR, armour, parts::Armour],
[11, INVENTORY, inventory, parts::Inventory]
);
/// Systems that the World uses to work with entities
///
/// Systems can be used for, and do anything, as long as
/// it is only with entity parts - no other aspects of
/// the engine.
pub mod systems;
......@@ -2,97 +2,38 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use manager::bindings::Bindings;
use sdl2::rect::Rect;
use std::collections::HashMap;
use vec2d::Vec2d;
// TODO: Think about using the traits to return mutable references,
// and remove the update functions
use sdl2::rect::Rect;
use crate::controls::Bindings;
use crate::vec2d::Vec2d;
/// The most commonly used component. Not compulsory though
#[derive(Default)]
pub struct Position {
pub pos: Vec2d<i32>,
pub rot: f32,
pub pos: Vec2d<f64>,
pub rot: f64,
}
impl Position {
pub fn new(x: i32, y: i32, d: f32) -> Position {
pub fn new(x: f64, y: f64, r: f64) -> Position {
Position {
pos: Vec2d::new(x, y),
rot: d,
rot: r,
}
}
}
/// Required by physics components
#[derive(Default)]
pub struct Velocity {
pub vel: Vec2d<f32>,
}
impl Velocity {
pub fn new(x: f32, y: f32) -> Velocity {
Velocity { vel: Vec2d::new(x, y) }
}
}
/// Used by collisions and physics
pub struct AABB {
pub rect: Rect,
}
impl AABB {
pub fn new(x: i32, y: i32, w: u32, h: u32) -> AABB {
AABB { rect: Rect::new(x, y, w, h) }
}
}
impl Default for AABB {
fn default() -> AABB {
AABB { rect: Rect::new(0, 0, 1, 1) }
}
}
/// `Physics` requires `Position` and `Velocity` components
///
/// Basic Physics Component
pub struct Physics {
pub accel: Vec2d<f32>,
pub mass: f32,
pub force: Vec2d<f32>,
pub gravity: f32,
pub bounce: f32,
pub friction: f32,
}
impl Physics {
pub fn new(mass: f32, force: Vec2d<f32>) -> Physics {
Physics {
accel: Vec2d::new(0.0, 0.0),
mass: mass,
force: force,
gravity: 0.5,
bounce: 0.5,
friction: 0.5,
}
}
}
impl Default for Physics {
fn default() -> Physics {
Physics {
accel: Vec2d::default(),
mass: 0.2,
force: Vec2d::default(),
gravity: 0.5,
bounce: 0.5,
friction: 0.5,
}
}
#[derive(Debug)]
pub struct ParticleID {
pub id: usize,
}
pub struct Player {
pub speed: f32,
pub jump_h: f32,
pub speed: f64,
pub jump_h: f64,
}
impl Player {
pub fn new(s: f32, jh: f32) -> Player {
pub fn new(s: f64, jh: f64) -> Player {
Player {
speed: s,
jump_h: jh,
......@@ -102,8 +43,8 @@ impl Player {
impl Default for Player {
fn default() -> Player {
Player {
speed: 2.0,
jump_h: 20.0,
speed: 3.0,
jump_h: 15.0,
}
}
}
......@@ -130,19 +71,11 @@ impl Default for Ai {
}
pub enum InputTypes {
Player(PlayerInput),
}
pub struct PlayerInput {
pub bindings: Bindings,
}
impl PlayerInput {
pub fn new(bindings: Bindings) -> PlayerInput {
PlayerInput { bindings: bindings }
}
Player(Bindings),
Menu(Bindings),
}
///
#[derive(Debug)]
pub struct Sprite {
pub sid: String,
pub frame: Rect,
......@@ -152,7 +85,7 @@ impl Sprite {
pub fn new(spr: &str, frame: Rect) -> Sprite {
Sprite {
sid: spr.to_string(),
frame: frame,
frame,
}
}
}
......@@ -172,24 +105,17 @@ pub struct Animation {
}
impl Animation {
pub fn new(
x: i32,
y: i32,
w: u32,
h: u32,
speed: u32,
per_anim: u32,
columns: u32,
keys: HashMap<String, u32>,
sprite_id: String,
x: i32, y: i32, w: u32, h: u32, speed: u32, per_anim: u32,
columns: u32, keys: HashMap<String, u32>, sprite_id: String,
) -> Animation {
Animation {
counter: 0,
speed: speed,
speed,
current: 0,
start_frame: 0,
per_anim: per_anim,
columns: columns,
keys: keys,
per_anim,
columns,
keys,
frame: Rect::new(x, y, w, h),
sid: sprite_id,
}
......@@ -227,10 +153,7 @@ pub struct Health {
}
impl Health {
pub fn new(current: i32, max: i32) -> Health {
Health {
current: current,
max: max,
}
Health { current, max }
}
}
impl Default for Health {
......@@ -248,10 +171,7 @@ pub struct Armour {
}
impl Armour {
pub fn new(current: i32, max: i32) -> Armour {
Armour {
current: current,
max: max,
}
Armour { current, max }
}
}
impl Default for Armour {
......@@ -296,14 +216,7 @@ pub struct WeaponRanged {
}
impl WeaponRanged {
pub fn new(
n: String,
r: u32,
d: u32,
s: u32,
sp: u32,
ma: u32,
ca: u32,
rs: u32,
n: String, r: u32, d: u32, s: u32, sp: u32, ma: u32, ca: u32, rs: u32,
sc: u32,
) -> WeaponRanged {
WeaponRanged {
......
This diff is collapsed.
......@@ -2,11 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#![macro_use] // the enum of buttons
use components::messages::*;
use crate::messaging::Message;
use sdl2::event::Event;
use sdl2::keyboard::Scancode as Sc;
use sdl2::mouse::MouseButton as Mb;
use sdl2::EventPump;
use std::collections::hash_set::HashSet;
use std::collections::HashMap;
/// A generic version of a `callback`
......@@ -34,15 +36,18 @@ use std::collections::HashMap;
#[macro_export]
macro_rules! callback {
($t:ident :: $m:ident) => {{
fn __f(x: &mut $t) { x.$m() }
fn __f(x: &mut $t) {
x.$m()
}
__f
}}
}};
}
// most of this doesn't need to be public
/// Stores a set of input bindings. Currently used in InputTypes component,
/// can also be used in game states, menus, etc.
pub struct Bindings {
pub keys: HashMap<Sc, Message>,
pub mouse: HashMap<Mb, Message>,
keys: HashMap<Sc, Message>,
mouse: HashMap<Mb, Message>,
}
impl Bindings {
......@@ -54,13 +59,13 @@ impl Bindings {
}
}
pub fn initialize(&mut self) {
self.add_key_bind(Sc::Left, Message::Player(PlayerMsg::MoveLeft));
self.add_key_bind(Sc::Up, Message::Player(PlayerMsg::MoveUp));
self.add_key_bind(Sc::Right, Message::Player(PlayerMsg::MoveRight));
self.add_key_bind(Sc::Down, Message::Player(PlayerMsg::MoveDown));
self.add_key_bind(Sc::LCtrl, Message::Player(PlayerMsg::Shoot));
self.add_key_bind(Sc::Space, Message::Player(PlayerMsg::Jump));
pub fn init_player(&mut self) {
self.add_key_bind(Sc::Left, Message::MoveLeft);
self.add_key_bind(Sc::Up, Message::MoveUp);
self.add_key_bind(Sc::Right, Message::MoveRight);
self.add_key_bind(Sc::Down, Message::MoveDown);
self.add_key_bind(Sc::LCtrl, Message::Shoot);
self.add_key_bind(Sc::Space, Message::Jump);
}
/// Adds a keyboard button binding and action String to the binding manager
......@@ -75,7 +80,7 @@ impl Bindings {
/// # use sdl2::keyboard::Scancode as Sc;
/// # fn main() {
/// let mut bindings = Bindings::new();
/// bindings.add_key_bind(Sc::Left, Message::Player(PlayerMsg::Shoot));
/// bindings.add_key_bind(Sc::Left, Message::Shoot);
/// # }
/// ```
pub fn add_key_bind(&mut self, sc: Sc, action: Message) {
......@@ -119,11 +124,11 @@ impl Bindings {
/// }
/// }
/// ```
pub fn get_key_bind(&self, sc: &Sc) -> Option<&Message> {
self.keys.get(sc)
pub fn get_key_bind(&self, sc: Sc) -> Option<&Message> {
self.keys.get(&sc)
}
pub fn get_mouse_bind(&self, mb: &Mb) -> Option<&Message> {
self.mouse.get(mb)
pub fn get_mouse_bind(&self, mb: Mb) -> Option<&Message> {
self.mouse.get(&mb)
}
///
......@@ -136,3 +141,86 @@ impl Bindings {
&self.mouse
}
}
/// Fetch all input
pub struct Input {
pump: EventPump,
key_state: HashSet<Sc>,
mouse_state: HashSet<Mb>,
mouse_pos: (i32, i32),
quit: bool,
}
impl Input {
pub fn new(pump: EventPump) -> Input {
Input {
pump,
key_state: HashSet::new(),
mouse_state: HashSet::new(),
mouse_pos: (0, 0),
quit: false,
}
}
/// The way this is set up to work is that for each `game tick`, a fresh set of event is
/// gathered and stored. Then for that single game tick, every part of the game can ask
/// `Input` for results without the results being removed.
///
/// The results of the `update` are valid until the next `update` whereupon they are refreshed.
///
/// **rust-sdl2** provides an `event_iter()`, but this isn't very useful unless we perform
/// all the required actions in the same block that it is called in. It has the potential
/// to cause delays in proccessing
///
pub fn update(&mut self) {
if let Some(event) = self.pump.poll_event() {
match event {
Event::KeyDown { .. } => {
self.key_state = self
.pump
.keyboard_state()
.pressed_scancodes()
.collect();
}
Event::KeyUp { .. } => {
self.key_state = self
.pump
.keyboard_state()
.pressed_scancodes()
.collect();
}
Event::MouseButtonDown { mouse_btn, .. } => {
self.mouse_state.insert(mouse_btn);
}
Event::MouseButtonUp { mouse_btn, .. } => {
self.mouse_state.remove(&mouse_btn);
}
Event::Quit { .. } => self.quit = true, // Early out if Quit
Event::MouseMotion { x, y, .. } => {
self.mouse_pos.0 = x;
self.mouse_pos.1 = y;
}
_ => {}
}
}
}
pub fn get_key(&self, s: Sc) -> bool {
self.key_state.contains(&s)
}
pub fn get_mbtn(&self, m: Mb) -> bool {
self.mouse_state.contains(&m)
}
pub fn get_mpos(&self) -> (i32, i32) {
self.mouse_pos
}
pub fn get_quit(&self) -> bool {
self.quit
}
}
......@@ -2,34 +2,28 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#![macro_use]
use manager::bindings::Bindings;
use manager::input::Input;
use states::States;
use states::menu::*;
use states::pause::*;
use states::play::*;
use sdl2::Sdl;
use sdl2::keyboard::Scancode;
use sdl2::pixels::PixelFormatEnum;
use sdl2::rect::Rect;
use sdl2::render::Canvas;
use sdl2::surface::Surface;
use sdl2::video::Window;
use sdl2::Sdl;
use crate::controls::{Bindings, Input};
use crate::states::menu::Menu;
use crate::states::pause::Pause;
use crate::states::play::Play;
use crate::states::States;
use crate::FP;
pub struct Game<'surface> {
pub struct Game {
bindings: Bindings,
input: Input,
states: States,
canvas: Canvas<Window>,
surface: Surface<'surface>,
view_rect: Rect,
running: bool,
state_changing: bool,
}
impl<'surface> Game<'surface> {
impl Game {
/// On `Game` object creation, initialize all the game subsystems where possible
///
/// Ideally full error checking will be done in by system.
......@@ -44,16 +38,17 @@ impl<'surface> Game<'surface> {
.build()
.unwrap();
let canvas = window.into_canvas().accelerated().build().unwrap();
let view_width = (y / 3) * 4;
let view_x = (x - view_width) / 2;
let view_rect = Rect::new(view_x as i32, 0, view_width, y);
let canvas = window
.into_canvas()
.accelerated()
.present_vsync()
.build()
.unwrap();
let events = sdl_ctx.event_pump().unwrap();
let mut bindings = Bindings::new();
bindings.initialize();
bindings.init_player();
let input = Input::new(events);
......@@ -61,21 +56,21 @@ impl<'surface> Game<'surface> {
states.push(Box::new(Menu::new()));
Game {
bindings: bindings,
input: input,
states: states,
canvas: canvas,
surface: Surface::new(x, y, PixelFormatEnum::RGB24).unwrap(),
view_rect: view_rect,
bindings,
input,
states,
canvas,
running: true,
state_changing: false,
}
}
/// Called by the main loop
pub fn update(&mut self, time: f32) {
pub fn update(&mut self, time: FP) {
self.states.update(time, &self.input, &mut self.bindings);
self.running = !self.input.get_quit();
}
/// `handle_events` updates the current events and inputs plus changes `states`
///
/// In an C++ engine, using a button to switch states would probably be
......@@ -89,28 +84,40 @@ impl<'surface> Game<'surface> {
pub fn handle_events(&mut self) {
self.input.update();
if self.input.get_key(&Scancode::Escape) {
if self.states.get_state_id().unwrap() == "_MENU" && !self.state_changing {
if self.input.get_key(Scancode::Escape) {
if self.states.get_state_id().unwrap() == "_MENU"
&& !self.state_changing
{
self.states.pop();
self.states.change(Box::new(Play::new()));
let play = Play::new(&mut self.canvas);
self.states.change(Box::new(play));
self.state_changing = true;
} else if self.states.get_state_id().unwrap() == "_PLAY" && !self.state_changing {
} else if self.states.get_state_id().unwrap() == "_PLAY"
&& !self.state_changing
{
self.states.push(Box::new(Pause::new()));
self.state_changing = true;
} else if self.states.get_state_id().unwrap() == "_PAUSE" && !self.state_changing {
} else if self.states.get_state_id().unwrap() == "_PAUSE"
&& !self.state_changing
{
self.states.pop();
self.state_changing = true;
}
} else if self.input.get_key(&Scancode::Return) {
if self.states.get_state_id().unwrap() == "_PAUSE" && !self.state_changing {
} else if self.input.get_key(Scancode::Return) {
if self.states.get_state_id().unwrap() == "_PAUSE"
&& !self.state_changing
{
self.states.pop();
self.states.change(Box::new(Menu::new()));
self.state_changing = true;
}
} else if !self.input.get_key(&Scancode::Escape) && !self.input.get_key(&Scancode::Return) {
} else if !self.input.get_key(Scancode::Escape)
&& !self.input.get_key(Scancode::Return)
{
self.state_changing = false;
}
}
/// `render` calls the `states.render()` method with a time-step for state renders
///
/// The main loop, in this case, the `'running : loop` in lib.rs should calculate
......@@ -118,18 +125,12 @@ impl<'surface> Game<'surface> {
/// from which the game states (or menu) will use to render objects at the correct
/// point in time.
///
pub fn render(&mut self, dt: f32) {
pub fn render(&mut self, dt: FP) {
// The state machine will handle which state renders to the surface
self.states.render(dt, &mut self.surface);
let texture_creator = self.canvas.texture_creator();
let texture = texture_creator