diff options
-rw-r--r-- | app/assets/javascripts/trace2.js | 86 |
1 files changed, 78 insertions, 8 deletions
diff --git a/app/assets/javascripts/trace2.js b/app/assets/javascripts/trace2.js index 000e60b..20d050d 100644 --- a/app/assets/javascripts/trace2.js +++ b/app/assets/javascripts/trace2.js | |||
@@ -521,6 +521,8 @@ window.onTraceStart = function(puzzle, pos, svg, start, symStart=null) { | |||
521 | data.sym = puzzle.getSymmetricalPos(pos.x, pos.y) | 521 | data.sym = puzzle.getSymmetricalPos(pos.x, pos.y) |
522 | data.puzzle = puzzle | 522 | data.puzzle = puzzle |
523 | data.path = [] | 523 | data.path = [] |
524 | data.x_momentum = 0 | ||
525 | data.y_momentum = 0 | ||
524 | puzzle.startPoint = {'x': pos.x, 'y': pos.y} | 526 | puzzle.startPoint = {'x': pos.x, 'y': pos.y} |
525 | 527 | ||
526 | if (pos.x % 2 === 1) { // Start point is on a horizontal segment | 528 | if (pos.x % 2 === 1) { // Start point is on a horizontal segment |
@@ -732,9 +734,9 @@ function push(dx, dy, dir, targetDir) { | |||
732 | // Fraction of movement to redirect in the other direction | 734 | // Fraction of movement to redirect in the other direction |
733 | var movementRatio = null | 735 | var movementRatio = null |
734 | if (targetDir === 'left' || targetDir === 'top') { | 736 | if (targetDir === 'left' || targetDir === 'top') { |
735 | movementRatio = -3 | 737 | movementRatio = -1 |
736 | } else if (targetDir === 'right' || targetDir === 'bottom') { | 738 | } else if (targetDir === 'right' || targetDir === 'bottom') { |
737 | movementRatio = 3 | 739 | movementRatio = 1 |
738 | } | 740 | } |
739 | if (window.settings.disablePushing === true) movementRatio *= 1000 | 741 | if (window.settings.disablePushing === true) movementRatio *= 1000 |
740 | 742 | ||
@@ -779,6 +781,43 @@ function push(dx, dy, dir, targetDir) { | |||
779 | // Redirect momentum from pushing against walls, so that all further moment steps | 781 | // Redirect momentum from pushing against walls, so that all further moment steps |
780 | // will be strictly linear. Returns a string for logging purposes only. | 782 | // will be strictly linear. Returns a string for logging purposes only. |
781 | function pushCursor(dx, dy) { | 783 | function pushCursor(dx, dy) { |
784 | //if (Math.abs(dx) > Math.abs(dy)) { | ||
785 | // //data.y_momentum = 0 | ||
786 | // if (dx > 0) { | ||
787 | // data.x_momentum = 1 | ||
788 | // } else { | ||
789 | // data.x_momentum = -1 | ||
790 | // } | ||
791 | //} else { | ||
792 | // //data.x_momentum = 0 | ||
793 | // if (dy > 0) { | ||
794 | // data.y_momentum = 1 | ||
795 | // } else { | ||
796 | // data.y_momentum = -1 | ||
797 | // } | ||
798 | //} | ||
799 | var minimumMove = 0 | ||
800 | if (Math.abs(dx) > minimumMove) { | ||
801 | //data.y_momentum = 0 | ||
802 | if (dx > 0) { | ||
803 | data.x_momentum = 1 | ||
804 | } else { | ||
805 | data.x_momentum = -1 | ||
806 | } | ||
807 | } else if (Math.abs(dx) <= 1) { | ||
808 | data.x_momentum = 0 | ||
809 | } | ||
810 | if (Math.abs(dy) > minimumMove) { | ||
811 | //data.x_momentum = 0 | ||
812 | if (dy > 0) { | ||
813 | data.y_momentum = 1 | ||
814 | } else { | ||
815 | data.y_momentum = -1 | ||
816 | } | ||
817 | } else if (Math.abs(dy) <= 1) { | ||
818 | data.y_momentum = 0 | ||
819 | } | ||
820 | |||
782 | // Outer wall collision | 821 | // Outer wall collision |
783 | var cell = data.puzzle.getCell(data.pos.x, data.pos.y) | 822 | var cell = data.puzzle.getCell(data.pos.x, data.pos.y) |
784 | if (cell == null) return 'nothing' | 823 | if (cell == null) return 'nothing' |
@@ -787,29 +826,45 @@ function pushCursor(dx, dy) { | |||
787 | if ([undefined, 'top', 'bottom'].includes(cell.end)) { | 826 | if ([undefined, 'top', 'bottom'].includes(cell.end)) { |
788 | var leftCell = data.puzzle.getCell(data.pos.x - 1, data.pos.y) | 827 | var leftCell = data.puzzle.getCell(data.pos.x - 1, data.pos.y) |
789 | if (leftCell == null || leftCell.gap === window.GAP_FULL) { | 828 | if (leftCell == null || leftCell.gap === window.GAP_FULL) { |
790 | if (push(dx, dy, 'left', 'top')) return 'left outer wall' | 829 | if (data.y_momentum > 0) { |
830 | if (push(dx, dy, 'left', 'bottom')) return 'left outer wall, down' | ||
831 | } else { | ||
832 | if (push(dx, dy, 'left', 'top')) return 'left outer wall' | ||
833 | } | ||
791 | } | 834 | } |
792 | var rightCell = data.puzzle.getCell(data.pos.x + 1, data.pos.y) | 835 | var rightCell = data.puzzle.getCell(data.pos.x + 1, data.pos.y) |
793 | if (rightCell == null || rightCell.gap === window.GAP_FULL) { | 836 | if (rightCell == null || rightCell.gap === window.GAP_FULL) { |
794 | if (push(dx, dy, 'right', 'top')) return 'right outer wall' | 837 | if (data.y_momentum > 0) { |
838 | if (push(dx, dy, 'right', 'bottom')) return 'right outer wall, down' | ||
839 | } else { | ||
840 | if (push(dx, dy, 'right', 'top')) return 'right outer wall' | ||
841 | } | ||
795 | } | 842 | } |
796 | } | 843 | } |
797 | // Only consider non-endpoints or endpoints which are parallel | 844 | // Only consider non-endpoints or endpoints which are parallel |
798 | if ([undefined, 'left', 'right'].includes(cell.end)) { | 845 | if ([undefined, 'left', 'right'].includes(cell.end)) { |
799 | var topCell = data.puzzle.getCell(data.pos.x, data.pos.y - 1) | 846 | var topCell = data.puzzle.getCell(data.pos.x, data.pos.y - 1) |
800 | if (topCell == null || topCell.gap === window.GAP_FULL) { | 847 | if (topCell == null || topCell.gap === window.GAP_FULL) { |
801 | if (push(dx, dy, 'top', 'right')) return 'top outer wall' | 848 | if (data.x_momentum < 0) { |
849 | if (push(dx, dy, 'top', 'left')) return 'top outer wall, left' | ||
850 | } else { | ||
851 | if (push(dx, dy, 'top', 'right')) return 'top outer wall' | ||
852 | } | ||
802 | } | 853 | } |
803 | var bottomCell = data.puzzle.getCell(data.pos.x, data.pos.y + 1) | 854 | var bottomCell = data.puzzle.getCell(data.pos.x, data.pos.y + 1) |
804 | if (bottomCell == null || bottomCell.gap === window.GAP_FULL) { | 855 | if (bottomCell == null || bottomCell.gap === window.GAP_FULL) { |
805 | if (push(dx, dy, 'bottom', 'right')) return 'bottom outer wall' | 856 | if (data.x_momentum < 0) { |
857 | if (push(dx, dy, 'bottom', 'left')) return 'bottom outer wall, left' | ||
858 | } else { | ||
859 | if (push(dx, dy, 'bottom', 'right')) return 'bottom outer wall' | ||
860 | } | ||
806 | } | 861 | } |
807 | } | 862 | } |
808 | 863 | ||
809 | // Inner wall collision | 864 | // Inner wall collision |
810 | if (cell.end == null) { | 865 | if (cell.end == null) { |
811 | if (data.pos.x%2 === 1 && data.pos.y%2 === 0) { // Horizontal cell | 866 | if (data.pos.x%2 === 1 && data.pos.y%2 === 0) { // Horizontal cell |
812 | if (data.x < data.bbox.middle.x) { | 867 | if (data.x_momentum < 0 || (data.x_momentum == 0 && data.x < data.bbox.middle.x)) { |
813 | push(dx, dy, 'topbottom', 'left') | 868 | push(dx, dy, 'topbottom', 'left') |
814 | return 'topbottom inner wall, moved left' | 869 | return 'topbottom inner wall, moved left' |
815 | } else { | 870 | } else { |
@@ -817,7 +872,7 @@ function pushCursor(dx, dy) { | |||
817 | return 'topbottom inner wall, moved right' | 872 | return 'topbottom inner wall, moved right' |
818 | } | 873 | } |
819 | } else if (data.pos.x%2 === 0 && data.pos.y%2 === 1) { // Vertical cell | 874 | } else if (data.pos.x%2 === 0 && data.pos.y%2 === 1) { // Vertical cell |
820 | if (data.y < data.bbox.middle.y) { | 875 | if (data.y_momentum < 0 || (data.y_momentum == 0 && data.y < data.bbox.middle.y)) { |
821 | push(dx, dy, 'leftright', 'top') | 876 | push(dx, dy, 'leftright', 'top') |
822 | return 'leftright inner wall, moved up' | 877 | return 'leftright inner wall, moved up' |
823 | } else { | 878 | } else { |
@@ -832,6 +887,7 @@ function pushCursor(dx, dy) { | |||
832 | var turnMod = 2 | 887 | var turnMod = 2 |
833 | if ((data.pos.x%2 === 0 && data.pos.y%2 === 0) || cell.end != null) { | 888 | if ((data.pos.x%2 === 0 && data.pos.y%2 === 0) || cell.end != null) { |
834 | if (data.x < data.bbox.middle.x) { | 889 | if (data.x < data.bbox.middle.x) { |
890 | //if (data.x_momentum < 0 || (data.x_momentum == 0 && data.x < data.bbox.middle.x)) { | ||
835 | push(dx, dy, 'topbottom', 'right') | 891 | push(dx, dy, 'topbottom', 'right') |
836 | // Overshot the intersection and appears to be trying to turn | 892 | // Overshot the intersection and appears to be trying to turn |
837 | if (data.x > data.bbox.middle.x && Math.abs(dy) * turnMod > Math.abs(dx)) { | 893 | if (data.x > data.bbox.middle.x && Math.abs(dy) * turnMod > Math.abs(dx)) { |
@@ -841,6 +897,7 @@ function pushCursor(dx, dy) { | |||
841 | } | 897 | } |
842 | return 'intersection moving right' | 898 | return 'intersection moving right' |
843 | } else if (data.x > data.bbox.middle.x) { | 899 | } else if (data.x > data.bbox.middle.x) { |
900 | //} else if (data.x_momentum > 0 || (data.x_momentum == 0 && data.x > data.bbox.middle.x)) { | ||
844 | push(dx, dy, 'topbottom', 'left') | 901 | push(dx, dy, 'topbottom', 'left') |
845 | // Overshot the intersection and appears to be trying to turn | 902 | // Overshot the intersection and appears to be trying to turn |
846 | if (data.x < data.bbox.middle.x && Math.abs(dy) * turnMod > Math.abs(dx)) { | 903 | if (data.x < data.bbox.middle.x && Math.abs(dy) * turnMod > Math.abs(dx)) { |
@@ -851,6 +908,7 @@ function pushCursor(dx, dy) { | |||
851 | return 'intersection moving left' | 908 | return 'intersection moving left' |
852 | } | 909 | } |
853 | if (data.y < data.bbox.middle.y) { | 910 | if (data.y < data.bbox.middle.y) { |
911 | //if (data.y_momentum < 0 || (data.y_momentum == 0 && data.y < data.bbox.middle.y)) { | ||
854 | push(dx, dy, 'leftright', 'bottom') | 912 | push(dx, dy, 'leftright', 'bottom') |
855 | // Overshot the intersection and appears to be trying to turn | 913 | // Overshot the intersection and appears to be trying to turn |
856 | if (data.y > data.bbox.middle.y && Math.abs(dx) * turnMod > Math.abs(dy)) { | 914 | if (data.y > data.bbox.middle.y && Math.abs(dx) * turnMod > Math.abs(dy)) { |
@@ -860,6 +918,7 @@ function pushCursor(dx, dy) { | |||
860 | } | 918 | } |
861 | return 'intersection moving down' | 919 | return 'intersection moving down' |
862 | } else if (data.y > data.bbox.middle.y) { | 920 | } else if (data.y > data.bbox.middle.y) { |
921 | //} else if (data.y_momentum > 0 || (data.y_momentum == 0 && data.y > data.bbox.middle.y)) { | ||
863 | push(dx, dy, 'leftright', 'top') | 922 | push(dx, dy, 'leftright', 'top') |
864 | // Overshot the intersection and appears to be trying to turn | 923 | // Overshot the intersection and appears to be trying to turn |
865 | if (data.y < data.bbox.middle.y && Math.abs(dx) * turnMod > Math.abs(dy)) { | 924 | if (data.y < data.bbox.middle.y && Math.abs(dx) * turnMod > Math.abs(dy)) { |
@@ -923,6 +982,9 @@ function hardCollision() { | |||
923 | } else if (lastDir === MOVE_BOTTOM) { | 982 | } else if (lastDir === MOVE_BOTTOM) { |
924 | data.y = Math.min(data.y, data.bbox.middle.y - gapSize) | 983 | data.y = Math.min(data.y, data.bbox.middle.y - gapSize) |
925 | } | 984 | } |
985 | |||
986 | data.x_momentum = 0 | ||
987 | data.y_momentum = 0 | ||
926 | } | 988 | } |
927 | 989 | ||
928 | // Check to see if we've gone beyond the edge of puzzle cell, and if the next cell is safe, | 990 | // Check to see if we've gone beyond the edge of puzzle cell, and if the next cell is safe, |
@@ -947,6 +1009,8 @@ function move() { | |||
947 | } | 1009 | } |
948 | } | 1010 | } |
949 | if (data.x < data.bbox.x1) { | 1011 | if (data.x < data.bbox.x1) { |
1012 | //data.x_momentum = -1 | ||
1013 | //data.y_momentum = 0 | ||
950 | return MOVE_LEFT | 1014 | return MOVE_LEFT |
951 | } | 1015 | } |
952 | } else if (data.x > data.bbox.x2 - 12) { // Moving right | 1016 | } else if (data.x > data.bbox.x2 - 12) { // Moving right |
@@ -965,6 +1029,8 @@ function move() { | |||
965 | } | 1029 | } |
966 | } | 1030 | } |
967 | if (data.x > data.bbox.x2) { | 1031 | if (data.x > data.bbox.x2) { |
1032 | //data.x_momentum = 1 | ||
1033 | //data.y_momentum = 0 | ||
968 | return MOVE_RIGHT | 1034 | return MOVE_RIGHT |
969 | } | 1035 | } |
970 | } else if (data.y < data.bbox.y1 + 12) { // Moving up | 1036 | } else if (data.y < data.bbox.y1 + 12) { // Moving up |
@@ -983,6 +1049,8 @@ function move() { | |||
983 | } | 1049 | } |
984 | } | 1050 | } |
985 | if (data.y < data.bbox.y1) { | 1051 | if (data.y < data.bbox.y1) { |
1052 | //data.x_momentum = 0 | ||
1053 | //data.y_momentum = -1 | ||
986 | return MOVE_TOP | 1054 | return MOVE_TOP |
987 | } | 1055 | } |
988 | } else if (data.y > data.bbox.y2 - 12) { // Moving down | 1056 | } else if (data.y > data.bbox.y2 - 12) { // Moving down |
@@ -1001,6 +1069,8 @@ function move() { | |||
1001 | } | 1069 | } |
1002 | } | 1070 | } |
1003 | if (data.y > data.bbox.y2) { | 1071 | if (data.y > data.bbox.y2) { |
1072 | //data.x_momentum = 0 | ||
1073 | //data.y_momentum = 1 | ||
1004 | return MOVE_BOTTOM | 1074 | return MOVE_BOTTOM |
1005 | } | 1075 | } |
1006 | } | 1076 | } |