Why doesn't play serialize??? 😢

This commit is contained in:
Seoxi Ryouko
2025-02-08 09:32:03 -06:00
parent c188cfc5e8
commit f69eb3262a
6 changed files with 533 additions and 74 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
/target /target
Rocket.toml Rocket.toml
/static

270
Cargo.lock generated
View File

@ -26,6 +26,21 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "android-tzdata"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "async-stream" name = "async-stream"
version = "0.3.6" version = "0.3.6"
@ -95,6 +110,12 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "base64"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]] [[package]]
name = "binascii" name = "binascii"
version = "0.1.4" version = "0.1.4"
@ -107,6 +128,12 @@ version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
[[package]]
name = "bumpalo"
version = "3.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
version = "1.21.0" version = "1.21.0"
@ -140,6 +167,19 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
version = "0.4.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
dependencies = [
"android-tzdata",
"iana-time-zone",
"num-traits",
"serde",
"windows-targets 0.52.6",
]
[[package]] [[package]]
name = "cookie" name = "cookie"
version = "0.18.1" version = "0.18.1"
@ -151,17 +191,60 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]] [[package]]
name = "dandadan" name = "dandadan"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"rand 0.9.0", "rand 0.9.0",
"rocket", "rocket",
"serde",
"serde_json", "serde_json",
"serde_with",
"url", "url",
"uuid", "uuid",
] ]
[[package]]
name = "darling"
version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
dependencies = [
"darling_core",
"darling_macro",
]
[[package]]
name = "darling_core"
version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim",
"syn",
]
[[package]]
name = "darling_macro"
version = "0.20.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
"syn",
]
[[package]] [[package]]
name = "deranged" name = "deranged"
version = "0.3.11" version = "0.3.11"
@ -169,6 +252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
dependencies = [ dependencies = [
"powerfmt", "powerfmt",
"serde",
] ]
[[package]] [[package]]
@ -406,13 +490,19 @@ dependencies = [
"futures-sink", "futures-sink",
"futures-util", "futures-util",
"http 0.2.12", "http 0.2.12",
"indexmap", "indexmap 2.7.1",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
"tracing", "tracing",
] ]
[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.15.2" version = "0.15.2"
@ -431,6 +521,12 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
[[package]]
name = "hex"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]] [[package]]
name = "http" name = "http"
version = "0.2.12" version = "0.2.12"
@ -500,6 +596,29 @@ dependencies = [
"want", "want",
] ]
[[package]]
name = "iana-time-zone"
version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
"windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "icu_collections" name = "icu_collections"
version = "1.5.0" version = "1.5.0"
@ -618,6 +737,12 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]] [[package]]
name = "idna" name = "idna"
version = "1.0.3" version = "1.0.3"
@ -639,6 +764,17 @@ dependencies = [
"icu_properties", "icu_properties",
] ]
[[package]]
name = "indexmap"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
"hashbrown 0.12.3",
"serde",
]
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.7.1" version = "2.7.1"
@ -646,7 +782,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown", "hashbrown 0.15.2",
"serde", "serde",
] ]
@ -673,6 +809,16 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "js-sys"
version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.5.0" version = "1.5.0"
@ -804,6 +950,15 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]] [[package]]
name = "num_cpus" name = "num_cpus"
version = "1.16.0" version = "1.16.0"
@ -1093,7 +1248,7 @@ dependencies = [
"either", "either",
"figment", "figment",
"futures", "futures",
"indexmap", "indexmap 2.7.1",
"log", "log",
"memchr", "memchr",
"multer", "multer",
@ -1126,7 +1281,7 @@ checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46"
dependencies = [ dependencies = [
"devise", "devise",
"glob", "glob",
"indexmap", "indexmap 2.7.1",
"proc-macro2", "proc-macro2",
"quote", "quote",
"rocket_http", "rocket_http",
@ -1146,7 +1301,7 @@ dependencies = [
"futures", "futures",
"http 0.2.12", "http 0.2.12",
"hyper", "hyper",
"indexmap", "indexmap 2.7.1",
"log", "log",
"memchr", "memchr",
"pear", "pear",
@ -1247,6 +1402,36 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "serde_with"
version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa"
dependencies = [
"base64",
"chrono",
"hex",
"indexmap 1.9.3",
"indexmap 2.7.1",
"serde",
"serde_derive",
"serde_json",
"serde_with_macros",
"time",
]
[[package]]
name = "serde_with_macros"
version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e"
dependencies = [
"darling",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "sharded-slab" name = "sharded-slab"
version = "0.1.7" version = "0.1.7"
@ -1326,6 +1511,12 @@ dependencies = [
"loom", "loom",
] ]
[[package]]
name = "strsim"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.98" version = "2.0.98"
@ -1492,7 +1683,7 @@ version = "0.22.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee"
dependencies = [ dependencies = [
"indexmap", "indexmap 2.7.1",
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
@ -1686,6 +1877,64 @@ dependencies = [
"wit-bindgen-rt", "wit-bindgen-rt",
] ]
[[package]]
name = "wasm-bindgen"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
dependencies = [
"unicode-ident",
]
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.3.9" version = "0.3.9"
@ -1717,6 +1966,15 @@ dependencies = [
"windows-targets 0.48.5", "windows-targets 0.48.5",
] ]
[[package]]
name = "windows-core"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets 0.52.6",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.52.0" version = "0.52.0"

View File

@ -4,8 +4,10 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
serde = "1.0.217"
serde_json = "1.0" serde_json = "1.0"
rand = "0.9.0" rand = "0.9.0"
serde_with = "3.12.0"
[dependencies.url] [dependencies.url]
version = "2.5.4" version = "2.5.4"

View File

@ -1,6 +1,6 @@
[ [
{ {
"scryfall_id": "{3df927c0-9aa9-450b-ab2a-ae12c5489d57}", "id": "{3df927c0-9aa9-450b-ab2a-ae12c5489d57}",
"name": "Supplant Form", "name": "Supplant Form",
"png": "https://cards.scryfall.io/png/front/3/d/3df927c0-9aa9-450b-ab2a-ae12c5489d57.png?1562824437", "png": "https://cards.scryfall.io/png/front/3/d/3df927c0-9aa9-450b-ab2a-ae12c5489d57.png?1562824437",
"jpg": "https://cards.scryfall.io/small/front/3/d/3df927c0-9aa9-450b-ab2a-ae12c5489d57.jpg?1562824437", "jpg": "https://cards.scryfall.io/small/front/3/d/3df927c0-9aa9-450b-ab2a-ae12c5489d57.jpg?1562824437",
@ -8,7 +8,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{30202613-d05f-4f47-af97-d0b75ccac293}", "id": "{30202613-d05f-4f47-af97-d0b75ccac293}",
"name": "Memory Lapse", "name": "Memory Lapse",
"png": "https://cards.scryfall.io/png/front/3/0/30202613-d05f-4f47-af97-d0b75ccac293.png?1634131658", "png": "https://cards.scryfall.io/png/front/3/0/30202613-d05f-4f47-af97-d0b75ccac293.png?1634131658",
"jpg": "https://cards.scryfall.io/small/front/3/0/30202613-d05f-4f47-af97-d0b75ccac293.jpg?1634131658", "jpg": "https://cards.scryfall.io/small/front/3/0/30202613-d05f-4f47-af97-d0b75ccac293.jpg?1634131658",
@ -16,7 +16,7 @@
"count": 8 "count": 8
}, },
{ {
"scryfall_id": "{ad88e5ee-0eee-47af-a7b4-9bac044e1c8c}", "id": "{ad88e5ee-0eee-47af-a7b4-9bac044e1c8c}",
"name": "Accumulated Knowledge", "name": "Accumulated Knowledge",
"png": "https://cards.scryfall.io/png/front/a/d/ad88e5ee-0eee-47af-a7b4-9bac044e1c8c.png?1562439718", "png": "https://cards.scryfall.io/png/front/a/d/ad88e5ee-0eee-47af-a7b4-9bac044e1c8c.png?1562439718",
"jpg": "https://cards.scryfall.io/small/front/a/d/ad88e5ee-0eee-47af-a7b4-9bac044e1c8c.jpg?1562439718", "jpg": "https://cards.scryfall.io/small/front/a/d/ad88e5ee-0eee-47af-a7b4-9bac044e1c8c.jpg?1562439718",
@ -24,7 +24,7 @@
"count": 4 "count": 4
}, },
{ {
"scryfall_id": "{806e5536-103b-4d6c-83b4-8659a55b25b5}", "id": "{806e5536-103b-4d6c-83b4-8659a55b25b5}",
"name": "Mystic Retrieval", "name": "Mystic Retrieval",
"png": "https://cards.scryfall.io/png/front/8/0/806e5536-103b-4d6c-83b4-8659a55b25b5.png?1736467785", "png": "https://cards.scryfall.io/png/front/8/0/806e5536-103b-4d6c-83b4-8659a55b25b5.png?1736467785",
"jpg": "https://cards.scryfall.io/small/front/8/0/806e5536-103b-4d6c-83b4-8659a55b25b5.jpg?1736467785", "jpg": "https://cards.scryfall.io/small/front/8/0/806e5536-103b-4d6c-83b4-8659a55b25b5.jpg?1736467785",
@ -32,7 +32,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{36fa9a0b-b0c9-43ea-ba11-99d7982f974e}", "id": "{36fa9a0b-b0c9-43ea-ba11-99d7982f974e}",
"name": "Mystical Tutor", "name": "Mystical Tutor",
"png": "https://cards.scryfall.io/png/front/3/6/36fa9a0b-b0c9-43ea-ba11-99d7982f974e.png?1675199375", "png": "https://cards.scryfall.io/png/front/3/6/36fa9a0b-b0c9-43ea-ba11-99d7982f974e.png?1675199375",
"jpg": "https://cards.scryfall.io/small/front/3/6/36fa9a0b-b0c9-43ea-ba11-99d7982f974e.jpg?1675199375", "jpg": "https://cards.scryfall.io/small/front/3/6/36fa9a0b-b0c9-43ea-ba11-99d7982f974e.jpg?1675199375",
@ -40,7 +40,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{21fe2f1b-bfd1-4682-ae23-069300de3791}", "id": "{21fe2f1b-bfd1-4682-ae23-069300de3791}",
"name": "Svyelunite Temple", "name": "Svyelunite Temple",
"png": "https://cards.scryfall.io/png/front/2/1/21fe2f1b-bfd1-4682-ae23-069300de3791.png?1562867851", "png": "https://cards.scryfall.io/png/front/2/1/21fe2f1b-bfd1-4682-ae23-069300de3791.png?1562867851",
"jpg": "https://cards.scryfall.io/small/front/2/1/21fe2f1b-bfd1-4682-ae23-069300de3791.jpg?1562867851", "jpg": "https://cards.scryfall.io/small/front/2/1/21fe2f1b-bfd1-4682-ae23-069300de3791.jpg?1562867851",
@ -48,7 +48,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{8beb987c-1b67-4a4e-ae71-58547afad2a0}", "id": "{8beb987c-1b67-4a4e-ae71-58547afad2a0}",
"name": "Brainstorm", "name": "Brainstorm",
"png": "https://cards.scryfall.io/png/front/8/b/8beb987c-1b67-4a4e-ae71-58547afad2a0.png?1726284649", "png": "https://cards.scryfall.io/png/front/8/b/8beb987c-1b67-4a4e-ae71-58547afad2a0.png?1726284649",
"jpg": "https://cards.scryfall.io/small/front/8/b/8beb987c-1b67-4a4e-ae71-58547afad2a0.jpg?1726284649", "jpg": "https://cards.scryfall.io/small/front/8/b/8beb987c-1b67-4a4e-ae71-58547afad2a0.jpg?1726284649",
@ -56,7 +56,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{c548d140-3d81-4b33-9985-87703d316a83}", "id": "{c548d140-3d81-4b33-9985-87703d316a83}",
"name": "Dance of the Skywise", "name": "Dance of the Skywise",
"png": "https://cards.scryfall.io/png/front/c/5/c548d140-3d81-4b33-9985-87703d316a83.png?1562792779", "png": "https://cards.scryfall.io/png/front/c/5/c548d140-3d81-4b33-9985-87703d316a83.png?1562792779",
"jpg": "https://cards.scryfall.io/small/front/c/5/c548d140-3d81-4b33-9985-87703d316a83.jpg?1562792779", "jpg": "https://cards.scryfall.io/small/front/c/5/c548d140-3d81-4b33-9985-87703d316a83.jpg?1562792779",
@ -64,7 +64,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{7132999f-6e2d-4689-8131-7b12076a348d}", "id": "{7132999f-6e2d-4689-8131-7b12076a348d}",
"name": "Island", "name": "Island",
"png": "https://cards.scryfall.io/png/front/7/1/7132999f-6e2d-4689-8131-7b12076a348d.png?1655495395", "png": "https://cards.scryfall.io/png/front/7/1/7132999f-6e2d-4689-8131-7b12076a348d.png?1655495395",
"jpg": "https://cards.scryfall.io/small/front/7/1/7132999f-6e2d-4689-8131-7b12076a348d.jpg?1655495395", "jpg": "https://cards.scryfall.io/small/front/7/1/7132999f-6e2d-4689-8131-7b12076a348d.jpg?1655495395",
@ -72,7 +72,7 @@
"count": 18 "count": 18
}, },
{ {
"scryfall_id": "{7ca8a427-5c20-4650-bbb5-9895e4f2c009}", "id": "{7ca8a427-5c20-4650-bbb5-9895e4f2c009}",
"name": "Ray of Command", "name": "Ray of Command",
"png": "https://cards.scryfall.io/png/front/7/c/7ca8a427-5c20-4650-bbb5-9895e4f2c009.png?1592754536", "png": "https://cards.scryfall.io/png/front/7/c/7ca8a427-5c20-4650-bbb5-9895e4f2c009.png?1592754536",
"jpg": "https://cards.scryfall.io/small/front/7/c/7ca8a427-5c20-4650-bbb5-9895e4f2c009.jpg?1592754536", "jpg": "https://cards.scryfall.io/small/front/7/c/7ca8a427-5c20-4650-bbb5-9895e4f2c009.jpg?1592754536",
@ -80,7 +80,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{2dc0bafd-debc-4b62-9fe0-56b4aad02484}", "id": "{2dc0bafd-debc-4b62-9fe0-56b4aad02484}",
"name": "Unsubstantiate", "name": "Unsubstantiate",
"png": "https://cards.scryfall.io/png/front/2/d/2dc0bafd-debc-4b62-9fe0-56b4aad02484.png?1594735888", "png": "https://cards.scryfall.io/png/front/2/d/2dc0bafd-debc-4b62-9fe0-56b4aad02484.png?1594735888",
"jpg": "https://cards.scryfall.io/small/front/2/d/2dc0bafd-debc-4b62-9fe0-56b4aad02484.jpg?1594735888", "jpg": "https://cards.scryfall.io/small/front/2/d/2dc0bafd-debc-4b62-9fe0-56b4aad02484.jpg?1594735888",
@ -88,7 +88,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{ac2e32d0-f172-4934-9d73-1bc2ab86586e}", "id": "{ac2e32d0-f172-4934-9d73-1bc2ab86586e}",
"name": "Dandân", "name": "Dandân",
"png": "https://cards.scryfall.io/png/front/a/c/ac2e32d0-f172-4934-9d73-1bc2ab86586e.png?1562781784", "png": "https://cards.scryfall.io/png/front/a/c/ac2e32d0-f172-4934-9d73-1bc2ab86586e.png?1562781784",
"jpg": "https://cards.scryfall.io/small/front/a/c/ac2e32d0-f172-4934-9d73-1bc2ab86586e.jpg?1562781784", "jpg": "https://cards.scryfall.io/small/front/a/c/ac2e32d0-f172-4934-9d73-1bc2ab86586e.jpg?1562781784",
@ -96,7 +96,7 @@
"count": 10 "count": 10
}, },
{ {
"scryfall_id": "{692a5bfa-9a50-4610-acd7-19fc0a53f798}", "id": "{692a5bfa-9a50-4610-acd7-19fc0a53f798}",
"name": "Mind Bend", "name": "Mind Bend",
"png": "https://cards.scryfall.io/png/front/6/9/692a5bfa-9a50-4610-acd7-19fc0a53f798.png?1562549129", "png": "https://cards.scryfall.io/png/front/6/9/692a5bfa-9a50-4610-acd7-19fc0a53f798.png?1562549129",
"jpg": "https://cards.scryfall.io/small/front/6/9/692a5bfa-9a50-4610-acd7-19fc0a53f798.jpg?1562549129", "jpg": "https://cards.scryfall.io/small/front/6/9/692a5bfa-9a50-4610-acd7-19fc0a53f798.jpg?1562549129",
@ -104,7 +104,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{a340af37-c0a7-4f26-974b-95397b5c32f7}", "id": "{a340af37-c0a7-4f26-974b-95397b5c32f7}",
"name": "Remote Isle", "name": "Remote Isle",
"png": "https://cards.scryfall.io/png/front/a/3/a340af37-c0a7-4f26-974b-95397b5c32f7.png?1709139228", "png": "https://cards.scryfall.io/png/front/a/3/a340af37-c0a7-4f26-974b-95397b5c32f7.png?1709139228",
"jpg": "https://cards.scryfall.io/small/front/a/3/a340af37-c0a7-4f26-974b-95397b5c32f7.jpg?1709139228", "jpg": "https://cards.scryfall.io/small/front/a/3/a340af37-c0a7-4f26-974b-95397b5c32f7.jpg?1709139228",
@ -112,7 +112,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{8eafb2bb-58bf-4c6b-ae8f-91bcea12c7d2}", "id": "{8eafb2bb-58bf-4c6b-ae8f-91bcea12c7d2}",
"name": "Insidious Will", "name": "Insidious Will",
"png": "https://cards.scryfall.io/png/front/8/e/8eafb2bb-58bf-4c6b-ae8f-91bcea12c7d2.png?1576381260", "png": "https://cards.scryfall.io/png/front/8/e/8eafb2bb-58bf-4c6b-ae8f-91bcea12c7d2.png?1576381260",
"jpg": "https://cards.scryfall.io/small/front/8/e/8eafb2bb-58bf-4c6b-ae8f-91bcea12c7d2.jpg?1576381260", "jpg": "https://cards.scryfall.io/small/front/8/e/8eafb2bb-58bf-4c6b-ae8f-91bcea12c7d2.jpg?1576381260",
@ -120,7 +120,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{bfac9395-7ca5-48dd-ab83-7c26ada12f61}", "id": "{bfac9395-7ca5-48dd-ab83-7c26ada12f61}",
"name": "Izzet Boilerworks", "name": "Izzet Boilerworks",
"png": "https://cards.scryfall.io/png/front/b/f/bfac9395-7ca5-48dd-ab83-7c26ada12f61.png?1712355049", "png": "https://cards.scryfall.io/png/front/b/f/bfac9395-7ca5-48dd-ab83-7c26ada12f61.png?1712355049",
"jpg": "https://cards.scryfall.io/small/front/b/f/bfac9395-7ca5-48dd-ab83-7c26ada12f61.jpg?1712355049", "jpg": "https://cards.scryfall.io/small/front/b/f/bfac9395-7ca5-48dd-ab83-7c26ada12f61.jpg?1712355049",
@ -128,7 +128,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{349ac7e6-af38-4dc3-abfe-369564c75630}", "id": "{349ac7e6-af38-4dc3-abfe-369564c75630}",
"name": "Predict", "name": "Predict",
"png": "https://cards.scryfall.io/png/front/3/4/349ac7e6-af38-4dc3-abfe-369564c75630.png?1592710621", "png": "https://cards.scryfall.io/png/front/3/4/349ac7e6-af38-4dc3-abfe-369564c75630.png?1592710621",
"jpg": "https://cards.scryfall.io/small/front/3/4/349ac7e6-af38-4dc3-abfe-369564c75630.jpg?1592710621", "jpg": "https://cards.scryfall.io/small/front/3/4/349ac7e6-af38-4dc3-abfe-369564c75630.jpg?1592710621",
@ -136,7 +136,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{f9ed455f-95cd-48ca-8b0d-4db259347bb6}", "id": "{f9ed455f-95cd-48ca-8b0d-4db259347bb6}",
"name": "Diminishing Returns", "name": "Diminishing Returns",
"png": "https://cards.scryfall.io/png/front/f/9/f9ed455f-95cd-48ca-8b0d-4db259347bb6.png?1580013930", "png": "https://cards.scryfall.io/png/front/f/9/f9ed455f-95cd-48ca-8b0d-4db259347bb6.png?1580013930",
"jpg": "https://cards.scryfall.io/small/front/f/9/f9ed455f-95cd-48ca-8b0d-4db259347bb6.jpg?1580013930", "jpg": "https://cards.scryfall.io/small/front/f/9/f9ed455f-95cd-48ca-8b0d-4db259347bb6.jpg?1580013930",
@ -144,7 +144,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{78b384d3-3adf-493a-8b89-bfe68fd1c3e2}", "id": "{78b384d3-3adf-493a-8b89-bfe68fd1c3e2}",
"name": "Vision Charm", "name": "Vision Charm",
"png": "https://cards.scryfall.io/png/front/7/8/78b384d3-3adf-493a-8b89-bfe68fd1c3e2.png?1562277700", "png": "https://cards.scryfall.io/png/front/7/8/78b384d3-3adf-493a-8b89-bfe68fd1c3e2.png?1562277700",
"jpg": "https://cards.scryfall.io/small/front/7/8/78b384d3-3adf-493a-8b89-bfe68fd1c3e2.jpg?1562277700", "jpg": "https://cards.scryfall.io/small/front/7/8/78b384d3-3adf-493a-8b89-bfe68fd1c3e2.jpg?1562277700",
@ -152,7 +152,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{8798a4f1-34bb-449d-a8cc-faf8bda8e0ab}", "id": "{8798a4f1-34bb-449d-a8cc-faf8bda8e0ab}",
"name": "Crystal Spray", "name": "Crystal Spray",
"png": "https://cards.scryfall.io/png/front/8/7/8798a4f1-34bb-449d-a8cc-faf8bda8e0ab.png?1562922403", "png": "https://cards.scryfall.io/png/front/8/7/8798a4f1-34bb-449d-a8cc-faf8bda8e0ab.png?1562922403",
"jpg": "https://cards.scryfall.io/small/front/8/7/8798a4f1-34bb-449d-a8cc-faf8bda8e0ab.jpg?1562922403", "jpg": "https://cards.scryfall.io/small/front/8/7/8798a4f1-34bb-449d-a8cc-faf8bda8e0ab.jpg?1562922403",
@ -160,7 +160,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{63eb18e0-c723-4de4-8498-c5362c75b2b4}", "id": "{63eb18e0-c723-4de4-8498-c5362c75b2b4}",
"name": "Halimar Depths", "name": "Halimar Depths",
"png": "https://cards.scryfall.io/png/front/6/3/63eb18e0-c723-4de4-8498-c5362c75b2b4.png?1726285434", "png": "https://cards.scryfall.io/png/front/6/3/63eb18e0-c723-4de4-8498-c5362c75b2b4.png?1726285434",
"jpg": "https://cards.scryfall.io/small/front/6/3/63eb18e0-c723-4de4-8498-c5362c75b2b4.jpg?1726285434", "jpg": "https://cards.scryfall.io/small/front/6/3/63eb18e0-c723-4de4-8498-c5362c75b2b4.jpg?1726285434",
@ -168,7 +168,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{a0f0c20c-184e-4d27-ae8b-933abb6fee0c}", "id": "{a0f0c20c-184e-4d27-ae8b-933abb6fee0c}",
"name": "Metamorphose", "name": "Metamorphose",
"png": "https://cards.scryfall.io/png/front/a/0/a0f0c20c-184e-4d27-ae8b-933abb6fee0c.png?1562533013", "png": "https://cards.scryfall.io/png/front/a/0/a0f0c20c-184e-4d27-ae8b-933abb6fee0c.png?1562533013",
"jpg": "https://cards.scryfall.io/small/front/a/0/a0f0c20c-184e-4d27-ae8b-933abb6fee0c.jpg?1562533013", "jpg": "https://cards.scryfall.io/small/front/a/0/a0f0c20c-184e-4d27-ae8b-933abb6fee0c.jpg?1562533013",
@ -176,7 +176,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{67652446-6d12-4e2a-bb51-ba685f2e79d1}", "id": "{67652446-6d12-4e2a-bb51-ba685f2e79d1}",
"name": "Mystic Sanctuary", "name": "Mystic Sanctuary",
"png": "https://cards.scryfall.io/png/front/6/7/67652446-6d12-4e2a-bb51-ba685f2e79d1.png?1706241201", "png": "https://cards.scryfall.io/png/front/6/7/67652446-6d12-4e2a-bb51-ba685f2e79d1.png?1706241201",
"jpg": "https://cards.scryfall.io/small/front/6/7/67652446-6d12-4e2a-bb51-ba685f2e79d1.jpg?1706241201", "jpg": "https://cards.scryfall.io/small/front/6/7/67652446-6d12-4e2a-bb51-ba685f2e79d1.jpg?1706241201",
@ -184,7 +184,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{5833825f-aeb0-41bb-92a4-13e869765295}", "id": "{5833825f-aeb0-41bb-92a4-13e869765295}",
"name": "Lonely Sandbar", "name": "Lonely Sandbar",
"png": "https://cards.scryfall.io/png/front/5/8/5833825f-aeb0-41bb-92a4-13e869765295.png?1708054955", "png": "https://cards.scryfall.io/png/front/5/8/5833825f-aeb0-41bb-92a4-13e869765295.png?1708054955",
"jpg": "https://cards.scryfall.io/small/front/5/8/5833825f-aeb0-41bb-92a4-13e869765295.jpg?1708054955", "jpg": "https://cards.scryfall.io/small/front/5/8/5833825f-aeb0-41bb-92a4-13e869765295.jpg?1708054955",
@ -192,7 +192,7 @@
"count": 2 "count": 2
}, },
{ {
"scryfall_id": "{224e8255-7bc6-44a2-86af-14f8446f4f77}", "id": "{224e8255-7bc6-44a2-86af-14f8446f4f77}",
"name": "Temple of Epiphany", "name": "Temple of Epiphany",
"png": "https://cards.scryfall.io/png/front/2/2/224e8255-7bc6-44a2-86af-14f8446f4f77.png?1730491248", "png": "https://cards.scryfall.io/png/front/2/2/224e8255-7bc6-44a2-86af-14f8446f4f77.png?1730491248",
"jpg": "https://cards.scryfall.io/small/front/2/2/224e8255-7bc6-44a2-86af-14f8446f4f77.jpg?1730491248", "jpg": "https://cards.scryfall.io/small/front/2/2/224e8255-7bc6-44a2-86af-14f8446f4f77.jpg?1730491248",

View File

@ -1,14 +1,16 @@
use rand::seq::SliceRandom; use rand::seq::SliceRandom;
use rand::{random_bool, rng}; use rand::{random_bool, rng};
use rocket::serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use std::collections::{HashMap, VecDeque};
use url::Url; use url::Url;
use uuid::Uuid; use uuid::Uuid;
#[derive(Deserialize, Serialize, Clone)] #[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(crate = "rocket::serde")] //#[serde(crate = "rocket::serde")]
struct CardInfo { struct CardInfo {
#[serde(with = "uuid::serde::braced")] #[serde(with = "uuid::serde::braced")]
scryfall_id: Uuid, id: Uuid,
name: String, name: String,
png: Url, png: Url,
jpg: Url, jpg: Url,
@ -16,65 +18,79 @@ struct CardInfo {
count: usize, count: usize,
} }
#[derive(Deserialize, Serialize, Clone, Copy)] #[derive(Deserialize, Serialize, Clone, Copy, Debug)]
#[serde(crate = "rocket::serde")] //#[serde(crate = "rocket::serde")]
pub enum Player { pub enum Player {
A, A,
B, B,
} }
#[derive(Deserialize, Serialize, Clone)] #[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(crate = "rocket::serde")] #[serde(deny_unknown_fields)]
//#[serde(crate = "rocket::serde")]
struct InPlay { struct InPlay {
#[serde(with = "uuid::serde::braced")]
id: Uuid, id: Uuid,
position_x: u16, position_x: u16,
position_y: u16, position_y: u16,
owner: Player, owner: Player,
} tapped: bool,
#[serde(with = "uuid::serde::braced")]
#[derive(Serialize, Clone)] play_id: Uuid,
#[serde(crate = "rocket::serde")]
struct Hand {
cards: Vec<Uuid>,
owner: Player,
//locked: bool, // prevents untapping //locked: bool, // prevents untapping
} }
#[derive(Serialize, Clone)] #[derive(Serialize, Clone, Debug)]
#[serde(crate = "rocket::serde")] //#[serde(crate = "rocket::serde")]
struct Hand {
cards: Vec<Uuid>,
owner: Player,
}
#[derive(Serialize, Clone, Debug)]
//#[serde(crate = "rocket::serde")]
enum Event { enum Event {
Shuffle(Player), Shuffle(Player),
Draw(Player, usize), Draw(Player, usize),
Pass(Player, Player), Pass(Player, Player),
ChangeLifeTotal(Player, i32, i32), ChangeLifeTotal(Player, i32, i32),
FadeFromHand(Player),
PlayFromHand(Player),
Bounce(Player),
Tap(Uuid),
} }
#[derive(Serialize, Clone)] #[derive(Serialize, Clone, Debug)]
#[serde(crate = "rocket::serde")] //#[serde(crate = "rocket::serde")]
struct CountedEvent { struct CountedEvent {
id: usize, id: usize,
event: Event, event: Event,
} }
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct GameState { pub struct GameState {
deck: Vec<Uuid>, deck: VecDeque<Uuid>,
discard_pile: Vec<Uuid>, discard_pile: Vec<Uuid>,
shadow_realm: Vec<Uuid>, shadow_realm: Vec<Uuid>,
play: Vec<InPlay>, play: HashMap<Uuid, InPlay>,
hands: Vec<Hand>, hands: Vec<Hand>,
life_totals: Vec<i32>, life_totals: Vec<i32>,
turn_player: Player, turn_player: Player,
//card_map: HashMap<Uuid, CardInfo>,
events: Vec<CountedEvent>, events: Vec<CountedEvent>,
} }
#[serde_as]
#[derive(Serialize)] #[derive(Serialize)]
#[serde(crate = "rocket::serde")] #[serde(deny_unknown_fields)]
//#[serde(crate = "rocket::serde")]
pub struct OnePlayerGameState { pub struct OnePlayerGameState {
discard_pile: Vec<Uuid>, discard_pile: Vec<Uuid>,
shadow_realm: Vec<Uuid>, shadow_realm: Vec<Uuid>,
play: Vec<InPlay>, // I hate my life. Uuid seems to be causing issues and for some
// reason serde just keeps giving an empty object instead of
// serializing properly.
#[serde_as(as = "Vec<(_, _)>")]
play: HashMap<String, InPlay>,
hand: Vec<Uuid>, hand: Vec<Uuid>,
life_totals: Vec<i32>, life_totals: Vec<i32>,
turn_player: Player, turn_player: Player,
@ -87,7 +103,12 @@ impl GameState {
OnePlayerGameState { OnePlayerGameState {
discard_pile: self.discard_pile.clone(), discard_pile: self.discard_pile.clone(),
shadow_realm: self.shadow_realm.clone(), shadow_realm: self.shadow_realm.clone(),
play: self.play.clone(), play: self
.play
.clone()
.into_iter()
.map(|(key, value)| (format!("{}", key.hyphenated()), value))
.collect(),
hand: match player { hand: match player {
Player::A => self.hands[0].cards.clone(), Player::A => self.hands[0].cards.clone(),
_ => self.hands[1].cards.clone(), _ => self.hands[1].cards.clone(),
@ -109,22 +130,22 @@ pub fn new() -> GameState {
let parsed_cards: Vec<CardInfo> = serde_json::from_str(CARD_DATA_JSON).unwrap(); let parsed_cards: Vec<CardInfo> = serde_json::from_str(CARD_DATA_JSON).unwrap();
/*let card_map = parsed_cards /*let card_map = parsed_cards
.into_iter() .into_iter()
.map(|card| (card.scryfall_id, card)) .map(|card| (card.id, card))
.collect::<HashMap<_, _>>();*/ .collect::<HashMap<_, _>>();*/
let starting_player = match random_bool(0.5) { let starting_player = match random_bool(0.5) {
true => Player::A, true => Player::A,
_ => Player::B, _ => Player::B,
}; };
let mut deck: Vec<Uuid> = parsed_cards let mut deck: VecDeque<Uuid> = parsed_cards
.iter() .iter()
.flat_map(move |card| vec![card.scryfall_id.clone(); card.count]) .flat_map(move |card| vec![card.id.clone(); card.count])
.collect(); .collect::<VecDeque<Uuid>>();
deck.shuffle(&mut rng()); deck.make_contiguous().shuffle(&mut rng());
GameState { GameState {
deck, deck,
discard_pile: vec![], discard_pile: vec![],
shadow_realm: vec![], shadow_realm: vec![],
play: vec![], play: HashMap::new(),
hands: vec![ hands: vec![
Hand { Hand {
cards: vec![], cards: vec![],
@ -137,7 +158,6 @@ pub fn new() -> GameState {
], ],
life_totals: vec![20; 2], life_totals: vec![20; 2],
turn_player: starting_player, turn_player: starting_player,
//card_map,
events: vec![], events: vec![],
} }
} }
@ -155,7 +175,7 @@ pub fn draw(game_state: &mut GameState, count: usize, player: Player) {
game_state game_state
.deck .deck
.split_off(game_state.deck.len() - count) .split_off(game_state.deck.len() - count)
.as_mut_slice(), .make_contiguous(),
); );
} }
@ -164,7 +184,7 @@ pub fn shuffle(game_state: &mut GameState, player: Player) {
id: game_state.events.len(), id: game_state.events.len(),
event: Event::Shuffle(player), event: Event::Shuffle(player),
}); });
game_state.deck.shuffle(&mut rng()); game_state.deck.make_contiguous().shuffle(&mut rng());
} }
pub fn get_game_one_player(game_state: &GameState, player: Player) -> String { pub fn get_game_one_player(game_state: &GameState, player: Player) -> String {
@ -179,7 +199,7 @@ pub fn pass(game_state: &mut GameState) {
let current_player = &game_state.turn_player; let current_player = &game_state.turn_player;
let new_player = match current_player { let new_player = match current_player {
Player::A => Player::B, Player::A => Player::B,
_ => Player::A, Player::B => Player::A,
}; };
game_state.events.push(CountedEvent { game_state.events.push(CountedEvent {
id: game_state.events.len(), id: game_state.events.len(),
@ -191,9 +211,8 @@ pub fn pass(game_state: &mut GameState) {
pub fn change_life(game_state: &mut GameState, diff: i32, player: Player) { pub fn change_life(game_state: &mut GameState, diff: i32, player: Player) {
let mut player_life = match player { let mut player_life = match player {
Player::A => game_state.life_totals[0].clone(), Player::A => game_state.life_totals[0].clone(),
_ => game_state.life_totals[1].clone(), Player::B => game_state.life_totals[1].clone(),
}; };
//let diffed_player = player_life.clone() + diff;
game_state.events.push(CountedEvent { game_state.events.push(CountedEvent {
id: game_state.events.len(), id: game_state.events.len(),
event: Event::ChangeLifeTotal(player, player_life.clone(), player_life.clone() + diff), event: Event::ChangeLifeTotal(player, player_life.clone(), player_life.clone() + diff),
@ -201,6 +220,69 @@ pub fn change_life(game_state: &mut GameState, diff: i32, player: Player) {
player_life += diff; player_life += diff;
match player { match player {
Player::A => game_state.life_totals[0] = player_life, Player::A => game_state.life_totals[0] = player_life,
_ => game_state.life_totals[1] = player_life, Player::B => game_state.life_totals[1] = player_life,
}; };
} }
pub fn fade_from_hand(game_state: &mut GameState, hand_index: usize, player: Player, bottom: bool) {
let player_hand = match player {
Player::A => &mut game_state.hands[0],
Player::B => &mut game_state.hands[1],
};
game_state.events.push(CountedEvent {
id: game_state.events.len(),
event: Event::FadeFromHand(player.clone()),
});
let card = player_hand.cards.remove(hand_index);
if bottom {
game_state.deck.push_front(card);
} else {
game_state.deck.push_back(card);
}
}
pub fn play_from_hand(game_state: &mut GameState, hand_index: usize, player: Player) {
let player_hand = match player {
Player::A => &mut game_state.hands[0],
Player::B => &mut game_state.hands[1],
};
game_state.events.push(CountedEvent {
id: game_state.events.len(),
event: Event::PlayFromHand(player.clone()),
});
let card = player_hand.cards.remove(hand_index);
let play_uuid = Uuid::new_v4();
game_state.play.insert(
play_uuid,
InPlay {
id: card,
position_x: 5,
position_y: 50,
owner: player,
tapped: false,
play_id: play_uuid,
},
);
}
pub fn bounce(game_state: &mut GameState, play_id: Uuid) {
let played_card = game_state.play.remove(&play_id).unwrap();
let player_hand = match played_card.owner {
Player::A => &mut game_state.hands[0],
Player::B => &mut game_state.hands[1],
};
game_state.events.push(CountedEvent {
id: game_state.events.len(),
event: Event::Bounce(played_card.owner),
});
player_hand.cards.push(played_card.id);
}
pub fn tap(game_state: &mut GameState, play_id: Uuid) {
game_state.events.push(CountedEvent {
id: game_state.events.len(),
event: Event::Tap(play_id.clone()),
});
let played_card = game_state.play.get_mut(&play_id).unwrap();
played_card.tapped = !played_card.tapped;
}

View File

@ -8,12 +8,12 @@ use rocket::response::status::BadRequest;
use rocket::State; use rocket::State;
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use uuid::Uuid; use uuid::{uuid, Uuid};
#[get("/")] #[get("/")]
fn index(player_uuids: &State<PlayerUuids>) -> String { fn index(player_uuids: &State<PlayerUuids>) -> String {
format!( format!(
"a: localhost:8000/{}/\nb: localhost:8000/{}/", "localhost:8000/{}/\nlocalhost:8000/{}/",
player_uuids.a, player_uuids.b player_uuids.a, player_uuids.b
) )
} }
@ -57,6 +57,58 @@ fn pass(
Ok(format!("{}", game::get_events(&game_state))) Ok(format!("{}", game::get_events(&game_state)))
} }
#[get("/<uuid>/bounce/<play_id>")]
fn bounce(
uuid: Uuid,
play_id: Uuid,
game_state_arc: &State<ArcMutexGameState>,
player_uuids: &State<PlayerUuids>,
) -> Result<String, BadRequest<String>> {
match player_uuids.map.get(&uuid) {
Some(_) => (),
None => return Err(BadRequest(format!("Invalid player {}.", uuid))),
};
let game_state_mutex = Arc::clone(&game_state_arc.state);
let mut game_state = game_state_mutex.lock().unwrap();
game::bounce(&mut game_state, play_id);
Ok(format!("{}", game::get_events(&game_state)))
}
#[get("/<uuid>/tap/<play_id>")]
fn tap(
uuid: Uuid,
play_id: Uuid,
game_state_arc: &State<ArcMutexGameState>,
player_uuids: &State<PlayerUuids>,
) -> Result<String, BadRequest<String>> {
match player_uuids.map.get(&uuid) {
Some(_) => (),
None => return Err(BadRequest(format!("Invalid player {}.", uuid))),
};
let game_state_mutex = Arc::clone(&game_state_arc.state);
let mut game_state = game_state_mutex.lock().unwrap();
game::tap(&mut game_state, play_id);
Ok(format!("{}", game::get_events(&game_state)))
}
#[get("/<uuid>/play/<index>")]
fn play(
uuid: Uuid,
index: usize,
game_state_arc: &State<ArcMutexGameState>,
player_uuids: &State<PlayerUuids>,
) -> Result<String, BadRequest<String>> {
let player = match player_uuids.map.get(&uuid) {
Some(player) => player,
None => return Err(BadRequest(format!("Invalid player {}.", uuid))),
};
let game_state_mutex = Arc::clone(&game_state_arc.state);
let mut game_state = game_state_mutex.lock().unwrap();
game::play_from_hand(&mut game_state, index, player.clone());
//println!("{:#?}", game_state);
Ok(format!("{}", game::get_events(&game_state)))
}
#[get("/<uuid>/get_state")] #[get("/<uuid>/get_state")]
fn get_state( fn get_state(
uuid: Uuid, uuid: Uuid,
@ -95,6 +147,46 @@ fn draw(
)) ))
} }
#[get("/<uuid>/fade/<index>")]
fn fade(
uuid: Uuid,
index: usize,
game_state_arc: &State<ArcMutexGameState>,
player_uuids: &State<PlayerUuids>,
) -> Result<String, BadRequest<String>> {
let game_state_mutex = Arc::clone(&game_state_arc.state);
let mut game_state = game_state_mutex.lock().unwrap();
let player = match player_uuids.map.get(&uuid) {
Some(player) => player,
None => return Err(BadRequest(format!("Invalid player {}.", uuid))),
};
game::fade_from_hand(&mut game_state, index, player.clone(), false);
Ok(format!(
"{}",
game::get_game_one_player(&game_state, player.clone())
))
}
#[get("/<uuid>/fade-bottom/<index>")]
fn fade_bottom(
uuid: Uuid,
index: usize,
game_state_arc: &State<ArcMutexGameState>,
player_uuids: &State<PlayerUuids>,
) -> Result<String, BadRequest<String>> {
let game_state_mutex = Arc::clone(&game_state_arc.state);
let mut game_state = game_state_mutex.lock().unwrap();
let player = match player_uuids.map.get(&uuid) {
Some(player) => player,
None => return Err(BadRequest(format!("Invalid player {}.", uuid))),
};
game::fade_from_hand(&mut game_state, index, player.clone(), true);
Ok(format!(
"{}",
game::get_game_one_player(&game_state, player.clone())
))
}
#[get("/<uuid>/life/<count>")] #[get("/<uuid>/life/<count>")]
fn life( fn life(
uuid: Uuid, uuid: Uuid,
@ -127,15 +219,26 @@ struct PlayerUuids {
#[launch] #[launch]
fn rocket() -> _ { fn rocket() -> _ {
let game_state = game::new(); let mut game_state = game::new();
game::draw(&mut game_state, 7, Player::A);
game::draw(&mut game_state, 7, Player::B);
let game_state_arc = Arc::new(Mutex::new(game_state)); let game_state_arc = Arc::new(Mutex::new(game_state));
#[cfg(debug_assertions)]
let a_uuid: Uuid = uuid!("9b0a2a95-72a9-4e03-930e-a9583d2a2a5a");
#[cfg(not(debug_assertions))]
let a_uuid: Uuid = Uuid::new_v4(); let a_uuid: Uuid = Uuid::new_v4();
#[cfg(debug_assertions)]
let b_uuid: Uuid = uuid!("2efc0332-975d-4f71-9dd0-ffc9213098a5");
#[cfg(not(debug_assertions))]
let b_uuid: Uuid = Uuid::new_v4(); let b_uuid: Uuid = Uuid::new_v4();
let uuid_map = HashMap::from([(a_uuid, Player::A), (b_uuid, Player::B)]); let uuid_map = HashMap::from([(a_uuid, Player::A), (b_uuid, Player::B)]);
println!("A: {}", a_uuid); println!("A: {}", a_uuid);
println!("B: {}", b_uuid); println!("B: {}", b_uuid);
rocket::build() rocket::build()
.mount("/", FileServer::from(relative!("static/assets")).rank(0))
.mount( .mount(
format!("/{}", a_uuid.hyphenated()), format!("/{}", a_uuid.hyphenated()),
FileServer::from(relative!("static")), FileServer::from(relative!("static")),
@ -146,7 +249,20 @@ fn rocket() -> _ {
) )
.mount( .mount(
"/", "/",
routes![index, get_events, get_state, draw, shuffle, pass, life,], routes![
index,
get_events,
get_state,
draw,
shuffle,
pass,
life,
fade,
fade_bottom,
play,
bounce,
tap,
],
) )
.manage(ArcMutexGameState { .manage(ArcMutexGameState {
state: game_state_arc, state: game_state_arc,