diff --git a/Data/Textures/atlas.png b/Data/Textures/atlas.png index 84227fb..a5651e0 100644 --- a/Data/Textures/atlas.png +++ b/Data/Textures/atlas.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa09cf9a837958a6aeb6f9031f7592522ffab4e75e341cfeac2e07130c0324c1 -size 4838947 +oid sha256:5a7814629aaa53c134869cfa1208360edd24eb50db83aad445092d5bc6770dca +size 7090720 diff --git a/Data/Textures/atlas.txt b/Data/Textures/atlas.txt index 0274259..c5e6316 100644 --- a/Data/Textures/atlas.txt +++ b/Data/Textures/atlas.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:900faecb6299c6cd1fc93e236be770291c5580b3f96aa5417885dc863519969c -size 2863 +oid sha256:1c3a307d8e21e2905c612e367a31533dce2335a4dcdbcfa2714a696cf61f35d4 +size 4579 diff --git a/Data/Textures/atlas/airport_terry_1.png b/Data/Textures/atlas/airport_terry_1.png new file mode 100644 index 0000000..d283e90 --- /dev/null +++ b/Data/Textures/atlas/airport_terry_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed132dfd7705b39c29d86ed529c6786cca0dbe031da3231fd93f4507f9bc0bc0 +size 106142 diff --git a/Data/Textures/atlas/airport_terry_2.png b/Data/Textures/atlas/airport_terry_2.png new file mode 100644 index 0000000..7aa60ea --- /dev/null +++ b/Data/Textures/atlas/airport_terry_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e7e2c75a1847a1fa89841819180c8b1891d8d0e04df3a958145dabaecd41a44 +size 109771 diff --git a/Data/Textures/atlas/airport_terry_plane_1.png b/Data/Textures/atlas/airport_terry_plane_1.png new file mode 100644 index 0000000..f2e2318 --- /dev/null +++ b/Data/Textures/atlas/airport_terry_plane_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1343790890aaaeff4cfc4f8841c2ee1d219d4d37d927ab3ef9e09656a32c87c3 +size 29587 diff --git a/Data/Textures/atlas/airport_terry_plane_2.png b/Data/Textures/atlas/airport_terry_plane_2.png new file mode 100644 index 0000000..920c3f3 --- /dev/null +++ b/Data/Textures/atlas/airport_terry_plane_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3292cde04ae42d836fa9212dc546ed3a7e08b8d32f6aa102436841e45bf68aaa +size 29047 diff --git a/Data/Textures/atlas/catfish_attack_down_1.png b/Data/Textures/atlas/catfish_attack_down_1.png new file mode 100644 index 0000000..17de4cb --- /dev/null +++ b/Data/Textures/atlas/catfish_attack_down_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc7b8df338771944db23ae0abfc53db67c3002ad52973106d309a5cfa1e78cb3 +size 14857 diff --git a/Data/Textures/atlas/catfish_attack_down_2.png b/Data/Textures/atlas/catfish_attack_down_2.png new file mode 100644 index 0000000..e3b561f --- /dev/null +++ b/Data/Textures/atlas/catfish_attack_down_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de833831e7556e54b7ef9cc2c2bd3ff8d2c399a66110063424b25d8f0cdf12eb +size 15519 diff --git a/Data/Textures/atlas/catfish_attack_side_1.png b/Data/Textures/atlas/catfish_attack_side_1.png new file mode 100644 index 0000000..4153414 --- /dev/null +++ b/Data/Textures/atlas/catfish_attack_side_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ede8964dc1fdd8df0c18551678687badb3c702bcc5745b5265233b9399bae30b +size 19203 diff --git a/Data/Textures/atlas/catfish_attack_side_2.png b/Data/Textures/atlas/catfish_attack_side_2.png new file mode 100644 index 0000000..d8168dc --- /dev/null +++ b/Data/Textures/atlas/catfish_attack_side_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79e3aa97d5edc31a267350f19c9b6c3262ae919d7339f6d1d4a283c04f734745 +size 18363 diff --git a/Data/Textures/atlas/catfish_attack_up_1.png b/Data/Textures/atlas/catfish_attack_up_1.png new file mode 100644 index 0000000..178b793 --- /dev/null +++ b/Data/Textures/atlas/catfish_attack_up_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbb4731aa5cc093b8646dc1b7a906c753f84bb36d6c72553cf71b7c653ff2c47 +size 11359 diff --git a/Data/Textures/atlas/catfish_attack_up_2.png b/Data/Textures/atlas/catfish_attack_up_2.png new file mode 100644 index 0000000..53521e0 --- /dev/null +++ b/Data/Textures/atlas/catfish_attack_up_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20e7f984f12241bbe017247f4e516d4dd910ad430cb3538b3305a339d8280816 +size 12183 diff --git a/Data/Textures/atlas/catfish_death_1.png b/Data/Textures/atlas/catfish_death_1.png new file mode 100644 index 0000000..1d80d0d --- /dev/null +++ b/Data/Textures/atlas/catfish_death_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f173b652e6f504385ad18c5dd670ca6da1a521ecebb1a7b806b4fa53dbfe9f0 +size 10181 diff --git a/Data/Textures/atlas/catfish_death_2.png b/Data/Textures/atlas/catfish_death_2.png new file mode 100644 index 0000000..32e7bc5 --- /dev/null +++ b/Data/Textures/atlas/catfish_death_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:432104137a0122cbfdc7146005b46f4ba275468d01086477a108ea9661899a90 +size 12073 diff --git a/Data/Textures/atlas/catfish_death_3.png b/Data/Textures/atlas/catfish_death_3.png new file mode 100644 index 0000000..eef035a --- /dev/null +++ b/Data/Textures/atlas/catfish_death_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26b2bcd6f0f30a1df9c4ff61948ed33930760217bc4ca7ab274f345f13e5a046 +size 11706 diff --git a/Data/Textures/atlas/catfish_death_4.png b/Data/Textures/atlas/catfish_death_4.png new file mode 100644 index 0000000..0197563 --- /dev/null +++ b/Data/Textures/atlas/catfish_death_4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3402bc7e5b02082f8d30cbdcb2425da5c7c79173ed2dc66952548814e1b586a0 +size 8595 diff --git a/Data/Textures/atlas/catfish_walk_down_1.png b/Data/Textures/atlas/catfish_walk_down_1.png new file mode 100644 index 0000000..f0086e6 --- /dev/null +++ b/Data/Textures/atlas/catfish_walk_down_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a72f39938829f64a84344eb330b288d64cb811f51ea02738811cdc38ac076f27 +size 14025 diff --git a/Data/Textures/atlas/catfish_walk_down_2.png b/Data/Textures/atlas/catfish_walk_down_2.png new file mode 100644 index 0000000..2c60f6a --- /dev/null +++ b/Data/Textures/atlas/catfish_walk_down_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd2a05cb4b5b6f91de54c10dcaa4288e6bab7fa73d30fca03040bb8386b8a936 +size 15042 diff --git a/Data/Textures/atlas/catfish_walk_side_1.png b/Data/Textures/atlas/catfish_walk_side_1.png new file mode 100644 index 0000000..c98e430 --- /dev/null +++ b/Data/Textures/atlas/catfish_walk_side_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:512d19de291965d6538742fa970cb129f0479baf67e38be0a8ceb3d17dc06fe7 +size 15233 diff --git a/Data/Textures/atlas/catfish_walk_side_2.png b/Data/Textures/atlas/catfish_walk_side_2.png new file mode 100644 index 0000000..0775702 --- /dev/null +++ b/Data/Textures/atlas/catfish_walk_side_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bae6ebfba9f441c8539a79408dd90c5d14faccb87abb40fee90af5e9e6e98cc1 +size 16513 diff --git a/Data/Textures/atlas/catfish_walk_up_1.png b/Data/Textures/atlas/catfish_walk_up_1.png new file mode 100644 index 0000000..df307c8 --- /dev/null +++ b/Data/Textures/atlas/catfish_walk_up_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ea4dd84b82c02830b2977c9e4fb083c387daf33b2fa42baeaa20a82442938ba +size 11853 diff --git a/Data/Textures/atlas/catfish_walk_up_2.png b/Data/Textures/atlas/catfish_walk_up_2.png new file mode 100644 index 0000000..d13e1e4 --- /dev/null +++ b/Data/Textures/atlas/catfish_walk_up_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c055b20c5bea032305bb27cc44ab19074c254a43635a2432dce23b12886abe3 +size 12540 diff --git a/Data/Textures/atlas/church_terry_alive.png b/Data/Textures/atlas/church_terry_alive.png new file mode 100644 index 0000000..51e7172 --- /dev/null +++ b/Data/Textures/atlas/church_terry_alive.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e7de1187c4a60b64e9cdf1401f99657bf5ff6ae819940ffd9e9093a42e6eade +size 100064 diff --git a/Data/Textures/atlas/kennel_terry_1.png b/Data/Textures/atlas/kennel_terry_1.png new file mode 100644 index 0000000..634ed00 --- /dev/null +++ b/Data/Textures/atlas/kennel_terry_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d5c2cec035c09847110adba87cba87ebaa9697f622c92770a2838323d905aed +size 95346 diff --git a/Data/Textures/atlas/merchant_button_a.png b/Data/Textures/atlas/merchant_button_a.png new file mode 100644 index 0000000..147b01d --- /dev/null +++ b/Data/Textures/atlas/merchant_button_a.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a08233ae56af8e3c7e09105d366a995c1f3578178391ace5a4e0d4bd92dd90fb +size 4437 diff --git a/Data/Textures/atlas/merchant_button_b.png b/Data/Textures/atlas/merchant_button_b.png new file mode 100644 index 0000000..8183b70 --- /dev/null +++ b/Data/Textures/atlas/merchant_button_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb7a87aa737b49672be5240503c706b2b4ff1cb350585a75e31861d40568ef79 +size 4495 diff --git a/Data/Textures/atlas/merchant_button_x.png b/Data/Textures/atlas/merchant_button_x.png new file mode 100644 index 0000000..9ae29d7 --- /dev/null +++ b/Data/Textures/atlas/merchant_button_x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54c4c96df965122cd24e08bae53b9489121d526bad50ddb9d54f390e02da68fd +size 4454 diff --git a/Data/Textures/atlas/merchant_button_y.png b/Data/Textures/atlas/merchant_button_y.png new file mode 100644 index 0000000..1f7a2d8 --- /dev/null +++ b/Data/Textures/atlas/merchant_button_y.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bec1f68d5ba2bd0909afa48fa204466297694c81faf096e1b919346cdf3ddb6 +size 4472 diff --git a/Data/Textures/atlas/merchant_graveyard_menu_1.png b/Data/Textures/atlas/merchant_graveyard_menu_1.png new file mode 100644 index 0000000..d81c2e8 --- /dev/null +++ b/Data/Textures/atlas/merchant_graveyard_menu_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efebb3804e0b79353e3475c1c2f2e306304324c2556f6acd3853e37258405400 +size 98547 diff --git a/Data/Textures/atlas/merchant_graveyard_menu_2.png b/Data/Textures/atlas/merchant_graveyard_menu_2.png new file mode 100644 index 0000000..020722f --- /dev/null +++ b/Data/Textures/atlas/merchant_graveyard_menu_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3112afc30c679ada8aaabf1aedb627353ca32246575150f8105d66702d6a7f68 +size 100765 diff --git a/Data/Textures/atlas/merchant_gym_menu_1.png b/Data/Textures/atlas/merchant_gym_menu_1.png new file mode 100644 index 0000000..5c1dbf5 --- /dev/null +++ b/Data/Textures/atlas/merchant_gym_menu_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca4e90d1279fb400dc1fb7e85fcc1bd2dadefcb48498e16ccb1b72fada984d18 +size 67131 diff --git a/Data/Textures/atlas/merchant_phone_company_menu_2.png b/Data/Textures/atlas/merchant_phone_company_menu_2.png new file mode 100644 index 0000000..ab95994 --- /dev/null +++ b/Data/Textures/atlas/merchant_phone_company_menu_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6e8a5f66f2d55e051ed88b6963199646b9c73f416e8928d62b6a0801e0f26f9 +size 94254 diff --git a/Data/Textures/atlas/shrubbery_bush_1_1.png b/Data/Textures/atlas/shrubbery_bush_1_1.png new file mode 100644 index 0000000..c778d40 --- /dev/null +++ b/Data/Textures/atlas/shrubbery_bush_1_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:110b380b6e05714a7e88e12f6710ac8427b532664ec0299d4c8ba3882c0e28da +size 5021 diff --git a/Data/Textures/atlas/shrubbery_bush_2_1.png b/Data/Textures/atlas/shrubbery_bush_2_1.png new file mode 100644 index 0000000..157793c --- /dev/null +++ b/Data/Textures/atlas/shrubbery_bush_2_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9361c16085e93b56e5c4434f479b1320a578c2e8bf8dc9b495d4ddc3fa10f3d0 +size 6528 diff --git a/Data/Textures/atlas/shrubbery_island_1_1.png b/Data/Textures/atlas/shrubbery_island_1_1.png new file mode 100644 index 0000000..a7e8f20 --- /dev/null +++ b/Data/Textures/atlas/shrubbery_island_1_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:627115f9131b0ca3b9c1f25d65fdd3bddc5784fb9bb28f5f1ef56df1c42831a9 +size 12639 diff --git a/Data/Textures/atlas/shrubbery_island_2_1.png b/Data/Textures/atlas/shrubbery_island_2_1.png new file mode 100644 index 0000000..ba64da1 --- /dev/null +++ b/Data/Textures/atlas/shrubbery_island_2_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:051b86870aba80b1f9c380c19b75d58a43226ff9268612016b5297cce0fa2372 +size 14035 diff --git a/Data/Textures/atlas/terry_attack_phone_down_1.png b/Data/Textures/atlas/terry_attack_phone_down_1.png new file mode 100644 index 0000000..8cf0d16 --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_down_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b77fd5ea628c89e6d4cc1a6a348efc1e325426cbefdede5c574161be9763064c +size 15153 diff --git a/Data/Textures/atlas/terry_attack_phone_down_2.png b/Data/Textures/atlas/terry_attack_phone_down_2.png new file mode 100644 index 0000000..6fa3141 --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_down_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d7c81e0855549a52ac7f6d07fc8d3e9937d18743529d9eda29fb72c1f342bfc +size 15612 diff --git a/Data/Textures/atlas/terry_attack_phone_message_1.png b/Data/Textures/atlas/terry_attack_phone_message_1.png new file mode 100644 index 0000000..f811cda --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_message_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1b44e7d5d6518cc18286939c3a8d0248e7c134f07cc1431d3d3a365b853cc14 +size 2647 diff --git a/Data/Textures/atlas/terry_attack_phone_message_2.png b/Data/Textures/atlas/terry_attack_phone_message_2.png new file mode 100644 index 0000000..b005e6e --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_message_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa439657a70eca4f5cea4b9868e021cc8c75430dae5877ca6433b06da4eb5e5d +size 6872 diff --git a/Data/Textures/atlas/terry_attack_phone_message_3.png b/Data/Textures/atlas/terry_attack_phone_message_3.png new file mode 100644 index 0000000..ca2d4ee --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_message_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4de23b76a9e4e7a83def15a26b272a12f4f4efec517e4d5e865627855e84694e +size 5190 diff --git a/Data/Textures/atlas/terry_attack_phone_side_1.png b/Data/Textures/atlas/terry_attack_phone_side_1.png new file mode 100644 index 0000000..76c8faf --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_side_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b8005790ad44e2bca0bbd5c72b17c3ad4c6bc80eac5b13fa9acde2434c79ae6 +size 16736 diff --git a/Data/Textures/atlas/terry_attack_phone_side_2.png b/Data/Textures/atlas/terry_attack_phone_side_2.png new file mode 100644 index 0000000..d175abd --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_side_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:126887ed590568bf65170c179df9a6af7d6b9ad8cdd932fdd075f00ea8489abb +size 20142 diff --git a/Data/Textures/atlas/terry_attack_phone_up_1.png b/Data/Textures/atlas/terry_attack_phone_up_1.png new file mode 100644 index 0000000..03cc64e --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_up_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a46aa326f3970b67fbef5bbb326be2aa21b3af125e4b119b5caba392b7bc67c4 +size 15553 diff --git a/Data/Textures/atlas/terry_attack_phone_up_2.png b/Data/Textures/atlas/terry_attack_phone_up_2.png new file mode 100644 index 0000000..0bc0834 --- /dev/null +++ b/Data/Textures/atlas/terry_attack_phone_up_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd9c8b7c765606fda6c8a73bf9a8d2c7c8f730caf352c49850cba0da6c316888 +size 17907 diff --git a/Data/Textures/atlas/terry_walk_left_1.png b/Data/Textures/atlas/terry_walk_left_1.png index 45d73e2..484542d 100644 --- a/Data/Textures/atlas/terry_walk_left_1.png +++ b/Data/Textures/atlas/terry_walk_left_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5064d81c3be31fa04a87d7c6e2b7f05d265c25d0d2cf55bab4b27eb866865f50 -size 13036 +oid sha256:1c6e0db0b21497f57caadaf604d121cff135f651f95e9ff6d3c6b0e64e16507c +size 12080 diff --git a/Data/Textures/atlas/terry_walk_left_2.png b/Data/Textures/atlas/terry_walk_left_2.png index 5596196..0a1c679 100644 --- a/Data/Textures/atlas/terry_walk_left_2.png +++ b/Data/Textures/atlas/terry_walk_left_2.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:70f22f9a03fc852eec8ba29c0425a52c39670f7fa0ea88c4109a381c06d8ec7b -size 12847 +oid sha256:a7c69591640c66014fb0a11a45b6a1732cb59819f98de9f4d4965757863c1998 +size 15004 diff --git a/Data/Textures/atlas/terry_walk_left_3.png b/Data/Textures/atlas/terry_walk_left_3.png index 9c2ad5d..15b89a4 100644 --- a/Data/Textures/atlas/terry_walk_left_3.png +++ b/Data/Textures/atlas/terry_walk_left_3.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3dd501b81f72fa129a6c16e462f8d011e37d63ca9c0b28ff558de0958323471 -size 12922 +oid sha256:5be2fa2bd3575b002509bbd7fb2eddbe3efab584cca23dcf527a1258b4e9fd9c +size 17442 diff --git a/Data/Textures/atlas/terry_walk_left_5.png b/Data/Textures/atlas/terry_walk_left_5.png index 15b89a4..9c2ad5d 100644 --- a/Data/Textures/atlas/terry_walk_left_5.png +++ b/Data/Textures/atlas/terry_walk_left_5.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5be2fa2bd3575b002509bbd7fb2eddbe3efab584cca23dcf527a1258b4e9fd9c -size 17442 +oid sha256:d3dd501b81f72fa129a6c16e462f8d011e37d63ca9c0b28ff558de0958323471 +size 12922 diff --git a/Data/Textures/atlas/terry_walk_left_6.png b/Data/Textures/atlas/terry_walk_left_6.png index 0a1c679..5596196 100644 --- a/Data/Textures/atlas/terry_walk_left_6.png +++ b/Data/Textures/atlas/terry_walk_left_6.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7c69591640c66014fb0a11a45b6a1732cb59819f98de9f4d4965757863c1998 -size 15004 +oid sha256:70f22f9a03fc852eec8ba29c0425a52c39670f7fa0ea88c4109a381c06d8ec7b +size 12847 diff --git a/Data/Textures/atlas/terry_walk_left_7.png b/Data/Textures/atlas/terry_walk_left_7.png index 484542d..45d73e2 100644 --- a/Data/Textures/atlas/terry_walk_left_7.png +++ b/Data/Textures/atlas/terry_walk_left_7.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c6e0db0b21497f57caadaf604d121cff135f651f95e9ff6d3c6b0e64e16507c -size 12080 +oid sha256:5064d81c3be31fa04a87d7c6e2b7f05d265c25d0d2cf55bab4b27eb866865f50 +size 13036 diff --git a/Data/Textures/sprite_spec.txt b/Data/Textures/sprite_spec.txt index ac4dc8c..c7c2d80 100644 --- a/Data/Textures/sprite_spec.txt +++ b/Data/Textures/sprite_spec.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2195fc517f0432ccef6e6d0ac920ed3771e99567a8c5d243422e7f021faa9b18 -size 670 +oid sha256:df800282c974e6c1792991ff33704c9a3f6574dc3829048f4f2166ef7f4e0cb8 +size 1333 diff --git a/feely_pona.cpp b/feely_pona.cpp index 2f76fa2..4acf9cd 100644 --- a/feely_pona.cpp +++ b/feely_pona.cpp @@ -172,12 +172,17 @@ static void FP_Game_MoveEntity(FP_Game *game, FP_GameEntityHandle entity_handle, bool entity_collides_with_collider = true; switch (entity->type) { case FP_EntityType_Smoochie: { - if (collider->type == FP_EntityType_Smoochie || collider->type == FP_EntityType_Clinger) + if (collider->type == FP_EntityType_Smoochie || collider->type == FP_EntityType_Clinger || collider->type == FP_EntityType_Catfish) entity_collides_with_collider = false; } break; case FP_EntityType_Clinger: { - if (collider->type == FP_EntityType_Smoochie || collider->type == FP_EntityType_Clinger) + if (collider->type == FP_EntityType_Smoochie || collider->type == FP_EntityType_Clinger || collider->type == FP_EntityType_Catfish) + entity_collides_with_collider = false; + } break; + + case FP_EntityType_Catfish: { + if (collider->type == FP_EntityType_Smoochie || collider->type == FP_EntityType_Clinger || collider->type == FP_EntityType_Catfish) entity_collides_with_collider = false; } break; @@ -199,6 +204,9 @@ static void FP_Game_MoveEntity(FP_Game *game, FP_GameEntityHandle entity_handle, case FP_EntityType_MerchantGym: break; case FP_EntityType_MerchantPhoneCompany: break; case FP_EntityType_Heart: break; + case FP_EntityType_AirportTerry: break; + case FP_EntityType_ChurchTerry: break; + case FP_EntityType_KennelTerry: break; } if (!entity_collides_with_collider) @@ -533,6 +541,17 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform } } break; + case FP_EntityTerryState_AttackPhone: { + if (entering_new_state) { + uint64_t duration_ms = render_data.sprite.anim->count * render_data.sprite.anim->ms_per_frame; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, render_data.sprite); + } + + if (action_has_finished) { + FP_Game_EntityTransitionState(game, entity, FP_EntityTerryState_Idle); + } + } break; + case FP_EntityTerryState_Run: { if (entering_new_state || action->sprite.anim->label != render_data.anim_name) { uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER; @@ -566,7 +585,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform } break; } - if (*state == FP_EntityTerryState_Attack) { + if (*state == FP_EntityTerryState_Attack || *state == FP_EntityTerryState_AttackPhone) { DQN_ASSERT(action->sprite.anim); uint64_t duration_ms = action->sprite.anim->count * action->sprite.anim->ms_per_frame; @@ -971,7 +990,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform } break; case FP_EntityType_Map: { - FP_EntityMapState *state = DQN_CAST(FP_EntityMapState *) & action->state; + FP_EntityMapState *state = DQN_CAST(FP_EntityMapState *) & action->state; switch (*state) { case FP_EntityMapState_Nil: { FP_Game_EntityTransitionState(game, entity, FP_EntityMapState_Idle); @@ -988,7 +1007,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform } break; case FP_EntityType_Heart: { - FP_EntityHeartState *state = DQN_CAST(FP_EntityHeartState *) & action->state; + FP_EntityHeartState *state = DQN_CAST(FP_EntityHeartState *) & action->state; switch (*state) { case FP_EntityHeartState_Nil: { FP_Game_EntityTransitionState(game, entity, FP_EntityHeartState_Idle); @@ -1003,7 +1022,162 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform } } break; + case FP_EntityType_AirportTerry: { + FP_EntityAirportTerryState *state = DQN_CAST(FP_EntityAirportTerryState *)&action->state; + switch (*state) { + case FP_EntityAirportTerryState_Nil: { + FP_Game_EntityTransitionState(game, entity, FP_EntityAirportTerryState_Idle); + } break; + + case FP_EntityAirportTerryState_Idle: { + if (entering_new_state) { + uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, render_data.sprite); + } + } break; + + case FP_EntityAirportTerryState_FlyPassenger: { + } break; + } + } break; + + case FP_EntityType_Catfish: { + FP_EntityCatfishState *state = DQN_CAST(FP_EntityCatfishState *) & action->state; + switch (*state) { + case FP_EntityCatfishState_Nil: { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Idle); + } break; + + case FP_EntityCatfishState_Idle: { + if (entering_new_state) { + uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, render_data.sprite); + } + + if (we_are_clicked_entity) { + if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_J) || + TELY_Platform_InputGamepadButtonCodeIsPressed(input, 0, TELY_PlatformInputGamepadButtonCode_X)) { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Attack); + } else if (acceleration_meters_per_s->x || acceleration_meters_per_s->y) { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Run); + } + } + + if (entity_has_velocity) { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Run); + } + } break; + + case FP_EntityCatfishState_Attack: { + if (entering_new_state) { + uint64_t duration_ms = render_data.sprite.anim->count * render_data.sprite.anim->ms_per_frame; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, render_data.sprite); + } + + if (action_has_finished) + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Idle); + } break; + + case FP_EntityCatfishState_Death: { + if (entering_new_state) { + uint64_t duration_ms = render_data.sprite.anim->count * render_data.sprite.anim->ms_per_frame; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, render_data.sprite); + } + + if (action_has_finished) + FP_Game_DeleteEntity(game, entity->handle); + } break; + + case FP_EntityCatfishState_Run: { + if (entering_new_state || action->sprite.anim->label != render_data.anim_name) { + TELY_AssetAnimatedSprite sprite = TELY_Asset_MakeAnimatedSprite(sheet, render_data.anim_name, render_data.flip); + uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, sprite); + } + + if (we_are_clicked_entity) { + if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_J) || + TELY_Platform_InputGamepadButtonCodeIsPressed(input, 0, TELY_PlatformInputGamepadButtonCode_X)) { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Attack); + } + } + + if (!entity_has_velocity) { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Idle); + } + } break; + } + + if (entity->is_dying && *state != FP_EntityCatfishState_Death) { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Death); + } + + if (*state == FP_EntityCatfishState_Attack) { // NOTE: Position the attack box + entity->attack_box_size = entity->local_hit_box_size; + switch (entity->direction) { + case FP_GameDirection_Left: { + entity->attack_box_offset = Dqn_V2_InitNx2(entity->local_hit_box_offset.x - entity->attack_box_size.w, + entity->local_hit_box_offset.y); + } break; + + case FP_GameDirection_Right: { + entity->attack_box_offset = Dqn_V2_InitNx2(entity->local_hit_box_offset.x + entity->attack_box_size.w, + entity->local_hit_box_offset.y); + } break; + + case FP_GameDirection_Up: { + entity->attack_box_offset = Dqn_V2_InitNx2(entity->local_hit_box_offset.x, + entity->local_hit_box_offset.y - entity->attack_box_size.h); + } break; + + case FP_GameDirection_Down: { + entity->attack_box_offset = Dqn_V2_InitNx2(entity->local_hit_box_offset.x, + entity->local_hit_box_offset.y + entity->attack_box_size.h); + } break; + + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } else { + entity->attack_box_size = {}; + } + } break; + + case FP_EntityType_ChurchTerry: { + FP_EntityChurchTerryState *state = DQN_CAST(FP_EntityChurchTerryState *)&action->state; + switch (*state) { + case FP_EntityChurchTerryState_Nil: { + FP_Game_EntityTransitionState(game, entity, FP_EntityChurchTerryState_Idle); + } break; + + case FP_EntityChurchTerryState_Idle: { + if (entering_new_state) { + uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, render_data.sprite); + } + } break; + case FP_EntityChurchTerryState_ConvertPatron: break; + } + + } break; + + case FP_EntityType_KennelTerry: { + FP_EntityKennelTerryState *state = DQN_CAST(FP_EntityKennelTerryState *)&action->state; + switch (*state) { + case FP_EntityKennelTerryState_Nil: { + FP_Game_EntityTransitionState(game, entity, FP_EntityKennelTerryState_Idle); + } break; + + case FP_EntityKennelTerryState_Idle: { + if (entering_new_state) { + uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER; + FP_Game_EntityActionReset(game, entity->handle, duration_ms, render_data.sprite); + } + } break; + } + } break; + case FP_EntityType_Nil: break; + case FP_EntityType_Count: DQN_INVALID_CODE_PATH; break; } } @@ -1315,16 +1489,19 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input switch (entity->type) { case FP_EntityType_Terry: /*FALLTHRU*/ case FP_EntityType_Smoochie: /*FALLTHRU*/ + case FP_EntityType_Catfish: /*FALLTHRU*/ case FP_EntityType_Clinger: { // TODO(doyle): We should check if it's valid to enter this new state // from the entity's current state if (entity->type == FP_EntityType_Terry) { - FP_Game_EntityTransitionState(game, entity, FP_EntityTerryState_Attack); + FP_Game_EntityTransitionState(game, entity, FP_EntityTerryState_Attack); } else if (entity->type == FP_EntityType_Smoochie) { - FP_Game_EntityTransitionState(game, entity, FP_EntitySmoochieState_Attack); + FP_Game_EntityTransitionState(game, entity, FP_EntitySmoochieState_Attack); + } else if (entity->type == FP_EntityType_Catfish) { + FP_Game_EntityTransitionState(game, entity, FP_EntityCatfishState_Attack); } else { DQN_ASSERT(entity->type == FP_EntityType_Clinger); - FP_Game_EntityTransitionState(game, entity, FP_EntityClingerState_Attack); + FP_Game_EntityTransitionState(game, entity, FP_EntityClingerState_Attack); } entity->direction = best_attack_dir; @@ -1340,6 +1517,9 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input case FP_EntityType_MerchantGraveyard: break; case FP_EntityType_MerchantGym: break; case FP_EntityType_MerchantPhoneCompany: break; + case FP_EntityType_AirportTerry: + case FP_EntityType_ChurchTerry: + case FP_EntityType_KennelTerry: break; } } @@ -1375,10 +1555,29 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input if (entity->flags & FP_GameEntityFlag_CameraTracking) game->camera.world_pos = FP_Game_CalcEntityWorldPos(game, entity->handle) - Dqn_V2_InitV2I(platform->core.window_size) * .5f; + game->build_mode_can_place_building = false; if (game->build_mode) { - if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_E)) { - Dqn_Rect dest_rect = FP_Game_GetBuildingPlacementRectForEntity(game, entity->handle); - Dqn_V2 placement_pos = Dqn_Rect_Center(dest_rect); + + Dqn_Rect dest_rect = FP_Game_GetBuildingPlacementRectForEntity(game, entity->handle); + Dqn_V2 placement_pos = Dqn_Rect_Center(dest_rect); + + for (FP_GameEntityIterator zone_it = {}; + !game->build_mode_can_place_building && FP_Game_DFSPostOrderWalkEntityTree(game, &zone_it, game->root_entity); + ) { + FP_GameEntity *zone = zone_it.entity; + if ((zone->flags & FP_GameEntityFlag_BuildZone) == 0) + continue; + + Dqn_Rect zone_hit_box = FP_Game_CalcEntityWorldHitBox(game, zone->handle); + zone_hit_box.pos += dest_rect.size * .5f; + zone_hit_box.size -= dest_rect.size; + zone_hit_box.size = Dqn_V2_Max(zone_hit_box.size, Dqn_V2_Zero); + + game->build_mode_can_place_building = Dqn_Rect_ContainsPoint(zone_hit_box, placement_pos); + } + + if (game->build_mode_can_place_building && + TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_E)) { FP_Entity_CreateClubTerry(game, placement_pos, "Club Terry"); } } @@ -1439,15 +1638,19 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input } } else if (entity->spawn_list.size < entity->spawn_cap) { // NOTE: Spawn new entities if (input->timer_s >= entity->next_spawn_timestamp_s) { + uint64_t hp_adjustment = entity->current_wave - 1; entity->next_spawn_timestamp_s = DQN_CAST(uint64_t)(input->timer_s + 5.f); Dqn_V2 entity_world_pos = FP_Game_CalcEntityWorldPos(game, entity->handle); FP_SentinelListLink *link = FP_SentinelList_Make(&entity->spawn_list, game->chunk_pool); - if (Dqn_PCG32_NextF32(&game->rng) >= 0.5f) - link->data = FP_Entity_CreateClinger(game, entity_world_pos, "Clinger"); + Dqn_f32 mob_choice = Dqn_PCG32_NextF32(&game->rng); + if (mob_choice <= 0.33f) + link->data = FP_Entity_CreateClinger(game, entity_world_pos, hp_adjustment, "Clinger"); + else if (mob_choice <= 0.66f) + link->data = FP_Entity_CreateSmoochie(game, entity_world_pos, hp_adjustment, "Smoochie"); else - link->data = FP_Entity_CreateSmoochie(game, entity_world_pos, "Smoochie"); + link->data = FP_Entity_CreateCatfish(game, entity_world_pos, hp_adjustment, "Catfish"); // NOTE: Setup the mob with waypoints FP_GameEntity *mob = FP_Game_GetEntity(game, link->data); @@ -1499,12 +1702,17 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input bool permit_attack = true; switch (attacker->type) { case FP_EntityType_Smoochie: { - if (defender->type == FP_EntityType_Smoochie || defender->type == FP_EntityType_Clinger) + if (defender->type == FP_EntityType_Smoochie || defender->type == FP_EntityType_Clinger || defender->type == FP_EntityType_Catfish) + permit_attack = false; + } break; + + case FP_EntityType_Catfish: { + if (defender->type == FP_EntityType_Smoochie || defender->type == FP_EntityType_Clinger || defender->type == FP_EntityType_Catfish) permit_attack = false; } break; case FP_EntityType_Clinger: { - if (defender->type == FP_EntityType_Smoochie || defender->type == FP_EntityType_Clinger) + if (defender->type == FP_EntityType_Smoochie || defender->type == FP_EntityType_Clinger || defender->type == FP_EntityType_Catfish) permit_attack = false; } break; @@ -1518,6 +1726,9 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input case FP_EntityType_MerchantGym: break; case FP_EntityType_MerchantPhoneCompany: break; case FP_EntityType_Heart: break; + case FP_EntityType_AirportTerry: + case FP_EntityType_ChurchTerry: + case FP_EntityType_KennelTerry: break; } if (!permit_attack) @@ -1767,6 +1978,10 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer) FP_EntityRenderData club_terry_render_data = FP_Entity_GetRenderData(game, FP_EntityType_ClubTerry, FP_EntityClubTerryState_Idle, entity->direction); Dqn_Rect dest_rect = FP_Game_GetBuildingPlacementRectForEntity(game, entity->handle); + Dqn_V4 colour = game->build_mode_can_place_building ? + TELY_Colour_V4Alpha(TELY_COLOUR_WHITE_V4, 0.5f) : + TELY_Colour_V4Alpha(TELY_COLOUR_RED_V4, 0.5f); + TELY_Render_RectColourV4(renderer, dest_rect, TELY_RenderShapeMode_Fill, TELY_Colour_V4Alpha(TELY_COLOUR_BLUE_CADET_V4, 0.5f)); TELY_Render_TextureColourV4(renderer, club_terry_render_data.sheet->tex_handle, @@ -1774,7 +1989,7 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer) dest_rect, Dqn_V2_Zero /*rotate origin*/, 0.f /*rotation*/, - TELY_Colour_V4Alpha(TELY_COLOUR_WHITE_V4, 0.5f)); + colour); } // NOTE: Render hot/active entity ========================================================== @@ -1806,6 +2021,12 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer) } } } + + // NOTE: Add scanlines into the game for A E S T H E T I C S + Dqn_V2 screen_size = Dqn_V2_InitNx2(platform->core.window_size.w, platform->core.window_size.h); + Dqn_f32 scanline_gap = 4.0f; + Dqn_f32 scanline_thickness = 3.0f; + FP_GameRenderCameraFollowScanlines(renderer, screen_size, game->camera.world_pos, scanline_gap, scanline_thickness); } extern "C" __declspec(dllexport) diff --git a/feely_pona.h b/feely_pona.h index ee407a3..5c2f9bf 100644 --- a/feely_pona.h +++ b/feely_pona.h @@ -23,30 +23,60 @@ struct FP_Meters struct FP_GlobalAnimations { + Dqn_String8 airport_terry_alive = DQN_STRING8("airport_terry_alive"); + Dqn_String8 airport_terry_dark = DQN_STRING8("airport_terry_dark"); + + Dqn_String8 catfish_attack_down = DQN_STRING8("catfish_attack_down"); + Dqn_String8 catfish_attack_side = DQN_STRING8("catfish_attack_side"); + Dqn_String8 catfish_attack_up = DQN_STRING8("catfish_attack_up"); + Dqn_String8 catfish_death = DQN_STRING8("catfish_death"); + Dqn_String8 catfish_walk_up = DQN_STRING8("catfish_walk_up"); + Dqn_String8 catfish_walk_side = DQN_STRING8("catfish_walk_side"); + Dqn_String8 catfish_walk_down = DQN_STRING8("catfish_walk_down"); + Dqn_String8 clinger_attack_down = DQN_STRING8("clinger_attack_down"); Dqn_String8 clinger_attack_side = DQN_STRING8("clinger_attack_side"); Dqn_String8 clinger_attack_up = DQN_STRING8("clinger_attack_up"); - Dqn_String8 clinger_death = DQN_STRING8("clinger_death"); Dqn_String8 clinger_walk_up = DQN_STRING8("clinger_walk_up"); Dqn_String8 clinger_walk_down = DQN_STRING8("clinger_walk_down"); + Dqn_String8 church_terry_alive = DQN_STRING8("church_terry_alive"); + Dqn_String8 church_terry_dark = DQN_STRING8("church_terry_dark"); + Dqn_String8 club_terry_alive = DQN_STRING8("club_terry_alive"); Dqn_String8 club_terry_dark = DQN_STRING8("club_terry_dark"); Dqn_String8 heart = DQN_STRING8("heart"); Dqn_String8 heart_bleed = DQN_STRING8("heart_bleed"); + Dqn_String8 kennel_terry = DQN_STRING8("kennel_terry"); + Dqn_String8 map = DQN_STRING8("map"); - Dqn_String8 merchant_graveyard = DQN_STRING8("merchant_graveyard"); - Dqn_String8 merchant_gym = DQN_STRING8("merchant_gym"); - Dqn_String8 merchant_phone_company= DQN_STRING8("merchant_phone_company"); - Dqn_String8 merchant_terry = DQN_STRING8("merchant_terry"); + Dqn_String8 merchant_button_a = DQN_STRING8("merchant_button_a"); + Dqn_String8 merchant_button_b = DQN_STRING8("merchant_button_b"); + Dqn_String8 merchant_button_x = DQN_STRING8("merchant_button_x"); + Dqn_String8 merchant_button_y = DQN_STRING8("merchant_button_y"); + + Dqn_String8 merchant_graveyard = DQN_STRING8("merchant_graveyard"); + Dqn_String8 merchant_graveyard_menu = DQN_STRING8("merchant_graveyard"); + Dqn_String8 merchant_gym = DQN_STRING8("merchant_gym"); + Dqn_String8 merchant_gym_menu = DQN_STRING8("merchant_gym_menu"); + Dqn_String8 merchant_phone_company = DQN_STRING8("merchant_phone_company"); + Dqn_String8 merchant_phone_company_menu = DQN_STRING8("merchant_phone_company_menu"); + Dqn_String8 merchant_terry = DQN_STRING8("merchant_terry"); + Dqn_String8 merchant_terry_menu = DQN_STRING8("merchant_terry_menu"); Dqn_String8 shadow_long_circle = DQN_STRING8("shadow_long_circle"); Dqn_String8 shadow_tight_circle = DQN_STRING8("shadow_tight_circle"); + Dqn_String8 shrubbery_bush_1 = DQN_STRING8("shrubbery_bush_1"); + Dqn_String8 shrubbery_bush_2 = DQN_STRING8("shrubbery_bush_2"); + Dqn_String8 shrubbery_island_1 = DQN_STRING8("shrubbery_island_1"); + Dqn_String8 shrubbery_island_2 = DQN_STRING8("shrubbery_island_2"); + Dqn_String8 shrubbery_island_3 = DQN_STRING8("shrubbery_island_3"); + Dqn_String8 smoochie_walk_up = DQN_STRING8("smoochie_walk_up"); Dqn_String8 smoochie_walk_down = DQN_STRING8("smoochie_walk_down"); Dqn_String8 smoochie_walk_left = DQN_STRING8("smoochie_walk_left"); @@ -56,15 +86,18 @@ struct FP_GlobalAnimations Dqn_String8 smoochie_attack_heart = DQN_STRING8("smoochie_attack_heart"); Dqn_String8 smoochie_death = DQN_STRING8("smoochie_death"); - Dqn_String8 terry_attack_up = DQN_STRING8("terry_attack_up"); - Dqn_String8 terry_attack_side = DQN_STRING8("terry_attack_side"); - Dqn_String8 terry_attack_down = DQN_STRING8("terry_attack_down"); - - Dqn_String8 terry_walk_idle = DQN_STRING8("terry_walk_idle"); - Dqn_String8 terry_walk_up = DQN_STRING8("terry_walk_up"); - Dqn_String8 terry_walk_down = DQN_STRING8("terry_walk_down"); - Dqn_String8 terry_walk_left = DQN_STRING8("terry_walk_left"); - Dqn_String8 terry_walk_right = DQN_STRING8("terry_walk_right"); + Dqn_String8 terry_attack_up = DQN_STRING8("terry_attack_up"); + Dqn_String8 terry_attack_side = DQN_STRING8("terry_attack_side"); + Dqn_String8 terry_attack_down = DQN_STRING8("terry_attack_down"); + Dqn_String8 terry_attack_phone_up = DQN_STRING8("terry_attack_phone_up"); + Dqn_String8 terry_attack_phone_side = DQN_STRING8("terry_attack_phone_side"); + Dqn_String8 terry_attack_phone_down = DQN_STRING8("terry_attack_phone_down"); + Dqn_String8 terry_attack_phone_message = DQN_STRING8("terry_attack_phone_message"); + Dqn_String8 terry_walk_idle = DQN_STRING8("terry_walk_idle"); + Dqn_String8 terry_walk_up = DQN_STRING8("terry_walk_up"); + Dqn_String8 terry_walk_down = DQN_STRING8("terry_walk_down"); + Dqn_String8 terry_walk_left = DQN_STRING8("terry_walk_left"); + Dqn_String8 terry_walk_right = DQN_STRING8("terry_walk_right"); } g_anim_names; diff --git a/feely_pona_entity.h b/feely_pona_entity.h index 856cf58..3f5ef5f 100644 --- a/feely_pona_entity.h +++ b/feely_pona_entity.h @@ -6,16 +6,20 @@ enum FP_EntityType { FP_EntityType_Nil, + FP_EntityType_AirportTerry, + FP_EntityType_Catfish, + FP_EntityType_ChurchTerry, + FP_EntityType_Clinger, + FP_EntityType_ClubTerry, + FP_EntityType_Heart, + FP_EntityType_KennelTerry, FP_EntityType_Map, - FP_EntityType_Terry, - FP_EntityType_Smoochie, - FP_EntityType_MerchantTerry, FP_EntityType_MerchantGraveyard, FP_EntityType_MerchantGym, FP_EntityType_MerchantPhoneCompany, - FP_EntityType_ClubTerry, - FP_EntityType_Clinger, - FP_EntityType_Heart, + FP_EntityType_MerchantTerry, + FP_EntityType_Smoochie, + FP_EntityType_Terry, FP_EntityType_Count, }; @@ -24,6 +28,7 @@ enum FP_EntityTerryState FP_EntityTerryState_Nil, FP_EntityTerryState_Idle, FP_EntityTerryState_Attack, + FP_EntityTerryState_AttackPhone, FP_EntityTerryState_Run, FP_EntityTerryState_Dash, }; @@ -38,6 +43,15 @@ enum FP_EntitySmoochieState FP_EntitySmoochieState_Run, }; +enum FP_EntityCatfishState +{ + FP_EntityCatfishState_Nil, + FP_EntityCatfishState_Idle, + FP_EntityCatfishState_Attack, + FP_EntityCatfishState_Death, + FP_EntityCatfishState_Run, +}; + enum FP_EntityClingerState { FP_EntityClingerState_Nil, @@ -78,6 +92,26 @@ enum FP_EntityClubTerryState FP_EntityClubTerryState_PartyTime, }; +enum FP_EntityAirportTerryState +{ + FP_EntityAirportTerryState_Nil, + FP_EntityAirportTerryState_Idle, + FP_EntityAirportTerryState_FlyPassenger, +}; + +enum FP_EntityChurchTerryState +{ + FP_EntityChurchTerryState_Nil, + FP_EntityChurchTerryState_Idle, + FP_EntityChurchTerryState_ConvertPatron, +}; + +enum FP_EntityKennelTerryState +{ + FP_EntityKennelTerryState_Nil, + FP_EntityKennelTerryState_Idle, +}; + enum FP_EntityMapState { FP_EntityMapState_Nil, diff --git a/feely_pona_entity_create.cpp b/feely_pona_entity_create.cpp index 51ebc29..a3d4d4a 100644 --- a/feely_pona_entity_create.cpp +++ b/feely_pona_entity_create.cpp @@ -39,7 +39,17 @@ FP_EntityRenderData FP_Entity_GetRenderData(FP_Game *game, FP_EntityType type, u } } break; - case FP_EntityTerryState_Run: /*FALLTHRU*/ + case FP_EntityTerryState_AttackPhone: { + switch (direction) { + case FP_GameDirection_Up: result.anim_name = g_anim_names.terry_attack_phone_up; break; + case FP_GameDirection_Down: result.anim_name = g_anim_names.terry_attack_phone_down; break; + case FP_GameDirection_Left: result.anim_name = g_anim_names.terry_attack_phone_side; break; + case FP_GameDirection_Right: result.anim_name = g_anim_names.terry_attack_phone_side; result.flip = TELY_AssetFlip_X; break; + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } break; + + case FP_EntityTerryState_Run: /*FALLTHRU*/ case FP_EntityTerryState_Dash: { switch (direction) { case FP_GameDirection_Up: result.anim_name = g_anim_names.terry_walk_up; break; @@ -160,6 +170,63 @@ FP_EntityRenderData FP_Entity_GetRenderData(FP_Game *game, FP_EntityType type, u } } break; + case FP_EntityType_AirportTerry: { + result.height.meters = 4.f; + FP_EntityAirportTerryState state = DQN_CAST(FP_EntityAirportTerryState)raw_state; + switch (state) { + case FP_EntityAirportTerryState_Nil: break; + case FP_EntityAirportTerryState_Idle: result.anim_name = g_anim_names.airport_terry_dark; break; + case FP_EntityAirportTerryState_FlyPassenger: result.anim_name = g_anim_names.airport_terry_alive; break; + } + } break; + + case FP_EntityType_Catfish: { + result.height.meters = 1.6f; + FP_EntityCatfishState state = DQN_CAST(FP_EntityCatfishState)raw_state; + switch (state) { + case FP_EntityCatfishState_Nil: + case FP_EntityCatfishState_Idle: result.anim_name = g_anim_names.catfish_walk_down; break; + case FP_EntityCatfishState_Attack: { + switch (direction) { + case FP_GameDirection_Up: result.anim_name = g_anim_names.catfish_attack_up; break; + case FP_GameDirection_Down: result.anim_name = g_anim_names.catfish_attack_down; break; + case FP_GameDirection_Left: result.anim_name = g_anim_names.catfish_attack_side; result.flip = TELY_AssetFlip_X; break; + case FP_GameDirection_Right: result.anim_name = g_anim_names.catfish_attack_side; break; + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } break; + case FP_EntityCatfishState_Death: result.anim_name = g_anim_names.catfish_death; break; + case FP_EntityCatfishState_Run: { + switch (direction) { + case FP_GameDirection_Up: result.anim_name = g_anim_names.catfish_walk_up; break; + case FP_GameDirection_Down: result.anim_name = g_anim_names.catfish_walk_down; break; + case FP_GameDirection_Left: result.anim_name = g_anim_names.catfish_walk_side; break; + case FP_GameDirection_Right: result.anim_name = g_anim_names.catfish_walk_side; result.flip = TELY_AssetFlip_X; break; + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } break; + } + } break; + + case FP_EntityType_ChurchTerry: { + result.height.meters = 4.f; + FP_EntityChurchTerryState state = DQN_CAST(FP_EntityChurchTerryState)raw_state; + switch (state) { + case FP_EntityChurchTerryState_Nil: break; + case FP_EntityChurchTerryState_Idle: result.anim_name = g_anim_names.church_terry_dark; break; + case FP_EntityChurchTerryState_ConvertPatron: result.anim_name = g_anim_names.church_terry_alive; break; + } + } break; + + case FP_EntityType_KennelTerry: { + result.height.meters = 4.f; + FP_EntityKennelTerryState state = DQN_CAST(FP_EntityKennelTerryState)raw_state; + switch (state) { + case FP_EntityKennelTerryState_Nil: break; + case FP_EntityKennelTerryState_Idle: result.anim_name = g_anim_names.kennel_terry; break; + } + } break; + case FP_EntityType_Count: DQN_INVALID_CODE_PATH; break; } @@ -207,7 +274,7 @@ static FP_GameEntityHandle FP_Entity_CreateWaypointF(FP_Game *game, Dqn_V2 pos, return result; } -static FP_GameEntityHandle FP_Entity_CreateClinger(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +static FP_GameEntityHandle FP_Entity_CreateClinger(FP_Game *game, Dqn_V2 pos, uint64_t hp_adjustment, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) { va_list args; va_start(args, fmt); @@ -216,7 +283,7 @@ static FP_GameEntityHandle FP_Entity_CreateClinger(FP_Game *game, Dqn_V2 pos, DQ va_end(args); entity->type = FP_EntityType_Clinger; - entity->hp = 1; + entity->hp = 1 + hp_adjustment; entity->is_dying = false; entity->base_acceleration_per_s.meters = 8.f; entity->local_pos = pos; @@ -230,7 +297,7 @@ static FP_GameEntityHandle FP_Entity_CreateClinger(FP_Game *game, Dqn_V2 pos, DQ return result; } -static FP_GameEntityHandle FP_Entity_CreateSmoochie(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +static FP_GameEntityHandle FP_Entity_CreateSmoochie(FP_Game *game, Dqn_V2 pos, uint64_t hp_adjustment, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) { va_list args; va_start(args, fmt); @@ -240,7 +307,29 @@ static FP_GameEntityHandle FP_Entity_CreateSmoochie(FP_Game *game, Dqn_V2 pos, D entity->type = FP_EntityType_Smoochie; entity->base_acceleration_per_s.meters = 8.f; - entity->hp = 1; + entity->hp = 1 + hp_adjustment; + entity->is_dying = false; + entity->local_pos = pos; + entity->sprite_height = FP_Entity_GetRenderData(game, entity->type, 0 /*state*/, FP_GameDirection_Down).height; + entity->attack_cooldown_ms = 1000; + entity->local_hit_box_size = FP_Game_MetersToPixelsNx2(game, 0.4f, entity->sprite_height.meters * .6f); + FP_Entity_AddDebugEditorFlags(game, entity->handle); + entity->flags |= FP_GameEntityFlag_NonTraversable; + entity->flags |= FP_GameEntityFlag_Attackable; + return result; +} + +static FP_GameEntityHandle FP_Entity_CreateCatfish(FP_Game *game, Dqn_V2 pos, uint64_t hp_adjustment, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args); + FP_GameEntityHandle result = entity->handle; + va_end(args); + + entity->type = FP_EntityType_Catfish; + entity->base_acceleration_per_s.meters = 8.f; + entity->hp = 1 + hp_adjustment; entity->is_dying = false; entity->local_pos = pos; entity->sprite_height = FP_Entity_GetRenderData(game, entity->type, 0 /*state*/, FP_GameDirection_Down).height; @@ -499,3 +588,75 @@ static FP_GameEntityHandle FP_Entity_CreateHeart(FP_Game *game, Dqn_V2 pos, DQN_ entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w - (sprite_rect_scaled.w * .3f), sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f)); return result; } + +static FP_GameEntityHandle FP_Entity_CreateChurchTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args); + FP_GameEntityHandle result = entity->handle; + va_end(args); + + entity->type = FP_EntityType_ChurchTerry; + entity->local_pos = pos; + entity->sprite_height = FP_Entity_GetRenderData(game, entity->type, 0 /*state*/, FP_GameDirection_Down).height; + FP_Entity_AddDebugEditorFlags(game, result); + entity->flags |= FP_GameEntityFlag_NonTraversable; + + TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.church_terry_alive); + Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index]; + Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect); + Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale; + + entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f); + entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f)); + return result; +} + +static FP_GameEntityHandle FP_Entity_CreateKennelTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args); + FP_GameEntityHandle result = entity->handle; + va_end(args); + + entity->type = FP_EntityType_KennelTerry; + entity->local_pos = pos; + entity->sprite_height = FP_Entity_GetRenderData(game, entity->type, 0 /*state*/, FP_GameDirection_Down).height; + FP_Entity_AddDebugEditorFlags(game, result); + entity->flags |= FP_GameEntityFlag_NonTraversable; + + TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.church_terry_alive); + Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index]; + Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect); + Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale; + + entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f); + entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f)); + return result; +} + +static FP_GameEntityHandle FP_Entity_CreateAirportTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args); + FP_GameEntityHandle result = entity->handle; + va_end(args); + + entity->type = FP_EntityType_AirportTerry; + entity->local_pos = pos; + entity->sprite_height = FP_Entity_GetRenderData(game, entity->type, 0 /*state*/, FP_GameDirection_Down).height; + FP_Entity_AddDebugEditorFlags(game, result); + entity->flags |= FP_GameEntityFlag_NonTraversable; + + TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.church_terry_alive); + Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index]; + Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect); + Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale; + + entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f); + entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f)); + return result; +} diff --git a/feely_pona_game.cpp b/feely_pona_game.cpp index 42e22fc..4ee401c 100644 --- a/feely_pona_game.cpp +++ b/feely_pona_game.cpp @@ -767,3 +767,33 @@ static void FP_Game_EntityTransitionState(FP_Game *game, FP_GameEntity *entity, // NOTE: If no returns are hit above we proceed with the state change entity->action.next_state = desired_state; } + +static void FP_GameRenderScanlines(TELY_Renderer *renderer, Dqn_f32 scanline_gap, Dqn_f32 scanline_thickness, + Dqn_V2 screen_size, Dqn_V2 camera_offset) +{ + Dqn_f32 scanline_interval = scanline_gap + scanline_thickness; + Dqn_f32 y_offset = fmodf(camera_offset.y, scanline_interval); + + for (Dqn_f32 y = -y_offset; y < screen_size.h; y += scanline_interval) + { + Dqn_V2 start = Dqn_V2_InitNx2(0, y); + Dqn_V2 end = Dqn_V2_InitNx2(screen_size.w, y); + TELY_Render_LineColourV4(renderer, start, end, TELY_Colour_V4Alpha(TELY_COLOUR_WHITE_V4, 0.5f), scanline_thickness); + } +} + +static void FP_GameRenderCameraFollowScanlines(TELY_Renderer *renderer, Dqn_V2 screen_size, Dqn_V2 camera_offset, Dqn_f32 scanline_gap, Dqn_f32 scanline_thickness) +{ + Dqn_f32 y_offset = camera_offset.y; + + // Adjust starting y to be more negative + Dqn_f32 starting_y = -screen_size.h - 150 - y_offset; + + for (Dqn_f32 y = starting_y; y < screen_size.h; y += scanline_gap + scanline_thickness) + { + Dqn_V2 start = Dqn_V2_InitNx2(camera_offset.x, y + camera_offset.y); + Dqn_V2 end = Dqn_V2_InitNx2(screen_size.w + camera_offset.x, y + camera_offset.y); + + TELY_Render_LineColourV4(renderer, start, end, TELY_Colour_V4Alpha(TELY_COLOUR_BLACK_V4, 0.5f), scanline_thickness); + } +} diff --git a/feely_pona_game.h b/feely_pona_game.h index 13b42c7..50b1402 100644 --- a/feely_pona_game.h +++ b/feely_pona_game.h @@ -256,7 +256,8 @@ struct FP_Game uint64_t clock_ms; Dqn_PCG32 rng; - bool build_mode; + bool build_mode; + bool build_mode_can_place_building; }; struct FP_GameAStarNode diff --git a/project.rdbg b/project.rdbg index 33e9f5e..2f87f4b 100644 Binary files a/project.rdbg and b/project.rdbg differ