#!/usr/bin/env bash
# Downloads the original Minecraft Beta 1.7.3 game files into crates/client/assets.
# Safe to run again: files that are already correct are kept, broken ones are replaced.
set -euo pipefail

ASSETS="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/crates/client/assets"
JAR_SHA1=43db9b498cb67058d2e12d394e6507722e71bb45
JAR_URLS=(
    "https://piston-data.mojang.com/v1/objects/$JAR_SHA1/client.jar"
    "https://launcher.mojang.com/v1/objects/$JAR_SHA1/client.jar"
)
MOJANG=https://resources.download.minecraft.net
BETACRAFT=https://resources.betacraft.uk

die() {
    echo "error: $*" >&2
    exit 1
}

for cmd in curl unzip sha1sum; do
    command -v "$cmd" >/dev/null || die "'$cmd' is not installed. Install it and run this script again."
done

TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT

valid() {
    [[ -f $1 ]] && [[ $(sha1sum <"$1" | cut -d' ' -f1) == "$2" ]]
}

# fetch SHA1 DEST URL... : tries each URL until one gives a file with the right hash.
fetch() {
    local sha1=$1 dest=$2 url
    shift 2
    valid "$dest" "$sha1" && return 0
    for url; do
        if curl -fsSL --retry 5 --retry-delay 2 --retry-all-errors --connect-timeout 15 --max-time 600 \
            -o "$TMP/part" "$url" && valid "$TMP/part" "$sha1"; then
            mkdir -p "$(dirname "$dest")"
            mv -f "$TMP/part" "$dest"
            return 0
        fi
    done
    return 1
}

object() {
    echo "$1/${2:0:2}/$2"
}

progress() {
    [[ -t 1 ]] && printf '\r\033[K[%d/%d] %s' "$1" "$2" "$3"
    return 0
}

main() {
    mkdir -p "$ASSETS"

    echo "Downloading the game jar..."
    fetch "$JAR_SHA1" "$TMP/client.jar" "${JAR_URLS[@]}" || die "could not download the game jar. Check your internet connection and run this script again."
    unzip -qo "$TMP/client.jar" -x '*.class' 'META-INF/*' null -d "$ASSETS"

    echo "Downloading sounds and music..."
    total=$(($(mojang_files | wc -l) + $(betacraft_files | wc -l)))
    done_count=0
    failed=()

    while read -r sha1 path <&3; do
        done_count=$((done_count + 1))
        progress "$done_count" "$total" "$path"
        fetch "$sha1" "$ASSETS/$path" "$(object "$MOJANG" "$sha1")" || failed+=("$path")
    done 3< <(mojang_files)

    # The original 2011 versions of these sounds are only on Betacraft. Mojang's newer versions are the fallback.
    while read -r sha1 fallback path <&3; do
        done_count=$((done_count + 1))
        progress "$done_count" "$total" "$path"
        if ! fetch "$sha1" "$ASSETS/$path" "$(object "$BETACRAFT" "$sha1")"; then
            if valid "$ASSETS/$path" "$fallback" || fetch "$fallback" "$ASSETS/$path" "$(object "$MOJANG" "$fallback")"; then
                [[ -t 1 ]] && echo
                echo "warning: using Mojang's newer version of $path"
            else
                failed+=("$path")
            fi
        fi
    done 3< <(betacraft_files)
    [[ -t 1 ]] && echo

    if ((${#failed[@]})); then
        printf '  %s\n' "${failed[@]}" >&2
        die "${#failed[@]} files could not be downloaded. Run this script again to retry."
    fi

    echo "Done. Start the game with: cargo run --release --bin minecraft"
}

# SHA-1 and path of every file on Mojang's server.
mojang_files() {
    cat <<'LIST'
50a59a4f56e4046701b758ddbb1c1587efa4cadf music/calm1.ogg
74da65c99aa578486efa7b69983d3533e14c0d6e music/calm2.ogg
14ae57a6bce3d4254daa8be2b098c2d99743cc3f music/calm3.ogg
df1ff11b79757432c5c3f279e5ecde7b63ceda64 newmusic/hal1.ogg
ceaaaa1d57dfdfbb0bd4da5ea39628b42897a687 newmusic/hal2.ogg
dd85fb564e96ee2dbd4754f711ae9deb08a169f9 newmusic/hal3.ogg
5e7d63e75c6e042f452bc5e151276911ef92fed8 newmusic/hal4.ogg
cc1a80b6becfc6d6489c069f053d0a8adc71c339 newmusic/nuance1.ogg
78152dc42b036e0de7616e6e669ce5a81d17f82a newmusic/nuance2.ogg
0f374764aafba398f4ba90dba05a53a9e6166138 newmusic/piano1.ogg
98a918eb2694defd19726436d4b9dca9e7dd6a65 newmusic/piano2.ogg
9528b6a76e7bac64ca1145cc682e8a8448cc04e5 newmusic/piano3.ogg
29d4dccf3353334c7aa2a49cb6fed3780a51a1ba newsound/ambient/cave/cave1.ogg
79a5b53bf22cca182ddff2a670942c49867663ec newsound/ambient/cave/cave10.ogg
e367d1dfa1ce07374e0aeaecbfb1526142a0dcc1 newsound/ambient/cave/cave11.ogg
a720e85e35be0dc3186d01cc599121b87e7ee9f7 newsound/ambient/cave/cave12.ogg
63bbe3921abd75b9f6cd1e20330360d164da169b newsound/ambient/cave/cave13.ogg
5680749048457f5772ec95a73d856ad792fa1717 newsound/ambient/cave/cave2.ogg
d4b06ccb8e331ece734f51d84a0a5fbc7164d8be newsound/ambient/cave/cave3.ogg
48540d7788ce3d9e780cb448ce5676c53dbcfd23 newsound/ambient/cave/cave4.ogg
18a992d93128bb2e2861930cff3140c6940c0127 newsound/ambient/cave/cave5.ogg
cf23204a9cca2ac7f9674168cc063cfb4dbe001f newsound/ambient/cave/cave6.ogg
c8dd60f7e7087da52a431c1dbc0f397317b374fb newsound/ambient/cave/cave7.ogg
9024de3f1dd4bc1e8f445c7c5b812f25c7e31bf6 newsound/ambient/cave/cave8.ogg
b463fa47816fe9a5dfe508093150e647403e4db6 newsound/ambient/cave/cave9.ogg
d68bae1949299ccd8297aaa423dd12e041e83773 newsound/ambient/weather/rain1.ogg
ba58e1b6c8cc814a210db268d3e59a06b7ac62be newsound/ambient/weather/rain2.ogg
4cdd8fc380e85409fd94b93abdcad077d75ec58f newsound/ambient/weather/rain3.ogg
08e555782cb2785b24e08a417a5e58aa08bd0695 newsound/ambient/weather/rain4.ogg
671ef0ae7b59014a2f637d7af6d781324ab6309f newsound/ambient/weather/thunder1.ogg
a20cbf2ddce541eaed520d7ec55665fe97428be6 newsound/ambient/weather/thunder2.ogg
9ead5c928f9122e3c2f5fc4f6ce7fb4054a2b578 newsound/ambient/weather/thunder3.ogg
f76d4efd860b599200e96401b2485cc83c1ec21e newsound/damage/fallbig1.ogg
c7c9e86e3ccc55ea2312a498aef861def771d8cf newsound/damage/fallbig2.ogg
6094b6620f2d1f2d19869a2e6498a52b1a265738 newsound/damage/fallsmall.ogg
e40695b47209c3b4bbdc3496b38959d097c6afbc newsound/damage/hurtflesh1.ogg
4e1651a728b394e054aaa24e3070e7dae849f14d newsound/damage/hurtflesh2.ogg
4b49dd9329b254e38f17166b7daa51a758a25f94 newsound/damage/hurtflesh3.ogg
8b260108a73470c16cd244325242d4780cfb7d78 newsound/fire/fire.ogg
19c729c3ceb753a824246b494bce5fa5c802f0f0 newsound/fire/ignite.ogg
17e66efe64256142c55ef6f35060f277f127bb44 newsound/liquid/lava.ogg
19a5aae31c3e0018a960b709a9f0240d8d47dda7 newsound/liquid/lavapop.ogg
22a491f266f5c3cdd6e669a9493daaf40c9c8575 newsound/liquid/splash.ogg
3483650440deb3934255e044ddabff5b01a65356 newsound/liquid/water.ogg
74e5422bd83bb2041a6f0d09644bc095c0e9e21a newsound/mob/chicken1.ogg
3660e743db2bbbcff0866d3f1e606882f1aeb6ac newsound/mob/chicken2.ogg
49874e07369c3bb0bc8a2fba4f2096d2e9a36c9a newsound/mob/chicken3.ogg
31b52151bf2a6fa35d2d2aa72f832285d9e7d70d newsound/mob/chickenhurt1.ogg
18752157f5d8718e2752805a657c74a73d2b88db newsound/mob/chickenhurt2.ogg
ab5a32b70ef1e7aafc550b20afdb7dc8c0d5d901 newsound/mob/chickenplop.ogg
1298f4526580c8f10812253e7d9130ce4afc3a1e newsound/mob/cow1.ogg
00b1a23c84bc7f7377de973040b2dd336670bb8f newsound/mob/cow2.ogg
f75617763129506ae7220ed16cdff7a8084eebb3 newsound/mob/cow3.ogg
e0bba792682878ee208a54184df9e2e8044f2815 newsound/mob/cow4.ogg
2c849f4b6ec1cf084ac84d57ec90779266b23ae8 newsound/mob/cowhurt1.ogg
be0be76687eab152334a35fdb76e6ab4455bfaef newsound/mob/cowhurt2.ogg
87eceaa08df660cd1d4dadf7d1c64a6f7125dacb newsound/mob/cowhurt3.ogg
74771428c2aa2acbd30638c6706867053bad64d3 newsound/mob/creeper1.ogg
c46c7d2a84749bfcbcf576aea0d66fd3deccba31 newsound/mob/creeper2.ogg
0979bf115d081d70a985f1cfcab1b9274d6be74e newsound/mob/creeper3.ogg
85c860ea8c55984bf6cabb75354c78f3a603f98d newsound/mob/creeper4.ogg
fbc1b2c89c5c781e30d702b2885be3f485105869 newsound/mob/creeperdeath.ogg
99cd73dda425ee03836c2274a0fcf331139773dc newsound/mob/ghast/affectionate scream.ogg
6f1d403f47725af0f4c42a74cfec00ff59153160 newsound/mob/ghast/charge.ogg
725e5179c72444c6d885e39c27e6b31ed83d58bc newsound/mob/ghast/death.ogg
eafa60d7ec34f86e8f07a001ddcdf5c4600bb174 newsound/mob/ghast/fireball4.ogg
882d092b05faef1cfa6af43d642b9e8843f22756 newsound/mob/ghast/moan1.ogg
02073c284f025653e55f9cde25a4a62723d395fa newsound/mob/ghast/moan2.ogg
dcec2d45fbc25f74a399ec9f8001e0ecd2d5d85e newsound/mob/ghast/moan3.ogg
935f1a575322bd0ec53a919fd061321216889104 newsound/mob/ghast/moan4.ogg
48fc6c25d0f1c1f0edd4eaca2b6f934d4117f440 newsound/mob/ghast/moan5.ogg
b3f91f243eceaa25cff7488ec2dac732e22cfec3 newsound/mob/ghast/moan6.ogg
cfb956ba9d26cbdacd16ef77d58764df783b2c7f newsound/mob/ghast/moan7.ogg
a0e62d86e5899405df4e796fe648e091d828691d newsound/mob/ghast/scream1.ogg
57008a7f564443d563968fd040fc13ab226fc8d1 newsound/mob/ghast/scream2.ogg
8f23820fa28830dd031188c20acb35af044aedb5 newsound/mob/ghast/scream3.ogg
edbc9e9cb9dfeabef93207fc0bdee6ceee5df7bc newsound/mob/ghast/scream4.ogg
77a7b79d4f2ada27640866ece1020b631f5bdc54 newsound/mob/ghast/scream5.ogg
a99bf88163bcb576e31e6e2275145afba6d1b4c7 newsound/mob/pig1.ogg
ab615a912fb8ea06648836e0ec1cbeeefe117da6 newsound/mob/pig2.ogg
58efedf302e0203a6ff9e59a6535d300286c5594 newsound/mob/pig3.ogg
4bc87ab869e17732a20c7518a327136baf5b2c26 newsound/mob/pigdeath.ogg
a3ffeaa0a75b8d2bdc949c181a6f8db78f8976ca newsound/mob/sheep1.ogg
1cfd864cbda555477ed9523e640de0d234c18858 newsound/mob/sheep2.ogg
c9ac72409cbe6093e84d72a2a5c719d9e4a0e6b2 newsound/mob/sheep3.ogg
199c9f150822950385b9bc1d840605a6a795bd27 newsound/mob/skeleton1.ogg
529abcb09220f0ebeb595f32bb663d026a7e0ae5 newsound/mob/skeleton2.ogg
a11ac56ec61c17e99f4ee33d8712404edf442720 newsound/mob/skeleton3.ogg
a795e9a7721927282befc085e4e397a6379e3004 newsound/mob/skeletondeath.ogg
f7e8ae3a771d50ed827772b75c50958393b621e1 newsound/mob/skeletonhurt1.ogg
a12f98ac001492ff596b5da9e6297b3be98f9149 newsound/mob/skeletonhurt2.ogg
647c46f5704b3be0b7159961e1bc51721a33dfd5 newsound/mob/skeletonhurt3.ogg
0f3a7e5a20119853986d2cfae22ca3a46926ac76 newsound/mob/skeletonhurt4.ogg
d49ab3ceb3f6212d64580f0d906fa9880a674c6d newsound/mob/slime1.ogg
525700bc06b6f0f8afc3fb542977cef617196ccf newsound/mob/slime2.ogg
087e5fa84e7c961778397a0d938bde1e49dd3beb newsound/mob/slime3.ogg
ca1b7de8bb9ce92f2f044c6a98c99d7bf92b7184 newsound/mob/slime4.ogg
24bae598320bf757fd6937a93f135f5cdba206ba newsound/mob/slime5.ogg
075e1ea92d5564d7bdf267ae975044315a41a686 newsound/mob/slimeattack1.ogg
f6e2067571631aae206000a501c9adebe862e32a newsound/mob/slimeattack2.ogg
65b49739d48ebc47879ca5528c8283329980b304 newsound/mob/spider1.ogg
501b40b97ee55cb7a97943ee620aa05131089fc2 newsound/mob/spider2.ogg
f9f79162efa6667b753c1fbb46ff9888e8ce5f32 newsound/mob/spider3.ogg
3cf3e8d3aab0a3092f6c6bf681ff156bc9653859 newsound/mob/spider4.ogg
4c69a6edc25d973999aa0db2bb46b583a31da278 newsound/mob/spiderdeath.ogg
2452c64a55eaef86bf1b668bb4d5f3b641cd8f25 newsound/mob/wolf/bark1.ogg
9f1708a6409d04370ec12d0add015b11abbd5371 newsound/mob/wolf/bark2.ogg
1ddae4e8dfa605e27ec8278b3e312597b674437e newsound/mob/wolf/bark3.ogg
77a5d445ed9ee588846947ac3df63f84be6d569d newsound/mob/wolf/death.ogg
0b29f5ce8c4c10fa4184e5d29244f3bc121468a0 newsound/mob/wolf/growl1.ogg
f57577fe6915175f9e4576e8d73ad4077a381433 newsound/mob/wolf/growl2.ogg
69ef2fe8d6a744689953fd692d0106b0b2d2a9ce newsound/mob/wolf/growl3.ogg
84556bac99c01ad006552cf5d96494817e9b1700 newsound/mob/wolf/howl1.ogg
cdb0293c5e2bdbda21798af4e61a4c171c8b1ec0 newsound/mob/wolf/howl2.ogg
71b5fc7aa050892f8c9a9ed2713cc1ad8874742a newsound/mob/wolf/hurt1.ogg
bc2f6a5a1b6646eac1681b7414b098089aedf3c6 newsound/mob/wolf/hurt2.ogg
a5b3f3cdda4d6e13629ccd0e2a38e1f06baa491a newsound/mob/wolf/hurt3.ogg
c2e4001d9ae8fc1f066a914170faad4c45a84e1e newsound/mob/wolf/panting.ogg
3d95ea49e91b4295859b193bb41b009b92250a44 newsound/mob/wolf/shake.ogg
fcf4f90c452b7b511d50e3959ae05036d13a7cf8 newsound/mob/wolf/whine.ogg
b5bc9775243437d87317ab3a66ec8a4d5b96c83d newsound/mob/zombie1.ogg
bf5086623d5c6735271074b263116fb914ed79b5 newsound/mob/zombie2.ogg
7eb3affa45f47f919e74523a55185e65c2081d12 newsound/mob/zombie3.ogg
6e0488ab07b9539fbaebc093f194bb6a95b2caec newsound/mob/zombiedeath.ogg
f35e14af35d1d12244dac9e655f4e31d4ef84e1b newsound/mob/zombiehurt1.ogg
bc85d96a99e84a234cbe23841f87e84e71198be3 newsound/mob/zombiehurt2.ogg
ec4b0396dd2fc2da8fab91ddc35218d3426349b3 newsound/mob/zombiepig/zpig1.ogg
2cbbcdfb97939c469cd4ccaaac74504497c56695 newsound/mob/zombiepig/zpig2.ogg
c9f7fa36ae48eca0a1f6ce024fde5d3472d30b4d newsound/mob/zombiepig/zpig3.ogg
e1187646b6256b92a1384f26ef2a7e56efcbe00d newsound/mob/zombiepig/zpig4.ogg
cadbc5c34979baab1a93f5cf68a50f9bd44ef5a8 newsound/mob/zombiepig/zpigangry1.ogg
0349ce87fe856ddf8fdd94a559bb29061b002b6c newsound/mob/zombiepig/zpigangry2.ogg
e0c88ca054666aae58b89abdcf377eae525aa13e newsound/mob/zombiepig/zpigangry3.ogg
c76dea473821e2ae9a1f006a4eddfdd0703eecdf newsound/mob/zombiepig/zpigangry4.ogg
40b8e244d03ae17483edd4571bd851e10a97050f newsound/mob/zombiepig/zpigdeath.ogg
a2cfbea288280419ec0c8fb75d8ee5395536ac02 newsound/mob/zombiepig/zpighurt1.ogg
d1917b9be91d60a40dd0bf804580c1f494e9ae6d newsound/mob/zombiepig/zpighurt2.ogg
e28d844995368de1d45c724a5d371c9952ae5ed4 newsound/note/bass.ogg
037b9fb7f74381f354739d015193dc4a6897f620 newsound/note/bassattack.ogg
1afefaa39a53606d2737bab9cb3409350cb2dc9f newsound/note/bd.ogg
46244605b8663a29cdce7bccc5b2d038241e32ee newsound/note/harp.ogg
fd2b6f745b05a2cf44a4e010f72631de2e5099f6 newsound/note/hat.ogg
20d06589bd5ab81a73989bdac8ca59ecd4d66932 newsound/note/pling.ogg
6967f0af60f480e81d32f1f8e5f88ccafec3a40c newsound/note/snare.ogg
9a20be18fed05330f745a54eb8aeba11aac5403b newsound/portal/portal.ogg
43388701fac432a567fe9fec421521e6348ad780 newsound/portal/travel.ogg
301f32642b654addbd06a430768fead464fd24c4 newsound/portal/trigger.ogg
dd2f7209c2a58b0886beb34d49b0512b49adbb7e newsound/random/breath.ogg
2fe092579d9637e2d160319820ee08e60a237bb7 newsound/random/click.ogg
40a5a4307c1a2a5a1b9f71254275689845374104 newsound/random/drr.ogg
9e22b5aeec31de99410b682cc161a6096a1cd00a newsound/random/explode.ogg
c649e60ea9a99c97501a50d2dc4e579343e91ea8 newsound/random/fizz.ogg
a92ba2b8f6abc41aa8d679ad808a81d0aafa04b2 newsound/random/fuse.ogg
7274a2231ed4544a37e599b7b014e589e5377094 newsound/random/glass1.ogg
87c47bda3645c68f18a49e83cbf06e5302d087ff newsound/random/glass2.ogg
ad7d770b7fff3b64121f75bd60cecfc4866d1cd6 newsound/random/glass3.ogg
9d485556b89bf776042080774679c37300bc744b newsound/random/hurt.ogg
8f45b5faf6dfae2065846d26612f7552b73640dd newsound/random/pop.ogg
22a491f266f5c3cdd6e669a9493daaf40c9c8575 newsound/random/splash.ogg
b210a3c371441b77fe873133b2cb7b63e367b2f3 newsound/random/wood click.ogg
5fd568d724ba7d53911b6cccf5636f859d2662e8 newsound/step/cloth1.ogg
56c1d0ac0de2265018b2c41cb571cc6631101484 newsound/step/cloth2.ogg
9c63f2a3681832dc32d206f6830360bfe94b5bfc newsound/step/cloth3.ogg
55da1856e77cfd31a7e8c3d358e1f856c5583198 newsound/step/cloth4.ogg
41cbf5dd08e951ad65883854e74d2e034929f572 newsound/step/grass1.ogg
86cb1bb0c45625b18e00a64098cd425a38f6d3f2 newsound/step/grass2.ogg
f7d7e5c7089c9b45fa5d1b31542eb455fad995db newsound/step/grass3.ogg
c7b1005d4926f6a2e2387a41ab1fb48a72f18e98 newsound/step/grass4.ogg
e8b89f316f3e9989a87f6e6ff12db9abe0f8b09f newsound/step/gravel1.ogg
c3b3797d04cb9640e1d3a72d5e96edb410388fa3 newsound/step/gravel2.ogg
48f7e1bb098abd36b9760cca27b9d4391a23de26 newsound/step/gravel3.ogg
7bf3553a4fe41a0078f4988a13d6e1ed8663ef4c newsound/step/gravel4.ogg
9e59c3650c6c3fc0a475f1b753b2fcfef430bf81 newsound/step/sand1.ogg
0fa4234797f336ada4e3735e013e44d1099afe57 newsound/step/sand2.ogg
c75589cc0087069f387de127dd1499580498738e newsound/step/sand3.ogg
37afa06f97d58767a1cd1382386db878be1532dd newsound/step/sand4.ogg
e9bab7d3d15541f0aaa93fad31ad37fd07e03a6c newsound/step/snow1.ogg
5887d10234c4f244ec5468080412f3e6ef9522f3 newsound/step/snow2.ogg
a4bc069321a96236fde04a3820664cc23b2ea619 newsound/step/snow3.ogg
e26fa3036cdab4c2264ceb19e1cd197a2a510227 newsound/step/snow4.ogg
4e094ed8dfa98656d8fec52a7d20c5ee6098b6ad newsound/step/stone1.ogg
9c92f697142ae320584bf64c0d54381d59703528 newsound/step/stone2.ogg
8f23c02475d388b23e5faa680eafe6b991d7a9d4 newsound/step/stone3.ogg
363545a76277e5e47538b2dd3a0d6aa4f7a87d34 newsound/step/stone4.ogg
9bc2a84d0aa98113fc52609976fae8fc88ea6333 newsound/step/wood1.ogg
98102533e6085617a2962157b4f3658f59aea018 newsound/step/wood2.ogg
45b2aef7b5049e81b39b58f8d631563fadcc778b newsound/step/wood3.ogg
dc66978374a46ab2b87db6472804185824868095 newsound/step/wood4.ogg
594be3eaea9a2b92095eeeb3b1e01e755dcb8ce2 newsound/tile/piston/in.ogg
cb017131516de9359cb81fb991f5b3694044f8db newsound/tile/piston/out.ogg
41cbf5dd08e951ad65883854e74d2e034929f572 sound/step/grass1.ogg
86cb1bb0c45625b18e00a64098cd425a38f6d3f2 sound/step/grass2.ogg
f7d7e5c7089c9b45fa5d1b31542eb455fad995db sound/step/grass3.ogg
c7b1005d4926f6a2e2387a41ab1fb48a72f18e98 sound/step/grass4.ogg
e8b89f316f3e9989a87f6e6ff12db9abe0f8b09f sound/step/gravel1.ogg
c3b3797d04cb9640e1d3a72d5e96edb410388fa3 sound/step/gravel2.ogg
48f7e1bb098abd36b9760cca27b9d4391a23de26 sound/step/gravel3.ogg
7bf3553a4fe41a0078f4988a13d6e1ed8663ef4c sound/step/gravel4.ogg
4e094ed8dfa98656d8fec52a7d20c5ee6098b6ad sound/step/stone1.ogg
9c92f697142ae320584bf64c0d54381d59703528 sound/step/stone2.ogg
8f23c02475d388b23e5faa680eafe6b991d7a9d4 sound/step/stone3.ogg
363545a76277e5e47538b2dd3a0d6aa4f7a87d34 sound/step/stone4.ogg
9bc2a84d0aa98113fc52609976fae8fc88ea6333 sound/step/wood1.ogg
98102533e6085617a2962157b4f3658f59aea018 sound/step/wood2.ogg
45b2aef7b5049e81b39b58f8d631563fadcc778b sound/step/wood3.ogg
dc66978374a46ab2b87db6472804185824868095 sound/step/wood4.ogg
d5ce66b3787648036b29c504786bcc237cd316d3 streaming/11.mus
c343dc04df647fb25bec35ee23dc973e7374dcf9 streaming/13.mus
9cbed0e40296f68c61090c9b81816061e068a0ec streaming/13.ogg
eaf1d4879f3bf6f5f60ba01f475dc581c641b4ae streaming/blocks.mus
bea1c181fce1150f3aaea8f14a773394ccc253d2 streaming/cat.mus
d1eb3d2e39bf1f6289cfcbca44e1c9bb508b20f0 streaming/cat.ogg
d639bf7f0516e5e363fe5db2aa150cedd38de19a streaming/chirp.mus
21c9b7c6b486247322051f90aa964f161edc78d8 streaming/far.mus
872d3d24452ff2155bb6be4a14c103e4451e6416 streaming/mall.mus
7c5b628070ce191762b972fc3a58d57bc10a628a streaming/mellohi.mus
a01e4caf7aaac61502a4a5e4f277b0de4795b802 streaming/stal.mus
bcadae10578ff321236f5670934f0b287eb80fbc streaming/strad.mus
b245effde68d07ffe32a033b61e96f1ed7e28783 streaming/ward.mus
854ff331487394ba83ca273ff73de525fbefcb25 streaming/where are we now.mus
LIST
}

# SHA-1 on Betacraft, SHA-1 of the Mojang fallback, and path.
betacraft_files() {
    cat <<'LIST'
f1b527e059bb4abe3aed3acf6b5eb96f40b07f67 87edc11141fb5a045f2ed830b545aaa73f96ee99 newsound/random/bow.ogg
022e48005197b37f0caa53e8051c8a266eeae15e 9ea8a9e105321891bda18b9007b383b40aa7c076 newsound/random/door_close.ogg
a0f42702fa685d58b7875eeb359b89a6eee662e5 5bb5a04e776d69ca12b1d7bc369975f9bf62e741 newsound/random/door_open.ogg
LIST
}

main "$@"
