cornerstone-source 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +20 -0
- data/Rakefile +8 -0
- data/config.rb +79 -0
- data/config.ru +4 -0
- data/cornerstone.gemspec +22 -0
- data/doc_scraper.rb +51 -0
- data/game.js +4293 -0
- data/lib/assets/javascripts/cornerstone.js +4719 -0
- data/lib/cornerstone.rb +11 -0
- data/lib/cornerstone/rails.rb +5 -0
- data/lib/cornerstone/sprockets.rb +2 -0
- data/lib/cornerstone/version.rb +3 -0
- data/manifest.json +15 -0
- data/pixie.json +12 -0
- data/source/javascripts/_cornerstone/_object_extensions.js.coffee +108 -0
- data/source/javascripts/_cornerstone/array_extensions.js.coffee +570 -0
- data/source/javascripts/_cornerstone/bindable.js.coffee +125 -0
- data/source/javascripts/_cornerstone/command_stack.js.coffee +36 -0
- data/source/javascripts/_cornerstone/core_object.js.coffee +183 -0
- data/source/javascripts/_cornerstone/function_extensions.js.coffee +60 -0
- data/source/javascripts/_cornerstone/logging.js.coffee +19 -0
- data/source/javascripts/_cornerstone/matrix.js.coffee +337 -0
- data/source/javascripts/_cornerstone/number_extensions.js.coffee +491 -0
- data/source/javascripts/_cornerstone/point.js.coffee +641 -0
- data/source/javascripts/_cornerstone/random.js.coffee +86 -0
- data/source/javascripts/_cornerstone/rectangle.js.coffee +35 -0
- data/source/javascripts/_cornerstone/string_extensions.js.coffee +232 -0
- data/source/javascripts/_cornerstone/stubs.js.coffee +1042 -0
- data/source/javascripts/_cornerstone/uuid.js +96 -0
- data/source/javascripts/_test/array_extensions.coffee +173 -0
- data/source/javascripts/_test/bindable.coffee +68 -0
- data/source/javascripts/_test/command_stack.coffee +99 -0
- data/source/javascripts/_test/core_object.coffee +95 -0
- data/source/javascripts/_test/function_extensions.coffee +50 -0
- data/source/javascripts/_test/logging.coffee +7 -0
- data/source/javascripts/_test/matrix.coffee +174 -0
- data/source/javascripts/_test/number_extensions.coffee +138 -0
- data/source/javascripts/_test/object_extensions.coffee +53 -0
- data/source/javascripts/_test/point.coffee +196 -0
- data/source/javascripts/_test/random.coffee +22 -0
- data/source/javascripts/_test/rectangle.coffee +70 -0
- data/source/javascripts/_test/string_extensions.coffee +59 -0
- data/source/javascripts/cornerstone.js.coffee +1 -0
- data/source/javascripts/cornerstone_tests.js.coffee +2 -0
- data/source/test.html.haml +13 -0
- data/vendor/javascripts/qunit.js +1275 -0
- data/vendor/stylesheets/qunit.css.sass +115 -0
- metadata +141 -0
@@ -0,0 +1,491 @@
|
|
1
|
+
###*
|
2
|
+
Returns the absolute value of this number.
|
3
|
+
|
4
|
+
(-4).abs()
|
5
|
+
# => 4
|
6
|
+
|
7
|
+
@name abs
|
8
|
+
@methodOf Number#
|
9
|
+
@returns {Number} The absolute value of the number.
|
10
|
+
###
|
11
|
+
Number::abs = () ->
|
12
|
+
Math.abs(this)
|
13
|
+
|
14
|
+
###*
|
15
|
+
Returns the mathematical ceiling of this number.
|
16
|
+
|
17
|
+
4.9.ceil()
|
18
|
+
# => 5
|
19
|
+
|
20
|
+
4.2.ceil()
|
21
|
+
# => 5
|
22
|
+
|
23
|
+
(-1.2).ceil()
|
24
|
+
# => -1
|
25
|
+
|
26
|
+
@name ceil
|
27
|
+
@methodOf Number#
|
28
|
+
@returns {Number} The number truncated to the nearest integer of greater than or equal value.
|
29
|
+
###
|
30
|
+
Number::ceil = ->
|
31
|
+
Math.ceil(this)
|
32
|
+
|
33
|
+
###*
|
34
|
+
Returns the mathematical floor of this number.
|
35
|
+
|
36
|
+
4.9.floor()
|
37
|
+
# => 4
|
38
|
+
|
39
|
+
4.2.floor()
|
40
|
+
# => 4
|
41
|
+
|
42
|
+
(-1.2).floor()
|
43
|
+
# => -2
|
44
|
+
|
45
|
+
@name floor
|
46
|
+
@methodOf Number#
|
47
|
+
@returns {Number} The number truncated to the nearest integer of less than or equal value.
|
48
|
+
###
|
49
|
+
Number::floor = ->
|
50
|
+
Math.floor(this)
|
51
|
+
|
52
|
+
###*
|
53
|
+
Returns this number rounded to the nearest integer.
|
54
|
+
|
55
|
+
4.5.round()
|
56
|
+
# => 5
|
57
|
+
|
58
|
+
4.4.round()
|
59
|
+
# => 4
|
60
|
+
|
61
|
+
@name round
|
62
|
+
@methodOf Number#
|
63
|
+
@returns {Number} The number rounded to the nearest integer.
|
64
|
+
###
|
65
|
+
Number::round = ->
|
66
|
+
Math.round(this)
|
67
|
+
|
68
|
+
###*
|
69
|
+
Get a bunch of points equally spaced around the unit circle.
|
70
|
+
|
71
|
+
4.circularPoints (p) ->
|
72
|
+
|
73
|
+
# p gets Point(1, 0), Point(0, 1), Point(-1, 0), Point(0, -1)
|
74
|
+
|
75
|
+
@name circularPoint
|
76
|
+
@methodOf Number#
|
77
|
+
|
78
|
+
###
|
79
|
+
Number::circularPoints = (block) ->
|
80
|
+
n = this
|
81
|
+
|
82
|
+
n.times (i) ->
|
83
|
+
block(Point.fromAngle((i/n).turns), i)
|
84
|
+
|
85
|
+
###*
|
86
|
+
Returns a number whose value is limited to the given range.
|
87
|
+
|
88
|
+
# limit the output of this computation to between 0 and 255
|
89
|
+
(2 * 255).clamp(0, 255)
|
90
|
+
# => 255
|
91
|
+
|
92
|
+
@name clamp
|
93
|
+
@methodOf Number#
|
94
|
+
@param {Number} min The lower boundary of the output range
|
95
|
+
@param {Number} max The upper boundary of the output range
|
96
|
+
@returns {Number} A number in the range [min, max]
|
97
|
+
###
|
98
|
+
Number::clamp = (min, max) ->
|
99
|
+
if min? and max?
|
100
|
+
Math.min(Math.max(this, min), max)
|
101
|
+
else if min?
|
102
|
+
Math.max(this, min)
|
103
|
+
else if max?
|
104
|
+
Math.min(this, max)
|
105
|
+
else
|
106
|
+
this
|
107
|
+
|
108
|
+
###*
|
109
|
+
A mod method useful for array wrapping. The range of the function is
|
110
|
+
constrained to remain in bounds of array indices.
|
111
|
+
|
112
|
+
(-1).mod(5)
|
113
|
+
# => 4
|
114
|
+
|
115
|
+
@name mod
|
116
|
+
@methodOf Number#
|
117
|
+
@param {Number} base
|
118
|
+
@returns {Number} An integer between 0 and (base - 1) if base is positive.
|
119
|
+
###
|
120
|
+
Number::mod = (base) ->
|
121
|
+
result = this % base;
|
122
|
+
|
123
|
+
if result < 0 && base > 0
|
124
|
+
result += base
|
125
|
+
|
126
|
+
return result
|
127
|
+
|
128
|
+
###*
|
129
|
+
Get the sign of this number as an integer (1, -1, or 0).
|
130
|
+
|
131
|
+
(-5).sign()
|
132
|
+
# => -1
|
133
|
+
|
134
|
+
0.sign()
|
135
|
+
# => 0
|
136
|
+
|
137
|
+
5.sign()
|
138
|
+
# => 1
|
139
|
+
|
140
|
+
@name sign
|
141
|
+
@methodOf Number#
|
142
|
+
@returns {Number} The sign of this number, 0 if the number is 0.
|
143
|
+
###
|
144
|
+
Number::sign = ->
|
145
|
+
if this > 0
|
146
|
+
1
|
147
|
+
else if this < 0
|
148
|
+
-1
|
149
|
+
else
|
150
|
+
0
|
151
|
+
|
152
|
+
###*
|
153
|
+
Returns true if this number is even (evenly divisible by 2).
|
154
|
+
|
155
|
+
2.even()
|
156
|
+
# => true
|
157
|
+
|
158
|
+
3.even()
|
159
|
+
# => false
|
160
|
+
|
161
|
+
0.even()
|
162
|
+
# => true
|
163
|
+
|
164
|
+
@name even
|
165
|
+
@methodOf Number#
|
166
|
+
@returns {Boolean} true if this number is an even integer, false otherwise.
|
167
|
+
###
|
168
|
+
Number::even = ->
|
169
|
+
this % 2 == 0
|
170
|
+
|
171
|
+
###*
|
172
|
+
Returns true if this number is odd (has remainder of 1 when divided by 2).
|
173
|
+
|
174
|
+
2.odd()
|
175
|
+
# => false
|
176
|
+
|
177
|
+
3.odd()
|
178
|
+
# => true
|
179
|
+
|
180
|
+
0.odd()
|
181
|
+
# => false
|
182
|
+
|
183
|
+
@name odd
|
184
|
+
@methodOf Number#
|
185
|
+
@returns {Boolean} true if this number is an odd integer, false otherwise.
|
186
|
+
###
|
187
|
+
Number::odd = ->
|
188
|
+
if this > 0
|
189
|
+
this % 2 == 1
|
190
|
+
else
|
191
|
+
this % 2 == -1
|
192
|
+
|
193
|
+
###*
|
194
|
+
Calls iterator the specified number of times, passing in the number of the
|
195
|
+
current iteration as a parameter: 0 on first call, 1 on the second call, etc.
|
196
|
+
|
197
|
+
output = []
|
198
|
+
|
199
|
+
5.times (n) ->
|
200
|
+
output.push(n)
|
201
|
+
|
202
|
+
output
|
203
|
+
# => [0, 1, 2, 3, 4]
|
204
|
+
|
205
|
+
@name times
|
206
|
+
@methodOf Number#
|
207
|
+
@param {Function} iterator The iterator takes a single parameter, the number of the current iteration.
|
208
|
+
@param {Object} [context] The optional context parameter specifies an object to treat as <code>this</code> in the iterator block.
|
209
|
+
@returns {Number} The number of times the iterator was called.
|
210
|
+
###
|
211
|
+
Number::times = (iterator, context) ->
|
212
|
+
i = -1
|
213
|
+
|
214
|
+
while ++i < this
|
215
|
+
iterator.call context, i
|
216
|
+
|
217
|
+
return i
|
218
|
+
|
219
|
+
###*
|
220
|
+
Returns the the nearest grid resolution less than or equal to the number.
|
221
|
+
|
222
|
+
7.snap(8)
|
223
|
+
# => 0
|
224
|
+
|
225
|
+
4.snap(8)
|
226
|
+
# => 0
|
227
|
+
|
228
|
+
12.snap(8)
|
229
|
+
# => 8
|
230
|
+
|
231
|
+
@name snap
|
232
|
+
@methodOf Number#
|
233
|
+
@param {Number} resolution The grid resolution to snap to.
|
234
|
+
@returns {Number} The nearest multiple of resolution lower than the number.
|
235
|
+
###
|
236
|
+
Number::snap = (resolution) ->
|
237
|
+
n = this / resolution; 1/1; # This is to fix broken regex in doc parser
|
238
|
+
n.floor() * resolution
|
239
|
+
|
240
|
+
###*
|
241
|
+
In number theory, integer factorization or prime factorization is the
|
242
|
+
breaking down of a composite number into smaller non-trivial divisors,
|
243
|
+
which when multiplied together equal the original integer.
|
244
|
+
|
245
|
+
Floors the number for purposes of factorization.
|
246
|
+
|
247
|
+
60.primeFactors()
|
248
|
+
# => [2, 2, 3, 5]
|
249
|
+
|
250
|
+
37.primeFactors()
|
251
|
+
# => [37]
|
252
|
+
|
253
|
+
@name primeFactors
|
254
|
+
@methodOf Number#
|
255
|
+
@returns {Array} An array containing the factorization of this number.
|
256
|
+
###
|
257
|
+
Number::primeFactors = ->
|
258
|
+
factors = []
|
259
|
+
|
260
|
+
n = Math.floor(this)
|
261
|
+
|
262
|
+
if n == 0
|
263
|
+
return undefined
|
264
|
+
|
265
|
+
if n < 0
|
266
|
+
factors.push(-1)
|
267
|
+
n /= -1
|
268
|
+
|
269
|
+
i = 2
|
270
|
+
iSquared = i * i
|
271
|
+
|
272
|
+
while iSquared < n
|
273
|
+
while (n % i) == 0
|
274
|
+
factors.push i
|
275
|
+
n /= i
|
276
|
+
|
277
|
+
i += 1
|
278
|
+
iSquared = i * i
|
279
|
+
|
280
|
+
if n != 1
|
281
|
+
factors.push n
|
282
|
+
|
283
|
+
return factors
|
284
|
+
|
285
|
+
###*
|
286
|
+
Returns the two character hexidecimal
|
287
|
+
representation of numbers 0 through 255.
|
288
|
+
|
289
|
+
255.toColorPart()
|
290
|
+
# => "ff"
|
291
|
+
|
292
|
+
0.toColorPart()
|
293
|
+
# => "00"
|
294
|
+
|
295
|
+
200.toColorPart()
|
296
|
+
# => "c8"
|
297
|
+
|
298
|
+
@name toColorPart
|
299
|
+
@methodOf Number#
|
300
|
+
@returns {String} Hexidecimal representation of the number
|
301
|
+
###
|
302
|
+
Number::toColorPart = ->
|
303
|
+
s = parseInt(this.clamp(0, 255), 10).toString(16)
|
304
|
+
|
305
|
+
if s.length == 1
|
306
|
+
s = '0' + s
|
307
|
+
|
308
|
+
return s
|
309
|
+
|
310
|
+
###*
|
311
|
+
Returns a number that is maxDelta closer to target.
|
312
|
+
|
313
|
+
255.approach(0, 5)
|
314
|
+
# => 250
|
315
|
+
|
316
|
+
5.approach(0, 10)
|
317
|
+
# => 0
|
318
|
+
|
319
|
+
@name approach
|
320
|
+
@methodOf Number#
|
321
|
+
@returns {Number} A number maxDelta toward target
|
322
|
+
###
|
323
|
+
Number::approach = (target, maxDelta) ->
|
324
|
+
(target - this).clamp(-maxDelta, maxDelta) + this
|
325
|
+
|
326
|
+
###*
|
327
|
+
Returns a number that is closer to the target by the ratio.
|
328
|
+
|
329
|
+
255.approachByRatio(0, 0.1)
|
330
|
+
# => 229.5
|
331
|
+
|
332
|
+
@name approachByRatio
|
333
|
+
@methodOf Number#
|
334
|
+
@returns {Number} A number toward target by the ratio
|
335
|
+
###
|
336
|
+
Number::approachByRatio = (target, ratio) ->
|
337
|
+
this.approach(target, this * ratio)
|
338
|
+
|
339
|
+
###*
|
340
|
+
Returns a number that is closer to the target angle by the delta.
|
341
|
+
|
342
|
+
Math.PI.approachRotation(0, Math.PI/4)
|
343
|
+
# => 2.356194490192345 # this is (3/4) * Math.PI, which is (1/4) * Math.PI closer to 0 from Math.PI
|
344
|
+
|
345
|
+
@name approachRotation
|
346
|
+
@methodOf Number#
|
347
|
+
@returns {Number} A number toward the target angle by maxDelta
|
348
|
+
###
|
349
|
+
Number::approachRotation = (target, maxDelta) ->
|
350
|
+
while target > this + Math.PI
|
351
|
+
target -= Math.TAU
|
352
|
+
|
353
|
+
while target < this - Math.PI
|
354
|
+
target += Math.TAU
|
355
|
+
|
356
|
+
return (target - this).clamp(-maxDelta, maxDelta) + this
|
357
|
+
|
358
|
+
###*
|
359
|
+
Constrains a rotation to between -PI and PI.
|
360
|
+
|
361
|
+
(9/4 * Math.PI).constrainRotation()
|
362
|
+
# => 0.7853981633974483 # this is (1/4) * Math.PI
|
363
|
+
|
364
|
+
@name constrainRotation
|
365
|
+
@methodOf Number#
|
366
|
+
@returns {Number} This number constrained between -PI and PI.
|
367
|
+
###
|
368
|
+
Number::constrainRotation = ->
|
369
|
+
target = this
|
370
|
+
|
371
|
+
while target > Math.PI
|
372
|
+
target -= Math.TAU
|
373
|
+
|
374
|
+
while target < -Math.PI
|
375
|
+
target += Math.TAU
|
376
|
+
|
377
|
+
return target
|
378
|
+
|
379
|
+
###*
|
380
|
+
The mathematical d operator. Useful for simulating dice rolls.
|
381
|
+
|
382
|
+
@name d
|
383
|
+
@methodOf Number#
|
384
|
+
@returns {Number} The sum of rolling <code>this</code> many <code>sides</code>-sided dice
|
385
|
+
###
|
386
|
+
Number::d = (sides) ->
|
387
|
+
sum = 0
|
388
|
+
|
389
|
+
this.times ->
|
390
|
+
sum += rand(sides) + 1
|
391
|
+
|
392
|
+
return sum
|
393
|
+
|
394
|
+
###*
|
395
|
+
Utility method to convert a number to a duration of seconds.
|
396
|
+
|
397
|
+
3.seconds
|
398
|
+
# => 3000
|
399
|
+
|
400
|
+
setTimout doSometing, 3.seconds
|
401
|
+
|
402
|
+
@name seconds
|
403
|
+
@propertyOf Number#
|
404
|
+
@returns {Number} This number as a duration of seconds
|
405
|
+
###
|
406
|
+
unless 5.seconds
|
407
|
+
Object.defineProperty Number::, 'seconds',
|
408
|
+
get: ->
|
409
|
+
this * 1000
|
410
|
+
|
411
|
+
unless 1.second
|
412
|
+
Object.defineProperty Number::, 'second',
|
413
|
+
get: ->
|
414
|
+
this * 1000
|
415
|
+
|
416
|
+
###*
|
417
|
+
Utility method to convert a number to an amount of rotations.
|
418
|
+
|
419
|
+
0.5.rotations
|
420
|
+
# => 3.141592653589793
|
421
|
+
|
422
|
+
I.rotation = 0.25.rotations
|
423
|
+
|
424
|
+
@name rotations
|
425
|
+
@propertyOf Number#
|
426
|
+
@returns {Number} This number as an amount of rotations
|
427
|
+
###
|
428
|
+
unless 5.rotations
|
429
|
+
Object.defineProperty Number::, 'rotations',
|
430
|
+
get: ->
|
431
|
+
this * Math.TAU
|
432
|
+
|
433
|
+
unless 1.rotation
|
434
|
+
Object.defineProperty Number::, 'rotation',
|
435
|
+
get: ->
|
436
|
+
this * Math.TAU
|
437
|
+
|
438
|
+
###*
|
439
|
+
Utility method to convert a number to an amount of rotations.
|
440
|
+
|
441
|
+
0.5.turns
|
442
|
+
# => 3.141592653589793
|
443
|
+
|
444
|
+
I.rotation = 0.25.turns
|
445
|
+
|
446
|
+
1.turn # => Math.TAU (aka 2 * Math.PI)
|
447
|
+
|
448
|
+
@name turns
|
449
|
+
@propertyOf Number#
|
450
|
+
@returns {Number} This number as an amount of rotation.
|
451
|
+
1 turn is one complete rotation.
|
452
|
+
###
|
453
|
+
unless 5.turns
|
454
|
+
Object.defineProperty Number.prototype, 'turns',
|
455
|
+
get: ->
|
456
|
+
this * Math.TAU
|
457
|
+
|
458
|
+
unless 1.turn
|
459
|
+
Object.defineProperty Number.prototype, 'turn',
|
460
|
+
get: ->
|
461
|
+
this * Math.TAU
|
462
|
+
|
463
|
+
###*
|
464
|
+
Utility method to convert a number to an amount of degrees.
|
465
|
+
|
466
|
+
180.degrees
|
467
|
+
# => 3.141592653589793
|
468
|
+
|
469
|
+
I.rotation = 90.degrees
|
470
|
+
|
471
|
+
@name degrees
|
472
|
+
@propertyOf Number#
|
473
|
+
@returns {Number} This number as an amount of degrees
|
474
|
+
###
|
475
|
+
unless 2.degrees
|
476
|
+
Object.defineProperty Number::, 'degrees',
|
477
|
+
get: ->
|
478
|
+
this * Math.TAU / 360
|
479
|
+
|
480
|
+
unless 1.degree
|
481
|
+
Object.defineProperty Number::, 'degree',
|
482
|
+
get: ->
|
483
|
+
this * Math.TAU / 360
|
484
|
+
|
485
|
+
###*
|
486
|
+
The mathematical circle constant of 1 turn.
|
487
|
+
|
488
|
+
@name TAU
|
489
|
+
@fieldOf Math
|
490
|
+
###
|
491
|
+
Math.TAU = 2 * Math.PI
|