bzr branch
http://9ix.org/bzr/traderous
1
by Josh C
zoetrope 1.4 |
1 |
-- Section: Globals |
2 |
||
3 |
-- Variable: the |
|
4 |
-- This is a repository table for the current app, view, keys, and mouse. |
|
5 |
-- You can use this for other objects that are useful to track. This should |
|
6 |
-- be considered read-only; references here are for convenience and changing |
|
7 |
-- things here will have no effect. |
|
8 |
the = {} |
|
9 |
||
10 |
-- Constant: STRICT |
|
11 |
-- If set to true, then Zoetrope will do some extra checking for obvious |
|
12 |
-- errors at the expense of some performance. Some of these checks will |
|
13 |
-- throw errors, while others will simply print a warning to the console. |
|
14 |
-- If you are going to use this, make sure to do so before your project's |
|
15 |
-- require 'zoetrope' statement. |
|
16 |
||
17 |
-- Constant: DEBUG |
|
18 |
-- If set to true, Zoetrope's debug console will be enabled. If you are |
|
19 |
-- going to use this, make sure to do so before your project's require |
|
20 |
-- 'zoetrope' statement. |
|
21 |
||
22 |
-- Constant: NEARLY_ZERO |
|
23 |
-- Any number less than this is considered 0 by Zoetrope. |
|
24 |
NEARLY_ZERO = 0.0001 |
|
25 |
||
26 |
-- Constant: UP |
|
27 |
-- Directional constant corresponding to up. |
|
28 |
UP = 'up' |
|
29 |
||
30 |
-- Constant: DOWN |
|
31 |
-- Directional constant corresponding to down. |
|
32 |
DOWN = 'down' |
|
33 |
||
34 |
-- Constant: LEFT |
|
35 |
-- Directional constant corresponding to left. |
|
36 |
LEFT = 'left' |
|
37 |
||
38 |
-- Constant: RIGHT |
|
39 |
-- Directional constant corresponding to right. |
|
40 |
RIGHT = 'right' |
|
41 |
||
42 |
||
43 |
-- Function: trim |
|
44 |
-- trim() implementation for strings via http://lua-users.org/wiki/stringtrim |
|
45 |
-- |
|
46 |
-- Arguments: |
|
47 |
-- source - source string |
|
48 |
-- |
|
49 |
-- Returns: |
|
50 |
-- string trimmed of leading and trailing whitespace |
|
51 |
||
52 |
function trim (source) |
|
53 |
return source:gsub("^%s*(.-)%s*$", "%1") |
|
54 |
end |
|
55 |
||
56 |
-- Function: split |
|
57 |
-- split() implementation for strings via http://lua-users.org/wiki/splitjoin |
|
58 |
-- |
|
59 |
-- Arguments: |
|
60 |
-- source - source string |
|
61 |
-- pattern - Lua pattern to split on, see http://www.lua.org/pil/20.1.html |
|
62 |
-- |
|
63 |
-- Returns: |
|
64 |
-- table of split strings |
|
65 |
||
66 |
function split (source, pattern) |
|
67 |
assert(type(source) == 'string', 'source must be a string') |
|
68 |
assert(type(pattern) == 'string', 'pattern must be a string') |
|
69 |
||
70 |
local result = {} |
|
71 |
local searchStart = 1 |
|
72 |
local splitStart, splitEnd = string.find(source, pattern, searchStart) |
|
73 |
||
74 |
while splitStart do |
|
75 |
table.insert(result, string.sub(source, searchStart, splitStart - 1)) |
|
76 |
searchStart = splitEnd + 1 |
|
77 |
splitStart, splitEnd = string.find(source, pattern, searchStart) |
|
78 |
end |
|
79 |
||
80 |
table.insert(result, string.sub(source, searchStart)) |
|
81 |
return result |
|
82 |
end |
|
83 |
||
84 |
-- Function: tovalue |
|
85 |
-- Coerces, if possible, a string to a boolean or number value. |
|
86 |
-- If the string cannot be coerced to either of these types, this |
|
87 |
-- returns the same string passed. |
|
88 |
-- |
|
89 |
-- Arguments: |
|
90 |
-- source - string to coerce |
|
91 |
-- |
|
92 |
-- Returns: |
|
93 |
-- number, boolean, or string |
|
94 |
||
95 |
function tovalue (source) |
|
96 |
if source == 'true' then return true end |
|
97 |
if source == 'false' then return false end |
|
98 |
||
99 |
return tonumber(source) or source |
|
100 |
end |
|
101 |
||
102 |
-- Function: sound |
|
103 |
-- Loads a sound but does not play it. It's important to use the hint property |
|
104 |
-- appropriately; if set incorrectly, it can cause sound playback to stutter or lag. |
|
105 |
-- |
|
106 |
-- Arguments: |
|
107 |
-- path - string pathname to sound |
|
108 |
-- hint - either 'short' or 'long', depending on length of sound; default 'short' |
|
109 |
-- |
|
110 |
-- Returns: |
|
111 |
-- LOVE sound source, see https://love2d.org/wiki/Source |
|
112 |
||
113 |
function sound (path, hint) |
|
114 |
return love.audio.newSource(Cached:sound(path, hint or 'short')) |
|
115 |
end |
|
116 |
||
117 |
-- Function: playSound |
|
118 |
-- Plays a sound once. This is the easiest way to play a sound. It's important |
|
119 |
-- to use the hint property appropriately; if set incorrectly, it can cause sound |
|
120 |
-- playback to stutter or lag. |
|
121 |
-- |
|
122 |
-- Arguments: |
|
123 |
-- path - string pathname to sound |
|
124 |
-- volume - volume to play at, from 0 to 1; default 1 |
|
125 |
-- hint - either 'short' or 'long', depending on length of sound; default 'short' |
|
126 |
-- |
|
127 |
-- Returns: |
|
128 |
-- LOVE sound source, see https://love2d.org/wiki/Source |
|
129 |
||
130 |
function playSound (path, volume, hint) |
|
131 |
volume = volume or 1 |
|
132 |
local source = sound(path, hint) |
|
133 |
source:setVolume(volume) |
|
134 |
source:play() |
|
135 |
return source |
|
136 |
end |
|
137 |
||
138 |
-- Function: searchTable |
|
139 |
-- Returns the index of a value in a table. If the value |
|
140 |
-- does not exist in the table, this returns nil. |
|
141 |
-- |
|
142 |
-- Arguments: |
|
143 |
-- table - table to search |
|
144 |
-- search - value to search for |
|
145 |
-- |
|
146 |
-- Returns: |
|
147 |
-- integer index or nil |
|
148 |
||
149 |
function searchTable (table, search) |
|
150 |
for i, value in ipairs(table) do |
|
151 |
if value == search then return i end |
|
152 |
end |
|
153 |
||
154 |
return nil |
|
155 |
end |
|
156 |
||
157 |
-- Function: copyTable |
|
158 |
-- Returns a superficial copy of a table. If it contains a |
|
159 |
-- reference to another table in one of its properties, that |
|
160 |
-- reference will be copied shallowly. |
|
161 |
-- |
|
162 |
-- Arguments: |
|
163 |
-- source - source table |
|
164 |
-- |
|
165 |
-- Returns: |
|
166 |
-- new table |
|
167 |
||
168 |
function copyTable (source) |
|
169 |
assert(type(source) == 'table', "asked to copy a non-table") |
|
170 |
||
171 |
local result = {} |
|
172 |
setmetatable(result, getmetatable(source)) |
|
173 |
||
174 |
for key, value in pairs(source) do |
|
175 |
result[key] = value |
|
176 |
end |
|
177 |
||
178 |
return result |
|
179 |
end |
|
180 |
||
181 |
-- Function: shuffleTable |
|
182 |
-- Shuffles the contents of a table in place. |
|
183 |
-- via http://www.gammon.com.au/forum/?id=9908 |
|
184 |
-- |
|
185 |
-- Arguments: |
|
186 |
-- table - table to shuffle |
|
187 |
-- |
|
188 |
-- Returns: |
|
189 |
-- table passed |
|
190 |
||
191 |
function shuffleTable (table) |
|
192 |
local n = #table |
|
193 |
||
194 |
while n >= 2 do |
|
195 |
-- n is now the last pertinent index |
|
196 |
local k = math.random(n) -- 1 <= k <= n |
|
197 |
-- Quick swap |
|
198 |
table[n], table[k] = table[k], table[n] |
|
199 |
n = n - 1 |
|
200 |
end |
|
201 |
||
202 |
return table |
|
203 |
end |
|
204 |
||
205 |
-- Function: dump |
|
206 |
-- Returns a string representation of a variable in a way |
|
207 |
-- that can be reconstituted via loadstring(). Yes, this |
|
208 |
-- is basically a serialization function, but that's so much |
|
209 |
-- to type :) This ignores any userdata, functions, or circular |
|
210 |
-- references. |
|
211 |
-- via http://www.lua.org/pil/12.1.2.html |
|
212 |
-- |
|
213 |
-- Arguments: |
|
214 |
-- source - variable to describe |
|
215 |
-- ignore - a table of references to ignore (to avoid cycles), |
|
216 |
-- defaults to empty table. This uses the references as keys, |
|
217 |
-- *not* as values, to speed up lookup. |
|
218 |
-- |
|
219 |
-- Returns: |
|
220 |
-- string description |
|
221 |
||
222 |
function dump (source, ignore) |
|
223 |
ignore = ignore or { source = true } |
|
224 |
local sourceType = type(source) |
|
225 |
||
226 |
if sourceType == 'table' then |
|
227 |
local result = '{ ' |
|
228 |
||
229 |
for key, value in pairs(source) do |
|
230 |
if not ignore[value] then |
|
231 |
local dumpValue = dump(value, ignore) |
|
232 |
||
233 |
if dumpValue ~= '' then |
|
234 |
result = result .. '["' .. key .. '"] = ' .. dumpValue .. ', ' |
|
235 |
end |
|
236 |
||
237 |
if type(value) == 'table' then |
|
238 |
ignore[value] = true |
|
239 |
end |
|
240 |
end |
|
241 |
end |
|
242 |
||
243 |
if result ~= '{ ' then |
|
244 |
return string.sub(result, 1, -3) .. ' }' |
|
245 |
else |
|
246 |
return '{}' |
|
247 |
end |
|
248 |
elseif sourceType == 'string' then |
|
249 |
return string.format('%q', source) |
|
250 |
elseif sourceType ~= 'userdata' and sourceType ~= 'function' then |
|
251 |
return tostring(source) |
|
252 |
else |
|
253 |
return '' |
|
254 |
end |
|
255 |
end |
|
256 |
||
257 |
bind = function (...) |
|
258 |
return Cached:bind(...) |
|
259 |
end |