diff --git a/GPP_ZombieAI_LastNameFirstName_2DAEXX.pptx b/GPP_ZombieAI_LastNameFirstName_2DAEXX.pptx index f310315..b7c90e0 100644 Binary files a/GPP_ZombieAI_LastNameFirstName_2DAEXX.pptx and b/GPP_ZombieAI_LastNameFirstName_2DAEXX.pptx differ diff --git a/_DEMO_DEBUG/GPP_Plugin_d.dll b/_DEMO_DEBUG/GPP_Plugin_d.dll index 57e0a82..909071c 100644 Binary files a/_DEMO_DEBUG/GPP_Plugin_d.dll and b/_DEMO_DEBUG/GPP_Plugin_d.dll differ diff --git a/_DEMO_DEBUG/GPP_Plugin_d.pdb b/_DEMO_DEBUG/GPP_Plugin_d.pdb index 449388d..91f4dc2 100644 Binary files a/_DEMO_DEBUG/GPP_Plugin_d.pdb and b/_DEMO_DEBUG/GPP_Plugin_d.pdb differ diff --git a/_DEMO_DEBUG/imgui.ini b/_DEMO_DEBUG/imgui.ini index bc0ef1d..262671d 100644 --- a/_DEMO_DEBUG/imgui.ini +++ b/_DEMO_DEBUG/imgui.ini @@ -754,8 +754,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [267 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [194 FPS]] @@ -934,8 +934,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [314 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [280 FPS]] @@ -964,13 +964,13 @@ Size=240,520 Collapsed=0 [WORLD INFO [344 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [329 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [317 FPS]] @@ -1029,8 +1029,8 @@ Size=180,150 Collapsed=0 [WORLD INFO [393 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [348 FPS]] @@ -1144,8 +1144,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [336 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [323 FPS]] @@ -1154,8 +1154,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [310 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [296 FPS]] @@ -1174,8 +1174,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [258 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [192 FPS]] @@ -2188,3 +2188,518 @@ Pos=710,10 Size=240,520 Collapsed=0 +[WORLD INFO [775 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [752 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [591 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [571 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [542 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [515 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [485 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [427 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [403 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [381 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [345 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [302 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [233 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [690 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [547 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [461 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [408 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [386 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [366 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [889 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [681 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [652 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [618 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [568 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [492 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [411 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [850 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [659 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [634 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [598 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [526 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [490 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [457 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [407 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [332 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [922 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [677 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [575 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [536 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [500 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [467 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [414 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [371 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [353 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [308 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [295 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [849 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [628 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [602 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [544 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [483 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [313 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [828 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [642 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [617 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [585 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [546 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [520 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [428 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [709 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [539 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [486 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [464 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [722 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [563 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [545 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [516 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [482 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [452 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [702 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [552 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [535 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [509 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [481 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [451 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [424 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [361 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [564 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [532 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [505 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [480 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [967 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [700 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [668 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [622 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [504 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [442 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [417 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [394 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [373 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [354 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [840 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [631 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [607 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [540 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [502 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [470 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [931 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [664 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [639 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [543 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [750 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [517 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + diff --git a/_DEMO_RELEASE/GPP_Plugin.dll b/_DEMO_RELEASE/GPP_Plugin.dll index b596a47..0dd1e96 100644 Binary files a/_DEMO_RELEASE/GPP_Plugin.dll and b/_DEMO_RELEASE/GPP_Plugin.dll differ diff --git a/_DEMO_RELEASE/imgui.ini b/_DEMO_RELEASE/imgui.ini index 23df4db..0d21e9a 100644 --- a/_DEMO_RELEASE/imgui.ini +++ b/_DEMO_RELEASE/imgui.ini @@ -4,8 +4,8 @@ Size=400,400 Collapsed=0 [WORLD INFO [462 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [STATS] @@ -54,13 +54,13 @@ Size=240,520 Collapsed=0 [WORLD INFO [321 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [317 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [307 FPS]] @@ -624,8 +624,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1467 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1225 FPS]] @@ -654,8 +654,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [830 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [804 FPS]] @@ -689,8 +689,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [586 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [569 FPS]] @@ -719,8 +719,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [490 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [481 FPS]] @@ -744,8 +744,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [433 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [420 FPS]] @@ -769,13 +769,13 @@ Size=240,431 Collapsed=0 [WORLD INFO [383 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [374 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [366 FPS]] @@ -789,8 +789,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [353 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [345 FPS]] @@ -1169,8 +1169,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1343 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1211 FPS]] @@ -1214,8 +1214,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [757 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [712 FPS]] @@ -1224,8 +1224,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [676 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [652 FPS]] @@ -1249,13 +1249,13 @@ Size=240,520 Collapsed=0 [WORLD INFO [542 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [517 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [492 FPS]] @@ -1269,8 +1269,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [464 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [435 FPS]] @@ -1284,8 +1284,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [404 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [389 FPS]] @@ -1309,8 +1309,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [340 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [329 FPS]] @@ -1519,8 +1519,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1059 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [977 FPS]] @@ -1539,18 +1539,18 @@ Size=240,431 Collapsed=0 [WORLD INFO [798 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [734 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [684 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [643 FPS]] @@ -1574,8 +1574,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [502 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [477 FPS]] @@ -1594,8 +1594,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [440 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [430 FPS]] @@ -1604,8 +1604,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [415 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [399 FPS]] @@ -1754,8 +1754,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [967 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [916 FPS]] @@ -1764,8 +1764,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [873 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [835 FPS]] @@ -1789,8 +1789,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [674 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [646 FPS]] @@ -1869,13 +1869,13 @@ Size=240,520 Collapsed=0 [WORLD INFO [396 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [369 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [362 FPS]] @@ -1984,8 +1984,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [3621 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [3333 FPS]] @@ -2014,8 +2014,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1627 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1514 FPS]] @@ -2039,8 +2039,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [1111 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1050 FPS]] @@ -2064,18 +2064,18 @@ Size=240,431 Collapsed=0 [WORLD INFO [856 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [816 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [770 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [742 FPS]] @@ -2144,8 +2144,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [410 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [390 FPS]] @@ -2154,8 +2154,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [382 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [373 FPS]] @@ -2229,8 +2229,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [819 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [800 FPS]] @@ -2239,8 +2239,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [772 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [707 FPS]] @@ -2249,8 +2249,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [665 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [645 FPS]] @@ -2259,23 +2259,23 @@ Size=240,431 Collapsed=0 [WORLD INFO [620 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [607 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [568 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [547 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [532 FPS]] @@ -2284,13 +2284,13 @@ Size=240,431 Collapsed=0 [WORLD INFO [486 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [460 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [450 FPS]] @@ -2324,8 +2324,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [356 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [350 FPS]] @@ -2339,8 +2339,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [306 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [300 FPS]] @@ -2394,8 +2394,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1336 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1137 FPS]] @@ -2409,8 +2409,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [996 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [942 FPS]] @@ -2419,13 +2419,13 @@ Size=240,431 Collapsed=0 [WORLD INFO [765 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [710 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [683 FPS]] @@ -2449,8 +2449,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [406 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [326 FPS]] @@ -2489,13 +2489,13 @@ Size=240,520 Collapsed=0 [WORLD INFO [1206 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [987 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [944 FPS]] @@ -2534,23 +2534,23 @@ Size=240,431 Collapsed=0 [WORLD INFO [621 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [600 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [578 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [561 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [544 FPS]] @@ -2559,8 +2559,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [526 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [511 FPS]] @@ -2599,8 +2599,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [412 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [394 FPS]] @@ -2609,8 +2609,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [385 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [360 FPS]] @@ -2619,8 +2619,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [346 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [327 FPS]] @@ -2649,8 +2649,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [3162 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [2761 FPS]] @@ -2694,8 +2694,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1042 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [990 FPS]] @@ -2704,8 +2704,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [931 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [883 FPS]] @@ -2734,8 +2734,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [682 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [647 FPS]] @@ -2749,8 +2749,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [567 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [541 FPS]] @@ -2804,13 +2804,13 @@ Size=240,431 Collapsed=0 [WORLD INFO [565 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [559 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [551 FPS]] @@ -2819,8 +2819,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [533 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [488 FPS]] @@ -2829,18 +2829,18 @@ Size=240,520 Collapsed=0 [WORLD INFO [461 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [439 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [407 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [397 FPS]] @@ -2914,8 +2914,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [335 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [295 FPS]] @@ -2989,8 +2989,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1138 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1066 FPS]] @@ -3009,8 +3009,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [902 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [344 FPS]] @@ -3069,8 +3069,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [503 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [451 FPS]] @@ -3104,8 +3104,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [564 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [558 FPS]] @@ -3129,8 +3129,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [491 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [453 FPS]] @@ -3174,8 +3174,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [2130 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1823 FPS]] @@ -3204,8 +3204,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1130 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1073 FPS]] @@ -3239,8 +3239,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [783 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [750 FPS]] @@ -3259,8 +3259,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [636 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [591 FPS]] @@ -3279,13 +3279,13 @@ Size=240,431 Collapsed=0 [WORLD INFO [539 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [509 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [493 FPS]] @@ -3299,13 +3299,13 @@ Size=240,520 Collapsed=0 [WORLD INFO [443 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [431 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [421 FPS]] @@ -3349,8 +3349,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [3904 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [3166 FPS]] @@ -3434,8 +3434,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [736 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [708 FPS]] @@ -3454,13 +3454,13 @@ Size=240,431 Collapsed=0 [WORLD INFO [630 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [608 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [588 FPS]] @@ -3474,8 +3474,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [473 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [427 FPS]] @@ -3484,8 +3484,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [398 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [3770 FPS]] @@ -3514,8 +3514,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [470 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [424 FPS]] @@ -3574,8 +3574,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1419 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1348 FPS]] @@ -3594,8 +3594,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [1070 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [1028 FPS]] @@ -3604,8 +3604,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [981 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [930 FPS]] @@ -3619,8 +3619,8 @@ Size=240,431 Collapsed=0 [WORLD INFO [802 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [699 FPS]] @@ -3629,13 +3629,13 @@ Size=240,520 Collapsed=0 [WORLD INFO [673 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [622 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [601 FPS]] @@ -3644,8 +3644,8 @@ Size=240,520 Collapsed=0 [WORLD INFO [584 FPS]] -Pos=651,10 -Size=240,431 +Pos=710,10 +Size=240,520 Collapsed=0 [WORLD INFO [485 FPS]] @@ -5238,3 +5238,1983 @@ Pos=710,10 Size=240,520 Collapsed=0 +[WORLD INFO [36343 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3666 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3507 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2982 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1600 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1338 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1124 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [853 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [693 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [41 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [35011 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3500 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3313 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2630 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1983 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1523 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1272 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [825 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [746 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [619 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [16768 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2857 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2727 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1986 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1552 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1266 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1076 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [829 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [437 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [38245 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3237 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2890 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2111 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1608 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1331 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [973 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [852 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [688 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [632 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [585 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [37530 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [5422 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [5014 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3046 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2140 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1632 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1335 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1119 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [764 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [694 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [543 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [32919 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4893 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4556 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3015 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2161 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1634 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1352 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1128 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [985 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [773 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [692 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [635 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [579 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [35298 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4804 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4462 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2998 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2090 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1633 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1112 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [969 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [846 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [762 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [441 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [393 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [38696 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [5211 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4816 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3129 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2169 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1670 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1351 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1141 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [867 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [36074 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4666 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4410 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4150 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2600 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1920 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1513 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1251 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1069 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [823 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [670 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [40 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [43093 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4951 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4385 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2409 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2022 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1172 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1025 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [903 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [606 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [553 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [467 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [31596 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4332 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2717 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2199 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1549 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1373 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1151 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [935 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [824 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [660 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [36516 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4623 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4392 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2365 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1799 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [696 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [615 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [37535 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4931 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4682 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3101 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2238 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1871 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1462 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [700 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [39895 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4985 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4593 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2429 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1990 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1582 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1147 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [940 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [833 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [32036 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4715 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4443 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3219 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1858 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1558 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1377 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [997 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [703 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [536 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [36812 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4836 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4313 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1925 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1519 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1381 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [784 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [704 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [33856 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4592 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4198 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3527 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2073 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1787 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1310 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1190 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [844 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [530 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [36342 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3261 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3099 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2826 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1994 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1575 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1290 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1098 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [946 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [465 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [29311 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4083 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3349 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1719 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1175 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [899 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [592 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [38002 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4221 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3972 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2588 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1926 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1252 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [927 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [614 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [524 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [39302 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4396 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4184 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3097 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2110 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1671 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1337 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [978 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [869 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [35099 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4651 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3788 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1952 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1528 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [938 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [827 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [744 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [566 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [525 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [36795 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4370 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4037 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2969 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1629 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [854 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [766 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [39409 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4172 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3910 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2980 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2102 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1334 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1125 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [962 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [36255 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4077 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3640 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3190 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2121 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1681 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1360 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [702 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [587 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [508 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [43453 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3840 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3510 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2971 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1639 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1123 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [974 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [40227 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4374 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4107 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2981 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2108 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1332 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [857 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [634 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [42358 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4132 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2975 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2087 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1619 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1333 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1106 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [971 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [27188 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3937 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3716 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3026 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2128 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1646 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1132 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [851 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [31977 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3771 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3573 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2527 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1894 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1498 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1236 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1057 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [925 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [814 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [735 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [666 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [609 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [35342 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4219 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3975 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3682 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2376 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1814 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1441 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1031 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [724 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [655 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [555 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [31269 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [4148 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3938 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3142 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1677 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1366 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [994 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [775 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [639 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [31659 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3514 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2471 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1829 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1214 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1046 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [908 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [721 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [455 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [32538 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3646 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2549 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1888 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1491 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1238 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1056 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [922 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [668 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [34401 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3793 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3605 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2725 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2010 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1563 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1282 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1091 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [949 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [752 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [32993 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3777 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3612 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2679 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1937 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1081 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [494 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [29775 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3466 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2472 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1850 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1218 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [808 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [725 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [34698 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3529 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3359 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2631 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1930 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1522 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1259 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1067 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [34819 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3785 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3570 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2553 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1913 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1501 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1246 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [926 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [15203 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2794 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2690 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2366 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1764 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1424 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1184 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1018 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [893 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [715 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [650 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [31923 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2988 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2380 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1807 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1429 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [33067 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3305 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3186 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3065 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [2144 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1674 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [979 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [858 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [697 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [419 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [33385 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3361 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [3262 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1958 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1533 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [1257 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [937 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + +[WORLD INFO [747 FPS]] +Pos=710,10 +Size=240,520 +Collapsed=0 + diff --git a/project/Behaviour.cpp b/project/Behaviour.cpp index 28ba7ec..6c712c9 100644 --- a/project/Behaviour.cpp +++ b/project/Behaviour.cpp @@ -55,44 +55,46 @@ namespace BT_Action SteeringPlugin_Output steering{}; std::chrono::steady_clock::time_point timer{}; - float maxTime{}; + float maxTime{ 5.0f }; // Default value if not set bool doOnce{}; blackboardPtr->GetData("Interface", interfacePtr); blackboardPtr->GetData("Target", target); blackboardPtr->GetData("Steering", steering); - blackboardPtr->GetData("FailSafe", timer); - blackboardPtr->GetData("MaxFailSafe", maxTime); + blackboardPtr->GetData("MaxFailSafe", maxTime); // Make sure this is set before calling blackboardPtr->GetData("FailSafeDoOnce", doOnce); + // Initialize timer if not done yet if (!doOnce) { - blackboardPtr->ChangeData("FailSafe", std::chrono::steady_clock::now()); + timer = std::chrono::steady_clock::now(); + blackboardPtr->ChangeData("FailSafe", timer); blackboardPtr->ChangeData("FailSafeDoOnce", true); } const auto agentInfo = interfacePtr->Agent_GetInfo(); - const auto nextTargetPos = interfacePtr->NavMesh_GetClosestPathPoint(target); - steering.LinearVelocity = nextTargetPos - agentInfo.Position; - steering.LinearVelocity.Normalize(); - steering.LinearVelocity *= agentInfo.MaxLinearSpeed; - + // Check success conditions first const std::chrono::steady_clock::time_point currentTime{ std::chrono::steady_clock::now() }; const std::chrono::duration elapsedSec{ currentTime - timer }; + // Check if we've reached the target + if (Distance(target, agentInfo.Position) < 3.f) { + blackboardPtr->ChangeData("FailSafeDoOnce", false); + return BT::State::Success; + } + + // Check if failsafe timeout has been reached if (elapsedSec.count() > maxTime) { blackboardPtr->ChangeData("FailSafeDoOnce", false); return BT::State::Success; } - if (Distance(target, agentInfo.Position) < 3.f) { - blackboardPtr->ChangeData("FailSafeDoOnce", false); - - return BT::State::Success; - } - + // Calculate steering if we're still running + steering.LinearVelocity = nextTargetPos - agentInfo.Position; + steering.LinearVelocity.Normalize(); + steering.LinearVelocity *= agentInfo.MaxLinearSpeed; blackboardPtr->ChangeData("Steering", steering); return BT::State::Running; @@ -715,4 +717,90 @@ namespace BT_Condition return thinkerPtr->HouseToReExplore(); } + bool CheckMovement(Blackboard* blackboardPtr, float timeout) { + IExamInterface* interfacePtr{}; + blackboardPtr->GetData("Interface", interfacePtr); + + // Get current position + const Elite::Vector2 currentPosition = interfacePtr->Agent_GetInfo().Position; + + // Get or initialize last position and timer from blackboard + Elite::Vector2 lastPosition; + std::chrono::steady_clock::time_point lastMovementTime; + + // Try to get last position from blackboard, or initialize if not present + if (!blackboardPtr->GetData("LastPosition", lastPosition)) { + lastPosition = currentPosition; + blackboardPtr->AddData("LastPosition", lastPosition); + } + + // Try to get last movement time from blackboard, or initialize if not present + if (!blackboardPtr->GetData("LastMovementTime", lastMovementTime)) { + lastMovementTime = std::chrono::steady_clock::now(); + blackboardPtr->AddData("LastMovementTime", lastMovementTime); + } + + // Check if we've moved significantly (more than a small threshold) + const float movementThreshold = 0.5f; // Adjust this based on your game scale + const float distanceMoved = currentPosition.DistanceSquared(lastPosition); + + if (distanceMoved > movementThreshold * movementThreshold) { + // We've moved significantly, update last position and time in blackboard + blackboardPtr->ChangeData("LastPosition", currentPosition); + blackboardPtr->ChangeData("LastMovementTime", std::chrono::steady_clock::now()); + return false; + } + + // Check how long we've been stuck + const auto currentTime = std::chrono::steady_clock::now(); + const auto elapsedTime = std::chrono::duration_cast(currentTime - lastMovementTime).count(); + + // Return true if we've been stuck for longer than the timeout + return elapsedTime >= timeout; + } + +} + +namespace BT_Grid { + BT::State UpdateExplorationGrid(Blackboard* blackboardPtr) { + PRINT_FUNCTION_NAME(); + IExamInterface* interfacePtr{}; + Thinker* thinkerPtr{}; + + if (!blackboardPtr->GetData("Interface", interfacePtr) || !blackboardPtr->GetData("Brain", thinkerPtr)) { + return BT::State::Failure; + } + + const AgentInfo agentInfo = interfacePtr->Agent_GetInfo(); + //Visible houses, enemies, items, and purge zones + const std::vector& enemiesInFOV = interfacePtr->GetEnemiesInFOV(); + const std::vector& itemsInFOV = interfacePtr->GetItemsInFOV(); + const std::vector& purgeZonesInFOV = interfacePtr->GetPurgeZonesInFOV(); + + + const std::vector& housesInFOV = interfacePtr->GetHousesInFOV(); + thinkerPtr->m_ExplorationGrid.Update(agentInfo, housesInFOV); + + return BT::State::Success; + } + + BT::State FindUnexploredCell(Blackboard* blackboardPtr) { + PRINT_FUNCTION_NAME(); + Thinker* thinkerPtr{}; + blackboardPtr->GetData("Brain", thinkerPtr); + + IExamInterface* interfacePtr{}; + if (!blackboardPtr->GetData("Interface", interfacePtr)) { + return BT::State::Failure; + } + + Elite::Vector2 playerPos = interfacePtr->Agent_GetInfo().Position; + const Elite::Vector2 target{ thinkerPtr->m_ExplorationGrid.FindNearestUnexplored(playerPos)}; + if (target == Elite::Vector2{}) + return BT::State::Failure; + blackboardPtr->ChangeData("Target", target); + return BT::State::Success; + } + + } diff --git a/project/Behaviour.h b/project/Behaviour.h index bb2e046..454b415 100644 --- a/project/Behaviour.h +++ b/project/Behaviour.h @@ -8,6 +8,12 @@ namespace BT class Blackboard; +namespace BT_Grid { + BT::State UpdateExplorationGrid(Blackboard* blackboardPtr); + + BT::State FindUnexploredCell(Blackboard* blackboardPtr); +} + namespace BT_Action { BT::State SetTimer(Blackboard* blackboardPtr, const std::string& timerName, bool doOnce); @@ -70,5 +76,7 @@ namespace BT_Condition bool NewHouse(Blackboard* blackboardPtr); bool ReExploreHouse(Blackboard* blackboardPtr); + bool CheckMovement(Blackboard* blackboardPtr, float timeout); + } diff --git a/project/BigThink.cpp b/project/BigThink.cpp index 0188542..0b23d53 100644 --- a/project/BigThink.cpp +++ b/project/BigThink.cpp @@ -9,7 +9,7 @@ using namespace std::placeholders; namespace BigThink { BT::Selector* ItemHandling() { - constexpr float HpThreshold{ 0.f }; + constexpr float HpThreshold{ 2.f }; return new BT::Selector({ @@ -131,21 +131,29 @@ namespace BigThink constexpr int randomRadius{ 50 }; constexpr int searchDegree{ 5 }; constexpr float InsideOffset{ 5.f }; + constexpr float gridCellSize{ 50.f }; const std::string BeforeLeavingTimer{ "BeforeLeaving" }; constexpr bool BeforeLeavingDoOnce{ false }; const std::string NoHouseTimer{ "NoHouse" }; - constexpr float noHouseTimeout = 5.0f; // Time in seconds before giving up and going random + constexpr float noHouseTimeout = 5.0f; constexpr bool NoHouseDoOnce{ false }; - return - new BT::Selector({ - new BT::Sequence({ - new BT::Conditional(BT_Condition::SeeHouse), - new BT::Action(BT_Action::CheckHouses), - new BT::Action(std::bind(BT_Action::SetTimer, _1, NoHouseTimer, NoHouseDoOnce)) // Reset timer when we see a house - }), + const std::string HouseExploreTimer{ "HouseExplore" }; + constexpr float houseExploreTimeout = 2.0f; + constexpr bool HouseExploreDoOnce{ false }; + + return new BT::Selector({ + // [1] House visibility update + new BT::Sequence({ + new BT::Conditional(BT_Condition::SeeHouse), + new BT::Action(BT_Action::CheckHouses), + //new BT::Action(BT_Grid::UpdateExplorationGrid), + new BT::Action(std::bind(BT_Action::SetTimer, _1, NoHouseTimer, NoHouseDoOnce)) + }), + + // [2] Inside house logic new BT::PartialSequence({ new BT::Conditional(BT_Condition::InsideTargetHouse), new BT::Action(BT_Action::SetExpireDate), @@ -161,21 +169,16 @@ namespace BigThink new BT::Action(BT_Action::GoToTarget), }), new BT::PartialSequence({ - new BT::Action(std::bind(BT_Action::FindRandomLocation, _1, randomRadius)), - new BT::Action(BT_Action::EnableSpin), - new BT::Action(BT_Action::GoToTarget) - }), - /*new BT::PartialSequence({ new BT::Action(std::bind(BT_Action::TryFindHouse, _1, searchRadius, searchDegree)), new BT::Action(BT_Action::EnableSpin), new BT::Action(BT_Action::GoToTarget) - }),*/ - /*new BT::PartialSequence({ + }), + new BT::PartialSequence({ new BT::Conditional(BT_Condition::ReExploreHouse), new BT::Action(std::bind(BT_Action::GetHouseAsTarget, _1, maxTravelDistance)), new BT::Action(BT_Action::EnableSpin), new BT::Action(BT_Action::GoToTarget), - }),*/ + }), new BT::PartialSequence({ new BT::Action(std::bind(BT_Action::FindRandomLocation, _1, randomRadius)), new BT::Action(BT_Action::EnableSpin), @@ -190,6 +193,8 @@ namespace BigThink }), }) }), + + // [3] Outside house behavior new BT::Selector({ new BT::PartialSequence({ new BT::Conditional(BT_Condition::NewHouse), @@ -198,24 +203,48 @@ namespace BigThink new BT::Action(BT_Action::GoToTarget), }), new BT::PartialSequence({ - new BT::Action(std::bind(BT_Action::TryFindHouse, _1, searchRadius, searchDegree)), + new BT::Action(BT_Grid::FindUnexploredCell), new BT::Action(BT_Action::EnableSpin), new BT::Action(BT_Action::GoToTarget) }), new BT::PartialSequence({ - new BT::Conditional(std::bind(BT_Condition::CheckTimer, _1, NoHouseTimer, NoHouseDoOnce)), // Check if we haven't seen a house in a while - new BT::Action(std::bind(BT_Action::SetTimer, _1, NoHouseTimer, NoHouseDoOnce)), // Reset the timer - new BT::Action(std::bind(BT_Action::FindRandomLocation, _1, randomRadius * 2)), // Go further when random walking - new BT::Action(BT_Action::EnableSpin), - new BT::Action(BT_Action::GoToTarget) + new BT::Conditional(std::bind(BT_Condition::CheckTimer, _1, NoHouseTimer, NoHouseDoOnce)), + new BT::Action(std::bind(BT_Action::SetTimer, _1, NoHouseTimer, NoHouseDoOnce)), + new BT::Selector({ + new BT::PartialSequence({ + new BT::Action(BT_Grid::FindUnexploredCell), + new BT::Action(BT_Action::EnableSpin), + new BT::Action(BT_Action::GoToTarget) + }), + new BT::PartialSequence({ + new BT::Action(std::bind(BT_Action::FindRandomLocation, _1, randomRadius * 2)), + new BT::Action(BT_Action::EnableSpin), + new BT::Action(BT_Action::GoToTarget) + }) + }) }), - new BT::PartialSequence({ - new BT::Conditional(BT_Condition::ReExploreHouse), - new BT::Action(std::bind(BT_Action::GetHouseAsTarget, _1, maxTravelDistance)), - new BT::Action(BT_Action::EnableSpin), - new BT::Action(BT_Action::GoToTarget), - }) }), }); } + + + + BT::Selector* HandleBug() { + const std::string StuckTimer{ "StuckTimer" }; + constexpr float stuckTimeout = 3.0f; // Time in seconds before considering stuck + constexpr bool StuckDoOnce{ false }; + constexpr float unstuckRange = 10.0f; // Range to pick a random target when stuck + + return + new BT::Selector({ + new BT::Sequence({ + new BT::Conditional(std::bind(BT_Condition::CheckMovement, _1, stuckTimeout)), + new BT::Conditional(std::bind(BT_Condition::CheckTimer, _1, StuckTimer, StuckDoOnce)), + new BT::Action(std::bind(BT_Action::SetTimer, _1, StuckTimer, StuckDoOnce)), + new BT::Action(std::bind(BT_Action::FindRandomLocation, _1, unstuckRange)), + new BT::Action(BT_Action::EnableSpin), + new BT::Action(BT_Action::GoToTarget) + }) + }); + } } diff --git a/project/BigThink.h b/project/BigThink.h index 07bc48a..3c72d0b 100644 --- a/project/BigThink.h +++ b/project/BigThink.h @@ -15,4 +15,5 @@ namespace BigThink BT::Sequence* PurgeZoneHandling(); BT::PartialSequence* PickUpHandling(); BT::Selector* HouseHandling(); + BT::Selector* HandleBug(); } diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt index dca4c1f..654cc99 100644 --- a/project/CMakeLists.txt +++ b/project/CMakeLists.txt @@ -13,7 +13,7 @@ add_library(Exam_Plugin SHARED "Behaviour.cpp" "BigThink.h" "BigThink.cpp" -) + "WorldExplorationGrid.h" "WorldExplorationGrid.cpp") target_link_libraries(Exam_Plugin PUBLIC ${EXAM_LIB_DEBUG}) target_include_directories(Exam_Plugin PUBLIC ${EXAM_INCLUDE_DIR}) diff --git a/project/SurvivalAgentPlugin.cpp b/project/SurvivalAgentPlugin.cpp index d2130c5..5c4dc2c 100644 --- a/project/SurvivalAgentPlugin.cpp +++ b/project/SurvivalAgentPlugin.cpp @@ -5,6 +5,7 @@ #include "Blackboard.h" #include "Thinker.h" #include "BigThink.h" +#include "WorldExplorationGrid.h" //Called only once, during initialization void SurvivalAgentPlugin::Initialize(IBaseInterface* pInterface, PluginInfo& info) @@ -35,6 +36,16 @@ void SurvivalAgentPlugin::Initialize(IBaseInterface* pInterface, PluginInfo& inf BigThink::PickUpHandling(), BigThink::HouseHandling() })); + + Thinker* thinkerPtr{}; + blackboardPtr->GetData("Brain", thinkerPtr); + + const WorldInfo& worldInfo = m_pInterface->World_GetInfo(); + thinkerPtr->m_ExplorationGrid.SetWorldInfo(worldInfo); + + m_pExplorationGrid = &m_Thinker->m_ExplorationGrid; + m_pExplorationGrid->SetInterfacePtr(m_pInterface); + } @@ -48,8 +59,9 @@ Blackboard* SurvivalAgentPlugin::CreateBlackboard() { blackboardPtr->AddData("Steering", SteeringPlugin_Output{}); blackboardPtr->AddData("Target", m_Target); blackboardPtr->AddData("Spin", false); + blackboardPtr->AddData("FailSafe", std::chrono::steady_clock::time_point{}); - blackboardPtr->AddData("MaxFailSafe", 2.f); + blackboardPtr->AddData("MaxFailSafe", 5.f); blackboardPtr->AddData("FailSafeDoOnce", false); blackboardPtr->AddData("TargetZombie", EnemyInfo{}); @@ -69,10 +81,17 @@ Blackboard* SurvivalAgentPlugin::CreateBlackboard() { blackboardPtr->AddData("TimerBeforeLeavingDoOnce", false); blackboardPtr->AddData("MaxTimeBeforeLeaving", 3.f); - blackboardPtr->AddData("MaxTimeNoHouse", 5.f); + blackboardPtr->AddData("MaxTimeNoHouse", 30.f); blackboardPtr->AddData("TimerNoHouse", std::chrono::steady_clock::time_point{}); blackboardPtr->AddData("TimerNoHouseDoOnce", false); + blackboardPtr->AddData("TimerStuckTimer", std::chrono::steady_clock::time_point{}); + blackboardPtr->AddData("MaxStuckTimer", 5.f); + blackboardPtr->AddData("TimerStuckTimerDoOnce", false); + + blackboardPtr->AddData("LastPosition", m_pInterface->Agent_GetInfo().Position); + blackboardPtr->AddData("LastMovementTime", std::chrono::steady_clock::now()); + return blackboardPtr; } @@ -193,6 +212,8 @@ SteeringPlugin_Output SurvivalAgentPlugin::UpdateSteering(float dt) UpdateBlackboard(steering); + m_Thinker->m_ExplorationGrid.Update(m_pInterface->Agent_GetInfo(), m_pInterface->GetHousesInFOV()); + m_BehaviourTree->Update(); m_BehaviourTree->GetBlackboard()->GetData("Steering", steering); @@ -200,7 +221,7 @@ SteeringPlugin_Output SurvivalAgentPlugin::UpdateSteering(float dt) if (m_pInterface->Agent_GetInfo().Stamina >= 10 || m_Running) { m_Running = true; - steering.RunMode = true; + steering.RunMode = false; } if (m_pInterface->Agent_GetInfo().Stamina <= 0.1f) { @@ -222,6 +243,8 @@ SteeringPlugin_Output SurvivalAgentPlugin::UpdateSteering(float dt) } } + std::cout << m_pInterface->Agent_GetInfo().Position.x << " " << m_pInterface->Agent_GetInfo().Position.y << std::endl; + return steering; @@ -239,6 +262,8 @@ void SurvivalAgentPlugin::Render(float dt) const m_pInterface->Draw_Circle(m_pInterface->Agent_GetInfo().Position, 15.f, { 0.f, 1.f, 1.f }); m_pInterface->Draw_Circle(m_pInterface->Agent_GetInfo().Position, 8.f, { 0.f, 1.f, 1.f }); + + m_pExplorationGrid->RenderDebug(); } diff --git a/project/SurvivalAgentPlugin.h b/project/SurvivalAgentPlugin.h index 3cf0060..f4e1ae9 100644 --- a/project/SurvivalAgentPlugin.h +++ b/project/SurvivalAgentPlugin.h @@ -11,6 +11,7 @@ class IBaseInterface; class IExamInterface; class Blackboard; class Thinker; +class WorldExplorationGrid; class SurvivalAgentPlugin final : public IExamPlugin @@ -48,7 +49,9 @@ private: BT::BehaviorTree* m_BehaviourTree = nullptr; Thinker* m_Thinker = nullptr; - bool m_Running{}; + WorldExplorationGrid* m_pExplorationGrid = nullptr; + + bool m_Running{ false }; }; //ENTRY diff --git a/project/Thinker.cpp b/project/Thinker.cpp index fbd5366..8b24bf6 100644 --- a/project/Thinker.cpp +++ b/project/Thinker.cpp @@ -23,7 +23,7 @@ bool Thinker::IsInvNotFull() const { bool Thinker::IsItemInInv(const eItemType& itemType) { return std::any_of(std::begin(m_ItemMemory), std::end(m_ItemMemory), - [itemType](const ItemMemory& memory)->bool { return memory.ItemInfo.Type == itemType; }); + [itemType](const ItemMemory& memory)->bool { return memory.ItemInfo.Type == itemType && memory.ItemInfo.Value > 0; }); } bool Thinker::EmptyValue() { @@ -31,6 +31,7 @@ bool Thinker::EmptyValue() { [](const ItemMemory& memory)->bool { return memory.ItemInfo.Value <= 0; }); } + int Thinker::FindEmptyValue(const ItemInfo& item) { const auto foundItem = std::find_if(std::begin(m_ItemMemory), std::end(m_ItemMemory), [item](const ItemMemory& memory)->bool { return memory.ItemInfo.Type == item.Type; }); diff --git a/project/Thinker.h b/project/Thinker.h index ef7af50..cb0f363 100644 --- a/project/Thinker.h +++ b/project/Thinker.h @@ -2,6 +2,7 @@ #include #include #include +#include "WorldExplorationGrid.h" class Thinker final { public: @@ -49,6 +50,7 @@ public: bool CheckHousesForMemory(const std::vector& FOVHouses); + WorldExplorationGrid m_ExplorationGrid; private: std::vector m_HousesMemory{}; const float m_MaxWaitTimer{ 360.f }; @@ -57,4 +59,7 @@ private: const size_t m_MaxStorageSlots{ 5 }; std::vector::iterator FindHouseInMemory(const HouseInfo& targetHouse); + + + float m_GridCellSize = 50.f; // Adjust based on your needs }; diff --git a/project/WorldExplorationGrid.cpp b/project/WorldExplorationGrid.cpp new file mode 100644 index 0000000..f3889a5 --- /dev/null +++ b/project/WorldExplorationGrid.cpp @@ -0,0 +1,328 @@ +#include "WorldExplorationGrid.h" +#include +#include +#include +#include + +WorldExplorationGrid::WorldExplorationGrid(float cellSize) + : m_CellSize(cellSize) { +} + +void WorldExplorationGrid::Reset() { + m_ExploredGrid.clear(); +} + +void WorldExplorationGrid::SetCellSize(float newCellSize) { + m_CellSize = newCellSize; + Reset(); // Cell size change invalidates previous data +} + +WorldExplorationGrid::GridCoords WorldExplorationGrid::WorldToGrid(const Elite::Vector2& pos) const { + int gridWidth = static_cast(std::ceil(m_WorldInfo.Dimensions.x / m_CellSize)); + int gridHeight = static_cast(std::ceil(m_WorldInfo.Dimensions.y / m_CellSize)); + + int centerX = gridWidth / 2; + int centerY = gridHeight / 2; + + return { + static_cast(std::floor(pos.x / m_CellSize)) + centerX, + static_cast(std::floor(pos.y / m_CellSize)) + centerY + }; +} + +Elite::Vector2 WorldExplorationGrid::GridToWorld(const GridCoords& coords) const { + int gridWidth = static_cast(std::ceil(m_WorldInfo.Dimensions.x / m_CellSize)); + int gridHeight = static_cast(std::ceil(m_WorldInfo.Dimensions.y / m_CellSize)); + + int centerX = gridWidth / 2; + int centerY = gridHeight / 2; + + return { + (coords.x - centerX + 0.5f) * m_CellSize, + (coords.y - centerY + 0.5f) * m_CellSize + }; +} + +void WorldExplorationGrid::MarkExplored(const std::vector& cells) { + for (const auto& cell : cells) + m_ExploredGrid[cell] = true; +} + +std::vector WorldExplorationGrid::GetCellsInRadius(const Elite::Vector2& center, float radius) const { + std::vector cells; + int r = static_cast(std::ceil(radius / m_CellSize)); + + GridCoords centerCoords = WorldToGrid(center); + for (int dx = -r; dx <= r; ++dx) { + for (int dy = -r; dy <= r; ++dy) { + GridCoords coords{ centerCoords.x + dx, centerCoords.y + dy }; + Elite::Vector2 cellCenter = GridToWorld(coords); + if (Elite::Distance(center, cellCenter) <= radius + m_CellSize * 0.5f) + cells.push_back(coords); + } + } + return cells; +} + +std::vector WorldExplorationGrid::GetCellsInRect(const Elite::Vector2& center, const Elite::Vector2& size) const { + std::vector cells; + Elite::Vector2 halfSize = size * 0.5f; + Elite::Vector2 min = center - halfSize; + Elite::Vector2 max = center + halfSize; + + GridCoords minCoords = WorldToGrid(min); + GridCoords maxCoords = WorldToGrid(max); + + for (int x = minCoords.x; x <= maxCoords.x; ++x) { + for (int y = minCoords.y; y <= maxCoords.y; ++y) { + cells.push_back({ x, y }); + } + } + return cells; +} + +void WorldExplorationGrid::SetWorldInfo(const WorldInfo& info) { + m_WorldInfo = info; + + std::cout << "World info: " + << "Dimensions: " << m_WorldInfo.Dimensions.x << " x " << m_WorldInfo.Dimensions.y + << ", Cell Size: " << m_CellSize << std::endl; +} + +void WorldExplorationGrid::RenderDebug() { + if (!m_pRenderer) return; + // Draw explored cells as before + const Elite::Vector3 exploredColor{ 0.f, 1.f, 0.f }; + const float depth = 0.8f; + + for (const auto& pair : m_ExploredGrid) { + if (!pair.second) continue; + + Elite::Vector2 center = GridToWorld(pair.first); + float half = m_CellSize / 2.f; + + Elite::Vector2 verts[4] = { + center + Elite::Vector2{-half, -half}, + center + Elite::Vector2{ half, -half}, + center + Elite::Vector2{ half, half}, + center + Elite::Vector2{-half, half} + }; + + m_pRenderer->Draw_SolidPolygon(verts, 4, exploredColor, depth); + } + + // Draw the world bounds outline in red + int gridWidth = static_cast(std::ceil(m_WorldInfo.Dimensions.x / m_CellSize)); + int gridHeight = static_cast(std::ceil(m_WorldInfo.Dimensions.y / m_CellSize)); + + Elite::Vector2 topLeft = GridToWorld({ 0, 0 }) - Elite::Vector2{ m_CellSize / 2.f, m_CellSize / 2.f }; + Elite::Vector2 topRight = GridToWorld({ gridWidth - 1, 0 }) + Elite::Vector2{ m_CellSize / 2.f, -m_CellSize / 2.f }; + Elite::Vector2 bottomRight = GridToWorld({ gridWidth - 1, gridHeight - 1 }) + Elite::Vector2{ m_CellSize / 2.f, m_CellSize / 2.f }; + Elite::Vector2 bottomLeft = GridToWorld({ 0, gridHeight - 1 }) + Elite::Vector2{ -m_CellSize / 2.f, m_CellSize / 2.f }; + + Elite::Vector2 borderVerts[4] = { topLeft, topRight, bottomRight, bottomLeft }; + const Elite::Vector3 borderColor{ 1.f, 0.f, 0.f }; // red + + m_pRenderer->Draw_Polygon(borderVerts, 4, borderColor, 1.f); // Draw outline + +} + +bool WorldExplorationGrid::IsExplored(const Elite::Vector2& position) const { + GridCoords coords = WorldToGrid(position); + auto it = m_ExploredGrid.find(coords); + return it != m_ExploredGrid.end() && it->second; +} + +void WorldExplorationGrid::Update(const AgentInfo& agentInfo, + const std::vector& visibleHouses) { + // Mark agent's field of view as explored + auto visionCells = GetCellsInRadius(agentInfo.Position, agentInfo.FOV_Range / 2); + MarkExplored(visionCells); + + // Optionally mark house interiors if visible + for (const auto& house : visibleHouses) { + auto houseCells = GetCellsInRect(house.Center, house.Size); + MarkExplored(houseCells); + } +} + +float WorldExplorationGrid::GetExploredPercentage() const { + if (m_WorldInfo.Dimensions.x <= 0.0f || m_WorldInfo.Dimensions.y <= 0.0f) + return 0.0f; + + int gridWidth = static_cast(std::ceil(m_WorldInfo.Dimensions.x / m_CellSize)); + int gridHeight = static_cast(std::ceil(m_WorldInfo.Dimensions.y / m_CellSize)); + int totalCells = gridWidth * gridHeight; + + return totalCells == 0 ? 0.0f : static_cast(m_ExploredGrid.size()) / totalCells; +} + + +float WorldExplorationGrid::GetHouseExploredPercentage(const HouseInfo& house) const { + auto houseCells = GetCellsInRect(house.Center, house.Size); + int explored = 0; + for (const auto& cell : houseCells) + if (m_ExploredGrid.count(cell) > 0 && m_ExploredGrid.at(cell)) ++explored; + + return houseCells.empty() ? 0.0f : static_cast(explored) / houseCells.size(); +} +// +//Elite::Vector2 WorldExplorationGrid::FindNearestUnexplored(const Elite::Vector2& fromPosition) { +// GridCoords start = WorldToGrid(fromPosition); +// +// const int maxRadius = 10; // Search range +// for (int r = 1; r < maxRadius; ++r) { +// for (int dx = -r; dx <= r; ++dx) { +// for (int dy = -r; dy <= r; ++dy) { +// if (std::abs(dx) != r && std::abs(dy) != r) continue; // Only border +// GridCoords coords{ start.x + dx, start.y + dy }; +// if (m_ExploredGrid.count(coords) == 0) +// return GridToWorld(coords); +// } +// } +// } +// +// return fromPosition; // No unexplored found +//} +// +//Elite::Vector2 WorldExplorationGrid::FindNearestUnexplored(const Elite::Vector2& fromPosition) { +// // Start search from the last unexplored cell to get a local spiral effect +// GridCoords start = m_LastUnexploredCell; +// +// int gridWidth = static_cast(std::ceil(m_WorldInfo.Dimensions.x / m_CellSize)); +// int gridHeight = static_cast(std::ceil(m_WorldInfo.Dimensions.y / m_CellSize)); +// +// // Clamp start inside the world bounds +// start = ClampToWorldBounds(start); +// +// const int maxRadius = 10; // max search radius in cells +// +// for (int r = 0; r <= maxRadius; ++r) { +// for (int dx = -r; dx <= r; ++dx) { +// for (int dy = -r; dy <= r; ++dy) { +// if (std::abs(dx) != r && std::abs(dy) != r) continue; // only border cells at radius r +// +// GridCoords candidate{ start.x + dx, start.y + dy }; +// candidate = ClampToWorldBounds(candidate); +// +// if (m_ExploredGrid.count(candidate) == 0) { +// m_LastUnexploredCell = candidate; // update last unexplored +// return GridToWorld(candidate); +// } +// } +// } +// } +// +// // fallback - no unexplored cell found, return current position +// return fromPosition; +//} + +Elite::Vector2 WorldExplorationGrid::FindNearestUnexplored(const Elite::Vector2& fromPosition) { + GridCoords start = WorldToGrid(fromPosition); + + // We'll use a priority queue that prioritizes cells that are both close to the start + // and have more explored neighbors + struct Candidate { + GridCoords coords; + float distance; + int exploredNeighbors; + + bool operator<(const Candidate& other) const { + // First prioritize cells with more explored neighbors + if (exploredNeighbors != other.exploredNeighbors) + return exploredNeighbors < other.exploredNeighbors; + // Then by distance + return distance > other.distance; + } + }; + + std::priority_queue candidates; + std::unordered_set visited; + + // Check 4-connected neighbors first for efficiency + const int dx4[] = { 0, 1, 0, -1 }; + const int dy4[] = { 1, 0, -1, 0 }; + + // Start with the immediate neighbors + for (int i = 0; i < 4; ++i) { + GridCoords neighbor{ start.x + dx4[i], start.y + dy4[i] }; + if (visited.insert(neighbor).second) { + float dist = Elite::Distance(fromPosition, GridToWorld(neighbor)); + int exploredNeighbors = CountExploredNeighbors(neighbor); + candidates.push({ neighbor, dist, exploredNeighbors }); + } + } + + const int maxSearchRadius = 20; // Limit search area + int currentRadius = 1; + + while (!candidates.empty()) { + auto current = candidates.top(); + candidates.pop(); + + // If this cell is unexplored, return it + if (m_ExploredGrid.count(current.coords) == 0) { + return GridToWorld(current.coords); + } + + // Expand search to this cell's neighbors + if (current.distance < maxSearchRadius) { + for (int i = 0; i < 4; ++i) { + GridCoords neighbor{ current.coords.x + dx4[i], current.coords.y + dy4[i] }; + if (visited.insert(neighbor).second) { + float dist = Elite::Distance(fromPosition, GridToWorld(neighbor)); + int exploredNeighbors = CountExploredNeighbors(neighbor); + candidates.push({ neighbor, dist, exploredNeighbors }); + } + } + } + } + + // Fallback: spiral search if priority queue didn't find anything + for (int r = 1; r < maxSearchRadius; ++r) { + for (int dx = -r; dx <= r; ++dx) { + for (int dy = -r; dy <= r; ++dy) { + if (std::abs(dx) != r && std::abs(dy) != r) continue; // Only border + GridCoords coords{ start.x + dx, start.y + dy }; + if (m_ExploredGrid.count(coords) == 0) + return GridToWorld(coords); + } + } + } + + return fromPosition; // No unexplored found +} + +int WorldExplorationGrid::CountExploredNeighbors(const GridCoords& coords) const { + const int dx[] = { 0, 1, 0, -1, 1, 1, -1, -1 }; // 8-connected neighbors + const int dy[] = { 1, 0, -1, 0, 1, -1, 1, -1 }; + + int count = 0; + for (int i = 0; i < 8; ++i) { + GridCoords neighbor{ coords.x + dx[i], coords.y + dy[i] }; + if (m_ExploredGrid.count(neighbor) > 0 && m_ExploredGrid.at(neighbor)) { + count++; + } + } + return count; +} + +Elite::Vector2 WorldExplorationGrid::FindUnexploredInHouse(const Elite::Vector2& fromPosition, const HouseInfo& house) const { + auto houseCells = GetCellsInRect(house.Center, house.Size); + Elite::Vector2 closestPos = fromPosition; + //hardcode max + float minDistSq = 10000000.f; + + for (const auto& cell : houseCells) { + if (m_ExploredGrid.count(cell) == 0) { + Elite::Vector2 worldPos = GridToWorld(cell); + float distSq = Elite::DistanceSquared(fromPosition, worldPos); + if (distSq < minDistSq) { + closestPos = worldPos; + minDistSq = distSq; + } + } + } + + return closestPos; +} diff --git a/project/WorldExplorationGrid.h b/project/WorldExplorationGrid.h new file mode 100644 index 0000000..7ea19ce --- /dev/null +++ b/project/WorldExplorationGrid.h @@ -0,0 +1,81 @@ +#pragma once +#include "stdafx.h" + +#define NOMINMAX + +#include +#include +#include +#include +#include + +class WorldExplorationGrid { +public: + WorldExplorationGrid(float cellSize = 35); + + void Update(const AgentInfo& agentInfo, const std::vector& visibleHouses); + + Elite::Vector2 FindNearestUnexplored(const Elite::Vector2& fromPosition); + Elite::Vector2 FindUnexploredInHouse(const Elite::Vector2& fromPosition, const HouseInfo& house) const; + + bool IsExplored(const Elite::Vector2& position) const; + float GetExploredPercentage() const; + float GetHouseExploredPercentage(const HouseInfo& house) const; + + void Reset(); + void SetCellSize(float newCellSize); + float GetCellSize() const { return m_CellSize; } + + void SetWorldInfo(const WorldInfo& info); + void SetInterfacePtr(IExamInterface* pInterface) { m_pRenderer = pInterface; } + + void RenderDebug(); + + + +private: + IExamInterface* m_pRenderer{ nullptr }; + float m_CellSize; + WorldInfo m_WorldInfo{}; + int m_MaxSearchRadius = 100; + + + struct GridCoords { + int x, y; + bool operator==(const GridCoords& other) const { + return x == other.x && y == other.y; + } + }; + + struct GridHash { + size_t operator()(const GridCoords& coords) const { + return static_cast(coords.x) << 32 | coords.y; + } + }; + + struct GridCoordsHash { + size_t operator()(const GridCoords& coords) const { + return std::hash()(coords.x) ^ (std::hash()(coords.y) << 1); + } + }; + + WorldExplorationGrid::GridCoords ClampToWorldBounds(const GridCoords& coords) const { + int gridWidth = static_cast(std::ceil(m_WorldInfo.Dimensions.x / m_CellSize)); + int gridHeight = static_cast(std::ceil(m_WorldInfo.Dimensions.y / m_CellSize)); + + return { + std::clamp(coords.x, 0, gridWidth - 1), + std::clamp(coords.y, 0, gridHeight - 1) + }; + } + std::unordered_map m_ExploredGrid; + + GridCoords WorldToGrid(const Elite::Vector2& pos) const; + Elite::Vector2 GridToWorld(const GridCoords& gridCoords) const; + void MarkExplored(const std::vector& cells); + std::vector GetCellsInRadius(const Elite::Vector2& center, float radius) const; + std::vector GetCellsInRect(const Elite::Vector2& center, const Elite::Vector2& size) const; + int CountExploredNeighbors(const GridCoords& coords) const; + + GridCoords m_LastUnexploredCell = { 0,0 }; +}; \ No newline at end of file