-
Notifications
You must be signed in to change notification settings - Fork 0
/
bmcollider.js
104 lines (85 loc) · 3.43 KB
/
bmcollider.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
function runin(x,y) {
return map.data[~~x + ~~y*map.width].num
}
function collide(player, dir, dist) {
switch (player.dir) {
case 0: //up
var off = (player.posx-1.5) % 2
if (off == 0) {
off = player.posy % 1
if (off == 0) off = 1
if (off > 0.5) {
player.posy -= (off-0.5)
collide(player, 0, dist - (off-0.5))
} else if (!runin(player.posx,player.posy-1)) {
player.posy -= off
collide(player, 0, dist - off)
}
} else if (!runin(player.posx-1,player.posy-1) && off < 1) {
collide(player, 2, off)
collide(player, 0, dist - off)
} else if (!runin(player.posx+1,player.posy-1) && off > 1) {
collide(player, 3, 1-off)
collide(player, 0, dist - (1-off))
}
break
case 1: //down
var off = (player.posx-1.5) % 2
if (off == 0) {
off = player.posy % 1
if (off < 0.5) {
player.posy += (0.5-off)
collide(player, 1, dist - (0.5-off))
} else if (!runin(player.posx,player.posy+1)) {
player.posy += (1-off)
collide(player, 1, dist - (1-off))
}
} else if (!runin(player.posx-1,player.posy+1) && off < 1) {
collide(player, 2, off)
collide(player, 1, dist - off)
} else if (!runin(player.posx+1,player.posy+1) && off > 1) {
collide(player, 3, 1-off)
collide(player, 1, dist - (1-off))
}
break
case 2: //left
var off = (player.posy-1.5) % 2
if (off == 0) {
off = player.posx % 1
if (off == 0) off = 1
if (off > 0.5) {
player.posx -= (off-0.5)
collide(player, 2, dist - (off-0.5))
} else if (!runin(player.posx-1,player.posy)) {
player.posx -= off
collide(player, 0, dist - off)
}
} else if (!runin(player.posx-1,player.posy-1) && off < 1) {
collide(player, 0, off)
collide(player, 2, dist - off)
} else if (!runin(player.posx-1,player.posy+1) && off > 1) {
collide(player, 1, 1-off)
collide(player, 2, dist - (1-off))
}
break
case 3: //right
var off = (player.posy-1.5) % 2
if (off == 0) {
off = player.posx % 1
if (off < 0.5) {
player.posx += (0.5-off)
collide(player, 3, dist - (0.5-off))
} else if (!runin(player.posx+1,player.posy)) {
player.posx += (1-off)
collide(player, 3, dist - (1-off))
}
} else if (!runin(player.posx+1,player.posy-1) && off < 1) {
collide(player, 0, off)
collide(player, 3, dist - off)
} else if (!runin(player.posx+1,player.posy+1) && off > 1) {
collide(player, 1, 1-off)
collide(player, 3, dist - (1-off))
}
break
}
}