Refined Hamster AI routines, make them follow better.

sigonasr2 6 months ago
parent 28526444eb
commit f5c2a3f2a8
  1. 2
      TestLevel.tmx.0
  2. 2
      TestLevel.tmx.1
  3. 2
      TestLevel.tmx.2
  4. 126
      src/Hamster.cpp
  5. 8
      src/Hamster.h
  6. 16
      src/HamsterAI.cpp
  7. 5
      src/HamsterAI.h
  8. 85
      src/HamsterJet.cpp
  9. 3
      src/HamsterJet.h

@ -1 +1 @@
33 223 0 48 211 0 64 220 0 68 224 0 73 240 0 73 256 0 80 270 0 81 272 0 82 288 0 82 304 0 82 320 0 83 336 0 94 352 0 95 368 0 95 384 0 96 384 0 104 400 0 104 416 0 104 432 0 104 448 0 104 464 0 104 480 0 104 496 0 104 512 0 104 528 0 104 544 0 104 560 0 104 576 0 104 592 0 104 608 0 104 624 0 104 640 0 104 656 0 104 672 0 104 688 0 104 689 1 104 704 0 104 720 0 112 733 0 115 736 0 128 749 0 131 752 0 144 765 0 147 768 0 160 781 0 162 784 0 176 796 0 192 799 0 208 799 0 224 799 0 240 799 0 256 799 0 272 799 0 278 800 0 288 803 0 300 816 0 302 818 2 304 820 0 320 830 0 326 832 0 336 834 0 352 838 0 368 842 0 384 846 0 390 848 0 400 850 0 416 854 0 433 858 0 444 864 0 448 868 0 459 880 0 464 889 0 465 896 0 466 912 0 466 928 0 466 945 0 466 961 0 466 976 0 466 993 0 466 1008 0 466 1024 0 466 1041 0 466 1057 0 466 1072 0 466 1089 0 466 1104 0 466 1120 0 466 1136 0 466 1152 0 466 1168 0 466 1184 0 466 1200 0 466 1217 0 466 1232 0 466 1248 0 466 1264 0 466 1280 0 466 1296 0 466 1313 0 466 1328 0 466 1345 0 466 1361 0 466 1376 0 466 1392 0 467 1408 0 469 1424 0 474 1441 0 480 1455 0 481 1458 0 489 1472 0 496 1481 0 502 1489 0 514 1500 0 518 1505 0 528 1515 0 532 1520 0 544 1538 0 552 1553 0 558 1570 0 560 1577 0 562 1584 0 565 1602 0 566 1616 0 566 1633 0 567 1650 0 567 1666 0 568 1681 0 568 1698 0 569 1713 0 569 1730 0 570 1745 0 570 1761 0 570 1776 0 559 1787 0 543 1777 0 543 1775 0 543 1759 0 544 1752 0 549 1743 0 560 1733 0 567 1727 0 576 1726 0 588 1726 3 592 1726 0 640 1701 0 651 1695 0 656 1693 0 672 1685 0 685 1679 0 688 1678 0 704 1670 0 719 1663 0 720 1663 0 736 1655 0 752 1648 0 753 1647 0 768 1640 0 784 1633 0 787 1631 0 800 1625 0 816 1618 0 821 1615 0 864 1595 0 781 1634 0 872 1592 0 880 1592 0 893 1583 0 893 1567 0 893 1551 0 893 1535 0 893 1519 0 893 1503 0 889 1487 0 879 1477 0 874 1471 0 863 1461 0 858 1455 0 847 1445 0 842 1439 0 831 1429 0 826 1423 0 815 1413 0 810 1407 0 799 1404 0 783 1404 0 767 1391 0 751 1375 0 735 1359 0 719 1343 0 703 1328 0 703 1327 0 687 1312 0 687 1311 0 671 1296 0 671 1295 0 655 1279 0 639 1263 0 623 1247 0 607 1231 0 591 1216 0 591 1215 0 575 1199 0 561 1183 0 560 1167 0 560 1151 0 566 1135 0 576 1126 0 582 1120 4 582 1119 0 592 1110 0 599 1103 0 608 1094 0 615 1087 0 624 1078 0 631 1071 0 640 1062 0 646 1055 0 656 1046 0 663 1039 0 672 1030 0 678 1023 0 688 1014 0 694 1007 0 704 998 0 710 991 0 720 982 0 726 975 0 736 966 0 742 959 0 752 950 0 759 943 0 768 934 0 774 927 0 784 922 0 800 922 0 816 922 0 832 922 0 848 917 0 854 911 0 864 902 0 880 896 0 896 896 0 911 895 0 912 895 0 928 881 0 930 879 0 935 863 0 935 847 0 933 831 0 927 825 0 917 815 0 911 809 0 901 799 0 895 793 0 885 783 0 879 777 0 869 767 0 863 761 0 851 751 0 847 750 0 831 750 0 815 750 0 799 741 0 794 735 0 783 724 0 778 719 0 767 708 0 762 703 0 751 692 0 746 687 0 735 677 0 719 676 0 703 676 0 690 671 0 687 668 0 674 655 0 671 653 0 663 644 4 658 639 0 655 636 0 639 629 0 623 629 0 607 636 0 604 640 0 591 652 0 588 656 0 575 668 0 572 672 0 559 684 0 556 688 0 543 700 0 539 704 0 527 715 0 511 718 0 495 705 0 493 703 0 479 694 0 478 694 1 463 694 0 447 698 0 441 704 0 431 714 0 425 720 0 415 726 0 399 721 0 398 719 0 383 711 0 367 712 0 356 720 0 351 727 0 349 736 0 349 752 0 349 768 0 349 784 0 349 800 0 349 816 0 349 832 0 349 840 4 349 848 0
79 232 0 64 240 0 63 241 0 62 256 0 62 272 0 62 288 0 64 291 0 74 304 0 77 320 0 77 336 0 77 352 0 78 368 0 80 370 0 87 384 0 87 400 0 87 416 0 87 432 0 87 448 0 87 464 0 87 480 0 87 496 0 87 512 0 87 528 0 87 544 0 87 560 0 87 576 0 87 592 0 87 608 0 87 624 0 87 640 0 87 656 0 87 672 0 87 688 0 87 689 1 87 704 0 89 720 0 96 727 0 104 736 0 112 743 0 120 752 0 125 768 0 125 784 0 125 800 0 125 809 2 125 816 0 125 815 0 125 816 0 128 824 0 144 828 0 158 832 0 160 832 0 176 836 0 192 840 0 208 844 0 222 848 0 224 848 0 240 852 0 255 864 0 256 865 0 270 880 0 273 883 0 288 892 0 294 896 0 304 907 0 310 913 0 320 922 0 326 929 0 337 939 0 343 945 0 352 954 0 359 961 0 368 970 0 374 976 0 384 986 0 391 993 0 400 1002 0 407 1009 0 416 1018 0 422 1025 0 432 1034 0 438 1040 0 448 1050 0 454 1056 0 465 1067 0 472 1074 0 480 1082 0 488 1090 0 499 1101 0 503 1105 0 514 1117 0 517 1122 0 528 1139 0 537 1156 0 540 1168 0 544 1185 0 546 1203 0 546 1216 0 546 1237 0 546 1250 0 546 1264 0 546 1285 0 546 1298 0 546 1312 0 546 1332 0 546 1346 0 546 1360 0 546 1382 0 547 1395 0 548 1409 0 552 1428 0 557 1444 0 562 1454 0 564 1459 0 573 1474 0 576 1479 0 583 1488 0 595 1501 0 599 1505 0 611 1517 0 615 1521 0 627 1533 0 631 1537 0 643 1549 0 647 1554 0 657 1567 0 660 1572 0 668 1586 0 672 1597 0 674 1602 0 680 1617 0 685 1632 0 689 1642 0 692 1651 0 696 1664 0 702 1681 0 704 1684 0 708 1696 0 714 1713 0 719 1728 0 720 1730 0 725 1744 0 730 1760 0 732 1764 3 723 1776 0 719 1779 0 707 1792 0 703 1795 0 695 1808 0 694 1824 0 694 1840 0 692 1856 0 687 1863 0 674 1872 0 670 1873 0 654 1873 0 649 1871 0 638 1863 0 630 1855 0 623 1848 0 615 1839 0 607 1832 0 597 1823 0 591 1818 0 580 1807 0 575 1802 0 565 1791 0 565 1775 0 565 1759 0 571 1743 0 576 1738 0 587 1727 0 588 1726 4 888 1591 0 896 1589 0 902 1583 0 905 1567 0 897 1551 0 895 1549 0 879 1545 0 863 1545 0 847 1545 0 831 1545 0 815 1545 0 799 1545 0 783 1545 0 768 1552 0 767 1552 0 752 1568 0 751 1569 0 736 1584 0 735 1585 0 720 1600 0 719 1600 0 704 1616 0 703 1616 0 688 1632 0 687 1632 0 671 1646 0 655 1647 0 639 1647 0 623 1648 0 607 1660 0 604 1664 0 591 1667 0 575 1667 0 559 1667 0 543 1667 0 527 1667 0 511 1667 0 495 1667 0 480 1663 0 479 1663 0 473 1651 4 167 1367 0 167 1359 0 166 1343 0 171 1327 0 176 1322 0 187 1311 0 192 1306 0 203 1295 0 208 1290 0 219 1279 0 224 1274 0 235 1263 0 240 1258 0 251 1247 0 256 1242 0 267 1231 0 272 1226 0 283 1215 0 288 1210 0 299 1199 0 304 1194 0 315 1183 0 320 1178 0 331 1167 0 336 1162 0 347 1151 0 352 1146 0 368 1136 0 384 1136 0 400 1136 0 407 1135 0 416 1131 0 427 1119 0 432 1114 0 443 1103 0 448 1099 0 460 1087 0 464 1082 0 480 1078 0 496 1078 0 512 1078 0 528 1078 0 544 1078 0 560 1078 0 576 1078 0 582 1078 5 592 1075 0 597 1071 0 598 1055 0 591 1046 0 585 1039 0 575 1030 0 568 1023 0 559 1014 0 552 1007 0 543 998 0 537 991 0 527 982 0 511 976 0 495 976 0 486 975 0 479 973 0 465 959 0 463 957 0 455 950 5 449 943 0 447 941 0 434 927 0 433 911 0 433 895 0 435 879 0 448 866 0 451 863 0 464 850 0 467 847 0 480 834 0 482 831 0 496 817 0 499 815 0 512 801 0 514 799 0 528 786 0 530 783 0 544 770 0 547 767 0 560 754 0 563 751 0 576 737 0 579 735 0 592 722 0 595 719 0 608 703 0 608 687 0 608 671 0 608 656 5 608 655 0 607 639 0 605 623 0 605 607 0 606 591 0 607 575 0 608 564 0 608 559 0 609 543 0 610 527 0 610 511 0

@ -1 +1 @@
97 384 0 97 400 0 97 416 0 97 432 0 97 448 0 102 464 0 112 473 0 115 480 0 115 496 0 115 512 0 111 526 0 110 528 0 95 543 0 95 544 0 89 560 0 90 576 0 96 587 0 101 592 0 109 608 0 109 624 0 109 640 0 109 656 0 109 672 0 109 688 0 109 691 1 112 701 0 114 704 0 128 718 0 130 720 0 144 733 0 146 736 0 160 750 0 163 752 0 176 754 0 192 753 0 194 751 0 208 738 0 211 735 0 224 723 0 227 719 0 240 704 0 240 703 0 243 687 0 243 671 0 243 655 0 243 639 0 243 623 0 243 607 0 243 591 0 243 575 0 243 559 0 243 543 0 243 527 0 243 511 0 247 495 0 256 484 0 261 479 0 272 468 0 277 463 0 288 454 0 304 451 0 308 448 1 309 447 0 312 431 0 303 421 0 298 415 0 287 405 0 283 400 1 282 399 0 271 388 0 265 383 0 255 372 0 250 367 0 239 356 0 233 351 0 223 340 0 218 335 0 207 328 0 190 327 0 174 327 0 159 327 0 144 319 0 143 318 0 128 303 0 127 302 0 112 287 0 111 287 0 95 281 0 79 281 0 63 281 0 47 278 0 40 271 0 31 261 0 29 255 0 28 239 0 28 223 0 28 206 0 32 198 0 37 191 0 48 182 0 64 177 0 80 178 0 96 188 0 99 192 0 112 200 0 128 201 0 144 201 0 161 201 0 176 201 0 192 201 0 209 201 0 224 201 0
79 232 0 64 240 0 63 241 0 62 256 0 62 272 0 62 288 0 64 291 0 74 304 0 77 320 0 77 336 0 77 352 0 78 368 0 80 370 0 87 384 0 87 400 0 87 416 0 87 432 0 87 448 0 87 464 0 87 480 0 87 496 0 87 512 0 87 528 0 87 544 0 87 560 0 87 576 0 87 592 0 87 608 0 87 624 0 87 640 0 87 656 0 87 672 0 87 688 0 87 689 1 87 704 0 89 720 0 96 727 0 104 736 0 112 743 0 120 752 0 125 768 0 125 784 0 125 800 0 125 809 2 125 816 0 125 815 0 125 816 0 128 824 0 144 828 0 158 832 0 160 832 0 176 836 0 192 840 0 208 844 0 222 848 0 224 848 0 240 852 0 255 864 0 256 865 0 270 880 0 273 883 0 288 892 0 294 896 0 304 907 0 310 913 0 320 922 0 326 929 0 337 939 0 343 945 0 352 954 0 359 961 0 368 970 0 374 976 0 384 986 0 391 993 0 400 1002 0 407 1009 0 416 1018 0 422 1025 0 432 1034 0 438 1040 0 448 1050 0 454 1056 0 465 1067 0 472 1074 0 480 1082 0 488 1090 0 499 1101 0 503 1105 0 514 1117 0 517 1122 0 528 1139 0 537 1156 0 540 1168 0 544 1185 0 546 1203 0 546 1216 0 546 1237 0 546 1250 0 546 1264 0 546 1285 0 546 1298 0 546 1312 0 546 1332 0 546 1346 0 546 1360 0 546 1382 0 547 1395 0 548 1409 0 552 1428 0 557 1444 0 562 1454 0 564 1459 0 573 1474 0 576 1479 0 583 1488 0 595 1501 0 599 1505 0 611 1517 0 615 1521 0 627 1533 0 631 1537 0 643 1549 0 647 1554 0 657 1567 0 660 1572 0 668 1586 0 672 1597 0 674 1602 0 680 1617 0 685 1632 0 689 1642 0 692 1651 0 696 1664 0 702 1681 0 704 1684 0 708 1696 0 714 1713 0 719 1728 0 720 1730 0 725 1744 0 730 1760 0 732 1764 3 723 1776 0 719 1779 0 707 1792 0 703 1795 0 695 1808 0 694 1824 0 694 1840 0 692 1856 0 687 1863 0 674 1872 0 670 1873 0 654 1873 0 649 1871 0 638 1863 0 630 1855 0 623 1848 0 615 1839 0 607 1832 0 597 1823 0 591 1818 0 580 1807 0 575 1802 0 565 1791 0 565 1775 0 565 1759 0 571 1743 0 576 1738 0 587 1727 0 588 1726 4 888 1591 0 896 1589 0 902 1583 0 905 1567 0 897 1551 0 895 1549 0 879 1545 0 863 1545 0 847 1545 0 831 1545 0 815 1545 0 799 1545 0 783 1545 0 768 1552 0 767 1552 0 752 1568 0 751 1569 0 736 1584 0 735 1585 0 720 1600 0 719 1600 0 704 1616 0 703 1616 0 688 1632 0 687 1632 0 671 1646 0 655 1647 0 639 1647 0 623 1648 0 607 1660 0 604 1664 0 591 1667 0 575 1667 0 559 1667 0 543 1667 0 527 1667 0 511 1667 0 495 1667 0 480 1663 0 479 1663 0 473 1651 4 167 1367 0 167 1359 0 166 1343 0 171 1327 0 176 1322 0 187 1311 0 192 1306 0 203 1295 0 208 1290 0 219 1279 0 224 1274 0 235 1263 0 240 1258 0 251 1247 0 256 1242 0 267 1231 0 272 1226 0 283 1215 0 288 1210 0 299 1199 0 304 1194 0 315 1183 0 320 1178 0 331 1167 0 336 1162 0 347 1151 0 352 1146 0 368 1136 0 384 1136 0 400 1136 0 407 1135 0 416 1131 0 427 1119 0 432 1114 0 443 1103 0 448 1099 0 460 1087 0 464 1082 0 480 1078 0 496 1078 0 512 1078 0 528 1078 0 544 1078 0 560 1078 0 576 1078 0 582 1078 5 592 1075 0 597 1071 0 598 1055 0 591 1046 0 585 1039 0 575 1030 0 568 1023 0 559 1014 0 552 1007 0 543 998 0 537 991 0 527 982 0 511 976 0 495 976 0 486 975 0 479 973 0 465 959 0 463 957 0 455 950 5 449 943 0 447 941 0 434 927 0 433 911 0 433 895 0 435 879 0 448 866 0 451 863 0 464 850 0 467 847 0 480 834 0 482 831 0 496 817 0 499 815 0 512 801 0 514 799 0 528 786 0 530 783 0 544 770 0 547 767 0 560 754 0 563 751 0 576 737 0 579 735 0 592 722 0 595 719 0 608 703 0 608 687 0 608 671 0 608 656 5 608 655 0 607 639 0 605 623 0 605 607 0 606 591 0 607 575 0 608 564 0 608 559 0 609 543 0 610 527 0 610 511 0

@ -1 +1 @@
97 384 0 97 400 0 97 416 0 97 432 0 97 448 0 102 464 0 112 473 0 115 480 0 115 496 0 115 512 0 111 526 0 110 528 0 95 543 0 95 544 0 89 560 0 90 576 0 96 587 0 101 592 0 109 608 0 109 624 0 109 640 0 109 656 0 109 672 0 109 688 0 109 691 1 112 701 0 114 704 0 128 718 0 130 720 0 144 733 0 146 736 0 160 750 0 163 752 0 176 754 0 192 753 0 194 751 0 208 738 0 211 735 0 224 723 0 227 719 0 240 704 0 240 703 0 243 687 0 243 671 0 243 655 0 243 639 0 243 623 0 243 607 0 243 591 0 243 575 0 243 559 0 243 543 0 243 527 0 243 511 0 247 495 0 256 484 0 261 479 0 272 468 0 277 463 0 288 454 0 304 451 0 308 448 1 309 447 0 312 431 0 303 421 0 298 415 0 287 405 0 283 400 1 282 399 0 271 388 0 265 383 0 255 372 0 250 367 0 239 356 0 233 351 0 223 340 0 218 335 0 207 328 0 190 327 0 174 327 0 159 327 0 144 319 0 143 318 0 128 303 0 127 302 0 112 287 0 111 287 0 95 281 0 79 281 0 63 281 0 47 278 0 40 271 0 31 261 0 29 255 0 28 239 0 28 223 0 28 206 0 32 198 0 37 191 0 48 182 0 64 177 0 80 178 0 96 188 0 99 192 0 112 200 0 128 201 0 144 201 0 161 201 0 176 201 0 192 201 0 209 201 0 224 201 0
79 232 0 64 240 0 63 241 0 62 256 0 62 272 0 62 288 0 64 291 0 74 304 0 77 320 0 77 336 0 77 352 0 78 368 0 80 370 0 87 384 0 87 400 0 87 416 0 87 432 0 87 448 0 87 464 0 87 480 0 87 496 0 87 512 0 87 528 0 87 544 0 87 560 0 87 576 0 87 592 0 87 608 0 87 624 0 87 640 0 87 656 0 87 672 0 87 688 0 87 689 1 87 704 0 89 720 0 96 727 0 104 736 0 112 743 0 120 752 0 125 768 0 125 784 0 125 800 0 125 809 2 125 816 0 125 815 0 125 816 0 128 824 0 144 828 0 158 832 0 160 832 0 176 836 0 192 840 0 208 844 0 222 848 0 224 848 0 240 852 0 255 864 0 256 865 0 270 880 0 273 883 0 288 892 0 294 896 0 304 907 0 310 913 0 320 922 0 326 929 0 337 939 0 343 945 0 352 954 0 359 961 0 368 970 0 374 976 0 384 986 0 391 993 0 400 1002 0 407 1009 0 416 1018 0 422 1025 0 432 1034 0 438 1040 0 448 1050 0 454 1056 0 465 1067 0 472 1074 0 480 1082 0 488 1090 0 499 1101 0 503 1105 0 514 1117 0 517 1122 0 528 1139 0 537 1156 0 540 1168 0 544 1185 0 546 1203 0 546 1216 0 546 1237 0 546 1250 0 546 1264 0 546 1285 0 546 1298 0 546 1312 0 546 1332 0 546 1346 0 546 1360 0 546 1382 0 547 1395 0 548 1409 0 552 1428 0 557 1444 0 562 1454 0 564 1459 0 573 1474 0 576 1479 0 583 1488 0 595 1501 0 599 1505 0 611 1517 0 615 1521 0 627 1533 0 631 1537 0 643 1549 0 647 1554 0 657 1567 0 660 1572 0 668 1586 0 672 1597 0 674 1602 0 680 1617 0 685 1632 0 689 1642 0 692 1651 0 696 1664 0 702 1681 0 704 1684 0 708 1696 0 714 1713 0 719 1728 0 720 1730 0 725 1744 0 730 1760 0 732 1764 3 723 1776 0 719 1779 0 707 1792 0 703 1795 0 695 1808 0 694 1824 0 694 1840 0 692 1856 0 687 1863 0 674 1872 0 670 1873 0 654 1873 0 649 1871 0 638 1863 0 630 1855 0 623 1848 0 615 1839 0 607 1832 0 597 1823 0 591 1818 0 580 1807 0 575 1802 0 565 1791 0 565 1775 0 565 1759 0 571 1743 0 576 1738 0 587 1727 0 588 1726 4 888 1591 0 896 1589 0 902 1583 0 905 1567 0 897 1551 0 895 1549 0 879 1545 0 863 1545 0 847 1545 0 831 1545 0 815 1545 0 799 1545 0 783 1545 0 768 1552 0 767 1552 0 752 1568 0 751 1569 0 736 1584 0 735 1585 0 720 1600 0 719 1600 0 704 1616 0 703 1616 0 688 1632 0 687 1632 0 671 1646 0 655 1647 0 639 1647 0 623 1648 0 607 1660 0 604 1664 0 591 1667 0 575 1667 0 559 1667 0 543 1667 0 527 1667 0 511 1667 0 495 1667 0 480 1663 0 479 1663 0 473 1651 4 167 1367 0 167 1359 0 166 1343 0 171 1327 0 176 1322 0 187 1311 0 192 1306 0 203 1295 0 208 1290 0 219 1279 0 224 1274 0 235 1263 0 240 1258 0 251 1247 0 256 1242 0 267 1231 0 272 1226 0 283 1215 0 288 1210 0 299 1199 0 304 1194 0 315 1183 0 320 1178 0 331 1167 0 336 1162 0 347 1151 0 352 1146 0 368 1136 0 384 1136 0 400 1136 0 407 1135 0 416 1131 0 427 1119 0 432 1114 0 443 1103 0 448 1099 0 460 1087 0 464 1082 0 480 1078 0 496 1078 0 512 1078 0 528 1078 0 544 1078 0 560 1078 0 576 1078 0 582 1078 5 592 1075 0 597 1071 0 598 1055 0 591 1046 0 585 1039 0 575 1030 0 568 1023 0 559 1014 0 552 1007 0 543 998 0 537 991 0 527 982 0 511 976 0 495 976 0 486 975 0 479 973 0 465 959 0 463 957 0 455 950 5 449 943 0 447 941 0 434 927 0 433 911 0 433 895 0 435 879 0 448 866 0 451 863 0 464 850 0 467 847 0 480 834 0 482 831 0 496 817 0 499 815 0 512 801 0 514 799 0 528 786 0 530 783 0 544 770 0 547 767 0 560 754 0 563 751 0 576 737 0 579 735 0 592 722 0 595 719 0 608 703 0 608 687 0 608 671 0 608 656 5 608 655 0 607 639 0 605 623 0 605 607 0 606 591 0 607 575 0 608 564 0 608 559 0 609 543 0 610 527 0 610 511 0

@ -63,6 +63,7 @@ void Hamster::UpdateHamsters(const float fElapsedTime){
for(Hamster&h:HAMSTER_LIST){
h.lastSafeLocationTimer=std::max(0.f,h.lastSafeLocationTimer-fElapsedTime);
h.animations.UpdateState(h.internalAnimState,fElapsedTime);
h.aiNodeTime+=fElapsedTime;
h.frictionEnabled=true;
h.bumpTimer-=fElapsedTime;
h.HandleCollision();
@ -72,7 +73,7 @@ void Hamster::UpdateHamsters(const float fElapsedTime){
if(h.IsPlayerControlled){
h.HandlePlayerControls();
}else{
h.HandleNPCControls();
h.HandleAIControls();
}
}
}break;
@ -132,14 +133,28 @@ void Hamster::UpdateHamsters(const float fElapsedTime){
}break;
case BURROW_WAIT:{
h.burrowTimer-=fElapsedTime;
const Tunnel&enteredTunnel{HamsterGame::Game().GetTunnels().at(h.enteredTunnel)};
const vf2d destinationTunnelPos{HamsterGame::Game().GetTunnels().at(enteredTunnel.linkedTo).worldPos+vi2d{8,8}};
if(h.burrowTimer<=0.f){
h.burrowTimer=1.f;
h.SetState(SURFACING);
h.imgScale=0.f;
h.burrowImgShrinkTimer=0.5f;
switch(HamsterGame::Game().GetTileFacingDirection(destinationTunnelPos)){
case Terrain::NORTH:{
h.targetRot=-geom2d::pi/2;
}break;
case Terrain::EAST:{
h.targetRot=0.f;
}break;
case Terrain::SOUTH:{
h.targetRot=geom2d::pi/2;
}break;
case Terrain::WEST:{
h.targetRot=geom2d::pi;
}break;
}
}
const Tunnel&enteredTunnel{HamsterGame::Game().GetTunnels().at(h.enteredTunnel)};
const vf2d destinationTunnelPos{HamsterGame::Game().GetTunnels().at(enteredTunnel.linkedTo).worldPos+vi2d{8,8}};
h.pos=destinationTunnelPos.lerp(enteredTunnel.worldPos+vi2d{8,8},h.burrowTimer/3.f);
}break;
case SURFACING:{
@ -346,6 +361,7 @@ void Hamster::TurnTowardsTargetDirection(){
}
void Hamster::MoveHamster(){
if(IsBurrowed())return;
SetPos(GetPos()+vel*HamsterGame::Game().GetElapsedTime());
distanceTravelled+=vel.mag()*HamsterGame::Game().GetElapsedTime();
@ -363,8 +379,10 @@ void Hamster::MoveHamster(){
}
void Hamster::HandleCollision(){
if(IsBurrowed())return;
for(Hamster&h:HAMSTER_LIST){
if(this==&h)continue;
if(h.IsBurrowed())continue;
if(abs(z-h.z)<=0.1f&&geom2d::overlaps(geom2d::circle<float>(GetPos(),GetRadius()),geom2d::circle<float>(h.GetPos(),h.GetRadius()))){
if(geom2d::line<float>(GetPos(),h.GetPos()).length()==0.f){ //Push these two in random directions, they are on top of each other!
float randDir{util::random(2*geom2d::pi)};
@ -373,7 +391,9 @@ void Hamster::HandleCollision(){
SetPos(collisionResolve1);
h.SetPos(collisionResolve2);
vel+=vf2d{GetBumpAmount(),randDir}.cart();
vel=vf2d{std::min(GetMaxSpeed(),vel.polar().x),vel.polar().y}.cart();
h.vel+=vf2d{GetBumpAmount(),float(randDir+geom2d::pi)}.cart();
h.vel=vf2d{std::min(h.GetMaxSpeed(),vel.polar().x),vel.polar().y}.cart();
}else{
geom2d::line<float>collisionLine{geom2d::line<float>(GetPos(),h.GetPos())};
float distance{collisionLine.length()};
@ -384,7 +404,9 @@ void Hamster::HandleCollision(){
SetPos(collisionResolve1);
h.SetPos(collisionResolve2);
vel+=vf2d{GetBumpAmount(),float(collisionLine.vector().polar().y+geom2d::pi)}.cart();
vel=vf2d{std::min(GetMaxSpeed(),vel.polar().x),vel.polar().y}.cart();
h.vel+=vf2d{GetBumpAmount(),collisionLine.vector().polar().y}.cart();
h.vel=vf2d{std::min(h.GetMaxSpeed(),vel.polar().x),vel.polar().y}.cart();
}
bumpTimer=h.bumpTimer=0.12f;
}
@ -403,7 +425,7 @@ void Hamster::HandleCollision(){
checkpointsCollected.insert(checkpoint.GetPos());
FloatingText::CreateFloatingText(pos,std::format("{} / {}",checkpointsCollected.size(),Checkpoint::GetCheckpoints().size()),{WHITE,GREEN},{1.5f,2.f});
if(IsPlayerControlled)HamsterAI::OnCheckpointCollected(this->pos);
checkpoint.OnCheckpointCollect();
if(IsPlayerControlled)checkpoint.OnCheckpointCollect();
}
}
if(GetState()==NORMAL){
@ -413,6 +435,20 @@ void Hamster::HandleCollision(){
burrowTimer=1.f;
enteredTunnel=id;
burrowImgShrinkTimer=0.5f;
switch(HamsterGame::Game().GetTileFacingDirection(tunnel.worldPos)){
case Terrain::NORTH:{
targetRot=geom2d::pi/2;
}break;
case Terrain::EAST:{
targetRot=geom2d::pi;
}break;
case Terrain::SOUTH:{
targetRot=-geom2d::pi/2;
}break;
case Terrain::WEST:{
targetRot=0.;
}break;
}
if(IsPlayerControlled)HamsterAI::OnTunnelEnter(this->pos);
}
}
@ -550,7 +586,7 @@ void Hamster::SetPos(const vf2d pos){
this->pos=vf2d{this->pos.x,pos.y};
movedY=true;
}
if(IsPlayerControlled&&(movedX||movedY))HamsterAI::OnMove(this->pos);
if(IsPlayerControlled&&(movedX||movedY)&&HamsterGame::Game().GetTerrainTypeAtPos(this->pos)!=Terrain::TUNNEL)HamsterAI::OnMove(this->pos);
}
void Hamster::SetZ(const float z){
@ -659,24 +695,44 @@ const bool Hamster::BurnedOrDrowned()const{
return GetState()==WAIT;
}
const bool Hamster::CanMove()const{
return !CollectedAllCheckpoints();
return !CollectedAllCheckpoints()&&!IsBurrowed();
}
const bool Hamster::FlyingInTheAir()const{
return GetState()==FLYING&&hamsterJet.value().GetZ()>0.5f&&GetZ()>0.5f;
}
void Hamster::HandleNPCControls(){
void Hamster::HandleAIControls(){
vf2d aimingDir{};
const HamsterAI::ActionOptRef&currentAction{ai.GetCurrentAction()};
if(!currentAction.has_value())return;
const HamsterAI::Action&action{currentAction.value().get()};
vf2d diff{action.pos-GetPos()};
if(aiNodeTime>GetAIAdjustNodeTime()){
if(ai.GetPreviousAction().has_value()&&ai.GetPreviousAction().value().get().type==HamsterAI::Action::MOVE){
ai.RevertToPreviousAction();
chooseTemporaryNodeNext=true;
}else{
int MAX_SEARCH_AMT{100};
float SEARCH_RANGE{1.f};
while(MAX_SEARCH_AMT>0){
temporaryNode=GetPos()+vf2d{util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16),util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16)};
if(!HamsterGame::Game().IsTerrainSolid(temporaryNode.value()))break;
SEARCH_RANGE+=1.25f;
MAX_SEARCH_AMT--;
}
}
aiNodeTime=0.f;
}
vf2d targetLoc{action.pos};
if(temporaryNode.has_value())targetLoc=temporaryNode.value();
vf2d diff{targetLoc-GetPos()};
if(diff.mag()<16.f){
if(action.type==HamsterAI::Action::LAUNCH_JET){
if(HasPowerup(Powerup::JET)){
if(true||HasPowerup(Powerup::JET)){ //Currently ignoring whether we have a jet or not...We can cheat!
SetState(FLYING);
lastSafeLocation.reset();
if(IsPlayerControlled)HamsterAI::OnJetLaunch(this->pos);
@ -688,6 +744,18 @@ void Hamster::HandleNPCControls(){
}
}
ai.AdvanceToNextAction();
if(chooseTemporaryNodeNext){
int MAX_SEARCH_AMT{100};
float SEARCH_RANGE{1.f};
while(MAX_SEARCH_AMT>0){
temporaryNode=GetPos()+vf2d{util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16),util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16)};
if(!HamsterGame::Game().IsTerrainSolid(temporaryNode.value()))break;
SEARCH_RANGE+=1.25f;
MAX_SEARCH_AMT--;
}
}else temporaryNode.reset();
chooseTemporaryNodeNext=false;
aiNodeTime=0.f;
}
const float moveThreshold{4.f};
@ -710,12 +778,38 @@ void Hamster::HandleNPCControls(){
vel=vf2d{std::min(GetMaxSpeed(),vel.polar().x),vel.polar().y}.cart();
frictionEnabled=false;
}
/* Initiating Flight
if(HasPowerup(Powerup::JET)){
SetState(FLYING);
lastSafeLocation.reset();
if(IsPlayerControlled)HamsterAI::OnJetLaunch(this->pos);
hamsterJet.emplace(*this);
}
const float Hamster::GetAILandingSpeed()const{
switch(ai.GetAIType()){
case HamsterAI::SMART:{
return 4.9f;
}break;
case HamsterAI::NORMAL:{
return 2.9f;
}break;
case HamsterAI::DUMB:{
return 1.2f;
}break;
}
return 2.f;
}
const float Hamster::GetAIAdjustNodeTime()const{
switch(ai.GetAIType()){
case HamsterAI::SMART:{
return 5.f;
}break;
case HamsterAI::NORMAL:{
return 7.5f;
}break;
case HamsterAI::DUMB:{
return 10.f;
}break;
}
*/
return 7.5f;
}
const bool Hamster::IsBurrowed()const{
return GetState()==BURROWING||GetState()==BURROW_WAIT||GetState()==SURFACING;
}

@ -122,6 +122,9 @@ class Hamster{
float burrowImgShrinkTimer{};
uint16_t enteredTunnel{};
HamsterAI ai;
float aiNodeTime{0.f};
std::optional<vf2d>temporaryNode;
bool chooseTemporaryNodeNext{false};
public:
Hamster(const vf2d spawnPos,const std::string&img,const PlayerControlled IsPlayerControlled=NPC);
static const Hamster&GetPlayer();
@ -133,7 +136,7 @@ public:
const vf2d&GetPos()const;
const float&GetZ()const;
void HandlePlayerControls();
void HandleNPCControls();
void HandleAIControls();
void TurnTowardsTargetDirection();
void MoveHamster();
void HandleCollision();
@ -171,4 +174,7 @@ public:
const bool BurnedOrDrowned()const;
const bool CanMove()const;
const bool FlyingInTheAir()const;
const float GetAILandingSpeed()const;
const float GetAIAdjustNodeTime()const;
const bool IsBurrowed()const;
};

@ -133,6 +133,20 @@ void HamsterAI::LoadAI(const std::string&mapName,AIType type){
file.close();
}
const HamsterAI::AIType HamsterAI::GetAIType(){
const HamsterAI::AIType HamsterAI::GetAIType()const{
return type;
}
void HamsterAI::OnJetBeginLanding(const vi2d pos){
recordedActions.emplace_back(pos,Action::LANDING);
}
const HamsterAI::ActionOptRef HamsterAI::GetPreviousAction(){
if(actionInd-1>0)return actionsToPerform[actionInd-1];
return {};
}
const HamsterAI::ActionOptRef HamsterAI::RevertToPreviousAction(){
if(actionInd-1>0)actionInd--;
return GetCurrentAction();
}

@ -63,12 +63,15 @@ public:
using ActionOptRef=std::optional<std::reference_wrapper<HamsterAI::Action>>;
const ActionOptRef GetCurrentAction();
const ActionOptRef AdvanceToNextAction();
const AIType GetAIType();
const ActionOptRef GetPreviousAction();
const ActionOptRef RevertToPreviousAction();
const AIType GetAIType()const;
void LoadAI(const std::string&mapName,AIType type);
static void OnMove(const vi2d pos);
static void OnPowerupCollection(const vi2d pos);
static void OnJetLaunch(const vi2d pos);
static void OnJetBeginLanding(const vi2d pos);
static void OnTunnelEnter(const vi2d pos);
static void OnCheckpointCollected(const vi2d pos);

@ -88,9 +88,9 @@ void HamsterJet::Update(const float fElapsedTime){
easeInTimer=std::max(0.f,easeInTimer-fElapsedTime);
jetState[TOP_LEFT]=jetState[BOTTOM_LEFT]=jetState[BOTTOM_RIGHT]=jetState[TOP_RIGHT]=OFF;
if(hamster.CanMove()){
if(hamster.IsPlayerControlled)HandleJetControls();
if(hamster.IsPlayerControlled)HandlePlayerControls();
else{
//TODO: AI controls here!
HandleAIControls();
}
}
}break;
@ -98,9 +98,9 @@ void HamsterJet::Update(const float fElapsedTime){
easeInTimer=std::min(0.6f,easeInTimer+fElapsedTime);
jetState[TOP_LEFT]=jetState[BOTTOM_LEFT]=jetState[BOTTOM_RIGHT]=jetState[TOP_RIGHT]=OFF;
if(hamster.CanMove()){
if(hamster.IsPlayerControlled)HandleJetControls();
if(hamster.IsPlayerControlled)HandlePlayerControls();
else{
//TODO: AI controls here!
HandleAIControls();
}
}
pos=hamster.GetPos();
@ -162,7 +162,7 @@ void HamsterJet::Draw(){
HamsterGame::Game().SetZ(0.f);
}
void HamsterJet::HandleJetControls(){
void HamsterJet::HandlePlayerControls(){
lastTappedSpace+=HamsterGame::Game().GetElapsedTime();
vf2d aimingDir{};
if(HamsterGame::Game().GetKey(W).bHeld){
@ -199,9 +199,10 @@ void HamsterJet::HandleJetControls(){
fallSpd=std::max(1.f,fallSpd-5.f*HamsterGame::Game().GetElapsedTime());
}
if(HamsterGame::Game().GetKey(SPACE).bPressed){
if(lastTappedSpace<=0.6f){
if(lastTappedSpace<=0.6f&&state!=LANDING){
state=LANDING;
easeInTimer=0.f;
if(hamster.IsPlayerControlled)HamsterAI::OnJetBeginLanding(pos);
}
lastTappedSpace=0.f;
}
@ -234,3 +235,75 @@ Terrain::CrashSpeed HamsterJet::GetLandingSpeed()const{
const float HamsterJet::GetZ()const{
return z;
}
void HamsterJet::HandleAIControls(){
vf2d aimingDir{};
if(GetState()==LANDING)return;
const HamsterAI::ActionOptRef&currentAction{hamster.ai.GetCurrentAction()};
if(!currentAction.has_value())return;
const HamsterAI::Action&action{currentAction.value().get()};
if(hamster.aiNodeTime>hamster.GetAIAdjustNodeTime()){
if(hamster.ai.GetPreviousAction().has_value()&&hamster.ai.GetPreviousAction().value().get().type==HamsterAI::Action::MOVE){
hamster.ai.RevertToPreviousAction();
hamster.chooseTemporaryNodeNext=true;
}else{
int MAX_SEARCH_AMT{100};
float SEARCH_RANGE{1.f};
while(MAX_SEARCH_AMT>0){
hamster.temporaryNode=hamster.GetPos()+vf2d{util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16),util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16)};
if(!HamsterGame::Game().IsTerrainSolid(hamster.temporaryNode.value()))break;
SEARCH_RANGE+=1.25f;
MAX_SEARCH_AMT--;
}
}
hamster.aiNodeTime=0.f;
}
if(GetState()==LANDING){
fallSpd=hamster.GetAILandingSpeed();
}
vf2d diff{action.pos-hamster.GetPos()};
if(diff.mag()<172.f){
if(action.type==HamsterAI::Action::LANDING){
state=LANDING;
easeInTimer=0.f;
}
hamster.ai.AdvanceToNextAction();
if(hamster.chooseTemporaryNodeNext){
int MAX_SEARCH_AMT{100};
float SEARCH_RANGE{1.f};
while(MAX_SEARCH_AMT>0){
hamster.temporaryNode=hamster.GetPos()+vf2d{util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16),util::random_range(-SEARCH_RANGE*16,SEARCH_RANGE*16)};
if(!HamsterGame::Game().IsTerrainSolid(hamster.temporaryNode.value()))break;
SEARCH_RANGE+=1.25f;
MAX_SEARCH_AMT--;
}
}else hamster.temporaryNode.reset();
hamster.chooseTemporaryNodeNext=false;
hamster.aiNodeTime=0.f;
}
const float moveThreshold{32.f};
if(diff.y<-moveThreshold){
aimingDir+=vf2d{0,-1};
}
if(diff.x>moveThreshold){
aimingDir+=vf2d{1,0};
}
if(diff.y>moveThreshold){
aimingDir+=vf2d{0,1};
}
if(diff.x<-moveThreshold){
aimingDir+=vf2d{-1,0};
}
if(aimingDir!=vf2d{}){
hamster.targetRot=aimingDir.norm().polar().y;
const vf2d currentVel{hamster.vel};
hamster.vel=vf2d{currentVel.polar().x+((hamster.GetMaxSpeed()/hamster.GetTimeToMaxSpeed())*HamsterGame::Game().GetElapsedTime()),hamster.rot}.cart();
hamster.vel=vf2d{std::min(hamster.GetMaxSpeed(),hamster.vel.polar().x),hamster.vel.polar().y}.cart();
hamster.frictionEnabled=false;
}
}

@ -81,7 +81,8 @@ public:
void Update(const float fElapsedTime);
void Draw();
void DrawOverlay()const;
void HandleJetControls();
void HandlePlayerControls();
void HandleAIControls();
const State GetState()const;
void SetPos(const vf2d pos);
Terrain::CrashSpeed GetLandingSpeed()const;

Loading…
Cancel
Save