diff --git a/Data/Textures/atlas.png b/Data/Textures/atlas.png index dc8d75c..dd1eb97 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:5436ad62eee81687f1fc76aed68a5eb8e1aad4c0c4ed1029755f1e83f5ba0478 -size 14087150 +oid sha256:3f25c65541654b96e2e3942aa1ac45b670940487c7d388c699c49fc6884f03ee +size 14756150 diff --git a/Data/Textures/atlas.txt b/Data/Textures/atlas.txt index 532704d..6ed1e5a 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:68f816493ec7f3dd841c92a57557e42729cf5e05c4a421847a721eda8cb86a39 -size 11548 +oid sha256:1cfbacdb431bd35e6e435d0282b9619b208f4565cb7c4ba63795dc4e700ad0b2 +size 14082 diff --git a/Data/Textures/atlas/end_screen.png b/Data/Textures/atlas/end_screen.png index d919a53..d5282a0 100644 --- a/Data/Textures/atlas/end_screen.png +++ b/Data/Textures/atlas/end_screen.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4495df5d3c52cb55e6ea8db061d390779aa3de09277526baaef5fbb4f51f8043 -size 167029 +oid sha256:d7b9001c8591fbbb406054e0d2253ac5a58d012d98e0c89915299ae551a21232 +size 99584 diff --git a/Data/Textures/atlas/perry_attack_down_1.png b/Data/Textures/atlas/perry_attack_down_1.png new file mode 100644 index 0000000..a0c1b63 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_down_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00fd6ec5d122a388868fa1cab73154927016777b7392c986051d1186c486a609 +size 20336 diff --git a/Data/Textures/atlas/perry_attack_down_2.png b/Data/Textures/atlas/perry_attack_down_2.png new file mode 100644 index 0000000..acc0b72 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_down_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efe341f51f889894667a9a8c0f684d2f9370826f8d666153011224bfc51162c7 +size 22680 diff --git a/Data/Textures/atlas/perry_attack_down_3.png b/Data/Textures/atlas/perry_attack_down_3.png new file mode 100644 index 0000000..643059b --- /dev/null +++ b/Data/Textures/atlas/perry_attack_down_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0131f61edf3ee517cfd5064178c2f6c45bb883335aef80d4bf2ea109c045b8a +size 20076 diff --git a/Data/Textures/atlas/perry_attack_phone_down_1.png b/Data/Textures/atlas/perry_attack_phone_down_1.png new file mode 100644 index 0000000..d5ff79b --- /dev/null +++ b/Data/Textures/atlas/perry_attack_phone_down_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcac0765bc53bd393a854f61cf90f05a4a1bb0e1e2a661ae862a26b33fc33953 +size 13016 diff --git a/Data/Textures/atlas/perry_attack_phone_down_2.png b/Data/Textures/atlas/perry_attack_phone_down_2.png new file mode 100644 index 0000000..e9cda2f --- /dev/null +++ b/Data/Textures/atlas/perry_attack_phone_down_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9af660a0bd1893aec57be18414cd0f3400ffe1a7e92bd4feb8ca7625d7b761ab +size 13115 diff --git a/Data/Textures/atlas/perry_attack_phone_side_1.png b/Data/Textures/atlas/perry_attack_phone_side_1.png new file mode 100644 index 0000000..e6237fa --- /dev/null +++ b/Data/Textures/atlas/perry_attack_phone_side_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cc51386b51c2afd81a04e5af7c061174589a4a60a1017ea33cbde28c2304521 +size 11625 diff --git a/Data/Textures/atlas/perry_attack_phone_side_2.png b/Data/Textures/atlas/perry_attack_phone_side_2.png new file mode 100644 index 0000000..0be88cb --- /dev/null +++ b/Data/Textures/atlas/perry_attack_phone_side_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b67e06c5fb1409dd7f648eb379e63d38f2c25eaf0cfa809c020598aa82f63bc +size 12994 diff --git a/Data/Textures/atlas/perry_attack_phone_up_1.png b/Data/Textures/atlas/perry_attack_phone_up_1.png new file mode 100644 index 0000000..c7c5573 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_phone_up_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b124f007b51f22299c08f28743703c8bd12e1d1d0f4c1ec0fb744ca40ba7d62c +size 11285 diff --git a/Data/Textures/atlas/perry_attack_phone_up_2.png b/Data/Textures/atlas/perry_attack_phone_up_2.png new file mode 100644 index 0000000..e717ee4 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_phone_up_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b23da1f827bc5d657f01ad344436716c550b759210c498b0c267e226d37e7461 +size 12498 diff --git a/Data/Textures/atlas/perry_attack_side_1.png b/Data/Textures/atlas/perry_attack_side_1.png new file mode 100644 index 0000000..594d7ef --- /dev/null +++ b/Data/Textures/atlas/perry_attack_side_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d4e575d17d65902c5d5f996265313c1502f22d0bd9d39e2d2ca0809b4b4e52b +size 17274 diff --git a/Data/Textures/atlas/perry_attack_side_2.png b/Data/Textures/atlas/perry_attack_side_2.png new file mode 100644 index 0000000..d7ee340 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_side_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1363111c3da2d541cc80f2d2790475c13a739dc1252ccf66f2b4ac07b5c5a226 +size 15670 diff --git a/Data/Textures/atlas/perry_attack_side_3.png b/Data/Textures/atlas/perry_attack_side_3.png new file mode 100644 index 0000000..941691f --- /dev/null +++ b/Data/Textures/atlas/perry_attack_side_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8830775d3bb631de5e5620d330eb6b6a06c6e94973aa14f286564157c2661541 +size 16787 diff --git a/Data/Textures/atlas/perry_attack_up_1.png b/Data/Textures/atlas/perry_attack_up_1.png new file mode 100644 index 0000000..224d547 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_up_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c83739e2231a5db14ffc34c015a6c370d53915705604caf33b836fc83909c2a6 +size 12230 diff --git a/Data/Textures/atlas/perry_attack_up_2.png b/Data/Textures/atlas/perry_attack_up_2.png new file mode 100644 index 0000000..1f7b8b2 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_up_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07697c0491a891965195d1be25bc1d6f00ec5f515090916b13bab8b6fde24e39 +size 17318 diff --git a/Data/Textures/atlas/perry_attack_up_3.png b/Data/Textures/atlas/perry_attack_up_3.png new file mode 100644 index 0000000..ad5b562 --- /dev/null +++ b/Data/Textures/atlas/perry_attack_up_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdc94be90579bcb031a113d41e1d701e06ee397c04068ae0ce65f8020d057550 +size 18368 diff --git a/Data/Textures/atlas/perry_death_1.png b/Data/Textures/atlas/perry_death_1.png new file mode 100644 index 0000000..4d7f937 --- /dev/null +++ b/Data/Textures/atlas/perry_death_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59630a53eb15f53f80d4c9aef9cc20fa230d2f9c5c72587e73ffd3c317adc9f9 +size 12908 diff --git a/Data/Textures/atlas/perry_death_2.png b/Data/Textures/atlas/perry_death_2.png new file mode 100644 index 0000000..cbc1388 --- /dev/null +++ b/Data/Textures/atlas/perry_death_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c41bc704894d3056f06ea4d5fc326aacd70343af60cc1514b3d2db361d80642c +size 12526 diff --git a/Data/Textures/atlas/perry_death_3.png b/Data/Textures/atlas/perry_death_3.png new file mode 100644 index 0000000..a18f4dc --- /dev/null +++ b/Data/Textures/atlas/perry_death_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f771446dbd257fd8d12e5cbd63ac4e7492b74620e5428184a5f38b31385291a +size 10924 diff --git a/Data/Textures/atlas/perry_death_4.png b/Data/Textures/atlas/perry_death_4.png new file mode 100644 index 0000000..0f97427 --- /dev/null +++ b/Data/Textures/atlas/perry_death_4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae86185bd79fdcfec9cff1d52ce5fe3104ddcd75a7f5666577eeabd3c4dee1bb +size 6707 diff --git a/Data/Textures/atlas/perry_death_5.png b/Data/Textures/atlas/perry_death_5.png new file mode 100644 index 0000000..50f70c3 --- /dev/null +++ b/Data/Textures/atlas/perry_death_5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b71cce8f5bb081355fceea5ac8363424def1e725c4f88755b2ed37998106219f +size 6360 diff --git a/Data/Textures/atlas/perry_ghost_1.png b/Data/Textures/atlas/perry_ghost_1.png new file mode 100644 index 0000000..fad2d33 --- /dev/null +++ b/Data/Textures/atlas/perry_ghost_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc37f5e09d516475df17c989701e7ea6bafb35e196aeb65dfb2704053cada33c +size 11515 diff --git a/Data/Textures/atlas/perry_ghost_2.png b/Data/Textures/atlas/perry_ghost_2.png new file mode 100644 index 0000000..38c1cce --- /dev/null +++ b/Data/Textures/atlas/perry_ghost_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2106a904f671d0b1c1a911fc25349812ad3bf6633625397ad52d00d1501b19c6 +size 12040 diff --git a/Data/Textures/atlas/perry_ghost_3.png b/Data/Textures/atlas/perry_ghost_3.png new file mode 100644 index 0000000..34bf153 --- /dev/null +++ b/Data/Textures/atlas/perry_ghost_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8086a2784b875ce37d721ed625c7c5c137cbfd2f79c60a1b02e249479b999eaa +size 11391 diff --git a/Data/Textures/atlas/perry_pat_dog_1.png b/Data/Textures/atlas/perry_pat_dog_1.png new file mode 100644 index 0000000..dc7dd80 --- /dev/null +++ b/Data/Textures/atlas/perry_pat_dog_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64489f546a417bfa7c9c294363897829e59d1d84b8a55a7925f5def64357d58e +size 10434 diff --git a/Data/Textures/atlas/perry_pat_dog_2.png b/Data/Textures/atlas/perry_pat_dog_2.png new file mode 100644 index 0000000..79a99d5 --- /dev/null +++ b/Data/Textures/atlas/perry_pat_dog_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56b62d1f6d2ed82a819e24c99c6d589366ce3a0a2476dc085e139745cf0e4a97 +size 10094 diff --git a/Data/Textures/atlas/perry_walk_down_1.png b/Data/Textures/atlas/perry_walk_down_1.png new file mode 100644 index 0000000..ea50c7b --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d662c87d59859fadd83afafab92051c859b874381fdf3510bca4f6f22db8a04d +size 14048 diff --git a/Data/Textures/atlas/perry_walk_down_2.png b/Data/Textures/atlas/perry_walk_down_2.png new file mode 100644 index 0000000..3540899 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff54f2661e8465792581155757f204e098712d9ed820ef5b9d855c44f60ffd4d +size 15166 diff --git a/Data/Textures/atlas/perry_walk_down_3.png b/Data/Textures/atlas/perry_walk_down_3.png new file mode 100644 index 0000000..5fd1787 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a26d91ccf15a524337a33b6c68716d7daf94bb041ec1fafeeed60726237da8a +size 14318 diff --git a/Data/Textures/atlas/perry_walk_down_4.png b/Data/Textures/atlas/perry_walk_down_4.png new file mode 100644 index 0000000..78d7f22 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:319734ba38bf075478f59024e12ddc730af8441c5fbca43457a2250a67cf2c61 +size 14727 diff --git a/Data/Textures/atlas/perry_walk_down_5.png b/Data/Textures/atlas/perry_walk_down_5.png new file mode 100644 index 0000000..2384876 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ec8b877256ea06dae9d510b587b9629063ae5c2b04515a93ab96d0084d1370b +size 14367 diff --git a/Data/Textures/atlas/perry_walk_down_6.png b/Data/Textures/atlas/perry_walk_down_6.png new file mode 100644 index 0000000..3c14c3e --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_6.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48f03327b2c2ce211c0e776d8e071ae6f4951dd13ce4286ff5862b9b5b1e86c1 +size 14032 diff --git a/Data/Textures/atlas/perry_walk_down_7.png b/Data/Textures/atlas/perry_walk_down_7.png new file mode 100644 index 0000000..c86cd2f --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_7.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78ac53727229017dffb876b9e7cae5d3d4fcdc2c720bd5fbfab049b7322efa28 +size 15196 diff --git a/Data/Textures/atlas/perry_walk_down_8.png b/Data/Textures/atlas/perry_walk_down_8.png new file mode 100644 index 0000000..2239d98 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_8.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07d4f3fafe5d1de4333195d22a79cacbd304f1532f95a0b7caa4e8fbd235fc5d +size 14283 diff --git a/Data/Textures/atlas/perry_walk_down_9.png b/Data/Textures/atlas/perry_walk_down_9.png new file mode 100644 index 0000000..7c896d1 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_down_9.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:825dbf976e5a8d5f3f9ae17a5bc1638314a3f9996cd29dd503ca5077c0ef1b98 +size 14388 diff --git a/Data/Textures/atlas/perry_walk_idle_1.png b/Data/Textures/atlas/perry_walk_idle_1.png new file mode 100644 index 0000000..08b7686 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4af4d4586a41dea91799a48dd55fb594c87eeba19926e279d7581a66e22a5f1a +size 16931 diff --git a/Data/Textures/atlas/perry_walk_idle_2.png b/Data/Textures/atlas/perry_walk_idle_2.png new file mode 100644 index 0000000..a451574 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7f726cec6f8ec7b4a7350521d61302ac58ae554117f0df9c941f4f7b43eabbd +size 16250 diff --git a/Data/Textures/atlas/perry_walk_idle_3.png b/Data/Textures/atlas/perry_walk_idle_3.png new file mode 100644 index 0000000..5512467 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07763afe9ed0951a3accdbeb8ac3421189adc85ab4653e1f38be88e5dfa4ccea +size 15764 diff --git a/Data/Textures/atlas/perry_walk_idle_4.png b/Data/Textures/atlas/perry_walk_idle_4.png new file mode 100644 index 0000000..ce267a1 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f77867d6b4f189edffe9b597d659566bd41b65fd64332ad931079390694482f +size 16336 diff --git a/Data/Textures/atlas/perry_walk_idle_5.png b/Data/Textures/atlas/perry_walk_idle_5.png new file mode 100644 index 0000000..8d70709 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e6ccfd4731d98a981513d3e44867b2ec28fad295a0b2854ce7d35efbd5101a6 +size 16931 diff --git a/Data/Textures/atlas/perry_walk_idle_6.png b/Data/Textures/atlas/perry_walk_idle_6.png new file mode 100644 index 0000000..2610f33 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_6.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3e4ff2a066bb66f06fffd6c812d19363197ebda65d68216e9677fac7a2e5265 +size 16277 diff --git a/Data/Textures/atlas/perry_walk_idle_7.png b/Data/Textures/atlas/perry_walk_idle_7.png new file mode 100644 index 0000000..a494cdf --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_7.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27ca916c43bd03560e9c8c5ee7f3db3ba7d996ebed7dc46165abfff29c8625bb +size 15690 diff --git a/Data/Textures/atlas/perry_walk_idle_8.png b/Data/Textures/atlas/perry_walk_idle_8.png new file mode 100644 index 0000000..181a54b --- /dev/null +++ b/Data/Textures/atlas/perry_walk_idle_8.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb1ae725f2cc0583c886408b8df0ba9f2dc684bca7b43ea80c12e03b0f815092 +size 16354 diff --git a/Data/Textures/atlas/perry_walk_right_1.png b/Data/Textures/atlas/perry_walk_right_1.png new file mode 100644 index 0000000..e096275 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_right_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b3f8cc672df10b17f82035e44ae60a89ce3b463d04e91db587e96a5af614448 +size 13283 diff --git a/Data/Textures/atlas/perry_walk_right_2.png b/Data/Textures/atlas/perry_walk_right_2.png new file mode 100644 index 0000000..cfe36af --- /dev/null +++ b/Data/Textures/atlas/perry_walk_right_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89c63137398f482ad72dc1889d761ad64ca294e9470b30e926f5213d251b877d +size 11836 diff --git a/Data/Textures/atlas/perry_walk_right_3.png b/Data/Textures/atlas/perry_walk_right_3.png new file mode 100644 index 0000000..688aa03 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_right_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9545429957c6da7b6721207a25cbdf18efc7321f408b7705fcb9e3a12896e17b +size 11825 diff --git a/Data/Textures/atlas/perry_walk_right_4.png b/Data/Textures/atlas/perry_walk_right_4.png new file mode 100644 index 0000000..c6ed3af --- /dev/null +++ b/Data/Textures/atlas/perry_walk_right_4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57b4ec7b800efa35bff736dcbf9b8cfbf61c7c46a749b3218bdd5287655c213a +size 12941 diff --git a/Data/Textures/atlas/perry_walk_right_5.png b/Data/Textures/atlas/perry_walk_right_5.png new file mode 100644 index 0000000..b2ae2ef --- /dev/null +++ b/Data/Textures/atlas/perry_walk_right_5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:144c9883a39c752c852b05bf8da59d225e30ab370361d01c55c9214ab37de939 +size 11471 diff --git a/Data/Textures/atlas/perry_walk_right_6.png b/Data/Textures/atlas/perry_walk_right_6.png new file mode 100644 index 0000000..eb55852 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_right_6.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c38a52355e9cec705006b0c6d527bb85c23244e17dabe0a8bcd43d96a98c03c +size 12004 diff --git a/Data/Textures/atlas/perry_walk_right_7.png b/Data/Textures/atlas/perry_walk_right_7.png new file mode 100644 index 0000000..ff8fc4d --- /dev/null +++ b/Data/Textures/atlas/perry_walk_right_7.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da3018ac88ae57f541b8fbe09ff80b3840f270135f3b5dbd5201e19939fd6f7b +size 12690 diff --git a/Data/Textures/atlas/perry_walk_up_1.png b/Data/Textures/atlas/perry_walk_up_1.png new file mode 100644 index 0000000..b464f7f --- /dev/null +++ b/Data/Textures/atlas/perry_walk_up_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38a2c960bea561696fff0b7d8a77e6aed61409be77957627038773d85f5c0e18 +size 12250 diff --git a/Data/Textures/atlas/perry_walk_up_2.png b/Data/Textures/atlas/perry_walk_up_2.png new file mode 100644 index 0000000..2da08bd --- /dev/null +++ b/Data/Textures/atlas/perry_walk_up_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a265460e37f997afb827723403b5a743ebcf41c4592362d5e2297ef6f293f8e0 +size 12657 diff --git a/Data/Textures/atlas/perry_walk_up_3.png b/Data/Textures/atlas/perry_walk_up_3.png new file mode 100644 index 0000000..9ab037d --- /dev/null +++ b/Data/Textures/atlas/perry_walk_up_3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20ce95beb8875c72e4a9e708ca154b2aed58b02ca77234ff2edbc0c23564fe54 +size 12866 diff --git a/Data/Textures/atlas/perry_walk_up_4.png b/Data/Textures/atlas/perry_walk_up_4.png new file mode 100644 index 0000000..d7bc6e1 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_up_4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f36da54df5d921102a07c70c3806924b0cddff2a60ea8c8c3f7cd9c90ca77f2 +size 12189 diff --git a/Data/Textures/atlas/perry_walk_up_5.png b/Data/Textures/atlas/perry_walk_up_5.png new file mode 100644 index 0000000..07bdd8b --- /dev/null +++ b/Data/Textures/atlas/perry_walk_up_5.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c9327f8f1862ff59fb363096eed280ef76ef51515cad6568cb28f9ee44aa80f +size 12572 diff --git a/Data/Textures/atlas/perry_walk_up_6.png b/Data/Textures/atlas/perry_walk_up_6.png new file mode 100644 index 0000000..82c9429 --- /dev/null +++ b/Data/Textures/atlas/perry_walk_up_6.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64b421b4c3307a6293be0063cc945cb358bb1008b678c5614273b5ec31597f13 +size 12423 diff --git a/Data/Textures/sprite_spec.txt b/Data/Textures/sprite_spec.txt index 6310904..8079793 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:a3f725440d3bf2ac004d94435c83ead94f4d65b248c7bea93296920c9e65d26c -size 1970 +oid sha256:20660032328425a538cfbb94dd6b83e74708c55489473ec27d5dc050f21a8cf1 +size 2230 diff --git a/build_assets.bat b/build_assets.bat index 6ba4949..bfa24ea 100644 --- a/build_assets.bat +++ b/build_assets.bat @@ -10,4 +10,4 @@ if not exist "%sprite_packer%" ( exit /B 1 ) -%sprite_packer% 5100x5100 %script_dir%\Data\Textures\sprite_spec.txt %script_dir%\Data\Textures\atlas || exit /b 1 +%sprite_packer% 5200x5200 %script_dir%\Data\Textures\sprite_spec.txt %script_dir%\Data\Textures\atlas || exit /b 1 diff --git a/feely_pona.cpp b/feely_pona.cpp index ac8ae0d..aa18f3e 100644 --- a/feely_pona.cpp +++ b/feely_pona.cpp @@ -91,17 +91,16 @@ static TELY_AssetSpriteSheet FP_LoadSpriteSheetFromSpec(TELY_Platform *platform, static void FP_SetDefaultGamepadBindings(FP_GameControls *controls) { - controls->up.gamepad_key = TELY_PlatformInputGamepadKey_DUp; - controls->down.gamepad_key = TELY_PlatformInputGamepadKey_DDown; - controls->left.gamepad_key = TELY_PlatformInputGamepadKey_DLeft; - controls->right.gamepad_key = TELY_PlatformInputGamepadKey_DRight; - controls->attack.gamepad_key = TELY_PlatformInputGamepadKey_X; - controls->range_attack.gamepad_key = TELY_PlatformInputGamepadKey_Y; - controls->build_mode.gamepad_key = TELY_PlatformInputGamepadKey_L3; - controls->strafe.gamepad_key = TELY_PlatformInputGamepadKey_B; - controls->dash.gamepad_key = TELY_PlatformInputGamepadKey_A; - controls->buy_building.gamepad_key = TELY_PlatformInputGamepadKey_LeftBumper; - controls->buy_upgrade.gamepad_key = TELY_PlatformInputGamepadKey_RightBumper; + // NOTE: Note up/down/left/right uses analog sticks, non-negotiable. + controls->attack.gamepad_key = TELY_PlatformInputGamepadKey_X; + controls->range_attack.gamepad_key = TELY_PlatformInputGamepadKey_Y; + controls->build_mode.gamepad_key = TELY_PlatformInputGamepadKey_L3; + controls->strafe.gamepad_key = TELY_PlatformInputGamepadKey_B; + controls->dash.gamepad_key = TELY_PlatformInputGamepadKey_A; + controls->buy_building.gamepad_key = TELY_PlatformInputGamepadKey_LeftBumper; + controls->buy_upgrade.gamepad_key = TELY_PlatformInputGamepadKey_RightBumper; + controls->move_building_ui_cursor_left.gamepad_key = TELY_PlatformInputGamepadKey_DLeft; + controls->move_building_ui_cursor_right.gamepad_key = TELY_PlatformInputGamepadKey_DRight; } static bool FP_ListenForNewPlayer(TELY_PlatformInput *input, FP_Game *game) @@ -123,7 +122,14 @@ static bool FP_ListenForNewPlayer(TELY_PlatformInput *input, FP_Game *game) bool gamepad_pressed = TELY_Platform_InputGamepadKeyIsPressed(input, gamepad_index, TELY_PlatformInputGamepadKey_Start); if (keyboard_pressed || gamepad_pressed) { - FP_GameEntityHandle terry_handle = FP_Entity_CreateTerry(game, Dqn_V2_InitNx2(1380, 11), "Terry"); + FP_GameEntityHandle terry_handle = {}; + if (play->players.size) { + FP_GameEntityHandle player = play->players.data[play->players.size - 1]; + Dqn_V2 player_pos = FP_Game_CalcEntityWorldPos(game, player); + terry_handle = FP_Entity_CreatePerry(game, player_pos, "Perry"); + } else { + terry_handle = FP_Entity_CreateTerry(game, Dqn_V2_InitNx2(1380, 11), "Perry"); + } Dqn_FArray_Add(&play->players, terry_handle); FP_GameEntity *terry = FP_Game_GetEntity(game, terry_handle); @@ -131,29 +137,33 @@ static bool FP_ListenForNewPlayer(TELY_PlatformInput *input, FP_Game *game) if (keyboard_pressed) { controls->mode = FP_GameControlMode_Keyboard; if (play->players.size == 1) { - controls->up.scan_code = TELY_PlatformInputScanCode_W; - controls->down.scan_code = TELY_PlatformInputScanCode_S; - controls->left.scan_code = TELY_PlatformInputScanCode_A; - controls->right.scan_code = TELY_PlatformInputScanCode_D; - controls->attack.scan_code = TELY_PlatformInputScanCode_G; - controls->range_attack.scan_code = TELY_PlatformInputScanCode_H; - controls->build_mode.scan_code = TELY_PlatformInputScanCode_F; - controls->strafe.scan_code = TELY_PlatformInputScanCode_J; - controls->dash.scan_code = TELY_PlatformInputScanCode_V; - controls->buy_building.scan_code = TELY_PlatformInputScanCode_T; - controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_Y; + controls->up.scan_code = TELY_PlatformInputScanCode_W; + controls->down.scan_code = TELY_PlatformInputScanCode_S; + controls->left.scan_code = TELY_PlatformInputScanCode_A; + controls->right.scan_code = TELY_PlatformInputScanCode_D; + controls->attack.scan_code = TELY_PlatformInputScanCode_G; + controls->range_attack.scan_code = TELY_PlatformInputScanCode_H; + controls->build_mode.scan_code = TELY_PlatformInputScanCode_F; + controls->strafe.scan_code = TELY_PlatformInputScanCode_J; + controls->dash.scan_code = TELY_PlatformInputScanCode_V; + controls->buy_building.scan_code = TELY_PlatformInputScanCode_T; + controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_Y; + controls->move_building_ui_cursor_left.scan_code = TELY_PlatformInputScanCode_Q; + controls->move_building_ui_cursor_right.scan_code = TELY_PlatformInputScanCode_E; } else { - controls->up.scan_code = TELY_PlatformInputScanCode_O; - controls->down.scan_code = TELY_PlatformInputScanCode_L; - controls->left.scan_code = TELY_PlatformInputScanCode_K; - controls->right.scan_code = TELY_PlatformInputScanCode_Semicolon; - controls->attack.scan_code = TELY_PlatformInputScanCode_Right; - controls->range_attack.scan_code = TELY_PlatformInputScanCode_Left; - controls->build_mode.scan_code = TELY_PlatformInputScanCode_Up; - controls->strafe.scan_code = TELY_PlatformInputScanCode_N; - controls->dash.scan_code = TELY_PlatformInputScanCode_Down; - controls->buy_building.scan_code = TELY_PlatformInputScanCode_Backslash; - controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_Apostrophe; + controls->up.scan_code = TELY_PlatformInputScanCode_O; + controls->down.scan_code = TELY_PlatformInputScanCode_L; + controls->left.scan_code = TELY_PlatformInputScanCode_K; + controls->right.scan_code = TELY_PlatformInputScanCode_Semicolon; + controls->attack.scan_code = TELY_PlatformInputScanCode_Right; + controls->range_attack.scan_code = TELY_PlatformInputScanCode_Left; + controls->build_mode.scan_code = TELY_PlatformInputScanCode_Up; + controls->strafe.scan_code = TELY_PlatformInputScanCode_N; + controls->dash.scan_code = TELY_PlatformInputScanCode_Down; + controls->buy_building.scan_code = TELY_PlatformInputScanCode_Backslash; + controls->buy_upgrade.scan_code = TELY_PlatformInputScanCode_Apostrophe; + controls->move_building_ui_cursor_left.scan_code = TELY_PlatformInputScanCode_I; + controls->move_building_ui_cursor_right.scan_code = TELY_PlatformInputScanCode_P; } } else { controls->mode = FP_GameControlMode_Gamepad; @@ -506,9 +516,9 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, entity->action.state, entity->direction); switch (entity->type) { + case FP_EntityType_Perry: /*FALLTHRU*/ case FP_EntityType_Terry: { FP_EntityTerryState *state = DQN_CAST(FP_EntityTerryState *) & action->state; - { FP_GameEntity *portal_monkey = FP_Game_GetEntity(game, entity->carried_monkey); if (!FP_Game_IsNilEntity(portal_monkey)) { @@ -537,7 +547,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform // NOTE: Check if we are nearby a monkey and picking it up FP_GetClosestPortalMonkeyResult closest_monkey = FP_GetClosestPortalMonkey(game, entity->handle); if (closest_monkey.dist < DQN_SQUARED(FP_Game_MetersToPixelsNx1(game->play, 2.f))) { - if (TELY_Platform_InputScanCodeIsPressed(input, controls->attack.scan_code)) { + if (FP_Game_KeyBindIsPressed(input, controls, controls->attack)) { entity->carried_monkey = closest_monkey.entity; picked_up_monkey_this_frame = true; TELY_Audio_Play(audio, game->audio[FP_GameAudio_Monkey], 1.f); @@ -552,7 +562,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform FP_Game_EntityTransitionState(game, entity, FP_EntityTerryState_RangeAttack); } } else { - if (!picked_up_monkey_this_frame && TELY_Platform_InputScanCodeIsPressed(input, controls->attack.scan_code)) { + if (!picked_up_monkey_this_frame && FP_Game_KeyBindIsPressed(input, controls, controls->attack)) { FP_GameEntity *portal_monkey = FP_Game_GetEntity(game, entity->carried_monkey); portal_monkey->local_pos = FP_Game_CalcEntityWorldPos(game, entity->handle); entity->carried_monkey = {}; @@ -600,7 +610,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform // NOTE: Check if we are nearby a monkey and picking it up FP_GetClosestPortalMonkeyResult closest_monkey = FP_GetClosestPortalMonkey(game, entity->handle); if (closest_monkey.dist < DQN_SQUARED(FP_Game_MetersToPixelsNx1(game->play, 2.f))) { - if (TELY_Platform_InputScanCodeIsPressed(input, controls->attack.scan_code)) { + if (FP_Game_KeyBindIsPressed(input, controls, controls->attack)) { entity->carried_monkey = closest_monkey.entity; picked_up_monkey_this_frame = true; TELY_Audio_Play(audio, game->audio[FP_GameAudio_Monkey], 1.f); @@ -1207,6 +1217,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform case FP_EntityType_Count: break; case FP_EntityType_Terry: /*FALLTHRU*/ + case FP_EntityType_Perry: /*FALLTHRU*/ case FP_EntityType_Catfish: /*FALLTHRU*/ case FP_EntityType_Clinger: /*FALLTHRU*/ case FP_EntityType_Smoochie: { @@ -1220,7 +1231,7 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform } else if (entity->type == FP_EntityType_Smoochie) { is_attacking = entity->action.state == FP_EntitySmoochieState_Attack; } else { - DQN_ASSERT(entity->type == FP_EntityType_Terry); + DQN_ASSERT(entity->type == FP_EntityType_Terry || entity->type == FP_EntityType_Perry); is_range_attack = entity->action.state == FP_EntityTerryState_RangeAttack; is_attacking = is_range_attack || entity->action.state == FP_EntityTerryState_Attack; } @@ -1286,16 +1297,20 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input game->play.clock_ms = DQN_CAST(uint64_t)(platform->input.timer_s * 1000.f); Dqn_ProfilerZone update_zone = Dqn_Profiler_BeginZoneWithIndex(DQN_STRING8("FP_Update: Entity loop"), FP_ProfileZone_FPUpdate_EntityLoop); if (game->play.state == FP_GameState_Play) { - if (TELY_Platform_InputKeyIsReleased(input->mouse_left)) + + DQN_MSVC_WARNING_PUSH + DQN_MSVC_WARNING_DISABLE(4127) // Conditional expression is constant 'FP_DEVELOPER_MODE' + if (FP_DEVELOPER_MODE && TELY_Platform_InputKeyIsReleased(input->mouse_left)) game->play.clicked_entity = game->play.prev_active_entity; if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_Escape)) game->play.state = FP_GameState_Pause; - if (game->play.clicked_entity.id) { + if (FP_DEVELOPER_MODE && game->play.clicked_entity.id) { if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_Delete)) FP_Game_DeleteEntity(game, game->play.clicked_entity); } + DQN_MSVC_WARNING_POP // NOTE: Handle input ========================================================================== for (FP_GameEntityIterator it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &it, game->play.root_entity); ) { @@ -1319,12 +1334,9 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input dir_vector.x = +1.f; // NOTE: Gamepad movement input - // NOTE: button_codes 0 should be the first gamepad connected, we can - // get this working with other gamepads later - uint32_t gamepad = 0; - if (input->button_codes[gamepad]) { - dir_vector.x += input->left_stick[gamepad].x; - dir_vector.y += input->left_stick[gamepad].y; + if (controls->mode == FP_GameControlMode_Gamepad) { + dir_vector.x += input->left_stick[controls->gamepad_index].x; + dir_vector.y += input->left_stick[controls->gamepad_index].y; } // TODO(doyle): Some bug, diagonal is still faster @@ -1339,6 +1351,7 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input if (entity->flags & (FP_GameEntityFlag_MoveByKeyboard | FP_GameEntityFlag_MoveByGamepad)) { bool move_entity = true; switch (entity->type) { + case FP_EntityType_Perry: /*FALLTHRU*/ case FP_EntityType_Terry: { auto *state = DQN_CAST(FP_EntityTerryState *)&entity->action.state; move_entity = *state == FP_EntityTerryState_Run || *state == FP_EntityTerryState_Idle; @@ -1376,22 +1389,20 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input case FP_EntityType_ChurchTerry: break; case FP_EntityType_KennelTerry: break; case FP_EntityType_PhoneMessageProjectile: break; - case FP_EntityType_AirportTerryPlane: break; - case FP_EntityType_MobSpawner: - case FP_EntityType_PortalMonkey: break; - case FP_EntityType_Billboard: break; + case FP_EntityType_AirportTerryPlane: break; + case FP_EntityType_MobSpawner: break; + case FP_EntityType_PortalMonkey: break; + case FP_EntityType_Billboard: break; } if (move_entity) - acceleration_meters_per_s = dir_vector * entity->base_acceleration_per_s.meters; + acceleration_meters_per_s += dir_vector * entity->base_acceleration_per_s.meters; } - if (dir_vector == Dqn_V2_Zero) { - if (entity->velocity.x) - entity->direction = entity->velocity.x > 0.f ? FP_GameDirection_Right : FP_GameDirection_Left; - else if (entity->velocity.y) - entity->direction = entity->velocity.y > 0.f ? FP_GameDirection_Down : FP_GameDirection_Up; - } + if (entity->velocity.x) + entity->direction = entity->velocity.x > 0.f ? FP_GameDirection_Right : FP_GameDirection_Left; + else if (entity->velocity.y) + entity->direction = entity->velocity.y > 0.f ? FP_GameDirection_Down : FP_GameDirection_Up; // NOTE: Determine AI movement ============================================================= Dqn_V2 entity_pos = FP_Game_CalcEntityWorldPos(game, entity->handle); @@ -1425,7 +1436,7 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input if (dist_to_defender > (aggro_dist_threshold * 1.5f)) { for (FP_SentinelListLink *link = nullptr; FP_SentinelList_Iterate(&entity->waypoints, &link); ) { FP_GameEntity *maybe_terry = FP_Game_GetEntity(game, link->data.entity); - if (maybe_terry->type == FP_EntityType_Terry) { + if (maybe_terry->type == FP_EntityType_Terry || maybe_terry->type == FP_EntityType_Perry) { link = FP_SentinelList_Erase(&entity->waypoints, link, game->play.chunk_pool); } } @@ -1621,7 +1632,7 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input acceleration_meters_per_s = entity_to_waypoint_norm * (entity->base_acceleration_per_s.meters * 0.25f); if (entity->type == FP_EntityType_Smoochie) { - if (waypoint_entity->type == FP_EntityType_Terry) { + if (waypoint_entity->type == FP_EntityType_Terry || waypoint_entity->type == FP_EntityType_Perry) { if (dist_to_waypoint_sq < DQN_SQUARED(FP_Game_MetersToPixelsNx1(game->play, 2.f)) && !entity->smoochie_has_teleported) { @@ -1731,13 +1742,14 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input if (can_attack) { switch (entity->type) { + case FP_EntityType_Perry: /*FALLTHRU*/ 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) { + if (entity->type == FP_EntityType_Terry || entity->type == FP_EntityType_Perry) { FP_Game_EntityTransitionState(game, entity, FP_EntityTerryState_Attack); } else if (entity->type == FP_EntityType_Smoochie) { FP_Game_EntityTransitionState(game, entity, FP_EntitySmoochieState_Attack); @@ -1803,7 +1815,7 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input // NOTE: Building selector ========================================================= Dqn_usize const last_building_index = DQN_ARRAY_UCOUNT(PLACEABLE_BUILDINGS) - 1; - if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_Q)) { + if (FP_Game_KeyBindIsPressed(input, controls, controls->move_building_ui_cursor_left)) { if (entity->build_mode_building_index <= 0) { entity->build_mode_building_index = last_building_index; } else { @@ -1811,7 +1823,7 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input } } - if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_E)) { + if (FP_Game_KeyBindIsPressed(input, controls, controls->move_building_ui_cursor_left)) { if (entity->build_mode_building_index >= last_building_index) { entity->build_mode_building_index = 0; } else { @@ -3084,7 +3096,7 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer, TELY_Render_PushTransform(renderer, Dqn_M2x3_Identity()); DQN_DEFER { TELY_Render_PopTransform(renderer); }; - FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, FP_EntityType_Terry, FP_EntityTerryState_Idle, FP_GameDirection_Down); + FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, player->type, 0 /*state, usually 0 is idle*/, FP_GameDirection_Down); player_avatar_rect.size = render_data.render_size; TELY_Render_TextureColourV4(renderer, @@ -3623,7 +3635,11 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer, } // NOTE: Debug UI ============================================================================== - if (game->play.debug_ui) { + DQN_MSVC_WARNING_PUSH + DQN_MSVC_WARNING_DISABLE(4127) // Conditional expression is constant 'FP_DEVELOPER_MODE' + if (FP_DEVELOPER_MODE && game->play.debug_ui) { + DQN_MSVC_WARNING_POP + TELY_Render_PushTransform(renderer, Dqn_M2x3_Identity()); DQN_DEFER { TELY_Render_PopTransform(renderer); }; @@ -3755,7 +3771,10 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer, TELY_RFui_Flush(rfui, renderer, input, assets); } - if (game->play.state == FP_GameState_Play) { + DQN_MSVC_WARNING_PUSH + DQN_MSVC_WARNING_DISABLE(4127) // Conditional expression is constant 'FP_DEVELOPER_MODE' + if (FP_DEVELOPER_MODE && game->play.state == FP_GameState_Play) { + DQN_MSVC_WARNING_POP TELY_Render_PushTransform(renderer, Dqn_M2x3_Identity()); DQN_DEFER { TELY_Render_PopTransform(renderer); }; diff --git a/feely_pona.h b/feely_pona.h index 90da747..d9e15ab 100644 --- a/feely_pona.h +++ b/feely_pona.h @@ -127,6 +127,26 @@ struct FP_GlobalAnimations 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 perry_attack_up = DQN_STRING8("perry_attack_up"); + Dqn_String8 perry_attack_side = DQN_STRING8("perry_attack_side"); + Dqn_String8 perry_attack_down = DQN_STRING8("perry_attack_down"); + Dqn_String8 perry_attack_phone_up = DQN_STRING8("perry_attack_phone_up"); + Dqn_String8 perry_attack_phone_side = DQN_STRING8("perry_attack_phone_side"); + Dqn_String8 perry_attack_phone_down = DQN_STRING8("perry_attack_phone_down"); + Dqn_String8 perry_death = DQN_STRING8("perry_death"); + Dqn_String8 perry_pat_dog = DQN_STRING8("perry_pat_dog"); + Dqn_String8 perry_ghost = DQN_STRING8("perry_ghost"); + Dqn_String8 perry_walk_idle = DQN_STRING8("perry_walk_idle"); + Dqn_String8 perry_walk_up = DQN_STRING8("perry_walk_up"); + Dqn_String8 perry_walk_down = DQN_STRING8("perry_walk_down"); + Dqn_String8 perry_walk_right = DQN_STRING8("perry_walk_right"); } g_anim_names; + +#if defined(DQN_PLATFORM_EMSCRIPTEN) +#define FP_DEVELOPER_MODE 0 +#else +#define FP_DEVELOPER_MODE 0 +#endif diff --git a/feely_pona_entity.cpp b/feely_pona_entity.cpp index 5faca9b..2b2afff 100644 --- a/feely_pona_entity.cpp +++ b/feely_pona_entity.cpp @@ -83,6 +83,60 @@ static FP_EntityRenderData FP_Entity_GetRenderData(FP_Game *game, FP_EntityType } } break; + case FP_EntityType_Perry: { + result.height.meters = 1.72f; + FP_EntityPerryState state = DQN_CAST(FP_EntityPerryState)raw_state; + switch (state) { + case FP_EntityTerryState_Idle: { + result.anim_name = g_anim_names.perry_walk_idle; + } break; + + case FP_EntityTerryState_Attack: { + switch (direction) { + case FP_GameDirection_Up: result.anim_name = g_anim_names.perry_attack_up; result.height.meters *= 1.5f; break; + case FP_GameDirection_Down: result.anim_name = g_anim_names.perry_attack_down; result.height.meters *= 1.6f; break; + case FP_GameDirection_Left: result.anim_name = g_anim_names.perry_attack_side; result.height.meters *= 1.5f; break; + case FP_GameDirection_Right: result.anim_name = g_anim_names.perry_attack_side; result.height.meters *= 1.5f; result.flip = TELY_AssetFlip_X; break; + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } break; + + case FP_EntityTerryState_RangeAttack: { + switch (direction) { + case FP_GameDirection_Up: result.anim_name = g_anim_names.perry_attack_phone_up; result.height.meters *= 1.35f; break; + case FP_GameDirection_Down: result.anim_name = g_anim_names.perry_attack_phone_down; result.height.meters *= 1.35f; break; + case FP_GameDirection_Left: result.anim_name = g_anim_names.perry_attack_phone_side; result.height.meters *= 1.35f; result.flip = TELY_AssetFlip_X; break; + case FP_GameDirection_Right: result.anim_name = g_anim_names.perry_attack_phone_side; result.height.meters *= 1.35f; break; + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } break; + + case FP_EntityTerryState_Dash: { + switch (direction) { + case FP_GameDirection_Up: result.anim_name = g_anim_names.perry_ghost; break; + case FP_GameDirection_Down: result.anim_name = g_anim_names.perry_ghost; break; + case FP_GameDirection_Left: result.anim_name = g_anim_names.perry_ghost; break; + case FP_GameDirection_Right: result.anim_name = g_anim_names.perry_ghost; result.flip = TELY_AssetFlip_X; break; + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } break; + + case FP_EntityTerryState_Run: { + switch (direction) { + case FP_GameDirection_Up: result.anim_name = g_anim_names.perry_walk_up; break; + case FP_GameDirection_Down: result.anim_name = g_anim_names.perry_walk_down; break; + case FP_GameDirection_Left: result.anim_name = g_anim_names.perry_walk_right; result.flip = TELY_AssetFlip_X; break; + case FP_GameDirection_Right: result.anim_name = g_anim_names.perry_walk_right; break; + case FP_GameDirection_Count: DQN_INVALID_CODE_PATH; break; + } + } break; + + case FP_EntityTerryState_DeadGhost: { + result.anim_name = g_anim_names.perry_death; break; + } break; + } + } break; + case FP_EntityType_Smoochie: { result.height.meters = 1.6f; FP_EntitySmoochieState state = DQN_CAST(FP_EntitySmoochieState)raw_state; diff --git a/feely_pona_entity.h b/feely_pona_entity.h index b6b2e57..f9f3eb8 100644 --- a/feely_pona_entity.h +++ b/feely_pona_entity.h @@ -23,6 +23,7 @@ enum FP_EntityType FP_EntityType_PortalMonkey, FP_EntityType_Smoochie, FP_EntityType_Terry, + FP_EntityType_Perry, FP_EntityType_PhoneMessageProjectile, FP_EntityType_Billboard, FP_EntityType_Count, @@ -37,6 +38,7 @@ enum FP_EntityTerryState FP_EntityTerryState_Dash, FP_EntityTerryState_DeadGhost, }; +typedef FP_EntityTerryState FP_EntityPerryState; enum FP_EntityMobSpawnerState { diff --git a/feely_pona_entity_create.cpp b/feely_pona_entity_create.cpp index f030fc7..917ee99 100644 --- a/feely_pona_entity_create.cpp +++ b/feely_pona_entity_create.cpp @@ -167,15 +167,12 @@ static FP_GameEntityHandle FP_Entity_CreateMobSpawner(FP_Game *game, Dqn_V2 pos, return result; } -static FP_GameEntityHandle FP_Entity_CreateTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +static FP_GameEntityHandle FP_Entity_CreateTerryInternal(FP_Game *game, Dqn_V2 pos, bool is_perry, DQN_FMT_STRING_ANNOTATE char const *fmt, va_list args) { - 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_Terry; + entity->type = is_perry ? FP_EntityType_Perry : FP_EntityType_Terry; entity->local_pos = pos; entity->base_acceleration_per_s.meters = 16.f; @@ -199,6 +196,24 @@ static FP_GameEntityHandle FP_Entity_CreateTerry(FP_Game *game, Dqn_V2 pos, DQN_ return result; } +static FP_GameEntityHandle FP_Entity_CreateTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + FP_GameEntityHandle result = FP_Entity_CreateTerryInternal(game, pos, false /*is_perry*/, fmt, args); + va_end(args); + return result; +} + +static FP_GameEntityHandle FP_Entity_CreatePerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + FP_GameEntityHandle result = FP_Entity_CreateTerryInternal(game, pos, true /*is_perry*/, fmt, args); + va_end(args); + return result; +} + static FP_GameEntityHandle FP_Entity_CreateMerchantTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...) { va_list args; diff --git a/feely_pona_game.cpp b/feely_pona_game.cpp index 8fd5e46..79ecf37 100644 --- a/feely_pona_game.cpp +++ b/feely_pona_game.cpp @@ -825,6 +825,7 @@ static bool FP_Game_CanEntityAttack(FP_GameEntity *entity, uint64_t current_time static void FP_Game_EntityTransitionState(FP_Game *game, FP_GameEntity *entity, uint32_t desired_state) { switch (entity->type) { + case FP_EntityType_Perry: /*FALLTHRU*/ case FP_EntityType_Terry: { if (desired_state == FP_EntityTerryState_Attack || desired_state == FP_EntityTerryState_RangeAttack) { @@ -979,6 +980,7 @@ static FP_GameCanMoveToPositionResult FP_Game_CanEntityMoveToPosition(FP_Game *g } } break; + case FP_EntityType_Perry: /*FALLTHRU*/ case FP_EntityType_Terry: { // NOTE: Don't collide with mobs when dashing (e.g. phase through) FP_EntityTerryState state = *DQN_CAST(FP_EntityTerryState *)&entity->action.state; diff --git a/feely_pona_game.h b/feely_pona_game.h index 6c5faf6..f6170b8 100644 --- a/feely_pona_game.h +++ b/feely_pona_game.h @@ -188,6 +188,8 @@ struct FP_GameControls FP_GameKeyBind attack; FP_GameKeyBind buy_building; FP_GameKeyBind buy_upgrade; + FP_GameKeyBind move_building_ui_cursor_left; + FP_GameKeyBind move_building_ui_cursor_right; FP_GameKeyBind range_attack; FP_GameKeyBind build_mode; FP_GameKeyBind strafe; diff --git a/project.rdbg b/project.rdbg index ed1868c..11aaef5 100644 Binary files a/project.rdbg and b/project.rdbg differ