File: util.lua

package info (click to toggle)
mrrescue 1.02e-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 13,228 kB
  • sloc: makefile: 9; sh: 1
file content (129 lines) | stat: -rw-r--r-- 3,174 bytes parent folder | download
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
--- Collides two AABBs
-- @param b1 First bounding box
-- @param b2 Second bounding box
-- @return True if they overlap
function collideBoxes(b1,b2)
	if b1.x > b2.x+b2.w or b1.x+b1.w < b2.x
	or b1.y > b2.y+b2.h or b1.y+b1.h < b2.y then
		return false
	else
		return true
	end
end

--- Returns a random entry in a table
function table.random(t)
	return t[math.random(#t)]
end

function math.sign(n)
	if n < 0 then
		return -1
	elseif n > 0 then
		return 1
	else
		return 0
	end
end

function math.round(x)
	return math.floor(x+0.5)
end

function collideX(self)
	if self.xspeed == 0 then return end

	local collision = false
	
	local last -- Last object collision detected

	for _, yoff in ipairs({self.corners[3], (self.corners[3]+self.corners[4])/2, self.corners[4]}) do
		for _, xoff in ipairs({self.corners[1], self.corners[2]}) do
			-- Collide with solid tiles
			if map:collidePoint(self.x+xoff, self.y+yoff) then
				collision = true
				local cx = math.floor((self.x+xoff)/16)*16
				if self.xspeed > 0 then
					self.x = cx-self.corners[2]-0.0001
				else
					self.x = cx+16-self.corners[1]
				end
			end
			-- Collide with objects
			for i,v in ipairs(map.objects) do
				if v.solid == true and self:collideBox(v:getBBox()) then
					collision = true
					last = v
					local bbox = v:getBBox()
					if self.xspeed > 0 then
						self.x = bbox.x-self.corners[2]-0.0001
					else
						self.x = bbox.x+bbox.w-self.corners[1]+0.0001
					end
				end
			end
		end
	end
	
	return collision, last
end

function collideY(self)
	if self.yspeed == 0 then return end
	self.onGround = false

	local collision = false

	for _, yoff in ipairs({self.corners[3], self.corners[4]}) do
		for _, xoff in ipairs({self.corners[1], self.corners[2]}) do
			-- Collide with solid tiles
			if map:collidePoint(self.x+xoff, self.y+yoff) then
				collision = true
				local cy = math.floor((self.y+yoff)/16)*16
				if self.yspeed > 0 then
					self.y = cy-self.corners[4]-0.0001
					self.onGround = true
				else
					self.y = cy+16-self.corners[3]
				end
			end
		end
	end

	return collision
end

function cap(val, min, max)
	return math.max(math.min(val, max), min)
end

function wrap(val, min, max)
	if val < min then val = max end
	if val > max then val = min end
	return val
end


function drawBox(x,y,w,h)
	lg.setColor(30/255,23/255,18/255)
	lg.rectangle("fill",x+1,y+1,w-2,h-2)
	lg.setColor(1,1,1)
	-- Draw sides
	lg.draw(img.menu_box, quad.box_left, x, y+1, 0, 1, (h-2))
	lg.draw(img.menu_box, quad.box_left, x+w, y+1, 0, -1, (h-2))
	lg.draw(img.menu_box, quad.box_top,  x+1, y, 0, (w-2), 1)
	lg.draw(img.menu_box, quad.box_top,  x+1, y+h, 0, (w-2), -1)
	-- Draw corners
	lg.draw(img.menu_box, quad.box_corner, x,y)
	lg.draw(img.menu_box, quad.box_corner, x+w,y, 0, -1, 1)
	lg.draw(img.menu_box, quad.box_corner, x,y+h, 0, 1, -1)
	lg.draw(img.menu_box, quad.box_corner, x+w,y+h, 0, -1, -1)
end

function secondsToString(time)
	local hours =   string.format("%02d", math.floor(time / 60^2))
	local minutes = string.format("%02d", math.floor((time % 60^2) / 60))
	local seconds = string.format("%02d", math.floor(time % 60))

	return hours .. ":" .. minutes .. ":" .. seconds
end