From 6e12a97edc0024b216c0543365bcd343dc97d5f7 Mon Sep 17 00:00:00 2001 From: Vasilis Valatsos Date: Fri, 17 May 2024 01:15:22 +0200 Subject: [PATCH] Moved Pygame version to own folder --- PyGame/LICENSE | 373 ++++++ PyGame/README.md | 46 + PyGame/__init__.py | 0 PyGame/args.py | 96 ++ PyGame/assets/font/joystix.ttf | Bin 0 -> 47604 bytes PyGame/assets/graphics/grass/grass_1.png | Bin 0 -> 494 bytes PyGame/assets/graphics/grass/grass_2.png | Bin 0 -> 500 bytes PyGame/assets/graphics/grass/grass_3.png | Bin 0 -> 575 bytes PyGame/assets/graphics/icon.png | Bin 0 -> 416 bytes .../graphics/monsters/bamboo/attack/0.png | Bin 0 -> 487 bytes .../graphics/monsters/bamboo/idle/0.png | Bin 0 -> 487 bytes .../graphics/monsters/bamboo/idle/1.png | Bin 0 -> 517 bytes .../graphics/monsters/bamboo/idle/2.png | Bin 0 -> 487 bytes .../graphics/monsters/bamboo/idle/3.png | Bin 0 -> 504 bytes .../graphics/monsters/bamboo/move/0.png | Bin 0 -> 487 bytes .../graphics/monsters/bamboo/move/1.png | Bin 0 -> 517 bytes .../graphics/monsters/bamboo/move/2.png | Bin 0 -> 487 bytes .../graphics/monsters/bamboo/move/3.png | Bin 0 -> 504 bytes .../graphics/monsters/raccoon/attack/0.png | Bin 0 -> 2019 bytes .../graphics/monsters/raccoon/attack/1.png | Bin 0 -> 1860 bytes .../graphics/monsters/raccoon/attack/2.png | Bin 0 -> 1762 bytes .../graphics/monsters/raccoon/attack/3.png | Bin 0 -> 1780 bytes .../graphics/monsters/raccoon/idle/0.png | Bin 0 -> 1769 bytes .../graphics/monsters/raccoon/idle/1.png | Bin 0 -> 1769 bytes .../graphics/monsters/raccoon/idle/2.png | Bin 0 -> 2129 bytes .../graphics/monsters/raccoon/idle/3.png | Bin 0 -> 2129 bytes .../graphics/monsters/raccoon/idle/4.png | Bin 0 -> 2124 bytes .../graphics/monsters/raccoon/idle/5.png | Bin 0 -> 2115 bytes .../graphics/monsters/raccoon/move/0.png | Bin 0 -> 1651 bytes .../graphics/monsters/raccoon/move/1.png | Bin 0 -> 1605 bytes .../graphics/monsters/raccoon/move/2.png | Bin 0 -> 1547 bytes .../graphics/monsters/raccoon/move/3.png | Bin 0 -> 1579 bytes .../graphics/monsters/raccoon/move/4.png | Bin 0 -> 1660 bytes .../graphics/monsters/spirit/attack/0.png | Bin 0 -> 426 bytes .../graphics/monsters/spirit/idle/0.png | Bin 0 -> 420 bytes .../graphics/monsters/spirit/idle/1.png | Bin 0 -> 417 bytes .../graphics/monsters/spirit/idle/2.png | Bin 0 -> 406 bytes .../graphics/monsters/spirit/idle/3.png | Bin 0 -> 418 bytes .../graphics/monsters/spirit/move/0.png | Bin 0 -> 426 bytes .../graphics/monsters/spirit/move/1.png | Bin 0 -> 425 bytes .../graphics/monsters/spirit/move/2.png | Bin 0 -> 414 bytes .../graphics/monsters/spirit/move/3.png | Bin 0 -> 413 bytes .../monsters/squid/attack/0 - Copy (2).png | Bin 0 -> 463 bytes .../monsters/squid/attack/0 - Copy (3).png | Bin 0 -> 463 bytes .../monsters/squid/attack/0 - Copy.png | Bin 0 -> 463 bytes .../graphics/monsters/squid/attack/0.png | Bin 0 -> 463 bytes .../assets/graphics/monsters/squid/idle/0.png | Bin 0 -> 463 bytes .../assets/graphics/monsters/squid/idle/1.png | Bin 0 -> 461 bytes .../assets/graphics/monsters/squid/idle/2.png | Bin 0 -> 463 bytes .../assets/graphics/monsters/squid/idle/3.png | Bin 0 -> 475 bytes .../assets/graphics/monsters/squid/idle/4.png | Bin 0 -> 475 bytes .../assets/graphics/monsters/squid/move/0.png | Bin 0 -> 463 bytes .../assets/graphics/monsters/squid/move/1.png | Bin 0 -> 461 bytes .../assets/graphics/monsters/squid/move/2.png | Bin 0 -> 475 bytes .../assets/graphics/monsters/squid/move/3.png | Bin 0 -> 475 bytes PyGame/assets/graphics/objects/0.png | Bin 0 -> 867 bytes PyGame/assets/graphics/objects/01.png | Bin 0 -> 845 bytes PyGame/assets/graphics/objects/02.png | Bin 0 -> 961 bytes PyGame/assets/graphics/objects/03.png | Bin 0 -> 1064 bytes PyGame/assets/graphics/objects/04.png | Bin 0 -> 1188 bytes PyGame/assets/graphics/objects/05.png | Bin 0 -> 1025 bytes PyGame/assets/graphics/objects/06.png | Bin 0 -> 982 bytes PyGame/assets/graphics/objects/07.png | Bin 0 -> 863 bytes PyGame/assets/graphics/objects/08.png | Bin 0 -> 866 bytes PyGame/assets/graphics/objects/09.png | Bin 0 -> 919 bytes PyGame/assets/graphics/objects/10.png | Bin 0 -> 1006 bytes PyGame/assets/graphics/objects/11.png | Bin 0 -> 852 bytes PyGame/assets/graphics/objects/12.png | Bin 0 -> 552 bytes PyGame/assets/graphics/objects/13.png | Bin 0 -> 798 bytes PyGame/assets/graphics/objects/14.png | Bin 0 -> 557 bytes PyGame/assets/graphics/objects/15.png | Bin 0 -> 1185 bytes PyGame/assets/graphics/objects/16.png | Bin 0 -> 1350 bytes PyGame/assets/graphics/objects/17.png | Bin 0 -> 939 bytes PyGame/assets/graphics/objects/18.png | Bin 0 -> 1122 bytes PyGame/assets/graphics/objects/19.png | Bin 0 -> 1326 bytes PyGame/assets/graphics/objects/20.png | Bin 0 -> 939 bytes PyGame/assets/graphics/observer.png | Bin 0 -> 17018 bytes PyGame/assets/graphics/particles/aura/0.png | Bin 0 -> 748 bytes PyGame/assets/graphics/particles/aura/1.png | Bin 0 -> 994 bytes PyGame/assets/graphics/particles/aura/2.png | Bin 0 -> 1012 bytes PyGame/assets/graphics/particles/aura/3.png | Bin 0 -> 747 bytes PyGame/assets/graphics/particles/bamboo/0.png | Bin 0 -> 473 bytes PyGame/assets/graphics/particles/bamboo/1.png | Bin 0 -> 468 bytes PyGame/assets/graphics/particles/claw/0.png | Bin 0 -> 384 bytes PyGame/assets/graphics/particles/claw/1.png | Bin 0 -> 466 bytes PyGame/assets/graphics/particles/claw/2.png | Bin 0 -> 489 bytes PyGame/assets/graphics/particles/claw/3.png | Bin 0 -> 378 bytes .../assets/graphics/particles/flame/fire.png | Bin 0 -> 342 bytes .../graphics/particles/flame/frames/0.png | Bin 0 -> 195 bytes .../graphics/particles/flame/frames/01.png | Bin 0 -> 224 bytes .../graphics/particles/flame/frames/02.png | Bin 0 -> 267 bytes .../graphics/particles/flame/frames/03.png | Bin 0 -> 266 bytes .../graphics/particles/flame/frames/04.png | Bin 0 -> 268 bytes .../graphics/particles/flame/frames/05.png | Bin 0 -> 264 bytes .../graphics/particles/flame/frames/06.png | Bin 0 -> 269 bytes .../graphics/particles/flame/frames/07.png | Bin 0 -> 258 bytes .../graphics/particles/flame/frames/08.png | Bin 0 -> 245 bytes .../graphics/particles/flame/frames/09.png | Bin 0 -> 217 bytes .../graphics/particles/flame/frames/10.png | Bin 0 -> 191 bytes .../graphics/particles/flame/frames/11.png | Bin 0 -> 181 bytes .../graphics/particles/heal/frames/0.png | Bin 0 -> 322 bytes .../graphics/particles/heal/frames/1.png | Bin 0 -> 403 bytes .../graphics/particles/heal/frames/2.png | Bin 0 -> 427 bytes .../graphics/particles/heal/frames/3.png | Bin 0 -> 392 bytes .../graphics/particles/heal/frames/4.png | Bin 0 -> 324 bytes .../assets/graphics/particles/heal/heal.png | Bin 0 -> 416 bytes .../graphics/particles/leaf1/leaf1_00000.png | Bin 0 -> 1053 bytes .../graphics/particles/leaf1/leaf1_00001.png | Bin 0 -> 1040 bytes .../graphics/particles/leaf1/leaf1_00002.png | Bin 0 -> 1091 bytes .../graphics/particles/leaf1/leaf1_00003.png | Bin 0 -> 1093 bytes .../graphics/particles/leaf1/leaf1_00004.png | Bin 0 -> 1053 bytes .../graphics/particles/leaf1/leaf1_00005.png | Bin 0 -> 1085 bytes .../graphics/particles/leaf1/leaf1_00006.png | Bin 0 -> 1033 bytes .../graphics/particles/leaf1/leaf1_00007.png | Bin 0 -> 971 bytes .../graphics/particles/leaf1/leaf1_00008.png | Bin 0 -> 980 bytes .../graphics/particles/leaf1/leaf1_00009.png | Bin 0 -> 962 bytes .../graphics/particles/leaf1/leaf1_00010.png | Bin 0 -> 884 bytes .../graphics/particles/leaf1/leaf1_00011.png | Bin 0 -> 886 bytes .../graphics/particles/leaf2/leaf1_00000.png | Bin 0 -> 1450 bytes .../graphics/particles/leaf2/leaf1_00001.png | Bin 0 -> 1317 bytes .../graphics/particles/leaf2/leaf1_00002.png | Bin 0 -> 1452 bytes .../graphics/particles/leaf2/leaf1_00003.png | Bin 0 -> 1482 bytes .../graphics/particles/leaf2/leaf1_00004.png | Bin 0 -> 1532 bytes .../graphics/particles/leaf2/leaf1_00005.png | Bin 0 -> 1413 bytes .../graphics/particles/leaf2/leaf1_00006.png | Bin 0 -> 1365 bytes .../graphics/particles/leaf2/leaf1_00007.png | Bin 0 -> 1264 bytes .../graphics/particles/leaf2/leaf1_00008.png | Bin 0 -> 1369 bytes .../graphics/particles/leaf2/leaf1_00009.png | Bin 0 -> 1364 bytes .../graphics/particles/leaf2/leaf1_00010.png | Bin 0 -> 1338 bytes .../graphics/particles/leaf2/leaf1_00011.png | Bin 0 -> 1217 bytes .../graphics/particles/leaf2/leaf1_00012.png | Bin 0 -> 1269 bytes .../graphics/particles/leaf3/leaf1_00000.png | Bin 0 -> 811 bytes .../graphics/particles/leaf3/leaf1_00001.png | Bin 0 -> 962 bytes .../graphics/particles/leaf3/leaf1_00002.png | Bin 0 -> 992 bytes .../graphics/particles/leaf3/leaf1_00003.png | Bin 0 -> 1002 bytes .../graphics/particles/leaf3/leaf1_00004.png | Bin 0 -> 964 bytes .../graphics/particles/leaf3/leaf1_00005.png | Bin 0 -> 971 bytes .../graphics/particles/leaf3/leaf1_00006.png | Bin 0 -> 919 bytes .../graphics/particles/leaf3/leaf1_00007.png | Bin 0 -> 829 bytes .../graphics/particles/leaf3/leaf1_00008.png | Bin 0 -> 832 bytes .../graphics/particles/leaf3/leaf1_00009.png | Bin 0 -> 814 bytes .../graphics/particles/leaf4/leaf1_00000.png | Bin 0 -> 921 bytes .../graphics/particles/leaf4/leaf1_00001.png | Bin 0 -> 941 bytes .../graphics/particles/leaf4/leaf1_00002.png | Bin 0 -> 977 bytes .../graphics/particles/leaf4/leaf1_00003.png | Bin 0 -> 944 bytes .../graphics/particles/leaf4/leaf1_00004.png | Bin 0 -> 957 bytes .../graphics/particles/leaf4/leaf1_00005.png | Bin 0 -> 916 bytes .../graphics/particles/leaf4/leaf1_00006.png | Bin 0 -> 920 bytes .../graphics/particles/leaf4/leaf1_00007.png | Bin 0 -> 833 bytes .../graphics/particles/leaf4/leaf1_00008.png | Bin 0 -> 876 bytes .../graphics/particles/leaf4/leaf1_00009.png | Bin 0 -> 850 bytes .../graphics/particles/leaf4/leaf1_00010.png | Bin 0 -> 884 bytes .../graphics/particles/leaf5/leaf1_00000.png | Bin 0 -> 834 bytes .../graphics/particles/leaf5/leaf1_00001.png | Bin 0 -> 968 bytes .../graphics/particles/leaf5/leaf1_00002.png | Bin 0 -> 993 bytes .../graphics/particles/leaf5/leaf1_00003.png | Bin 0 -> 916 bytes .../graphics/particles/leaf5/leaf1_00004.png | Bin 0 -> 992 bytes .../graphics/particles/leaf5/leaf1_00005.png | Bin 0 -> 966 bytes .../graphics/particles/leaf5/leaf1_00006.png | Bin 0 -> 895 bytes .../graphics/particles/leaf5/leaf1_00007.png | Bin 0 -> 912 bytes .../graphics/particles/leaf5/leaf1_00008.png | Bin 0 -> 878 bytes .../graphics/particles/leaf5/leaf1_00009.png | Bin 0 -> 861 bytes .../graphics/particles/leaf6/leaf1_00000.png | Bin 0 -> 1037 bytes .../graphics/particles/leaf6/leaf1_00001.png | Bin 0 -> 1562 bytes .../graphics/particles/leaf6/leaf1_00002.png | Bin 0 -> 1604 bytes .../graphics/particles/leaf6/leaf1_00003.png | Bin 0 -> 1437 bytes .../graphics/particles/leaf6/leaf1_00004.png | Bin 0 -> 1572 bytes .../graphics/particles/leaf6/leaf1_00005.png | Bin 0 -> 1620 bytes .../graphics/particles/leaf6/leaf1_00006.png | Bin 0 -> 1467 bytes .../graphics/particles/leaf6/leaf1_00007.png | Bin 0 -> 1434 bytes .../graphics/particles/leaf6/leaf1_00008.png | Bin 0 -> 1435 bytes .../graphics/particles/leaf6/leaf1_00009.png | Bin 0 -> 1526 bytes .../graphics/particles/leaf6/leaf1_00010.png | Bin 0 -> 1427 bytes .../graphics/particles/leaf6/leaf1_00011.png | Bin 0 -> 1375 bytes .../graphics/particles/leaf_attack/0.png | Bin 0 -> 472 bytes .../graphics/particles/leaf_attack/1.png | Bin 0 -> 514 bytes .../graphics/particles/leaf_attack/2.png | Bin 0 -> 484 bytes .../graphics/particles/leaf_attack/3.png | Bin 0 -> 480 bytes .../graphics/particles/leaf_attack/4.png | Bin 0 -> 472 bytes .../graphics/particles/leaf_attack/5.png | Bin 0 -> 446 bytes .../graphics/particles/leaf_attack/6.png | Bin 0 -> 472 bytes PyGame/assets/graphics/particles/nova/0.png | Bin 0 -> 488 bytes PyGame/assets/graphics/particles/nova/1.png | Bin 0 -> 688 bytes PyGame/assets/graphics/particles/nova/2.png | Bin 0 -> 769 bytes PyGame/assets/graphics/particles/nova/3.png | Bin 0 -> 675 bytes PyGame/assets/graphics/particles/nova/4.png | Bin 0 -> 536 bytes PyGame/assets/graphics/particles/nova/5.png | Bin 0 -> 496 bytes .../assets/graphics/particles/raccoon/0.png | Bin 0 -> 2093 bytes .../assets/graphics/particles/raccoon/1.png | Bin 0 -> 2237 bytes .../assets/graphics/particles/raccoon/2.png | Bin 0 -> 2550 bytes .../assets/graphics/particles/raccoon/3.png | Bin 0 -> 2488 bytes .../assets/graphics/particles/raccoon/4.png | Bin 0 -> 1685 bytes .../assets/graphics/particles/raccoon/5.png | Bin 0 -> 1197 bytes PyGame/assets/graphics/particles/slash/0.png | Bin 0 -> 273 bytes PyGame/assets/graphics/particles/slash/1.png | Bin 0 -> 386 bytes PyGame/assets/graphics/particles/slash/2.png | Bin 0 -> 337 bytes PyGame/assets/graphics/particles/slash/3.png | Bin 0 -> 337 bytes PyGame/assets/graphics/particles/smoke/0.png | Bin 0 -> 348 bytes PyGame/assets/graphics/particles/smoke/1.png | Bin 0 -> 469 bytes PyGame/assets/graphics/particles/smoke/2.png | Bin 0 -> 520 bytes PyGame/assets/graphics/particles/smoke/3.png | Bin 0 -> 494 bytes PyGame/assets/graphics/particles/smoke/4.png | Bin 0 -> 577 bytes PyGame/assets/graphics/particles/smoke/5.png | Bin 0 -> 557 bytes PyGame/assets/graphics/particles/smoke2/0.png | Bin 0 -> 407 bytes PyGame/assets/graphics/particles/smoke2/1.png | Bin 0 -> 545 bytes PyGame/assets/graphics/particles/smoke2/2.png | Bin 0 -> 628 bytes PyGame/assets/graphics/particles/smoke2/3.png | Bin 0 -> 607 bytes PyGame/assets/graphics/particles/smoke2/4.png | Bin 0 -> 722 bytes PyGame/assets/graphics/particles/smoke2/5.png | Bin 0 -> 691 bytes .../graphics/particles/smoke_orange/0.png | Bin 0 -> 517 bytes .../graphics/particles/smoke_orange/1.png | Bin 0 -> 545 bytes .../graphics/particles/smoke_orange/2.png | Bin 0 -> 628 bytes .../graphics/particles/smoke_orange/3.png | Bin 0 -> 623 bytes .../graphics/particles/smoke_orange/4.png | Bin 0 -> 724 bytes .../graphics/particles/smoke_orange/5.png | Bin 0 -> 738 bytes .../assets/graphics/particles/sparkle/0.png | Bin 0 -> 816 bytes .../assets/graphics/particles/sparkle/1.png | Bin 0 -> 850 bytes .../assets/graphics/particles/sparkle/2.png | Bin 0 -> 851 bytes .../assets/graphics/particles/sparkle/3.png | Bin 0 -> 838 bytes .../assets/graphics/particles/sparkle/4.png | Bin 0 -> 631 bytes .../assets/graphics/particles/thunder/0.png | Bin 0 -> 408 bytes .../assets/graphics/particles/thunder/1.png | Bin 0 -> 441 bytes .../assets/graphics/particles/thunder/2.png | Bin 0 -> 530 bytes .../assets/graphics/particles/thunder/3.png | Bin 0 -> 450 bytes .../assets/graphics/particles/thunder/4.png | Bin 0 -> 573 bytes .../assets/graphics/particles/thunder/5.png | Bin 0 -> 520 bytes .../assets/graphics/particles/thunder/6.png | Bin 0 -> 463 bytes .../assets/graphics/particles/thunder/7.png | Bin 0 -> 381 bytes PyGame/assets/graphics/player/down/down_0.png | Bin 0 -> 591 bytes PyGame/assets/graphics/player/down/down_1.png | Bin 0 -> 585 bytes PyGame/assets/graphics/player/down/down_2.png | Bin 0 -> 591 bytes PyGame/assets/graphics/player/down/down_3.png | Bin 0 -> 589 bytes .../player/down_attack/attack_down.png | Bin 0 -> 552 bytes .../graphics/player/down_idle/idle_down.png | Bin 0 -> 591 bytes PyGame/assets/graphics/player/left/left_0.png | Bin 0 -> 609 bytes PyGame/assets/graphics/player/left/left_1.png | Bin 0 -> 563 bytes PyGame/assets/graphics/player/left/left_2.png | Bin 0 -> 621 bytes PyGame/assets/graphics/player/left/left_3.png | Bin 0 -> 586 bytes .../player/left_attack/attack_left.png | Bin 0 -> 563 bytes .../graphics/player/left_idle/idle_left.png | Bin 0 -> 609 bytes .../assets/graphics/player/right/right_0.png | Bin 0 -> 568 bytes .../assets/graphics/player/right/right_1.png | Bin 0 -> 521 bytes .../assets/graphics/player/right/right_2.png | Bin 0 -> 578 bytes .../assets/graphics/player/right/right_3.png | Bin 0 -> 551 bytes .../player/right_attack/attack_right.png | Bin 0 -> 505 bytes .../graphics/player/right_idle/idle_right.png | Bin 0 -> 568 bytes PyGame/assets/graphics/player/up/up_0.png | Bin 0 -> 469 bytes PyGame/assets/graphics/player/up/up_1.png | Bin 0 -> 489 bytes PyGame/assets/graphics/player/up/up_2.png | Bin 0 -> 469 bytes PyGame/assets/graphics/player/up/up_3.png | Bin 0 -> 507 bytes .../graphics/player/up_attack/attack_up.png | Bin 0 -> 502 bytes .../graphics/player/up_idle/idle_up.png | Bin 0 -> 469 bytes PyGame/assets/graphics/tilemap/Floor.png | Bin 0 -> 50779 bytes PyGame/assets/graphics/tilemap/details.png | Bin 0 -> 6395 bytes PyGame/assets/graphics/tilemap/ground.png | Bin 0 -> 182250 bytes PyGame/assets/graphics/weapons/axe/down.png | Bin 0 -> 199 bytes PyGame/assets/graphics/weapons/axe/full.png | Bin 0 -> 297 bytes PyGame/assets/graphics/weapons/axe/left.png | Bin 0 -> 274 bytes PyGame/assets/graphics/weapons/axe/right.png | Bin 0 -> 281 bytes PyGame/assets/graphics/weapons/axe/up.png | Bin 0 -> 305 bytes PyGame/assets/graphics/weapons/lance/down.png | Bin 0 -> 198 bytes PyGame/assets/graphics/weapons/lance/full.png | Bin 0 -> 422 bytes PyGame/assets/graphics/weapons/lance/left.png | Bin 0 -> 290 bytes .../assets/graphics/weapons/lance/right.png | Bin 0 -> 279 bytes PyGame/assets/graphics/weapons/lance/up.png | Bin 0 -> 1788 bytes .../assets/graphics/weapons/rapier/down.png | Bin 0 -> 174 bytes .../assets/graphics/weapons/rapier/full.png | Bin 0 -> 271 bytes .../assets/graphics/weapons/rapier/left.png | Bin 0 -> 254 bytes .../assets/graphics/weapons/rapier/right.png | Bin 0 -> 284 bytes PyGame/assets/graphics/weapons/rapier/up.png | Bin 0 -> 277 bytes PyGame/assets/graphics/weapons/sai/down.png | Bin 0 -> 168 bytes PyGame/assets/graphics/weapons/sai/full.png | Bin 0 -> 249 bytes PyGame/assets/graphics/weapons/sai/left.png | Bin 0 -> 222 bytes PyGame/assets/graphics/weapons/sai/right.png | Bin 0 -> 220 bytes PyGame/assets/graphics/weapons/sai/up.png | Bin 0 -> 239 bytes PyGame/assets/graphics/weapons/sword/down.png | Bin 0 -> 1757 bytes PyGame/assets/graphics/weapons/sword/full.png | Bin 0 -> 251 bytes PyGame/assets/graphics/weapons/sword/left.png | Bin 0 -> 212 bytes .../assets/graphics/weapons/sword/right.png | Bin 0 -> 215 bytes PyGame/assets/graphics/weapons/sword/up.png | Bin 0 -> 218 bytes PyGame/assets/map/Entities.csv | 50 + PyGame/assets/map/FloorBlocks.csv | 50 + PyGame/assets/map/Grass.csv | 50 + PyGame/assets/map/Objects.csv | 50 + PyGame/camera.py | 67 + PyGame/config/__init__.py | 0 PyGame/config/game/__init__.py | 0 PyGame/config/game/monster_config.py | 41 + PyGame/config/game/player_config.py | 51 + PyGame/config/game/spell_config.py | 22 + PyGame/config/game/weapon_config.py | 43 + PyGame/config/system/window.py | 15 + PyGame/effects/__init__.py | 0 PyGame/effects/magic_effects.py | 57 + PyGame/effects/particle_effects.py | 160 +++ PyGame/effects/weapon_effects.py | 35 + PyGame/entities/__init__.py | 0 PyGame/entities/components/__init__.py | 0 PyGame/entities/components/_input.py | 173 +++ PyGame/entities/components/animation.py | 97 ++ PyGame/entities/components/combat.py | 47 + PyGame/entities/components/movement.py | 40 + PyGame/entities/components/stats.py | 54 + PyGame/entities/enemy.py | 83 ++ PyGame/entities/entity.py | 33 + PyGame/entities/observer.py | 66 + PyGame/entities/player.py | 232 ++++ PyGame/entities/terrain.py | 31 + PyGame/folder_struct.py | 30 + PyGame/game.py | 62 + PyGame/interface/__init__.py | 0 PyGame/interface/ui.py | 112 ++ PyGame/interface/ui_settings.py | 27 + PyGame/interface/upgrade.py | 156 +++ PyGame/level.py | 297 ++++ PyGame/main.py | 217 +++ PyGame/ml/ppo/__init__.py | 0 PyGame/ml/ppo/agent.py | 122 ++ PyGame/ml/ppo/brain.py | 135 ++ PyGame/poetry.lock | 1190 +++++++++++++++++ PyGame/pyproject.toml | 45 + PyGame/utils/__init__.py | 0 PyGame/utils/debug.py | 13 + PyGame/utils/hyperparams.py | 16 + PyGame/utils/metrics.py | 75 ++ PyGame/utils/resource_loader.py | 42 + PyGame/utils/seeds.py | 11 + 327 files changed, 4612 insertions(+) create mode 100644 PyGame/LICENSE create mode 100644 PyGame/README.md create mode 100644 PyGame/__init__.py create mode 100644 PyGame/args.py create mode 100644 PyGame/assets/font/joystix.ttf create mode 100644 PyGame/assets/graphics/grass/grass_1.png create mode 100644 PyGame/assets/graphics/grass/grass_2.png create mode 100644 PyGame/assets/graphics/grass/grass_3.png create mode 100644 PyGame/assets/graphics/icon.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/attack/0.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/idle/0.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/idle/1.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/idle/2.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/idle/3.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/move/0.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/move/1.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/move/2.png create mode 100644 PyGame/assets/graphics/monsters/bamboo/move/3.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/attack/0.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/attack/1.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/attack/2.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/attack/3.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/idle/0.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/idle/1.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/idle/2.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/idle/3.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/idle/4.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/idle/5.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/move/0.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/move/1.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/move/2.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/move/3.png create mode 100644 PyGame/assets/graphics/monsters/raccoon/move/4.png create mode 100644 PyGame/assets/graphics/monsters/spirit/attack/0.png create mode 100644 PyGame/assets/graphics/monsters/spirit/idle/0.png create mode 100644 PyGame/assets/graphics/monsters/spirit/idle/1.png create mode 100644 PyGame/assets/graphics/monsters/spirit/idle/2.png create mode 100644 PyGame/assets/graphics/monsters/spirit/idle/3.png create mode 100644 PyGame/assets/graphics/monsters/spirit/move/0.png create mode 100644 PyGame/assets/graphics/monsters/spirit/move/1.png create mode 100644 PyGame/assets/graphics/monsters/spirit/move/2.png create mode 100644 PyGame/assets/graphics/monsters/spirit/move/3.png create mode 100644 PyGame/assets/graphics/monsters/squid/attack/0 - Copy (2).png create mode 100644 PyGame/assets/graphics/monsters/squid/attack/0 - Copy (3).png create mode 100644 PyGame/assets/graphics/monsters/squid/attack/0 - Copy.png create mode 100644 PyGame/assets/graphics/monsters/squid/attack/0.png create mode 100644 PyGame/assets/graphics/monsters/squid/idle/0.png create mode 100644 PyGame/assets/graphics/monsters/squid/idle/1.png create mode 100644 PyGame/assets/graphics/monsters/squid/idle/2.png create mode 100644 PyGame/assets/graphics/monsters/squid/idle/3.png create mode 100644 PyGame/assets/graphics/monsters/squid/idle/4.png create mode 100644 PyGame/assets/graphics/monsters/squid/move/0.png create mode 100644 PyGame/assets/graphics/monsters/squid/move/1.png create mode 100644 PyGame/assets/graphics/monsters/squid/move/2.png create mode 100644 PyGame/assets/graphics/monsters/squid/move/3.png create mode 100644 PyGame/assets/graphics/objects/0.png create mode 100644 PyGame/assets/graphics/objects/01.png create mode 100644 PyGame/assets/graphics/objects/02.png create mode 100644 PyGame/assets/graphics/objects/03.png create mode 100644 PyGame/assets/graphics/objects/04.png create mode 100644 PyGame/assets/graphics/objects/05.png create mode 100644 PyGame/assets/graphics/objects/06.png create mode 100644 PyGame/assets/graphics/objects/07.png create mode 100644 PyGame/assets/graphics/objects/08.png create mode 100644 PyGame/assets/graphics/objects/09.png create mode 100644 PyGame/assets/graphics/objects/10.png create mode 100644 PyGame/assets/graphics/objects/11.png create mode 100644 PyGame/assets/graphics/objects/12.png create mode 100644 PyGame/assets/graphics/objects/13.png create mode 100644 PyGame/assets/graphics/objects/14.png create mode 100644 PyGame/assets/graphics/objects/15.png create mode 100644 PyGame/assets/graphics/objects/16.png create mode 100644 PyGame/assets/graphics/objects/17.png create mode 100644 PyGame/assets/graphics/objects/18.png create mode 100644 PyGame/assets/graphics/objects/19.png create mode 100644 PyGame/assets/graphics/objects/20.png create mode 100644 PyGame/assets/graphics/observer.png create mode 100644 PyGame/assets/graphics/particles/aura/0.png create mode 100644 PyGame/assets/graphics/particles/aura/1.png create mode 100644 PyGame/assets/graphics/particles/aura/2.png create mode 100644 PyGame/assets/graphics/particles/aura/3.png create mode 100644 PyGame/assets/graphics/particles/bamboo/0.png create mode 100644 PyGame/assets/graphics/particles/bamboo/1.png create mode 100644 PyGame/assets/graphics/particles/claw/0.png create mode 100644 PyGame/assets/graphics/particles/claw/1.png create mode 100644 PyGame/assets/graphics/particles/claw/2.png create mode 100644 PyGame/assets/graphics/particles/claw/3.png create mode 100644 PyGame/assets/graphics/particles/flame/fire.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/0.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/01.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/02.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/03.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/04.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/05.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/06.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/07.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/08.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/09.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/10.png create mode 100644 PyGame/assets/graphics/particles/flame/frames/11.png create mode 100644 PyGame/assets/graphics/particles/heal/frames/0.png create mode 100644 PyGame/assets/graphics/particles/heal/frames/1.png create mode 100644 PyGame/assets/graphics/particles/heal/frames/2.png create mode 100644 PyGame/assets/graphics/particles/heal/frames/3.png create mode 100644 PyGame/assets/graphics/particles/heal/frames/4.png create mode 100644 PyGame/assets/graphics/particles/heal/heal.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00000.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00001.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00002.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00003.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00004.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00005.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00006.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00007.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00008.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00009.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00010.png create mode 100644 PyGame/assets/graphics/particles/leaf1/leaf1_00011.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00000.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00001.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00002.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00003.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00004.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00005.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00006.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00007.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00008.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00009.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00010.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00011.png create mode 100644 PyGame/assets/graphics/particles/leaf2/leaf1_00012.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00000.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00001.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00002.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00003.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00004.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00005.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00006.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00007.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00008.png create mode 100644 PyGame/assets/graphics/particles/leaf3/leaf1_00009.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00000.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00001.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00002.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00003.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00004.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00005.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00006.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00007.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00008.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00009.png create mode 100644 PyGame/assets/graphics/particles/leaf4/leaf1_00010.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00000.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00001.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00002.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00003.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00004.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00005.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00006.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00007.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00008.png create mode 100644 PyGame/assets/graphics/particles/leaf5/leaf1_00009.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00000.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00001.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00002.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00003.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00004.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00005.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00006.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00007.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00008.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00009.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00010.png create mode 100644 PyGame/assets/graphics/particles/leaf6/leaf1_00011.png create mode 100644 PyGame/assets/graphics/particles/leaf_attack/0.png create mode 100644 PyGame/assets/graphics/particles/leaf_attack/1.png create mode 100644 PyGame/assets/graphics/particles/leaf_attack/2.png create mode 100644 PyGame/assets/graphics/particles/leaf_attack/3.png create mode 100644 PyGame/assets/graphics/particles/leaf_attack/4.png create mode 100644 PyGame/assets/graphics/particles/leaf_attack/5.png create mode 100644 PyGame/assets/graphics/particles/leaf_attack/6.png create mode 100644 PyGame/assets/graphics/particles/nova/0.png create mode 100644 PyGame/assets/graphics/particles/nova/1.png create mode 100644 PyGame/assets/graphics/particles/nova/2.png create mode 100644 PyGame/assets/graphics/particles/nova/3.png create mode 100644 PyGame/assets/graphics/particles/nova/4.png create mode 100644 PyGame/assets/graphics/particles/nova/5.png create mode 100644 PyGame/assets/graphics/particles/raccoon/0.png create mode 100644 PyGame/assets/graphics/particles/raccoon/1.png create mode 100644 PyGame/assets/graphics/particles/raccoon/2.png create mode 100644 PyGame/assets/graphics/particles/raccoon/3.png create mode 100644 PyGame/assets/graphics/particles/raccoon/4.png create mode 100644 PyGame/assets/graphics/particles/raccoon/5.png create mode 100644 PyGame/assets/graphics/particles/slash/0.png create mode 100644 PyGame/assets/graphics/particles/slash/1.png create mode 100644 PyGame/assets/graphics/particles/slash/2.png create mode 100644 PyGame/assets/graphics/particles/slash/3.png create mode 100644 PyGame/assets/graphics/particles/smoke/0.png create mode 100644 PyGame/assets/graphics/particles/smoke/1.png create mode 100644 PyGame/assets/graphics/particles/smoke/2.png create mode 100644 PyGame/assets/graphics/particles/smoke/3.png create mode 100644 PyGame/assets/graphics/particles/smoke/4.png create mode 100644 PyGame/assets/graphics/particles/smoke/5.png create mode 100644 PyGame/assets/graphics/particles/smoke2/0.png create mode 100644 PyGame/assets/graphics/particles/smoke2/1.png create mode 100644 PyGame/assets/graphics/particles/smoke2/2.png create mode 100644 PyGame/assets/graphics/particles/smoke2/3.png create mode 100644 PyGame/assets/graphics/particles/smoke2/4.png create mode 100644 PyGame/assets/graphics/particles/smoke2/5.png create mode 100644 PyGame/assets/graphics/particles/smoke_orange/0.png create mode 100644 PyGame/assets/graphics/particles/smoke_orange/1.png create mode 100644 PyGame/assets/graphics/particles/smoke_orange/2.png create mode 100644 PyGame/assets/graphics/particles/smoke_orange/3.png create mode 100644 PyGame/assets/graphics/particles/smoke_orange/4.png create mode 100644 PyGame/assets/graphics/particles/smoke_orange/5.png create mode 100644 PyGame/assets/graphics/particles/sparkle/0.png create mode 100644 PyGame/assets/graphics/particles/sparkle/1.png create mode 100644 PyGame/assets/graphics/particles/sparkle/2.png create mode 100644 PyGame/assets/graphics/particles/sparkle/3.png create mode 100644 PyGame/assets/graphics/particles/sparkle/4.png create mode 100644 PyGame/assets/graphics/particles/thunder/0.png create mode 100644 PyGame/assets/graphics/particles/thunder/1.png create mode 100644 PyGame/assets/graphics/particles/thunder/2.png create mode 100644 PyGame/assets/graphics/particles/thunder/3.png create mode 100644 PyGame/assets/graphics/particles/thunder/4.png create mode 100644 PyGame/assets/graphics/particles/thunder/5.png create mode 100644 PyGame/assets/graphics/particles/thunder/6.png create mode 100644 PyGame/assets/graphics/particles/thunder/7.png create mode 100644 PyGame/assets/graphics/player/down/down_0.png create mode 100644 PyGame/assets/graphics/player/down/down_1.png create mode 100644 PyGame/assets/graphics/player/down/down_2.png create mode 100644 PyGame/assets/graphics/player/down/down_3.png create mode 100644 PyGame/assets/graphics/player/down_attack/attack_down.png create mode 100644 PyGame/assets/graphics/player/down_idle/idle_down.png create mode 100644 PyGame/assets/graphics/player/left/left_0.png create mode 100644 PyGame/assets/graphics/player/left/left_1.png create mode 100644 PyGame/assets/graphics/player/left/left_2.png create mode 100644 PyGame/assets/graphics/player/left/left_3.png create mode 100644 PyGame/assets/graphics/player/left_attack/attack_left.png create mode 100644 PyGame/assets/graphics/player/left_idle/idle_left.png create mode 100644 PyGame/assets/graphics/player/right/right_0.png create mode 100644 PyGame/assets/graphics/player/right/right_1.png create mode 100644 PyGame/assets/graphics/player/right/right_2.png create mode 100644 PyGame/assets/graphics/player/right/right_3.png create mode 100644 PyGame/assets/graphics/player/right_attack/attack_right.png create mode 100644 PyGame/assets/graphics/player/right_idle/idle_right.png create mode 100644 PyGame/assets/graphics/player/up/up_0.png create mode 100644 PyGame/assets/graphics/player/up/up_1.png create mode 100644 PyGame/assets/graphics/player/up/up_2.png create mode 100644 PyGame/assets/graphics/player/up/up_3.png create mode 100644 PyGame/assets/graphics/player/up_attack/attack_up.png create mode 100644 PyGame/assets/graphics/player/up_idle/idle_up.png create mode 100644 PyGame/assets/graphics/tilemap/Floor.png create mode 100644 PyGame/assets/graphics/tilemap/details.png create mode 100644 PyGame/assets/graphics/tilemap/ground.png create mode 100644 PyGame/assets/graphics/weapons/axe/down.png create mode 100644 PyGame/assets/graphics/weapons/axe/full.png create mode 100644 PyGame/assets/graphics/weapons/axe/left.png create mode 100644 PyGame/assets/graphics/weapons/axe/right.png create mode 100644 PyGame/assets/graphics/weapons/axe/up.png create mode 100644 PyGame/assets/graphics/weapons/lance/down.png create mode 100644 PyGame/assets/graphics/weapons/lance/full.png create mode 100644 PyGame/assets/graphics/weapons/lance/left.png create mode 100644 PyGame/assets/graphics/weapons/lance/right.png create mode 100644 PyGame/assets/graphics/weapons/lance/up.png create mode 100644 PyGame/assets/graphics/weapons/rapier/down.png create mode 100644 PyGame/assets/graphics/weapons/rapier/full.png create mode 100644 PyGame/assets/graphics/weapons/rapier/left.png create mode 100644 PyGame/assets/graphics/weapons/rapier/right.png create mode 100644 PyGame/assets/graphics/weapons/rapier/up.png create mode 100644 PyGame/assets/graphics/weapons/sai/down.png create mode 100644 PyGame/assets/graphics/weapons/sai/full.png create mode 100644 PyGame/assets/graphics/weapons/sai/left.png create mode 100644 PyGame/assets/graphics/weapons/sai/right.png create mode 100644 PyGame/assets/graphics/weapons/sai/up.png create mode 100644 PyGame/assets/graphics/weapons/sword/down.png create mode 100644 PyGame/assets/graphics/weapons/sword/full.png create mode 100644 PyGame/assets/graphics/weapons/sword/left.png create mode 100644 PyGame/assets/graphics/weapons/sword/right.png create mode 100644 PyGame/assets/graphics/weapons/sword/up.png create mode 100644 PyGame/assets/map/Entities.csv create mode 100644 PyGame/assets/map/FloorBlocks.csv create mode 100644 PyGame/assets/map/Grass.csv create mode 100644 PyGame/assets/map/Objects.csv create mode 100644 PyGame/camera.py create mode 100644 PyGame/config/__init__.py create mode 100644 PyGame/config/game/__init__.py create mode 100644 PyGame/config/game/monster_config.py create mode 100644 PyGame/config/game/player_config.py create mode 100644 PyGame/config/game/spell_config.py create mode 100644 PyGame/config/game/weapon_config.py create mode 100644 PyGame/config/system/window.py create mode 100644 PyGame/effects/__init__.py create mode 100644 PyGame/effects/magic_effects.py create mode 100644 PyGame/effects/particle_effects.py create mode 100644 PyGame/effects/weapon_effects.py create mode 100644 PyGame/entities/__init__.py create mode 100644 PyGame/entities/components/__init__.py create mode 100644 PyGame/entities/components/_input.py create mode 100644 PyGame/entities/components/animation.py create mode 100644 PyGame/entities/components/combat.py create mode 100644 PyGame/entities/components/movement.py create mode 100644 PyGame/entities/components/stats.py create mode 100644 PyGame/entities/enemy.py create mode 100644 PyGame/entities/entity.py create mode 100644 PyGame/entities/observer.py create mode 100644 PyGame/entities/player.py create mode 100644 PyGame/entities/terrain.py create mode 100644 PyGame/folder_struct.py create mode 100644 PyGame/game.py create mode 100644 PyGame/interface/__init__.py create mode 100644 PyGame/interface/ui.py create mode 100644 PyGame/interface/ui_settings.py create mode 100644 PyGame/interface/upgrade.py create mode 100644 PyGame/level.py create mode 100644 PyGame/main.py create mode 100644 PyGame/ml/ppo/__init__.py create mode 100644 PyGame/ml/ppo/agent.py create mode 100644 PyGame/ml/ppo/brain.py create mode 100644 PyGame/poetry.lock create mode 100644 PyGame/pyproject.toml create mode 100644 PyGame/utils/__init__.py create mode 100644 PyGame/utils/debug.py create mode 100644 PyGame/utils/hyperparams.py create mode 100644 PyGame/utils/metrics.py create mode 100644 PyGame/utils/resource_loader.py create mode 100644 PyGame/utils/seeds.py diff --git a/PyGame/LICENSE b/PyGame/LICENSE new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/PyGame/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/PyGame/README.md b/PyGame/README.md new file mode 100644 index 0000000..1f3049b --- /dev/null +++ b/PyGame/README.md @@ -0,0 +1,46 @@ + +# Pneuma: Reinforcement Learning Platform + +## Introduction + +Pneuma is a Reinforcement Learning platform created as part of a thesis project. It is developed using PyGame and offers a customizable environment for testing and implementing reinforcement learning algorithms. + +## Installation + +To install Pneuma, clone this repository and install the requirements (`requirements.txt`) + +After cloning, you can edit the agents, create your own, and modify pneuma.py (the main file). Additionally, consider editing player.setup_agent() for further customization. +Note + +- [] TODO: Separate the update logic from the network logic inside the player. + +## Usage + +To run Pneuma, use the command-line interface with the following options: + +- `--no_seed`: If set to True, runs the program without a seed. Default is False. +- `--seed [int]`: Specifies the seed for the random number generator. Default is 1. +- `--n_episodes [int]`: Defines the number of episodes. Default is 300. +- `--ep_length [int]`: Sets the length of each episode. Default is 5000. +- `--n_players [int]`: Number of players. Default is 1. +- `--chkpt_path [str]`: Path for saving/loading agent models. Default is "agents/saved_models". +- `--figure_path [str]`: Path for saving figures. Default is "figures". +- `--horizon [int]`: Number of steps per update. Default is 200. +- `--show_pg`: If True, opens a PyGame window on the desktop. Default is False. +- `--no_load`: If True, ignores saved models. Default is False. +- `--gamma [float]`: The gamma parameter for PPO. Default is 0.99. +- `--alpha [float]`: The alpha parameter for PPO. Default is 0.0003. +- `--policy_clip [float]`: The policy clip. Default is 0.2. +- `--batch_size [int]`: Size of each batch. Default is 64. +- `--n_epochs [int]`: Number of epochs. Default is 10. +- `--gae_lambda [float]`: The lambda parameter of the GAE. Default is 0.95. + +### Example Command + +```bash +$ python pneuma.py --seed 42 --n_episodes 300 --ep_length 5000 --n_players 2 --no_load +``` + +## License + +Pneuma is licensed under the Mozilla Public License 2.0. \ No newline at end of file diff --git a/PyGame/__init__.py b/PyGame/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/args.py b/PyGame/args.py new file mode 100644 index 0000000..53fde64 --- /dev/null +++ b/PyGame/args.py @@ -0,0 +1,96 @@ +import argparse +from utils.hyperparams import HPARAMS + + +def parse_args(): + + parser = argparse.ArgumentParser( + prog='Pneuma', + description='A Reinforcement Learning platform made with PyGame' + ) + + # Define seed + parser.add_argument('--no_seed', + default=False, + action="store_true", + help="Set to run without a seed.") + + parser.add_argument('--seed', + type=int, + default=1, + help="The seed for the RNG.") + + # Define episodes and agents + parser.add_argument('--n_episodes', + type=int, + default=12000, + help="Number of episodes.") + + parser.add_argument('--ep_length', + type=int, + default=700, + help="Length of each episode.") + + parser.add_argument('--n_agents', + type=int, + default=1, + help="Number of agents.") + + # Define hyperparameters + parser.add_argument('--horizon', + type=int, + default=HPARAMS["horizon"], + help="The number of steps per update") + + parser.add_argument('--gamma', + type=float, + default=HPARAMS["discount_factor"], + help="The discount factor for PPO") + + parser.add_argument('--entropy_coeff', + type=float, + default=HPARAMS["entropy_coeff"], + help="The entropy coefficient") + + parser.add_argument('--alpha', + type=float, + default=HPARAMS["learning_rate"], + help="The learning_rate for PPO") + + parser.add_argument('--policy_clip', + type=float, + default=HPARAMS["policy_clip"], + help="The policy clip for PPO") + + parser.add_argument('--batch_size', + type=int, + default=HPARAMS["batch_size"], + help="The size of each batch") + + parser.add_argument('--n_epochs', + type=int, + default=HPARAMS["num_epochs"], + help="The number of epochs") + + parser.add_argument('--gae_lambda', + type=float, + default=HPARAMS["GAE_lambda"], + help="The lambda parameter of the GAE") + + # Misc + parser.add_argument('--no_training', + default=False, + action="store_true", + help="Set flag to disable learning. Useful for viewing trained agents interact in the environment.") + + parser.add_argument('--load', + type=int, + default=None, + help="Run id to load within chkpt_path") + + parser.add_argument('--show_pg', + default=False, + action="store_true", + help="Set flag to open a PyGame window on desktop") + + return parser.parse_args() diff --git a/PyGame/assets/font/joystix.ttf b/PyGame/assets/font/joystix.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5fd36a5435f787a86adba9b38736d0f7fdc86687 GIT binary patch literal 47604 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 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/grass/grass_1.png b/PyGame/assets/graphics/grass/grass_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e59c1d43fcb41203c032031eed641951247f54c0 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVBG5I;uumf=k07mzas_$uEJYX zRWn-4tXHhaxRG4Is$sz>>b~F+i%0=$-$s+@K*#MuOkUggOZP3U>78TH{A~ZZF46k_ zv}3}zGg|~!X6{}$yX0T{>C~$X_iyJ~&zm)AuV(x|`3a0n83n0nvUj8|uYSFG)z8S| zo1gW3kyBu1x$uB%EwcgJ`geUkRrBAK@BQ}k=*NWr)1QBj`~4}ce#8IAZ;wAHo+f;$ zx`9W)p;_CN@4$@pvB&-W?W*5i-~MyOU&+_)zU$eawZIJfD|TQ;O2U~W>FYn4g483v zt~vP`Ds^hjwrlRk;*PI1?0-;Gu6k&cXLfzdTR|lx^>xyJOjk^Q3bWHI5NL#rHTRZljMp|hvBBNa^|MdlzuoyAaVHfx0NsV)#W_C{F`SLbJYn3Mw1;$_k>+;*xJ0Ft6a9ceeZp* zDt<_yeX4I05ZfI5U%6$;cLqs?1~$c(4+}GA#Ty5=)NFqHd^Ip089ZJ6T-G@yGywo4 C;^MFX literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/grass/grass_2.png b/PyGame/assets/graphics/grass/grass_2.png new file mode 100644 index 0000000000000000000000000000000000000000..74c656a291e8549de8983236d758d550b761e2ce GIT binary patch literal 500 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVBGEL;uumf=k07mFBV4u*Ys3F zagoTfgGVy*6COm0@a$=F|G?FBs7j3a;E59_Tp}Wl9JrIx^V|H)@)we;m;5_D>*dUU zu_0GOzJDok>bP>|*S`5B|J+xHUS^2D{WizO)U-O-?vK3!Gs}esr|wwoFkPmfFYfz! zb6@&d$(ObcY#a*?ibk;~@Z7VVH{*+)jjYJquP>h`{NMil@uJ$&f3`RN|9X`C!Rj<8 zRP9tP_JlLr_Z>ek_S^M$<#*$(`eV=1!oM7tGvOX{N&|yb%))HO9#6JoI@>yJ*BJNWZK&E@I_9s!4D?Jay6y@@Sv*?Vm5PAkH!x%sdt z^H%xxYn&2?b=21W72M|DvE)00q(TE*c!unSU1mSB1N0G&S_L$s@|*63DE5f`qDBVl zFr{bGTaMk6m#D6JeM@mK`w0d{lN~`%8N`x*?A^O;&%QjH_zy+@qqg1TJ@)Yu)G^O& z9b4ue-aOATDZT2(=e00{)c&V)BpOgKHVnXWFdMrRGne1!zT`v;Vil+2VkxB`Qg2sv`FY!nf3 zwRruLKQH3j8J;&ackgVh{?BK8_)dYiWSgK#;UpEm=ks-@-xcGT@jXtztn$%>XNP&1 ziW``C7m4g>Pd>NbrflyQxwv&{_v|C~f4e3Bwa8TQ2ZsT>#svkhRs1KcpC8}C|;Z6MvV0Uh)JrMi9{l=X$e8pR?F8eN@_kd}`j-a!5_zz087$0By zsNmVJ2g(Oz7C1C(th8hJIG0oDhPpz`x!q01jw&#(yfb#>`}f!OzSIH18kQN%A{hdz zq09wx4exK?sLp2o`lvETjsYxubSM9VeIH-i`3vqg`t6qU?yt=E=ii)n{GAB5LaM>o zVad+>>0d7Wp1OF^^`Gzj=dC!aTTl}R3z#ys69;R%yYI_hn;~;l>hZ4q+6UbmEFBuz z0_Xgf{M33n@_Kz;4W}K`8AdJ>iMGTO0zopr0L#kz An*aa+ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/icon.png b/PyGame/assets/graphics/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7de97f272d3a3e48efde54023652dcfa7d9ef1 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R4_ zr;B4q#hkaZ4EYWj2(TC~@;cAG;`7EY4+TBv_XmDv`n6@DgWiTG5{q|7yKld&Ahjuq zzc1G^=XTkrGm^3lyxb1#4u_d8FkaZeP{LrM!vGa}ysx4A>EU<%OS7Jves#WZN~kd3 z;ldrh>280jR{!3+ak6<6TZV*!?I+DiYCFsie9;X!eSdI-p3mB(ee-dTV z$flt0^)IVs8K=pDrK>loDx3H$VAPeIFv-~I63cfslh^}S_#LZtFO)Ef$t+^<73K?U kQ1ji-s#B29fZOBd-`TT{EGs;E2pHrHp00i_>zopr0O$9hO#lD@ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/bamboo/attack/0.png b/PyGame/assets/graphics/monsters/bamboo/attack/0.png new file mode 100644 index 0000000000000000000000000000000000000000..c14d75bba75f260553cb3852aa912d9f79db6d37 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|Vns zPZ!6KiaBp*`(`mY3be{jlyMMH@;Rf+H1A02rq5iKPU{|=(y1jZc3oK^36uent>JEky1Gf0>7Zn!Zk;rP!Nv*yJHZ>eqCC&;A)cG1^{7u)w= ztYu`mw0tK6*pDx-GUWR$d>tsCkbUI*!;jA@K9rUUu=0lgX96R18my1jZc3oK^36uent>JEky1Gf0>7Zn!Zk;rP!Nv*yJHZ>eqCC&;A)cG1^{7u)w= ztYu`mw0tK6*pDx-GUWR$d>tsCkbUI*!;jA@K9rUUu=0lgX96R18m+ zUj4P|WsOI6zs7tWqYtllf% zd$D-ayZ}39un||7Bl7667J?;%sDf1fV9dJ0`Q6+R+d&+qRb_ZPt-y6)EY8|JoVONAIH2%m?&GGv+tT*2-J$npBYrDp0j7qc>BLFzhU0Nta)Eq?f4Ze7_u0%)M_2R^zl{C zo6G5U?Bw@7`+3<48Llv0x$wE+jqIEZ`2z>+4wkn}0xSLX=I_62H8pWP$EKfN-+Vs( zz1Vc9bL!vJmn?e!QzIw;QGPQE$c4PN!aYr<$Itzgym{}woI?S~Oq1^nE`Rk6qxaXa dfz7L9IR0z?%LzPjkAU&Y;OXk;vd$@?2>_uj)cybf literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/bamboo/idle/2.png b/PyGame/assets/graphics/monsters/bamboo/idle/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c14d75bba75f260553cb3852aa912d9f79db6d37 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|Vns zPZ!6KiaBp*`(`mY3be{jlyMMH@;Rf+H1A02rq5iKPU{|=(y1jZc3oK^36uent>JEky1Gf0>7Zn!Zk;rP!Nv*yJHZ>eqCC&;A)cG1^{7u)w= ztYu`mw0tK6*pDx-GUWR$d>tsCkbUI*!;jA@K9rUUu=0lgX96R18m;8mc8-rQeEf7`F#d|_i>-#>#px!(UL#{}jZOg9dsH&1(!lW?-G zEaM{7&cgT17rvgo`5^yL-3Duiz2-A|WDbZOSY|!bFZO$_{_k(=HY|mP$v(z4A7`%D Tz3{mn7?lj3u6{1-oD!My1jZc3oK^36uent>JEky1Gf0>7Zn!Zk;rP!Nv*yJHZ>eqCC&;A)cG1^{7u)w= ztYu`mw0tK6*pDx-GUWR$d>tsCkbUI*!;jA@K9rUUu=0lgX96R18m+ zUj4P|WsOI6zs7tWqYtllf% zd$D-ayZ}39un||7Bl7667J?;%sDf1fV9dJ0`Q6+R+d&+qRb_ZPt-y6)EY8|JoVONAIH2%m?&GGv+tT*2-J$npBYrDp0j7qc>BLFzhU0Nta)Eq?f4Ze7_u0%)M_2R^zl{C zo6G5U?Bw@7`+3<48Llv0x$wE+jqIEZ`2z>+4wkn}0xSLX=I_62H8pWP$EKfN-+Vs( zz1Vc9bL!vJmn?e!QzIw;QGPQE$c4PN!aYr<$Itzgym{}woI?S~Oq1^nE`Rk6qxaXa dfz7L9IR0z?%LzPjkAU&Y;OXk;vd$@?2>_uj)cybf literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/bamboo/move/2.png b/PyGame/assets/graphics/monsters/bamboo/move/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c14d75bba75f260553cb3852aa912d9f79db6d37 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|Vns zPZ!6KiaBp*`(`mY3be{jlyMMH@;Rf+H1A02rq5iKPU{|=(y1jZc3oK^36uent>JEky1Gf0>7Zn!Zk;rP!Nv*yJHZ>eqCC&;A)cG1^{7u)w= ztYu`mw0tK6*pDx-GUWR$d>tsCkbUI*!;jA@K9rUUu=0lgX96R18m;8mc8-rQeEf7`F#d|_i>-#>#px!(UL#{}jZOg9dsH&1(!lW?-G zEaM{7&cgT17rvgo`5^yL-3Duiz2-A|WDbZOSY|!bFZO$_{_k(=HY|mP$v(z4A7`%D Tz3{mn7?lj3u6{1-oD!Mx}ve_KB5{+TAa?v{HwHsS21gGV=%%ZVdtHwIQf2{5nx9eQ=!2N+*i$VD7@nS!);_HvgN*?nv0uwk=xYF)t7^~L|& zKk(w-k-5|$2_@CAg}=(Me2~_kb98ca+nSKjhg{M>-dm4-D+rFi{nOK7+Q{iLCNVNx zeYh4QkKQFVA5bQ5;St|SESlu^!dn|y2!dUsIdN0@;mJm{8Z-0ePnkE{!)YpB* zwU$^M#jj;~n~W6hw_(k#zh-zt(!m$vhsQIYv#Uy=UTo_&`0cF;A&3k$i<-!B^YF69 zA&tV#Rm9_WE{3RiR8@)hhP4O}2pnW!#Du9KGcNu?{?Z_B-hk?)da77f2jLr}DQPrN zN=f)=B_!!8nUU0bBt`9F?#7$|37Sq1nT*U3zgCPmuYvUN4RR0e>&dQb-FWOW^uqMy zCi*)Sr!}XZtq5K;^^SHHl`SyS+qUm!g~G8pJvT^66;$~n+~rxq9(7O!P21#?$^UqI z%~ymL(zJq8M)91%eDaRS19pA|P)N)x7FWq~q>|Mxv*;}?W?C8w4mzZWl})Kc@Md$V z^yFtqJkc|Qv7D~jpCjrf3n2B?ZEkC6d5w(GjOx)**|T8GVm=TT5u+)Iz@1-O_E%s# zn|Y;v>)72I`Onkk7ka05}f7rTJs zh+&%kCOhiAMUlb8Oj=U$u2p!g5|WdRJz)u#Hf?eCddNn`G@8Vhnk&rAKof+KtaJ;Y zTk={N{_dB!`5_e+{CIOf>N)FzHxUg@Ptn~Xky#fUBR-reV-shu!xp-(c4X|ge6^eP zc)zc^G~~wFcPs^^_xcZ+2Pkheggv;tf~AqH2fD(<1T; zzWQ|5@und{)iM+04*)T%on|xH+*(bq#?Z7rHM7RpLGZ=9Vqoec2oL4R80?{{F;eOj zqmB#%#54C}v&A{e2PHb)D50?M2mAkJYa%eJ3b?bl!so(JX5?@up$eM*5huIl?vHXb zZbo@geNnBgY*e0tp4g)CI*yoGdGdvsA;-?Ez8>31#-)A0-10BeT9|!S@`V<$sMK+8 zzl#hE)dd%R!VJQ<7`>br^) zum1e5xE;?+l$D}{Ii49~Cu+2Lxl=$IT1-*!RHzPq6O^nIG(o#qFcs{bI)+(vg^M~) zhs*cm8NZ*;+;9keZZ&C|9xzPPzI%M!OknQ+fan`vn+wb~_|S|)f;s50jL#!RiI zD;l&YjNHQ3%Jw}FN2 zfRC*t;7GM{T4O4ZUeQsnddDy68xMAEuh6cZ z@wCZj+9QWU%}_Gx^Pv(8P4BuRle75mxv^NAnivN5E%>$`dB(1x>PPmGaZ^h2y@;Aa z-4Y=!kfv{Xs-o$~X0BNE7N!(TK~m0LA|JXkS{)Z1UM+e_I9Q2cLW{(~iSv;7253z( zjNm8>u7WeltRGdJycvEQ7kW+xdw@ML4kM9J zxXaU0Y>N#Irw_$(4NX2OUNg_wH)`ryI~dt#XYYjdauuIwR#$_<_3F1rxp}R(nP0U+ n=e2(FtFCBkk^kLawYVyb>VD`e(;c{Z+a3D@;VAF-34i_%ZK&do literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/raccoon/attack/1.png b/PyGame/assets/graphics/monsters/raccoon/attack/1.png new file mode 100644 index 0000000000000000000000000000000000000000..21c4d49c7aa8290dbe7a56002d168be1462fdd4c GIT binary patch literal 1860 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 K+%{e$@zVcRC0ITH literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/raccoon/attack/3.png b/PyGame/assets/graphics/monsters/raccoon/attack/3.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2d58f94b9f31370c61e245689281e1f1818609 GIT binary patch literal 1780 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 nU$ecguCUob&B6cWoo6!ab-oURw9<4tnL zCvU*#Z#^`>#mV>ueQvPv)E7onjmvQ(nZ?^s~!?;RTj*|1e-&{JW zA@Re}@KF1hiGLW`m;UZ$CEy-*j+uo0UF*w?qd4M7Ce!X=io!T#P`HBFksrLENYEzA0hHYC(@%Cu_^i3(xi~IC| zUMlR7j;~!|!BC^^*RCge1huYv_kQ>p&P6?eWmB4W_K1k!BJs)tQtb;X^iBhFP)<`^ zQTbI~E8^V2ot6R5Y%)Dj;Ps?VlZRUz8Z%zA^U~{#&j$gv;q@~mfFMSwy}Ewo8tjKL zSro^i{-N-LCY|x0xd@^G*F6sHHkf85LH4^J$K%lZvAFNg4$a%ES6CjBih=rA3^rfm z66kK>Q`l$>iZt+4Hc^n6@iSM&VPLYlRUlP`uhWaXHdUWd7(L??ASxCpgo8w>4YUKD$=r z8}H-!oUe5oV0}IO9dc3z7neW!iqtm~Gr?E7LtzMN4yCN#E;R6JBW2b}CQj*l(^483 zPp1N7NA=bSjzS|d6agrG(dU#5boezFc-ju8i!%k&i-IEJG2lz&f+!439jEoC_1Q1G z3Gfw+qy0nu2VXQ))ep zYw)xH>LiVj55_MA%8kE^3sqQ<))Uac60$El@u6SqKdSKCOMx$t@NJCp8CmEQDD5u$ zqnsmR^`JL7zTfVR{S+nKLcZNK?qK7SM0#jw{1JnK~L&7!aEx|B2&uV4^42l))Q!SY7bWf$j zRE7aN#on(K5we0rvG@~7O=(4m<0(3x^vTlAKH6STdTJ&hQCJ?;9D+-ojB3sgvN0yO zWF(pZ2A!t4Dq&wo3eY3yEG5y^*@N9FJM-Bu*L5Vd^B|90eSUe~a z%a=r{2QdV0YKQsqJ-YK*9i29O;s${pj^9AM4&mpF?DYVTg zr7D+8w)zgV+j@rX=hbXWS$5;{^?^F?35NRkS@N9FirM_e&6{?o2H*5mhz~2>lc}kz~lx*ZLhKktYV;uUj7qIf6>w; z;lTW`@JQvVqR+D66L-ip+icrA{T3wL_!)ez=Q5(7|KC&pd$aXqv)|ZpN;6a4m;6US N6~0G02=1>q_isSM4wL`@ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/3.png b/PyGame/assets/graphics/monsters/raccoon/idle/3.png new file mode 100644 index 0000000000000000000000000000000000000000..dc57a965485110eda704cc2919b7eefd1b6d7c5a GIT binary patch literal 2129 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 U?xxU_0E5YVmy#}dyZHRS0pu7JjsO4v literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/5.png b/PyGame/assets/graphics/monsters/raccoon/idle/5.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ede568eecbfc4d6c53cc3f9828b173e598543a GIT binary patch literal 2115 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 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/raccoon/move/1.png b/PyGame/assets/graphics/monsters/raccoon/move/1.png new file mode 100644 index 0000000000000000000000000000000000000000..34410ca24865fe70bfb77dbcf7d01b48027261a7 GIT binary patch literal 1605 zcma)7dsLEl7{*Ir-goSzt5DZPw^nMmQBYwXi#d(WWwyLwuC)pSE5!>cGV6Fcmd%~z z9VtD`EJIU4LGoI&rh>On5yVVGhCl{Nh~PfJwzL2Gc?=a%8lmz{6Qcc^BBd-h1m z4)BJy5n;&$FJCc-_=a0Hr_n+CtD5F4on!s8EG)nlU~4zy>k;F^+ReQ9sC{z81k(<; zsF07Jc0wC;Gd(WEKEpn;>D$Cfcf^=doDr_p!%Ov8ODjuzOZ&Z&vu$E0Z8nNB$D@); zmkp5~q`le&C*(>d?8?tQat=#JR0F};ARv6xGx*#5LGJpbDIs^1J;?nuDJCS=R5LV% z<#>wi6D7EOwbp@tNy^2EMyyRZerT^736Kyt48%o&wm{K~ZNn%QXE|PeHh!M%S&keL zSBH`0GL!ilUIvmfYW;t_B{Qx4D_FUzd4Ta^TyvJG-CASvzcj`cx5u@-lEdO*BzayS1-rIB!&?q5!P-gR$W3@xSS(}U#xDq z?H-b;*A7L8d&fr)Yb*7S5x&F~^?O=(^6%()Gwj*+?&ld3cs8zhV$b#`-C=^YLnA!V zi$VfYIu|TH(WAO{e3gY}Xs9>(CYPB%~poCrVaNqZFkg@QKUEwCQzg0eNiv{LVr06sm(7b_JS)lk_EZ zF{Gt)PtElC7vQM3!j|GI8?$HVc9QM#=fTN;M&82oY=TmSa`9gccS2$lYyoQO`W&MK zslkZL51MrQn|zW5*1F-Qzs^@cDt$o=DWfxMPcyH81TDQ%xzx4}8q zGglYjF~*|1D$?OT=Cti|C8r_uCyMbB0S`PF zl1C55t*RHWhppm=)YjRhl)QHcYcqb&U}qXaArj=o zz=g%sxbE6`UD|>2Rgkj{R!tN6-!!dIHLdXFTvwhKhNKzDet_hus(8EGUcY)ps%a~q zo$~_P(%6{20nl|WCKr-J;R#DxE(_@)6p@ef&tM{RCYnR@+RXa&qabKyW$A=>8kX{t z6ulvu7^TxU@vE^Sh`<_L)t?2j${$61|ph%URRL^)94nMB&HzsLzkxnvY@Grk}aj}060tg zo5SQ_D)OM9;m*Y`MQu-n-DCfm*aS4(ub0u!zdjykoC#I^1PdF#yH=W^8`a~*C}UQm zb^Y`E4sN`F8_1w-3C%%Ml^YLHVVVV&tOkq!)`zk>ONz+40N-I&g=0q2E1}P&{1?CJs|d%e*lcR^>_dP literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/raccoon/move/2.png b/PyGame/assets/graphics/monsters/raccoon/move/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c2992866065a190e6267e7c3d9dc95e35abacfeb GIT binary patch literal 1547 zcma)6eNd8j97knBW!iETnuIs+ba&esUF8c;k~KGGrLLT&GsR|Ro}o^CB3}TlE?34n zo4ssK&1~jeNaaiMAY$vq){+!wBqHJ3;>CMJ4wQgBvIo$1x7#24<9Yf0?)UQfem_NXXjtB3FzNtyta~RB9(%6`7pBQum=|5ZOc~2+_wj=Rb;OrtiSb@p{mN$Kj7VfgKJ1<4i41a zt4K>5ok*H^`V9{dZXAzVPZuXAn3ZLs3^x{(>062MaQDKK@#MgM=dWWB*uOCN*L-2d z8pbi0eW$EjQ`A7GvgDns7zw_F6`3nCqjA&CEv(mwtX*7?OO(uQs&aGlbn`4xu~}>* zTW#hmp#4E(jlr(7y`T8iHNL+kZ0g3FiBce6EBKirT;jYx`cQ!=IlBjhegw2<&Gr=T z*tY}hKB+8+D9575VhKZ4>XA}0*sGb{%bHiHM^43MMptgDL@&iU@mx-=NyX(eCc;-X z)K^$%)LcHt3THplbIhjchqBvE_HLs=#NhvMeObM$Sjr567y<7Kp$z~e4s30zDa%3- zgHoc`lh$27sUT5Y1f@NhgNAa|ak98Pp+zN;=*6s?k98+_H55))RB|;)Pk=Zh$W~eW zVfW(>W;Oje2Fsw0%SQ>Qoi%Eq?6Sc&lYe4v$S%^>5*i;qA{`s(YfXmiyU+qq_$4Ys zOhd#fP^pNg&e{DAr!oiS)JrJFFgHB;vd8Ta!wx{BpwPRbs9uUOp6$Cu`1UJL?X9w? zub=I2k&MbI4E+uuzl)=`S~7hJ4o))th!K#)I5c&#TgC;I`x%jYS*shKV?C>fP~lS{ zLHHi6h%1$x7l!U@?+Wsn@XKSqZl)J>*^BIr8G7CU_v0TPimt3GEm6tM#zFXgt+L~# z0+PaX;XShy<-ZWW98Vs~!L5Ugua5jKm9z%=2t^O6=H5{U8P2^QbSz^@;=%Tyy+}E$ zaY0JL-2+qoiF{j6zOLL&dsWzdEA-9!&UD-~qWqZhUa-@l(O?VDL)O<(+-{;gO=L=T zinmPZxJLaHt%XX5Z8(})s{0d?29qOBpgwpcg(-z_`C2YZ{6a}7Fj;p3h9Nckn*MB8 z=bY7Y*q0En9hK-wi$?-d`dp!AP8W^aI!&`Z5NEL(8g82BdwxF3p3d&I_>kyu#b1Ls zW-wB&>^pki;%g3jkz(I6Jh@;#;-xAFQfKoN!~I%ycpis($40Ebevf_ITSP8qaU4pb zbTf{qOca3@yrNd7R!?6Y77QeAwJU&bn+FQW;hL<^tx%yn_hO%SZyi$L^3nl6c)q{( zPOPC9 zY<@xFm1HcGT$fazOiwXcCgly+y5pJFnP1w7k<4__Y;ny9(qwy`3@jdYdXvyQAQt#C zzd9fBPtR)lb;2rmIV^Z2u!Wb2FS#P4^EY_&%_3lD0Wn1P{q7tdQXvwP%HTT-GPJdi zgR16Pw!T%#uTkhWx4E2tvLn4~Nl%&;IRm1w&;(g*Uo1g$0aR_g6}s;tNJqW_CkjKP+6d%*EJ@eS#Y@Exu literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/raccoon/move/3.png b/PyGame/assets/graphics/monsters/raccoon/move/3.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9ee77ee9f3d5cd8112002688e821ded2a8126f GIT binary patch literal 1579 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 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/spirit/idle/2.png b/PyGame/assets/graphics/monsters/spirit/idle/2.png new file mode 100644 index 0000000000000000000000000000000000000000..a46d5e2240b2388e6b84db6e35974bf1a7f95376 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|TRn zr;B4q#hkaZH*zvLin!QrWZj&7=){o#gH2o;Ik`7*Zsbxvc;UziHNDLp#{2Yl=+u9o z_vv|RH#^_qKY`cpE_?smGiBKp1}RAg?gcY1GUydl9Gc4;=4M)d-pVw3p0`~ Rz6Ay}gQu&X%Q~loCIDaIq`UwC literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/spirit/idle/3.png b/PyGame/assets/graphics/monsters/spirit/idle/3.png new file mode 100644 index 0000000000000000000000000000000000000000..15e5d4c642e171fa5925d1f2d8817147b8344319 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R4- zr;B4q#hkaZH}W1b5OC#8VzrvKV9`RCMM+#ogm?}J2?hr!23`u-=wj8zQQCLNO7sEfnD7E=8bDB-|x!zoX;TXz`fvS6~D&S zJ!=bRec_zIxP@U>0soKfv$iksZ{S(LdSOTPf%Vz{lI=d*t#-f9G8bgn*%$w~r);oY z$a`+O9ivf$m_zUz#^n32qiyfiI>M~0Jy5k(vgdvO?eO{ilOU>;nKKwoz{+doAH*Kd zUjKU<+`mdKI;Vst0H0Z>j{pDw literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/spirit/move/0.png b/PyGame/assets/graphics/monsters/spirit/move/0.png new file mode 100644 index 0000000000000000000000000000000000000000..0afa8f17f3cd1fc197e977a1845cdcb8170f4ad2 GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R4> zr;B4q#hkaZHu4@a5OLwW5PZ?Kgs0(%fzKfUpF;){B^vlH1{yMOmDV+W{b}a^;{IzT z*OMNCeOm#k3RWTSy#LGbvjfyB%V7WN1f++X8MKf_Ai_h z7`HIYTDL|0#ou?;AI}NDiBh`7`BGScIfK#U>~ls{FWDsPLuC`*YUHa!^*@jeShQuo zz}psxUMWcj?gbM;hP?XR@HTTsOnm?EW#_y9m3z!*07uTAIPdf7 m-g6wRV9N^F|5!tvng926qKW6$s7PSoGkCiCxvXRs~?|)7gp&OcaAFhnu*?q=4R{?_jG z_mzAr?+QK?R$$IxH1T~|&bWJ7uKF6j?t?!n>uTq$-y6^V_|jYfJ4TQ}!8P&|yjKb5 zwBP9aSmp#VhxZ=iw2jt^HB2cCx(&;I%uL97Z*O`?-GS`_Q-<1h{tZ{|iMRMS@GM}x zkWzkNzx{Vzs8uKVPQ-rReL2-&pX}}VM{AAaU)8sYK;@3!XMH1e_HD~0*-1)JgMU>z zypvkD_Zdw4JH8FoA8$QpytjA1DnyCe?|BKYY7%nxeCId}vHnhZ>)!i3l^1Ot)xoa+ gQ{7mv3{m`y*DfqwR^PIU5g7Iip00i_>zopr09`7l$^ZZW literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/spirit/move/2.png b/PyGame/assets/graphics/monsters/spirit/move/2.png new file mode 100644 index 0000000000000000000000000000000000000000..809ebc2e692f13f67befd41a4750a55ede7eddbd GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R4# zr;B4q#hkaZH}W2G5MVK!AUrWLMWo?L(ux+P6)j0RfeeyGZZ3=`j_hlA{?q>0rMD^b z4`glKZghU9{+04e;yx4}3!{od>koD&$gFwELt?vVA&{P@);fA;K&`P$;&z_Wn$g2}z| zrk%#~50yEU@Ao^mb3ZRs?<#xtEAuMzp}a2ZhIv0PSs#X)^oDOi`aZLV!V1h8j3y`f zPR#xJcjx>$`ODv>7v8UldpS4p2g?bDC?^5b;^pZ1(;S3iWZ@ zIdA%?8Ox_^lxj;9o~f(b;Kp`=DdXD~hSM9@#X7&d`#tpB*N4Ii%o&U(o6k3d9N&Fe zHGBWFuLUnT=QBt;a4(oy!*=7`a;v%>@7!LW|7#s}``q(;-*urnj;1@T`n>J236%Rz za>KTB(TCI>Kvt}}Q_Q&Q^U`|h7XJpG1*{iz-o+>!z2B2r`@0n)ppwo|d*46tYsB7_ z&znAQPGH=^FzeBI#^>9l*UsOb7Wg|7YEajChT9kK@cG}Z^!~wef+33G?34G*Mb!*$GG`e#_kR@At%oX^bCLgt=^OSd5)8Ty$@UGKX0S3ZV9j{LUUT|U zxB){{!?O&&48z;I7G|GuzZBlUc!9|TWH4AY!xn~KWP#6q_6>FS^Dln2bx^5g1u6O5 zf1ktk(cc~B5y?QsXVrf*>AHOv)4x002jUo!|8oB4xYuXO&bepgz7!Z#44$rjF6*2U znl_Z){>FLpeY&PRqfvvHgEDglqX~%d_#5LrJID7{Z}*3)6Et8d2MRDi+gWL=S*bW!Z7Q@PX_+=@6uj>yY&mIbjf$N{<)t73mD!^ob!+| L=r1s45Y_?!V?emt literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (3).png b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (3).png new file mode 100644 index 0000000000000000000000000000000000000000..644197e0f6569f832355d754d02d43fb2b787f9b GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|O(M zr;B4q#hkaZ1NoW^1Xx!-)QCHHxZ3KEuJoj+ZlBV0J5P?or?*YfosxTd+L=2UjI%!N zv46Dj-Xx9Y=iiO0_TK&ZQu_b{P`Ff5esj3Jo8MR8ct$n{?h9*9e?4C)b)C@^%wa$N zXpX?l+P;jR?>!*$GG`e#_kR@At%oX^bCLgt=^OSd5)8Ty$@UGKX0S3ZV9j{LUUT|U zxB){{!?O&&48z;I7G|GuzZBlUc!9|TWH4AY!xn~KWP#6q_6>FS^Dln2bx^5g1u6O5 zf1ktk(cc~B5y?QsXVrf*>AHOv)4x002jUo!|8oB4xYuXO&bepgz7!Z#44$rjF6*2U znl_Z){>FLpeY&PRqfvvHgEDglqX~%d_#5LrJID7{Z}*3)6Et8d2MRDi+gWL=S*bW!Z7Q@PX_+=@6uj>yY&mIbjf$N{<)t73mD!^ob!+| L=r1s45Y_?!V?emt literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/attack/0 - Copy.png b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..644197e0f6569f832355d754d02d43fb2b787f9b GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|O(M zr;B4q#hkaZ1NoW^1Xx!-)QCHHxZ3KEuJoj+ZlBV0J5P?or?*YfosxTd+L=2UjI%!N zv46Dj-Xx9Y=iiO0_TK&ZQu_b{P`Ff5esj3Jo8MR8ct$n{?h9*9e?4C)b)C@^%wa$N zXpX?l+P;jR?>!*$GG`e#_kR@At%oX^bCLgt=^OSd5)8Ty$@UGKX0S3ZV9j{LUUT|U zxB){{!?O&&48z;I7G|GuzZBlUc!9|TWH4AY!xn~KWP#6q_6>FS^Dln2bx^5g1u6O5 zf1ktk(cc~B5y?QsXVrf*>AHOv)4x002jUo!|8oB4xYuXO&bepgz7!Z#44$rjF6*2U znl_Z){>FLpeY&PRqfvvHgEDglqX~%d_#5LrJID7{Z}*3)6Et8d2MRDi+gWL=S*bW!Z7Q@PX_+=@6uj>yY&mIbjf$N{<)t73mD!^ob!+| L=r1s45Y_?!V?emt literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/attack/0.png b/PyGame/assets/graphics/monsters/squid/attack/0.png new file mode 100644 index 0000000000000000000000000000000000000000..644197e0f6569f832355d754d02d43fb2b787f9b GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|O(M zr;B4q#hkaZ1NoW^1Xx!-)QCHHxZ3KEuJoj+ZlBV0J5P?or?*YfosxTd+L=2UjI%!N zv46Dj-Xx9Y=iiO0_TK&ZQu_b{P`Ff5esj3Jo8MR8ct$n{?h9*9e?4C)b)C@^%wa$N zXpX?l+P;jR?>!*$GG`e#_kR@At%oX^bCLgt=^OSd5)8Ty$@UGKX0S3ZV9j{LUUT|U zxB){{!?O&&48z;I7G|GuzZBlUc!9|TWH4AY!xn~KWP#6q_6>FS^Dln2bx^5g1u6O5 zf1ktk(cc~B5y?QsXVrf*>AHOv)4x002jUo!|8oB4xYuXO&bepgz7!Z#44$rjF6*2U znl_Z){>FLpeY&PRqfvvHgEDglqX~%d_#5LrJID7{Z}*3)6Et8d2MRDi+gWL=S*bW!Z7Q@PX_+=@6uj>yY&mIbjf$N{<)t73mD!^ob!+| L=r1s45Y_?!V?emt literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/idle/0.png b/PyGame/assets/graphics/monsters/squid/idle/0.png new file mode 100644 index 0000000000000000000000000000000000000000..a9beba83fa4d8914dc5bd334fe651e3d89178fd9 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5D zr;B4q#hkaZ5BeT<5O6i@a$$ZV;ys1IG=NDcmtiSGu0kM_sRO6SzNJil=Nd2fsk$Am zsC4;!KlkyCf4^qkocSiNt#Y2fR_5N>ilcMJM;JAl>6!L_2n6j8pIqn zZ?xP}zmLyWp}Ky`*00n086+LJ7f9x)zqoq!p5?sM>hIqkmwshr1BphSVU(+n{cf9c z?zYT#4XE}i`3)ydK9Lcuo%gFj0c4=@ocCq1udB@3t6ytE)GYqmur8|)Y_R8g_C5Dw zOs>b<9ZUODQ2)(4^S+H;t?A?2r&mhG@2xXSUdzrhk#P&dtPe5?o#!|Mubr#({>d=` zByv=8;nt0of9^vqzFf<umdKI;Vst0LXH}EdT%j literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/idle/1.png b/PyGame/assets/graphics/monsters/squid/idle/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f854919145c035535d18fc6e142abcc5b4401df4 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5d zr;B4q#hkaZ4{|a&^0>wd<~aE4MKoPY;B3lWv2;Z)$Fv0AsHP3(+8?&a+4zd_7#i29 z{=a*y^!j=AlPzx|w&vdM_L0|RIO|Ynur52;bl<_k<0cvAT8 z@^fEi-t#^Bfi%vP2!*9cyFzLDR+31nc%;*(2W?0a|i;ialW?hL#R+zy8;9Rf}3!OX|=*kh($ ze)8*Ml=|zpX+IWj5#Rk+IdXlP@1}Y4^G?qC%%E(-pv%y^lg(p|=|Qh|bEdcSGe|Xv zH7qN3(=az`uZLMHvYxT%{rsb@qz)Y{k!al($Wv4HcMio;~AFR9`mKzGHv$KHTS&XY^N_zaSw0 TX~Rcg{4jXB`njxgN@xNA?(M<} literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/idle/2.png b/PyGame/assets/graphics/monsters/squid/idle/2.png new file mode 100644 index 0000000000000000000000000000000000000000..a9beba83fa4d8914dc5bd334fe651e3d89178fd9 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5D zr;B4q#hkaZ5BeT<5O6i@a$$ZV;ys1IG=NDcmtiSGu0kM_sRO6SzNJil=Nd2fsk$Am zsC4;!KlkyCf4^qkocSiNt#Y2fR_5N>ilcMJM;JAl>6!L_2n6j8pIqn zZ?xP}zmLyWp}Ky`*00n086+LJ7f9x)zqoq!p5?sM>hIqkmwshr1BphSVU(+n{cf9c z?zYT#4XE}i`3)ydK9Lcuo%gFj0c4=@ocCq1udB@3t6ytE)GYqmur8|)Y_R8g_C5Dw zOs>b<9ZUODQ2)(4^S+H;t?A?2r&mhG@2xXSUdzrhk#P&dtPe5?o#!|Mubr#({>d=` zByv=8;nt0of9^vqzFf<umdKI;Vst0LXH}EdT%j literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/idle/3.png b/PyGame/assets/graphics/monsters/squid/idle/3.png new file mode 100644 index 0000000000000000000000000000000000000000..9c588e17c18d76cf137b1ac4f0fd951ae7ac7858 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5P zr;B4q#hkaZ5Bf423b;m!bh15|GF3zIiUX&|7RD(~8OlLk3)nOmGxJwATrPU>Bwus! z$s50g&(@o(`+a-;`uv)`pZGr8#HT)+rQ2|p%YKLS@x>D@d@f(`_mf%w?+fPy#vI0+ zun6P!{^N`7S3Gm}jWm@wx@%r|{V$di4BHsYnAfq~HU0W2vS;njz&+PjKg*U4P-4Ep zbc1L6>#eW%-Q9g`al+Z?CH@UO3ET<6w)_^`fA4cGiJf4_Xw;zF;9H^Ju;rcL#s8P% z4mhxFVBN5?ieXcU|BKkq9#G@2#w{?tClyzfKM|s%cPF1iLF|XGCGj=;f6H}$y#4xY z=cRv@_y37KettHjNB*1r(HqruinUBB4ABhI<@^qNY!7RHLTJ+u=>hk1y{2wm;{@a-0f9WR!*d$JS q;h0(1Y_%XZ&F+59xYl!igZ;yjC8E9`_M8RA7K5j&pUXO@geCxSi_0(o literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/idle/4.png b/PyGame/assets/graphics/monsters/squid/idle/4.png new file mode 100644 index 0000000000000000000000000000000000000000..9c588e17c18d76cf137b1ac4f0fd951ae7ac7858 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5P zr;B4q#hkaZ5Bf423b;m!bh15|GF3zIiUX&|7RD(~8OlLk3)nOmGxJwATrPU>Bwus! z$s50g&(@o(`+a-;`uv)`pZGr8#HT)+rQ2|p%YKLS@x>D@d@f(`_mf%w?+fPy#vI0+ zun6P!{^N`7S3Gm}jWm@wx@%r|{V$di4BHsYnAfq~HU0W2vS;njz&+PjKg*U4P-4Ep zbc1L6>#eW%-Q9g`al+Z?CH@UO3ET<6w)_^`fA4cGiJf4_Xw;zF;9H^Ju;rcL#s8P% z4mhxFVBN5?ieXcU|BKkq9#G@2#w{?tClyzfKM|s%cPF1iLF|XGCGj=;f6H}$y#4xY z=cRv@_y37KettHjNB*1r(HqruinUBB4ABhI<@^qNY!7RHLTJ+u=>hk1y{2wm;{@a-0f9WR!*d$JS q;h0(1Y_%XZ&F+59xYl!igZ;yjC8E9`_M8RA7K5j&pUXO@geCxSi_0(o literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/move/0.png b/PyGame/assets/graphics/monsters/squid/move/0.png new file mode 100644 index 0000000000000000000000000000000000000000..a9beba83fa4d8914dc5bd334fe651e3d89178fd9 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5D zr;B4q#hkaZ5BeT<5O6i@a$$ZV;ys1IG=NDcmtiSGu0kM_sRO6SzNJil=Nd2fsk$Am zsC4;!KlkyCf4^qkocSiNt#Y2fR_5N>ilcMJM;JAl>6!L_2n6j8pIqn zZ?xP}zmLyWp}Ky`*00n086+LJ7f9x)zqoq!p5?sM>hIqkmwshr1BphSVU(+n{cf9c z?zYT#4XE}i`3)ydK9Lcuo%gFj0c4=@ocCq1udB@3t6ytE)GYqmur8|)Y_R8g_C5Dw zOs>b<9ZUODQ2)(4^S+H;t?A?2r&mhG@2xXSUdzrhk#P&dtPe5?o#!|Mubr#({>d=` zByv=8;nt0of9^vqzFf<umdKI;Vst0LXH}EdT%j literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/move/1.png b/PyGame/assets/graphics/monsters/squid/move/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f854919145c035535d18fc6e142abcc5b4401df4 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5d zr;B4q#hkaZ4{|a&^0>wd<~aE4MKoPY;B3lWv2;Z)$Fv0AsHP3(+8?&a+4zd_7#i29 z{=a*y^!j=AlPzx|w&vdM_L0|RIO|Ynur52;bl<_k<0cvAT8 z@^fEi-t#^Bfi%vP2!*9cyFzLDR+31nc%;*(2W?0a|i;ialW?hL#R+zy8;9Rf}3!OX|=*kh($ ze)8*Ml=|zpX+IWj5#Rk+IdXlP@1}Y4^G?qC%%E(-pv%y^lg(p|=|Qh|bEdcSGe|Xv zH7qN3(=az`uZLMHvYxT%{rsb@qz)Y{k!al($Wv4HcMio;~AFR9`mKzGHv$KHTS&XY^N_zaSw0 TX~Rcg{4jXB`njxgN@xNA?(M<} literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/move/2.png b/PyGame/assets/graphics/monsters/squid/move/2.png new file mode 100644 index 0000000000000000000000000000000000000000..9c588e17c18d76cf137b1ac4f0fd951ae7ac7858 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5P zr;B4q#hkaZ5Bf423b;m!bh15|GF3zIiUX&|7RD(~8OlLk3)nOmGxJwATrPU>Bwus! z$s50g&(@o(`+a-;`uv)`pZGr8#HT)+rQ2|p%YKLS@x>D@d@f(`_mf%w?+fPy#vI0+ zun6P!{^N`7S3Gm}jWm@wx@%r|{V$di4BHsYnAfq~HU0W2vS;njz&+PjKg*U4P-4Ep zbc1L6>#eW%-Q9g`al+Z?CH@UO3ET<6w)_^`fA4cGiJf4_Xw;zF;9H^Ju;rcL#s8P% z4mhxFVBN5?ieXcU|BKkq9#G@2#w{?tClyzfKM|s%cPF1iLF|XGCGj=;f6H}$y#4xY z=cRv@_y37KettHjNB*1r(HqruinUBB4ABhI<@^qNY!7RHLTJ+u=>hk1y{2wm;{@a-0f9WR!*d$JS q;h0(1Y_%XZ&F+59xYl!igZ;yjC8E9`_M8RA7K5j&pUXO@geCxSi_0(o literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/monsters/squid/move/3.png b/PyGame/assets/graphics/monsters/squid/move/3.png new file mode 100644 index 0000000000000000000000000000000000000000..9c588e17c18d76cf137b1ac4f0fd951ae7ac7858 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5P zr;B4q#hkaZ5Bf423b;m!bh15|GF3zIiUX&|7RD(~8OlLk3)nOmGxJwATrPU>Bwus! z$s50g&(@o(`+a-;`uv)`pZGr8#HT)+rQ2|p%YKLS@x>D@d@f(`_mf%w?+fPy#vI0+ zun6P!{^N`7S3Gm}jWm@wx@%r|{V$di4BHsYnAfq~HU0W2vS;njz&+PjKg*U4P-4Ep zbc1L6>#eW%-Q9g`al+Z?CH@UO3ET<6w)_^`fA4cGiJf4_Xw;zF;9H^Ju;rcL#s8P% z4mhxFVBN5?ieXcU|BKkq9#G@2#w{?tClyzfKM|s%cPF1iLF|XGCGj=;f6H}$y#4xY z=cRv@_y37KettHjNB*1r(HqruinUBB4ABhI<@^qNY!7RHLTJ+u=>hk1y{2wm;{@a-0f9WR!*d$JS q;h0(1Y_%XZ&F+59xYl!igZ;yjC8E9`_M8RA7K5j&pUXO@geCxSi_0(o literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/0.png b/PyGame/assets/graphics/objects/0.png new file mode 100644 index 0000000000000000000000000000000000000000..05fc485a8e05ff83b6d34f6f64ddd164054c31bd GIT binary patch literal 867 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVAk?F5y6tV;^1C z=v+x+Rm@IQf3az82mc1G7s)@w#2(qT^d~B=`>L0u9k^k00qa4vhzQP&SE`$eE$$S* zSNZ(6KK9OxlV|GASXvevTQdWVhXVt};@#S>zwUZ{FZTBR_qz{H{A*!<-{P6=+2>E6 z>HGZaNEToeaA!CYo3rwqK?{ zJ|Dg6y>k8Y&b;%V-@FO_*z;yygCzqOi-QcKK=@tel`Z`Pcscipr`TZjOd$XC>aJn=yfb2JWb@cJ#_J#UvGHdF^ z`lGMExMf;%v+BI8O`N|2e*+WP?$+xp`=aYK{vSNY8J1h!6g!{!&W^ZiKfcc|j=vx6 zoblTZ9zr$s4E41RC(m)NS$XzbZtwO@*>zVw-Zrjc_~Q!p!rAwtd*;N;)g8*(;r`*y zUeiA<>+heIJG}bh)=k-aZ0pwF+q3SM-UGwyOds@_6#5uCR?lO;adUI@=gF1DZTH^% zOW(i$*1U$V3>pHU(1`gZbKu&ZYqpN>=P7ILR^RY{|F?OLa~L5(HOHF$!@B>~rn$GX zzuegLoTWyeK@l8)&+o}6youbu{Og+9oUOmVKYB7nj^RHffTgc9y?Op;>Cejdk^8Uy z`t|?D@AR$r?9!njFCNGL;HpY~@2$z~{Ymw6EOz{j4d4CFzRMVtHh^yBuGe2+y54=m zca2TgwX&{$lh~VGA#$B5Kmi=dYhN=i+Vfs3>Y~*Cx2CpTaty3sP1$w*3+^rZXK5!5 uv&MX_bSu`JPS_Fu-xso&JnuL>H1ggjmST-G@yGywqrNs870 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/01.png b/PyGame/assets/graphics/objects/01.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa3af99ce84a0cedeabb4aac3061aee2eddc6c3 GIT binary patch literal 845 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU>5OoaSW-L^Y*S`mq?(%v5#_w zCQ%_Rk~f%hHnAHBCbBkj`h4M%b7J1x$o*QhhlhuS)!6i23ctb{1up5C{R{VHy;)T8 zbyxMT-~TriUYq&uUjMpTv##%z1zG?H4XlwjV{g7KTm0_s+OuhQ%;(%#fBN)2L;1^D zq5J-BJt|+wqr~utqhZJEwdMC$e|&yk&g(DRp2vn|{Rbo+WEch98ICMH&zRHez5b)P z_~G;NvQPKTQ~y=h_jvmIZut}MIA<^~a9}th$WVCI)}iX``E?)Hn%=wjW?q9F11pn4 zA43Osz4(Pa&-!B@N1tb0cF&$YouQBgWbX9+atBsdUYvDfSKGCH^S0McU0?t2#fFNU z>J7JcGQbo8EeDzmR{#7QYHFcIkHjop6s`grbI{Vcs z_?_2a+NdD_GAm|%+#Fjw&RB^Jd;jkK(|*l# zR~c{owvEsE_|~g0V0UO_=ul>ObSRr?e!ZFLsWY70?w+~+!S_v8?eZH9&HeL(%uhr+ zXZ*H12MRL_CI!8k`i2+38t%4R;%obXlRo$~OyF#RxK?LlMyfRydkk_w8p2b~W z{DLt+0i3Fyedmz6eaZfK`ePnYY5)eU*mY)?l~-%JjX}ZJ2T!J8#sQ;}*zfGz%OB^@ S*j`Wy67qEQb6Mw<&;$UF+;JcP literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/02.png b/PyGame/assets/graphics/objects/02.png new file mode 100644 index 0000000000000000000000000000000000000000..c91ceec38a4efef14ad7913c9b36bff2dd1a70fe GIT binary patch literal 961 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVD9jAaSW-L^Y*T7wn(7Jv5&El zYg;0IIC&`aHf1C)?Wkkm-uQughLXS*kKEj+>H;j>Z`T}Es%z{B6Le&{#W7JJS7eRJ zhL!InceEegySci2-v9N{-*U^IJ)CD;oSx>+(9*m7a^~gz|L(lXy3L*O=hl6B^Q{hj z!oK>lRqhN&1Q`k^NB;kl;TvDS>(2c{Ule}*es;~z0QI(3Gi3d#skC+8;-0_)5&#;O$DfdGXSy$UoBM|7Bk(K|KlxpKgMq9KECSI>)S(j{gY$_nZ)8S z=QeY|m&BeYk>J+=W~`K*#jF4q29G%f-2-_uz1IRVaBDe(tE=u zz!aCh6P4K;wqXnVg5@VZU+WM5{PvIicTSfkh|$kk;_mO57ONbtCzm$A|K8ppBcSev*WfryS8rSyld0XABKg-oyQDeFYh#%{+v*E=VI@hyw!Uy zCI1&wZh(Y>_B+OTclOPy{rheHO!+L2Dc?l4x$oRuGR3B@`e(|Ezgyqd{F_pvWXs?L z3@avub>EqCv!Ct#T)%mJ{g`re<<-@dz*R`D%Y-}vU+ zhTGl6Oi&MB?Pqq$whOxWSZ=8;2h6#})eO7ke%jWWH-ql&mYf&c zT~qi$kfD&p;m)TU`uATyK7Zft`m2w}=} zpYLt_ch9HEz1%L8&uGi61~CU2Mv#KiIOdAauan<@w%w+-Vb?mr3`US17KfNBUV+%f z*S|;9-QTm5MSHg!+`O$)3rh53UuS<2o3oZvXT95p8&XX$({}!5dbI!c%g4qy&sX1_ zsomM94fn){dk(jcPx-g*yxqMEmDi>B*5%(h;LNSi#{lwV*L(heTkMs!akovKUVdD> ze*1a%`1oIy(J)W03uC_V^U(|2%0-)gZ`pTTbkX(6cb~hz_jiC9aOgMF9@A!Z{rHTU zzf)hocYc2QUGV1f(`)Pezuj|+0(l7N-S8OZlbd|ZfJFtb7n*a6cP zS2MmYW~{$rf7tD2vGBHKx1v_p$zOaw8RoOA*O*hze_tGZ?|b@nZn&qe{m)PMHf#U3 z=eKv?YrkL)v&ekcf7v;Er>}qenO9a96iGl|7QYvrV{885>DhUw9xG?>e9gJ%@Aulx z*Yi{BySpqNCGQoo2++6Mt?<7N_gj2Gs=Okv_knT_d zd+PZ$2ItqGcguOpTm7!R@xHr|!9)q1YR+9}N$amIzxzCW|Nng#VQHy=H{tj^+uVL> zonJTVzkKdn1WP7IzjN)Yc$V|{{{LSe*M9t2%g)z&?*GRJ_b%L@evReg{lD6`<-5*_ zZ?&8q8h5aYp+x|kNPt1Mt$+WvPuo9L>=L%V_woIH>G|7Dol52$c>Q^=-M!VBIldxm z8?$_P1zh1VRn7c9&g$-u@0aIhMJE3Kv(EO;-u*9nwmn;M-C(29snv{L*)7l4n``$+ z3U|1HeK_5Y??UbP0 Hl+XkKdFcCH literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/04.png b/PyGame/assets/graphics/objects/04.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a3e7a1565d5ff6004619ced90fab4476e35435 GIT binary patch literal 1188 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV9EA$aSW-L^LDOnhNz=R>;1_g z%Qk#u_w?!&5ZM~Ial{M{Ko28S6B|E=wJTde$5#P96+?N!eEw{L3` zowfB?!H(;DlVjhhT;XRDU}x+wzC8VQ|FJK>{m)&yK9kGk_w8xv2`nIqW`-j#bL0*j zyRa>}>aI=wme^fRcjqBraWq5yao__;-0~3n^ACtiHtvegGJ%63Z z?*>-D;V|czO~dzj|8qb0{5*PIZP(Svb+$W#Ud^hl+xdy9hv5;#oUN4%MZXQ#ut(X1 ze{;w-jh!y&AOkVZ_%&0`8S5G1Gw$qrz2sj1*8pT~H*Fl={jAkjt1{f0{p6d@&SzW_ zj7J>7hA#WYkbC~Udvewl<1f1B4RqmFO|^Bn|NQ&joo(xm|Jn756|UjfJN^mQ&$i1J z@1DngBKH4-xB3VEF$6R)fXp)q6P8%}Gkf;7-_u_??vXlF`~Nrx$g{uz3cks_WZ&`c zxpwG`Zv>9`w73R*ysQMw(u=n&9Zsi9miJeyMFV# zu702>Jit!L9XQR+bEfL+zRTZtHf&9w?|u9V%b|skkh-}~I>WZ{?%`uaA@^6$K6I?2 zd%L@U90M0HGJs(X)Owr!!?UHQh3ofM@4a^Z;q`N8j+^v9xw~KdvhK?JJcpPa7$Ff} zrl;^LZvSf=cm1}qv&uLA>D~D|wPauK^yS{i-|w%RdBg5{IioGyrBb)$4;-tIPG0=} z=JxdeYG0q9J@>J*-oN+fy`N>~r{`s5)-Er3^ECEHnL!F8IMJ+p!u`bz;-pgB2J`><#dqVX_0#I_ zTh!G4w#f16pZEXk(VG{(27P?RXygCk$Kn1+G-UW@nIxDy?G3-`~Kzvr7Hg?Z+$BH@Mv1z2^B>4R5tJ zbJPF%iLlgua+_Jf*L!O(Os@I$(*Na+)gL#{JGAZlD`uUGI~(s*^6*#N&3?Vz#g?g( zLBj!@(6s8UEus#K_coTt?cv_K{VQu8?}CG$6?~7^@awO4ux0RJ1^e!^z2BTUv%R~1 z%I&?OM{kHvO+#|K+X`gMn^ykH7n3q5 lO~|k?Ff2HkVDN+e&*!zLFHN*M2P}OUJYD@<);T3K0RWXfDS7|^ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/05.png b/PyGame/assets/graphics/objects/05.png new file mode 100644 index 0000000000000000000000000000000000000000..eab8994c121537d2e0888da65157f26704843929 GIT binary patch literal 1025 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU_RmL;uumf=k48%St5ZV$3Dj1 z^gHNwStUWaqctOS;SDKAj*O?;8Z)MIJYm%NBDzN8$e|ltnrlQHrKJ;deN;2VBVJdF zJ*%+ze(v0v@Bd3D`<9iZ+n=+nPER+EUmLbrbN7zTldGE4Pd}|Wb^Q4m203Q44u%e8 zhDTz-)xWkqpRY50>-+p5V@6R28Abtjh9kXovJ1-2|L^}RdOLYO=L&{L91Rvs3V9{Q z4)<;E8-JVGz@^X!*3V|o%(M1+^)WNy0LCMN423KXcOIlQZ2Vet{z5vF7Dy9N-R&Pd z23zO7m%QcUzzQ-QsBZ6hhAi9rn_nVKnsuJx%bywh5V}^|F<R+}#&P(>U6_ zt>0~b`?2miUKb8YOYqPI+ z-}ZlBlV9bM%b&B?-v568@ptFD&auF}F@2xjgL^+OC;iTS`uOG7Jqy1+*eBm_`|tR{ z{mYp^$r0$v58qkps&4Gv_V3yCofiaazwfT**=Vcx>-$Z)H(&qkt2~~Z|Jr|J?c>l& zz2?_U0T7?Py3e0bJz*~Ao43``o6p@pFBQfAy~1{%89Z##8Gi5kcy#gI3+x;@=eO^X zJUBhNe1q-v=B_dh3Rt=EpYICD|i`T9SfG)iO} zTw!VVYI=i4e%gw)-+Th9*-m`>q5-u=WA@p!{|t`rnq3W!oZ$p!Z3a(QKbLh*2~7Y5 C?$b{I literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/06.png b/PyGame/assets/graphics/objects/06.png new file mode 100644 index 0000000000000000000000000000000000000000..a7859b7f4a44d6953de8cff8b316522d0ecea7c7 GIT binary patch literal 982 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4myg;uumf=k49K`5}P<#~$uZ zQ4Mg;zQxk5cr-yl!zECZg|R8*y26A%j2=0rjtvSNBBC0Tq&;|CpfCy)Ssj z;goYb<$wQ^E8l$kuSKn~@!sn5W!s|G&MMuubMxe?=F>-$ww-%joW`=Aky(l15l6$0 zpS$+f-u^tj+x6w~=+!eDxD@&rI+Ph6snyFZC^`SX|9Q5of34aACXg6V^~tjgwcl&b zUrA@uYOr7esg?fAW3X-B`heBFCfu#s zm!4zHDC!`?2vYaej(Nq`n)4SBBBApcU;H$zJYJ~M4cplWg zm$TikXDu9YQL+){SiiFjUw&kEpW}e(G~c~p@7bNzie+vvmqQ#2_Jqav%?#(beP);Y zD#9GI^E!)>u#b0%JluIpzq1+$^Jwobp8&Ju*}dD}zj5xV`M#~R=J_$-ucm8Ht=s-} zx@7NXh9BnOpqO24`|rii%jZOI?Jfze<*iP=e*5>|iv97hpt9a-ZgBha`P_NycP+A? zZeQ__@A&-t<@f3;-Y+Qifd$^XbjGcfwz{Y6;6!OAMVa-=DnYp0-fv2 z9(=uX$=Gws_wt%4e|OK{+nAvUj-L-iDe~Q8N&1bzKH)(I1!RgnX zThsd%&cFYyqI+*62Sn4C|9tEI-gFGxras-yeE!!rA17Z^o>TMdhE*Dy0|z*=TGw-K zvHgGR>D{>S3*Qd>?w2dOx4(?Pf8V@IZ+?CL%K$THUqiI?{?+Riyxn;3?bhlKH{$wZ z|4)8!K9~`dDp(w1e#|<+zg@rV-v6)LH!l>e{k*rD=VKbr`{$c&Z@m6l`}taO{p;}8 zKTfUIUz_}mbwMjQA$HZ>VaSW-L^Y*TNwn(5z+s9bX zmB$WkJ=vtdv1n@R)NfIdHzFh54_@M*aOhG{_QnghPSrG;h-o!(G+n*5qxZj8;+prJ zXC4|E@80~|W`EudUnA?!MdxPD_DoaqoTS2;cFW}K3j2>acJkl(*iIi!vRWnUHAmv> zz03kOhI0%D-mdxe`1-dm>)+e)ZZ~FL@wevnJjpc-5V^1W_$GWk@HENM{#onInz*n3 z_NB9FGt6OZFlH#YYTRI3w|CRbg=KCVm<~uXSTHk8KgY1~`R&KYbE7$1flK{B@ou{0vJNNO3yD10JYRYz%sTcQ*uYzWgP5%T<`&zUSY)-Ma3t zHFM6k`={fN{)^vHwe!X{s7)xEft~lh0Epr(cgUxzm)#E0MnWK=P$$Td(FSa*8l$g{+{-> z+Pno^;7IVDy)4s~$$35Z3cqdJ=70Tjf(sHpF;>hjH+=*wmA9O(suHQLnSvzsTvEYm zN8!?%|IO}SlJC4a`dIzwX?J=1l3#V_7*-{LLN^Aed&67yUxjctU2=escmCcD%j%puNk)5#xK29 z+P2QP17=VOTgUZ@_vPZ&?`}*u{MGg{&)?m=@7V)H!D(UDd(JgmbB&#^zkV0>dp+Ok osw!P*WK2@=oOHx+rq4gd_2mzj**K-Y0%jZrPgg&ebxsLQ0IcPXegFUf literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/08.png b/PyGame/assets/graphics/objects/08.png new file mode 100644 index 0000000000000000000000000000000000000000..7fde04e708343dc5ec454c357ee0113c71ce4973 GIT binary patch literal 866 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVAk|>aSW-L^Y*S`{$&S=_Kz%v zn=bmTZDH}?iM=r)AmIUXNvh+S8dkA3y&7(|BZqGFGl&XFb2AGmC~gfteN1i{U)|Fu zMc?MWeNtH$y+rHd&icLIpVgG5O;Yg$A%izi@;xSb(M2qS-r&A8kAPa;fZo z+p|^2_t`eTX2?oqc)-IDvsLbZrTzJ}*45en|J__&-g|wgZKG{Nlq5)N_!{7I8&Z%n{3fLIVF&yaKrXJw?|6h!0-1BwZC8?|p#vqAx5&R!M zoV5M5bIq$yr_XEU=Oe@g_HRG-eyi5&$ETO~e(%1XW_H&&11ftin=$&)@%Q_CnQIHa zmrZ2e&U66cnzif&u?f}@j6i44VQjd)gS{jBY@x2z(Rm8zZ?>;*uIUp6IYp9TN78GC zmA2Wx``??#J%3kyf9t%5x1YxgTX1PJ%wq((Y;JYKo!6H)x_8(*dfl&n>h)c~`TWCf z@&0T75B~O_d+$0IC_H%>?qpOm1;1w7czl88*5~?1VWKJTxjoJ{?!Kn{WZmK^Qv2bS z+B(dc9F%>1=lMMg&;ATt`!O2o(CD8sGxs(($9-qKaP5=#`n%8P?f>!f{NaBMtGm0e z{oe}HpLLz-(VQ)>Z4X{}{8`db>k!x{z10o-&aYhjm1XJFecOu8!khqfSZ4LVpkHi zXlG1y+OKuoE9PIBBY%^5#Z*|(o|v~_-5pE&P3!^MpwtIR#44HF&!%nuKhf@bsS*E^ RdBD8G;OXk;vd$@?2>?zNij@EW literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/09.png b/PyGame/assets/graphics/objects/09.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd0ebbf8830d9df5920736456fcaf98c6ca93c0 GIT binary patch literal 919 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV2<;2aSW-L^Y-rkF5y6t;~zU& z#6;e>h?N~ZrydYpebDVqErVcvaR>O>*@Wvwcyyg^4-4vw~JRd=U!lxWUydn*dAN` zeY0Hszeiu6d|b?4KK59K(Uo^~^Uu-|l+N6gY=- zUtH}R8$E=a=y`^X&+V%}mwl>vlepCO|HGR%-+aEGpVwvg{>qWZ(bmEdj1PDi<}fyR zpJz?6-EUgeumAP)zqu!^=h@VnR?eAg4YPmyulGzw>zL1Uzt$>@eemt^=a;|NKeIp2 z#gNVbG~muXo`7F__m{nmZ%>8#Y2EHphF{i8+I5~dwe{O!!a#q` z;rx{Zb3;B`$A3rR_wMqkwzjW7Zh8HydUxC*s4ru_S~*-(_D*lQb~|`=>3RLR8@>AT zHMK#(2lUn1^Q-YdR7=Q{h8clmF3Iee>>gsH#%W4=*fW`9@K zd-V&qZ7ZVw>n#e)Jl_xVoalPyE&uLC-BzyNpP#s`_T!JM=VF$^Btz$OuXr1|)wbqk zHdpm-{iL_w|GmDO_xXP^%<$QTbN-}W`0(fH?u}0sU%r*vaqsH4A1_WX|2})?^R>`) z^Y$!5;Om(Ri_UVat*)8!_0I{IH?5dcrp*&HS-<7EJ1pu}r8k_InEZf4Esp79=(?HD{={an^LB{Ts5p=7A_ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/10.png b/PyGame/assets/graphics/objects/10.png new file mode 100644 index 0000000000000000000000000000000000000000..067a503dfd345bac7f693f20a7e16b2bde356bd3 GIT binary patch literal 1006 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVBYHK;uumf=j~nne&IlowvUoQ z?hY3PHpS{xFmdp#@YQgPlro^y#cZJ^`B~{ho6(@eZRvk3i3A4 zc-}YnKFpl`{mOM0E|?IK<*w&hm&AR~|Gvtf$A8uOjo$C})_22wxt_h^^GA&xd&~YM zJ$^isbJo*$AJ_BWQ?;E3SCQV3u7AJnzX5OlvU4muzvdpx`2F|R%roz9uW|cl53_FP zf4u|N!V%k+FOAZ^6sQ0F%!9W-H`a<(*S~sR2e(Wtt>J3Eee>;jfBF2Fg~jQI~E%Po7SuUxL#4cXY2m$v1WJuVXojdZkSrFw&6-z%N^T$U0-Y9 zLAS`*!RNLy)2yZ65Mpe%it%Gl%$bN=1 XIsB`P**>oZ3NU!O`njxgN@xNAE%?Vf literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/11.png b/PyGame/assets/graphics/objects/11.png new file mode 100644 index 0000000000000000000000000000000000000000..37edc1e04ac923c66db25c51fe10bd7dfe3e15b9 GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A$CFfdDdx;TbZ%y~O^fB%_4k)!FU zR&!l8p1dI0dTdpO$d>380zyasNp^I6uwS7n6w;OJyKvzqsn&}(Jw=3M-)8JJK6&TP zp7-Z0U(fUZUiNJE`A2+U$P*YT5M{&L2&Beg9LZa=1z#ufPR| z)S5f>4A*}C{P+0E_tWkTV4)8(0$UGfP3dQlR#?#JWyS7NYLnI8p0?}u_kEuP6PQ^{ z0yv9-dTxH+`|R_{Cpur*6V6#y7-yfdHebKCc3%z44F*QukSEWWpUK;qKYcm1d*$E$xO(7-aqS& zmE%tiu=*v%2ToPUp9-|@ds{axXTRbisH@oIxgS)>J%8#y&(ie8@3Q%O-&VmKeCRXN z&AmGWFGk5W6;}!R>&?&J_wmK!?aSU+I)a@y=^gu*b@$UNYu{&mb}>_Tfrihiip#%$ zS088k&7WtI+RtjW5#-!8Uzj)Cb*(#Wb>Lv)y8Ql>Vy1ojr^CYTIMcAd-an~$JQj6BJBWBakM-{0)B+w)oZ(Vvp)x1TNK8>-tkzt@I_c)@yucfvJa zzo>>5n556x8@>V>z?YI4*CgNEd?0c|e8ZP{(K=A&2J9~1zq&u?yy5a%3KreRtWDFt zzhCp;-bs3&y~3gL&e9}M+Ikr$9&q2j;XC&aIYm&w8?+tGF!{y3e)*~Pk6r>Bfw_gj M)78&qol`;+0QT*QRR910 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/12.png b/PyGame/assets/graphics/objects/12.png new file mode 100644 index 0000000000000000000000000000000000000000..d1967c2df5df1fa51234dfb81adf360360519c18 GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A$CFfhLNba4!+nDch7tshgM47>PY z!7TN@;4Fe)$t7$12Y*v9hBQ1=KY-PYOTYCu#MGLJF8Il505tnl#%4`@ zNvm0Y-QsfR{mZHvKX30(`klR3?(e<4Iwp{%m#q0#Sk9FdUw`E|=k0s{^V@!vT(w)U z466NF?SX)*`;Hc8{ToPdCCDRFKJJ^#9}v8Ld0hTy;RO6Xt9s5EcmKZF?cH_uja9bA z^YsJ3CaitVH9t010g?%?&q4=GlIfQvSu&CTZ@I?B)uR8PqB|THu+LM-3@Bb zdvy-9uuP4)AD&)VzWMrjrSEo5qCi8Qyx8?lx;WnE%kw~%Gr$zU;OXk;vd$@?2>_j7 B$D;rM literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/13.png b/PyGame/assets/graphics/objects/13.png new file mode 100644 index 0000000000000000000000000000000000000000..f01d83903caa48aec1d8461c481eefe6965420f1 GIT binary patch literal 798 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A$CFfcv!ba4!+nDchd-mH*7k=FDS zIfVsboJ%;Ow0N9ev8XhLnEhhf*ODOlLA8caJNohsb|)@xRab>rfg{I?a%^88$}xL> zE;jql>(}qj>@|L^_wDBM|7Uy(pRK<7YJbs#kN57~65q9d_w4`Ge-j>e9ofjpB(*|k z+h5iVXZBbBH!H3G$*}<>)H9EHQB_3mC&2_}7Lx$a=M5`*+`oRfQDgD{#@Ftr$_Lmu zG8PCuW6=4WzCPaUzJ2vB|60Z~mg4j6%&)8G$E~g1SHp6Hfsr@l$uVZV_3LK8J}iFv z%IAn@hUyAX%|<5}1NZjV{I0uQGbvX*VdnfCwWXF`#(7>jZ7_Ts^{(Rr*WXW^iRI7^lVB*pBbq-hZI-!mitpeI{pZ~Ye zL5U=2_=EimHUeaUsIa+Y!zoiTE3!w({6dhQQ%X{B{?>c=cc?-MPb$jg>K|}1&)>6mTL}OF literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/14.png b/PyGame/assets/graphics/objects/14.png new file mode 100644 index 0000000000000000000000000000000000000000..6a7b4bccf040118143068ef69755b6aa54bc99c6 GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A$CFfe}cba4!+nDch7p%-(Y1e^IJ zW{#|>4XqW83KcBY2ergcsIqt;^sW%>SMbnN5OcB;+~auU-1lt}Vy*d;%rEaFaiNiaMRILg4#u7O|4((<|kpHJ^v$#B-c0jn8HzehiK{dO;0f!gid z%99sP*2LLtu&}@Nl6PIaefQVnX~sYI=G8HQTyV*nZ-u3ewXWRCe&M!x|MQRiD!H2O z;QLuP0qC?T2hTTb{Bp0kVAgyF5?l%P$mLpV`31}F`R~2|O#J|UpM5zeyeI0O$m`hs z^Bwli-}+xa02D4$4i>lS>x&)z#aS1d_}1D5>ZFU;xi9nyXU*Se0twHbpG}>U_m^iv zxgYDA&_i+A*V@u)t6%T^r(g75IV2HiblHD)_W9$z+2+RiR!$s>Een=(>)X!siTWxlR<+m7dXKf7 zf9>H(FUtLusHOwIQSJ-He5RPGj7BFrO!E27*9-O0HMsg zF$|Nc=h$bTV49%J2tt=DcqUZ&-mmzh{Pgj%7hn5a@5V>PAuM|Hn(+ery8Am{?b=`e zujInI+s~sDdTtN@?sqdBUL&k5W~?u(V|{zL+r6pmvYq_KU&(v@FT<^x zY|D0_FfS)Aq5Sji*Hx$47oXo25n=akm)-Xr_nqKgdt>PE>Sz6W{%y}bAMeim%oBFz z;+J0xk>C&k21-^xx`DFj9*ud_ti z{eSYn>*?Pe*WdqaPIvtM=4r6w?+J$I{=Gi)R{7rZ`kK#{8Sy(R4PSjXRO{;H+@co1 z;=%9)h(zM$6IRxnWGwD?z3@EB?#}6Bm&>P?C-ekaZ34>!m8A4D?lG+`u&X_} z8xwpkl_A2ocCG_U?U(Bp&o4PY+Y~Nbc${J9`Bz70IYe6@KK1&1Of={159Qgu3(Wf) zD!JxVAE@Qnm@TyS{rgyb1#VCTf{-M0MEZ{hv-a+m-*@$w>&4^M8^5tdW&cRZX01+c z`u*H5)`(Ir?|OL`n58o1JO<|W9JeBVizhc-dHyA`nDgFOR0x8hGY%2N9NyZ_%B{hhy??^}z(U2(_o!1TA*UF$bq`O3QH zb#ncE-$&0+!}5!9aXQ=5bx*Bd!yS0}m&Af^h2MLWVbKPRg@*JqJo)kGtNa#taR0O4 qefI;0BFuQj76B&?Gpo7h>~%bS56)S#ZVRyJVeoYIb6Mw<&;$Sk+bV|u literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/16.png b/PyGame/assets/graphics/objects/16.png new file mode 100644 index 0000000000000000000000000000000000000000..69b311963d5fdaad85bd93f730502f0719738656 GIT binary patch literal 1350 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVCD66aSW-L^LDO%hKQrcvG*Z5 zstXuZ+o!r&Uvx5Y>AqqX#ypk6Bz7qBg*cfocZSmBYfR3gJ zE}@4>EkDog-JYLbra%4t@6yS)@18kVx99t_v-_*w>YqM++H_*yLAS$K7Z|7a@A~)s z#+Bx(zSBl4uZQQ|Uyy&Um&Kuv#o^qtxV`(XyMMEekGJvr#dg+vdGj}IDd7`L6O_B*^!L)ge_yVh?Rc|`a|*ja zt_njD5OFZ^Yd@+rC$mW@@w+0H)ivA`+4u*veonNcC7NXxmUMeRJh_f_mWe^ za3@~gY}qJwEy7`a@%w8vEUW)X2*k~mCB>enyPGa@VufIZ57*9-O03lB?<_Np< zpAzp`*6*DsoRRpury5jM*KZ#;Wv`^1g99P?Wjo54?R79SB;v+ zH-1x#bA?-8UsregLco=W2UmV(dCl9yDDdUty>Ca1o7X(o=2y7o!SDo#Ql2rcDSo?b z{eAvZFD@JMH$?1Ter)&gK%ILM>R)f3uAB%<49h?4VptvDop5G?RPlet2<_)@)2k2u z>iPDgXR!_<0(%&P-hY4JD|tu4knPu#RmYXqSXQr07P=#^z#R!ro518*^qg@|_SIj1 zdlpJNQ1aH}!$c`KsEb8t@2xCvl*bznRP5a6Ngy z^z~m4zxICIDyWQzi3+=h>*=q27EZV!p?Out4Q`c|wYkBy^iWynh_7GIsUNU8*tBul zd6si>dbjp%0{b2q04m*#6Z$^pJ>FBJ@-=Gjjpx<1`^xX{i&KQVA=8i{>1^Zbs(%iz zN*S-k?UxYVQ+dPZ*MIACoGq3Ok?@!du83uL=Y9R*YzpvAe^~;FdnIGd}U^d6K>Tw)wAR|IgoVef{hAi23oR_kJmb$vI>*yGlb+d`dE7 z*gS=Am8p-v{!D#eYLjduf840+7!Q&`<{$39X?g9la8qr?tGfNJSD#BqJox=o_P;wK zR%Ez8Jn9wPa|D>+?TYp;+Q@Lx4V1wXmW8eU%gFn1uWQO1i7H_E$l&Sf=d#Wzp$PzT CN_#;7 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/17.png b/PyGame/assets/graphics/objects/17.png new file mode 100644 index 0000000000000000000000000000000000000000..23cfa854ed66acd5a278e8ec513513003ff79db1 GIT binary patch literal 939 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU@r1>aSW-L^Y-q>F5y6tV;@~U zad7ELuSsEbToZfcP?hc)5f(x1XlZRhL3t+~7Zyit?(O%STwl8i#H^Xta46|9_mQAy zEYAuozn__V_WS?R#Psw@9}3T(ymMzZC(sfwh{(SDw8-++_3|vc^}ks9#kyb4Sa@+91S~e-iX_`_F(n-_eVUYRfIpzx?*6qqYv-yj z{4D#X?En4MC)cijzw&P_+%e&Im{aQ8^?&WW9ej(Kr}l5q#d!^aAXftI-D%sf_UHcn z``+9B`~9zd)%z8vW&VH{z z_#}Gw*2arp|F8YdFChi<-RgVHTmIdVUwbim^~Z02d+v#EfEhFAHuImqoA3YrzWw~Y z61n(&)k|Mm|N41#`IXPx>uUAoY~I-H`}(5nMGY(n^lIb}TvNC$9C1pvZJq=-c)@LisSv7a{b4OYwORyOFyuS;foSDc3%BvPFcS`JpH=VCVK`aNO=CR zJFwe2{C9u(zF_zM3+He9ABf&w@cHZUcOUPtJII40Cix8TB!>(BfDe!aDm85a4|_qk74n|M(wa`&;m zvlndnV1WXTFi7mrzWMXvoBOOfp}V%f?{AKud;Iw}GpFm{&xzlywwS#=4-q}ZjN95$ z@2}Rg-Cw?E?Zc&B+55i#*;L(h>9aA+C6V8r|66F!etVYmTgJ9|^ZUQWe5=Tx%K)=9 z`lkGY+wUH4@@?+PID3BG&U@af)~d}CJls;^%+ kLwyO$2Mh;x&GJ$E&%jk;ySG^C&ry)Lr>mdKI;Vst0Eaxo{r~^~ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/18.png b/PyGame/assets/graphics/objects/18.png new file mode 100644 index 0000000000000000000000000000000000000000..8497695c5c0f6ccd09edf2d0e72880432b304dc6 GIT binary patch literal 1122 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1q+aSW-L^LFn3Y*9yn*6VR4PK5xC{<>k%4%Icjv&wuN|eRg)^`vqrw zmS+~9-*TlwgP%!&ow1{M+t%yb?fxGoF&b@;mW(` z^UXGZ4H9UuXg$LCLm|Y7SB4HRKmK3A|Lxf4 z@^i5#asp5JoY`1DLxwL_zJV1KC_s7oXooIGOk-ZZr(c z^KtN1PyvQ3&=F_X@+Z{3xwz!^^C~-=uJC$;ZL{q8;bwl7P}sGs|Le-QvvFJ80%T$0 zeBcNJx(ygTEuR^-et)$!n<>|#vSF$_zt#C_)5e{}yl-zb&uyO&J^4lL|BSs1VxYhU zYCGP`xW~38=j^?2adEu!+MhqRExP_ow|2j{uuk0Db?F2UaU?Ij?>9-kmBoY2!H)%srA2LGa$RaohZ?+BvrJXQx*G&3gUW z`@C?+w(HscFH3oB;VIzibJhyO#`dohXGh<)Gkx{B_`2|ink~8Y@7_Ocf(5!{O>M&q zDXX|M3D>z-@V;ht2!;gLUSR4e{&?{#)30Tw^Yafffg%VP2qEX0dFK8;x3m;VEaf;u z*}8diwO$`ft5YhHGm{Zg{%%>XRGm{$?jPUHbjytnQSxufJ=& zE!N%nKKXk>)xR%=FX~`{?pG#vpqum8y!Y|Heg6Oh<5t)XqVCo zv(l|q&vcj8$cxNo$f;L?rQ(Rgfjlk?ow%z4woM?&tftpYP}18-XW%w{9`t z0sz2Pe?RY2sx?PF;CiaL)BSuO0Kg!BZ_m?svZ#FE_|71+ZgCxa{3=`jIx%qMh#zs( z{5unvZ7(+01RDYKY9l_$Mr$jz61KxU&1b_+bW4uqR>DbWED>!~znjd8ot6!fAGC4= zpF}^pI>`I`I~6oR+tfX|NHrSMuolx5nQd}*XCt?SZ*-zQv4P;4i`F>SQ3 zHd+uETquTmqT+Bk>yL=r0g>CLqld|u?KwyTHOLo5Kvclbna=NCDy6;gNtp}tMZ%Sl z(Af+r{*d#syIu0^p97Ozlv}w`K^++*0v_eTFa zRh+}RaXTW!Ey>zqeC}xx@+R=N-v+*Nv}SkA8Gip#G-X~GLqeqxi;J6hW+~czGJDp; z=+J(*Y*QZ~dH)9P&I0!ZVOD%g8E2^!V`vlC)GLNoA05yx+NY%kqFiTnwP`mJ!O{Y@4RYajGHSCPgR&2w{KitvxQtBk*Gk0- zD44L>)PHZxcoB=W4UL{ILoAgWb99(w-U!>j#>vAmYoBvBl^A@X?gZ_Yro1w9{U0Xg z=|Em^3u4~sOMMKxiY`XTjVKEZX~3}OM(#d;Zpj?y;9^%&lWtcOh=A)5A)c0iB)uw| zsh%dd?9w!B%aCE?92L$tdMc^+;MK(u{*W#?(O5ydG`?M2*5#Q|anWLKuRZ%-{?KXH zhF?CCyTVbJD_WazyzH8jULW2d-ae8&EqMJ`NlwVjS}y~&YIQbRuRxO6l5V_n)0-QE zS~P{+iQe9>3sTaL0u_Z2F41?4pj_xF));v3s1;NAU_AIhbz;F!@kUjeyHiCLp`*{| z2KUrTLDt#@SI@Bw;DtPCSpG~CX$le;n@H!ixkHh3id+sd(x(`|2Ex>@QH9@B+fCif zw{BTz$lPZ%yuB3BZ`UOfni@7c@XVNp|0lr?;5_~&K-dg=yf1IdPcf*=&>`>*m{1cz zarTZz(J(d$p|mFa4@k;3a%`R4Q0-4*&oF literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/objects/20.png b/PyGame/assets/graphics/objects/20.png new file mode 100644 index 0000000000000000000000000000000000000000..7028a8983d4e6154b000f8932674d407a085637c GIT binary patch literal 939 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU@r1>aSW-L^Y*S`hKQrcv5(fC z$;peuI5ot~8bus8@GTN6YjV<(X3gI1(AB`WaiiFlja(WxB3F211?sR!3mQ&PQZO@{ zmTvn#LH_XUn=|ix|6h7~?(Xf+kMEg2_wG(kpgmv^k#YHE&b6;U=f*~A{$i|`m-DN( zipy57`d6@`pP@sU;nB1z>)Pn%?c3gm-Q6GhyJGKGmL7&j91Rvs3hREBHrz73|LfP^ zgb!c0c0XSw_y6L%&ndf0{SR;`^no?++RYab{Z^{}jsX+MERKd97pogCeSUj9_VrFC zH-&~wq^DccChO2oax8R#?&Bgt@ZFkxpxN-cv=vz(+#v_6tTjtzmzAMBlathm@ReODB$=WmP{l_Y}E4LS% zXLFnXKYwrCfg3PmV?N3)_HS_qaWN+w|k3 z@_+T#{rR)>)xYTZ_YWVBKKbq0+}R8N8p49*Ln%XabB=$4Yxaup$BRubZq9gq9A?y} z`P>`M?|%L%YsK=i-u|rGx-whldE5sSm_UK7z0c0!?eo`HZ>IA`$}=c}19W<=?1N)( zS2w@^{%+-BcZp|f)gRby|M2YT@08iE86;d7Kw(n+o!R9&jN6I1&3{v}(-_vfE~uiIDlu0aqKU+xS?LgSTBT-%V*yQX&T!mS&t zWng-MQsD3gs@k6NygmEBUc$ONTWkOS{X02lzD=oBNlkwJ#jWkxpXW&@uz(B#s(u&K zur_h)`q1a^>g(1i*51ALA!euP{r@$k)lGN)8p8tU-8)X5yU8xs`SkXh6}*1mT+K95 z0i2+A?rc!^FaIRQYgDy6{rt6p_39aas~N&xzBV|+s^AE=;pS_WKHXcBZFcORyfts$ o)n7lhLc<-F2^bD6n&qSRpK*_f&C?l$O*25^p00i_>zopr0D>g9@&Et; literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/observer.png b/PyGame/assets/graphics/observer.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0702e094bba65ac591c9e10cd97c5bb25d515b GIT binary patch literal 17018 zcmeI)>r0bS7y$6|hPqACvX(9j8(L!JY$50}m#@3%UYB!?nPv%HT)4b#bL9muX{gOW z@WQ$vS)>NeL|wK9nMPZQMlEC+)ts7Ll~fE9)N1<>{sDawo&(Q0hX>B#oZtC+cr;>B ztcSa=J3`2V5bz|95qAdJ&C$2Xm7@q@6>=_DOmMk$g(~N)JX3~HP;GH7TksU8RoYv% z)zXOjmo9TFzo+?Z@w%H*;V&ikaCDx5SAR#>Yj>K>M-&X!qCWY&Lixt}BypolDSjfg zk(%0UnyKSlq0O*65#s`9W^J?Ntf(KQ-a8CJKc5A}UasU=Bk6lJ*V4n9rU z#0yHlRlX2>(0vH=FO^Yg;J+?rt$UDz9EN2IF$WKH)7d(>usZz#=(SXsh){Z*z&zsv^5yHFH@ zW4Q>01ULiBZ;86#NRreGW74UYu0s>4Oj*5xi(=K8E3VU!P+QG!Os*5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X0D-kCAd`Hx{`(8CR__4k1_2NN0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5LgvpZ*bHvKuGAU3$U8~uNjUbjJ3~baBf2I KMZ6Bq$@0JL-|1uk literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/aura/0.png b/PyGame/assets/graphics/particles/aura/0.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3080c1f82cc1df7648f60e39f73fd4d871a4b4 GIT binary patch literal 748 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|V1M zPZ!6KiaBrRJj{D#z~d%ccK?6x%R8B-L^3mNGsDs;x2t00qmM22{}ZfnXU5W2J^^R;j-RHxUq8NAT;d>C z(jbwxN(=}FvFP#BUq#Bd2c0^5cmH*FQX(x) z%h*^~Iy!1(WZ~gn51A0&zp~)_@BhvBjX%kTPO$%9sl{p=TWxdOaPJkLr3;pG`v(NL zv9F2yG*Na#_1=p|-2ZzQ-QfIsVY3!@-~TxU?w@8q-NT+UPeAssRs9YZBRwHo@8&ml&r9P6%iH`-*3eeP5W@%dXm~VIsGEwl&QwVlOf~$`|H-*>vCR zrdQYNO0}Ne6TZD-L5G!_&!%{u+kM{-%=1*amh?Mh`TN3B(FZSXRd*JDf4{ddf6dKr z>vwGt>dZZP*~m>JmK2Kw$j6j`M5jyZMGu1_mH126Dcow{_6 zgZ1o!#fkTeQ`R>*-DeN+++_Cn-aPOBC50*4KV*-k{p6bU@YtG=wp@2-X$=nxGiS%5 aI)=3gyCUP59<&3KFN3G6pUXO@geCw8QAYFt literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/aura/1.png b/PyGame/assets/graphics/particles/aura/1.png new file mode 100644 index 0000000000000000000000000000000000000000..587df6e99d3027fbca8e3bda59c706dd1345082e GIT binary patch literal 994 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|WCE zPZ!6KiaBp*C5AmV;AwfgXD@HH&^NvUvmMNHSk^UvKfaGGKQ6XE>7;Vj+4+0|r@ij{ zESU8y$cyXamW|R8u^SmujxtRU<#q_uVTdHe`I`Ny=Ih~ho62|dCa^2NvUO)V(Z#B8 zn#ropRzAp|68(G&VMh-Qn~xZr61AtDtfExxg0wp zA~smWRlS?^D_vkq5z`X!)zSa&l{wxkxN`NbBFD?bCFv`}oCPj5f2l~x@y_CS<@e{) z$7x09R!*5Tul_&d>A1D;%Whj$^o6r3uUJ0k^T(?t>W3XJe3TLVnw6)yG{o!Yu0IQ( zR_|J{rt0mroU8JZ-B%{c)qgx*>~dxG$vdob_p#Rhtk7oQsyoux(X~K&t52YU?Y}(1 zlEu?Bxt1KiEZFkr`}JF*S1LR;mrfHu_4fM|1(ryc_s4ep75x}i)T+?^;;zK@{Yv+| z)(M1gAH0}2ebGO&tB3CL#_l~N_PI;2<%qyt!LP^89qVhog3Qq{PikKg6=Qh${i`!m zIGfyBlro+uKbpBnA;U$ZX^DB5jw8n@%lzr_F`uvB`)c|8%demN{{Q*%VaM-l?**?G z+uGVZi_8BS)3M~Q!q@z(Z@%si72o;NRaW~{ael{yf91hmKeH;YaaO$J6}(ihx3nZV z==b&W<)S~fCsiL1Z(4BquY&EI6*u4R{3g&8G4cB~ex;XRTLg}D?b%)@;JJSJ$=(Rr z!(vKqNquK#2gwJom7DNyYf6)Xu8YU-i-)FMi;!yCBB1!zojW)x*|*GbYyQ#TuBK^A zb}tYt>3OqbiS_(j-9VpSW?~Iui9D|=yShz5WuBPE1f>&IdM_h{S+4GDWqNsI+Lo+M zueSUVXc7?Vak;%nZFL_foauLZ_1z9x<;t=(M|=Cj@-_eV3-Yd1Ji(N@HBG5-S-A5A z)>Bz$T^?QetovW?WA4-68{>a;?lX(7X!`y^FXHCz>IEAY{V5sQl%2p6hd&bQ z-q;=~NR{U(QmEqz|0b8TV-r7%rGR~#b~Qgx9ea~Zhy3BGd)tBPm>v0!^gldx&l#w$ uQGxx@@q*O%if!7z9VRe;Oy05KKex$?>U-_g!JWWN%i!ti=d#Wzp$Py-R@FQJ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/aura/2.png b/PyGame/assets/graphics/particles/aura/2.png new file mode 100644 index 0000000000000000000000000000000000000000..345b25a26982b6e21984a095517b5a13cc7ad223 GIT binary patch literal 1012 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|WCi zPZ!6KiaBp*9W1!Qre;g5iVWQ|OtFF*9 zk%FeH7fi7cTA<+Ox3+HSonTkTJHB1Y%PQY(nd`Vn|X4BAC#53!@DuqIG|Ex z=GI>)PTsftZYSEtthrT1hSi*Ts{5qK)%|n+Y~447|KaE4qHn9x-rb5Y75V#8Lhk=R zPpj*e&*#O*r}Y<`%?s7)usU}(*s9oT_v{dX(mAu2mpq$NwtdNh2wBy0;SV?5{{2wV zZvVax=8(k-T~cADcdGM(97RmmWbOF=#OD0Rr8TdPDYkqld#F1j-b%goq}Czf$`$WF zJTa@*rQJd~L5^X&G#pF0x;jfk9-jU#xK3!f_I%Z4+VewZ z1qzt+f1ml}+F6Z`+3ml5ieBrm9=)u4uVKl8t&xwng>I7NjO2Rs@9Xk&ns+Tbg;s|N zd|z*0+IMg9JoiOMR*4>I4PxB7(EH~bSMT`3wmVaMT0%vZY@K!KQpb|JzFHltnNDui z{629@w2R~A`+RACQ&;@H&3>(x&;NV({?0quzi+o2o}XL18K`1)Y=3Z~#fCK7-y)0V zU#(bMR%`aCdG@tcE7=1-Z@pD&s{eH5`x{f#!lt?YKC69V)%yT}$A8pBR2o+cX1_fW z)7rGg^wJ(6p|r}GLrr=@W^Ki;|K>IqRw}LAX%>3HR4X-@YnRtjgKY78`)A$Y{l6$~ z`#1TcS@Y|gIcG3#`#Q7w;4cTqYYvV90hh_8|F8!f_}SyC?0OKGjTt;${an^LB{Ts5 DBc9q4 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/aura/3.png b/PyGame/assets/graphics/particles/aura/3.png new file mode 100644 index 0000000000000000000000000000000000000000..f5aa4c541261843a6d8e103c382a481bfce4157d GIT binary patch literal 747 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|V1s zPZ!6KiaBp*9}GNVz~lOu=dOV>>zy4J8O2{TGreHeD>=|BEo$IwJ%f36PvW&TGT#5V ze!W+5O47dgs(0>OU(4s64`y8CbZKX0ILy?L$ar7_LqY_DfewR&7y}PCLmQItxixHc zzbY($&ieZ8k5%MZ{iV~Mzy5t&%Ko0sjHf%x9K1YjrzIG^pZ6)|{|U?btm8sD&+Z1# z^Zd*`bNBP#r5jdvpI-dD;(}jqko(dmuPvot*59h^|G8S*qlx`(#mW8Aj!Vn3rsUqP z`sbmtb85yD&dl4_KJV4^F!mQ^^}Nx&Eb8Ul>p99{mu}rseR^t1jN{c~Ycd@-J#=Eo zjON_>QT6kpPbF&?gk?SUe&+i0=F$aIF75fV+4S18_1`^~KhwSXrQ-91X`j8XUNP&8 zeo>j1&91{9>{Xn-rc9mJTzl?ytMl`oZ#(kYMAnR@oq6rXqrF!%pn_saH#>53m+lW! zj$Z$@=gGdPBxBaf%hScAZb>du$p3Z8$=Nz}%`U;;cjrx;Qk+}aUi{|PJj3maRxOyQ zy<%RW%1`fgrOT1n8@VoZRfh#%dz`Vp=G2a8$Ed=$!p{?BPFKGVn-CULT_AUCla5$?wsZH{6UbTT!@)g*-8a|Eosr+ffHO$R|nkGyrXeq_NhafK*H^4@VUxU_h)aM z`SHh(;|H53N%Z&F)^I5u-~A`(NxUO#pyR^iG6svVzpXqs8LSzki$z)5xSX6p;tQKD x1UQBSWUNpy2@wz#k<#Me6?I{4rLOcohWxM5t@ldUmjY8SgQu&X%Q~loCIC?6N+ih zT^dzZ`V0Tv-dg5gZy#!U*Esk3_rJbrd6|qRMh#*P%FG!MhVe(MJNncAS1tTdY*V)M z{blzCo&~HIc(NMK{+zzO{Sm9#`S|eM_4RLmWYqtz&hhn-X9Q`#>?__Ka4!1Z{`28) zm;a2t{Bi5&n^KePm{J&Y8;;%OcG+lotE%R0%}ZqmwhK%dY^Dp$mfJ+#e{Ng0Y%WAm zS^)F0a~H3fE-l;lMNk3cn8oi|ZKBqH-8*ZG@mr|SRnvqwGP$<`o-?RxMJ{h^>bP0l+XkK_mRn8 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/bamboo/1.png b/PyGame/assets/graphics/particles/bamboo/1.png new file mode 100644 index 0000000000000000000000000000000000000000..234355a6376e6db49478a34e99e6a06e970aa4a2 GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R55 zr;B4q#hkaZ4gC%W2)N`v(N<`gGD%A`^qliV=K>Z!$AgtYfq{W;T>|X}Tdz+FUwr;N z^V>b=iYD1hz3nr<|IOn3=L?74=57DUeE<398(SRG^D-Ds%o@ZTj912Y*w$Ov>79Eo zzt7BmeVWtz9?f`0kksZ=4Qrk&ZG0ZRv+UTE^$gMu+zV!2nO9xCPp8k`?)@ZHy^}w4 zuk-{yZ~G*gzzj5QwWY%AojS@&%L~?=lZ-qj(|7y%=A8>`SZ^>yG4$?{7YKaLP`;shD=eAj5WTTF_6f4UAhDW<9fXa6LQY9@JjX z@60dez1>>}l`P>~VEl0VcjiZOsZf#C|HV&O?A@o|_g(*c>~(F32aJ#Ye){p=&EV&9 zOJH7_#k|R< a|6~-atIU;*nlA#3CI(MeKbLh*2~7Zw!pG47 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/claw/0.png b/PyGame/assets/graphics/particles/claw/0.png new file mode 100644 index 0000000000000000000000000000000000000000..b9af05a1072d4ca338045cbce6646153848d7849 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|TRx zr;B4q#hkaZF7h@T@VIziwUn6TXq6)FxnC(Hqh;<98`quRd7qZV~C$$1frNVY@u{q;|;RXTF+c*ArpYyQXY_4=`sEozz8U1$2a z|GlqMy;If%p@e;#uCP9uEO@JSng4-%tiSvl)}Gvv`fi3D<8!GC`kc;dRG0ZXRGMa_ zPMAAi$g82!v_hrs+4&5!!Zn zErXuNJ6_MUwPG;wVL&GuPW4=NPkqg4kjQj_aly~;EHjGl?0R=!cml6*10MsJI2$JP zAdYw2BnET#5(dAny(iz^Yq%yXV7>kBmU#`Yw%lS4vtGN9@dblWr>XKS1*rx;hYi0x zb$K1w6AVQ5y<-OoBpjOc`)U<4FT?%#)oaS%sn2#|zQD+_NqZI-Z^NChrSa?Dd=#^8 zD!=>xrz~&8*SxBy?MGif>Mi)rB^6Nm<#}n`%+Hzs_J&o?eYD!;I~$MhpGd12O1zv; zzH^jbUBDQ?oYK$1BK%2PegUJ@jJXTKem1PxBVQ~7)LXLp(xlVLJCj&E?&;rnyFTfowpb{yuyR8>=2cQL1LY?ML;O~na zVcr2(EkGCYU7muR7ZF!2z+q_1fZCLoGJ#)Dbc=ZhbV?6HTkrR4e`Yb?yaTirKuY=I zbT36~0Zv1E0giUUVxIN_G)G$jYCFrvuk8>QXe+?!Xxj-A@eb}c#^3fsem0Hg;}V~n zcYwB?VE$bH8`EO@p=?}Yym<#`%K%#Q)WP|cclbceJHQKo7J$YJfEIv8+g)Jh^Nrv4 z?S9I<1H1re0cdn(!222R;UBMNJ3zu6fEKWe+A~68ygL9bAPHalYv=nNxC77vB1%(V zTKgNE;toIy$kK4_6Yc=CfGqq}C}o7?6q=vO7Iy$zK$5Lz0`8as+yQ6-5w)G?<2eP+ zaR;CUgb*N|C(JuQ+tcAZ2X>xt2VBYl4KVKj9d`kVwKdQ245-I504)H`xfxKqra29s f6q$E``3(32E7WXMmQh0{00000NkvXXu0mjfoy*7$ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/claw/3.png b/PyGame/assets/graphics/particles/claw/3.png new file mode 100644 index 0000000000000000000000000000000000000000..2a579b7f2500f063f632f8181605edabf231283b GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|TRu zr;B4q#hkaZ4)Pu{5Mbe4#MiZmp=*Ia*8&EuhmO1^NpcU|{Vd9Q66f4Gr@lU7_1=lH zk&;dv(&uwtGMHFfIZQiVx#q<`lPxj#_A(xR^sV8T+X;p{4AvJtUZy<$Jyi|F={9{- zR&UEc{UvAkECuFW#s`XQ`ACDC;R!XyV7#UDnG@c zoXy3{_s1oX?`$g=tQdUvn>+2)-v>0?%E7dkr!c>PYXS2GkW4R(akgkbOYn{A1|FjZ zz7NGE>K4BH%bV&C?PYv@n>lECLtd->W;y0GKf6cw80IpSFi43yurG-Gr)ltAUa7g7 oxrFNiV@3#rY=avsPR29NbIa2Fcd9<-1O_I9r>mdKI;Vst0RHEQZvX%Q literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/fire.png b/PyGame/assets/graphics/particles/flame/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb9ffccacb393bed577951e7a19de228efb6ca3 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV3hTAaSW-r_4d|T!9xlHZ4WPW zm{x2M;@-f)y^(`^gAo6<1m!0W3T{fa-B&%auiEcW&3PVf&w_iu&lXt%4FLm(_51pF zG5VFWABbmq!X_so(2&Tm_MrE2FLeioS&UiD*UgTfQ(y>T?%`T@M~5+h`Gx475*daq zjB(rV^G^S4cy`_ADU1uG6hazil+0vykX5+y_2s5zCsNiQWiVlGd9YIL=f50RgUfXS zhWrZ6%NU#rZki;EuA6?IHKDZO;6cV0-yBuSXZA39C@`#HIPrjC4buc}L2ZUL%sg!j z4u8M@cp|{SW38mT{oGOmF98OhVh=6xCB`famt`k=J2Gsra^PZO&}J~?0P54(FUSP+ fP@e|WUj{MO)7EUBa5Ht0FG$4G)z4*}Q$iB}v_^M2 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/0.png b/PyGame/assets/graphics/particles/flame/frames/0.png new file mode 100644 index 0000000000000000000000000000000000000000..fe33ae57d0dfef19ee2f777243132b68b6bdf7ec GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x37}x9 zr;B4qL~HV&|NrfoPbNfZtXj6_YR?j>gD$()USU)|pX9dak%X;Ztxn+6?K199g$180 z>#uOvmD@TajiK63ZAv~Tqtd6ZC%9h)c7sGKt~^3#a75c!u^Ii*RnzOcc<@EUvw%$! Z42v67d^J>rJ_8-V;OXk;vd$@?2>?&#LQ?<$ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/01.png b/PyGame/assets/graphics/particles/flame/frames/01.png new file mode 100644 index 0000000000000000000000000000000000000000..734a74fae571d32da22d156f7c76ade5ae059f5d GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x383I4 zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrh%=UAe6l9#LnUrmf3dxPrCjT9#W-uSBJzZGxDw zP^kRk<171BSN)mxctwrUqnanIUlqEOoeI4;1O%Te>#qQ5o{`2dsbBN#_7;X|HMXCc zsz8QjvTfMD`r>EVrC$xj41i)2w(rznU7WkFam$Q7`-Bw@Zk0>f6vxx Qpz9bsUHx3vIVCg!0H}#mQUCw| literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/02.png b/PyGame/assets/graphics/particles/flame/frames/02.png new file mode 100644 index 0000000000000000000000000000000000000000..63536a7dd80250cd06bc6ef19c9d75a4e6b8c92e GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x383I! zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrmR=rAKw1WK_*c@168>sk&^c%GI8U;#Zi{43!O2 zO{?YzF&#Pb^91*+z;1WlWs(Z3*G#)M;gGh!Po&+armBLeS0xHv6#O_Fmz&R9_yMF{ zrqa=N!_OJF3cYwFK+HlP1HW3GkEio3`@*GW|5Vmr!5&%bqv6N7QeEIV50A3p3ij~Y zGX}aMp%V_(oSCq-YRg&E8;>Mp7aX@#Y*6*Pco1ke<7Nqlx-Uj|k6ygC59kpFPgg&e IbxsLQ0A@pE{Qv*} literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/03.png b/PyGame/assets/graphics/particles/flame/frames/03.png new file mode 100644 index 0000000000000000000000000000000000000000..49c49952c84f815f9c7193fb60a0cd44bc0117da GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x383H} zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrh%=UAe6l9#LnUdKN9Oyrv@h;?m?kBcUMUPfb+? zM-6o!iOBZsSs-W7E&2cd|9-*cm!yI!Ol|jm_NUgYDUb&d(FY zuP{p=Z+X;n@VL^ZVP?#8BBiBTF^f4w#QI2pHC9A}7JE$JQ?&>v-! zWq6iB`C6e~&}UP@pJK5YPguVybSIZI$USdim}cS1uB^X;{Y( M>FVdQ&MBb@0HfMt@Bjb+ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/04.png b/PyGame/assets/graphics/particles/flame/frames/04.png new file mode 100644 index 0000000000000000000000000000000000000000..77e0474999900273e28b01e5d8af992fcea2ac6a GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x383IU zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrmR=rAKv^Xw=P0@168=sk&^c%JoMR#ji9Q_g#EE zWmduy)~^kbXF6i!gQb=)dGZ=8Bk!H<@$l-OFUO2S>^M_@p5T6UQ1W;SLzR?*>N)qg z0RBD;wJG_MH9CPmqx%*Ya2~ZZlBjgFwRj}Kyx_Q|VkJ{yACFsHK!21?mf=~3EW2}2 zy|>(EiFMsNr#2zqlTlfJ1-twGP6dblVkZXMvkHwsJDJlA8JzDL={s%w{SN3822WQ% Jmvv4FO#lR!W6}Ts literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/05.png b/PyGame/assets/graphics/particles/flame/frames/05.png new file mode 100644 index 0000000000000000000000000000000000000000..04691a5cf74b0a649393ec7c280f0430da86a369 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x383IE zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrmR=rAKv6%voM}O(iw!rKh{($*mPnSid$zp6OV> zW?AZ-{yhuiWPZ*FYM7_?;pop3+^-H!?B{$Moyn`Yr_FZnN1pXIMPM~^e$EJ(BNWuH zf6hHFfWOZ|O=7v-v>#8m%c$RaG*SFYvvQvy!$J$y1#z<&%fTA9R$NJ%#dxJ=&Q__d zvNpORTY1f*!uVagKYr^sWT=`W%=99Yjk5=6yFoW2qrX10_X-(Tpf4CaUHx3vIVCg! E0KYtD3jhEB literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/06.png b/PyGame/assets/graphics/particles/flame/frames/06.png new file mode 100644 index 0000000000000000000000000000000000000000..4738aa765e8d8d5f47526599c8da43e0dbdf8a70 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x383J9 zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrmR=rAKvssLX#BIeE&-rRuV&Dq(L=aKB>QJY(XN zO|xbd+I?!ODtMOc#aK1Vq3`oV@hi>7eVk9DGkG;bzM9Vy%>4*dd{FTCl4F{Rl{FC6 zM+~hLM3(c|OFiYKgJA9N&7dOW3Jj|uZT3;9Y%TZ=~$%mQ7(TnB)<9fgiZ zt`7Wdb=fKKb-GibT~rvqTes&c`Q#&(iVgG9CV zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrh%=UAe6l9#LnUx*jdByrv@h=F;RoqeqjZD;;eU z#EgT2R&9>SuR}W5t0B~&&+UXg1Y3Nr@d2v?q~3H^>bP0l+XkK;?iHe literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/08.png b/PyGame/assets/graphics/particles/flame/frames/08.png new file mode 100644 index 0000000000000000000000000000000000000000..44b7e28d2fb6333ed754344b6e2d4399470e08af GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x383I| zPZ!6Kh}Psk|Nq+`c3@b>xUuxgqrh%=UAe6lAO`!=qdG@4s%EA4Zof2bUdfb+A>HnA z0sJ$L_B`3LbA{k@W&IWGvDQw^Te~{raFQ z*{SfvgXGRr_lxG3{N+(LT)`eLlg#kNLRF<-?D>rYC%9iZ${l}E=;k(OQS(IcE6uyl q9yQRNvc)X?+N+CYUmt9gVAyG`xhP=4ejlKd89ZJ6T-G@yGywqP_+gF! literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/09.png b/PyGame/assets/graphics/particles/flame/frames/09.png new file mode 100644 index 0000000000000000000000000000000000000000..cd35c0341e22552d0f7f8a504c2ec6b212c00ec9 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x37}xN zr;B4qL~HV&|Nrd|J1{I`+*o?$QDC>buH4oN6hBd9NYe7$>N@tD?NJ_ z$Qg7?o_uK?sC>>nE`Wb+jm}!d*7(1@=`3euDjjWiJeqOE!j=8V3V8@8LFQ+~qEFjp y)NekTD1N1RkKH^muc)PSw^nUAYg(bh#xUoGe4ppW)iyw9F?hQAxvXbuH4oN48{zd15N&)GUu6k%4)y#beHT5wf@vp zbwDRgWof<7Squ3}M_ZFm8@IHH#2ub@uflE1QDyxVAd_aKHLObgno(<`q07dwi&N^^ U_VeGr0WD|nboFyt=akR{0Km>f0RR91 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/flame/frames/11.png b/PyGame/assets/graphics/particles/flame/frames/11.png new file mode 100644 index 0000000000000000000000000000000000000000..55553775795e0e63dee21c60b779b826070204bc GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^azJdr!3HGRrk#2Mq&N#aB8wRqxP?KOkzv*x37}xQ zr;B4qMC;od7da0o@VH)FR?^*fX|Bw%xiUvBFTL+d5b>ID=es<=iiSks)x*lmySaFf z!JV^PgF-HU{uy$A=ZQCxAEVx~b*HjlI#(ic`po04QW8J5&v;iTeec!U2jZ1oqT#A4 STQ>u(WbkzLb6Mw<&;$USDnB^@ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/heal/frames/0.png b/PyGame/assets/graphics/particles/heal/frames/0.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9368437398e846d282329bf80bdafb54f1eb80 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1FYV zi(^Q|oVT+t^0^uaunPYFfBNf{CvE|Ix4CUHKEFwAd3%Pz^q^&Dbha?`GG1UZVRPWV zAi<#Pkjy}mz!Lt1rL1}xd$-S5_Df>UXk>m@w=uB4`U;D*1NWbXn$?r{F(R9McKST# zszQB%Mv#?)-y1fk|JZ#!T literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/heal/frames/1.png b/PyGame/assets/graphics/particles/heal/frames/1.png new file mode 100644 index 0000000000000000000000000000000000000000..83b4cf12aa4f914f153f1a724859f73328678efa GIT binary patch literal 403 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|TS0 zr;B4q#hkaZ9Qm3YcwD;+k00H^|NMbnOwZRH2FX(#R6L$v{jy({J8jne>0HXOnn#U_ z7jrKNWGG=Y;cC!pP^)Dq&$z$${=IdXqH4^uBtN{(TwVEG+vq^$-wkuupI}&C`u`cP zH(Sh}d-qHBO}fXx>LBjm%pSlqPr8J`LXm04w4FYudu9kIF-$u5GUCsbMVF0c&%Akq z|Li@%OVSU74s1EIK5yQh{WpC)@*A%67;H{gzrX%?oki9C<6EDD#9ns>yp1tUT)cVS zZF!}=jO&aO&aR()H(Bfi!zbp>&2BN7PF2ho7>?Dwh_d^hugLs@=}d&M6N|$lh8Ij3 zPOJ`RngSRFG#GX`T%O|MUeKzp%lzO}1-bH`R!8iHVzW1{lf=p00i_>zopr0G)xHvj6}9 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/heal/frames/2.png b/PyGame/assets/graphics/particles/heal/frames/2.png new file mode 100644 index 0000000000000000000000000000000000000000..de0b9bdfa202571ab4d775718b25fe7e0e8d8923 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R4> zr;B4q#hkaZHu4@a5O5W4$+%?9SbNQ5YHE;yGuO0*r=-64ILvQT3z>Exp=sj#f1cmt z-JAFCi_du+pnp23GOd}f;aDwW^xDS0>BZMJn{BJro%&SrJKL3@?gzJe-t+HX^Im$E z-w_U}fLjfhjOBxGv3zG+@s?>PkMH+SKTZ6V9`7(;a6@Xs?(^%{vTkH-OmJGc^}t@n z4W4!;&DbJTpnrWlrFcbk?}3)!Ajc)WS_ zcHj2;xO%gb`7T^n7*5ZAe&=%k(jROd46+SsuPYro7GAwy7?JxmUcod{s-Wurzi&^r z{$QIikNwB*h8t>oZu!5zmGsW~3d5tL9xFK4F-}u{AHe)2YfXVl1D}I3V+n&4=K|&n zAj904UND#lIj}F7$Y90L%W{D+gGeR8dm8jbBK#t@N}sO+hAe}ptDnm{r-Y^^02?Hh A?*IS* literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/heal/frames/4.png b/PyGame/assets/graphics/particles/heal/frames/4.png new file mode 100644 index 0000000000000000000000000000000000000000..e26afd3a96176666e830969ead12b1429e7b5fd7 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1Gj# zi(^Q|oVPPK@-{h0xY<576VXe`kZ3S`q47rMu;`7JLzQ)_ygOQ@9)0w9w^y#V@_Xwe z55dA!GmUi}k{O~JjxlUu=w-}clw!WXWWu(9HG{{2`+`J+*aA(V1(Lrrj{VCQ=RIt5 z)WF|WPj6NHfu&FSpNsB!cYe#$pFzv_9bIxR$kNv{gC|)A)ms2 zoKT-%$XHz?UJ-vt(9iBM(;uS{OJvgx83EU<%OS7Jves#WZN~kd3 z;ldrh>280jR{!3+ak6<6TZV*!?I+DiYCFsie9;X!eSdI-p3mB(ee-dTV z$flt0^)IVs8K=pDrK>loDx3H$VAPeIFv-~I63cfslh^}S_#LZtFO)Ef$t+^<73K?U kQ1ji-s#B29fZOBd-`TT{EGs;E2pHrHp00i_>zopr0O$9hO#lD@ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00000.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d34ea7962b2623a3a9bd237f374baf992b6930 GIT binary patch literal 1053 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 P0;%zI^>bP0l+XkKfeGNg literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00003.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e59b68ed85fe7b47fbcc43f29c99312610d8b7 GIT binary patch literal 1093 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%*Q=l978JR zyuEWa?@ova!-HbsE+L04N?rl#mz!E{ObtE4))=v&!N%>g&YB923U;xR!5cD_70X)F zt~_IR316`7icXe)UfMBZzlC0Ne%H>vBl-K*;-2%i$FF~L0lJ2C@Oer1KL+uIt5(f? zzkEv2-aT2jCa-pJ*}6bB^fsU0_u_N@JO!MhmQzfbYrLmTaAeq}QKS)VaNzi_f*rDg z)}f)UUYeiw3trsv-Op|D`}oxVMjrKh3NOk(P}({*BD?wEZ^4aI+1>Zn-7B|$UB6DK z`=5rDgOc@%;po`1{i zx6*j@MSffT`}K?O%Fnl16aQ{*kDGnU?ea-=t|t_>PPydflH=;KW{u8Kclq^a-u`&q zyj)svW8nTf^KV?c@^wn*Ohd`#>R$X4J_gK_-@m@%%d^aduP!WO?>h5!v)7vMdH3#k zXx{DWxUr}7?d+>ppUyp57d?NUXngJ8JQo+6pP%PjSk}o2UVeJ*ZtALr)lZq{ zcue`1e7~Hm+mS>U7q8jnO7r~J{yEs5-*@|ZzRvNl(x(LtL-X#2C&kJxW%sx}^~-;& zQ`#HXbto18T@>wmjjj1>hs60L)780r>vPwy(YxCl5tDb-IL`Pq)bzBz7wU^I270~B zs5<#+k5K5`XjG4USfW-HB(7vf7*=ur(Nx* z$SHhw`x1HDD!t*OZpDG_Hvs~YB*H@|T^vbUonzV2W3@7?+G?_K81y*Nwp zyp)m0c@bHK&+jzPOgCM65$MT8y1q&%Ow(xazuKkC1~c&oFc;@g^Azuz9b{OskS#gi|-NZjjx z-LY!Li^w(WqVnSHy)zlsSqsddwZ<>1pq~6oj K&t;ucLK6TF_v#w} literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a703f36dcc53c7743a2434f081113d5aa3f1d637 GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%=0~6978JR zyuGtGU&d8}{Xw}-5+_fQkhay!a{;>?MLLv%q;woT8HE-u?)tCoXdJ z9{jn+@=)*BuWRQNYcCaP{(0iX9Ixu%ncIJ7OnW`MdCE#oL2Xx;xa{rb!Cumb&ly^5 ztBQLv=l!xNaz}Y4mz=sXqa)P3$YqZ0rwchpdlf>n-+l}8S~<12&);tMt*YA8l}789 z92BwZzs0}Le$V8f=L$+n&;LBFTfcq#iQnlTyWS~iEJ{nu~sP5O20R&s1gQ0yxCjh{Yj(R2@LI94{nN=Zyz)ZEj4 zebzFmZTV}~%ZG2-XT2`NwtCujzopr04Ms@$p8QV literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00005.png new file mode 100644 index 0000000000000000000000000000000000000000..39e159aedf94d6b8f7ceab0b44001ff8bd8a6f82 GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%=~iJdwEvR zT+-Pe*Lz%FuegTO>G3b1S)b3mUa{S6v9;$nF_ZiHOYgkDy+MOrbn_^&*FJ+PS)fg`pl3W~rEO-)=tX&9tCTH{ZVAEiElS*YamZRjp@HO_2HIi_<6f z-+DUjNkZo82@1aV|7)G>_bjUZ?e^~PhN+vGk68Q5?ce$N#lytlq_^so7ixA+37UMS z$L_6!)b(}0*mV}Fd1@~8vo6rAoG#*B{_0lbHtBQSKM(NMvdk>I_UqeQdCjK_rc8QV ze=pCj{@eAu@7eS7Votw(D}DLLXMH=rNpt3;7)#!@yc<|sYa#c4mggd$bLnYG%ACE9 z-&$O+JLcu(*UwH_Up?vHSM&K#?tPC=|MvaK$JsVj6*tzr+b`As-u!rAQsKO*nj3GO z4)S_`<|?b^#)ynmuQl7EUI$KUe#cQ%6JtK#{&%%`WK7;wm1t{g_pR5&1CtDoD^wp! z%{Sd?DpfoEq|fz5McJ2DY`@cV%xhYNcb;|l%>7#4GonrkX@AzMizzs_{fLg(bLn3k zpXT?-<=z#pJL!1)g0KqE=GL~jB-Ov?Ypz({j#Ibvm^9haII7pL_uBLlgEuUh^W{sX zzs)_nH?&)!gg~vL`CMPgXniMzr>tlB3#`h&|=acAoKJ z_mA#dJ9qA46XPiL($7Ejmm5dz|6f)#Wl80(53bqrTc^BiR-4qK!n}67{;#0cebLu$ ze_VU-_Uaqh!D?=|zHZ%(gdR$giS3j3^ HP6XWFAZyE!1qcl%V&*IxX{cpmP3I1DCRUcgVb2B@0^<3K{%Z?ec zaIl0|&g*W!ajfsj#ox0x`mzA+CIP&0uUg6cbk1ylg{5CMSn1z7S~>OfjRkYVYwMp{ zoVTovTX}Ayzk;0Jr>foi?rh<${`zex|BgjoQ^bF+;u7-TQYysvNJ2Davev?;3taB< z%~PtH52l{mIX$Q=$!61y<(K5{`Yku#EpuO@C3cHiQt9u%iC&ojWqnDvU)4=4w$uH$ z?W=-p*~M8MS3@j|&UwFWt9_k&W3~8tg}{|EckBKqd##*a+-Lvq)wg^5>!tgTJ)7Ep zJ^cH0&ADflm5R=Vmv6rL+`!{`L*GS5u~3DjCOsXFUYcz3_l`a|ynCy4ncTMij*clo zI}0NlQlw5kAf37XInns^J89{tgFGdM@Q2)u4?|0xBq{%%N#eC zIq`GqYCfxdeI@w%)A_tFb+sBLkN59CR`W03#U-Zy-SN#Yw^wew`6A6I(t3BQSa+<9 zY0}-ZX^%hkKfSSN-5UWx!Nd3KT{ifs^J>qY+YupiC{Q`9^rp=AZAwWS%iVh;uBL9k zFYhL}z3Z)#(xX3*o@~18x!+|?XLR`Y$1k7U-t!|}>hZLWqk4T(8&{pa{j%gvjo|!R z&1mh%VP1z%&Fd}9_J4j(`|_-gtp|5){q(Beirw1Ujn#6;D~n~nY{YX`n+j$(muBlu zRTS*D72KH6JAYwQkJ2L*rAJj?-lr}X-rMn1a&3pZ?aG&`IyY{0mrp4DZn^69sf-fi znLXkYHP1bJde!cK(3y;@-tJEYMIQ6bTh04^$@)(#HkmwISM}1vb8A9=)NRLC@0)B^ z+4zgMztPp2w|c9rifu%eK5szSnc}NT(|V3>-m@<9Gj8wv zEU|3gX!ZvRQPGaup3W`dTewx$<;Wsl7abBZ#DlB9zopr E07bCO3IG5A literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00007.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3fca8c32c78eb93c6c39f9433777426f8e4c5c GIT binary patch literal 971 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%)Xv3jv*Cu z-rm`rC+#l6_P{vC+2K-GmWz__4OX^KW_3);zJFNOEw=NRc*uXk_reyIq|^w51Z$7! zM|KqiP4MQ;eAl&Yr}wQN``VOszXg5B_-84j#RPN*X`n&h>()`%qI0wL=Uw_#VSDfC z*X!?@cbnb#&U`?zdc*1NpWf%DALC)twTf-N;&<$^=Q+!zQ>MM1_-js*O>K4M&ANqb zX?nXZc^{GLbL)S%JN(>Fouwsr3*KCo=d*Lt7hFBZ^p%pA=GvamIoFOaKEQtSB~Or* zo$cHuQ-aP}%GLcZ?K&}0$yF~-S-(rU=uhRpcefvAlt>E}R@d78{rxrjGF$ca$VQhV zMqz(HJT~a-V-uXXIP>P`Cm*}rPs_74Z|;aVw$^w4@|sua+8cV$DTPVSf7g|?+x*J` z>G{kXUrVYSO`3JW(m&WM^ql3n`Tvbqu5yf;@3^n}M<@?l`QzEMD_8w`{Ad5k0+U^x z9U_+Tdo*`NKW*Ckro~ab?AEi~s>O2i=h^vc+D7!d?zj1^*4KB>{`twr;)SJKbz0`% zi;KH=<-6d<7s2|mYp(8Ko!<|%|7X;(wVOPER#~rH^;7@WqiY{CN@goPO0k*uOewiD zqGav#j;kW=ZHq5nju6R=zEf2`^)>rliR}xt=O2yJNj)1!U28TNK)E!w$Q^x`&0)?HgKGi65ePdWZ7 zfuXlIH)YqRMDO)FQ&=us4db6~9Yv$=+Co61#_PHMU`Mz9s z?TqqWMJ_I(p__NyzAu_-*SkW>>hkG&)5`bDzSlT!xU+a_`sU61bDQ1GQ!br;XOqSMd+qj(4%X*i@BcB!)nBwB zHey%PnUz9X90&fNy;VHn*3YX~OV9mOSt@ckD=2L4uG-HxUe`vxbO{xR3ec@~s50Do z*0Mav%iZ$%;whH`U1XL{Id<#t;n&H>`r2!^d|~LEUU~RRS=iGPmi=4Rf6aKq{_R}U zWxwd6H4jC@~ z|3`DF-<~7OEvkZ#e*Czab!D)5mwrubVH30I(IIf>#F_zBA&LtQwp_}^5pXJ zrNg(o=-k>6cH~z{`StbxE3UnL78$x^PSl>t*^4A5&wXF5)EV(+@m8gb=yvN>48Db{EsE0aL_M@g%$4qr;C_=m<@tUSi;S~cqA9OWRr*xgi@&*b zOz9faZ>ip?ih|v?ib;;mu^|&?OYlvxzkl~^%*C!5Ql6<-0~|BXUSeMI(#n13`aU=Q z?c4wEs=f90*{|F4*uOd&|2}blw}C~*c`d>0z~HH=I^}0M6AwEYO1WQt-*ETlEryvj zVkuL#-(<&3ZSTEti$Qa~h>UHi#T|35z^B{lEaf(yvCo*=!OCm)Z82}R#r|EduFU`W zZHLs_3|szBXSc8Sk6+c?+|ltbdA<1`kL!*Z*RQQxa(-uR?YFM5bAR{S*Znb9tJ6QN zC6;^p*;=*U?dzv=W-Eo6ZcSWXCbiKk^-h=NMz14_a-*dc*4rxXc;Y|RNjs`LLilab y1Q%!NvQ=98uT>RFL97lM32sy$u(T-G@yGywoGJElSa literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00009.png new file mode 100644 index 0000000000000000000000000000000000000000..1e27176619b88e5d984aa30a75a0a5c865f25299 GIT binary patch literal 962 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%r2fTjv*Cu z-rhN%cgsVD{lk5R-AktDF47P`wb|tS)#&i*$hX0!?}Zk5oc(9LC34Hgz3mA`%Z^F7 zn7jR|(c|HfQx`g1lWwEN1hkrL@XIS#KP>d>zh_e}6_;++TYqbX{9^Z=x31Nd&HMMC zkzxJfVwRgmUJ{NBH;Va!cF#J$e)XzZOQs~5&U&)gFLqyLgw8y^UyFMbc#bStT@-y} z*POHGg1jd0DqeGMw!C<1;2OUB_DKf=ddjYZ=l16+yN8DM7D@GfN;bRQIQc^Lq&myl zd)K@7#@EgEU4FSR>)gTFc6B?V?d+z7y0}D&nAhLAZ{O-^rM}EK$@SaW`9W6Q9iCpA zbye1#=J{p3c7|)Y7k}JwG4A%)DZNt-C0b(VfBLoB=IO`G`$s~=j_#T}jd}ajhgaVU zZ>;NCkg7*Kdx;JlrZuk9ryz3QDt^R1i!p}dyZ7VMIK9ZzS<-X?r z`*+j6c5Cj9aHV?bi__?<1duj>#}~`j;ZpRNroxx zu508<=dOC|U&_apdY$9b-KU>t)Yyyj9CQ?1?H;Qx*d45x|HZc#7`p7-_-N zf0_>pZd`EK(f-zj<5z3!*50>z`Xp^Ny{0p>cS%wHJHlZU3p$*FXF0 z|M8N4*Peaz?&RN_%i&xw#qz{DYnJbSRt8D*{8vrNo#LwFcdR`6=qsC*)t4*R?0_WhZj(EqDydzO9NzMk2kKPP0u zvj0!CI2f#><~xR+I{73pH1zq*o$J)TuG*Xve{R|3(~Ip|xSZU1U)P)5U9tG%juU4t zS6x{pzdJ`fSCIEtM!^Zk-&*c2CfgncU;Ht_PO4u%^;u#u#pXs@L*>TQv^|j1%=cEV{sXi&(dEd^j0iE;X}8tw|NdM3jcBYyE|_5 zMo$+PU%NV5i!=7B#KwDjYApLZDqUQjP5!wr`Cp7*M@I)cKl{fA4}BeP^+hX*)s|k+ zn$~gj`KtxtzHW~T1-E8RF5KK;Y9&9d`JnHYtnO%g+v@7QGL`vvf;?ZWI@S?tKHCo% zEW(>#U0ki3_f)r#d)KQ49jxuw?IYU1 z9^6y9_N@3=Z7WH=CfvGPv1-YX-B5YFa^s5C50eDuHgYaMszKcU)V&u<3^>9ooAdmees zWW`e=q4V^i$iDo;Zw=;_75bmw`P@$$oFBZ>Ly>=|a zq@!a~c zp84tN{8c`gAucX1=dRv6cW&w_-4}~@GIVx0x=hhr`s4G{zZJj!#64&ISM|Fzz}_R% zUa8Md{@nZJI=iGAuOE${hPm9m81>~M@YBo3i6A>%Vq)_C{@$ro z+|wl@c=+QEU?5J7W}2|?HO~ZKz%0lW+JC?6Ylnu?uG4Fe8AqSiePR7Q$+7($&!#mp z%jYJ=>V#eVFQsty<@)ZUT0uaG)oBy7{PHw+u2{^v{a}>K_uQ9f|DW|*{PJ7b-Mdzo zFW$Pd$HZYu_?k&ey>;&YcwiQ-;ZSt0)NN+(`6tcs9(?;;j%r0}I0Si>c3zRWUYGbz zdt-#Em(Gg~0jF2yZqB!mn_sr&pPkO~_gTe~DWM4fS2BL% literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00000.png new file mode 100644 index 0000000000000000000000000000000000000000..bd43308bc7ed039b603d5916a47e88881f4f8768 GIT binary patch literal 1450 zcmc&!`%@AK5T+~5N2rC4iddeQ<}1s`RHAr@5Aa18AWGV)nR*nyQWMWCxe83c!|X;d zEki8uF;+_Iky?na)KK9j!YJz#d!z?S>SaHH+F(f&8Pe2hwbZ^K88&24htOL_s$vXl)bPCO~_Odjlicbw~i6_qpM$^(vOOw#B|NITB^L8 z4O*wy<7K!>LciSbWlCueSSD=he2JS@H}p@&*FJmG(J_>KYqBJdYfE+A0erAS=_)u` zOM(^X34>`ags4$6^!^($qHfGEsg_9%@0Lv5GULZJIqq86D*lkNVoSl(=YKNBpIxT( zW*}2l8~>sYc~F>vZeG>dx+lCy4i2v~uAh7TD-m&1$_#sEenw?#IUX%HRNU4U_!*%~ z*GUvfD|Sq>>3qa5MkgNPS3f74y2e^n(pqvX!Uu%0B98tuH_J?!$M0c#GyiPcWk3YrN)Mw%CH<;sBPGWjBs5 zkH5-*{Dw81;I)$*B%sSrk6v`h%@rvOllV*~x9GOL<^5`uL>dy*{)t_s9$uwqv$|Qp z-=%@nI8SWW%HN$G04In zv?XMxm|y}E6|^Sh>buPmJ9KZbdB@JpWLmPweOgH{14 zA1Famq)WaE22pVb;bX?cud>Ox>PRZm2Wr#?i$R}4tSwwTfELZ$XB|w2+Y)rXQS|hRi@EHPRiA4&ipVKOGhYk`yX6qW+-t_Rv zg6F?F0Nqa2M8{S+aQO2gKDjo>Ti{EMc!#8|dvH#dG)J%Y*;F%TiHJB&_I;XmL2S25 zbrTU05=2|K@ni`0fVp@twX~9m_)>1&EGS@MP7i=YDJ4ZICWTqS zE`L~wPf}L6rs5lJgf=fG2L$Al%h zfmTH9N8v$%5er{p8d>(^Coy8b zOPeIFJlKrGEj({`?gUsPE@L=gdpDG1Y{d^V&mdfihd`=IoCmVdC8pZ-(xs;2v)*ct zM!m>8)OLFHlStFfB;79iz5GBZVCjD;kv!}5l1xHsLf|`8+@PUn)kX95Lug{JmZfa) ze_l~NCOU;v6L~*)b%pZdYlQB_#+;mUl;)Jr$cz-?+#;(;eB-GkFz!32XLl4iZ2ynP z>}uP%CfH<6%RMF?zBeIj%%Q;BYV?%^QYjW* z{Gq61Yj#jj<0I#h<&y5BGUa>Ayya00s_kkagb|_M8BlI=BJsJSKX3TF*-_{Yt8cIP z7-Rr4VczV={2^{53>-H#Ycg`pd)`i+pFWPcSU*LEZIrpu*!`B@6VSwzWOd7W)T;S) z8FwQ@g-*Dm&wLabs%@pMU&5W3Su!Ey!l2IPIb+2@R|=_>Neec=wX%$d3|rRCu|7Ds z$ldN7yzg{*jsDu6%uGHW@K0>VhXW!&AXO`|O+vE=qnX5%pW)%3VT=>t@X@r%x&(F7G0 zNH;8XG{nwHfV*uVRLo!J_HTlT+r@Hfo=SIRX00c^rm1q4$}TXmtOi=COqw(qso?PAdsfP;0=gB=ex$>{7;0<)feWp|w-R5SY{)bu8eq03 z%LL%fN=xzmDYS~7gG9d%ma!wB*xDCj(HXSU8Tyfqj#fmLnR8#G z9qCf`e3T;*&q8I}i64=w;Nn@_hDtUArASIGH1J4zJpT zz{&0PC-XlE7>g68TVCNt!_xCmnl;gpv26>!|*M_*8yhI^QR? zFyI?i3kiLzHe7{_$-5~=lCmr9L|S=n4ML52Uq&jzfYYvW2`9(i`Sjpz2`{bUr2pl0ssI2 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00002.png new file mode 100644 index 0000000000000000000000000000000000000000..30300af6895e0aed0909573d971b7119982b0ee6 GIT binary patch literal 1452 zcmcJP`#aMM9LKkkTe-wDk~BR{J+>0M5OTkLCz~_7h_cf}F6A}~X_gYL<$By6B)11+ z&Jl8%D95%4mD@1eTyk`_61ioooOS+!^UL`>&-?R!|MGdB*YkNk&*y;`%1upmzbXg> zQUlzbF>-$;SDvz>ycbP#_2i}!>3)GMcksVL8}*LM11tgS6XO&ecsV8_8U#`iP`iw{_@DplCrt!A?Qme~d!*0q zaI5~D8=dbJBE#5OJxb13yIb?6KS~8pNJ*Nkk+;1n2*M0;px_)5A_^4C^^zdnJ`w*0GM>_DXtg_Zw_o9aSo+j*f}mlT}tpYX9XcmF`#7 zKNjjae0QdqUT0q|#-E%B<}rnLng!N$+cOdb1OZLaNHed&sPHooUbG{ShqT;MN2T7? z&c-m@r=cL!#)Ioa5J@TOX)(`e zfjkD{q&AmOEQO|rFB^?9qgxU>uiq5)jx)TuLAR?&3l+=YtRjfm36e%z-^TvrtNTmm zNa`XclH)phNJhioBzFtr#&5#_UWBLQAse&S_<)w%+M{%3+81(`_o8?w>e9O@)ieHu zg_$~T1G;us(+GRrRH2&fTQfwGfmN8GoV1WirTe?aJwAJw8>Jo5DIBXKiafHV=SED2 zb1Ev#2KSP+wA_^4H5FMsdqxYRlFi47veqPM&3d^mg+J|2lwYOIy+6%%%mulS@zDL} zPih>BN~0=h;TO|wwi-mm`0uic6jsTNq^$+tb)YvqtYm$i`|_LGn^iolmeo#(u#q&l zyR{%4nC6`3deH&|c2og&mv*|;xdD#^S4B!NB3 zYz&2f<$Uiq+rLFIu+s&ZmY5IJeF5n_QzL9WZr3(5_$GOq(sp0mIXwR{0#~YnH(1`Y)BpAbW e{@ZhcvbI6S&Z#P_JFNJh6MzfKxxw+*I%yEEA8CvRYHq5)eF4!~+iu?GzIgT?|vpT<-%(QS)H) z=n%h>jfD5M9*{@6nqsENuBN7W>K&b~9x`+4V`_nCR;{oze^cEapZ)m8<8 zK)bMZwgfp}$i>;NEYAg_Vl6pTLhML%IlXwqLX@BrCbiF1*6vb|ir6i*&Yq|k6T1=gh1R;)K`rJEn1I4aY%b@H-*RD5}eM~REy|)rL zYLHg7%c0++>5=!2mJwXGiNrN_H_`W#EFUd@4p{uY^Nx7 z+@CJ&B?!^PqejXK>^q^el1mBolNo$IXLapmkFa5osBYUQsSGyqXEypa00Lp1q*gXcahz31A@hig@-g{4cA z8~7jJ>bLr~HVZYU%WK%^gNCdjaCJ`(vpDpplsNcK$cWZZr2wLFB&j3-i%&00-O)h$ z+V$A`y*)ci+n9%LSlR62(0yj>ZdUi0)>7VO)Y%=)7y{?l;FKtySvC8)oG4LVjcWL* z%~I~Vfc|7lW-T>0r!lC5&#TLS(4Wd20{88$Aj&Mh@`oc?WFgW4-F}ZYrrf4^JQVPP za=OYl&b$gnuv(zwtF@;#>gkFu*@~!KW1dHPPp-+UeNco%Vd*5C(3~MW38ixEd^{c<7iIV zh%R5P=x&NYvr#SSfh+Ix^nSNQJAXchr|NX)ErLzi7lG>q8@Sgn!&dC;t-SiVDDTdZPK zrptuL;mA!GR+i4hCzyf_Sc`@)Y78ZhdOHaD%L9lw(``4QFLDeyU4VC0@vK={uz?>C zCRQxBZr)}~SWK_wjb=9pno7J!3?Y0*@lc?3^+ z`~cy;b;Zf6{E;VJG;*sgGdqpvDaH+lYOn3g>1tYH`~s^m3Wy`XWw~Fw@hjv|47LB? zjsgKr^I*NMO)&%N%~HKk$EI!x!5xI^rvm`xvJY?6)W$$vgX$pFrf>wEustk=8x3)7 z%f!mY2&zPoa-kb6gRl$V%@M2`6sH#09{AUdMLF44 Iox2eC50m+mRR910 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00004.png new file mode 100644 index 0000000000000000000000000000000000000000..8248fbaa7b5f10e3fe8804434191116612f021e1 GIT binary patch literal 1532 zcmb`H`#Tc~7{`}7b17mytK$-4h=t~!>v0)|kjo6SBA1$D?i8h{PD_RmxfPlyTThea zvW+eydBia`kDZBQxlC%Qv5@WTbk1LJp7TD>`+nbF-uL-D-{*ba8-e~_%1Rna002N4 z;q4J5(?MBQDgb4*miJm+CWgLH$q7MaxTnQMXC$Wq01DOVes2PN zLR0*p2-BdHDsc3fz4+Z=o(Z@j#OFg$xZGli zbkFq_`_s8}T5R9;z!DdOJ6G5q7GnN~tC2w6kw+gcA7cb=p zAcO}ir)9*lg;Vq;>oA^P%(ZBPu+kP9ZMp-;Of@I?ZTGHuk~VuzFmPX*4y3kSMYg-5 zP9wTt^WELo*W7GzNq$Un_DqR|3thTFY%!85Ll9zIcF!dzyA?3wi8oWp zJq3zKj2uZMM|qkGbT^tkpC0259Tb%ZJMoobGN)Ue9lI++V1;!pBnST1dVg032tTXg z!8e+0Umn|Gxgmc{+~DW@HeS04=C*IbzR#Q41A1)=O)`?65*7#R7whY@Ne{9+SzT*S z#wT68+!3tjK7xuoiKJV5JMT``^Qw>2(>hNV+<$-!hTjjlKUGxJaeGg&rNmMch~QaR z&T*dmY&Rxg_$9yLLsec_w|Fm#>Zp7x?pT_+u8O?ng0*DO42h6!i_k?LS1AKiF7V^(*&d`c zC5r18oWYTdwefG4J}@xOneM0Os&wo(w@PHj{?3i$aA}+f%O&yNv;pD?IklK8b-Xh; zKe#|~Wny=cz}cUJ+2%JEt9XVf(?+#jKE)PAo$;fi-F__<)t|S!kBJ?wb9lU8`#KnM z^boH3{Y7u7C(El$^rumkh(i?|Y>`mdy4`cxGDEkPUNj2jEjqZlx!DE+7Q3zXHkE1} zp154gjubdWaJZ3P@~>#^98oUgia+h*%J40qalUF;={0?%?51kyws+p!WX_DUVE2SV zX{~lfc8Ap^QWH#WpA6ZHIh0E#b%k0XyR8Wz{Oux?nJuo{u&K%x_g1})R|8b^z(WUv zvMIc-`5HXtUDtf|q@%T*YRnb-Abvh~`aH5Q{O`dAy-Mn{L9(G{mL0kZ_Dq{hkc7<= zY9n*>7qv~qFK6T&Lf}{ph^i}D_pHld{TQlvoh}Ykj_0}0M|^&%qthq29Ofp%7f0oe%{-z00r_h#1~S83A>UK>vYn(BtT7 syj@uGDvDovCSETjS^f8yb{Q?*S-8bI+n;g_{Pz|F+~4D|+o^)T0B_`~r2qf` literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00005.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf4ffaca4066841dbd0e6dc3995717683e06d48 GIT binary patch literal 1413 zcmbu9`#aMM9LJYatJKmX*Ac3@C6}p{Tb*Yv55tId!Io^x;}+V?q1AXY%63K~PDoE@ zj4~_^r@3V5S#G(s$r(GzJP(5~Vn|DHf! z>}7u&lx^^3w4Wc^&Ke9tGQb0|4BZzX(2kubPb4Pw-ZF4H$;ivN>*G{d0NALwqy7X% zk$XMk&R#Fa#_NAltllpyYlQz|s6bS7AWSxO8t?7{Ka@>_wNC17SW}$Ga?NeC=rUiI zvVg$$*9)qc)%Dr7l#jras`V)vrcU+q72)QeZ~0^-m)V!06dGEaaxcNMhHiGLRQfY+ zLO6TN3V!G_>cX?_HGT|0aTksHb>ewbL~mpr(!VPT16eI#gRM8WN-El56YI*^q~`Z0 zMJ+Y8ddwflZqtJ%InE4HOC%3DE2$n7rxLVGZU3&+6x1=6#-*K7ap7ZXc6f9_Avk6Y zdDhd7Pf%QS(b`4~jmgWu{hRs1x3-oqqmxT*uv#5OlgMEd!P4P;W+*0F&$H;B_Hw<3 zCw+v~@0PKW+BM_l>(bJ4GbNf%zmb`)lU@))nX&ohhwaIRj+oD9s8ZF>(mG z%yJF6$WsbyQ^O~RmOSF(@!OAXr1ki;;$&a_EE9C+n>Oa}UF0uSWBG6ff1Zd}RW&hj zI;lQ`l@gHC5>vg{( z3gEch&qn;E9lxK__o_bjO7fY+`Nj1Q{mJpey;sH5oj2Rx*=(eJZvNInUR$g@bB*6M zi1vCz5QaM1-$&`#W+qbFzq z2iRachDkSPU(N+}dUl#mnn4fYvLL)Isud16Oh)>8v&Pbr-^YE* zL;4H2Z6w!q2e92hHG>&?VWb*|&Br7dpIbR)(O?aM1g9fNT!?`GwiKDBnkJ^Vi!|E- zmxQVG7keF9vR7uv8{+lSy}2 zXpaG(o$K?hP*VEMSD$Jw&*=0uPATzFTCzK_kQ=D`o+6eRGV5bkvkU=+U^`L)5h7+>=xQz`7k?-V2(k)!iq@u*|N7-36vwym_wt}M$&VTm* zWH{Jgk*-?mo;YM?+U9#04%()-6m&F`u_KTsXDtFHYzopRK;4t^*=` z_q#an3w|xV_5Pl4`fVe%CmM%V`f@s>T7<(HGj@{Jb~FdPXaxJd8RzvEI^h)CFqP~} zSfrk|gvcPlb_~Bt4m(QN7E{^VTUtLM-$aYQkRXM76JWOsGLh7q-ek$L=s*DZkA*TF zTtY5?6WZ`B%TflvT_BRf`ogy)pL-0)%$qrifDY1dII`&|Zk%e6khq0by{JyNVoEdr zY}oQj^?K3V3Gpp;o}DcHaH)XnmN1gH;W)7cTu3{0XJ(x*=Xzdl-q?_4I6sH-VAheS z_G+4_+$jmuKOK6wdU0dojG?x}_yyz%O^MY-F)!U=Ll({kRt&U~@tH>J>K;|hWo{Z* z8KF-gQu>J$!_KX-)3;B)UrAC7p8o}sI(M;S(s!y0iSTkDjCmd_PhG5OF7_kFS?nDw zOFTVF7_XXN?Ec~zb8g<@@3Ah{uH6KvJ3B-h6Ru<7tXt=R(oJo-e09);dIsYqGu&WB zsdf82WyLrb7>%xa%KR9w(Wed(e;%6MYH$17sH-iDG__c@I` zD*<@8TDG2vy6@H_85v0nI;opSH;-&SRVGB=Pyz`IzK=_MNKBc?F$W28{xN=jM_NVp z{Zo(OSDYmbO6CLHBb%b49X-^{+7*fILj79i=b0}`gD$;pvU}0oDYYHnv>8Q;z%FXF z(aHPd_apHxqMz2Wu%X`h0!GolDI+*3DML~5>~4A^SNlL?PHQw>TFj33?mXRBF={HW zg000Ztd6RZ*bsh7%8ewrJq$wr7<5DVZEy#|yOTD_#>hpbYl@1{ESxQRxGELsV7{8? ny20n@MeVm1(Bgl*j{U_e0RLJ^$aOlh&r4kb literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00007.png new file mode 100644 index 0000000000000000000000000000000000000000..1f1f7ee1b2f68b9793fb5bd2eae90ac6b1d89783 GIT binary patch literal 1264 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uEJdC!jv*Cu z-rn9=bSFfF?SVF%x+H(Vjn{{!P1+-PUO>z1&Ve0X&W9Zw7c{f&XWGM3dynDG*R-~Z z*+({RPE+cNIQ4bimPutxb&P-Rb4xe56kF+*{%*atB@56gq=JSCC6*TFKi|_&n39?) z19w@q(6Ki=LiW51_X^=H!Gr;GQ$ zV!HOwe))3k*eU4(w{Aon>H58(kgN0D${W1RH$$4|h@LGhGV<=u+xh>2-&3BTck_#d zT=fgP6?1B4ZqL5c^?K)vtD1S85nDEX3|;eRpZ@zdW`(QOsvPf|-Ba-7NH@P7R;azM z{M+_Z?=0rW$iGRwnV>KB)1b63!qw#E>b|$jUQSkNQQ=qoQ}t&CKuMtbYIIEj>D=;Qzt7Mb~!x*j|;?F+bJr=1tD<<;y?b z_`J2fBT_g~ezW_UUAMQ~_`gey z@2XCiY21_!*ZEcPM^|-+azDQF=KmHozN6Yvmp8xOB9W3_zxvm%rViKtRs9jA8&{p1 zWD&A1wePJqtk5kX1zP|XvXf_ zw;z6e`t(wvxLw8`!?`iX)qA>=x4pZYEhQWkxzurzfK#1tqS&iN8O9zQ+(0ZkU-jBq zh5A2V_NLXdg+owqwh0O#?T<8$JUU+Afalx8P3MFPGM_!3+XX^`95}UjB&!U3XT|LpI o>-6*<-RC&S!$d@ezp(i~!=d2Q*18*uH-eOVy85}Sb4q9e02-%1lmGw# literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00008.png new file mode 100644 index 0000000000000000000000000000000000000000..33f28bdef91e1cc12096a1bbec037b756d989cd9 GIT binary patch literal 1369 zcmbVMdsNZ~6lNW#rbm1<$`tdh;WIVO!ZHz1Gr&v`Gp#75r6XUZ(-_OCVa%{5IkhJ# zC6dWZF@;RU=cc7DNI;L~#8UAsIn>;*{l9;9&-w0m&pr2^d%tt;x%pw(AOk%!JrD?F z5E6_G2e=EsZC!1^mnk}T0<<+LI4Tw3ul@zjUMv9uyUYk;T3`zKOxnd15J4Ck)f!Bv+X^J@0b?9VgOldT0YEt{(sg&x@TteV0C z2dqipJALcK_S()4`7~zTwT52jfW4K%td-553Xc}cz7xQ$b9#*ss~S1;lg~b>Bq%QQ zg;$(vZVqbk(syb_zfneed2ZQ+PsHCfPH-plr!GvNZ1}C|Si`(&{h(DI}3#Mv-~F+f!VOaC7x{`Mf$KX})E6cC4&;f{LH|exTV(Y28Xc9_MC3t8iU8dJ;}2KP&KntaC^4 zHNsZCTg)iN^K`kYk3~rE0?XE575Tc)2Pt#cTqxA^$q#!e)LLK#)ig<)bgY#YR`qalr_nPI4Umv(5U&W;UJ9CHc&Sxk4usQkPjNEI|3+h7{k z$@K%;pF;VI{HcKv^t(SK#@2bF{@dto$YWr3+9<|7H^cMnt4X*KKmM@2aaH2p8|cIk zXsIn8qIM+p7gbb~SnXUx_uH=pY~P}0_R5lo66d=1=U73seC!d7ikbGp0a8LyyaA&3 z2u|&54~E3{XG)!St=eqIL?0madTohA@oG*hO!)D#fql+>+hP|X=Vs=`P1GSwzW>G> z1KOtdZa2|*nt#r`Q~5VpqLH#FYAct6Ep%xsUr@7^l~&}>87U^Q=|LZ-hx%Ju?thIt z9`K}{N5^-+a(-fkQgJnW&&Qr*h+VYK<6{$Dg2|7o9h1d@{#oO+3_+GxheW)?vpjun zwmCzyjMug16wP*;N)bmEfP3g2b2M7wb7?7_ip0J9yJC3HLk%~MrPVrgBJ%XF`6|}dET33$w>XIN{k=!m!?d=Yh~Nx+j>S4#0OH@Z`nmo2v-NE;3%FMgScj0QDAg7GwGQ;e<c>R{`B!M_^wZ-Bw*Phk_yIS)^z7~)5u<}?NxX3UVenDd=> z(!JZA@Hss$5WX@$ntb5~-a&_T!im(oO~85LMaU;caIe$r-aJUOB2?N$aHi&z7F0yi n^~e{OEm(n&FK_R^?Z?aweaL8O>b-Gj=a;Gw6c$;HIGz0u5HogO literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00009.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6ff4857303b6ec4c7285e76d0adfbcefddd051 GIT binary patch literal 1364 zcmcIk>r>JR6h#d-MYA$#bJwg1(^b%|r0}sO8rlyOv!wEo4_e4ql&EEznwrCC+5;-q zFlkzC7f}qKB`NvJe2|L@rYNM0m0KdBEtVxq{RR7F&&;{!emFDtp1Cu(@DL%u!pz1D z1OizA2M-)J=yL;auZ0*Yd!lEHK}^pc3`;Sn(KiO$cgYM5JR|gYsvnIUn|g)@0)$P{01P zc}Rg#UA{!;xCBx_Q{NA5cm2x+xtr|zs?Fz;cdiVUO{Z=tG8UZJaWqC4axzTMH^F{d zqVJ4fKv*gV8CQJEyfhuPR~z7lh5kQ?iW{3GroY2YOGf%AD2A-~yDv;;Jaay=IG*O= z!`PJmTfH;)2rV#psDQ46*hrU+cj0ps`yk~l{;-1%fG>aqK9O=9(kU_u(R-_6po73D zmIb07#i3g-1-YexXA{ba$}FXvf8Z^uKS;;Zd@`nhc!WTkcHIK!UCCP} zzv_)k$Tcr+a0W(4hc%y*CKxxyL+;&uS{;cQ55ae`@7@Bau;D8c9Wqp#SPn4!#3}FS z934KT-&T~J#uw>Z#1H;HQC1fE0@-w7%1lAp!M=zXwUC#{P>_PVsL_oeiz%5O(nb%kBd_-OmF!THv_&mUu}+tFEq^CQRf zlW5Nh-PF>}Nu*cHDQ}19NAYi0E8`;FdZypN)t=LmHEQ~jhl;?sJcp*1rg}Y;@!^MV z!cBI}g#)83Lmo~t{#<#4aCWjw&Xoo-s@)$E(7Y z%-2#o8GA=Bhv+QY=2f{x+M)!D8-x zd@vG+hRTz@?r>_<7Ht<9j(~P>rrBziLW0)!VM(#o1!nnsF8sX1RE;tVL~_lt8(B$JXMFW$}7^<&~^ zP9iEeeS@PC2-?5S^&0POwvcr#GvJF_+%tx&17ogdZO@ny&T(uJliRlo4r{u9ql@bJPhVJAxRqFC?rz{uem1!`*Xl$*t zt@4P5gp$qO_&5@Z8IfIAWXNkc3yx~7WfS4BCz%>)yST=8wZ5n;?^v1@Pm!nP5E1Lr tXS~%>y2}G8yyrvb$;sfapYA{4&*_}Rk`l#KW)|YB8^96{@O@+Q{smCCUef>o literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00010.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00010.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a770e715e326ea47bb33b8d6f58a5bbac14535 GIT binary patch literal 1338 zcmcJP>r)a46vdGgO{`|rtj$PtQHx3|S<5VZWGWz%3MNvdX1f+68ITsfMjds;aZ4CP z#Gay-pgnL+vUDaX0?9GR$0k}!lB3eNBq_LxOZ@};Y46Orzk6oRhx6%HorsUw;JnQl z003-2#YQFC_}ZpACy;FmwDO;9Sf3M1q}yosLpWdAi0yze@hOaBv~%fE*D-33gWdODuV!$9Ivn86i1kuWS1dr|a*=tho9nxKtzi zuzt?JES8pCMfmu9FZF-VTHfbI5~Z}roiB{>J0F}hc;)b6WG{KnvALdjLt`g>vF-C1 zm(lsL;gK+mVkU++jgX;TQ(Mh}#PcOCIx$-~K^~fzO(iE=&U!|@%^k#RBn=wyJxyC^ zESr#@4_P(O{k6)f&)$6BIR4~dPvFg4$N_$(DN@wVO&RpsGZv`~uzP=D*g*%w>aafD z-Q9CaRK(6N^LYnCV~6%1Ez&9ka$Fz{+%8$%KM!RwS@bzkD+x^B%_TF9D~#Y_v%%a= zqh3-~`-ux#TvUs*RDVswTbG?E-~WJvsFH)}170NgyK$U)U^$`l`TanT5<)#JWSX5x z%r%5=-I&k*Jx(3 z)zc^a93mP?ej)x7aq}N?=}UiCA9_=~ShB6nW}g3Bo6y@7jGl?TJId%{Fr`6azpDipQ6@99M0x331`kr*l! z;!>$F&yLJI$g7qp<-l-HJX(C0H2k<2RLYjts<=VwmmhfSk=w=8^m20?lh<3>?veI5-(-*I+r zQTCTjHW8XbU_oo|WehkLIq5~gzDk-FiVi(Ga3(UqNU{54y)U0{!C~HPLJM=R>*TKB zn-j}stJNYJ(_0h@%KURZ9k`+X3sg~a(gf83FBje>cTyhi8@hLb9Ws5Yz>UNe{0Y=_ zEY&ZUgldC>q%-&fNk?+0FHWACD|#CeB#@2z`=@e@?@&)!XZl8Tr^_JrHD8mW*{ZOY zZ8V)J9l=BO8ncjmm;$nW$D+z`&(Od+oAzlIE%xDOD*5?*aYp*>gx$V%fm{-OZL0ZX z0(Gx|V1Q=fceXDzYbSY-!i9d0YRS2Et^}u&##bn|L!w|*&>)JbKWMA7G5@8-l z!7~}!>INcQsZjE)I-Ka%iQ1H`a@DT7F!Dka<%S#F!ztC9lhStZ$?PE91GJ5c62qkg zVTm}yF`^0WhH;P*GBm`Oz#m4WAMum0%1ffl+q%nyG|}r82@7KXAK&9)N3mVL(j4sv|P3^j|CmODzBZ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00011.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00011.png new file mode 100644 index 0000000000000000000000000000000000000000..0435cea196b534a2a08351ac49f7aa09fb5ef8a4 GIT binary patch literal 1217 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uEY6-Tjv*Cu z-rhNwC+#Z3{^0(xm9s^Zmi9Kg@c4Ko9#q*`9(j-KnM z?77*a$im5Y_wKFx_LV>Lj|>z!x>|^Xq)O{8 z3ih3FwQh~qq-)im&$hPiocMS5-Ax;Bz0|p8yY*++V(~qE%VQncHoiL6o3`&)+1Cfl z9v7^%xc2X3`*QE{y!^Tt_vy(9W+S@Fgb zr+!bLq_Q{eW=5%1_xjffg6AGRWeS+q{KLp|ch=IoaehUcJ?!&pH(M34R(@GC{eIcE z$tv0WWuO1veS28Xy8qvw;GiGEbNv=y z%`-pUT(({3^g@m+uS)vf<=MVDzV>L{9j!@u`ZwRo_57^)|6;ED*SeHD%Nl2w+*|Uq zFmTn?yzuOGWnGIRR!crFoD@I#N!_i}-|MTYO!8E3R{k>z>rG-Z@K)=Km>joF_~_cp z<&DLG(i>N8%z7EMxbo$vJC1)|PVHT?_eQ_VR`!~;e(IJLcE9&Nxi9{8<0`KsNnuyr z)?}@T%8Wmi9v|mBX^riT*j?r2zc*}KWtO*g%kAcG_SJj;?D_gAME(Rz!nB^A2=&-i zi}fC6p1SL*lXmsbj)<@Ct{%J4%{Fm`8eeGnmR)yE{{4IHYV0|SyLfA|tmOL^!_{jH z_IQ4NoOD$~J!Va_>{_F@Puusuxu-Mf&W^1U&M%i2K6f-m*4ATtuudFq6Ei7o8wB-IfyIVIbI=oVE`Uc8OITBvBrELC} zU6qo{k7%V`Q~0^%m+EWJqR-b3-H2VYm3{Zs86jIYhYHVJ^?3dj_O#v(R%M^RwG*=L ztg;f@oAo&Ch?ZW*O7#<8`}Ll8zt`ipjaz$Nt1Icl@9=18>1Jk^9U3k=5({@V?fE0v z#+ki>FO>h^n}CmID{VhpKkl0*t94IGNvy}9BjR}7rR8RMb6wUv$~E1#=G6_x`<_R% r?s-I!^qPIBK|WvIImiMyX|lsD6@OI`njxgN@xNA^kgvN literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00012.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00012.png new file mode 100644 index 0000000000000000000000000000000000000000..3848e8da683dfe99fe1500d7b9e06c1aed052541 GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uEajdqjv*Cu z-rhNwe>+9y*vIFkYg`rkLP|NO|7c)Q=QA+m^vy6YyTQof^hn@^P z+-`+zTjNBjlM~&7j+I?`|Fv!U2if3bGfvycZkV$FoTJ+(m8)moRDZs`B`sv$_H&M9 zM{^gf^6FQZYrvyos`9d1zkJVbc{A?s^?zQZUf?{uX6~ZL-hFWgLL*g^Dko)43Rz$M zYR}7bKbuK!XXRhIc=DA}e&ix?t(3Kv9=8XGf`DM}3aYJIO;Oe_?tI~E^toXw* z<(Ted;q7i=R?_-qF2?_T*bhwmd0y~zs8-(EZQKQG|EMIXo(I~KSH7E9`Q^LA)4pG; z=JmXEFizyg-@IbaJG16^Uy{EVVgJW+l1XQ%>!kg9t5+BvO1Qjd$wkTJNo+HYteRDS zdd9Up-?evVW$p94f88Wc*Jhcz>7;YXt2cjqGI8R%OMfS&Kdx!t!@eOiTzq5Lo%tQD zxlf|Ai<3kD_TKzwyxCx$VEe5^2~VjAPkUQQmi;xx86KB@^G8)ZZ+3e(T_Gtk`scA3 zGqa}FpI)&w`t+U3w6poGUDsaZd|c%Ey#^R#YxPW%cAj!kQxe;Dx9WTIlnLfye}0rM zxxa7z8unw!uGelYR5|)_QjmB7@47Y3Pk#P3x%PT;;U}ZIk8f`7$f$o{6&rbkDX;00 z@`<_q%zLZrKS}ejR|hWmoA-?0=nFsp@GZQD!$j~vDikg&`n|N zg^#CY>s6&5(_P@z5#hk7?3>rK>6(Ngc*4Zr`tRe=N9@V~xEY#-T$YnlL|7={^ zJn`*Z0;>y>1vfS@oxbL%KwmCb#-RO89efQ$mt?O)xYwFIQ-~_se_Mm1;S7iQ! z;NWRbBVOxmjpCmaBX6*EaMMf z)OMFOA3GvUr3)8^O$zRE+q`qyld_3VX6K)OcB{Aef8>WZFK2H(wQz@NqS7@PZR=K} zf~Kk$3Z~M68&^$EU3~SH$EOWGpPnq=e{H^P?dC};+4t*bKGjYa@!}QnIO`|8agxou z-ucTb?N545y0fQrU$8=5n9tmfuM;Jtw$IR#U6Qs~DeUXH&`X&@sgvHni;J+_zh#2T z&Hsx|tgn|*_vGupde%g9!Ytm-h`m-nuFqZl>dDjf;+tzq4Lysdq`coSSEcfPn8Ib1 zq_Z=#rWCzAKaVeHv!meZi&<;GCxx1Nh3dxsdLFX(#+~!?tLJu?{q$+YFEQ2 zoo+z$_S$CTtK8JGetl$>W{|??#02FR-9e%Kb@%Vy_4)oT{Nl;n)W~TsrOWTtocX^% zA?a-QWjo>TJbTrwPQ01>CF#D0x}Rw3?!9+o!&UBiS$elF{r5}E+eoldI& literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00001.png new file mode 100644 index 0000000000000000000000000000000000000000..ad36fe5c791983671de616aa3d37154c94ac3d01 GIT binary patch literal 962 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%r2fTjv*Cu z-rhc&C!H$7_Mm)?(iN=(O)h_q+}0D!ejv3&SdU@jg6_N<#hQ1R*9dAKS=OzwDC=fR zSBR%^y!bbZ}Y;j zqJMJ9V|V>|va(mhW#dEdU5edh{*C(q?|#+F8y|m&d;XL9vGq=6Y`T_PNYwXO)5DvZ z?lAqn{4#E;kJqH%-_<9tn@|!sou6;nW&Y>)^F+5-R7)*Uzdn=I&dw(0$SQfc+FAZ~ z)$fZ=u9!6C$?^C7^|imgR~C2dFcsi6>QlRQ%~MRz0{(?d?I6wg6+;{Wv{RMe*6*mZ^fi`)sv6s+s!|! z>z2$a8Ftxpa?HPX(_d*n7Hi(r^d;qN>!D`{ckL~ns+0EdPWAp-Cf)wAlenux7heLJ zqLs9@eBG^mfAj3+WzXE3rmk7}>5GnMQB|UVWOIkZ?3@@wWC> zMTG?kQYjW!eHTx8VJgRKH0P4b%Bvr?iY%ShH{&7A{^T`zdf0;F*;Ol zdW+|zT~m(6r>8F6R`SKA`HqqH#;nc`Qyal-i)hz1QzN!k-E}@9HA6JTV)B_smpv!# zvC^-8u7CQCbKJFKtIo)aZ*+Tf=JNiu^zxU?`|B%yR6i5v_127EcVyMB#d+pOrWSVJ z71;P|yQY!qO^MapdL!-~pVtxb_jQcprLJh{q|n{>L^j5_JgHy(S$=U|fc_TuzEaaW zu9H(Pa=gweJK=JDf7*e2BJ;Pce4Q(GV8XuWw%v7azg&(Ay}F3;+SP*Toe_J2@0A(6 hm$?MWbs*3X{oM4&ilE$!&ysh5_@1tQF6*2UngC!>rtAO! literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00002.png new file mode 100644 index 0000000000000000000000000000000000000000..8338ffde0aca29e21fc349261b9bf9bbcd3c7e42 GIT binary patch literal 992 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%t@Xujv*Cu z-rjc1lMa<&|L|X>RVO0UVo4B>&?7cmM)n5o4Z1ly7^Tf}A~q%54((^iwqTS|>Rn~l zxnfF~Xy&9!okxXgE9X|^OfH;t-@ogV>OA${IX|EMy)Uf}au>xQV$-Vk!aH)kG>dz0 z%kXWVl;czJ^5?&I?{2?77CzNJRQ}!9TBh<7k5%~9|NL96Qh)!$PJ_i;_xV3qr?K|^ z1+kN?EKT$@4DP$IH{*JvF=7;!n<($3BJKvllyBz1k%9qoTT6X7#?` zbra6-zhN=oXqAfU&!5Ym_s7f5Gjl$&R#Z7jH+<^n?Wu8ynsc4qzlH2e3>KVO|ac|aHH)YQIu&t(nuQpYQtadxz9jfiqtdsYO z=hO4a({I*S{dw0Bw9mHU+ne$R~u_z@%Q}8_LE238>T0P7F|+I zTf2Idl=*=zQtyleyT6}W#QnLmy97r<-!biXZyN$sDPAsy85}Sb4q9e0NA{{ A6#xJL literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00003.png new file mode 100644 index 0000000000000000000000000000000000000000..444a0e14c1c2e9f0083b72ae815934a2e5951120 GIT binary patch literal 1002 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%sHMejv*Cu z-rhN%cgIDB{lk5pg`Cn|UbDN*)>tS!wcPQUseo0_hLJ;2Z;wlU!867O=adUr54Nhf zW<^a{rLu%mj_;m*+T#@Sg;%e=KJVUT^X=BetsnEBTPLS016@NNc(HBE8{vp$L8rF% z?Y5T5b30+au-dmlBw{>ptnWoznu2l1&LGJ@7C^W0tjdIl@a(|fe=0gA9i1y*7`_He|wzx38v&m zo2anu@9)>EKHno8c>U<@_jfF|fBqOaRXHhri&oy+2AlfnajV_zCkFj`KVhHAwA3_d z?Zww^PlTpz+}3vZaK{e?rAPBu@$CEe>fv@l!PnB7cK<)!>$Y^9w(dG>k>?Sqemyn8 z>@9yxU+wsM?B4s*!o6lEE??Xk`0Lcm(#DviJ6l6~b0>eZ$XojC-dRR#pvkO8`bnng z>t=noj=Ou}=U@N#S6*vATHbuQqod+m`PFaPFE#*OttzPPe)`PSCp$VSKHvMY*4k?I z>E}0R>ZM$raWtzu@7bx8Q2VdD*fYB$&PH7A3GzML_x#I}Bj5S?jyX>Ny13%Yq&-`i zs$vy#1z(^0R_3San-ps7wN-QJk@)&Kz2U3fckkYB^Zas3r^}j1%~(sX&bZa9uiJXe z4hq$L{;PQL&HZ!cP5JTgpyO@D_N7z&gS?i;eE(S)7sZw0=C|^zlK#>o^Dk>$4Y9p> z|9|BkqpsYYQ-Zc`nXL3mOfcIm^i=7)_UAKGU-KTDaLCG?-za+{(@ujh({TN)%d$WN z&Q(r)dGl4Fa+vA%?ugZ{M`jhac3kZVRl3&o>CelMu8vQ?)<$Q)Za%nMbLplsWwZQy zankjchaXOEUp_hFYeoJ4?JM;Er3F3-I(0|x#B{Tg_Wf5>w{6>=@8)IS7dBt+&D*`( zA1oAiU6VGOPhjJ+W8rUAjJ6(G+nscEk>Kga>axib>`LF+Tg{V|mtV`zCLi}yZ9$~Y z41II1M~lp46_R{)h331gnJ2h0>wNANouq>`KxYYT%=&L0))_%WI(KmY!+l5C;BDJ& Qxm1vHPgg&ebxsLQ054{;ZU6uP literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00004.png new file mode 100644 index 0000000000000000000000000000000000000000..4f621889af38464bf7851df352adfdac64f3171d GIT binary patch literal 964 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%x<18jv*Cu z-rl+E7ZWPM_MqI+^j}E#(okj>z2nj!Zyb^ES1n+*y>L0M<6ck5ttGm;6TY11E2(5K zej}MC;h>dz_Vb(#Y46{pw7%(oe>eNBBFHhMfE`{>SE(07W~~+9_3quNQ&E#z4VPb= zpO^dAZ}+|_X?3kVg^z*qSF<)nO*&dvIrVU|r%`=q@uS0rpIL+4>iYU-=AOO7{k$`x zJS^;**QS8Uf4-bHUv0jB#_aPR+&}-`n|yZe+~(%Ri-jLg>$tit&FaJy>8v{)(6QA%qc8@R`u=UVis$>gzvt*) zcQs};(oHH2U$;v=|L)$2=lkbb-@Br+_ps2e2ghuBGiyb&-<+DNax~KPvg0w=HF;}Z zxvhM%V{1*-=O6h;@Uwi(V-5h-XY?(yH1 zTg@Y`+^X5N_3N8U>Zi6|Dmt=Cyf^5s#Ic<0Wz9W-$M$y2P^rIHKkvG}pI-3W@Aq<5 zZhEd=s#g8Jx~b+zl-`6+--PcU>*D0xSFStzww-_bZ~0S+d8@Zx>rB3Nt>}o=_qvL; zrCVP5+)3E;V#$uUsCNqK!LQxCZm!%q?eF&d@^=5LD?thy=e*U^OVtP~T`#(E#?KB@ zq17%rZCifad-dS!q@zohzW37ny!G0q9e+NqxBT^-N5A~L`M=80-y2^Yy!Wk4U;X|M z+u-&Oy@$4KmDtF3TmHP9?X5TRI;lH%=a?FXl^$0T({)>OSt)o@aPriSqZ7oePeg3J z_Ozopr0ASy-ZvX%Q literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00005.png new file mode 100644 index 0000000000000000000000000000000000000000..99dc366013aafaac4c5a3d9b7506b7146d1325e4 GIT binary patch literal 971 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%)Xv3jv*Cu z-rhNwC+#Z3{@{Mt%AN@g9!nMl>BupxbaJv`4G;OqRPd@X{ox_jBaPWRzvw<_Yq`SS zuqD*fF>}=_Lr)u-q~p<>Ut4Tb4E|Lc^yH(}lKAr9=3nzdTaAzCwa zX`Ol7;kPQyebf2AegEbr{xyHrs((BoDX&+tZ&2Jm`OYhgf4-CA|2^LL!M^A%P>gfw z*Be*cLicVmK5?#K$6b}?Nl%`gechZbyVOo<>Rai<5346H_dcqdv3iw*-e$3i^78LC zVYR<*mf8JzarWkviz=EYugAZ=|L=4E^-nic z)Fb@JElIxnGmot*o07HLZiZ~lzb_{0iziJ=vC(7qTqe#QtMcR$P|LcGt9_wwHLgBC zUfurl?Z1m94~xE^yf?4AdCi(tOfN5#ybI91TzFae;ntAq#wjoVy{q{#%WY-lGIygf2#hkSbd(~U(Uv&KlJjAFt3-n&hu|^r%Ww>|HoI&_w|pO z=+X@VZ&^3J2};@)9eQfT-Su0Rb?h_yvU0D(w68&HvV=EAxPzp3mtWkwTS-iN^@@tYy&e(pdJ#V!6z@m=Qi|-$phG#c^`OANz@=lb<>RT>4*8;P*-FULYMJFum zHP5D#n|F5{J(Xo!nwJxE+C|ftqjuG=kjb6B`=Vzrv(#?@xzI2v*XmP8#F{n7f?q5< hzJ$1Bi=wK*xSsj!4BO|4F}cDZ2~Sr)mvv4FO#o*rvt$4O literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00006.png new file mode 100644 index 0000000000000000000000000000000000000000..50c0d9af743be4c1b19d6ff5fa0cb7fe7827a375 GIT binary patch literal 919 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%#xlijv*Cu z-rjM{Q*xJJyRg2;_;gN=nB4)(3!;DQ`EZCp{OS&IYoQZfm1n;8Nss`J)cLiS%n!?y|pT|g9QP!9T5dnoF4_b=Y#k0+&UcsFHoclXb2 z|CYY_>)$x%TP>sRbI*HgfBscD+1|IFb&`sDZM?%`z5deN7vAfYPy93ro2rt(Ppg@? zaXruR$Iq+{EjoAwl6oz?yP z$rhej2cM@*xN}c0Zinc`7lF?OU+0)a?N<2l^{2x9zZNln|2)6yJL$>$*Ej3*1?DY0 z-SJh!YiH!qjjvUbwu-ad4qWwYoq?a>|<~5$>mwCIJ3o_>Bm}*Mj+Wkdv?~7n{)=T@Mukt0l)wpUl|7z6apP&9F ziSB)wwmE6->K9k#1npwaemeg9~ac?{kmrvo9aJ z`+VEvJM)WkvJPj5MzwBO$y;6e;?F))ySJCtS%)-uTD2FL{Ez&oxpd0zy)n|aKHTbz p__My|<&iteibN$yR7DqN)-#s1crW*IKd=%cvd$@?2>^YRm+k-n literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00007.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a7a37aff29423ffcbecf1a6ee51c9ad73c12c6 GIT binary patch literal 829 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uO#3}u978JR zyuD+XcR4_U{lj;GCT0^?kBu!7FHCPpK4i+-%OK32@Q}rzkWnI0uROs)R*Q{)stnt< zX%7uWcCVj!*J|r!i?{E$Kk0sZMDEkmzkeTDumGJwJV;>O_`XeZY4+QM?HXyhr&n)U z^J`Cf&t85(xAOmN-#+e1{`p+`hB;4B{#|R2o5@j8Y{A>738sXJY?e4Dm6-qjVdR9> zyC2opN<7eQ!_gom&dO*VjM2=zS+?(lIH=SMNL( zTb4~t+NZWHhgbOeZpU>U4nI$sXm_oWGvTYBXRb8LEB1B&-|n`a(Xvo*wW*h9&>gX6rE6<6%5E(R;dtx$>cFaja%NE_6Y(BiU3^vzDS}V2GMSt7b1@V`HUx+UK^j3RvM9ySIUZLG?E&1|d zYxN_hJpEp9FWfiBTeI}q22W?DYp3SllX(0|^!>UENtf7q6>PU>r>ze1Dm~Pd?ti|$ zV`u08uM2!tQiy#eyjS392RM^^0<^bR-ROg@uzRoQ8N#MJB4U3Db8 z*Iq4s_-<9H^85C6QtuW?I9=w5HO)Cwx~Xpdk1NaHO&{hJ@9CiVC-ms~BF p-WhR6%h~_TUscjl4#SSg{}{_0{tF6ED0c)UI8RqUmvv4FO#p_}QKbL? literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00008.png new file mode 100644 index 0000000000000000000000000000000000000000..8df60d4bd52705923aac1de06ee31a1f17cf2597 GIT binary patch literal 832 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uOou#O978JR zyuD+XFI_5g{NekXo>x}2@aalU+QTSzq>Y7H;mCml-mZ^$OB@zuX&I)lY-ICRdHY07 zLGt(cgzI~+Sbm=qaWs8iy479HYrOxS{@-bRn-k~^Qh~#&?d4N~^1eFB%gW2Eyu4fR z;?JWuIiJo6uN3oR{a0+AU9KVoUh-}+$bk6FCXH$ zUghVr+kX%L^Se6V-(~6&6?K1o_QMY=Y;ND45iQj1yJbSe>OFz-va+&jH`h+8`TqBC z&5sTCwgE=+d!L`zF+WumSwQAU7jYyswLfqOXx;jhaRR2zT@_c@r?3;ICdsTjZ zdj0p!-PJJ-7b?rW)~GaJm$v^m!ToBE>#sMT*>CQ?zJ1b#%Iw|UsbV+WwAI7@o(nbF zA33#uf5nB@XOF!-y5h;zrxuzgUD7TlLS$<_?0&v#zH@)R---E)J&k6`N#Fl;(k7>A zs_^Qp8*RB)v^Ktq4E0}`t-s}aT1=ho&Qld3L6fFT`n;#|+e1l?xtE~wYRmoGepXw| zZJopuH)n3|wW4hw=56&_6B_K*wox~#cGmW9CnsjtS?@e$zxb%i>?tuSlIQzQXj!ek z+F-Jl38XiB$B%#dOaFWvQ+Qj@&HYEieFoo=|j{&VPx>!iX-K5CP*PkYt2 zX54D?-Lj3b(t7nP6|q>=jR~FGv`@IE9scrLKb-yV+?U61d1szmW!32#zV^?IM;|X< zTt4%!g|p_D@F nKkq$tcDW^ik~C4kA^Z<_?tzbCb?48X0cr4b^>bP0l+XkK>3Ly! literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00009.png new file mode 100644 index 0000000000000000000000000000000000000000..d14ee992b00da6fc50f942461237235debc74056 GIT binary patch literal 814 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 Hl+XkKrNx{I literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00002.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcc5654fc22fc672d5fd11de09e4e09a597614c GIT binary patch literal 977 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%)y>6jv*Cu z-rh0Hmrj*n|M1^bm6IbtDp5q!O?SgWzs$%96A~OeI{FVBI^tx{`=*A8ZAlGd8IyP9 z4X?K+vIJJ$TG6uOrQs1zz25VsS?t!|-ka|&FFLn=YW2In_lpaKfG#2*99uBs3ya!P zozv5Q?R48*seN+$-m~%LQET5HGh1obm6TWS8vO9p67>SkwW>cinU{S#w?ljKJO&?Q z?Gpm4Hoj_}y?$NopOddWCzjm08{M1sx&7X0J)69b|AQ3{TlR%|d%K$1)#!SDivH+w zXI7!oHI2A;cJsZDa0M;a3tPKJM@FpeYm%PEgsR%)tD0RY&pIQXhhFQM>B;qEPuDC% zW6#C|3|uU11(WTX%I`;?GB20%oOEtmd)sD@#-4X{@JI6^&cJG?tzkk;>mC7FvGEMVBJL9JJFi9T#=Qwl!_j$5;I^sL)iY+~Z{_G3y zjSgLOT~#^hAVYDrYxPBQF6pz+q9)z;{B-W?(O$R5ujZ=k{P-`(?*F5+D(%`Q^1i<* zoM&ToqS=0T`nU3JyXVfYtNGzQfBWj*xP5^ZkxF5`bHi3oPBHeBI-6Gc|6bjsB~jts z+^%8b=jI()eLDP7&F`tkzvsU$30>KwsS30+Y=Ys+vMsMdtYbsZm+mduwd}+lu@iyY z^iO}vh?$Za`AvHN)_wmDJ)Zk2$7jqKG=vq-_;j(^;hrFnlCq{nfpKQh)&xrez@#idGYt>cU4Ya{#&&A@A3WjzsFs> znYp#kI(ApYWYr{I!HuUjy%BNUICF`|wSMcU(A3Hsd!^o}H2wYjLgD+nce1%<|FX85 z|2~^I<@|{kE^CAjyR7N9OI)saE6{NJ>+c-@tG-y|gNls7hPxAy3y;%EIFlXouA#-6dqle`Fb8ux3c(hi*MfX`t;Ru u*#*gGKMVq=PTshq;o}W1LHr4N*@=2yrP9qV*B{OXDfD#pb6Mw<&;$T|b+5hv literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00003.png new file mode 100644 index 0000000000000000000000000000000000000000..af077e39294d72e1e842ac7a939614246076fed5 GIT binary patch literal 944 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%toFrjv*Cu z-rhNzCmkxm_MrUJa+VOY2LYzbq^tB}7`8XGxCp*lR(^nQqtjl-cTKF{8G~-Rtn={T zyr9uy<=56a_sflqcUx2}zS*2l>vKPO=HrRu_h08fQUN-J3~*;p)-~ZBoTahppXSEauS_5gO|G`tUzh3oEPG?j1)t1Xs)5 zbXq7Vni8}oD)L%r(k?fh2|gX6&TB-EWuzU^N}k$rRK$0s!r@gD-@cGwn-%H!V3Ll& zj72jAvwPU1SO5Gqd#%dJcYU+lzC2-5&nQbUAYCb;&NzZIhQ=&D&r7Vb%Wn0I zOLloJy3QmBw9hSM!fGw+sL502uDj%M-FtcVIo%^nmZ!g!#?J3uy=&d;!pHpEw%x1R zv#{^lk;(gBmP~cq71#b$M(=0I4rejbq^r{<{?FIxv)n3>J9YIQOaE6HQ{UM~oK274 zx=il*iyi0u>%S!5n7@1PpC5n!B^XuKZKy92TfM7#?zzh4-s0K+O!Shjmfl^vD$Ck) zYR=s9End>n-jA)LS|?vlstJ1j;QQyW4u)=L_Mz4Ji8nKfj_i6X{wB7gEatM) zl|R{kUSIsYBXpL?-nMfypM1T^{!??~DwU+O^VQteY%E-T$6m9_*U&JmGvc%Fky&>8 zdOsVvi!ExJl7G(JFmLPa{VG47a0S1Jd-lU1_-OaWUChbcti+_(hSrbzjMsACEm%wERwzi^hGBMx`H80R4DrbD+J3!Vu1Sa6 zM4grholsdAnt9pk+=dOZd3R?P=Devm_Rmi9lk9QheSIZ0^>*fcKo^k=I&v-wdpxbQ zyIQ%ntXf@Z8(Vw(+~(%%#m%$?uK|n;$=G4i+bN>UcLEh{@5Z zV!G^=e0BMDvvqvQ{@-KoWo^AZpI6T8`;MbU**T3a_F=W6f*-${n?JfYJzB8x$iKzs z-d()-@`GWu;K!Um;Uzz(DJP{WZ#PixjdDDdbakqBv(@}{oNP;_LKOmqRwu;G3RC#6 z*%hiJW_<0=d4&YY(n{7o2ur#YtOz##bketfAsQqp|)yOVAe~nC)cO% zwXm}6?&#S4ef#5gf8Ta=RQ!5U@qPaOYS-l*aZ`jgE^xXWHo?#3kDTDgS66SIn_pkD zT}f$OY<&OOvvq6h_slzbwU^)Ar7SP+$jJq}r@rcn3t4gX+AWp%ow-|Y+aG!Gf78C( zxkvZvZ#y<8Fz0`wdfl&$8~DCiv9q^cJRP1F-rm6~I!kP$+N82Ar!2f=qm9)J4&dd{6g*Ps6yQb~2-oESK&mHe? z|4Yzax7T#uyO;cjP4bqy=!tsTwXUri~5gN{qlT|`jcQ@~SytqNO_}>1_ zV(+INSso&FxNqOf-e>-=UoT(2+@4z8V5KB><%Ckw(#OE?TeT?s)f)S*gYl2O zuN~F$W*498eMGA_`sK$}FG3d^g>^>6OaVG>Q+Gt@V~9wk)rn(IHs6RkWFcnRW~3xW eM7lii|I~f)g6V9BW~bZ)Dfe{sb6Mw<&;$UWA(IjS literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00006.png new file mode 100644 index 0000000000000000000000000000000000000000..82293344b98aa9fd21d0a54fea6ddd8a7ba9badd GIT binary patch literal 920 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%u=2%jv*Cu z-rhc+eLGEp{loFs3om-X`3vo*uF2oXYLS^UuFTZBv!}^XuoU%BLJaw~!4gqSt2LpYZ(WQobwa zHl6K=(3Q)3|L)D3_$>GQl~-r|T6~c8{kabjuLVCk8rF#k_WB8|IBfmdjxi#oH*A7Q zSndDA)vL9&uPZ4%`ndS;*|KS}BKp}jc?VNXWj7w%`0Dccyd&=OWBNNfmit$|KAC+) zS8Q4bt7z7Gh188%xoa)1Je`$bAnxn3rgLMK&-ba?DP@A*Pakm2y2}!1xua>;Tm?1O z@Hu*7Av2z?RZG5aw@0@Af2o+D7;j`w@l1vIygM@ex>B1?xah1fn9lVn{k_hw!!4rn z_B$lsRv+Fv>3*G^*W)m+FG+gOj2yrHYPPVD)axmEr|Y`>#=qbCf4@%J-Vt}E737@% z?upi?uPG;~Dm^-QeY@Fu{jFijO8crStlx=zPk#HAy|AjR(Ej}HzZO;!F*pAGxS06; zY4_xni>B9$1hwB%zV_~%U%5$M`pxHocXsS3tgp0je5d297gN4JYTk~&G0U}8t1fB? za%-J=s$@I0Y|E)7bJtzjxo*0j_}1A~O+A}x=RLnDWq0EAvFy2iSJx>$+Aq7-D08`X z>AKfn*IdooD>;|>isO+cuHf(qU#?sJT{#bAQ<;eD+O_ih=JV}du03WMUsJ4YSMxvW zsp0<@ypMLgsQSC>YWLy4iE7riayiHMi@*Hs#a^0ilJvClo@{UZtyewPQ7e0YpDrxl zS=F@X9si>pJNzo|y*>V}d-BELyVuvp?VVG?7r+j5v5C~iONCO~gHkVQZ!I_JxSaHN zgI1WP?3J}IJ4_Apmfk+SD7^JjglbZtImmlDNmF|vB1=m)7<9c)THRQ9#j@?c^ARTe bsdL#^{_S(8@;+pm22RPIu6{1-oD!M<@Zg6L literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00007.png new file mode 100644 index 0000000000000000000000000000000000000000..1915fabcaf33f347134b172375e672365393c127 GIT binary patch literal 833 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uOou&P978JR zyuH2O?{tV7ev4@^sfUMg=%T*S?l zUBJF!C)YM%*7zgy-_P#zc~o)Y;lG+1VJ4s(CqqdJE3>^6;*NtJaY3sc|Ul$tMo`$^3~&Omrk7!d+qn`^uHHZ z*!WM{p_()?N?LGrPw0E|_?DkPPwT(^_byVus&~iHW|btz=9ys=HbzVpb$$yngH!0~ppua|Um_rphzHr=~#`?_@3 z-ADc>zh^i`Pcl96>seA{b;b#2RiLpc+9w{=h;-@3=3f&#_3KB1#PPK=UL4&!d7We1 zVk7sxb=w2v?Cm7Jt-7yRRrtRn;zGi*x9{fWZI5BKtBHy^yRIxbH%GTM$@i9pY#;kR@zi8u<{=pS$!31U{+PIVKNLT@toE~c+12a2_gCb! zr$U|y`hRZnE5Gfx_50qwoikN#O-A>s7n=lds57QK>EFa^5j zj#bjpQkm^Zr5Cl$%9P`!SFe$|v-Ft$+bM$CvpmCp8WeinF5S3lRa=OQPR50-Bdb=w wUKHMZD?&A?Fn`Nkjg?s*u19dCtA>()%&ym?!#xBU?}E~ur>mdKI;Vst0Q%chH~;_u literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00008.png new file mode 100644 index 0000000000000000000000000000000000000000..157a04a388646692d5a5fd9ae3d7501a8edfc36e GIT binary patch literal 876 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uOz%8h978JR zyuEWe?@ox!frtBxokds7+$O2mA*gVKJLPD1$Sb>`(9ZNzO1t$cxKy@PGDi5RWJo+= zQdBzkK=0Wk=T{#~gxJg5-bc^fX&HCp@%;X|oj_+$2V4sd3%$D5?#B7g%^ej6l@ z5;0r0g_&;B*?s<~^V+r6HQU4m<$aIM)?LHBr`&8;9Am|N-Ki0oVYdIb-M{@dH_uJ9 zu*O6u?r%_^TK?|ocP2%YB;GtSD>d}r&9a(5C(B%1Qlu|>-&5WmAzkjj=JwpjhrJ>y zSawbfmL5dh}iRM zXN=a~JMa9&#ni6dObGBf{_^LMk|=YfM~C13>izz3y7kuc-uhv!N1E8y-rqd$T*leS z=Sr65ovE7na#3;gCsd;R|Xsx>*g>QRot3}3DpM;CE>tA>S! z9{t+3E8g5!+B)>e;knOxE0rrNE256Q-n{zd;YZgmU$%dJjd7R4#svps>#9noMX#)U zIn_#k^^f#V>9aSzir3cK_~O8(&d}M>FF$|2wEEzkHNd#^1-fSKm)kpg3+>PQC+&=O r)4P}Y^TNt)gTe~DWM4f7Lj-n literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00009.png new file mode 100644 index 0000000000000000000000000000000000000000..27fb1fd5dbb511c48e13e1f0ee6c0685d162c51c GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uOjkTz978JR zyuI!3Cmbkq;NyJ;rA02{CWcYwM_2`g^B*|I%$Dep?mNI4Q^lnm(?p}X4=o^<(GJ&Q?cj$o|$eyS5OZe$VjQ2_r11Y@y(d7jy0cOKAisd z@4xyAj>u_W?Kt!<+-W$z-sMP6`W{)q<^R8zBwx*~jM2<;7@u;z90cL}u_(yal> z7uPQXWHc7 z{}VH7f6=#V`>t+neN?$-_Gjb5s7(Pj5z!s-$N$$Y&R+g{{q;$4J*(&C@60us-M{E_ z%(c_u-;)Xpceth}*XsB6oqFb;Q-AZmzOR1%&eSU^Vpk-7DcMeaml5h&zAGqpcU)2T zMx*cQ$)9ZcH+}qcceic5=dQ(}s&`*{mA2}!aaYmm8yCI4Zr=U%*Ml7=Hmp6{ zZ1FG9kMJ)Mcz0Z_xslzKgbWl>;47UA@Hx78^D}U9H07-bd L`njxgN@xNAf&E}$ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00010.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00010.png new file mode 100644 index 0000000000000000000000000000000000000000..5030b8cb2527194304bd117cad3b65acfb065d5b GIT binary patch literal 884 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uOy4|R978JR zyuD+XFYGD7_TYS^^P&y`kAlWc*JYiYzO%2}$EPUe(A2b_!&OD6EeFsY)CFQut94Fy&b6xCCnk7W-Mo7D z-Ms%!>{qj5pFB*=daL<6)iXX^pF8v7#5Q(q}vGYDH7dsgZH<4+IHm8E#f7k2M7i#{^zPo>XSiOjs`+yzC6$8fw$F{_qN>=^&QFUkU zemOzG+vjtnjP9q+Q;?qh_QnmFExA%g?_G3O7=GsZ^etGhy8XDIVBzce+7tipl@b)p zk9)VgP+PU?*M8nZa1&*iK`3r z2<~xNb2o3hMQ-`0nu@@BJB!^Prf&}G;SOFs_haVUn5EjOViziacFg$cT&1-(Bh*tn zc4cv>{!~4wm9mA?exBYWvn@X-*SDr9>f)+NVY`B!uZmk+!gE0csAa{U_%*A#!d~55 zoL%_)oYz~2P(v;<{#Iq4wVWT2)t9^n@yj`Kka_mmPVr`Nzj@!4 ulIq(&i(ZzImwN23e*Am}Gdx8ei22QC(JFt}dwM}QNYK;O&t;ucLK6U&>}6>H literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00000.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e81b07a7580ad6f824189244920e040e86e643 GIT binary patch literal 834 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49uOh-Ij978JR zyuD*vbjv}4?ZI82Q#%g3y2%_W&5~C+?vZ}!sl-l)yaS3BEIwSji+}kh9?X%*bnHIj z|HsDoOwBQ;6Go@^)kImd0IjA0co25fTmFEqm*(83l}SB`*G#(Cy|-O|eeQSpTk?l3 zl10ziI9SbpQ@K~}&u(Lfw%-LWnH#ddeZ0heVE?BG)9hIvK2%)adG~M4z8lv}3%egn zC|rM;8Es=z_v%i<)|%Q=`(k`*Y~D}nU}a64@cK(_^qOh)R_T*%syd@DU%a-WV5Q!* z>+I?o$3UYI~tm%BKA1VLQ>E42f z)Nc=Rg1p@CJ8=Mgmsu_S=|*tg+s|#0msSm2KsO^7f=2#cj%J>-#T$zajYQV%@dx=NKB9 z1XnxNU0mB6p}F4s{ew#P?5#DgOYWY3zFYETogKgC(xd!p<7X52_t$o-0dI~r0Ki_DoEVyyOf!n^V&U07){Tj~SUv7Kd3&H}qv5)y7lm>4AP#-CsRFXQXpZH}N6=;`X`vd$@?2>^xKT_pej literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00001.png new file mode 100644 index 0000000000000000000000000000000000000000..b7828b68f5ce538118e034c69062caa745657f38 GIT binary patch literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%wC=@jv*Cu z-rm`tcRNgk{lQ_2!esulO1@9R6kgm>^sp{}f5H626vO<9ri+*FacqAxSJ>WZ*Jp$oz5jOP0~k<*z?>9oqkWpWNHuEIXd+DE-U3aqrFNCHqp@IJQ*mc`y9q+STN% zliznuUKTP%sqc8`*POb-)jN)swOrwG-p3{xesy(6g|y(u$LE)S{Ios2{M*kjAJz2k z#p~iE(#XB69q){!105M=vxUy*Qb}R#75S_@^YS zJ9>92-?yGXCdVhbWlwkL{&}8=0-Nj{EOSfFl4VkvyE%j&WzP)$1)Vmy6q4T|FeXXpE zPKILA*PPUoRq^>xbRUPM99wmM`gGenIw=xHd|$V^o=Li@6!rJxbN%0YPVbWfnlG@i zYD3=1U8TYN^BFJoZ=SJ!;jf3wCqJECHQ(;uoY+14?Pk9(mJ^ITeZ^7+?3$Dnya}{uX-Ko;k(Z^=RfTxkGtOfurxhv;IJ#&Mk)AhnbF1y%qq@%i?5259t*wt zvRgb)_IKHrTWWc(M|6^|E`IQSf8C95=a(M)bH~x|isaO%$MoY?ME@0P0|v<6BWnXA zqc+@Nj$QMv?VZk3x%-oE^L0c>nz^p2+N+nhcJnXJgM1scuD*(XzEf)Zjd|${`F6R@ zt-6zS(RrAVS-jPm&7)0EaCO}E$6?)fB1)GRZ(V8D%^=ftC;eU9 lu8bAk)mLsl$4J}O-|gRBILu+`($fu+^K|udS?83{1OU$ZsJ{RJ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00002.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc2714d154e52a0f90dfbc3a05101beb6178aeb GIT binary patch literal 993 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%*mcEjv*Cu z-rm`tcRNgk{eko0wap7OV?v^on7&@pb8TFdEWX|0!onBVuAi8fe&XKs7ilT41oUG! zspKzkbP~Mb*}|qVVF{)XMIP=dQ@{Kci@*Iu^zZXme+nv=asXXKHdvwk@;6hN zT2F%@Y6fAG%QL$9&dYJXi{y{FjJdbZE8)6ZYUmAdD?Ke=m%sNnf?YLnY%pOf!#E3})tt)%n`$mvZc zTehUuM*m*+?)akJqJo<@F;7dL`syMt_mZ8DrhWZrrlxajtyc3z4W(z@kH6dR>yOX> zyR)}_c~b|gXvhSqYq^ozeg7U#Z@dz`EA{TamHhL;;uX7{uN?PvE}PCJ^!Z)DJw>lc zDwB?Od5XO{7i?44om_sddP&oi)6?wCZ1ZO)SEV!_xov*8OHf;$|MHeEduGSW9ns&; zE@=2Z!`7m+`sc?=SE*$$GpD7B-(9=u=j)!(iFFYQtdY}VkF3@?y{Tr-|IPZVD^wFM z?#MaE_Bi)nhe=A~nk?m49TD#}{rxxYEWY}sSG;T19!_V`sY~RwJYxQRUfUfJIqmEu zl}Z!)s*)-5x4#1_n3k_*))DGyn54VzZBpFrySo#CrdWTwGB^IrEyh=6Cc7WBConl_k8}!_GzZZx_$pw z0oCNFhD{B0eQ_o9ebMnfkGI(P-Aj!5ErmCQ-#b}<_|w!&Kl`g)K=S?Km}O{D&AmE1PZppfNCXEqp7>_lkgM61q<-G`+~>(15?B6Y zRN2k`8~wE+^4jg`PZW5++cwBmhzowtdS~C;A#W|mEge?=jQQCbg=~-HtIh3)9b*Ij z{`>m=q{aFAbNTB;x8JZAPO7=Ywqay&EFnqw(wnl`^V?sQ`LR%SjFsptNCuj+25Ma3SS?+?SA@E*q?t} zCCNZTM4s&v$QaXxY`HQEI)>g}%?V9u+n9s7>BsVSW4GgACszO>9bGF*i5uTghE{ zdB*Xz8Ir5l$lX;=I{Ky4|{8o(C?beA@iyZ;`9i^PgL6{Ho4~ zzUtWU|CPX(vZg6riz4<2Ufxx+Io!6|HtNdMzOYv&r#H#_9?uWHTzh=en|$S09TDye zwrhLb+PSLR>aorIV_fljCaiKQ(OSXICU*C3_dog9xC3VKt@rMcu z%eGD2k-EG3yUgiL``_NU{OreGd&#dCFS@PS5+}A@%18NUOTy`hsb!be^=y{f{-W*P z{HtNTR+)FQHcX6Iy8CLaQdsTY^~skEmBN<#Jq~N$w(*tM^H;lWX)#?8%{_l-s#SCl je_p_LIcB0#X35$5k6%wJ1^!rQ0#fhk>gTe~DWM4f{cDU) literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00004.png new file mode 100644 index 0000000000000000000000000000000000000000..de9045796d122a06c25091abb7db225856a3d588 GIT binary patch literal 992 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%t@Xujv*Cu z-rlhVnQ1i95m}!SngTpIq6mCw|{^Bu5VV^SzWI#Ust8?S@iv$pWVMVZ&e;$+m=;o zThyC+&*c{E+=j(RF?D=@sMcH$E?vdTr z`boY=);g~H`KWc*N&Uo%x{@zDGJk)K2(_Mf{g$Us`Fjb$>`Ljvz(muizlwY1Hm+N( z^YwJmv&jvgee4t~E^CGDjTLFVxH#GDQPvKRBeTS}OX&!&7VC}VhrcD<7H8OOb{7e;p6qSNrSWA+yJ?C%vEl&#=0()>O(i(|R6b(G3@! z7aR2RFU>yYS?4in%9r_b|Lzpno)B7X?y$~n@oW`)^~pQF-aZ;X`P=)AjE8=KRF@l{ zn6tES^^~5^zltZ+PkZ~~tmR3$vW>S)c1Kq_Ki8VcGhy;WgY)|O@Bcr#5ve3ra^qx& z>GqVr>#q6k?TgkvrnQ;f+R~w@`sA;0bkxOt0iFOnSF=SH60{jOPj*0o9wXK`cB&t`S*TU^)d+)+Bk+@@k-=08OqU=YkN zk=?JGWV%k*Q>Xm-1LbLcQgh9|snte4U$s{5%GXQzOxxste=}#f{xW9k)zHwHwl~gp zTov1Hb;ol})@sX`cDaoUF8jHyNvqY)+ZwGNwpL_g8qj^cQD2Y61ciSOSYN^`vu?X) i($r~EM5W*z>HnD;zuo!BC8U=P(%|Xp=d#Wzp$Py$Pom@i literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00006.png new file mode 100644 index 0000000000000000000000000000000000000000..996ed74ce7ea33fe7fb88223e9d72463c961defa GIT binary patch literal 895 zcmeAS@N?(olHy`uVBq!ia0vp^CxCbw2OE%_edo9&km4-xh%5%uj9~1qdgL0Ap;8qR zQQ};bnpl!w#K6EYv)JdPzgK91kG7|7P=T+vx38Wi8-rsN+qtYN(W49u%#5Bcjv*Cu z-rh0n7j~CmdyubN!yYR%H?xd&9^^mi9Ed|N6B%^WIm?%R0B+I?mhrSKQfiek?$DkO!_uPh32CS!Pkm=BrCq9TWVx z;&J@v%`d-vUH4bib=v&%yk)Of=_j}^?)b6u@#oKt>zm&nd9g~Lf$!$Q@CjvWtajN- z+5UOl&V9UQruk#fP}_gMp2rn(?~?h$&{?)dOX*a6pT5k8pZj;o?meQrNpPdW!w2ab z)k00XI;sT)A3sj2`Tpc=;4lN4m`{tWx$wmAQy_Z=m5L2e?(`L2Bw_N6Cu6?<)r>ycCc6xPdb5Ar)@ zq$Jk-_-Q=z-hJVmK2 zW_Af6vnXiVYRN^5G{Tsd-F=sQdFRes8?=FXH@U3&=DfY^NYpm<(5ru+9$)<9?@fQf zjWaG*eO8jw?~e~#;u(5&_Oi&cd8J?PFJIfWp?}Th2;a+V@{W{MS8iVKy@&Hg*}bdJ z*X7=52f01x)`r)|xN~>s9Gb9b5>V~sJ)J9p#a#=f1PgN<1U_Tm1!|fOFILs z9hQ99tiZV0Bh6ygM~mcSbH3VnS3jzJo8w_;x!zvhnhEF@O29FV?A^|xq0V2DJ>#ZT zy5wB@lVLU2hwrwW{^_XyD+R>Q?PBJw>+SG1o&Vm=uG+J+ zG%-2ZQfzN!WreQ(>9>>5`W13tGhM|fz-S;rS}!rl!J`R zI1&}H>E89;J(YL5Op~YHY+l#4kIi%Xn(v$PwASXC-qh^su#l7KpMS5<{=LobYwMrY zdmL$E+k0MN^|Uq7=0__{T#l@Y-IO=e>iNVDR^F)d3Yo1h*1YdLZ~@4)b~RitkQ!+w zZ;)9nyZYPP)x5O=8y7gf?wES7#9R5=nz_?c-_~{eGr5V}-h6-lS&zy{ztyW|#qYT; zTR(SOWXryibxEP2ruKrDzr9I`|ML6q`t>`aR%9$K+pJ@qWA)D}_eD3*%BuLYv!_2@ z+wntD>Crd&>7ToAOMCk>+5La5aPNJ6)UEGlPahV4|INPE;^vzgWED1(?*-w z=kiKz3_H4(ZSN7StGd6GfJz;e!*2OK4r`7}3XQ$3bErORg>dBwvn{Ggpe%zG6sYZE XNPE6G>*VhC86X9ou6{1-oD!Mvn($+XLm}ikxo)nruCtz1s66t;BYH<>jh9;c$OJ^n&D<+*=~wXsV@XqetMl6B$iXK2-u3Lw z?bG|Ft8D!*b>&swZw4+uA9tBn#Wcx4xj6n?x=N2 z+3K&3b2KrS61G|rDV6KjGX_cYmVlfldn(y9C2q+?(Qqk-X2Z9Q}zAf5}mxGPmjJW zDK4>ukY8|^>wr#vOB-SV!5aF<)d1`Z}MDypKB!*HGR2c;&%AqGycB4>OceCl&{^H z^mSR@le3S)bR<`wkuzEPGJC?KNnhQr`HJq24z0?xs=WNrU|;QjiFmvJ5#QH39%<6b zKCh7KeQoXRBzY6TjbeI{+kNKNf?Rh?a>)(FTiwM`m67s}ucW*Ux;WZyaj|t;Qa)dtRpB z?3UZ}A?3~Ti`h?iOjS8KStDa6r*EXyVjbbqs?4b04_X)fY&Ym>JM8vo+S7L?AdT7X zYm#Ecwx2pv?_6+IFKpwy{^$*TZpvYicUE2SSaa!aQZO(?1FD;zRN8gx>#tc}xcXK4 ro?}0znlkKO)XDu~TQ-(tm~j3tyB70fkEJXkzd_QTu6{1-oD!M8be_T*LM{=v`>yZDhH$)Z6Q7 zYqH|$Yc~p0PA|F7?lhSw74X4k={EIKo9>)u@N-{$t?*9I@qRfM zueJY$Y;G0aXYS~5blDU4@rQ}hyKgpP5d~MiGd!5^RcPa@jjx`hO1X4}pJwiO`S<;& z>wn%YEA&3H$h+2cjaHcG`}kwaKR<2x`Z&vK$DSS4p9{k8ED~1|OZiecA?{rL9skoJ zf)nFhWaghyx^yw{$Vr9J^)|A-tKMw!E$7}=$dP+bD{t>_gN*Lz!pcC^H80Or+>zQY z(|kcyklTpwp^e9pSvy#3U)HkklZ=Oe*dhVr95S{ku+I{=0 z&R_3y%gou#y|;Yhtt-2uH!dp{HN5TE<|?>-^2vAX$LpPes{NG0iceOxtACOcU42Hb zWbNwY39S|)vTJ6qD&JlNR4TZ6?&H_n`#(PY{C)X8(-0S(6E~{ZGIb*TLl11q>q>v3 zDVY6qQt9a{m3}~}jJb}lWEbr_-{}w^l|CUcFhq9Il%TDLue|o%@;5i!^v$FWR>`%3 ztLrYUmD~92tFw5v=jYiChZlK#zJ5M^$>ob0r*650=hjcYrE_TA+P6tlQzL5yUVr^_ z_}-UqIRekqH>-s$UL0!ft9ke7w*8*GyVa5$-Cpx-(z|ElvgWM*o(&s59(}Pj_l}pQ zu8ZSopBJ}ot=Z&xMN;hOEpGiQruv5ptY?-8ZPzJZo(+tL9NCSpN~7;&UH;SdU|Z~( zs=GbW7g~W~5q;;>3ze{!c^g5Bw!BkFjSTzvbYtn6N5S8|O?mq~i-FHooc+S@b)cMp b49echU$?#Hp`ubP0l+XkKXpeA6 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00000.png new file mode 100644 index 0000000000000000000000000000000000000000..49699770f3cf39cb3c12209ea41f8cd76dc3bc0b GIT binary patch literal 1037 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 Y%2nnaZPmW;BR?9DhfzKahmPj`0~SZaQ~&?~ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00003.png new file mode 100644 index 0000000000000000000000000000000000000000..a03d0fe602325ffa2a9036388aa07026d3bfb752 GIT binary patch literal 1437 zcmb`H_fyjc7{+5GL~RM+KpEczHE<%MQZUDXlobdGgg_Qy3y44>vPT0bm4X48VOEe( zhB73U(hv|?B@o#%!w_hpD6ulaUP{yc2fgci_q?C?m*>6b-XGp1dpoquDWy{&5J(1N zjUq_+TB6(&(vn{AR-h=s$slW|PzjIyE4&(iTrwaSBx;yNh>vGjUS?iZakJ8 zWUGnMCIsPZY;Zan(jYU2^Z<=8GPUZN~KHe`-_(Og9py#&f01G z?|E-p&g(E2+$UUQT@BiU1B1+5Ov#N zA7oY?K5iZ72wDZ+Mmdr||6|?SZU(K^d9n(v8E2yW3^5}cEqRb|_{ZpD&?IiXaL@=y zEnBnd`PE6mdtxBm=jT-^5L6N1FVyp!RuIoh9j;*kz<8*djb=SxQBE3*$$e6oW_5ot z(pHd{$FDK|DLyI@GrTyhOs^SYAa=R8nwhs!n|OyRAEm%$=+7+kCzbKpyqygPqV7VnNCDe@ir z9h56=;h8kZWWAS?x4!M^oj@hyLG18%s$S;+M8r*TX*y*8!-20Ax%E$he`I)Pt<+6&=>pX3yRc z^DAEDd3)VDQj&|B#Jby75*Aq?+LCo#Q5(TLE+WrC($W0&hS=|s2SB6qsCXfl)JNi` z6Q*fl$;`1A57Cv>RJ$RwFY1>oAcJ)*eRj>^$Y?B)zT6nSd<`>eZJC|SE+q#?64S`@ zF*O5{J2!O%h8BFozrn$B5=;+r}o+8mWbI?j8k$cKGFx+KlQA!6%LxL?j31d#9Xqdv-BFc5T_N zGM?If!7W{2ML=SR!bP_Lgilxg{5@T3!w!)D(`jqs6hz}*C1)2$`*;D&U$~v%C8RYN z9$E2~Ot9K|)h2V=2n-%#8$ z2;*tZ#J#pASbBd*?Q3;^T6SdO;RbSi{-{y>T-146@+C?n#W7elY>>t;9+uj9|ih!k3Y9)Xgz{ZAJg_!Fw@T8 z(xP1V@+WFbV|*{D2IDxpbRGdI683okXQi3XL|VBX%HB^q5PJmHyN$8#M}eQAu?`m9 zFZKeoSmeAUr{|wMQz(-Pi4(OqOehix=5up4@tc6n z+!AbZ|KVjymJ(2mj)om1+$m_O@Z>s+S|@GUD)3$--Uq6<)gem#cI|c=b8#|Ahf**_ zS>2hLnSD8oeT-pTq_cbTQNy852aPFv_9!it5~R@*?k_-$o>nD*|NA5Q-FV&PBvAb7 Te7?e&f7}>LI~2$K=7YZhGG%*} literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00004.png new file mode 100644 index 0000000000000000000000000000000000000000..e585fb4e80e69c7825b358ab3433735593ae5b6b GIT binary patch literal 1572 zcmbu9`#Tc~7{`}#Nhd`tOlyxehH6akn;+*JWGpUudWDbVI z<}%ELQEe_Gx5_-Z%w;Zf8As>ng6gdEFZ4do_x-%j`@{RbKfLct_4Rh$scozc004Gk z+)!8*J5_qDrJ?e#py#;CaEfBC?~QdIz@_!DAJMTcC7jf@5Ww3soT5+8S5 zl&2Nu5H`xo!^7*ag$BTxqR|^pF=zt-)JrfZXaB@!$}yiv&}ozQ)zBq}%BhQot@Q$0 zw?e&zsg~tQ`c(y@0FicJbi!rVw14@lE!lW|UtK-Ot^1a}ojR77Vqg0LqCHq= zqa!#;St+LsE!=RzvU#;1Nt~}rM;0>xCxBxf(Vf-da$+G2X>=ki!{1o|WeU+4Z_6Tn4QAuxzW^DzDh({JI`<=PhVb7B_Q z2s4nfGDg;uHS)gO$gU*`-ZG5@3TN6}hHt06WFDL+Cb0av}w!bnL6w2#R!r?#;+`*9)ug`|5+?&kKLM6#pnX#2ZOtv7_`m7cSadQ}=}+`oCm&3FDTtsdEWg z8tWVI1q<-#{(S{BS0UZHz1^?NFqjn%rBlIdXb>>n8f}!JRcrQnmNFjD^A|pM^I3Id zgu}_>CtTL9gqj-_L`Q-!<6^@zMoBDFi{0I0ce!`W^G6PML0ogE;7?TBiL{*Vy?u!v zsEnUo9D}dHO%!u?2izYHfpGjj&lF)_+J@%(hYZE?D;^=ca$B!rz-$=K%2BVmB91P4 z*TSa&^Jmj6hCazdj|StSJ;NS7l>&7+Q7CQ!(iG1koEBR?$VpC+t-N>|KR0oFZ*HT$ zkB-h#^;}|NA~!EB7*lkeGcM2;O)sL8CM!T2lBeZ;Kkii?+|^u0Bj1ny0_I(2-Iosc z8@|n9XF}YZ5dVrM$pO{_K2yXS!UXwakfbDe46b|CmP~})b4=JYh;z}gSsEziTii=k zrO2+l(Rj|7>~ZWFM$7kl!J0@Y6YonUjUv(I?WKH>PZVU?zmn|@q_>5y@uVt+5yRj|;t{=L>Nz|r6nmf>0Cm+WM; zCC0T*KY6>TW7XQ4#!pQrbme^S7%s3jGxgxqmE5& ty%b?z$)<5D#L5=598^U3$;W5@!3h#jDB%C{Z2d*w>R_N_h#NX@4a~$XMMf2HH|a@0Dv~!+a0CC zS1K-0S5rx*OlYVAjX3W>q6#ISqIMk#g_~?SxibEoW2e^s0ItmZz3+DNCcMM z(DG`d7oMU2H3;8(|54?mHiK^aK#PqUvqxX}Ov1v(rbmm5w$OuOI6rEALF}dc zae$+nTlKh@!O6Kd_i~Yqqtw~JS=^R~3|%3(DR85xS%Wa!aVBM@C${ha1Nh-dJiGT% zVG($0xq7l0N>WO)Qq$V>(gI1(p3lwMxti?HrZVm-QYfg11`H2uTW2-uMAFgxCmo~FW`}DnxOzYjKKQf|qaqs$g&a8^HRQMjZ#6&I zFL{XgSWNx%?l;^VG{ZQvB*huG$7)+PLj1MF5xm|eyAowdn8mCm>GQTVBd2OLXt2-d z^lCIFq&?NL%QNrg^F4m~h>XR{^i~K*oIXmP$S#2lYq-lqdo83Ll~Y$LlR$)?cT@=+ z#lM>2Mt_}a`~nw2L(O!K$xBO#vs>Yw%gW|LR$7ekP-98h&Ft`rU_PyXW1!TOa12W* z^Tlf|lp-~6XHpqG9p(P@Sd0BFY;#_S)_lEoM@^ht+)VF~PrBe6r_M1eTQSY#f>qB;Zhuo{rJPuRjSUnP88XsB{E$kFvYRHN(l*cV;ZK}Xd}1N5*i zP?uakpI>cNR`{;gLZ-Y6DUwjpF%XWQn`g;R-tyk$bXu|WM(M4J1XU8~`dHYz#dTv- z)Crc6hAC^a!tX`{%D=B~R!0vgY+;&r8Z1u05*xALw=13a9L(3cCd`Wk;4T46KM0jD z9;RE_w6!j$=K;_;5oaOo^(?G%P|u7mNm89_?b+%#c)n0z?oDYmuI!c{DSRve!Dr7O zFW0)ekhiXyg^l%{Ol3iUWMJu;bg1E6!ZA-M2?8skN_Mlw?$!`QPyaM-cq9)P+-O%( zk?iu8&#JPPj2e9Vm&iZX=JLqtO{;u3)=?o0bV(t6miCVqwi#h^=)vsekfqc*?uqDj z?eiZyxdN=q(15zxpYhc|WY;E_AIjw{NVcv*e(4D?c(k2`0B2mh+; zNWq+=(v-PYmYhyx5=X2?Rvovmcn#8Eac9I2$m{P7;8Mj6o3%PFeZF-`xuPsq59V~p ziTvD(+a~Qk%c++tk??*X-Kr=cT=ShU@zVFas)EiN+C@W?hcCK|sT|WB`+ZLrVjbS| iw0`zG{x9wy-4(OE>E~J3k5VY#4R8-%_u5mTxBdft66v7; literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00006.png new file mode 100644 index 0000000000000000000000000000000000000000..8b153dce909542c323f8d862bfa45d27b9eb44db GIT binary patch literal 1467 zcmb_c{W}u~9G{aVl9a2wW#^{z?r}Sfye1uc@vuzb<9%Z1B~!Ca2~S6H%iUja&wZcg^Zk5(_&lHQ=lTBd&GGm3($dh^00015 zFmF$^lDm~CRtGA3*_2RENqY$1XA+gHvI9TUt}*2RCIK+Of_c`|@hE}!y?H#lu5_;6v^T}E&H#?Uc_ zIs^E%2BnR1_)d?ZdEm*7w%oQnCA9bboNbn4rGvcf9k45+r5~GP;sh%sIgpZFxZ`F0 z#&ZLbO-I_eLeVUhIdAooOqHSjV+AeJ_^Qk7`^!OK22RXUK+Bw3rj7H2Zyr0*i|r(s zdT6MPE&O)=RW?2k=Hl+0Pocj&CYV;4p-TGp9uVimlaG~Jmqb>MB)jRtuRni!Z?K-z zY}vH1;_<$*bv$N&%a47fD(F?J99p(5e5llY?tCIKmfUa+!@7kuW8t{;s3SU>-ZM(G zfurjsVz$8A2}Ao0&E$#QeAa|%k3LEQ3LaqCzXZmQom=mAxB%=PUPO@BqkK;PSyHtm z;Fx_?b08k(w#0$=@t zf>(ftsg41f1n)Ug*%53X8$p~cD@CVP zQ`$vaamxVS~8`#vE z!M0lkV0*4_FtShGlp#U$uXC|E>B8C{1x{dk&UgzvFjA*kK$bI;lHLLxH zESPZut|sR!aK(zdumZ7B1J=^ATpwf({Xw8;(x0ftvndrV>}xwR)o6Zd?RZ*wmRH*8`2yg0B=!Iyet6VUp8R zoEKi~qqj?iRPEU8+(7D?SWg4|_c)b3<-B1g6^MEN>YX3>-BK^o)XfD|P}MuH$H?d% z=^%P75AYYAX&(O|Ar}Ja&c5!!r=q4dU_;etj6&wk{dk^4p^)$<7_Rc#XwTZ*$t9w2-iC<> z7gi0L`XDyE(XKIfL#ZaX=yHhan?u)|23dI``r-n3AqweRQBr8fpHp#r#_0Oo_4TX% b4^_1dfUjrR?pM2+^wkY^+Sjwr<6OqyA`XSy literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00007.png new file mode 100644 index 0000000000000000000000000000000000000000..aab3b6044ae3d48a28224bc878ee87cb3d83a3eb GIT binary patch literal 1434 zcmbtU`CAeO7^Y*2nr_N0Q&NX`LB}$6p*Et_0IwuOl<**}2C0Z=YP#9d5S4}pp0%{5 zNNT9r3!bs`M&349``(^t!bzU006Wx zXlI;CB`W3v)l{|kMdwbHXwcDqQ7YZ^553GqL#hUvfG0*DWrPMtM=$^YU}2QI)C=oF zcZXy4;OHK1ZXSEB)c~jjwI|dBeK7#=6&T};!pE1$UwF}sj)6NC&X_%n-2=+SQr+Wz z`d!Xj(i=|46-}_V$nS6ilzWvn%DoJ!`S1gLdOprw!?oh+VXU>9)K-uyfiUzsl^;#z z2@MZ9p(9zAe1-b9^1)X9p?O8$<9Vzq+J8p;SQAV33+uRYt?b5;E^?1+vn*k3bxT~& z$&Wf{&i=R6ErAFi0eT^i;VU+%N4%elm*I^A|LD5Ol5J`W^~7KK6P+Z>y8+(H^PbJ= zeXIH5gS0%QA_~7-U0AVJ-1E{u>z>_I$vac?SH9%|>&O5HJ1jYn{In-xpQUlqy6i)q zJVl4F@&laHkxi0VK(>FM3etz(GXBJtVcz8L;-|UrC^Ji^kjtO5in5MkaA(#lt*tYC zMDTlksPI?h!BP?lw%h_OwF`F

H#9YhUKH)|&csA_#FbJBmKUd3VrOOBh;G1Fm3_ z+9^H)TeF=QSy1k55BpO@_Vh&|6WBUB-vj*j)6VOCmmNcxy%n~M1<>09CCDwN4YkM$q!ri6m zc3-AcNX+HzcU>Uboudf;T1dP!az9{o{3g=^aSu!wC4Mp^2wgJzlj zpBjTHkrHFSj0u7}9IOpjM+qiZFC{w~e)GgaWV6DO&eh0%^W zF5aElB#uQk?q_GwX4efXPY{1zL-^b#hSYD+uX)W#ToqZ4Z+#gKo)y>EOk!#S4ToqR zx@R0D1uW2sVLx#`Zwz*IIt+VJK%KW5R9LZ1=I35Vl+x!8f>;vZ#wHKwPd1$-7x@Ts za|T!e923`Cp++01EVucPG5-;@6EQQwy|1HO9Gy7WN25#Z4`D~jh@tGX?^Z7p+kl09 z)5fp4rx%x%Nt8qb;f(>^s^%}`Sm3D!Di+a)a_TjD@FUD#7*{piENHAWqOq9rF?mg_ z0~u3cavc)jvE$!c0_)dJA9*%9Ws1Jgvg@YuQi*>p8;Vi%#us&)vzO!@*JG*b96bRn z1NR1R8*&Y_Yx0(EcQ#JtWqfF^)IU+q@HCl&vPCJBfL=-Ok(Uq z@K!JLHFN7_xRW5BOjX1nfo3BMQ|O#kXHn{b^%)JwkSK7Rqe!uyd61wETvc#go4<4- zQf!;rODauwjQ^H-9@5+G*416mJ#5%(gYmL<9i|Hp-0-lhVXgL`{c08h0%dH6idI zwG1=^mB>KBwYCy09kobIO|vA-$YazH@?7j+=*_(My`R2$@B7}oYllOEz(9K-0001^ zkZ^(tpPRDK(%e*U4zzAE!D=eNf%vi$-HT-OK_0bn{LM9ijjL%(kH5{zp0)bfY$Fj_0h| zBSu?3dLA77HHSFT~wCzQgW?;Dd3ICR# z!d;}9zYK6R(0C!f#@+#kI?B42PvBU9$sEZ=;dClf?5>%=(bLat8-muxR{Y_ze}x>_ z8ktSPl8IP0tu}6CrXyU9C1VbQd2%yUnZ1}5)5c@CN;7@ajfV(&cUo|QptR4Vz}l|# zci1;e{#Z6ka#SJ~;K}j2i7+~qk5eKuV9RmNn)zEOLjO!}lUlLA3g5_VuQk)W?{GMi z7M-NeJL3JjKpEA=xUkde`fU6B*BqCq&qW8g*9yAt*@BSBw-=x}f^c<9#r+2+Z)*6} zBdz@iPlM-hM!=uR7WF~Lo6<5j4Ae-4Mb?7vygA!HgW%JMI)r>ln>MDu zniq)rVAPJ)NvADX{N}Rlv(f&9r)&9&j%!Tt6K;&IPEj4Irm+PWww}Y9m+?4CXF0$Y zl+8?OnX{>y1ZTbdE)Q!1T%;R0b7O~AkVkw%Y4rg%k%B@B-X_;Qv}+bHdSBt&AWHWJ z`zsR&lW~b3fy3NKK77$**(t;PFjAE7p(zG(7!-)kbOE`$!G<6;)EJ^~Y?y=}6Rek7 z>v3Y=zz|Y}^QmnISBy_T7uc}D&b!l?{&BepFNowHL&sUWqL%chPJR*jX&#pjs!z9T zi9EbU#DRbZYst=q4wWVzN%QG^T%YhjPJe<-Oi+FKw)j5cYz^&Kf8K7n!^&2@_a3OD z!(^mBzhzq39lvub7IbmEKnZj6u>iRW|JF=v#@RK&L0YjxL*Z$NezKFvpKH%EAF^=? zuPBi+LVNlpVZIrvZ6bHARaI`LtXY~&sHJHN9bVXn9CPZriurF#iUoP1Y2|G_1q{!wl?1D5Ce*?JOuFIfm4;`PoGDTUTLIsAv>kfrw{ttmd Bjwb*B literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00009.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8766642c2c91bd1f8280a674a319aa053eca93 GIT binary patch literal 1526 zcmbu9>pR;A6vxv(rNnflZmmnvq-!Ka)h(_=T;dW%1VuH}5Nq9kh)SN#rKwA-Y2u-( zRH}-EkSdx*JIj!o43${hu)59W7V26pUAljv=Xt*8b6%YDJ?GWAc>&|83O)e_fk3Kg zFI1qM19FusDavz|wEwsq%E?|~X>uO;U;a>mL|#CM*wA#h)L49aQYr|fRGH>0^!E-< z_JyO*1}6LY`1qN^6hSUTMG=9h`5OqNkcCFMV6*NnOZ}5{-Szs`;+Dp&Q7ANF-E%SA zr@)r(Ve>{#(yLn(KlS~50d;wb z!xLpW0+OnX=?dBWC_9sHUv6=dNXkkIZdB9m}XoaRku*cB;&cQc^_}gBy5hKj9cuOCg{B7I;g?@=*Bp_M_O@cc2{l#>#!^YS}?LG zjF~6{H2=tH)vb>ZhH91p4mJmC3RVp3Y3O5o*OyHCpuJFO2SFAbG`)P^^XT}peQfSW zwE5O<8w)s$v)BhSlK7I?C%WTrB1qyZqq~m;hyL=N&zLD+q{6X*N{14Wxnm_Ow^ zO-lLILAiTj_D-F;&4mFbLlngwM1&xfIfjp`?IVTWY|_{x56laiy8M1UW0j!08dgVP zz;Gi-^Wc^D#>-6BDgPtaG;F-%~f94~T6#qasy$ce3KTKm5lkK0nC)&!`{w?fi{y@&Ao`D?cs@ zT%Xe+J}qUjp`wZ#Z|jHT^4mP(H=8oB6MnrJv)aoJ0My+NXMb-SxY9c5c!I;UD|vyW1OS@6HRn6m+ORYv22H zIfY|?-rGqVup}RT$6#=ZZJy&H|3`b$CvAGI=C<3QPk zgzDKlS{r$79K8A#ANEr1-*-gSZKZjB@9S>;=ezjowq4X%w^pwG_;nRS2Ll5ou?a~J zBvt0vzNxQTFSY$m#8quCUCZFW>iYFdd%p^M2EBb+8N5E7_q~@aLlT>u0>AwF7Z;mL zr^>ibV(X0#T=PnFY0mDc;lKXv*6^%kzkS=fd5?vF`w^xf9-HQtH!~N{-*HttOjoyb z(G>l+@5>iWk)LyWy8h3gwNgj4?tf41@$3nG_|y9MhFz`uo)|gE*~N9<3h#)1x$#tq zt7i1Hh|nopu1IcKlebXcMMvT20pk;k*r zSajKxNg^)h)?r_@boBNZhsM;Dd+n<+_5ZVCMnsX!x4efz&iW#9Ir-I-%2Zaq*|mMU z+1@3+9rqHKZc=t-cK%p)vQUV-`>6S`FDKKtt9btZ^H6mAHE9vyiIRfc9uuP%8uUbc zE8ctL(S*I5M2@bN(2wB-#?rzk7MtgmZBY<#Te;)r(R0yz?)e_yp;&bDU0%=54MkHI zPRcvJP~+8&Lhnmc7l$a7ZGX(w5#iAFe@VcMCE<<++kEd{h`!7{vUf&v>e8 z73-zNQ*<|;;7D-<##7G~o}}oAIaij?-+%RM&BwRbW7o-li&?m7V^pj5>8I<|_I`6e z%2iW4_j{l5%nH|s-0Rn#ov!QocYT21`V0EN)T6ZBTKm@42}{aumI~M3?+YsKp1ewC zzW1bM>OIf8?>^rC?@!ErTgz!GrdcOj_v;u-O*nc%d7A9fH$P0`WxQn+w(d2y{i|sk zcC&dwxb%sp4%Q_SKa@>h+itKjpF3~*lHK3CTKlIhZ{8akR`_Ad)7KBS$d=};xomBn z_crX@m)B7O8~gfi-MjVbWA{04mv9cDjT5HF{EOQ3$MM*sYq_59JuiLwD_Q%sbm!|i zA9s}Iue0X0yPfgkc0S*s_N|A#o}Rb4$1k9i#HhJ0SM+q=^w{r@dZp^tl*hK;%lK(! z!5g+EO|9qOEV=0=hLe_l?d)i^iMg#6w&ty5vejyTzxC3lDpC9Fi(fJ%igH&H@+#mEU{U-exG@ITJ~jQuC)Ch z&t0FfWZT{4r*AokDesaY293uK0; LtDnm{r-UW|06uJr literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00011.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00011.png new file mode 100644 index 0000000000000000000000000000000000000000..365960043caf8bff9c775909fd1ce97d0a535527 GIT binary patch literal 1375 zcmb7E`&SYM6vm}emNpE0V;!^?pl3F<$d0ChDLzsYhG9M^&9qS<0^+NAmJd|Q0B5Fl zCYj1Za+PM~%=tj)%B0j%nZ-jBG~LX6QltF^+db#I-~Hj<@B4nbMd4w`%+2h~004k_ zP#`+ezObT1fwK zEbd|mBFH83VrX!1sOx@HfG^ARSqcl%0{|Gm4MO`yF{|b#+{oj28{ooxKV1`IVrP5R z30mvV8A7N{q2D^YgzxpgWHG~YGOqSg+u2fov}oD!?CV z`NbMzr=HZ$56+jB7{dI|dLz2_o&}s5o>|g<^tkB=m88e5e11h<>#SP*{=FZIw_r~S19m_Ci~f0o;D?jKyTEM4dt?E z7qXVpt^L4iuAPlTfoeM51u$~G$Wt^63pr>LL>=6k61cNc1h8(CtBA#KeXK>Dde~-P`w~^@?hVyF4_r z1cQ~A5>54W831vhWU?E&1yS@lA=n6%sT04emIMM|&GRQLQrUI`B& zgHc4T_&Tr(`$ZMpCahFfEn4sGkL|dL9sgsN?8~p)^Tk4@GNtJD;Gs0Zdh&GASKFpX zqIhh%Q7)ZDb4TF$j}jgd-G8wKA%-{Xxwvyfgx⪚$Dc_5DerNjj`etNNr-&w4B%w z{8jco97LqGvSN&#dz|eGD{awzU^OX7WJXIklgeaz+RZPmS661Eyu7@BWmi-=Xejlg zq8P%)TUl7v_-jreD0hSY_kxs5`OUJmVmt{g#+BV6$mLrv3mR}a(q~Z)a7KAAC3UR9 zzGZa2K4M3_baLlGWBSbta$(dl?q-i6_BXgf>#d1 zMjW;lKkt^fg7J;SuaWGkl*8d|aQstfUA{`>%ZVwO{4UravE{&YPZ4)CdTt(#4vD)R zORtQ4$gU{C6$dmjE`$kQwpE@@0C}f%z($TlV8u!+7icrN>);$%^0uEDp^jR=l>a&+ zg;YjS3c6CxrdMOmcN?#+YCatq63L@@aC@0B+S=2vTIxjVWS>Wy>`!eyp*eL~L*`pR zbaH0iEnbTBO6AEn#CMswthTt-PX*k8m1!-@6*=~^r8HTagAr3DHZ`=&_)Vgh%sjQ+ z=x}OGBDjvuAeK2PC$sdzG><+Cs*jRU<^-eO;+@w1V4i;5->oQF`wWIhVY3glmH7CW z!(htw_G;!GeTFk@dCDEDko-=-G1B;jm=nuLQV~u(D&H=xfuw$1)8Fs{0=v9`PPGbh z&%1(lKCC5QRSUk~g7w*$qq7x2;^;USl|4Fl8!v*C$yY2oGvIbeQllWLW)l@oE}eJC zTGa{uQpQKO5pmY77B$eHR3nW#F@gWIgs|wmk5cSG$moV&(JAq-H5kr7f=SzDyCm*4y2iiqE`QcTe3`{OWljUnGN!7ZSws zlU8P_y*&$jpGdV zH|zb!J^y(uz9fJDS9ABZ0zGuI{tZ;LCozAaneVMd^83z;dezZu=o@@JC zZl7`UVIIEX!_Ak@>OE}*GL0?P{N#<_bu;+=-HGBr9#H=?vpM(PoZxPk1nRx<(!A#V z*}gp>L)hBq<{j?eb`z%VmHD3+vt=tE8i0&kop(6;;NjlyyctgKOX|xDk-zA;_%%!MsYyL0qyECzjHS37}R-B z+IHW3{Ryh-==TqAc7BDMSDW+W*8lBpme4RTH=hml@tgVYAKu(Ndv6ca!+J~KnEtuF gUBtZF6>3LZ#QeEkp?}{L0i%k+)78&qol`;+0Px-70RR91 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf_attack/1.png b/PyGame/assets/graphics/particles/leaf_attack/1.png new file mode 100644 index 0000000000000000000000000000000000000000..2cfe1a599926ff12f09d8ed9398885f07e56c438 GIT binary patch literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^F+iNa!3HEJgp2k8Db50q$YKTtZeb8+WSBKaf`Nf? zi>HfYNX4ADcNP7PI7qk`dRee^1veZ|I@tJFtePorW1gy1w{rnE&z(gPzjBQxC#Jo1i!lv-z;u{)by<&;5N*w(=p6 z$HRB~PTS?#Fi!N}w)1;$PK26sHMb%kA@!&2`#!kT(cB-G%&b2hN@Q!7l)3h|?fBVy zw*P(V{(YSL@Apn~xWwJI=VsQ+x1a6XQ!wKoQ0>`$53}#TIl&FolvW_I59pG=oA%GK zK{9x9{*P-2{WXX0zA@1Uss-x4D*Y~P`bUV3VS66tmB~USZt|9Iz72EApV}R>=RRu% zdd%43O~zsG{pGuFrb2D!z25&l&kSmN#JAY4*>|Twy}I~+w*392J8tGeL*+N?fx?9) UQS;9(2SzG`r>mdKI;Vst0D`>oj{pDw literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf_attack/2.png b/PyGame/assets/graphics/particles/leaf_attack/2.png new file mode 100644 index 0000000000000000000000000000000000000000..19eabbd810dc36340aafce631d2811315589cc87 GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^F+iNa!3HEJgp2k8Db50q$YKTtZeb8+WSBKaf`Nf? znx~6nNX4ADcNP7T6D8U%zHHghc5nkX3tzWeU$Xd`hS&!aGIaP3>KSZkGnBnMzh!n? zQJ#KnU$&Ri=O?FUOEV>Ijay%T^r!82b_)~M<6M2BGTIhl1#2Ee9NgHHOdWx~Xa5+A zt$$Z<{kZ+T{&)V>@Bh@rg6+6*F!#rfo95Tw&)>KIweR~wU>oc1wDn8dNSQ~!hVaGq zKMX#9_4hJvu;ZfdwCU$=c8BV}mk-o0K7IY+aGAsYpG%>lZ=~(Metz9Qd+*%m+v}y* zpZ9-u_m3XfTRBVruRZgn_-meT?zgvh=l5R!oA;1E80cGx`yVc@n}7H_!f2o&skfhh zTYmhq|NZN;ZC^ng^R4c%d+_RKus)^-d6b(Pk^Bd-PzxJN2@(vhn44$rj JF6*2UngD|(-)H~; literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf_attack/3.png b/PyGame/assets/graphics/particles/leaf_attack/3.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c453f1e99c3b2d31418a81ea16681fa3c5ba10 GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^F+iNa!3HEJgp2k8Db50q$YKTtZeb8+WSBKaf`Nf? zlBbJfNX4ADw-xi40!7>s+e~7aXS`zy4DVidWFvRjh1e^hVb`yPmWWG4FsEH8W}W-gBvKSlMSK2$QJo|3ztGE02 z%g>KJ`@P%dA=oJI?GFn#^Zzcs{C)l2m-7l{986?uFTFWGDSPkB{P(L5mcCq8eF!Kd zDKo9^@Z$gbU`m$$)?2!5{^ityzkBL(e*K3UHv4be^t_UqT1|h5OVjp0ym&+H`n@+N zgu#yAu>1Ch{lETINyYr0on{0w^;sMHR&(o5Enwg2{B1k_J0Nb`@!9qA=2o91=g%|* znzNxqI&Rm^wdPel>N05{2flpIFJFDF?$y~om>>2(yjcNpC0GH-U>uC_58DC`<^Hl~ Q21Xf!r>mdKI;Vst07B>2xBvhE literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf_attack/4.png b/PyGame/assets/graphics/particles/leaf_attack/4.png new file mode 100644 index 0000000000000000000000000000000000000000..d26d38e3ea9fe0b74fac03f4c93fa4b5676f5dd5 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^F+iNa!3HEJgp2k8Db50q$YKTtZeb8+WSBKaf`Ngt z%hSa%q+-t7TZ(?njuH)lUL5HRhjj%kbfh{Ti_K|>elQ_Jhwq@SK>?f3#h#4IDZk4a z-|t-JyZfinPve>Avi8QwAF-VCoAKZ5rexORTz#T4+7@92YaT=#+=xR!_UvDV+jH*6 zy#E^iZu{}&SMB!KU*Q7ljK0GopZ@LcTlK$tYtMfP1DkUr>)q)&!ROyx?_b~hK7Ni| z{+~amKi}-X9t=|;G5=xJeA`=QkKN%yHy)h}a{JD&Ze9ED)2mv4f1_TgS&!0wSZpr8 z`@Qe?pQUGE7Cbt4c)4BuJ+sTlH%|(D{&0T`$mN^gAO3oGU+%8ypN@+FePs6AF6MGM ur~6un&+5$&KfeZXGa=s+4iA`$8|H_j0-ux%9&ZOm6@#a%pUXO@geCxrhuG!- literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/leaf_attack/5.png b/PyGame/assets/graphics/particles/leaf_attack/5.png new file mode 100644 index 0000000000000000000000000000000000000000..73c1f4f39b064eaf3b19913a57bc83b0e775a6bc GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^F+iNa!3HEJgp2k8Db50q$YKTtZeb8+WSBKaf`Ngt zz|+Msq+-t7TMK=UBrvokdPy)H6|2yZ>P+TVOW?laX(HC1z|C`}L37ruWtz2IJHHoB zkD2xC?ELqWzO@y~_&=KSu9o@uvIh|dH#Q}+9_Q*4mC?2cD_Da=AietjfjOsd&-T4v zv|n~!o9=r1tDIm>(%=3mU%2CT|9-9Bu6wVKUtjcozfJs~AA7zoD?bD_`A3_-dG+hw zxUAQ{?_0n&`F*}o0k0dhu!{Rnm%4@O_?%e}j1UG- LS3j3^P6C@+@rG5VSN8#MVZSe{BMP#%s!V1Wfxc~jne6A@ zk6HgU^wRCemvdH?&-4-o>oU9j?D(9==l1QXihuoc`t!}Lum5kjJR5AbVHKZz`M0}o zpC9^rz5nU?|HtRrW*q`ssCM_^>hf>br`Z2jH+=|pg!J8quiw4tzWjLU_wt8#VCr7f zYd$_F_x8~_IjFMzw;rxOcX#z2`#Cx>?-9b2=N&#SYkR95Zh_ga+=mr<_m9i&g*tQF n)%SgTe~DWM4fFX7iB literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/nova/0.png b/PyGame/assets/graphics/particles/nova/0.png new file mode 100644 index 0000000000000000000000000000000000000000..fdcc423e77214bec6a0c5e953bdf771c7f3f6dab GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|VnM zPZ!6KiaBrZZsctW5OD}JJa=#c&!Y)?O{OMoE{gZ7{oIvB%=@p`%(+&&_hRY(UyM7Z zF+5@sP;ancJi@8q$56=BA?z@R+CtxV{9@eq?(3ho$NQhB{(AX-{uvgCHOKBVetZ9? z((-qm^LrLGh{fi--{(7~@BeIHX}kS;^IMoOsZM-6m-~kG|C|Tksx}leRKv{v$G73R sv}5}Wh)3`If6E|~#6&}%BV3(7_qXbYm#!DtflFVdQ&MBb@0D?cER{#J2 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/nova/1.png b/PyGame/assets/graphics/particles/nova/1.png new file mode 100644 index 0000000000000000000000000000000000000000..320b9305496babd474b6fc0a96609e6a791737ba GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|Qf% zr;B4q#hkZy9rJD*2sm8SIAK}iA%CR(i|drqG{H8-qmm#0Z`Tf3uumd_fEwLpnnNej@&+{({@TLw_^29shiyj?;DyRKwS@hHH}lEA*-q|6i&5yR?i& zona2+0ZE2C6aN)6emt|L?pS}-{)0jiKW{$&Bd}Kf!=t$eI3Z37e_z?~d;ZVB8vCX5GE1N)oZZiVq5kgv+cWRK z{=UDV`#rY>;{zUsa|}qtvG>dsckORq`px7AGToSAN7s4gn6+EKEGQF!x=<#O{l(sk zg7yEeSvLwpbid=XcKBBOWpRDoOW8wE7fj#CoHGCA>Zx`6VJ7v+F8ID{#}~<8>`U*j zhwJ<=W>BSH`?~t)Vp!0W-(Yn6TIYZNT6*0Rs4qWPGkyMP+juG&HMqk+{^z~(cb~(n z(t4Q6)jw!nZU3f1RuS|MlOm*ZtA&KHAwA-Io`A&jM5N)!O0P z8Tq*%uUCKLk^TGU&STrW_44|=m38iM&S5BEV@PKx`2C(?b9&vs9{HPP>=K>UPMhZ* z-~@@YF>L?Kcj5h+{%h|T0+9s&eP_Bh|L5K#_3z*K8JvVFHLvG4sJa_p|LlBR$(q`I zH|HjNih~&gHVaHl-_LIG|MkC#!FRbW7=eBQdaUoiW#jMpKNrt0fAQTIF1UfYyj=C=mQv}uyCamr;AGv*Y zzGDfjbH7o>-jQB& literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/nova/3.png b/PyGame/assets/graphics/particles/nova/3.png new file mode 100644 index 0000000000000000000000000000000000000000..98371b17985cdbf429c3a49bec44941851929bf4 GIT binary patch literal 675 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|Qg2 zr;B4q#hkZyZ~Hns@-PH8t(d^1(Z_Tt>BlkoHEU{boIazepfY{p^_WFZK346$cjRl_ zUzU*53=eo1&cTUyi+^$YRM%a-cjCvNx+(wuc=|C|FgF-8?5MML_~vtd{=vn^&)eSn z_k8zMVTi7Gf&c0nD%#%JD_?)d5cxd*{rou$1#ArI3Hj>|U*G(r%9;_y zi9pAG`p)?4|6TdN>why`eDeM}?bHq4e`%LF zI{$jLx6LK4|!K!?`lKZsa={qc9UELBj*f`bzARP+Fr-r@#`(i-tvaS*H6R5>e)M9l{dv%JAC{K^T*u#jEg>}C%okg*w6g;5evlN z)j+`tx4tLmFKo3wfD~!#?(m4Z`nO?)_Ch^6|U-eZd?i zG<&Q+$~?F&?_lvOW&tO}9ey{MZT?yVhzZ`0i~&Y9gQu&X%Q~loCIIH6yb}Nb literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/nova/5.png b/PyGame/assets/graphics/particles/nova/5.png new file mode 100644 index 0000000000000000000000000000000000000000..f6aae60439b32dce3d25007d53d4ff6847fbb442 GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|VnC zPZ!6KiaBrZ9^`6r5OKKJ_3!`mT;Z{56K{qh`4opD*i=JY$Stebx`+?fvY#P&m*8!j4u zx%mB)`%H-6?r>QjSn*f#T|Hwx)TDJAnBOct_d{8Ye*T6B>mB}&>-qR3IrQ!TqmaSV L)z4*}Q$iB}QdXo~ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/raccoon/0.png b/PyGame/assets/graphics/particles/raccoon/0.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1a9ebefc1fcc7ba6381ad75a9e19478be27e51 GIT binary patch literal 2093 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 O3;GM@ME&=%*Z&PG@n~lN literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/raccoon/2.png b/PyGame/assets/graphics/particles/raccoon/2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b384be08283eb809cb6ea342b9927598cc2fa40 GIT binary patch literal 2550 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 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/raccoon/3.png b/PyGame/assets/graphics/particles/raccoon/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6feaf393249802ffd4eeac4db952a2e7870adb5 GIT binary patch literal 2488 zcmb_edpy&7AD{JDf8W>l_xip*-_Pa!et$kGP7XE-a=Yaq z5Qu{9d8klcJ#@L!;<)mfM5{Mj+HAa&c_ zG82POp8OPsPEzP2?o~w~p68^)y&@G=;z=))CF7wluJ-&YQ}^r?llsIXEi86|s>r`- zsj7J6w$kUDnRDkRACTt&vA_+fWH7VeuU9Uat%ThN87PEUqM_S} zTaBa+QDHg%=R;$}Q*WWFjfzczrjbMvRZ0~q^qrHuoa&W9hzUD7RAe5c_uqGI^6U$` z^8)&X%<=WRqLZEFhPTg|?w@|9ARDWy4Nod7^0X@qUG{coDCWE)RNaM!tXH{Qpk`Yy z(Z@?}+}9S!!$RkpgC_?xO#Fnr!@Lvu7WERrtcCwPAGmE@r}&SHtBXR%H>|o>+z#A& zUwUUie^3aomeS60B5KxN(=!Ug7!p=qKM0m;G7pe_ET3I90-3@;?dO_R-*zlN{pZt& z*_fIsBg*G7mp$ka=E=vd@2C8B$Zuq?2i5|`2yk3%%+a;_XY3YHeMWzOq+++An#pJ% zb4}2%`LKWezAK}xdgmUF~6%?Uf?0vOLLO= zLa55G>Ypw+Ohu6fTIsifyky*ny07@R6xe$rDvRZjMp9)^_lkFcF2&a*^MR7!;wueT zl6rJ4{besE*kZ`y0}v3wsk20ER;16zB6?8`9qV2N1hr^$aI07q-A1y{?}3sOD`uWr z_`dU505z)LM+tAB&Eb`CtnP?5vMRdcx_eS7~eE+EQl4v0im-l zU>ZSgSx(Dkp7HeRMsy9?CCFg8^Dkc2#7Dnh|Q6(i#Ocah_H1f-jz zsmPxXL-PZ3GyCjEjw*bM-QOp}f3Go6E1@C$rMp_boRh^MB-fM@QfPpYNPKXncP@OJ z(p>=A7-bUIPLCsPM^I-P<3cJhrK3w2#$wayLe}}uQc{^%Uz@K<_vz%)*2GGN@t8Gh62GTX z2Wc1sx}$)=PYcf#0P!fo$kLi4uK?!&N=K0t9-SJA>bk3Up!iGnx7I|UbNt)W_%LSn7yIF7X_3rT5 zH#SFbWe4MBj2n-P;>L_;)xtT~vZtz*;O%!!%{u6#w9j-Lc4hj)7Jy31?uaDo2{g>q zSx!1>8aY9SR-u=O9{1z)rSYsWY5C9wzk&*F9cu=z)1~F)$wmQ%uSsAm)^Ju#=_?pn z1)`dTvK`m{l-Z>3gX@ygWldA9Nxztoe@8gQo^YX=tt0z_X7WD zEqARXaI3b4wyfQ8__T!DQ-HOYUJs(qJQX$S@}yxyQqcwoYa{JVQuk}kzSqzaNCmML z=3hFIES*5BDh<%`y42EGxqn=oIVsFRFk+C;aMQ#?D%s9_;RFsQEByz1L9qdQ+J*>z8!-O&!%W9-JJc;dJdOvaE(pZd L+QEu!fxh`SH?g=b literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/raccoon/4.png b/PyGame/assets/graphics/particles/raccoon/4.png new file mode 100644 index 0000000000000000000000000000000000000000..e550c1505a29db8bac7b23f48ef8a6f5c08f6ecd GIT binary patch literal 1685 zcmeAS@N?(olHy`uVBq!ia0vp^A3&Ic4M^IBzMKT4I14-?iy0WWg+Z8+Vb&Z81_m~F zPZ!6KiaBrZ8fHtE%N&1L{PNA&?u*k7N^;HYHC$TUmUlAXlU&osN#Pe%TlTbHQoLzA zJ;~>}LwiXM#JlKQ{&tgEZNWsjHYF)_WbT=0LE7H+{V{DKfWHie6@J3<-Y_Y z&8|fndF$5S-entY_~3rL@?zc{?_crl3jNP$Z~Onsudn8|frnmB*qzSJdyvKF}?qA)H`Jxg{k&T_Ezn8UM4WHiobgCDV+`@(Ox^muoTooVW z&gy=0KE5u#>ftM&9i6jZmwWHGudQF{`+wf5n>)Yn4!^Iz|HEvzdQ)zW8LiV~r~Z5U zJifd#IKtt;ZR72|tD`68#hso1^NFTxnBoJ$C==zX3nzr7KV0~~v9xeq{^Zv-YtOtX zeeUOfe&f7Pd-AQ5nC~q+ZWsJ=!!wt5yS*QOEIQvJb!xe(U73B}x!pTd?-nbugJP-s zu9N<)ReDyQ3$21f&)-=&`~Rx{^`+i-zub9hRT}**H==Cr)!*@dD?`)oXc@mRi)d7g zc*EsWd~$gJ-&2N|+u-QjvuxMQis0_J%eSv;MV0@bwQt^yGq?G)!Knb05YF<%%zdb* zbwB^to`S0-%Wi-Botc|mmQ&qk{`lRo45oWiU7st4Gk;{v+Hz1#3K)LnIhUuF&lQ#u zd&_mg{8q#4b4NmJ=T5wS_3N2mH_q?o*FXElI{Jm&=At0?0|Gf)qF)$BnwUpF{LJ~| zT#4E|xs+Q^bffsxCSQ7f{ap6%8BFmvotzD{KXjbUTbsMw_^a82C*t$r#1X_E&C=3+?r9eZTI$ zd;^oS0i*MVi#ZF+Gk2wy9jP%?FW8c7z*zow&&%X#dmCe8pZr#TzpZq0SW$K5wU=Kv zOGRgJs3m~Vw(x0(EzcQMPx`-We(9Bi2dAEhKd{VrQ~$Kg;|Y98YZt4#JB9D$-Q895 zbiVuK=A6D``R7+K^KClE?E8Mv##h_&w-^`rhsEDGu^{b1^T{Xw&RsdXN13ByZv2}I z^=i$@+_o{LhJ4Q_Rv&TO-P)!o0LisSd2E`P!+NFwQ!+5$@xH1|kdTH)B``LJ0s75v Y?Vfm0B>vSxU_Ha&>FVdQ&MBb@00CLV7ytkO literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/raccoon/5.png b/PyGame/assets/graphics/particles/raccoon/5.png new file mode 100644 index 0000000000000000000000000000000000000000..13797adea582c2157005b7f18523628df6ca6223 GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0vp^A3&Ic4M^IBzMKT4I14-?iy0WWg+Z8+Vb&Z81_qXR zPZ!6KiaBrZ*msMh%N+Q)H(_p`^vruAjaP(JBBF0Bow%o6A+v@x)8&&~lWUyAD+R|O zZn0$st`V1Fo=eX#>3s9|=HBSJd%y1f{Ij9p`Q5X*S~ebO$azAutEcKPb7l*vd??8Ik+f>SJio}I+>!v=co2am3n z@P48E@!iwM-}B$^GTB@E{oJFscdaMSJAc34_Rg=5zy0NO{ld?y{he2w!UT$sGeT8u zWqYH}EPtIM^EY0u`73uo_}zay-yK~Qo3Fh0-_N7JAJ_f7YaVT1ZpmXUKfl{2!R(gU zuY7yE{U?JHnX3~xj2qK4E?>G@`#_FSzVrV6|F7Ko3*VnyZ2W%yy0B>b|9?JT&9DFY z?U(v7HzqqLphI_*Ose~Mc)gyKtRzr3Fd;-b$#>oswmH4$t;GL7AD_?se*XRR^}l43 zs_*?3_@JJ}=kLAtzx4V44H4<@_swibPvNr{d3H=r;*bruY_U#o$?Zu$jiz0kZrlh> zTE(JPY1j8YF7+*xue`hO+~mzZP+N}IoOnCMcmG_M`3;deV(s@g-~0XYYU}>bvm(Pc zx3n1uSFrK@6q)?=cO5WH)0m2t^=?02H~W$4-e)IRplSDv+>E`y>fcvil`DUhzVZ1X xpt$gi=1*SI^2dS9^_{GVYNN>=me+6Wf3&D$n&hF=3c&J*!PC{xWt~$(698__!+!t( literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/slash/0.png b/PyGame/assets/graphics/particles/slash/0.png new file mode 100644 index 0000000000000000000000000000000000000000..75b73d5ee474789acea570d6942ccd88b300dc43 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1Gy) zi(^Q|oVT|O`3@_H9JsLT)!+3#>eF}vZ}IpuRkNy`{@*W?+;jcho~;eb7@{148FUwD zHi%siap2D2TEJ?;dVy&cQwF0i;}&wI-!j+8?Xms8*?wM!#;peXdpd?cJ*7V!zPnV- zK9f1`PGr%i$z~58<-9!Uf2%>deA=8pOL%u!L|1*9{MLK{&_SDP8}w6VbM!V(XMYRy O4uhwwpUXO@geCyHvR}CX literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/slash/1.png b/PyGame/assets/graphics/particles/slash/1.png new file mode 100644 index 0000000000000000000000000000000000000000..011e4a994b501d00ca32323f933b3ed09c02f376 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|TRp zr;B4q#hkaZeEFITBwP+w@bR5=v``UW$!**zw((2<&s*niZ`iPH@;PnCM{nlLc6)Y^ z?|_^10c0ZW2XDnD=8yyRn`Zy#oyPcvfwePB?gT?w1Cxp=e+q-O16$--X2}D50*+J7 z&5aslA22O^Hu;?01fWX$9aYyh&teA&GN1Zg2~=co)I9#l8)iv|nAx{%CNQ>``kL^k z9O%uS2{f`n`kKK_prGh;v%4VbSekbnQIe)bD#HK2hDe)RnQ zwolI2;Hr(py#~vl=P&)cX`dYFYsTMZuJBJzAnRVmV>_b-H+*`5PCW2*;&JtTYSP~) zG9DD1YX%f}sXo`7KgFTIW%=3WhrAyDO>b}>mR`V{z@A|Ihiwl7YntA%zDsigfq}~4 M>FVdQ&MBb@0AJCTc>n+a literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/slash/2.png b/PyGame/assets/graphics/particles/slash/2.png new file mode 100644 index 0000000000000000000000000000000000000000..922e9703eaa20f32031abd47ab88f7f49cebb781 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|O(o zr;B4q#hkaZ9Qm3J1ej;9djDWzEl2+o<(Hk#fr}kD&Mf;jM{twO<~RY(=YIm8d2%n< z$hd_;O4EO?ETxks^yoKe&Y0qYdtDi%_dWE&D(-;OT#)76(>8!JjN)7 zUfu<)7mnmKzBRdj>B4u_C&B`YS+msR9=j;bX%OIKnCRaCQeaSh;NHsn8{d1MP=9bw zjN$jb7U2iB4l*G7cBb)jT={G|r(s>W^ou9qPk<5)Vh+j78H^^mY&ykuf78TSezNRf z1@g^+62)g4>}UPc{=`|peSs;XuAcwJ2li(gC)5uZ!*qdEDd!(xS99@HoH~(-1sFyQ Mp00i_>zopr08kHlG5`Po literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/slash/3.png b/PyGame/assets/graphics/particles/slash/3.png new file mode 100644 index 0000000000000000000000000000000000000000..58821d93d57d7d655568457a767fbfbc5cefee9a GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|O(o zr;B4q#hkaZ9Qm3J1ej;9(tpBevyT5k_sdS_z{L(6XO?}NBe+RsbDV(Y^FIO4Jh>Na zWZc3aCG7xZR5HhHY4DDC_Wo^N)$&VAKXH1*wH}qMW|OJ7=54{arD2_kijy5<9%B?k zFYf}@3rBJq-zopr0Apx-0{{R3 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke/0.png b/PyGame/assets/graphics/particles/smoke/0.png new file mode 100644 index 0000000000000000000000000000000000000000..73e9a5952061861eb71ce769f6ca1bc8de964d34 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|O(U zr;B4q#hkaZHgYmK3b>{p4KY4#xQX@j7Di@eXXy>>#<~f;Y%U`G$?5Y9{);Z?-~RuJ z&APAm)*5j~HMlWmFiNp5V9gL|5L*z)fJ0!`C&p<7yN*0WAc*68--XH6U-WQmZ#0*|Nnfv%_Qd-*Yw|PH=PU$o3}j9k2@c{$%jyDzK|{*rCt|3@!#wS3j3^P6wb z(Z%9Z{2flnB)Dqtj@%bhW6!L1;IYEBlYZL2|5l0!PCWYg)uUZzf)foG<=8jIv2OYF z_VwZWug{#)_Hj7heo^?rzaMs8U(Pc7I2@av@qPZQUvI7AScN!!9jq_IX{0cP#a7`_{BmZ{5`U z``#X!$FA{Ic)~8_DLXGGFRfv6s%|KH9eU{V$@4Nk4$syfeLiVIWMwPoga52uxWWS- cL}&F+PwRN7{CEC!U_3E+y85}Sb4q9e00o-Jg8%>k literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke/2.png b/PyGame/assets/graphics/particles/smoke/2.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2ecb931ab2ff92372f1d41033ea88757b613c3 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|VnO zPZ!6KiaBp*+xjsZ3b^gI7sQ@KnnUlPHB@Dl_N*(ymW7*E> gz~0b?g?Prpn7_&4+$VcRVAL{ry85}Sb4q9e0CI-n_5c6? literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke/3.png b/PyGame/assets/graphics/particles/smoke/3.png new file mode 100644 index 0000000000000000000000000000000000000000..244b1a1f7764315ca7264d215ea878d493f6fa01 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|Vm% zPZ!6KiaBp*pY>&SUhl|7N$O@_y;& zzNg>QjwPSi_Wt+jQ+pN(I~-4Ytt!@B404PXWr%fTR(d@x7C3vfwyO$R$k%UB<)@E`pSnF zMRKwYehwX0imPqjGx4=sI!sx6Pi*-D<~{rs*_VUQROwe&r95=e=&%-C<(Jv|E;crJ zE*p1=Ly6jq(x!Jm7L{{&UwrXBUDlCZ=BvI@DC^pNjrHOgk22XyO3MPDZvI#)UZ8QG zbrDyj?EIxZCVAqgtrhmNhlqB~`+f7rRa>`+dyF~^R*WW(g%`fb&CfE+aAaQ~yx~RA zjJXS(Z!uoZ4mmHl>VuiYk{W3nuZ1f;CpfU%So6;a%aF2au%8_*BgQb7K?+XHddgkE ZKJ)GqjvjB99$*AAc)I$ztaD0e0s!5I#^3+| literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke/4.png b/PyGame/assets/graphics/particles/smoke/4.png new file mode 100644 index 0000000000000000000000000000000000000000..e60a29b2eb9f87ea55420551fc85c6ae6b04d135 GIT binary patch literal 577 zcmV-H0>1r;P)|tkF${&h4ELa;j)@IxHy{xQ^Ha6m*Y{5;<-e!s_tNjAek8R>Se}5P ztAN$>+I_lydO!d1+~wn3#g*DiB#>P-5Rr#R{cHUY z8B#2W2n4ildZYSL;w13zo>%|^Y8Rt9I6cGGOis!KN!-IT1OhCLG*9xV%sr}QaFV2` zPuE9~0Rl#LX3gEXv^=2K)7T9*bQfoWnmB3N>T)X(kZr&S^~4AekU6-Nt4piLjEr!3 z0;;FN+Ah%R3F~=+mN$5!yH(2*P>lh6SJyl9BRw`+%M)O#4Dn}}6T+`YC7mPi)j}JG zVu^)Z5a6i|j$R$CW8uzEh4(M4lP#(q1_;9_Fe$*2_B%X z-5^QwR4);DSNH%;eOr9AtVH1d0uJ330W-8b0hoYn1G0q)$TlEb%TK^B8b~pJ`XxK) P00000NkvXXu0mjf3` literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke/5.png b/PyGame/assets/graphics/particles/smoke/5.png new file mode 100644 index 0000000000000000000000000000000000000000..6475ce3d909fa8e64984c29a99fecffced3cecb4 GIT binary patch literal 557 zcmV+|0@D47P)A-VN|p_zt-CZh%CO_YXr(eLSBw z?wRleY?jj?7db9Mqml2a2LxCUP)6?N?v{M+^Zg^G^gBZN{n~pqhSu;x;3SzmuIr^JtTxDz~noCi~MNBxpFcQxqgm>lt4h60O>p~ov*bb&y`>E21+1+ zx;X0QHCac#R$nHem) z5tGgunG|jRz;{50E+QwWCFBDL{VM{>v0uwLeHRGus8q5}AJNEn1qiSxG)H1~Utonm zfMwyc5iVWbV(k!~0CHcT9J{N>DwprqY)^OsNDnC2_2sI~Y89ugGAD?&03p%dpqD3T z)!QN=JON!hL%k80%>}L?4FpgZXLp9UoLs(dofVek20?BxogAJhryc^&xkq6{4 zwA#J3PmfUo0V6MQ5#rA3XcIJgUN9vP&|VGJvbv+Y#!}&|@Inpc1G217gyMgJ1v33( vL|eT?;GZFZE{XsPg(m<1m8)cT1{%vp1n+^NYp83fvy|!y{e09GA0|x`60s~6} zg8%~)Ih+N&&ieUZK3D1g^1AY|LPHH?ib~j~n&=;wWcP2$k10$x_SRM$H;$^3wOwD$7 Ue>JCVT+RRlp00i_>zopr00o(9m;e9( literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke2/1.png b/PyGame/assets/graphics/particles/smoke2/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f3928453a3cb64ae8c5b9e3382eeac84f4057499 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV0_`};uunK>+M}dzatJJ4T)YG z9&E@EGAR;m;x6DYQGehNlfas#I*X5B-{ZF*d_4Sa-DZ$@Lvh2ew0)u=!{;zp+^z2kI>)+(!Ht3GfTctBqci*V z@AIAeF$}1VVFSB`-#6Rp!nFE*@@)O<^U5Z#GvDUE0c?ovf%_@@#Rby;-8lcf_e_m8 z1Cs;8n!W59f8`ELKm7W^`}o)Y7_=J%L5AGeRq@UK>zevERrk0-zN&68O0P31P1CPE zAHVXuNEBla(6O7te&;0EaL?ENU0U_cwsqopwj>q>hA3P14r7CA{|#SWe|clu2zGRo zC40m#8O3?rXKcIsjsL&=xD)2BPgj1;wFA36>PCd^yEpGDjJ8^ODe}7*;|6TDLi&}#!17iYzK=oPuy==?Z{akte|JTAF-@m^r zvEr0X)>|OC0)&JtI)d({%Dlq&r`5fo)^7V)A)w!4Z z<6rM-;7s6jV7S5jWgmOTUcU2t)lcNEv~7e6PWkrxukcrwhkL&-eZTekJ!PHJwhJs9 zSQHq-R^O;>xKjLoV|LN{_s7B38QhXvP`>oM@C=aM8>ZPhyes~@G3ok;t#`r=70Myb{c4ZB{sGzN6PY5I1Q@fmzj6*>XTD)P7U%38 z`D%BIFM~G&(*Ze!?H@kB^*{f63BTeryUF3d_c*P+&kr`Z;cC{ia^~k}YL^GRD*t;d z>#KQ#4+BdB!-`t@gv_PuAG_DCKLmF49rhQ#Kkgm6^!!ux-goAVz(`r}{WrrysX0~m z4zPgY=R4!E3Dy1vr%Ly8g5qrPdqxA0D)gvxV2ER4M2Xi8OzKt!8_t$VPnN7;XBVBf1a}|_0`|EHAajM3<3=L@pz91tT_!z)K hps0bEk4EkO%zdrrNyq+&kD3{Pz|+;wWt~$(698Fz;*tOW literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke2/4.png b/PyGame/assets/graphics/particles/smoke2/4.png new file mode 100644 index 0000000000000000000000000000000000000000..abd4af8d921d205c4b34daf24167f1b9efa5fcfa GIT binary patch literal 722 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4CUa;uunK>+N0Jpu+|tu8D^> z@LPFZW05Tln;^PmS+i;2rHw+Dv)M$>R!>U(Z7q8^ev;+qcUyICFHenpR}k~AmW73Z z(SbpL0hRjw^q~8M!>504eVuvr{OjW~O!0>`$^W@q)cfE8!SMR_7!m5#zfvJJv#Z|^@cJ}lC{#v|# z`5T_KubI>sI2f1`uJK){UR#%c#me#R@4eSpeHa88m>k$&)XtHQ6+dxr^7UQn8w*jL1^-d^_X?5vFtm%M(>aPjensP-AUm!sdi2Uu?xsI`B(%O&i& z5u*#xTe1tv+or9leW&pIuZ!{iuk)NE;la1zIcrM#zZbSui?6G?-ED_hUD9xIru^9> zFJ9lh^{+ARybRP7hTEq~&hszG`9*dHbiF1h9_`ep@-{CZAqk z{r+P1(sK0^?@YkXlbM%zoo!mq-(3xFN_#VoK|>=7=qmLYYn5HzdrKTOZU#jZ(AYk| tGWQpydWXS5P{J^SK>-vk4QSL2$^CX(hW`Wps+ckWfv2mV%Q~loCIBpLE2aPd literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke2/5.png b/PyGame/assets/graphics/particles/smoke2/5.png new file mode 100644 index 0000000000000000000000000000000000000000..c89158a83b6ab08c6b5e717611c135671a9e67c3 GIT binary patch literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV5;(TaSW-r_4e+@z#|3%t%+wY zFmT!ia5+10Utnszz_i8TKmeERgn*`#Q-3^}n&SEIpTs+z^RsLHtG{JMUjNGV{OK)S z1qJ~I4h9wmCI-d^1_uTUcJn+($$4^ev$uuV@82&b3X*bYNWBuzym+4U*9+I?#b?`U zF>o_5IP8s_HBu| z|M|7|wchnmnFE=U&ng>MJm3E9$BVB^Bo$-pO@vo403Fi66OcWB-fn%}zrU;U=gIH= zcV}NC7szD`LfA6y&bFWZ+}-%#y?qT_2bdffCNTCbD~o5)0=d57w9$c!dw;I=nea`v zsQT&V@4O*kZ*Bd>5WV;RCAsKd+uKZnr_9x z9b(kxw1%Mfm$xsv`k4#n&$Gh)cKQyipb%1EmN|S;Zr|0_@=y0Ni-L?Qh|;suPsqM+ z`+J|2)&2d~e=la*0JQuIW6}4!nQAwxuIFtj|LAsFrP{b1?CuNf9Yx#h9P?k_oed2r zy8{_=6<=ZwL>l!%eYR*`{O>ahUd-9^<-hxU(U`2f1yBhCvva&G;E006o9=Ihmv$xJ z?p443YGKTw0}P2cV~1RR-~V;nHa9K)%nk{LnQ!XM4a&pvUvF;np1f}RH{%I`{pRuv zAmve#3(C}9)W*x(u3umRG#ePP4_5FrY?EAgrG^RYKLuup&mBN91W76fj{IRZoXxZ1 TR=Cq&1|aZs^>bP0l+XkKCQ}U- literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke_orange/0.png b/PyGame/assets/graphics/particles/smoke_orange/0.png new file mode 100644 index 0000000000000000000000000000000000000000..e4baa1348414b32b8fe45a9860e79774b2cceaa6 GIT binary patch literal 517 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|VoB zPZ!6KiaBrZ9`rrzAm9+#vtk01Mjul~;m-F*724NK|9{VRBY*tkz%506hR3*L*RRfR z*vcZH-eAFagj2zfp^&LV*kKOCBWeoW3%h@yzqU5!Z`=KSLSJ{3Z2f-TTfSaQ7-HS+ zbaspHFRss_aslh)eRG%O-q{pL^!|{UUV(MzC{s%q?rUdj5}b^g9+cQk=N` z^2`H2d+y#n$B|daR*=R7@u&4$hRs*44^BJ(XC^1a`)~I!pZQm%{zDugB%6Hat$OLa ilPuH^6x0Cz&DP8%%sxr}LlQ7v89ZJ6T-G@yGywn(O0c#7 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke_orange/1.png b/PyGame/assets/graphics/particles/smoke_orange/1.png new file mode 100644 index 0000000000000000000000000000000000000000..7cce227da504c07d310ba189e18b511de185826a GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|Vn_ zPZ!6KiaBrZ9Q17o5OD}J49j2?OJ}^S^sbXrvElz|+jRYNkDh%@keF5)d;dk1{9i^1 zZ-zpq4q=Bm43Ag@)Eg`qk8mpZks-9BKk@(1uccq~&+R*ru=7Vn^>O=WpMNjvFYMuj z7~6ZB@mp+d-@f0e9zeP6%6E>iK&(x>#kglf0fR8a+S!@x6}#T{86T}>go?o3wqxcy z<~x7S$n7^^1iN*|%rb`Oe;9orj?R0+7hwO~|6@%9)Iu!&IQzxMq4z$U(L9i6&5PJS zST}IafOz(f&v(YYIPv~_lFN4V*`J2G4IU(U%YHMs|NUCd*}vo6eIuy-|MxKG#O@Wg y`7~#LDib8!PVegb7d3Yx)J^0BBw7sAG59Q(5I9-!^aU`^89ZJ6T-G@yGywqO-oga{ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke_orange/2.png b/PyGame/assets/graphics/particles/smoke_orange/2.png new file mode 100644 index 0000000000000000000000000000000000000000..4425e33055d54b9f486f6d3117adcb1a53319621 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|VnN zPZ!6KiaBrZ9t>;_5OD~69I=o!Vh-yP*O;A&k5e8T{(rBSOCj=3rHzn>-0f|9FMh52 zF8v^msYBRd4#OiB0rdt8#v_~xehh^Kg=%@MKYf1vLhxK&!b8I!KkE11Gn{{ax!k+y zoDfrbZ!^Z3|C&?t)p^42>(=G!7M)OuyE~b$)XhjZHTM7uPHWS4$uCIjde7zqanCtE zgZ}6;CSi!fb{Da)xXWB|Mb)|yX4f6YIiJN7n22;b*n{(U=S)v$mh=aCReC3L%wPN3 z)t{vuW55EtKNUADe!k;od57jd<`w}Y^ zPR@HOn~?v-?}Prj-`}A^?>6S@%|8w05EI165mCornII)>YCEqS81)REu6{1-oD!O< z{S8i)?&oY^5MWsRp3#6&fPu+@frEijfq?}i#suUzFvKx2BJmj*H!!JN8EiOb^2C1$ J0}#N>0sxys(#ik; literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke_orange/3.png b/PyGame/assets/graphics/particles/smoke_orange/3.png new file mode 100644 index 0000000000000000000000000000000000000000..a817e8d906bf3dd7551a8033b74ac1ea490a338d GIT binary patch literal 623 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|S$y zr;B4q#hkZyPv<^1U~o8Saf2(^q05``_M)Qeif#K${-&KXT*APw;_Ce=IdU5RE<5-6 z49T1dehh_79l{QC7#^_*s5e+J9>F5?_x7L8|M$h`9P{4&d)mt53;pZ==KLyFhG^Pe z%WH7&qUFz~0F$}-K zu5LALc>T{_f)VVM9fzbI+^ujIcrFNX=eISCHT&z<1wa3?wg=+lJCeT{%GYzc$-keu z_IdH^-Hq2_5~BB6@6^UxSH(Yi^?2^Dya%RGpMK~1&b;SVIp^lT%O*T$y5SEpM|vZh zgl&7=-tG3HP*veI;UAV(zh?fim*E?(aE*I7&!Ml-UjgFmYYgXm>%JA7-P}0G9b_gj z6h7n?zqtDU{MzptQc&Lr{$|KGZRfMNw-V;eH R8<>I^JYD@<);T3K0RS)?^~C@H literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke_orange/4.png b/PyGame/assets/graphics/particles/smoke_orange/4.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ff7a52a45fa316216680e2e936657d6124699c GIT binary patch literal 724 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|Qf= zr;B4q#hkZy@A@8b;9+>k5~#=;Aj5hgsY1<3rF(C7`^@)08-%6a{`ypWv;XmpBVU95 zvW1*xc)-JO4j1w6>o;xt`|A68>l43aUafs`HD7*v+%qnQbcO;phVpv07wWs7_q|>D zv)=yK_eJmPZ<~cP*f2L3Gwe`5%W$*$-HUm*-hO&HW#$1>hl6-Py=NpB{Q6T9^6lrh&*!(>ta}KxPJAX~)Vs{y*t0CE z#?9Ica~KauGTb@Av!UvI{9g6Gx_9%7=KjlC2XYwDb#vFT@3{4NcWkq{)#5qv_mk4# zwwW-`S$psE;`y&ve=m8@dj(?UIb(*iFMJ-CvuHwsLUKX>q{kdE!_F~$pIYNL|18uO zc~5yJ>{U;@Z$9DgZ@I$z4G6ag?B%Q5Hmy3R9Hw*PV}@{J$1m0ecP{Ur{po)Z)XS%B z#0{*3OT=w~M$C1-IPWEn`sZiy6XX?%4|Ku%&cQ65i3K(8z_m~%Kd-eI}-ES3e zpHKbH*7xe$U&gD(=VzYh34(;`nPSGP^Dn1I|IJB$&l_R~j+MU_tL)FMngq1~tPUG- aM_g9TRezJX&SPLQW$<+Mb6Mw<&;$TTIV`XM literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/smoke_orange/5.png b/PyGame/assets/graphics/particles/smoke_orange/5.png new file mode 100644 index 0000000000000000000000000000000000000000..3dfab88f79e8b8b6d4f777389b4457e62d1c6f15 GIT binary patch literal 738 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wk0|V0( zPZ!6KiaBrZ2Ijpo5O7NjE^Uo<5Wmj4;pms0fd?h}-xi+xDffOYi{t(@H8YFtk1e`( z*oEz9T${@9fQMlYV}mh60UN_Ph69oe7R(Iae}1TccVGDaG1W71L3>UAe!YHv|Nk6T zh@y8Nc_zf?pU-{0@ZMMI+qayisaj?QF)d^=G%AV_EzD`>WS%`Wu-b{xL6- zRjBUg{aO3hrB2@ABiO^Iw}>x@n8&}sikTsu;lUinPqQ{{PlS5$oTS2f&1&H=P*?yZ z%VseysyCld`@fzG<|XU14C$+@D{|Q)|Ne_hf`!aYo(om?_qv{cePP$T4M*Se!Q8cV z4fB<>rl|9`7pdo|q^NC%I_vso@e9_%Z`5w@@;LE4A8JV66XRyL?+30vXL@IMc}mb4 zh6-@Jy!~=!!M*GIZ|!P1&l6-1b{1y50p030kH6sS*6%m3KQ?X_IS-1@9W&EezJ9xK zub64`c?Iu%`7lrFeX3~)yJ&ncXZ3#N$j3h!R)Ld1-jkmUYd77$?jE0SGGBT{8Q5~y zcdTpn>CazVws&!Q%Y^f{xj>=9!*J)V#iqOGveaOKf=ECRY5k2UPI|Mi&7T5Hv<#lE KelF{r5}E+^$ud9y literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/sparkle/0.png b/PyGame/assets/graphics/particles/sparkle/0.png new file mode 100644 index 0000000000000000000000000000000000000000..2bc0bf2177795619a75aba92ba8f0028dcd5153f GIT binary patch literal 816 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1FhY zi(^Q|oVPbmb2S@?FkFoK^?!d(cwURbmE)QzX^|b0YU14~k=MVP8t3aS&}xalw5}^*)*gU>Iiu2etZN{g>3wB%g{;W^6 zZeBm9{aP~f9#QEB3SZCfezp7Y;pCeu*!NwU7{+*ekG-AUwBC-YS z>9O~?>dpy$XViQ2#x486@(GHcIZkUmc$33yqy9Sdz*Ct$O&)*yY?&r8efwgz*XQl( zhQ^<*doZY1lGMNAJ?G)!82EYu-AjB(=%1`DkPPgWF)UYHr`prggmM^kM# j7z%3m8ICg?Fk~p;VUS@a%zVxr9oXpjg2TrSITZi^ERaRS literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/sparkle/1.png b/PyGame/assets/graphics/particles/sparkle/1.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3a8103ecea020ae634bb74ec768a0958816fdf GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1GXx zi(^Q|oVT|&_8oHIVSD)a$nX6{>lSskwCsqjKYDJ8$jKMSCDP{}FO9WV|Gb*jgmnQb z_OE#Vo8y;&(D85w#tcSZB-}fL<-V-bK0Eoj9R2GXm@Y8QIw|+zB~#KC@eoGl??1}E zngnr%9%##67iX4dYq^R^EG|3i?4B*=GVzQcOSG#Gyf)vtTl|auhDox;2mVU`%6B#4 ze3$Yl^1 ze}7PTTH#f`&%i)n@O1TaS?83{#LBv*nJI3=?@$N-U8?IiwuK+iu$coCG=5dEPMU#r z&diA~a!WU)hMqfiSTfLI=1umZ>kO;7BBtJ1Yv;kWmLY#ZL-ogPKQ^%i1T}0|w^e^K z)yaa@g^~4);;BvB%^dofG8#NR%nuYd*31+v_Ig?UW0SDK=JOZR_0Q_A|2BPhAD_d@ zKDM)oA_hOd7gRm{&Y~Q(b=J(8}1x0E@5 zYrUm1*NR?8zRO^}k3==_4|P8uHj@#ai8cZN`d*aZ~^ z-368pH$K08UQuORz5~+*rdcctSWP$`AkrP4AKtMZ*}At>>CQezm>@{c%Q?*R^c=RF zW6pFqYFfXCpR2CVd2Y3p>&E4`l?{Hs+X81Zy#HFf zSMIG%$brN2WcIIGTz6haG{C#w)Zpi@{zU-~~yS<-j9Ka}>+VkS(vAW!2Tq|1t z`XpQ^ZBsU7j5?P8L?Z9*bS{Y_b1&L{zOnvn9OKq! zY@!?bxg>Z+1^k~aIN`|pW-*hSGwYGbmKsF?jK5bjTnu3Rn8H_eedhCTvGe|~w+waY z{crfhIg81q=jq~)GNrXz3`Q#&bhQ#vLL6*nHY>4EY^7FAjLJfN9%`hKYe7 z6S`zV4v2{w7-=cYJL9N4mGfWje2sOY4g9A$8{%0G$S@kXGn^4*C?<#bmx0w`Z`Z=J JJ>kfS0RYdjU6=p> literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/sparkle/3.png b/PyGame/assets/graphics/particles/sparkle/3.png new file mode 100644 index 0000000000000000000000000000000000000000..8384774fd6af967f3a7f46f464ee11f9c973b580 GIT binary patch literal 838 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1FMR zi(^Q|oVT|P`I-#`TrLU}{@1n^?NwEA+4Gz0yuRjx>=_4|P8uHj@#ai8cZN`d*aZ~^ z-368pH$K08UQuORz5~+*rdcctSWP$`AkrP4AKtMZ*}At>>CQezm>@{c%Q?*R^c=RF zW6pFqYk zyn?|oXH?<*P){N^OBWq zCi-l)*E88lP5-RpG`*>%aC*bttN`Vir@}+z9oKJQymrz^=RWh9WxqJ8o?5;xX1?-& znOo6{c|oVX|KESAy!Nck{L^8Kwzuc8-za%!0(9v6(p4Lxsz0wdYpG;;C350x^Vh51 z@APK9GHt)qjvwEgm)>O1%KrA|)^et%wGkJ~qknI;4s*!8b)LmDmODtk&{*x63R4?SB@+X!`H?gmx2Yg(T7S5x+wimIN~DYB`9C zZfJWF(BaIwWd%bhT>B!XkU++4558855QlEA09V#Eik4Thp0e$~oi28r>wxnt-VIs0 u?s4n)Pd}H;JY%wt>LUS$VwM9kj0WxuX9P)O{%2rs(a9=W`QbQn`~v`AJ5;Oy literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/sparkle/4.png b/PyGame/assets/graphics/particles/sparkle/4.png new file mode 100644 index 0000000000000000000000000000000000000000..b07148f970c6405492051256debd70bb1de9d151 GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1FhY zi(^Q|oVPbmb2S@?FkFoK^?!d(cwURbmE)QzX^|b0YU14~k=MVP8t3aS&}XmhE?6IXbN6{6>zSu4H-MJy$f|Mr+dRSdCx?`3&z+g+1*}&J znQ}a|6I!Yl^-t+v5P0>6?~eG^T})dv^#iu@Fq~s}Fi^xk#y=M`%l!JSHIM@n0IDzb AfB*mh literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/thunder/0.png b/PyGame/assets/graphics/particles/thunder/0.png new file mode 100644 index 0000000000000000000000000000000000000000..781f52b3645b902553748a9704cc533e581afca7 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^0YIF>!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo%3 zm#2$kNX4ADHxGIq36O9LR2F-3$V=zIBb@_YF*gEZo-4BK>3g4Qk#2rQEvC-y(3x%T ze>3m@Ztlj##kR`y zW4Qhwj~-4&=mV=wO>35X>iiv|YP ZGQZL`+xf^z$`}~b44$rjF6*2UngH7$dhY-L literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/thunder/1.png b/PyGame/assets/graphics/particles/thunder/1.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1fa39003c6b56b40b26b5e3652a0f79ea1d242 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0YIF>!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo$O zwx^3@NX4ADH+TCo2a31`N(TxsP7Po<8ptqJ;KIbtzmq2Jo%cNX+bMyQ8LwYuT;_03<5ed`)lpurcVuh}hX>*MOD{rO>)|3#(zB~u_{Amhc#uj@A-J6m19```cb z@4w!+zJEkdKokgV|Ji;xX_kM5brBN~{*>OarP6;Hw+kx}{)>z-&#&Q^dHZMY28hV# z{rq$O%I)~v`vzj@<9cC9^TLu3F#fOo-2KDS8LOZLgtz{) z>0RtS;tSRN5h%NM|HV5ypwd{w4#+(2E literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/thunder/2.png b/PyGame/assets/graphics/particles/thunder/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c4bb34b0922ada21d25a81f88fe93c850bb31e1f GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^0YIF>!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo%( z5lQ&{ux*1!7~ZFdI> zbk39OSDAcr+xy?m|K1z^VqEi1=r6-8ySUT#6Q_UIeKGORDK;lI4oQVAOMmOf1NXc%{sqPBQ@`hZ777e>`vO&W$?@QDjojEPj8_EZ!C#prppXtp%UH|BlL0NNJeB z=yaU-PhIljioLp96Q@8FyePV{=XLMjW7pd5-E_MJG)$4X<(xhL6Y0u#&nM?EgDU#- zyK%Akr;7Ue`*M3GLM{FG++~q@(I+*irf2iT=lzYU{s7}YvX>5iUEjCN<{jLbHPR8@ z`(SSV1LSN&aBft8zV$s^&fM%G#1~WYnbY&*ypx4TU32k zi*HY220EBWKx%(u$>&M&(diKGtNo4X=K4Rk7U)8ie|+xp?oV|JG#GxK)f4~# literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/thunder/3.png b/PyGame/assets/graphics/particles/thunder/3.png new file mode 100644 index 0000000000000000000000000000000000000000..91c92a3f6c3f3dab2ccc1344e5a3c15de23ef02a GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^0YIF>!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo$O ziKmNWNX4ADcMkdf~l#r-$s6V5;XTJ=5s(Dk=vGrvaGJ!S$)Eq-cN@b#?p&I2AmnDL8kUhZc% zJp&;i-1Wn4S7GDC1_Zp=pZ@UU%`Yo9+nx@CsImH^lcW3|qWQ(c`|Q_xW!CPS36ZP% zX+81(wuul<)VsYOZqC~po1g-OTkf#+h23`%m*50K-TjS=ubN$Cbz=g;<+l%9eB)aJ zw)Nsmvkw>Fhq$?$LnTk=KiF)ZfBv4@E~sPw`$+7q`fS7PuLd;Kq?Y;oziLN_p?hnX z`}6L-x$p2E;)9Eq%?t8Bhuz;{3w6%FxhG!5fE@#J5H9$IxB76#%J4gnGJ%o8;OXk; Jvd$@?2>?`#y2Sth literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/thunder/4.png b/PyGame/assets/graphics/particles/thunder/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d518932d8bdb5883c4bc439f42b1d2d840d852a GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^0YIF>!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo%( zdrud~kcv5P?;P}HHWX-0Y+9jgTChNfYe9#|BqfaoFN*+YDbD9U0dCK>+iv?(Z$3q5 z&Ahhu^6L)^_QuWsQh)xc`i9-pUkQ8E*53KowWnUL>)aE6KZTTr35-tdPycZpKUZD7 zxAyPv=igpG@+)CdWNzURSQXEncdc@wFoz^i-Gx7VclLZ%QWr3CIKi;+qwI{*d(Y+o znLw4l$`i7mr@r2I`sYX9(~nR7ZnQQAN!)APd%bew=f36JzPmSDU*ZIsXymZse{tfi z&caxU{_|FbyXHLp7;AkIB9rmw-i)i(hFNbspmzNH%^d#v$cn)dm5mk7^=SpLe|U~*~7`*WvT;LiR($79*|t$Etl8XT)aNF z+giT}!k5}_p7v$y`qu~cLPF+mR6NiGd->aZvKAE0UF3(tCJVq znAlyu2pXKf=1=W@XMGVGSPTDJ6&ONQg8cf0yR3ies+iD_Ex`1^;OXk;vd$@?2>@Gb B`Q-or literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/particles/thunder/5.png b/PyGame/assets/graphics/particles/thunder/5.png new file mode 100644 index 0000000000000000000000000000000000000000..55d269840a70ad2da169f6f5747736288a6526c8 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^0YIF>!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo%( zE>9Q7kcv5PZy)q!HWXn?)c2BI*~mOKz@f`SQN)okFX zMfr93qPsc2_lf_#d-{#|1}kPKwiX@^NdY5;6o(TH6Brfo2$anF%jBiG^p2fee6(%+ zcE|NgW~+lWW}IU?cGf!ncb)yL9TVq)%~_~>^lk3m*%kl){Q7vn_X`Wynx{7oym;Z; z!*|ESA8cK~Io_TZYWM!{{bhK=1tN4oN?Jno7L*gv_xjM@M{crvJ7sMe!EVdWOIVbx z0ky)^j(hvN-j`2JC)$9#aO$VshX4N#{@VEc*qXyYuPl_2-f`iXD^&5E`@)hH_3}?S z!QPeH+_-o4^o++*P;-mdb=Jhbs{i#Z>i?hL&p&>?Z+|&w3B+?6$4ehxQ*$d+R?k}m z6Jc{J6kdGo_p!#=FCgZf+S#bPcmC4!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo$O zqo<2wNX4ADcMj$rau9HPXu62+`hi9-jRvKdj_w5vS`Qs~^N!51W!L#Uq5N9aecdjR zNdLw0ev6jOe!lZX`SM%*7p$0_*jjivBn6BVQXEb+Okh-`j==L<`~hB?sZuxZ&;IKC zeYyJ0Gu&WnR&8!9{QT?T{rLRtzF(NYmVLYFu&eU&kH4Syv2QyKbiqQI``qq@pSAMt zNa=%}wPN+B_4Bvw6IZ+E0u?yN=Ej@9NF40!Dap)>x84{2Emt7}^2yUbl@DI;{qy6S z$L7k3P!*4DKUBus9r?QHPt7BktwlKrS1zbkHG+L?X>Q=Pr!x*51Od|05~{agHl5|| w(aM9`RMNxS^GNNN+>Gg!3HD+e{B~7Qk(@Ik;M!Q+`=Ht$S`Y;1Oo%3 zzNd?0NX4ADcQGRwy%&nI*ACOj&x-1Er1UgCJ+ z@$cWfd0o4HFwKZaAghxXk)}$(;ZH|5g0` z_t4J-B5qaw;7V8dB2KV>wryly9=1i;H$epmx15!=*!rM$Aw=q5GP~XjPR-rwo86Km RjDX?E;OXk;vd$@?2>{#Yg5v-H literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/down/down_0.png b/PyGame/assets/graphics/player/down/down_0.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbe85259ac0b618d862ba326df3f4a6847e6b8f GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU=s6maSW-L^LDnaH?yNao4yuD zU1NN2r&w1+XGfIAjc$8~gIoSF1V?ZrDLQd=cWljN`OBE3zal|}MY=gd@uC~g56-Z3 zTje(fZ;nddsN9wK{oB1gGiTmD9UD|A<38)<`IHEz_^hoW>2;G|`Tysi!N_IOap_TY zQC@G6Ca-VR%Y{`=A0!jlG%hG`?Ph-fcz+bo5KI85c40QK zz7?Ck%r7}(aa`PfeZ*_tGkuoF3;j2gw+Mh;Qt@A{BU|8m%g?=BR!qky*mRx0_Mmjm zs!BarSiJeqonU4b9{KCDHT$`bORjJJ&n*B7niGPq7xh1iOg|iG@A?*)P#8R2{an^L HB{Ts5IUxkx literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/down/down_1.png b/PyGame/assets/graphics/player/down/down_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8545561435fdde1761b6c5248b6c3ac2f0ecc19f GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU=r|jaSW-L^LF-LFJ?!9J? zSiPRvEZgQgaSXdh4u5J^6{+ztU$g zi)09>zO63K>nqaa^{sljFw5zKU;Fn@VdE;TkjsyTO+ z8jC#RGX_>E7sdOmv*vyl*`XHT6P|aFBbr?RVq75elHz?AWA5H(?B2%b02Vu1ZU12J zH||@tdvn+POS`?8!;a|;BbP}>64<8V1}5G`8?H0{?6b;{zZ&HzZNJyEpzwa{$L#0*U?q=^Oo^vMB|HI#Xadvar zKGuAwY3^qL8$RJR!=Cl?&hMJP`%3ZrQ#aQ=%$sJ*bItqemIulQWEMCyYjjFA6tCF8 zRGd*K{w?2SgW3a`V*!6fcC@V#pTFk~E6l^^*#jO(6-KTp)>A*3dbhfUd2{jt+f60U zWb&Ug3xLDKa}D!~;?f;%4`j}`re3gnKd10q{=?t5ZuY+|-dNnk0#@_!U!K7AmcNso zFT_`BY0_KFE>qU7(rfE|TJQv6VCJ_ctS3j3^P62;G|`Tysi!N_IOap_TY zQC@G6Ca-VR%Y{`=A0!jlG%hG`?Ph-fcz+bo5KI85c40QK zz7?Ck%r7}(aa`PfeZ*_tGkuoF3;j2gw+Mh;Qt@A{BU|8m%g?=BR!qky*mRx0_Mmjm zs!BarSiJeqonU4b9{KCDHT$`bORjJJ&n*B7niGPq7xh1iOg|iG@A?*)P#8R2{an^L HB{Ts5IUxkx literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/down/down_3.png b/PyGame/assets/graphics/player/down/down_3.png new file mode 100644 index 0000000000000000000000000000000000000000..eb692a201c95a02ced54db5fd388aa867b98d46b GIT binary patch literal 589 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU=s0kaSW-L^LDnaH?yNao4%C5 zA0|=hPEC=G0)l~xT$-0y>l+sJ_V&&d6KjgN5vB2uo%JtcQo3TsfsT$|$1M{wl-d4p zMa=!`lhB?hoL2Ds<+rlU-|x+yxpVJc6(b(y4531q)%*V43+Yn*ur|i8;F$SF(Z9xL z7+9rTJb%rbGkbAN*ULhE+Ynz4J0`Gb;&p~O$;OM5ORw(#&$xf`y19zio_D|A;Cr>@ zf${;KfCY{spCT7rwDfPxW;*)hGp|JAYX&A`heo!*tgMETbJu5g?~XQDyp~xYt$~Sm zQN?@qJ>hkZyO-~7y?Xz}PmQL22C!PNO@_=O83L_)`A%#Pb^N{H63?w4cD)OK?R>m( z-sSmW*Zv%IZ;)Kz(5!LqJk!$Y)#?A=J!-lBC%gUnJI23zzO&7Mx@O9f_i_s73XRfj z4?h20^{d3MV?BF({s+MXHjN7kTs!#={C@Sb=l4GEyWdyNc`NZExtL%4c`JBI-?}xwpEcm^$ z3l?zS{<9VO9(c`k=D{CBi%lDMp0SFrQsKU(&F#J5?Ab~msH5FQT|`njxgN@xNAf7u7Y literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/down_attack/attack_down.png b/PyGame/assets/graphics/player/down_attack/attack_down.png new file mode 100644 index 0000000000000000000000000000000000000000..0ecc1442a9ef8a93eebca2df13eb07f3e5c272b8 GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV0`cC;uumf=j|+8Z)Qh^>3_ZI-2uXs%JwjL!;yZhh~kHatg7ZBa7qqGaBErV*uOG_5F9l z^=tec?CiTDj^DPGcZJ%~1=f((z{I;~!*|A~^YR7cw^=#%yuU2*%A(xnTJf)|XJ^^} z;4xqp$q-O|{`*h;|C;AE`?ecB-n#G9#i`W?I)2wP?~&Vc59Xrx-x+rtJ2~s@k1Bcp z_i>+D=QD!Mo?y$cKV1L(&iA{o)XraZ^WH_fYc&#Uw(sKm&bZXdMiFL#+^OetYUUa=WY6O5mkl<(;J}PYsl{44lUl1UJ$wV!#>$#Rd0SXv_PcN z8#mu~6)?|R?N`e^f4ai5Dvot0&#pDS_KW{Q+&+syrE?o<8-$G=8rdutY5ZbVI@ihI USbQP|m;x9)UHx3vIVCg!0QQ>fQUCw| literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/down_idle/idle_down.png b/PyGame/assets/graphics/player/down_idle/idle_down.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbe85259ac0b618d862ba326df3f4a6847e6b8f GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU=s6maSW-L^LDnaH?yNao4yuD zU1NN2r&w1+XGfIAjc$8~gIoSF1V?ZrDLQd=cWljN`OBE3zal|}MY=gd@uC~g56-Z3 zTje(fZ;nddsN9wK{oB1gGiTmD9UD|A<38)<`IHEz_^hoW>2;G|`Tysi!N_IOap_TY zQC@G6Ca-VR%Y{`=A0!jlG%hG`?Ph-fcz+bo5KI85c40QK zz7?Ck%r7}(aa`PfeZ*_tGkuoF3;j2gw+Mh;Qt@A{BU|8m%g?=BR!qky*mRx0_Mmjm zs!BarSiJeqonU4b9{KCDHT$`bORjJJ&n*B7niGPq7xh1iOg|iG@A?*)P#8R2{an^L HB{Ts5IUxkx literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/left/left_0.png b/PyGame/assets/graphics/player/left/left_0.png new file mode 100644 index 0000000000000000000000000000000000000000..dafb10b124c49dba4fad0a8f95d80189e208d36a GIT binary patch literal 609 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVAAk(aSW-L^LF-LFJ?!9GO>rx$ySu4+`~Tm@#yju6+37dcYw4pSp7}InLjzmLtVMq7PJN8Y(z*7#^GK-intleb@Rsa`8H+E!47{-aFW25TG4ecLV|Iq# zhgXQ_IY?*==j8w^ZR0h}@1D~jS;BZNbMlsaT-+d1ssz1s5Hzo_%eyT1w^U=z5|;Pu4TF*w9B`__86NCL0M zwDpd+i`$l1g<4w9ZVP@p@7UzS%Od0%!6yCa)Lb|HsO`a}GsRY(n|j#$XmQVElLNmv z5|}wM9FDGMOgfjZH{nQ7XaR}|cj2$nx$dv1Br%=^sy5<%9eeyVS_ zcK?0p-^6a-%=-IN*l%?^{Xbk8SXGD#(15yVr=2tFbJDqcGUq*y^Pib7 z(JTJ2xQTHCBa6ubp`W%7-o4`47OgH4{zUX|(KoIFek0R4g2xU^E%?nl5gJ16k1gUC XZl2m#!=vg7Ogapnu6{1-oD!MUd)anZRM^T z1eEWs;?-p7RB$}v$6?nhW@aW9wy3rBfpmmMSS8cJ;~Y(98wI3;Gp26+$fPBf858*U zkjxz0&DO%_8!h9v-#q>2ck#LN=iaFZupG=jbbq%0q$4Z&gP#_y+od+%#hu@qhAz!p>|NX}^AJwvg9TD_n?gHJ2 z^S9oaAN|cGz$}rW;5wV}?GLw`>)1BWwAwf?X5~s}(^+{{H^iXso3h35VU6TI;X5&M z=dSE5F6z8)z4*}Q$iB}sha&* literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/left/left_2.png b/PyGame/assets/graphics/player/left/left_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e22f2ecabddc8fdb9ef09544a6125b7fcf3f2bf GIT binary patch literal 621 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU^4M^aSW-L^LDniH?yO_@%Jtp zKD4es#;qyRxxmq-MT5n@m8*_P`{1E#hr$9j8n*WKF1oM8QsbcGB*3$%RmIHC;pm}b z9a7AjD|T0J7f(-kem%GB{kQu1w6@!4=e@qNB5bwalrKk<8uKdR^>#}gRytf-zbyOL zc~8wlYyuY=yozs}47Hrs-|t>!KXFA?+gHH@AmOeuUV-8gD@(Rt+vhKw9{bw4ah~>m zrrX|g@@30>z{Pnt2r#FpA#adf@S8>x}Ou+g)zmfAOa}ryG zJYx<6BkzhU*$p#3&*o0E%&yw2$;rQO`=7#p4|YF`gi8Nd#~PO(w`A8Xb}I*I>*t4) zYFRcgvY0GbRBN~3qUF4k`%J(5d-U&^^U_1_8RH=`fA>0E*t|z6du76NHrFu!^#}AH z?cT?=j?oS*E%a;u!MV-0ng3thY}>NGUQ6-qerwIfGCkJwI!m`dkX*39^r84`p1nl9IWkrT@w*DhMViItH+CdurJ`96fZb zLyFmW$L{j&(&-7$UryV*yY_o(+9ca&OpXG3)c)M9*&A2>>TrOS?CZwwSF;NbPBylLBvqHAS# zTKC)=Bn~(*Yo3xSh~3Tf*vDYm)yz{Tf9k|&#TQIIybWfxiLmhe=^w2R9^L7;_T1FR z#fR;dMMyoUW$9q#F_~~_4Wq^La`87s*S^(78)^R7|Fr*K^ZQxPq0)8XJ6mJ#FuueYIzN^76kwdRQPKdNOC}q|Aoxb@qB80*O!T*)MlUFK}qqP<{76 zE-1zSP-SXSY)$5F3o{SPc z`-C{xO-7RmfX?Nacy+`I* zk{#0>239E-&npbO;+DNqxZ~t`fr~1S{b|T7kOzC|?@ZC0;d)^UxcYrde;4n{7Mjv%M>%$L?C zQyyP`ob6cs`Ey)JQ(c$@I5@dtxEJg_r1GTxN5bw4KSRZ(9e;mOdgFdy1nNA?MH;`D YpLtFab?H%B4NMFSp00i_>zopr0DIr}(*OVf literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/left_idle/idle_left.png b/PyGame/assets/graphics/player/left_idle/idle_left.png new file mode 100644 index 0000000000000000000000000000000000000000..dafb10b124c49dba4fad0a8f95d80189e208d36a GIT binary patch literal 609 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVAAk(aSW-L^LF-LFJ?!9GO>rx$ySu4+`~Tm@#yju6+37dcYw4pSp7}InLjzmLtVMq7PJN8Y(z*7#^GK-intleb@Rsa`8H+E!47{-aFW25TG4ecLV|Iq# zhgXQ_IY?*==j8w^ZR0h}@1D~jS;BZNbMlsaT-+d1ssz1s5Hzo_%eyT1w^U=z5|;Pu4TF*w9B`__86NCL0M zwDpd+i`$l1g<4w9ZVP@p@7UzS%Od0%!6yCa)Lb|HsO`a}GsRY(n|j#$XmQVElLNmv z5|}wM9FDGMOgfjZH{nQ7XaR}|cj2$nx$dv1Br%=^sy5<%9eeyVS_ zcK?0p-^6a-%=-IN*l%?^{Xbk8SXGD#(15yVr=2tFbJDqcGUq*y^Pib7 z(JTJ2xQTHCBa6ubp`W%7-o4`47OgH4{zUX|(KoIFek0R4g2xU^E%?nl5gJ16k1gUC XZl2m#!=vg7Ogapnu6{1-oD!M~%<@t5p-P?cfPkc6i@7Xp-Cz<1p){-Zlt`V!rFmrBBJl68?e2HvsZFW-u z14o9#QsdP}bF+Wx*w1|VXPw-`S~jrg(MoxS?4o@ZjlYzRPZxKJe$Kgv-{S#;z=ejc zjqCxdD`lYnEyqeecdqcgM{n-_wQf^{IGfO@~3ac_wS{tx9-3Cno=>JQHFs@ zDxlC#_{!B8x%MHK<*MiZcf=n^Z;A&y`{{M&gkF)h zV;-DW|GwLQZ?DDK*HHJgzOg$nZQjJVhnzd|ALKJ~g5Bcyxnb+W@`b$h$G7{xUir*? zuk{<4^KUXgm>F9dT-%;eux`Pd{q`$6KcDUT9D6oLbN>B^$nbBcKiDx_FtC^`NUHG{ zDB2w!^hz%Fp7^b8k4xtzz2^L*tI){o;J~bPsg_}l!-)X=Un>;G2($B%R%*5dNUmkMkxdXQv`#jtDnm{r-UW|0b=_K literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/right/right_1.png b/PyGame/assets/graphics/player/right/right_1.png new file mode 100644 index 0000000000000000000000000000000000000000..983fbc9b4ab9eb5a680393dcf6921c1a6b9c5e84 GIT binary patch literal 521 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV7%bz;uumf=k4shUd)ant>vy8 zHW=U9aqyT@W>ZIN#^d0Q2f`7vY?>1?vlHhY+CHJdEUJTR*~STLdhJ`o!nCtuW^_OP z^X5qP;W_K2%Z#d@6}&%tCS?)>!y>i6Giw4x{=YgLv-jPXL&py)Y<-dDJFAZ0T(Iau zAqyMFg#)KjR!rah?90zXMHfESX1jb5WMF2=NH|(8>rh;@ck25=rBXn=Zov+_q|YN09n`dedYqq<1zDRXB}G60aeTLJ9dHAY~9dP4?CljW3s*M_iqgn zsbx99z$g_V7|g7(Ovdg;+|SRIyH{^3R9nFaGR7;C`GsVHa`q;!#g_Np#fAL(qyL?| zKpx49?6j_%n0e(v|tX z0(=aNyeqcsin_CHng8cxzvuq11@EOZus1ZYg#^84PVn^;cMptz^5RiU#%r6#?~I%> z3`|l1hTj;nOxHU<=X?Vdm{@h7es!hn1>t#%Ui`kh_dEmGSc&=UHv9K*zn%BaZ28~b zIRCcqk_Q+S7BEh|lHRmSYV+Icl}?L4*fCo$u$U}(^rpUX%^7i5P3!hW?l-Euba$Br zJ*j0YVBpAbXzgKlC^6l$*Jj-t{qQ4Z^Etg9FbG^|IJKVrfbjvR{|2iJA|5|I6}jyB z{~hrM(wpKTn%>wkEc$)7es{I6>3XQeq9*(ib92kB;-5QAztHxZ?Vs2Lu!BU?f^5aZ_iGi?NjCRp09d7BiOf|Zy7f{TmAZ#wM%U@Ui>x zp>y{guRGpS#So!yZ!|ee_Pucfvx5V(oTESuQ{181pH$tSY68;+gQu&X%Q~loCIIk= B`5piO literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/right/right_3.png b/PyGame/assets/graphics/player/right/right_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7a4546e26525b1d9cbcb3a6e2f08198258d63c GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV0`E4;uumf=k2V$Ud)ant>vx) zBDx~l&RmWnDjg9!I2>y@q_erblhr#~^%pGlpWwb>I_t&@P9Xs-tCxIQe&JM>Yj30E zoV}Yj3%}Bi8optD|le(KHrzYHQ*itKtAyjnE6=FBXMe>3wA zJYVvcgGXRN<5b6ZbNySF#jm=q|GYcR<%1{#GfPIo(MtIR-=BEpHkK-;Uk^Vu;}pvq zW~&1Xj8YLB&oN}$`a7mF87*K2=@(6A`x1RV_{Gc*ck=4j+y3BcU}Q4ckW?%8;nS~$ zJ?h8W_r$&b`qzggp3%Uefh}y#d6t!O+EsH;wZsY5u!2qe_-(&KBj-uwCXQ$8L2cK6`}Z3Z@u3kST+fvPlr{j)zBWfb$` zbLOP^hUTZOcU~|3yUd4UA5%gD1MeD%?~GT9r=04zyVp0h=27+3?JJGeoVz}E87D-( d#wG9zC!2Ebhjp2?)xZS6;OXk;vd$@?2>_n8@OS_K literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/right_attack/attack_right.png b/PyGame/assets/graphics/player/right_attack/attack_right.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa1657b625ba24ac9eef7dc452e0f28a6cf8b84 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU_9XI;uumf=k4shUd(|4t>vl- z3#Zy&Ws~O4ZR)te@klx&^|5e-+IxkFtmUn}zBSC%ksB^4bu3tW#A}Oq%hr9uHxhSz zPg6Vdb64u*>hp4Ge6w%*-Zb$w^bOk`d$BG4apBD1dokyZrZY+;I5ca`y>WJ_?cXii z=9c`u(Nhr5XmFr`E%eBD#x3gKtD;wlfB0d<)wgu!gMCa14UD|2Hb^F{eQvn~&i6?< zu;!}``*hBC+6-(G7Zz|?^Z)qwlecgB^k->ps9>!1qe)e5*qL%dl1G7{};CTkF>xaeFt=B$hKm0+$ z*pUtFR9P$LJ1fjWSue`T^UPno&wo9?u_F`MtfHl>md#>Z&d%+5eR3MhQK&H|=P|~d zmzP_+S_$=};CdwaTfSv*QvRb~NwEXs}_m8)pTlN3X8@Df&f6_fTKu+mjr16jO YS!nM|{jHl91EZ9|)78&qol`;+0HV~`VgLXD literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/right_idle/idle_right.png b/PyGame/assets/graphics/player/right_idle/idle_right.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8240918198526e350a5833eae08c7da50d6f4e GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVEpgt;uumf=k2V$Ud)aH$KShb z2;@HMmdvHA~%<@t5p-P?cfPkc6i@7Xp-Cz<1p){-Zlt`V!rFmrBBJl68?e2HvsZFW-u z14o9#QsdP}bF+Wx*w1|VXPw-`S~jrg(MoxS?4o@ZjlYzRPZxKJe$Kgv-{S#;z=ejc zjqCxdD`lYnEyqeecdqcgM{n-_wQf^{IGfO@~3ac_wS{tx9-3Cno=>JQHFs@ zDxlC#_{!B8x%MHK<*MiZcf=n^Z;A&y`{{M&gkF)h zV;-DW|GwLQZ?DDK*HHJgzOg$nZQjJVhnzd|ALKJ~g5Bcyxnb+W@`b$h$G7{xUir*? zuk{<4^KUXgm>F9dT-%;eux`Pd{q`$6KcDUT9D6oLbN>B^$nbBcKiDx_FtC^`NUHG{ zDB2w!^hz%Fp7^b8k4xtzz2^L*tI){o;J~bPsg_}l!-)X=Un>;G2($B%R%*5dNUmkMkxdXQv`#jtDnm{r-UW|0b=_K literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/up/up_0.png b/PyGame/assets/graphics/player/up/up_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d0dae1ca9faffc2c339c192fc954150df471af12 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV4UOW;uumf=k2V$Ud(|4t@$bm z%4{OiyqU=hJC-*2C#e5mXxjS2VPE6k)?5ea*%OZCs^04OX14poyogrzBTooZ1aYveI0+zx#zamS;NjqZQc>8z|3Ld@G@Fl|NEcQFK#ToK3g*G zR+`Tbz6p#hQVVqEFt4$#H(s$)?1Rbdw5{gChsqmx6fQ6v-6O7H{P4?%jw;7{J{4W-t-^T8>oc5C<0KsxFm{0~b7d3AXix$k?gvW(`^_&vu< VHeKMKA`gr%22WQ%mvv4FO#pQs#lQdn literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/up/up_1.png b/PyGame/assets/graphics/player/up/up_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0de88871cbd889f5ecd56a28f47cbb56316f29 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVBFy8;uumf=k4sheuoW2T7^S8 z1v}?!igGjSG(=Rg%xDx(aO>b*sVpSze?fc!|A7NtM~*P*7;KozdGOpN1xJS)hYBC5 z*|PtvnVoHFXSeJ7slK@;nkPQn{5W?*C_Z)aIn80yBq+!^;}} zyyt(;J~|e$i!aS>?YYy}q@#ov^)pC1EMW9{T6*BwE32)z-0Zd{zyP zmOw4b2?i$KfTrt=X8WW9x3~GMdgda}Xw=}qECRBui$~!CgDXgj63AUEYs_}cSsUR0 z%pU(wOi^l^Aomg6)ylgy>K1#ymRH=rMa?qx31c~KluHg`_n(`!TkFnZb4q3+1aNV zx2qm0WVArNAoS<$hr)b$tv_FuoyogrzBTooZ1aYveI0+zx#zamS;NjqZQc>8z|3Ld@G@Fl|NEcQFK#ToK3g*G zR+`Tbz6p#hQVVqEFt4$#H(s$)?1Rbdw5{gChsqmx6fQ6v-6O7H{P4?%jw;7{J{4W-t-^T8>oc5C<0KsxFm{0~b7d3AXix$k?gvW(`^_&vu< VHeKMKA`gr%22WQ%mvv4FO#pQs#lQdn literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/up/up_3.png b/PyGame/assets/graphics/player/up/up_3.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ebf56172451f4ec57d6f9cfda6eed546e5ee0c GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU_9jM;uumf=k2V$UPl~6TGf>z zxc-Gi=ICtsz#e^2{6bW1<675k!aA(h9~r-~Ub%ND?7}g(+&hQzk{|o$Zx%G+C{~<& za>vJcspqcqdX}BHy|c4=bGcCPgy%a84R2@d%nx|B^}hcr4Ub9lZy%q~{EI(>p@A** z*y(*S?|$yyxz+yVo!K%bQp>Nrjuu{YoB*56(jH?T2e1T6g$yFl-~{QPUemxG0`?RvE<<;MJQw=a?o%nT+g zgkqSV$X!v}qUJK6(S*UFS=?UIPJ0sYW%iIJ^Sp<1V&zl3k$l+elun333x%RepKuB;%CnB zmBpJsGl}{J2pe#-?Z9wmerkP QV5Bm5y85}Sb4q9e0Izo1$p8QV literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/up_attack/attack_up.png b/PyGame/assets/graphics/player/up_attack/attack_up.png new file mode 100644 index 0000000000000000000000000000000000000000..d165d7cf191924aaa4257f99f6fbe8abe247debb GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVBG8J;uumf=k08JZx%y=qs5yN zG&RhsZgk9Pt=|xQP(MMxu5tC#4Z=s9Sau&i_e@ILv3h@l0+-qH-lXcVMSFX*=SF&P z?EJd7_}TT=33sO-Ka*p2Gj~er%b*!~W_uZrzve!8(fxaV-0x(A43)bZ(vHnIqF}(x zVdBtvjbY~JoF~^rz6vI=31l<`otS-kPW_zd)0eiJe++*8XUV-QvliGfonc_&4VZMD zarWueSA=&}zpH*5;Ts^&n8wh^rZH8@Aj?u-IZXJ9dxNCI0!FW=u?kbqug}jva^=a6 z>wRCn+iLepyiz{Eqi}&ibtl^i8JEe?aJAp89E4U2t~6cpZq{O`HC;D;+uts(zpgTe~DWM4fuN~gU literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/player/up_idle/idle_up.png b/PyGame/assets/graphics/player/up_idle/idle_up.png new file mode 100644 index 0000000000000000000000000000000000000000..d0dae1ca9faffc2c339c192fc954150df471af12 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV4UOW;uumf=k2V$Ud(|4t@$bm z%4{OiyqU=hJC-*2C#e5mXxjS2VPE6k)?5ea*%OZCs^04OX14poyogrzBTooZ1aYveI0+zx#zamS;NjqZQc>8z|3Ld@G@Fl|NEcQFK#ToK3g*G zR+`Tbz6p#hQVVqEFt4$#H(s$)?1Rbdw5{gChsqmx6fQ6v-6O7H{P4?%jw;7{J{4W-t-^T8>oc5C<0KsxFm{0~b7d3AXix$k?gvW(`^_&vu< VHeKMKA`gr%22WQ%mvv4FO#pQs#lQdn literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/tilemap/Floor.png b/PyGame/assets/graphics/tilemap/Floor.png new file mode 100644 index 0000000000000000000000000000000000000000..2971cddfcbf4c46446281d276446bc04da99bb36 GIT binary patch literal 50779 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 Sy(zc2^}weG_c1<>KL20IQyo75 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/tilemap/ground.png b/PyGame/assets/graphics/tilemap/ground.png new file mode 100644 index 0000000000000000000000000000000000000000..548b57fd676078bc2c8e97e5c6b84812cf2afa14 GIT binary patch literal 182250 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 literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/axe/full.png b/PyGame/assets/graphics/weapons/axe/full.png new file mode 100644 index 0000000000000000000000000000000000000000..99f0318f0097851d202db08952d67d9e549d7e12 GIT binary patch literal 297 zcmV+^0oMMBP)0|JX9L6YFG2rwuV4}eA@P!JS?%<&M1ZpAehZiHli zUDKxdwxrqJocBHpMYAY^4ezpap?<4w&C}rk12({V;PZMH_0!`b^67Ath5FmQj>tEM zeeeb8dHMkW1J>Y1p8J@AI$pQ4$R~rD$hXI}$Xnfh)O`H_fB~llR~>)>|9a{4QdxDt zfWHM>ho9KPite}S$xmy5YY&dSgzB)sR#bj#23$L^71okkOB5S`0ap#Sexv{f{O{oT vVl3*bes;Q$Oc*(DV);Kbk$a%VS3uTMwj00000NkvXXu0mjfDxQQ? literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/axe/left.png b/PyGame/assets/graphics/weapons/axe/left.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd9b02d63501a897c36c2584cd212726ef0ca0e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yG!3HE*cI@g0Qk(@Ik;M!Q+`=Ht$S`Y;1W@pZ zr;B4qL~HV&|Nrfo?G&_>o8uX!D*is!o+@^MHQXM$;v7$_OCWlBOd9yyj&ru}WoD4-_HDmuy7?>6KMbC( KelF{r5}E*zvtYac literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/axe/right.png b/PyGame/assets/graphics/weapons/axe/right.png new file mode 100644 index 0000000000000000000000000000000000000000..72c1d42d7197769e8577f8aeccf6c65f771c570b GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yG!3HE*cI@g0Qk(@Ik;M!Q+`=Ht$S`Y;1W@p_ zr;B4qL~HV&|NrfoH623S+EjSg&$mfDqJG|G(pwXT#e4~hOBig=E!U6tn8f(}ZP))W@;3&u3+S+Guv+KOIi_v@K+)h8gPUMx=A>8OPt6h$ z**9mKF4zByR}X9a`8Lf`WKwDkj zO9$=t?cg&~ejNCNS&nHjpF}Ch-cyVv4w*X}=Dl}+-Q@V3p(&F=wx>^+&zhZqp)zopr0F6jxd;kCd literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/axe/up.png b/PyGame/assets/graphics/weapons/axe/up.png new file mode 100644 index 0000000000000000000000000000000000000000..5f49b890085aee516afc9cd50a429096087128ff GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(z!3HEV-DXt*Db50q$YKTtZeb8+WSBKa0x0;{ z)5S3)qBZ%?|Nr*Pb_!a`&EW@MtNTlQT&b?&f5N8ZK#PBoK~o_6WvLAdxECznSp9tc z!V~ZJ6wXrl`r^~&>H0@rD>zjqoM`>9qB)aS!ga|~Pp{+`4=!Fktnuf{10|7vZ?@KI z)L7<5PdanHr^o#v|4sq9QiHXOZk9e;4*rv0JT+OFIZZ&KNYUn1LKJh?WrHfqo_T4U zCns~Y#c=dn&A8SexYyr3>$m9Mb?)K*9`hztE`FO>)vWkDp{HoZl|q&v#wsb*6niU} p2~D}2PMKX-O#DvRIKf=SVDK(zq2S}(OF-{3c)I$ztaD0e0sw2`cyIs! literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/lance/down.png b/PyGame/assets/graphics/weapons/lance/down.png new file mode 100644 index 0000000000000000000000000000000000000000..f58aebac68444298bf790948109a59757d139220 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^5{{uM4tcv literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/lance/full.png b/PyGame/assets/graphics/weapons/lance/full.png new file mode 100644 index 0000000000000000000000000000000000000000..76ce17037a776595a1c1a86058c65a1bc4688140 GIT binary patch literal 422 zcmV;X0a^ZuP)Ff~;Z1EOaa{+DF1JLPs0~)vpv|5Q5h)LL&`LpcP7ZZj7mYIKE zhHUfYCAYnDVqZB4ck8xBWp79H7i;+ zQ5UU?)BjRp+kbP0l+XkKls9V` literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/lance/right.png b/PyGame/assets/graphics/weapons/lance/right.png new file mode 100644 index 0000000000000000000000000000000000000000..af7fd12d3009d9efc64d9efb0f250e66be47247f GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^4nQoy!3HF~w)}PhQk(@Ik;M!Q+`=Ht$S`Y;1W@p# zr;B4qL~HV&|Nrd|7cea{GE%AR=nUhN)Jia6V7tZ0%o_nDmpqGfO8E7uwc@F<^5eiC z%667?u+f+AK@cW?4dd5!y?dbgYqN*^-Fk-Prpu)LUoQu$yfm8IMM`ytYP_ zw0WVR_<m=aIq+&a1;ocWt3cPKmg%z~`3vQNF z?S)N`EN?EB@a8(!O(AoVKhZWAL4yQ{Z#U|WZ?w}wm)Bt9a9R}jE+kk_3p1fXezj2K zv(zJeDlP#GA>>nfJcUw7R+2CBGL$6|YN8|q2n|^^WXSg~ftmA6%UH_I^^LKwv``HK z*AT^4s}*l4aq3k>N!N7|%Aza-h5&xY2~Zn2{?vdWM||wrZeUY~4;fLJZUkw8N$vU2 za3fmB@5hNnOl%`pl;SY-sS7l5gmX8%de^v#MN%gX;sid!N)gtr(t!F^`WWhH`4Iyw zwuM4uW2BZwBQoI!vrXnkKOiH~eyQUUaf$eJ!^32@$z)E2-nd5ABPgI=iPHKYQ^kQ~ zUY6r3e{{umOxp5a7}`K`C?IJe%o>m&ko1xS4X7Hbb{t9uggt11nzq#$2~8Pt@)0Pj z850F)SFni$$yFU_Cg^RwBc zq$iU=j!Rv+g@TcH`~W$azjqu=iW$d0@{)2=gHo~#kg6&Gk^}_EOvpfyEGeNW3XySQpyp-IW+xKW zhgm~aW~d61ltPj^C@UreW`gnPDJuz(rDzaqrlz7)SoYmYG8Sx~<+#&7NXz84{-|#A z-QqD24i80Iz+p8IQ|M3IqvG)-mizl#Rl-RBqe^<#eQE_Qw!#T($p4dOs|} zM(wdS{U9?{WG()qd~T++`Uc*4_%O5gB!6t`!r55thE|JxGkN9t_Prf-;=y)m@kbRZ z^7-3)o&yIjzW4sk8>h$i|F9?6dp6VgTC06^eP8zO)~!nu6XV`@pB~+rUwP)*{qJA- z`R%o7GWO>AV@Lj+ymH~ryO)c9T0|~YZiWV@Y X)v`_$-6Ee0bO3{=tDnm{r-UW|#F9El literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/rapier/full.png b/PyGame/assets/graphics/weapons/rapier/full.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f283505a7e5d08ac26425b3010b67c36073923 GIT binary patch literal 271 zcmV+q0r38bP)Ep$R5M0j8t4eJ6?K+>bp9cug3cBv(`r+X002ovPDHLkV1j7#b-@4t literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/rapier/left.png b/PyGame/assets/graphics/weapons/rapier/left.png new file mode 100644 index 0000000000000000000000000000000000000000..31f5b8bd7a5e1da9e1118ccb6ea440d05386a6ef GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(#!3HEhUB8h7q&N#aB8wRqxP?KOkzv*x383Hx zPZ!6Kh}O3=47nN%cwE<(l$Lzf(wleua)t;DMC(L5|cl$_!{QL=Q zu^bC8EqS|Z$$?6lcRyoJzxu=9vh?Fl{w21%*WZ3!ySe9NRWYY?#H=^AJ_~J6C+a0~ zct7^Kt$Hrg$hu`b1VkBox#)9&t;ucLK6Tu`Dk7M literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/rapier/right.png b/PyGame/assets/graphics/weapons/rapier/right.png new file mode 100644 index 0000000000000000000000000000000000000000..30910a2745007c6091e5e7589400f07767a51bd0 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(#!3HEhUB8h7q&N#aB8wRqxP?KOkzv*x383IP zPZ!6Kh}Psk|Nq-F8wpIE=qT#Iynen-;t_TK>;onfrcGvcll93y&@?YC-oMBx@WahA zE-raz+qsv&OyGVP$bMOBgFw)MYKwNccM4KGI|bxQ4c0O~{=ao&#cjStmA?aiEY9T= zI=G@alb2)K;TH`7)iZA~*q(fAJvHYJ)BhZ~hk%k}DHVw0;2D!6477zdrZP SR3o6z7(8A5T-G@yGywqkENPAa literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/rapier/up.png b/PyGame/assets/graphics/weapons/rapier/up.png new file mode 100644 index 0000000000000000000000000000000000000000..5839792fd07158ebaf1a1ec8c995f50f9b3a1af2 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8m!3Giumih{$I14-?iy0WWg+Z8+Vb&Z8px|*& z7srr@*0(b@@-`a?xIXSMi(T=7<))(VvrY*%L;qPk4(>Bg#h&7MaOIyzO{Cot?SHQi z+^Djuox9Qb+|LwG`Q(ic%$Eij|If)vZfKE+ea$rcj8FgH!bzItqLT!iop?A6XZ;rV zwEO&rXJMxIV_Q{@On`{095J|mTJL@OFIpGyWWT?Gf`E zZJp#_%k8AfogP~8?EY?j?aSlU7032HTjwN{#Ik4kvg($v^)8w`VpIn>g)X zKmYgJtqT*JUR^w!F0pmOJF#_kTiR7@vK0U7s-!S(ed?|&^GB?%>Z>4Yf0Rc(H)rO8 zszs7pCnRxuu5IA7?09ARZ$+z0w8sg?79Ew8dn;PMY@aZJ+2g8xmf}@i76$c5-j$tE SI_W^G89ZJ6T-G@yGywoBQ9ITE literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/sai/full.png b/PyGame/assets/graphics/weapons/sai/full.png new file mode 100644 index 0000000000000000000000000000000000000000..6f752d6e8237ba3e1a2a41b17f0bae9a2c84532d GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^GC*v?!3HE}eu_8`qz-txIEF+VPX6=%zdf_2Lx>xj z>*3ex{t})S&s$_E-qm&4{@~uvY>iJ|ZBaZ+EE29b-HPtWW3*C8QM7U>Kd_?p%Ju-4 zD5;}OFHegv$~e)}ldj-8Z$h)1?vlN&EhYi476fu<<|{5`>x=TJ=jIf>_kvA;>4n&Y znCPA;k5cZ7j$1dGa_#^6F7Vd1AB)9;avsJpdrlJS{oML|u^8Wm))p({79rlN)&4-a xyG~zRTr?*3L|J4#T+uou+QO>F@`Wx7!<~npEuQQRX$1O(!PC{xWt~$(697PFW10W} literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/sai/left.png b/PyGame/assets/graphics/weapons/sai/left.png new file mode 100644 index 0000000000000000000000000000000000000000..c9847e2a999c57861822d0bdb68ef0e23bc67fe3 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ew!3HE54((L}lAHw|k;M!Q+`=Ht$S`Y;1W<5- zr;B5VM`!Y%|NrfoH623S+EjSg&$mfDqJG|G(pwXT#e4~hOBig=y`Q_kO=Tg z)5S5wqci!>|Nr*Pb_!a`&GC#<6@Q;_Dr>%)=@IC|ZSaag%&E|(_NUVxwjJ3s7JayQ zR(XmVn+=Pb>;VlW-Cm*e7lrdACH+IWFJ3;<(0*VAbHu8tYd>l!gzzn3{!+v!yI{I7 zvmDc6J_%iRH`#`XY!?`-W;vXHZk<2J?cw6(GcSHSu%MjbamN0HBi0NIPn(Puh(yij P1i9MN)z4*}Q$iB}2xdtl literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/sai/up.png b/PyGame/assets/graphics/weapons/sai/up.png new file mode 100644 index 0000000000000000000000000000000000000000..366e70b3059549a7cb287372f4a773314d9cb752 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NqxDb50q$YKTtZeb8+WSBKa0w}o9 z)5S5wqci!>|Nr*PnhqguY_5l2tNTlMUOewIDK~`S@O>vSC$0;R-`x9|UGbFj=*tiM zmm2$>zgQ@W3Upn5D8J-Ozq8X%pOXRHt@}S8%iP1}7r#%SwLkA4NZtANmPZ`|1=kIZ zYTN&5E_v{HLXd+7FVBC4rMp{uUc3$ZvWb6hjtYyB^5eiCi@z$KWjtu%!hZGCHH|;l icDsL!GLULFVP|;gYu+i^{HX%ySO!m5KbLh*2~7a#WL^sZ literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/sword/down.png b/PyGame/assets/graphics/weapons/sword/down.png new file mode 100644 index 0000000000000000000000000000000000000000..ebcfa93eb037296e552f4600f549fa90ea0ec8f5 GIT binary patch literal 1757 zcmbVNOKjXk7~WK*YP$pu^pN&sTn=gJ*kiBPyB@kt(%n2(Vnaw*Y7!1~c4oY5cI`2? zlidVFqaZ4Qkg6gT36xV2s6uLQIU$6^p`z*mA%z16P%AiaK~%lvz+=2G(l&jF)!H7< zeDnR^|CrzJ&(2H@9XNa-kw^>`rweo9IV`T@`}T_axs6s{Jofw33t=LWd@jBQ5}$4e z#Nb`0JRi-MUPgqw3Z}fml$PrYbRuzLwB=(`XOUE4RmaQ8e}46iEIBkMpGlWs$oNCL-?9PUXmBd+kJC?^Z49Uol3 zPwR!Je<^6RjZ>ns26LGgg#xSfv3`w5Jgo7DQ1_SbF(6`F zD)nvbs>OBtCc1Ajkm_mm2BGeFs9cYPD$6k2=s%a>d7XN#o zqGl+L@MFQ0Ae#p+77jZut}@m4sKY&=svMw^Tw!FO0B9Sh0|kMQ{|yp(rCto@8tWY$HuTh8YxKMk~Oex>gW%>chl`c=^%N zpDdLfO%F)FziR)F^ln&44SQ84TC6I^&Zu!O>Lf+IKVR*&9et|@7tJsp_S>*{={Iub z3F<(!>BYqL&qa&BSS*Z}=ieg-FMj;@_iImmdFkq*k%6nt3zzR4ngY^K>tFBv=-|Sw zw{LG>8GK>!&Of6cY(ITj*GKkTN*`?vHTWm*etYh(-}e7{WpHcr)-T)jk-IPPjmg{9 z$?F#u$4K%E_4V)8p8arf?5*Vaca9z2JiE32YV!PNgTIg6n5}Q^IriGxGy4{@Zw&ka hB>FrW-dv-}#E(B*8~*v^&3gO+Do)H4uAMr&{x8f~Gl2jA literal 0 HcmV?d00001 diff --git a/PyGame/assets/graphics/weapons/sword/full.png b/PyGame/assets/graphics/weapons/sword/full.png new file mode 100644 index 0000000000000000000000000000000000000000..3b395d801d768b58d41df21f8ac91901f8779e07 GIT binary patch literal 251 zcmVXNdFf2d^=oWg1 zxuVE#UA24E0yNNtpTHmwDh1##Cr`SQTY2lE1~d5lLW27kaI8#y1>2j z*YIlCdE+!y9q{PtVN`)FTk)zNO%k*QLoW@#e)5D7SpdB*M^Dr48m1&!fS%^j_0L96 z!vw%+lAtvh`sFa8G)-&Zg4UKm2ct=X)?nzhhe!K#GzOy%rYT@xU;qH=3?`9B`;LPE O00007P)i^|C0P2=qiYrhtKg0RT)%S> zv6J{EX3*u~y?Bf3cPWpclm(w#pKJWNXraJi@af>b^IjrSmQw6X7}(g@7^I&o@ZB$Z Ry%6YF22WQ%mvv4FO#rPjOyU3l literal 0 HcmV?d00001 diff --git a/PyGame/assets/map/Entities.csv b/PyGame/assets/map/Entities.csv new file mode 100644 index 0000000..5923096 --- /dev/null +++ b/PyGame/assets/map/Entities.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,392,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,391,-1,-1,-1,391,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,391,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,391,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,392,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 diff --git a/PyGame/assets/map/FloorBlocks.csv b/PyGame/assets/map/FloorBlocks.csv new file mode 100644 index 0000000..a59ba69 --- /dev/null +++ b/PyGame/assets/map/FloorBlocks.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,395,395,395,395,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,395,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,700,-1,395,-1,-1,-1 +-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,395,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,395,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,395,395,395,395,395,395,395,-1,-1,395,395,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,395,-1,-1,395,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,395,395,395,395,395,395,395,395,395,395,395,395,395,-1,-1,395,395,395,395,395,395,395,395,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,395,395,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,395,395,395,395,-1,-1,-1,-1,395,395,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,395,-1,-1,395,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,-1,-1,395,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,395,-1,-1,395,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,395,395,395,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,395,395,395,395,395,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,395,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,395,395,395,395,395,395,395,395,395,-1,395,395,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,600 diff --git a/PyGame/assets/map/Grass.csv b/PyGame/assets/map/Grass.csv new file mode 100644 index 0000000..c29bae0 --- /dev/null +++ b/PyGame/assets/map/Grass.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,10,8,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,9,9,8,10,10,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,8,10,9,10,10,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,8,-1,10,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,10,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,9,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,8,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,10,9,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,10,9,8,-1,9,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,9,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,10,-1,-1,8,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,10,9,9,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,8,10,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,9,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,9,-1,-1,10,9,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,8,-1,9,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,9,8,10,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,8,8,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,9,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,8,-1,10,9,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 diff --git a/PyGame/assets/map/Objects.csv b/PyGame/assets/map/Objects.csv new file mode 100644 index 0000000..0157972 --- /dev/null +++ b/PyGame/assets/map/Objects.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,19,-1,-1,-1,-1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,-1,-1,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,14,5,-1,-1,-1,-1,10,-1,-1,-1,-1,14,-1,2,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,4,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,2,-1,-1,-1,-1,2,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,8,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,15,-1,12,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,13,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 diff --git a/PyGame/camera.py b/PyGame/camera.py new file mode 100644 index 0000000..19999fa --- /dev/null +++ b/PyGame/camera.py @@ -0,0 +1,67 @@ +import os +import pygame + +from utils.resource_loader import import_assets + + +class Camera(pygame.sprite.Group): + + def __init__(self): + super().__init__() + + # General Setup + self.display_surface = pygame.display.get_surface() + self.display_size = self.display_surface.get_size() + + self.floor_surf = pygame.image.load( + import_assets( + os.path.join('graphics', + 'tilemap', + 'ground.png') + ) + ).convert() + + self.floor_rect = self.floor_surf.get_rect(topleft=(0, 0)) + + self.calculate_scale() + + def calculate_scale(self): + map_width, map_height = self.floor_rect.size + screen_width, screen_height = self.display_size + + # Calculating the scale to fit the map on the screen + self.scale = min(screen_width / map_width, screen_height / map_height) + self.scaled_floor_surf = pygame.transform.scale(self.floor_surf, + (int(map_width * self.scale), + int(map_height * self.scale))) + self.scaled_floor_rect = self.scaled_floor_surf.get_rect() + + def custom_draw(self): + # Drawing the scaled floor + self.display_surface.blit( + self.scaled_floor_surf, self.scaled_floor_rect.topleft) + + for sprite in sorted(self.sprites(), key=lambda sprite: sprite.rect.centery if not hasattr(sprite, 'animation') else sprite.animation.rect.centery): + # Check for sprites with 'animation' attribute + if hasattr(sprite, 'animation'): + scaled_sprite_image = pygame.transform.scale(sprite.animation.image, + (int(sprite.animation.rect.width * self.scale), + int(sprite.animation.rect.height * self.scale))) + scaled_position = (int(sprite.animation.rect.x * self.scale), + int(sprite.animation.rect.y * self.scale)) + for sprite in sorted(self.sprites(), key=lambda sprite: sprite.rect.centery if not hasattr(sprite, 'animation') else sprite.animation.rect.centery): + # Check for sprites with 'animation' attribute + if hasattr(sprite, 'animation'): + scaled_sprite_image = pygame.transform.scale(sprite.animation.image, + (int(sprite.animation.rect.width * self.scale), + int(sprite.animation.rect.height * self.scale))) + scaled_position = (int(sprite.animation.rect.x * self.scale), + int(sprite.animation.rect.y * self.scale)) + else: + scaled_sprite_image = pygame.transform.scale(sprite.image, + (int(sprite.rect.width * self.scale), + int(sprite.rect.height * self.scale))) + scaled_position = (int(sprite.rect.x * self.scale), + int(sprite.rect.y * self.scale)) + + self.display_surface.blit(scaled_sprite_image, scaled_position) diff --git a/PyGame/config/__init__.py b/PyGame/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/config/game/__init__.py b/PyGame/config/game/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/config/game/monster_config.py b/PyGame/config/game/monster_config.py new file mode 100644 index 0000000..56f5d37 --- /dev/null +++ b/PyGame/config/game/monster_config.py @@ -0,0 +1,41 @@ +monster_data = { + 'squid': {'id': 1, + 'health': 1, + 'exp': 10, + 'attack': 2, + 'attack_type': 'slash', + 'speed': 3, + 'knockback': 20, + 'attack_radius': 100, + 'notice_radius': 200}, + + 'raccoon': {'id': 2, + 'health': 1, + 'exp': 25, + 'attack':5, + 'attack_type': 'claw', + 'speed': 2, + 'knockback': 10, + 'attack_radius': 100, + 'notice_radius': 180}, + + 'spirit': {'id': 3, + 'health': 1, + 'exp': 11, + 'attack': 2, + 'attack_type': 'thunder', + 'speed': 4, + 'knockback': 20, + 'attack_radius': 100, + 'notice_radius': 220}, + + 'bamboo': {'id': 4, + 'health': 1, + 'exp': 9, + 'attack': 1, + 'attack_type': 'leaf_attack', + 'speed': 3, + 'knockback': 20, + 'attack_radius': 100, + 'notice_radius': 300} +} diff --git a/PyGame/config/game/player_config.py b/PyGame/config/game/player_config.py new file mode 100644 index 0000000..b7ccdea --- /dev/null +++ b/PyGame/config/game/player_config.py @@ -0,0 +1,51 @@ +tank_stats = { + 'role_id': 1, + 'health': 150, + 'energy': 70, + 'attack': 10, + 'magic': 5, + 'speed': 5 +} + +mage_stats = { + 'role_id': 2, + 'health': 70, + 'energy': 80, + 'attack': 7, + 'magic': 6, + 'speed': 5 +} + +warrior_stats = { + 'role_id': 3, + 'health': 100, + 'energy': 60, + 'attack': 12, + 'magic': 4, + 'speed': 5 +} + +base_stats = { + 'role_id': 0, + 'health': 150, + 'energy': 70, + 'attack': 10, + 'magic': 5, + 'speed': 5 +} + +max_stats = { + 'health': 300, + 'energy': 150, + 'attack': 20, + 'magic': 10, + 'speed': 10 +} + +upgrade_costs = { + 'health': 100, + 'energy': 100, + 'attack': 100, + 'magic': 100, + 'speed': 100 +} diff --git a/PyGame/config/game/spell_config.py b/PyGame/config/game/spell_config.py new file mode 100644 index 0000000..3f74a9d --- /dev/null +++ b/PyGame/config/game/spell_config.py @@ -0,0 +1,22 @@ +import os + +from utils.resource_loader import import_assets + + +magic_data = { + 'flame': {'strength': 5, 'cost': .020, 'graphic': import_assets( + os.path.join('graphics', + 'particles', + 'flame', + 'fire.png') + ) + }, + + 'heal': {'strength': 20, 'cost': .010, 'graphic': import_assets( + os.path.join('graphics', + 'particles', + 'heal', + 'heal.png') + ) + } +} diff --git a/PyGame/config/game/weapon_config.py b/PyGame/config/game/weapon_config.py new file mode 100644 index 0000000..3eb1b42 --- /dev/null +++ b/PyGame/config/game/weapon_config.py @@ -0,0 +1,43 @@ +import os + +from utils.resource_loader import import_assets + + +weapon_data = { + 'sword': {'cooldown': 100, 'damage': 15, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'sword', + 'full.png') + ) + }, + + 'lance': {'cooldown': 400, 'damage': 30, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'lance', + 'full.png') + ) + }, + 'axe': {'cooldown': 300, 'damage': 20, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'axe', + 'full.png') + ) + }, + 'rapier': {'cooldown': 50, 'damage': 8, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'rapier', + 'full.png') + ) + }, + 'sai': {'cooldown': 80, 'damage': 10, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'sai', + 'full.png') + ) + }, +} diff --git a/PyGame/config/system/window.py b/PyGame/config/system/window.py new file mode 100644 index 0000000..5a59b22 --- /dev/null +++ b/PyGame/config/system/window.py @@ -0,0 +1,15 @@ +# game setup +WIDTH = 1280 +HEIGHT = 720 +FPS = 1000 +TILESIZE = 64 +HITBOX_OFFSET = { + 'player': (-6, -26), + 'camera': (-50, -50), + 'object': (0, -40), + 'grass': (0, -10), + 'invisible': (0, 0) +} + +# general colors +WATER_COLOR = '#71ddee' diff --git a/PyGame/effects/__init__.py b/PyGame/effects/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/effects/magic_effects.py b/PyGame/effects/magic_effects.py new file mode 100644 index 0000000..a87a0ac --- /dev/null +++ b/PyGame/effects/magic_effects.py @@ -0,0 +1,57 @@ +import pygame +from random import randint + +from config.system.window import TILESIZE + + +class MagicPlayer: + def __init__(self, animation_player): + self.animation_player = animation_player + + def heal(self, player, strength, cost, groups): + if player.energy >= cost: + self.sounds['heal'].play() + player.health += strength + player.energy -= cost + if player.health >= player.stats['health']: + player.health = player.stats['health'] + self.animation_player.generate_particles( + 'aura', + player.rect.center, + groups) + + self.animation_player.generate_particles( + 'heal', + player.rect.center + pygame.math.Vector2(0, -50), + groups) + + def flame(self, player, cost, groups): + if player.energy >= cost: + player.energy -= cost + + if player.status.split('_')[0] == 'right': + direction = pygame.math.Vector2(1, 0) + elif player.status.split('_')[0] == 'left': + direction = pygame.math.Vector2(-1, 0) + elif player.status.split('_')[0] == 'up': + direction = pygame.math.Vector2(0, -1) + else: + direction = pygame.math.Vector2(0, 1) + + for i in range(1, 6): + if direction.x: + offset_x = direction.x * i * TILESIZE + x = player.rect.centerx + offset_x + \ + randint(-TILESIZE // 3, TILESIZE // 3) + y = player.rect.centery + \ + randint(-TILESIZE // 3, TILESIZE // 3) + self.animation_player.generate_particles( + 'flame', (x, y), groups) + else: + offset_y = direction.y * i * TILESIZE + x = player.rect.centerx + \ + randint(-TILESIZE // 3, TILESIZE // 3) + y = player.rect.centery + offset_y + \ + randint(-TILESIZE // 3, TILESIZE // 3) + self.animation_player.generate_particles( + 'flame', (x, y), groups) diff --git a/PyGame/effects/particle_effects.py b/PyGame/effects/particle_effects.py new file mode 100644 index 0000000..2faed8f --- /dev/null +++ b/PyGame/effects/particle_effects.py @@ -0,0 +1,160 @@ +import os +import pygame + +from utils.resource_loader import import_folder +from random import choice + + +class AnimationPlayer: + def __init__(self): + + self.frames = { + # Spells + 'flame': import_folder(os.path.join('graphics', + 'particles', + 'flame', + 'frames')), + + 'aura': import_folder(os.path.join('graphics', + 'particles', + 'aura')), + + 'heal': import_folder(os.path.join('graphics', + 'particles', + 'heal', + 'frames')), + + # Attacks + 'claw': import_folder(os.path.join('graphics', + 'particles', + 'claw')), + + 'slash': import_folder(os.path.join('graphics', + 'particles', + 'slash')), + + 'sparkle': import_folder(os.path.join('graphics', + 'particles', + 'sparkle')), + + 'leaf_attack': import_folder(os.path.join('graphics', + 'particles', + 'leaf_attack')), + 'thunder': import_folder(os.path.join('graphics', + 'particles', + 'thunder')), + + # Monster Deaths + 'squid': import_folder(os.path.join('graphics', + 'particles', + 'smoke_orange')), + + 'raccoon': import_folder(os.path.join('graphics', + 'particles', + 'raccoon')), + + 'spirit': import_folder(os.path.join('graphics', + 'particles', + 'nova')), + + 'bamboo': import_folder(os.path.join('graphics', + 'particles', + 'bamboo')), + + # Leafs + 'leaf': ( + import_folder(os.path.join('graphics', + 'particles', + 'leaf1')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf2')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf3')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf4')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf5')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf6')), + + self.reflect_images( + import_folder(os.path.join('graphics', + 'particles', + 'leaf1'))), + + self.reflect_images( + import_folder(os.path.join('graphics', + 'particles', + 'leaf2'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf3'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf4'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf5'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf6'))) + ) + } + + def reflect_images(self, frames): + new_frames = [] + for frame in frames: + flipped_frame = pygame.transform.flip(frame, True, False) + new_frames.append(flipped_frame) + return new_frames + + def create_grass_particles(self, position, groups): + animation_frames = choice(self.frames['leaf']) + ParticleEffect(position, animation_frames, groups) + + def generate_particles(self, animation_type, position, groups): + animation_frames = self.frames[animation_type] + ParticleEffect(position, animation_frames, groups) + + +class ParticleEffect(pygame.sprite.Sprite): + def __init__(self, position, animation_frames, groups): + super().__init__(groups) + self.frame_index = 0 + self.animation_speed = 0.15 + self.frames = animation_frames + self.image = self.frames[self.frame_index] + self.rect = self.image.get_rect(center=position) + self.sprite_type = 'magic' + + def animate(self): + self.frame_index += self.animation_speed + if self.frame_index >= len(self.frames): + self.kill() + else: + self.image = self.frames[int(self.frame_index)] + + def update(self): + self.animate() diff --git a/PyGame/effects/weapon_effects.py b/PyGame/effects/weapon_effects.py new file mode 100644 index 0000000..f7febf2 --- /dev/null +++ b/PyGame/effects/weapon_effects.py @@ -0,0 +1,35 @@ +import os +import pygame + +from utils.resource_loader import import_assets + + +class Weapon(pygame.sprite.Sprite): + + def __init__(self, player, groups): + super().__init__(groups) + + self.sprite_type = 'weapon' + direction = player.status.split('_')[0] + + # Graphic + self.image = pygame.image.load(import_assets(os.path.join( + 'graphics', + 'weapons', + player.weapon, + f"{direction}.png")) + ).convert_alpha() + + # Sprite Placement + if direction == 'right': + self.rect = self.image.get_rect( + midleft=player.rect.midright + pygame.math.Vector2(0, 16)) + elif direction == 'left': + self.rect = self.image.get_rect( + midright=player.rect.midleft + pygame.math.Vector2(0, 16)) + elif direction == 'down': + self.rect = self.image.get_rect( + midtop=player.rect.midbottom + pygame.math.Vector2(-10, 0)) + else: + self.rect = self.image.get_rect( + midbottom=player.rect.midtop + pygame.math.Vector2(-10, 0)) diff --git a/PyGame/entities/__init__.py b/PyGame/entities/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/entities/components/__init__.py b/PyGame/entities/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/entities/components/_input.py b/PyGame/entities/components/_input.py new file mode 100644 index 0000000..6f282c9 --- /dev/null +++ b/PyGame/entities/components/_input.py @@ -0,0 +1,173 @@ +import pygame +from random import randint, choice + +from config.game.spell_config import magic_data +from config.game.weapon_config import weapon_data +# +from .movement import MovementHandler +from .combat import CombatHandler + + +class InputHandler(MovementHandler, CombatHandler): + + def __init__(self): + + MovementHandler.__init__(self) + CombatHandler.__init__(self) + + self.status = 'down' + + # Setup Movement + self.move_cooldown = 15 + self.can_move = True + self.move_time = None + + # Setup Combat + self.attacking = False + self.attack_cooldown = 400 + self.attack_time = None + + # Setup Special Actions + self.can_rotate_weapon = True + self.weapon_rotation_time = None + self.rotate_attack_cooldown = 600 + + self.can_swap_magic = True + self.magic_swap_time = None + + # Setup Action Space + self.possible_actions = [0, 1, 2, 3, 4] + self.action = 10 + + def check_input(self, + button, + speed, + hitbox, + obstacle_sprites, + rect + ): + + if not self.attacking and self.can_move: + + self.move_time = pygame.time.get_ticks() + + # Movement Input + if self.action == 0: # keys[pygame.K_w]: + self.direction.y = -1 + self.status = 'up' + self.can_move = False + self.action = 0 + + elif self.action == 1: # keys[pygame.K_s]: + self.direction.y = 1 + self.status = 'down' + self.can_move = False + self.action = 1 + + else: + self.direction.y = 0 + + if self.action == 2: # keys[pygame.K_a]: + self.direction.x = -1 + self.status = 'left' + self.can_move = False + self.action = 2 + + elif self.action == 3: # keys[pygame.K_d]: + self.direction.x = 1 + self.status = 'right' + self.can_move = False + self.action = 3 + + else: + self.direction.x = 0 + + self.move(speed, hitbox, obstacle_sprites, rect) + + # Combat Input + if self.action == 4 and not self.attacking: # keys[pygame.K_e] + self.attacking = True + self.attack_time = pygame.time.get_ticks() + self.create_attack_sprite() + self.action = 4 + + # Magic Input + if self.action == 5: + self.attacking = True + self.attack_time = pygame.time.get_ticks() + + self.magic = list(magic_data.keys())[ + self.magic_index] + + strength = list(magic_data.values())[ + self.magic_index]['strength'] + self.stats['magic'] + + cost = list(magic_data.values())[ + self.magic_index]['cost'] + self.create_magic_sprite( + self.magic, strength, cost) + self.action = 5 + + # Rotating Weapons + if self.action == 6 and self.can_rotate_weapon: + + self.can_rotate_weapon = False + self.weapon_rotation_time = pygame.time.get_ticks() + + if self.weapon_index\ + < len(list(weapon_data.keys())) - 1: + + self.weapon_index += 1 + else: + self.weapon_index = 0 + + self.weapon = list(weapon_data.keys())[ + self.weapon_index] + self.action = 6 + + # Swap Spells + if self.action == 7 and self.can_swap_magic: + self.can_swap_magic = False + self.magic_swap_time = pygame.time.get_ticks() + if self.magic_index < len(list(magic_data.keys())) - 1: + self.magic_index += 1 + else: + self.magic_index = 0 + self.action = 7 + + def cooldowns(self, vulnerable): + current_time = pygame.time.get_ticks() + self.vulnerable = vulnerable + + if self.attacking: + if current_time - self.attack_time\ + > self.attack_cooldown\ + + weapon_data[self.weapon]['cooldown']: + + self.attacking = False + if self.current_attack: + self.delete_attack_sprite() + + if not self.can_rotate_weapon: + if current_time - self.weapon_rotation_time\ + > self.rotate_attack_cooldown: + + self.can_rotate_weapon = True + + if not self.can_swap_magic: + if current_time - self.magic_swap_time\ + > self.rotate_attack_cooldown: + + self.can_swap_magic = True + + if not vulnerable: + if current_time - self.hurt_time\ + >= self.invulnerability_duration: + + self.vulnerable = True + + if not self.can_move: + if current_time - self.move_time\ + >= self.move_cooldown: + + self.can_move = True diff --git a/PyGame/entities/components/animation.py b/PyGame/entities/components/animation.py new file mode 100644 index 0000000..d2dd0cf --- /dev/null +++ b/PyGame/entities/components/animation.py @@ -0,0 +1,97 @@ +import os +import pygame + +from math import sin + +from config.system.window import HITBOX_OFFSET + +from effects.particle_effects import AnimationPlayer + +from .stats import StatsHandler + +from utils.resource_loader import import_folder, import_assets + + +class AnimationHandler(StatsHandler): + + def __init__(self): + + self.frame_index = 0 + self.animation_speed = 0.15 + + def import_assets(self, position): + + # Import graphic assets + if self.sprite_type == 'player': + self.image = pygame.image.load( + import_assets(os.path.join('graphics', + 'player', + 'down', + 'down_0.png'))).convert_alpha() + + self.rect = self.image.get_rect(topleft=position) + self.hitbox = self.rect.inflate(HITBOX_OFFSET[self.sprite_type]) + + self.animations = { + 'up': [], 'down': [], + 'left': [], 'right': [], + 'up_idle': [], 'down_idle': [], + 'left_idle': [], 'right_idle': [], + 'up_attack': [], 'down_attack': [], + 'left_attack': [], 'right_attack': [] + } + + for animation in self.animations.keys(): + self.animations[animation]\ + = import_folder(os.path.join('graphics', + 'player', + animation + )) + + elif self.sprite_type == 'enemy': + + self.status = 'idle' + + self.animations = {'idle': [], 'move': [], 'attack': []} + + for animation in self.animations.keys(): + self.animations[animation]\ + = import_folder(os.path.join('graphics', + 'monsters', + self.name, + animation)) + + self.image = self.animations[self.status][self.frame_index] + self.rect = self.image.get_rect(topleft=position) + self.hitbox = self.rect.inflate(0, -10) + + def animate(self, status, vulnerable=True, can_attack=False): + + animation = self.animations[status] + self.frame_index += self.animation_speed + if self.frame_index >= len(animation): + if self.sprite_type == 'enemy': + if status == 'attack': + self.can_attack = False + self.frame_index = 0 + + # Set the image + self.image = animation[int(self.frame_index)] + self.rect = self.image.get_rect(center=self.hitbox.center) + + if not vulnerable: + alpha = self.wave_value() + self.image.set_alpha(alpha) + else: + self.image.set_alpha(255) + + def trigger_death_particles(self, position, particle_type, groups): + AnimationPlayer().generate_particles( + particle_type, position, groups) + + def wave_value(self): + value = sin(pygame.time.get_ticks()) + if value >= 0: + return 255 + else: + return 0 diff --git a/PyGame/entities/components/combat.py b/PyGame/entities/components/combat.py new file mode 100644 index 0000000..c1baee4 --- /dev/null +++ b/PyGame/entities/components/combat.py @@ -0,0 +1,47 @@ +from config.game.weapon_config import weapon_data +from config.game.spell_config import magic_data + +from effects.magic_effects import MagicPlayer +from effects.particle_effects import AnimationPlayer +from effects.weapon_effects import Weapon + + + + +class CombatHandler: + + def __init__(self): + + # Setup Combat + self.magic_player = MagicPlayer(AnimationPlayer()) + self.current_attack = None + + # Spell and Weapon Rotation + self.weapon_index = 0 + self.weapon = list(weapon_data.keys())[self.weapon_index] + + self.magic_index = 0 + self.magic = list(magic_data.keys())[self.magic_index] + + # Damage Timer + self.vulnerable = True + self.hurt_time = None + self.invulnerability_duration = 300 + + def create_attack_sprite(self): + self.current_attack = Weapon( + self, [self.visible_sprites, self.attack_sprites]) + + def delete_attack_sprite(self): + if self.current_attack: + self.current_attack.kill() + self.current_attack = None + + def create_magic_sprite(self, style, strength, cost): + if style == 'heal': + self.magic_player.heal(self, strength, cost, [ + self.visible_sprites]) + + if style == 'flame': + self.magic_player.flame( + self, cost, [self.visible_sprites, self.attack_sprites]) diff --git a/PyGame/entities/components/movement.py b/PyGame/entities/components/movement.py new file mode 100644 index 0000000..e50190d --- /dev/null +++ b/PyGame/entities/components/movement.py @@ -0,0 +1,40 @@ +import pygame + + +class MovementHandler: + + def __init__(self): + self.direction = pygame.math.Vector2() + + def move(self, speed, hitbox, obstacle_sprites, rect): + if self.direction.magnitude() != 0: + self.direction = self.direction.normalize() + + hitbox.x += self.direction.x * speed + self.collision('horizontal', hitbox, obstacle_sprites) + hitbox.y += self.direction.y * speed + self.collision('vertical', hitbox, obstacle_sprites) + rect.center = hitbox.center + + def collision(self, direction, hitbox, obstacle_sprites): + if direction == 'horizontal': + for sprite in obstacle_sprites: + # The following works for static obstacles only + if sprite.hitbox.colliderect(hitbox): + # Moving Right + if self.direction.x > 0: + hitbox.right = sprite.hitbox.left + # Moving Left + if self.direction.x < 0: + hitbox.left = sprite.hitbox.right + + if direction == 'vertical': + for sprite in obstacle_sprites: + # The following works for static obstacles only + if sprite.hitbox.colliderect(hitbox): + # Moving Down + if self.direction.y > 0: + hitbox.bottom = sprite.hitbox.top + # Moving Up + if self.direction.y < 0: + hitbox.top = sprite.hitbox.bottom diff --git a/PyGame/entities/components/stats.py b/PyGame/entities/components/stats.py new file mode 100644 index 0000000..a0b4f8d --- /dev/null +++ b/PyGame/entities/components/stats.py @@ -0,0 +1,54 @@ +from config.game.player_config import warrior_stats, mage_stats, tank_stats +from config.game.monster_config import monster_data + +class StatsHandler: + + def get_stats(self, sprite_type, role=None, monster_name=None): + + if sprite_type == 'player': + if role == 'warrior': + self.stats = warrior_stats + elif role == 'tank': + self.stats = tank_stats + elif role == 'mage': + self.stats = mage_stats + else: + self.stats = base_stats + + self.role_id = self.stats['role_id'] + self.health = self.stats['health'] + self.energy = self.stats['energy'] + self.attack = self.stats['attack'] + self.magic = self.stats['magic'] + self.speed = self.stats['speed'] + self.exp = 0 + + if sprite_type == 'enemy': + self.monster_info = monster_data[monster_name] + self.monster_id = self.monster_info['id'] + self.health = self.monster_info['health'] + self.attack = self.monster_info['attack'] + self.attack_type = self.monster_info['attack_type'] + self.attack_radius = self.monster_info['attack_radius'] + self.speed = self.monster_info['speed'] + self.knockback = self.monster_info['knockback'] + self.notice_radius = self.monster_info['notice_radius'] + self.exp = self.monster_info['exp'] + + def energy_recovery(self): + if self.energy < self.stats['energy']: + self.energy += 0.01 * self.magic + else: + self.energy = self.stats['energy'] + + def health_recovery(self): + if self.energy < self.stats['health']: + self.energy += 0.15 + else: + self.energy = self.stats['energy'] + + def get_value_by_index(self, index): + return list(self.stats.values())[index] + + def get_cost_by_index(self, index): + return list(self.upgrade_costs.values())[index] diff --git a/PyGame/entities/enemy.py b/PyGame/entities/enemy.py new file mode 100644 index 0000000..d73773d --- /dev/null +++ b/PyGame/entities/enemy.py @@ -0,0 +1,83 @@ +import pygame + +from .entity import Entity + +from effects.particle_effects import AnimationPlayer + + +class Enemy(Entity): + + def __init__(self, + name, + position, + groups, + visible_sprites, + obstacle_sprites + ): + + super().__init__(groups=groups, + visible_sprites=visible_sprites, + obstacle_sprites=obstacle_sprites, + attack_sprites=None, + attackable_sprites=None) + + # Setup stats + self.sprite_type = 'enemy' + self.name = name + self.get_stats(self.sprite_type, monster_name=self.name) + + # Graphics Setup + self.animation_player = AnimationPlayer() + self.import_assets(position) + + self.distance_direction_from_player = None + + def get_action(self): + player_distance = sorted( + self.distance_direction_from_player, key=lambda x: x[0])[0] + + if player_distance[0] < self.notice_radius and player_distance[0] >= self.attack_radius: + self.direction = player_distance[1] + self.status = "move" + self.move( + self.speed, self.hitbox, self.obstacle_sprites, self.rect) + elif player_distance[0] <= self.attack_radius: + self.status = 'attack' + else: + self.status = 'idle' + + def add_exp(self, player): + player.exp += self.exp + + def check_death(self, player): + if self.health <= 0: + self.add_exp(player) + self.trigger_death_particles( + self.rect.center, self.name, self.visible_sprites) + self.kill() + + def get_damaged(self, player, attack_type): + if self.vulnerable: + for _, direction, attacking_player in self.distance_direction_from_player: + if attacking_player == player: + self.direction = -direction + self.move( + self.speed * self.knockback, self.hitbox, self.obstacle_sprites, self.rect) + break + if attack_type == 'weapon': + self.health -= player.get_full_weapon_damage() + else: + self.health -= player.get_full_magic_damage() + self.check_death(player) + self.hurt_time = pygame.time.get_ticks() + self.vulnerable = False + + def update(self): + + self.get_action() + + self.animate(self.status, self.vulnerable) + self.image = self.image + self.rect = self.rect + + self.cooldowns(self.vulnerable) diff --git a/PyGame/entities/entity.py b/PyGame/entities/entity.py new file mode 100644 index 0000000..852d011 --- /dev/null +++ b/PyGame/entities/entity.py @@ -0,0 +1,33 @@ +import pygame +import numpy as np + +from random import randint + +from .components._input import InputHandler +from .components.animation import AnimationHandler + +from effects.particle_effects import AnimationPlayer + + +class Entity(pygame.sprite.Sprite, AnimationHandler, InputHandler): + def __init__( + self, + groups, + obstacle_sprites, + visible_sprites, + attack_sprites = None, + attackable_sprites = None + ): + + super().__init__(groups) + AnimationHandler.__init__(self) + InputHandler.__init__(self) + + # Sprite Setup + self.obstacle_sprites = obstacle_sprites + self.visible_sprites = visible_sprites + self.attack_sprites = attack_sprites + self.attackable_sprites = attackable_sprites + + + diff --git a/PyGame/entities/observer.py b/PyGame/entities/observer.py new file mode 100644 index 0000000..ae53fae --- /dev/null +++ b/PyGame/entities/observer.py @@ -0,0 +1,66 @@ +import os +import pygame + +from configs.system.window_config import HITBOX_OFFSET + +from utils.resource_loader import import_assets + + +class Observer(pygame.sprite.Sprite): + + def __init__(self, position, groups): + super().__init__(groups) + + self.sprite_type = 'camera' + + self.image = pygame.image.load( + import_assets(os.path.join('graphics', + 'observer.png')) + ).convert_alpha() + + self.rect = self.image.get_rect(topleft=position) + self.hitbox = self.rect.inflate(HITBOX_OFFSET[self.sprite_type]) + + # Stats + self.exp = -1 # This prints OBSERVER in the UI + self.speed = 10 # Speed for moving around + + # Movement + self.direction = pygame.math.Vector2() + + def input(self): + keys = pygame.key.get_pressed() + + # Movement Input + if keys[pygame.K_w]: + self.direction.y = -1 + self.status = 'up' + self.can_move = False + elif keys[pygame.K_s]: + self.direction.y = 1 + self.status = 'down' + self.can_move = False + else: + self.direction.y = 0 + + if keys[pygame.K_a]: + self.direction.x = -1 + self.status = 'left' + self.can_move = False + elif keys[pygame.K_d]: + self.direction.x = 1 + self.status = 'right' + self.can_move = False + else: + self.direction.x = 0 + + def move(self, speed): + if self.direction.magnitude() != 0: + self.direction = self.direction.normalize() + self.hitbox.x += self.direction.x * speed + self.hitbox.y += self.direction.y * speed + self.rect.center = self.hitbox.center + + def update(self): + self.input() + self.move(self.speed) diff --git a/PyGame/entities/player.py b/PyGame/entities/player.py new file mode 100644 index 0000000..e80b38e --- /dev/null +++ b/PyGame/entities/player.py @@ -0,0 +1,232 @@ +import pygame +import numpy as np +from random import randint + +from config.game.weapon_config import weapon_data +from config.game.spell_config import magic_data + +from .entity import Entity + +from effects.particle_effects import AnimationPlayer + +from ml.ppo.agent import Agent + + +class Player(Entity): + def __init__(self, + player_id, + role, + position, + map_edge, + groups, + obstacle_sprites, + visible_sprites, + attack_sprites, + attackable_sprites + ): + + super().__init__(groups=groups, + obstacle_sprites=obstacle_sprites, + visible_sprites=visible_sprites, + attack_sprites=attack_sprites, attackable_sprites=attackable_sprites) + + # Setup stats + self.sprite_type = 'player' + self.get_stats(self.sprite_type, role=role) + + # Graphics Setup + self.animation_player = AnimationPlayer() + self.import_assets(position) + + # Set misc + self.initial_position = position + self.map_edge = map_edge + self.player_id = player_id + self.distance_direction_from_enemy = None + + def setup_agent(self, + gamma, + alpha, + policy_clip, + batch_size, + n_epochs, + gae_lambda, + chkpt_dir, + entropy_coef, + load=None): + + self.max_num_enemies = len(self.distance_direction_from_enemy) + self.get_current_state() + self.num_features = len(self.state_features) + + self.agent = Agent( + input_dims=self.num_features, + n_actions=len(self.possible_actions), + gamma=gamma, + alpha=alpha, + policy_clip=policy_clip, + batch_size=batch_size, + n_epochs=n_epochs, + gae_lambda=gae_lambda, + entropy_coef=entropy_coef, + chkpt_dir=chkpt_dir + ) + print( + f"\nAgent initialized on player {self.player_id} using {self.agent.actor.device}.") + + if load: + print("Attempting to load models ...") + try: + self.agent.load_models( + actr_chkpt=f"{chkpt_dir}/../run{load}/A{self.player_id}", + crtc_chkpt=f"{chkpt_dir}/../run{load}/C{self.player_id}" + ) + print("Models loaded ...\n") + + except FileNotFoundError: + print( + f"FileNotFound for player {self.player_id}.\ + \nSkipping loading ...\n") + + def get_status(self): + if self.direction.x == 0\ + and self.direction.y == 0: + + if 'idle' not in self.status and 'attack' not in self.status: + self.status += '_idle' + + if self.attacking: + self.direction.x = 0 + self.direction.y = 0 + if 'attack' not in self.status: + if 'idle' in self.status: + self.status = self.status.replace( + 'idle', 'attack') + else: + self.status += '_attack' + else: + if 'attack' in self.status: + self.status = self.status.replace('_attack', '') + + def attack_logic(self): + if self.attack_sprites: + for attack_sprite in self.attack_sprites: + collision_sprites = pygame.sprite.spritecollide( + attack_sprite, self.attackable_sprites, False) + if collision_sprites: + for target_sprite in collision_sprites: + if target_sprite.sprite_type == 'grass': + pos = target_sprite.rect.center + offset = pygame.math.Vector2(0, 75) + for leaf in range(randint(3, 6)): + self.animation_player.create_grass_particles( + position=pos - offset, + groups=[self.visible_sprites]) + + target_sprite.kill() + else: + target_sprite.get_damaged( + self, attack_sprite.sprite_type) + + def get_full_weapon_damage(self): + base_damage = self.attack + weapon_damage = weapon_data[self.weapon]['damage'] + return (base_damage + weapon_damage) + + def get_full_magic_damage(self): + base_damage = self.stats['magic'] + spell_damage = magic_data[self.magic]['strength'] + return (base_damage + spell_damage) + + def get_current_state(self): + + if self.distance_direction_from_enemy != []: + sorted_distances = sorted( + self.distance_direction_from_enemy, key=lambda x: x[0]) + else: + sorted_distances = np.zeros(self.num_features) + + nearest_dist, nearest_en_dir, nearest_enemy = sorted_distances[0] + + self.action_features = [self.action] + + if hasattr(self, 'state_features'): + self.old_state_features = self.state_features + + self.reward = self.exp\ + + self.health/self.stats['health'] + # - nearest_dist/np.sqrt(np.sum(self.map_edge)) + + self.state_features = [ + self.rect.center[0]/self.map_edge[0], + self.rect.center[1]/self.map_edge[1], + self.direction.x, + self.direction.y, + self.health/self.stats['health'], + self.energy/self.stats['energy'], + ] + + for distance, direction, enemy in sorted_distances[:5]: + self.state_features.extend([ + + distance/np.sqrt(np.sum(self.map_edge)), + + direction[0], + + direction[1], + + enemy.health / + enemy.monster_info['health'], + + enemy.exp, + ]) + + if hasattr(self, 'num_features'): + while len(self.state_features) < self.num_features: + self.state_features.append(0) + + self.state_features = np.array(self.state_features) + + def is_dead(self): + if self.health <= 0: + self.health = 0 + self.import_assets((3264, 448)) + return True + else: + return False + + def agent_update(self): + + # Get the current state + self.get_current_state() + + # Choose action based on current state + self.action, probs, value\ + = self.agent.choose_action(self.state_features) + + # Apply chosen action + self.check_input(self.action, + self.speed, + self.hitbox, + self.obstacle_sprites, + self.rect + ) + + self.agent.remember(self.state_features, self.action, + probs, value, self.reward, self.is_dead()) + + self.get_current_state() + + def update(self): + + self.agent_update() + + # Cooldowns and Regen + self.health_recovery() + self.energy_recovery() + + # Refresh player based on input and animate + self.get_status() + self.animate( + self.status, self.vulnerable) + self.cooldowns(self.vulnerable) diff --git a/PyGame/entities/terrain.py b/PyGame/entities/terrain.py new file mode 100644 index 0000000..7cfb5cf --- /dev/null +++ b/PyGame/entities/terrain.py @@ -0,0 +1,31 @@ +import pygame + +from config.system.window import TILESIZE,\ + HITBOX_OFFSET + + +class Terrain(pygame.sprite.Sprite): + + def __init__(self, + position, + groups, + sprite_type, + surface=pygame.Surface((TILESIZE, TILESIZE)) + ): + + super().__init__(groups) + + self.sprite_type = sprite_type + + self.position = position + + self.image = surface + + if sprite_type == 'object': + # Offset + self.rect = self.image.get_rect( + topleft=(position[0], position[1] - TILESIZE)) + else: + self.rect = self.image.get_rect(topleft=position) + + self.hitbox = self.rect.inflate(HITBOX_OFFSET[sprite_type]) diff --git a/PyGame/folder_struct.py b/PyGame/folder_struct.py new file mode 100644 index 0000000..8db37af --- /dev/null +++ b/PyGame/folder_struct.py @@ -0,0 +1,30 @@ +import os + + +def set_directories(base_path): + + if not os.path.exists(base_path): + os.makedirs(base_path) + + trial_dirs = [directory for directory in os.listdir( + base_path) if os.path.isdir(os.path.join(base_path, directory))] + trial_nums = sorted([int(directory[-1]) + for directory in trial_dirs if directory.startswith("run") and directory[-1].isdigit()]) + next_trial_num = trial_nums[-1] + 1 if trial_nums else 1 + new_trial_path = os.path.join(base_path, f"run{next_trial_num}") + + os.makedirs(new_trial_path) + return new_trial_path + + +def setup_dirs(): + + home_folder = os.path.dirname(os.path.abspath(__file__)) + + chkpt_path = os.path.join(home_folder, 'chkpts') + chkpt_path = set_directories(chkpt_path) + + figure_path = os.path.join(home_folder, 'figures') + figure_path = set_directories(figure_path) + + return chkpt_path, figure_path diff --git a/PyGame/game.py b/PyGame/game.py new file mode 100644 index 0000000..c2ad11f --- /dev/null +++ b/PyGame/game.py @@ -0,0 +1,62 @@ +import os +os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" + +from config.system.window import WIDTH,\ + HEIGHT,\ + WATER_COLOR,\ + FPS +from level import Level +import pygame +import sys + + + + + +class Pneuma: + + def __init__(self, show_pg=False, n_players=1,): + print(f"Initializing Pneuma with {n_players} player(s).\ + \nShowing PyGame screen: {'True' if show_pg else 'False'}") + + pygame.init() + + if show_pg: + + self.screen = pygame.display.set_mode( + (WIDTH, HEIGHT) + ) + + else: + self.screen = pygame.display.set_mode( + (WIDTH, HEIGHT), + pygame.HIDDEN + ) + + pygame.display.set_caption("Pneuma") + + img = pygame.image.load(os.path.join('assets', + 'graphics', + 'icon.png')) + pygame.display.set_icon(img) + + self.level = Level(n_players) + + def run(self): + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + self.quit() + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_m: + self.level.pause() + + self.screen.fill(WATER_COLOR) + + self.level.run() + + pygame.display.update() + + def quit(self): + pygame.quit() + sys.exit() diff --git a/PyGame/interface/__init__.py b/PyGame/interface/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/interface/ui.py b/PyGame/interface/ui.py new file mode 100644 index 0000000..ce3fb98 --- /dev/null +++ b/PyGame/interface/ui.py @@ -0,0 +1,112 @@ +import pygame + +from config.game.weapon_config import weapon_data +from config.game.spell_config import magic_data + +from .ui_settings import UI_FONT,\ + UI_FONT_SIZE,\ + HEALTH_BAR_WIDTH,\ + HEALTH_COLOR,\ + ENERGY_BAR_WIDTH,\ + ENERGY_COLOR,\ + BAR_HEIGHT,\ + UI_BG_COLOR,\ + UI_BORDER_COLOR_ACTIVE,\ + UI_BORDER_COLOR,\ + TEXT_COLOR,\ + ITEM_BOX_SIZE + + +class UI: + def __init__(self): + + # General info + self.display_surface = pygame.display.get_surface() + self.font = pygame.font.Font(UI_FONT, UI_FONT_SIZE) + + # Bar setup + self.health_bar_rect = pygame.Rect( + 10, 10, HEALTH_BAR_WIDTH, BAR_HEIGHT) + self.energy_bar_rect = pygame.Rect( + 10, 34, ENERGY_BAR_WIDTH, BAR_HEIGHT) + + # Convert weapon dictionary + self.weapon_graphics = [] + for weapon in weapon_data.values(): + path = weapon['graphic'] + weapon = pygame.image.load(path).convert_alpha() + self.weapon_graphics.append(weapon) + + # Convert weapon dictionary + self.magic_graphics = [] + for spell in magic_data.values(): + path = spell['graphic'] + spell = pygame.image.load(path).convert_alpha() + self.magic_graphics.append(spell) + + def show_bar(self, current_amount, max_amount, bg_rect, color): + + # Draw background + pygame.draw.rect(self.display_surface, UI_BG_COLOR, bg_rect) + + # Convert stat amount to pixels + ratio = current_amount / max_amount + current_width = bg_rect.width * ratio + current_rect = bg_rect.copy() + current_rect.width = current_width + + # Draw stat bar + pygame.draw.rect(self.display_surface, color, current_rect) + pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, bg_rect, 4) + + def show_exp(self, exp): + if exp >= 0: + text_surf = self.font.render( + f"EXP: {str(int(exp))}", False, TEXT_COLOR) + x = self.display_surface.get_size()[0] - 20 + y = self.display_surface.get_size()[1] - 20 + text_rect = text_surf.get_rect(bottomright=(x, y)) + + pygame.draw.rect(self.display_surface, UI_BG_COLOR, + text_rect.inflate(10, 10)) + self.display_surface.blit(text_surf, text_rect) + pygame.draw.rect(self.display_surface, + UI_BORDER_COLOR, text_rect.inflate(10, 10), 4) + else: + text_surf = self.font.render("OBSERVER", False, TEXT_COLOR) + x = self.display_surface.get_size()[0] - 20 + y = self.display_surface.get_size()[1] - 20 + text_rect = text_surf.get_rect(bottomright=(x, y)) + + pygame.draw.rect(self.display_surface, UI_BG_COLOR, + text_rect.inflate(10, 10)) + self.display_surface.blit(text_surf, text_rect) + pygame.draw.rect(self.display_surface, + UI_BORDER_COLOR, text_rect.inflate(10, 10), 4) + + def selection_box(self, left, top, has_rotated): + bg_rect = pygame.Rect(left, top, ITEM_BOX_SIZE, ITEM_BOX_SIZE) + pygame.draw.rect(self.display_surface, UI_BG_COLOR, bg_rect) + if not has_rotated: + pygame.draw.rect(self.display_surface, + UI_BORDER_COLOR_ACTIVE, bg_rect, 4) + else: + pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, bg_rect, 4) + return bg_rect + + def weapon_overlay(self, weapon_index, has_rotated): + bg_rect = self.selection_box(10, 630, has_rotated) + weapon_surf = self.weapon_graphics[weapon_index] + weapon_rect = weapon_surf.get_rect(center=bg_rect.center) + + self.display_surface.blit(weapon_surf, weapon_rect) + + def magic_overlay(self, magic_index, has_swaped): + bg_rect = self.selection_box(100, 630, has_swaped) + magic_surf = self.magic_graphics[magic_index] + magic_rect = magic_surf.get_rect(center=bg_rect.center) + + self.display_surface.blit(magic_surf, magic_rect) + + def display(self): + self.show_exp(-1) diff --git a/PyGame/interface/ui_settings.py b/PyGame/interface/ui_settings.py new file mode 100644 index 0000000..c45fe59 --- /dev/null +++ b/PyGame/interface/ui_settings.py @@ -0,0 +1,27 @@ +import os +from utils.resource_loader import import_assets + +# UI +BAR_HEIGHT = 20 +HEALTH_BAR_WIDTH = 200 +ENERGY_BAR_WIDTH = 140 +ITEM_BOX_SIZE = 80 +UI_FONT = import_assets(path=os.path.join('font', 'joystix.ttf')) +UI_FONT_SIZE = 18 + +# General Colors +WATER_COLOR = '#71ddee' +UI_BG_COLOR = '#222222' +UI_BORDER_COLOR = '#111111' +TEXT_COLOR = '#EEEEEE' + +# UI Colors +HEALTH_COLOR = 'red' +ENERGY_COLOR = 'blue' +UI_BORDER_COLOR_ACTIVE = 'gold' + +# Upgrade Menu +TEXT_COLOR_SELECTED = '#111111' +BAR_COLOR = '#EEEEEE' +BAR_COLOR_SELECTED = '#111111' +UPGRADE_BG_COLOR_SELECTED = '#EEEEEE' diff --git a/PyGame/interface/upgrade.py b/PyGame/interface/upgrade.py new file mode 100644 index 0000000..17cf502 --- /dev/null +++ b/PyGame/interface/upgrade.py @@ -0,0 +1,156 @@ +import pygame + +from .ui_settings import UI_FONT,\ + UI_FONT_SIZE,\ + TEXT_COLOR,\ + TEXT_COLOR_SELECTED,\ + UPGRADE_BG_COLOR_SELECTED,\ + UI_BORDER_COLOR,\ + UI_BG_COLOR,\ + BAR_COLOR_SELECTED,\ + BAR_COLOR + + +class Upgrade: + + def __init__(self, player): + + # General setup + self.display_surface = pygame.display.get_surface() + self.player = player + self.attribute_num = len(player.stats.stats) + self.attribute_names = list(player.stats.stats.keys()) + self.max_values = list(player.stats.max_stats.values()) + self.font = pygame.font.Font(UI_FONT, UI_FONT_SIZE) + + # Defining upgrade boxes + self.height = self.display_surface.get_size()[1] * 0.8 + self.width = self.display_surface.get_size()[ + 0] // (self.attribute_num + 1) + self.create_boxes() + + # Selection System + self.selection_index = 0 + self.selection_time = None + self.can_move = True + + def input(self): + keys = pygame.key.get_pressed() + + if self.can_move: + if keys[pygame.K_d]: + self.selection_index += 1 + if self.selection_index == self.attribute_num: + self.selection_index = 0 + self.can_move = False + self.selection_time = pygame.time.get_ticks() + elif keys[pygame.K_a]: + self.selection_index -= 1 + if self.selection_index == -1: + self.selection_index = self.attribute_num - 1 + self.can_move = False + self.selection_time = pygame.time.get_ticks() + + if keys[pygame.K_SPACE]: + self.can_move = False + self.selection_time = pygame.time.get_ticks() + self.box_list[self.selection_index].trigger(self.player) + + def selection_cooldown(self): + if not self.can_move: + current_time = pygame.time.get_ticks() + if current_time - self.selection_time >= 150: + self.can_move = True + + def create_boxes(self): + self.box_list = [] + + for box, index in enumerate(range(self.attribute_num)): + + # Horizontal position + full_width = self.display_surface.get_size()[0] + increment = full_width // self.attribute_num + left = (box * increment) + (increment - self.width) // 2 + + # Vertical position + top = self.display_surface.get_size()[1] * 0.1 + + box = Box(left, top, self.width, self.height, index, self.font) + self.box_list.append(box) + + def display(self): + + self.input() + self.selection_cooldown() + + for index, box in enumerate(self.box_list): + # Get attributes + name = self.attribute_names[index] + value = self.player.stats.get_value_by_index(index) + max_value = self.max_values[index] + cost = self.player.stats.get_cost_by_index(index) + box.display(self.display_surface, self.selection_index, + name, value, max_value, cost) + + +class Box: + def __init__(self, left, top, width, height, index, font): + self.rect = pygame.Rect(left, top, width, height) + self.index = index + self.font = font + + def display_names(self, surface, name, cost, selected): + color = TEXT_COLOR_SELECTED if selected else TEXT_COLOR + + # Title + title_surf = self.font.render(name, False, color) + title_rect = title_surf.get_rect( + midtop=self.rect.midtop + pygame.math.Vector2(0, 20)) + # Cost + cost_surf = self.font.render(f'Cost: {int(cost)}', False, color) + cost_rect = cost_surf.get_rect( + midbottom=self.rect.midbottom + - pygame.math.Vector2(0, 20)) + + # Draw + surface.blit(title_surf, title_rect) + surface.blit(cost_surf, cost_rect) + + def display_bar(self, surface, value, max_value, selected): + + # Line setup + top = self.rect.midtop + pygame.math.Vector2(0, 60) + bottom = self.rect.midbottom - pygame.math.Vector2(0, 60) + color = BAR_COLOR_SELECTED if selected else BAR_COLOR + + # Bar setup + full_height = bottom[1] - top[1] + relative_number = (value / max_value) * full_height + value_rect = pygame.Rect( + top[0] - 15, bottom[1] - relative_number, 30, 10) + + # Draw elements + pygame.draw.line(surface, color, top, bottom, 5) + pygame.draw.rect(surface, color, value_rect) + + def trigger(self, player): + upgrade_attribute = list(player.stats.stats.keys())[self.index] + + if player.stats.exp >= player.stats.upgrade_costs[upgrade_attribute] and player.stats.stats[upgrade_attribute] < player.stats.max_stats[upgrade_attribute]: + player.stats.exp -= player.stats.upgrade_costs[upgrade_attribute] + player.stats.stats[upgrade_attribute] *= 1.2 + player.stats.upgrade_costs[upgrade_attribute] *= 1.4 + + if player.stats.stats[upgrade_attribute] > player.stats.max_stats[upgrade_attribute]: + player.stats.stats[upgrade_attribute] = player.stats.max_stats[upgrade_attribute] + + def display(self, surface, selection_num, name, value, max_value, cost): + if self.index == selection_num: + pygame.draw.rect(surface, UPGRADE_BG_COLOR_SELECTED, self.rect) + pygame.draw.rect(surface, UI_BORDER_COLOR, self.rect, 4) + else: + pygame.draw.rect(surface, UI_BG_COLOR, self.rect) + pygame.draw.rect(surface, UI_BORDER_COLOR, self.rect, 4) + + self.display_names(surface, name, cost, self.index == selection_num) + self.display_bar(surface, value, max_value, + self.index == selection_num) diff --git a/PyGame/level.py b/PyGame/level.py new file mode 100644 index 0000000..02637a3 --- /dev/null +++ b/PyGame/level.py @@ -0,0 +1,297 @@ +import os +import pygame +import numpy as np + +from random import choice + +from config.system.window import TILESIZE + +from utils.debug import debug +from utils.resource_loader import import_csv_layout, import_folder + +from interface.ui import UI + +from entities.player import Player +from entities.enemy import Enemy +from entities.terrain import Terrain + +from camera import Camera + + +class Level: + + def __init__(self, n_players): + + self.paused = False + self.done = False + + # Get display surface + self.display_surface = pygame.display.get_surface() + + # Setup Sprite groups + self.visible_sprites = Camera() + self.obstacle_sprites = pygame.sprite.Group() + self.attack_sprites = pygame.sprite.Group() + self.attackable_sprites = pygame.sprite.Group() + + # Map generation + self.n_players = n_players + self.generate_map() + + # Handle generated entities + self.get_entities() + self.get_distance_direction() + self.dead_players = np.zeros(self.n_players) + + # Setup UI + self.ui = UI() + + def generate_map(self): + + self.possible_player_locations = [] + + self.layouts = { + 'boundary': import_csv_layout(os.path.join('map', + 'FloorBlocks.csv')), + 'grass': import_csv_layout(os.path.join('map', + 'Grass.csv')), + 'objects': import_csv_layout(os.path.join('map', + 'Objects.csv')), + 'entities': import_csv_layout(os.path.join('map', + 'Entities.csv')) + } + + self.graphics = { + 'grass': import_folder(os.path.join('graphics', 'grass')), + 'objects': import_folder(os.path.join('graphics', 'objects')) + } + + for style, layout in self.layouts.items(): + for row_index, row in enumerate(layout): + for col_index, col in enumerate(row): + if int(col) != -1: + + x = col_index * TILESIZE + y = row_index * TILESIZE + + # Generate unpassable terrain + if style == 'boundary': + + if col == '600': + self.map_edge = (x, y) + + elif col != '700': + Terrain((x, y), + [self.obstacle_sprites], + 'invisible') + elif col == '700' and self.n_players > 1: + print(f"Prison set at:{(x, y)}") + # # Generate grass + # if style == 'grass': + # random_grass_image = choice(self.graphics['grass']) + # + # Terrain((x, y), [ + # self.visible_sprites, + # self.obstacle_sprites, + # self.attackable_sprites + # ], + # 'grass', + # random_grass_image) + # + # # Generate objects like trees and statues + # if style == 'objects': + # surface = self.graphics['objects'][int(col)] + # Terrain((x, y), [ + # self.visible_sprites, + # self.obstacle_sprites + # ], + # 'object', + # surface) + + # Generate observer, players and monsters + if style == 'entities': + + # Generate player(s) + if col == '400': + self.possible_player_locations.append((x, y)) + + # Monster generation + elif col in ['390', '391', '392', '393']: + if col == '390': + monster_name = 'bamboo' + elif col == '391': + monster_name = 'spirit' + elif col == '392': + monster_name = 'raccoon' + elif col == '393': + monster_name = 'squid' + Enemy(name=monster_name, + position=(x, y), + groups=[self.visible_sprites, + self.attackable_sprites], + visible_sprites=self.visible_sprites, + obstacle_sprites=self.obstacle_sprites) + + for player_id in range(self.n_players): + Player( + player_id, + 'tank', + choice(self.possible_player_locations), + self.map_edge, + [self.visible_sprites], + self.obstacle_sprites, + self.visible_sprites, + self.attack_sprites, + self.attackable_sprites + ) + + def reset(self): + + for grass in self.grass_sprites: + grass.kill() + + for enemy in self.enemy_sprites: + enemy.kill() + + for style, layout in self.layouts.items(): + for row_index, row in enumerate(layout): + for col_index, col in enumerate(row): + if int(col) != -1: + x = col_index * TILESIZE + y = row_index * TILESIZE + # # Regenerate grass + # if style == 'grass': + # random_grass_image = choice( + # self.graphics['grass']) + # + # Terrain((x, y), [ + # self.visible_sprites, + # self.obstacle_sprites, + # self.attackable_sprites + # ], + # 'grass', + # random_grass_image) + + if style == 'entities': + + if col in ['390', '391', '392', '393']: + if col == '390': + monster_name = 'bamboo' + elif col == '391': + monster_name = 'spirit' + elif col == '392': + monster_name = 'raccoon' + elif col == '393': + monster_name = 'squid' + + Enemy(monster_name, + (x, y), + [self.visible_sprites, + self.attackable_sprites], + self.visible_sprites, + self.obstacle_sprites) + + for player in self.player_sprites: + + player.import_assets( + choice(self.possible_player_locations)) + + player.health\ + = player.stats['health'] + + player.energy\ + = player.stats['energy'] + + player.exp = 0 + + self.get_entities() + self.get_distance_direction() + self.dead_players = np.zeros(self.n_players) + self.done = False + + def get_entities(self): + + self.player_sprites = [sprite + for sprite in self.visible_sprites.sprites() + if sprite.sprite_type == 'player'] + + self.enemy_sprites = [sprite + for sprite in self.visible_sprites.sprites() + if sprite.sprite_type == 'enemy'] + + self.grass_sprites = [sprite + for sprite in self.visible_sprites.sprites() + if sprite.sprite_type == 'grass'] + + def get_distance_direction(self): + for player in self.player_sprites: + player.distance_direction_from_enemy = [] + + for enemy in self.enemy_sprites: + enemy.distance_direction_from_player = [] + + for player in self.player_sprites: + if not player.is_dead(): + player_vector = pygame.math.Vector2( + player.rect.center + ) + + for enemy in self.enemy_sprites: + enemy_vector = pygame.math.Vector2( + enemy.rect.center + ) + distance\ + = (player_vector - enemy_vector).magnitude() + + if distance > 0: + direction\ + = (player_vector - enemy_vector).normalize() + else: + direction\ + = pygame.math.Vector2() + + enemy.distance_direction_from_player.append( + (distance, direction, player)) + player.distance_direction_from_enemy.append( + (distance, -direction, enemy)) + + def apply_damage_to_player(self): + for enemy in self.enemy_sprites: + for distance, _, player in enemy.distance_direction_from_player: + + if (distance < enemy.attack_radius + and player.vulnerable): + + player.health -= enemy.attack + player.vulnerable = False + player.hurt_time = pygame.time.get_ticks() + + def toggle_pause(self): + self.paused = not self.paused + + def run(self): + # Draw the game + self.visible_sprites.custom_draw() + self.ui.display() + + if not self.paused: + # Update the game + for player in self.player_sprites: + if player.health > 0: + player.attack_logic() + + self.get_entities() + self.get_distance_direction() + self.visible_sprites.update() + self.apply_damage_to_player() + + else: + debug('PAUSED') + + for player in self.player_sprites: + if player.is_dead(): + print(f"\nPlayer {player.player_id} is dead\n") + self.dead_players[player.player_id] = player.is_dead() + + self.done = True if (self.dead_players.all() == 1 + or self.enemy_sprites == []) else False diff --git a/PyGame/main.py b/PyGame/main.py new file mode 100644 index 0000000..fef7969 --- /dev/null +++ b/PyGame/main.py @@ -0,0 +1,217 @@ +import os +import random +import torch as T +import numpy as np +import matplotlib.pyplot as plt + +from tqdm import tqdm + +import args +import folder_struct + +import utils.seeds as seeds +import utils.metrics as metrics + +from game import Pneuma + +def main(): + + parsed_args = args.parse_args() + + if not parsed_args.no_seed: + seeds.set_seeds(parsed_args.seed) + print(f"Seed set as {parsed_args.seed}") + else: + print("No seed set") + + chkpt_path, figure_path = folder_struct.setup_dirs() + + # Setup AI params + n_episodes = parsed_args.n_episodes + episode_length = parsed_args.ep_length + n_agents = parsed_args.n_agents + + horizon = parsed_args.horizon + no_training = parsed_args.no_training + + learnings_per_episode = int(episode_length/horizon) + learn_iters = 0 + + show_pygame = parsed_args.show_pg + + # Setup parameter monitoring + score_history = np.zeros( + shape=(parsed_args.n_agents, parsed_args.n_episodes)) + + best_score = np.zeros(parsed_args.n_agents) + + actor_loss = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + critic_loss = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + total_loss = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + entropy = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + advantage = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + time_alive = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + game = Pneuma(show_pg=show_pygame, n_players=parsed_args.n_agents) + + print("Initializing agents ...") + for player in tqdm(game.level.player_sprites, + dynamic_ncols=True): + player.setup_agent( + gamma=parsed_args.gamma, + alpha=parsed_args.alpha, + policy_clip=parsed_args.policy_clip, + batch_size=parsed_args.batch_size, + n_epochs=parsed_args.n_epochs, + gae_lambda=parsed_args.gae_lambda, + entropy_coef=parsed_args.entropy_coeff, + chkpt_dir=chkpt_path, + load=parsed_args.load + ) + + # Episodes start + for episode in tqdm(range(n_episodes), + dynamic_ncols=True): + + game.level.reset() + + episode_reward = np.zeros( + shape=(n_agents, episode_length)) + + episode_actor_loss = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_critic_loss = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_total_loss = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_entropy = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_advantage = np.zeros( + shape=(n_agents, learnings_per_episode)) + + # Main game loop + for step in tqdm(range(episode_length), + leave=False, + ascii=True, + dynamic_ncols=True): + + if not game.level.done: + game.run() + + for player in game.level.player_sprites: + + episode_reward[player.player_id][step] = player.reward + + if not no_training and (step % horizon == 0 and step != 0): + + player.agent.learn() + + episode_actor_loss[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.actor_loss + + episode_critic_loss[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.critic_loss + + episode_total_loss[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.total_loss + + episode_entropy[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.entropy + + episode_advantage[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.gae + + learn_iters += 1 + + + + # Gather information about the episode + for player in game.level.player_sprites: + + score = np.mean(episode_reward[player.player_id]) + + # Update score + score_history[player.player_id][episode] = score + + # Update actor/critic loss + actor_loss[player.player_id][episode] = np.mean( + episode_actor_loss) + + critic_loss[player.player_id][episode] = np.mean( + episode_critic_loss) + + total_loss[player.player_id][episode] = np.mean( + episode_total_loss) + + time_alive[player.player_id][episode] = step + + entropy[player.player_id][episode] = np.mean( + episode_entropy) + + advantage[player.player_id][episode] = np.mean( + episode_advantage) + + # Check for new best score + if score > best_score[player.player_id]: + print(f"\nEpisode:\ + {episode}\ + \nNew best score for player {player.player_id}:\ + {score}\ + \nOld best score for player {player.player_id}: \ + {best_score[player.player_id]}") + + best_score[player.player_id] = score + + print(f"Saving models for player {player.player_id}...") + + # Save models + player.agent.save_models( + os.path.join(chkpt_path, f"A{player.player_id}"), + os.path.join(chkpt_path, f"C{player.player_id}") + ) + + print(f"Models saved to {chkpt_path}") + + metrics.plot_learning_curve(score_history, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_score(score_history, parsed_args.n_agents, figure_path) + + metrics.plot_loss('actor', actor_loss, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_loss('critic', critic_loss, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_parameter('entropy', entropy, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_parameter('advantage', advantage, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_avg_time(time_alive, parsed_args.n_agents, figure_path) + + # End of training session + print("End of episodes.\ + \n Saving models and exiting game...") + + # Save models + player.agent.save_models( + f"A{player.player_id}_end", + f"C{player.player_id}_end") + + print(f"Models saved to {chkpt_path}") + + game.quit() + +if __name__ == '__main__': + main() diff --git a/PyGame/ml/ppo/__init__.py b/PyGame/ml/ppo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/ml/ppo/agent.py b/PyGame/ml/ppo/agent.py new file mode 100644 index 0000000..f9d8ed3 --- /dev/null +++ b/PyGame/ml/ppo/agent.py @@ -0,0 +1,122 @@ +import numpy as np +import torch as T + +from tqdm import tqdm + +from .brain import ActorNetwork, CriticNetwork, PPOMemory + + +class Agent: + + def __init__(self, input_dims, n_actions, gamma=0.99, alpha=0.0003, + policy_clip=0.2, batch_size=64, n_epochs=10, + gae_lambda=0.95, entropy_coef=0.001, chkpt_dir='tmp/ppo'): + + self.gamma = gamma + self.policy_clip = policy_clip + self.n_epochs = n_epochs + self.gae_lambda = gae_lambda + self.entropy_coef = entropy_coef + + self.actor = ActorNetwork( + input_dims, n_actions, alpha, chkpt_dir=chkpt_dir) + + self.critic = CriticNetwork( + input_dims, alpha, chkpt_dir=chkpt_dir) + + self.memory = PPOMemory(batch_size) + + def remember(self, state, action, probs, vals, reward, done): + self.memory.store_memory(state, action, probs, vals, reward, done) + + def save_models(self, actr_chkpt='actor_ppo', crtc_chkpt='critic_ppo'): + self.actor.save_checkpoint(actr_chkpt) + self.critic.save_checkpoint(crtc_chkpt) + + def load_models(self, actr_chkpt='actor_ppo', crtc_chkpt='critic_ppo'): + self.actor.load_checkpoint(actr_chkpt) + self.critic.load_checkpoint(crtc_chkpt) + + def choose_action(self, observation): + state = T.tensor(observation, dtype=T.float).to(self.actor.device) + dist = self.actor(state) + value = self.critic(state) + action = dist.sample() + + probs = T.squeeze(dist.log_prob(action)).item() + action = T.squeeze(action).item() + value = T.squeeze(value).item() + + self.entropy = dist.entropy().mean().item() + + return action, probs, value + + def learn(self): + for _ in tqdm(range(self.n_epochs), + desc='Learning...', + dynamic_ncols=True, + leave=False, + ascii=True): + + state_arr, action_arr, old_probs_arr, vals_arr, reward_arr, dones_arr, batches = self.memory.generate_batches() + + values = vals_arr + advantage = np.zeros(len(reward_arr), dtype=np.float64) + + for t in range(len(reward_arr)-1): + discount = 1 + a_t = 0 + for k in range(t, len(reward_arr)-1): + a_t += discount * \ + (reward_arr[k] + self.gamma*values[k+1] + * (1-int(dones_arr[k])) - values[k]) + discount *= self.gamma * self.gae_lambda + advantage[t] = a_t + self.gae = np.sum(advantage) + advantage = T.tensor(advantage).to(self.actor.device) + + values = T.tensor(values).to(self.actor.device) + + for batch in batches: + states = T.tensor(state_arr[batch], dtype=T.float).to( + self.actor.device) + old_probs = T.tensor(old_probs_arr[batch]).to( + self.actor.device) + actions = T.tensor(action_arr[batch]).to(self.actor.device) + + dist = self.actor(states) + critic_value = self.critic(states) + + critic_value = T.squeeze(critic_value) + + new_probs = dist.log_prob(actions) + prob_ratio = new_probs.exp() / old_probs.exp() + weighted_probs = advantage[batch] * prob_ratio + + weighted_clipped_probs = T.clamp( + prob_ratio, 1-self.policy_clip, 1+self.policy_clip)*advantage[batch] + + self.actor_loss = -T.min(weighted_probs, + weighted_clipped_probs).mean() + + returns = advantage[batch] + values[batch] + self.critic_loss = (returns - critic_value)**2 + self.critic_loss = self.critic_loss.mean() + + self.total_loss = self.actor_loss + 0.5 * \ + self.critic_loss - self.entropy_coef*self.entropy + + self.actor.optimizer.zero_grad() + self.critic.optimizer.zero_grad() + self.total_loss.backward() + + T.nn.utils.clip_grad_norm_( + self.actor.parameters(), max_norm=2) + + T.nn.utils.clip_grad_norm_( + self.critic.parameters(), max_norm=2) + + self.actor.optimizer.step() + self.critic.optimizer.step() + + self.memory.clear_memory() diff --git a/PyGame/ml/ppo/brain.py b/PyGame/ml/ppo/brain.py new file mode 100644 index 0000000..3e8ddf7 --- /dev/null +++ b/PyGame/ml/ppo/brain.py @@ -0,0 +1,135 @@ +import os +import numpy as np +import torch as T +import torch.nn as nn +import torch.optim as optim +from torch.distributions.categorical import Categorical + + +class PPOMemory: + def __init__(self, batch_size): + self.states = [] + self.probs = [] + self.vals = [] + self.actions = [] + self.rewards = [] + self.dones = [] + + self.batch_size = batch_size + + def generate_batches(self): + + n_states = len(self.states) + batch_start = np.arange(0, n_states, self.batch_size) + indices = np.arange(n_states, dtype=np.int64) + np.random.shuffle(indices) + batches = [indices[i:i+self.batch_size] for i in batch_start] + + return np.array(self.states),\ + np.array(self.actions),\ + np.array(self.probs),\ + np.array(self.vals),\ + np.array(self.rewards),\ + np.array(self.dones),\ + batches + + def store_memory(self, state, action, probs, vals, reward, done): + self.states.append(state) + self.actions.append(action) + self.probs.append(probs) + self.vals.append(vals) + self.rewards.append(reward) + self.dones.append(done) + + def clear_memory(self): + self.states = [] + self.probs = [] + self.vals = [] + self.actions = [] + self.rewards = [] + self.dones = [] + + +class ActorNetwork(nn.Module): + + def __init__(self, input_dim, output_dim, alpha, fc1_dims=1024, fc2_dims=1024, chkpt_dir='tmp'): + super(ActorNetwork, self).__init__() + + self.chkpt_dir = chkpt_dir + + self.actor = nn.Sequential( + nn.Linear(input_dim, fc1_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc2_dims, output_dim), + nn.Softmax(dim=-1) + ) + + self.optimizer = optim.Adam(self.parameters(), lr=alpha, betas=(0.9, 0.9), eps=1e-5) + + self.device = T.device('cuda' if T.cuda.is_available() else 'cpu') + + self.to(self.device) + + def forward(self, state): + dist = self.actor(state) + dist = Categorical(dist) + + return dist + + def save_checkpoint(self, filename): + T.save(self.state_dict(), os.path.join(filename)) + + def load_checkpoint(self, filename): + print(filename) + self.load_state_dict( + T.load(os.path.join(filename), + map_location=self.device)) + + +class CriticNetwork(nn.Module): + + def __init__(self, input_dims, alpha, fc1_dims=4096, fc2_dims=4096, chkpt_dir='tmp'): + super(CriticNetwork, self).__init__() + + self.chkpt_dir = chkpt_dir + + self.critic = nn.Sequential( + nn.Linear(input_dims, fc1_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc2_dims, 1) + ) + + self.optimizer = optim.Adam(self.parameters(), lr=alpha, betas=(0.9, 0.9), eps=1e-5) + + self.device = T.device('cuda' if T.cuda.is_available() else 'cpu') + + self.to(self.device) + + def forward(self, state): + value = self.critic(state) + return value + + def save_checkpoint(self, filename): + T.save(self.state_dict(), os.path.join(filename)) + + def load_checkpoint(self, filename): + print(filename) + self.load_state_dict( + T.load(os.path.join(filename), + map_location=self.device)) diff --git a/PyGame/poetry.lock b/PyGame/poetry.lock new file mode 100644 index 0000000..52fe68b --- /dev/null +++ b/PyGame/poetry.lock @@ -0,0 +1,1190 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.2.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, +] + +[package.dependencies] +numpy = ">=1.20" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "docstring-to-markdown" +version = "0.13" +description = "On the fly conversion of Python docstrings to markdown" +optional = false +python-versions = ">=3.6" +files = [ + {file = "docstring-to-markdown-0.13.tar.gz", hash = "sha256:3025c428638ececae920d6d26054546a20335af3504a145327e657e7ad7ce1ce"}, + {file = "docstring_to_markdown-0.13-py3-none-any.whl", hash = "sha256:aa487059d0883e70e54da25c7b230e918d9e4d40f23d6dfaa2b73e4225b2d7dd"}, +] + +[[package]] +name = "filelock" +version = "3.13.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "fonttools" +version = "4.51.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "fsspec" +version = "2023.12.2" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib" +version = "3.8.4" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"}, + {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"}, + {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"}, + {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"}, + {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, + {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, + {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"}, + {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"}, + {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"}, + {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.21" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.19.3" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:a9734707a2c96443331c1e48c717024aa6678a0e2a4cb66b2c364d18cee6b48d"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pillow" +version = "10.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pluggy" +version = "1.4.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pygame" +version = "2.5.2" +description = "Python Game Development" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pygame-2.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a0769eb628c818761755eb0a0ca8216b95270ea8cbcbc82227e39ac9644643da"}, + {file = "pygame-2.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed9a3d98adafa0805ccbaaff5d2996a2b5795381285d8437a4a5d248dbd12b4a"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30d1618672a55e8c6669281ba264464b3ab563158e40d89e8c8b3faa0febebd"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39690e9be9baf58b7359d1f3b2336e1fd6f92fedbbce42987be5df27f8d30718"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03879ec299c9f4ba23901b2649a96b2143f0a5d787f0b6c39469989e2320caf1"}, + {file = "pygame-2.5.2-cp310-cp310-win32.whl", hash = "sha256:74e1d6284100e294f445832e6f6343be4fe4748decc4f8a51131ae197dae8584"}, + {file = "pygame-2.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:485239c7d32265fd35b76ae8f64f34b0637ae11e69d76de15710c4b9edcc7c8d"}, + {file = "pygame-2.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34646ca20e163dc6f6cf8170f1e12a2e41726780112594ac061fa448cf7ccd75"}, + {file = "pygame-2.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b8a6e351665ed26ea791f0e1fd649d3f483e8681892caef9d471f488f9ea5ee"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc346965847aef00013fa2364f41a64f068cd096dcc7778fc306ca3735f0eedf"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35632035fd81261f2d797fa810ea8c46111bd78ceb6089d52b61ed7dc3c5d05f"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e24d05184e4195fe5ebcdce8b18ecb086f00182b9ae460a86682d312ce8d31f"}, + {file = "pygame-2.5.2-cp311-cp311-win32.whl", hash = "sha256:f02c1c7505af18d426d355ac9872bd5c916b27f7b0fe224749930662bea47a50"}, + {file = "pygame-2.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d58c8cf937815d3b7cdc0fa9590c5129cb2c9658b72d00e8a4568dea2ff1d42"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1a2a43802bb5e89ce2b3b775744e78db4f9a201bf8d059b946c61722840ceea8"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c289f2613c44fe70a1e40769de4a49c5ab5a29b9376f1692bb1a15c9c1c9bfa"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074aa6c6e110c925f7f27f00c7733c6303407edc61d738882985091d1eb2ef17"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe0228501ec616779a0b9c4299e837877783e18df294dd690b9ab0eed3d8aaab"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31648d38ecdc2335ffc0e38fb18a84b3339730521505dac68514f83a1092e3f4"}, + {file = "pygame-2.5.2-cp312-cp312-win32.whl", hash = "sha256:224c308856334bc792f696e9278e50d099a87c116f7fc314cd6aa3ff99d21592"}, + {file = "pygame-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:dd2d2650faf54f9a0f5bd0db8409f79609319725f8f08af6507a0609deadcad4"}, + {file = "pygame-2.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b30bc1220c457169571aac998e54b013aaeb732d2fd8744966cb1cfab1f61d1"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78fcd7643358b886a44127ff7dec9041c056c212b3a98977674f83f99e9b12d3"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cf093a51cb294ede56c29d4acf41538c00f297fcf78a9b186fb7d23c0577b6"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fe323acbf53a0195c8c98b1b941eba7ac24e3e2b28ae48e8cda566f15fc4945"}, + {file = "pygame-2.5.2-cp36-cp36m-win32.whl", hash = "sha256:5697528266b4716d9cdd44a5a1d210f4d86ef801d0f64ca5da5d0816704009d9"}, + {file = "pygame-2.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edda1f7cff4806a4fa39e0e8ccd75f38d1d340fa5fc52d8582ade87aca247d92"}, + {file = "pygame-2.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9bd738fd4ecc224769d0b4a719f96900a86578e26e0105193658a32966df2aae"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30a8d7cf12363b4140bf2f93b5eec4028376ca1d0fe4b550588f836279485308"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc12e4dea3e88ea8a553de6d56a37b704dbe2aed95105889f6afeb4b96e62097"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b34c73cb328024f8db3cb6487a37e54000148988275d8d6e5adf99d9323c937"}, + {file = "pygame-2.5.2-cp37-cp37m-win32.whl", hash = "sha256:7d0a2794649defa57ef50b096a99f7113d3d0c2e32d1426cafa7d618eadce4c7"}, + {file = "pygame-2.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:41f8779f52e0f6e6e6ccb8f0b5536e432bf386ee29c721a1c22cada7767b0cef"}, + {file = "pygame-2.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:677e37bc0ea7afd89dde5a88ced4458aa8656159c70a576eea68b5622ee1997b"}, + {file = "pygame-2.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47a8415d2bd60e6909823b5643a1d4ef5cc29417d817f2a214b255f6fa3a1e4c"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ff21201df6278b8ca2e948fb148ffe88f5481fd03760f381dd61e45954c7dff"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29a84b2e02814b9ba925357fd2e1df78efe5e1aa64dc3051eaed95d2b96eafd"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d78485c4d21133d6b2fbb504cd544ca655e50b6eb551d2995b3aa6035928adda"}, + {file = "pygame-2.5.2-cp38-cp38-win32.whl", hash = "sha256:d851247239548aa357c4a6840fb67adc2d570ce7cb56988d036a723d26b48bff"}, + {file = "pygame-2.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:88d1cdacc2d3471eceab98bf0c93c14d3a8461f93e58e3d926f20d4de3a75554"}, + {file = "pygame-2.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4f1559e7efe4efb9dc19d2d811d702f325d9605f9f6f9ececa39ee6890c798f5"}, + {file = "pygame-2.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf2191b756ceb0e8458a761d0c665b0c70b538570449e0d39b75a5ba94ac5cf0"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cf2257447ce7f2d6de37e5fb019d2bbe32ed05a5721ace8bc78c2d9beaf3aee"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cbbfaba2b81434d62631d0b08b85fab16cf4a36e40b80298d3868927e1299"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daca456d5b9f52e088e06a127dec182b3638a775684fb2260f25d664351cf1ae"}, + {file = "pygame-2.5.2-cp39-cp39-win32.whl", hash = "sha256:3b3e619e33d11c297d7a57a82db40681f9c2c3ae1d5bf06003520b4fe30c435d"}, + {file = "pygame-2.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:1822d534bb7fe756804647b6da2c9ea5d7a62d8796b2e15d172d3be085de28c6"}, + {file = "pygame-2.5.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:e708fc8f709a0fe1d1876489345f2e443d47f3976d33455e2e1e937f972f8677"}, + {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c13edebc43c240fb0532969e914f0ccefff5ae7e50b0b788d08ad2c15ef793e4"}, + {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:263b4a7cbfc9fe2055abc21b0251cc17dea6dff750f0e1c598919ff350cdbffe"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e58e2b0c791041e4bccafa5bd7650623ba1592b8fe62ae0a276b7d0ecb314b6c"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0bd67426c02ffe6c9827fc4bcbda9442fbc451d29b17c83a3c088c56fef2c90"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dcff6cbba1584cf7732ce1dbdd044406cd4f6e296d13bcb7fba963fb4aeefc9"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce4b6c0bfe44d00bb0998a6517bd0cf9455f642f30f91bc671ad41c05bf6f6ae"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68c4e8e60b725ffc7a6c6ecd9bb5fcc5ed2d6e0e2a2c4a29a8454856ef16ad63"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f3849f97372a3381c66955f99a0d58485ccd513c3d00c030b869094ce6997a6"}, + {file = "pygame-2.5.2.tar.gz", hash = "sha256:c1b89eb5d539e7ac5cf75513125fb5f2f0a2d918b1fd6e981f23bf0ac1b1c24a"}, +] + +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-lsp-jsonrpc" +version = "1.1.2" +description = "JSON RPC 2.0 server library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-lsp-jsonrpc-1.1.2.tar.gz", hash = "sha256:4688e453eef55cd952bff762c705cedefa12055c0aec17a06f595bcc002cc912"}, + {file = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl", hash = "sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c"}, +] + +[package.dependencies] +ujson = ">=3.0.0" + +[package.extras] +test = ["coverage", "pycodestyle", "pyflakes", "pylint", "pytest", "pytest-cov"] + +[[package]] +name = "python-lsp-server" +version = "1.11.0" +description = "Python Language Server for the Language Server Protocol" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-lsp-server-1.11.0.tar.gz", hash = "sha256:89edd6fb3f7852e4bf5a3d1d95ea41484d1a28fa94b6e3cbff12b9db123b8e86"}, + {file = "python_lsp_server-1.11.0-py3-none-any.whl", hash = "sha256:278cb41ea69ca9f84ec99d4edc96ff5f2f9e795d240771dc46dc1653f56ddfe3"}, +] + +[package.dependencies] +docstring-to-markdown = "*" +jedi = ">=0.17.2,<0.20.0" +pluggy = ">=1.0.0" +python-lsp-jsonrpc = ">=1.1.0,<2.0.0" +ujson = ">=3.0.0" + +[package.extras] +all = ["autopep8 (>=2.0.4,<2.1.0)", "flake8 (>=7,<8)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.11.0,<2.12.0)", "pydocstyle (>=6.3.0,<6.4.0)", "pyflakes (>=3.2.0,<3.3.0)", "pylint (>=3.1,<4)", "rope (>=1.11.0)", "whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] +autopep8 = ["autopep8 (>=2.0.4,<2.1.0)"] +flake8 = ["flake8 (>=7,<8)"] +mccabe = ["mccabe (>=0.7.0,<0.8.0)"] +pycodestyle = ["pycodestyle (>=2.11.0,<2.12.0)"] +pydocstyle = ["pydocstyle (>=6.3.0,<6.4.0)"] +pyflakes = ["pyflakes (>=3.2.0,<3.3.0)"] +pylint = ["pylint (>=3.1,<4)"] +rope = ["rope (>=1.11.0)"] +test = ["coverage", "flaky", "matplotlib", "numpy", "pandas", "pylint (>=3.1,<4)", "pyqt5", "pytest", "pytest-cov"] +websockets = ["websockets (>=10.3)"] +yapf = ["whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "torch" +version = "2.2.2" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.2.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:bc889d311a855dd2dfd164daf8cc903a6b7273a747189cebafdd89106e4ad585"}, + {file = "torch-2.2.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15dffa4cc3261fa73d02f0ed25f5fa49ecc9e12bf1ae0a4c1e7a88bbfaad9030"}, + {file = "torch-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:11e8fe261233aeabd67696d6b993eeb0896faa175c6b41b9a6c9f0334bdad1c5"}, + {file = "torch-2.2.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:b2e2200b245bd9f263a0d41b6a2dab69c4aca635a01b30cca78064b0ef5b109e"}, + {file = "torch-2.2.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:877b3e6593b5e00b35bbe111b7057464e76a7dd186a287280d941b564b0563c2"}, + {file = "torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb"}, + {file = "torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf"}, + {file = "torch-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c"}, + {file = "torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059"}, + {file = "torch-2.2.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1"}, + {file = "torch-2.2.2-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:cf12cdb66c9c940227ad647bc9cf5dba7e8640772ae10dfe7569a0c1e2a28aca"}, + {file = "torch-2.2.2-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:89ddac2a8c1fb6569b90890955de0c34e1724f87431cacff4c1979b5f769203c"}, + {file = "torch-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:451331406b760f4b1ab298ddd536486ab3cfb1312614cfe0532133535be60bea"}, + {file = "torch-2.2.2-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:eb4d6e9d3663e26cd27dc3ad266b34445a16b54908e74725adb241aa56987533"}, + {file = "torch-2.2.2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:bf9558da7d2bf7463390b3b2a61a6a3dbb0b45b161ee1dd5ec640bf579d479fc"}, + {file = "torch-2.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd2bf7697c9e95fb5d97cc1d525486d8cf11a084c6af1345c2c2c22a6b0029d0"}, + {file = "torch-2.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b421448d194496e1114d87a8b8d6506bce949544e513742b097e2ab8f7efef32"}, + {file = "torch-2.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:3dbcd563a9b792161640c0cffe17e3270d85e8f4243b1f1ed19cca43d28d235b"}, + {file = "torch-2.2.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:31f4310210e7dda49f1fb52b0ec9e59382cfcb938693f6d5378f25b43d7c1d29"}, + {file = "torch-2.2.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:c795feb7e8ce2e0ef63f75f8e1ab52e7fd5e1a4d7d0c31367ade1e3de35c9e95"}, + {file = "torch-2.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a6e5770d68158d07456bfcb5318b173886f579fdfbf747543901ce718ea94782"}, + {file = "torch-2.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:67dcd726edff108e2cd6c51ff0e416fd260c869904de95750e80051358680d24"}, + {file = "torch-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:539d5ef6c4ce15bd3bd47a7b4a6e7c10d49d4d21c0baaa87c7d2ef8698632dfb"}, + {file = "torch-2.2.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:dff696de90d6f6d1e8200e9892861fd4677306d0ef604cb18f2134186f719f82"}, + {file = "torch-2.2.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:3a4dd910663fd7a124c056c878a52c2b0be4a5a424188058fe97109d4436ee42"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + +[[package]] +name = "tqdm" +version = "4.66.2" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "triton" +version = "2.2.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2294514340cfe4e8f4f9e5c66c702744c4a117d25e618bd08469d0bfed1e2e5"}, + {file = "triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da58a152bddb62cafa9a857dd2bc1f886dbf9f9c90a2b5da82157cd2b34392b0"}, + {file = "triton-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af58716e721460a61886668b205963dc4d1e4ac20508cc3f623aef0d70283d5"}, + {file = "triton-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8fe46d3ab94a8103e291bd44c741cc294b91d1d81c1a2888254cbf7ff846dab"}, + {file = "triton-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ce26093e539d727e7cf6f6f0d932b1ab0574dc02567e684377630d86723ace"}, + {file = "triton-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:227cc6f357c5efcb357f3867ac2a8e7ecea2298cd4606a8ba1e931d1d5a947df"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] + +[[package]] +name = "typing-extensions" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, +] + +[[package]] +name = "ujson" +version = "5.9.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa"}, + {file = "ujson-5.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106"}, + {file = "ujson-5.9.0-cp310-cp310-win32.whl", hash = "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c"}, + {file = "ujson-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d"}, + {file = "ujson-5.9.0-cp311-cp311-win32.whl", hash = "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120"}, + {file = "ujson-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c"}, + {file = "ujson-5.9.0-cp312-cp312-win32.whl", hash = "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437"}, + {file = "ujson-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b"}, + {file = "ujson-5.9.0-cp38-cp38-win32.whl", hash = "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d"}, + {file = "ujson-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844"}, + {file = "ujson-5.9.0-cp39-cp39-win32.whl", hash = "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34"}, + {file = "ujson-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd"}, + {file = "ujson-5.9.0.tar.gz", hash = "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "f1ac9f8912b4e220c40bd29453219d15897f96ae13f070641ba8dedc36e86957" diff --git a/PyGame/pyproject.toml b/PyGame/pyproject.toml new file mode 100644 index 0000000..886840c --- /dev/null +++ b/PyGame/pyproject.toml @@ -0,0 +1,45 @@ +[tool.poetry] +name = "thesis" +version = "0.8.1" +description = "A training environment for MARL" +authors = ["Vasilis Valatsos "] +license = "MPL-2.0" +readme = "README.md" +package-mode = false + +[tool.poetry.dependencies] +python = "^3.11" +contourpy = "^1.2.0" +cycler = "^0.12.1" +docstring-to-markdown = "^0.13" +filelock = "^3.13.1" +fonttools = "^4.45.1" +fsspec = "^2023.10.0" +jedi = "^0.19.1" +jinja2 = "^3.1.2" +kiwisolver = "^1.4.5" +markupsafe = "^2.1.3" +matplotlib = "^3.8.2" +mpmath = "^1.3.0" +networkx = "^3.2.1" +numpy = "^1.26.2" +packaging = "^23.2" +parso = "^0.8.3" +pillow = "^10.1.0" +pluggy = "^1.3.0" +pygame = "^2.5.2" +pyparsing = "^3.1.1" +python-dateutil = "^2.8.2" +python-lsp-jsonrpc = "^1.1.2" +python-lsp-server = "^1.9.0" +six = "^1.16.0" +sympy = "^1.12" +torch = "^2.1.0" +tqdm = "^4.66.1" +typing-extensions = "^4.8.0" +ujson = "^5.8.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/PyGame/utils/__init__.py b/PyGame/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/utils/debug.py b/PyGame/utils/debug.py new file mode 100644 index 0000000..6cdc42c --- /dev/null +++ b/PyGame/utils/debug.py @@ -0,0 +1,13 @@ +import pygame + +pygame.init() + +font = pygame.font.Font(None, 30) + + +def debug(info, y=10, x=10): + display_surface = pygame.display.get_surface() + debug_surf = font.render(str(info), True, 'White') + debug_rect = debug_surf.get_rect(topleft=(x, y)) + pygame.draw.rect(display_surface, 'Black', debug_rect) + display_surface.blit(debug_surf, debug_rect) diff --git a/PyGame/utils/hyperparams.py b/PyGame/utils/hyperparams.py new file mode 100644 index 0000000..0cd7274 --- /dev/null +++ b/PyGame/utils/hyperparams.py @@ -0,0 +1,16 @@ +HPARAMS = { + + "horizon": 256, + "num_epochs": 10, + "batch_size": 15, + + "policy_clip": 0.1, + "discount_factor": 0.99, + "GAE_lambda": 0.95, + + "entropy_coeff": 0.01, + "value_coeff": 0.5, + + "learning_rate": 0.0003, + +} diff --git a/PyGame/utils/metrics.py b/PyGame/utils/metrics.py new file mode 100644 index 0000000..318ccc9 --- /dev/null +++ b/PyGame/utils/metrics.py @@ -0,0 +1,75 @@ +import os +import numpy as np +import matplotlib.pyplot as plt + + +def plot_learning_curve(scores, num_players, figure_path, n_episodes): + + plt.figure() + plt.title("Running Average - Score") + plt.xlabel("Episode") + plt.ylabel("Score") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for score in scores: + running_avg = np.zeros(len(score)) + for i in range(len(score)): + if score[i] != 0: + running_avg[i] = np.mean(score[max(0, i-int(n_episodes/10)):i+1]) + plt.plot(running_avg) + plt.savefig(os.path.join(figure_path, "avg_score.png")) + plt.close() + +def plot_avg_time(time_steps, num_players, fig_path): + + plt.figure() + plt.title("Average Time Steps per Episode") + for player in time_steps: + plt.plot(player) + plt.savefig(os.path.join(fig_path, 'avg_time.png')) + plt.close() + +def plot_score(scores, num_players, figure_path): + + plt.figure() + plt.title("Agent Rewards - No Averaging") + plt.xlabel("Episode") + plt.ylabel("Score") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for player_score in scores: + plt.plot(player_score) + plt.savefig(os.path.join(figure_path, 'score.png')) + plt.close() + + +def plot_loss(nn_type, losses, num_players, figure_path, n_episodes): + + plt.figure() + plt.title(f"Running Average - {nn_type.capitalize()} Loss") + plt.xlabel("Learning Iterations") + plt.ylabel("Loss") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for loss in losses: + running_avg = np.zeros(len(loss)) + for i in range(len(loss)): + if loss[i] != 0: + running_avg[i] = np.mean(loss[max(0, i-int(n_episodes/10)):(i+1)]) + plt.plot(running_avg) + plt.savefig(os.path.join(figure_path, f"{nn_type}_loss.png")) + plt.close() + + +def plot_parameter(name, parameter, num_players, figure_path, n_episodes): + + plt.figure() + plt.title(f"Running Average - {name.capitalize()}") + plt.xlabel("Learning Iterations") + plt.ylabel(f"{name.capitalize()}") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for param in parameter: + running_avg = np.zeros(len(param)) + for i in range(len(param)): + if param[i] != 0: + running_avg[i] = np.mean(param[max(0, i-int(n_episodes/10)):(i+1)]) + plt.plot(running_avg) + plt.savefig(os.path.join(figure_path, f"{name}.png")) + plt.close() diff --git a/PyGame/utils/resource_loader.py b/PyGame/utils/resource_loader.py new file mode 100644 index 0000000..21c406f --- /dev/null +++ b/PyGame/utils/resource_loader.py @@ -0,0 +1,42 @@ +import pygame +from csv import reader +import os + + +def import_csv_layout(path): + script_dir = os.path.dirname(os.path.abspath(__file__)) + path = os.path.join(script_dir, + '..', + 'assets', + path) + terrain_map = [] + with open(path) as level_map: + layout = reader(level_map, delimiter=',') + for row in layout: + terrain_map.append(list(row)) + return terrain_map + + +def import_folder(path): + script_dir = os.path.dirname(os.path.abspath(__file__)) + + path = os.path.join(script_dir, + '..', + 'assets', + path) + surface_list = [] + + for _, __, img_files in os.walk(path): + for image in img_files: + full_path = os.path.join(path, image) + image_surf = pygame.image.load(full_path).convert_alpha() + + surface_list.append(image_surf) + return surface_list + + +def import_assets(path): + script_dir = os.path.dirname(os.path.abspath(__file__)) + return os.path.join(script_dir, + '..', + 'assets', path) diff --git a/PyGame/utils/seeds.py b/PyGame/utils/seeds.py new file mode 100644 index 0000000..5787159 --- /dev/null +++ b/PyGame/utils/seeds.py @@ -0,0 +1,11 @@ +import random +import torch as T +import numpy as np + + +def set_seeds(value): + + random.seed(value) + np.random.seed(value) + T.manual_seed(value) + T.cuda.manual_seed_all(value)