PageSourceSearch

https://dylanlandman.com/resources/js/config/collisions.js

js dylanlandman.com collected 2026-10-05 02:02:26 UTC 27,957 bytes, 903 lines download raw bytes

1// Collision configuration for the pixel portfolio world
2// This replaces the hardcoded collision logic with a data-driven approach
3
4var COLLISION_CONFIG = {
5  // Global conditions that block all movement
6  globalBlocks: [
7    {
8      condition: function() { return typeof onLog !== "undefined" && onLog; },
9      description: "Block movement when on log"
10    }
11  ],
12
13  // Main map collisions (legacy line-based system still used by script.js)
14  mainMap: {
15    // Distance per iteration based on element type
16    distancePerIteration: {
17      "body-top": -12,
18      "body-left": -12,
19      "dylan-top": 4,
20      "dylan-left": 4,
21      "dylan-bottom": 4,
22      "dylan-right": 4
23    },
24
25    // Window/viewport boundaries
26    viewport: [
27      {
28        element: "body-top",
29        condition: { top: { max: 204 } },
30        description: "Top viewport boundary"
31      }
32    ],
33
34    // Vertical collisions (up/down movement)
35    vertical: [
36      // Tent 1
37      {
38        position: { top: { exact: 680 }, left: { min: 200, max: 288 } },
39        blockKey: "keyCode1", // blocks up
40        description: "Tent 1 front collision"
41      },
42      {
43        position: { top: { exact: 680 }, left: { min: 296, max: 384 } },
44        blockKey: "keyCode1",
45        description: "Tent 1 front collision (right side)"
46      },
47      {
48        zIndex: {
49          selector: ".tent.t1",
50          whenAbove: { top: { max: 680 }, zIndex: 51 },
51          whenBelow: { top: { min: 680 }, zIndex: 48 }
52        }
53      },
54
55      // Fences
56      {
57        position: { top: { max: 348 }, left: { or: [{ max: 948 }, { min: 1016 }] } },
58        blockKey: "keyCode1",
59        description: "Top fence"
60      },
61      {
62        position: { top: { exact: 1272 }, left: { or: [{ max: 952 }, { min: 1020 }] } },
63        blockKey: "keyCode2",
64        description: "Bottom fence"
65      },
66      {
67        position: { top: { exact: 796 }, left: { max: 484 } },
68        blockKey: "keyCode2",
69        description: "Fence opposite tent 1"
70      },
71      {
72        position: { top: { exact: 648 }, left: { max: 452 } },
73        blockKey: "keyCode1",
74        description: "Fence on tent 1"
75      },
76      {
77        position: { top: { exact: 616 }, left: { max: 412 } },
78        blockKey: "keyCode2",
79        description: "Backyard fence tent 1"
80      },
81      {
82        zIndex: {
83          selector: ".fence.tent1",
84          whenAbove: { top: { max: 628 }, zIndex: 50 },
85          whenBelow: { top: { min: 628 }, zIndex: 10 }
86        }
87      },
88
89      // Dock
90      {
91        position: { top: { min: 1444 } },
92        blockKey: "keyCode2",
93        description: "Dock bottom boundary"
94      },
95
96      // Doors
97      {
98        position: { top: { max: 160 }, left: { or: [{ max: 968 }, { min: 992 }] } },
99        blockKey: "keyCode1",
100        description: "Cave door"
101      },
102      {
103        position: { top: { exact: 108 } },
104        blockKey: "keyCode1",
105        action: function() {
106          if (typeof openTutorial === "function") openTutorial();
107        },
108        description: "Tutorial trigger"
109      },
110
111      // Incline/Stairs
112      {
113        position: { top: { exact: 740 }
113, left: { min: 1412, max: 1576 } },
114        blockKey: "keyCode1",
115        description: "Bottom of incline"
116      },
117      {
118        position: { top: { exact: 756 }, left: { min: 1640, max: 1716 } },
119        blockKey: "keyCode1",
120        description: "Right side staircase bottom"
121      },
122      {
123        position: { top: { exact: 756 }, left: { min: 1572, max: 1608 } },
124        blockKey: "keyCode1",
125        description: "Left side staircase bottom"
126      },
127      {
128        position: { top: { exact: 396 }, left: { min: 1472, max: 1688 } },
129        blockKey: "keyCode1",
130        description: "Top of cliff"
131      },
132      {
133        position: { top: { exact: 680 }, left: { or: [{ min: 1472, max: 1608 }, { min: 1636, max: 1688 }] } },
134        blockKey: "keyCode2",
135        description: "Bottom of top cliff"
136      },
137      {
138        position: { top: { min: 680, max: 756 }, left: { min: 1608, max: 1636 } },
139        distanceModifier: { "dylan-top": 8, "body-top": -24 },
140        description: "Staircase speed modifier"
141      },
142      {
143        zIndex: {
144          selector: ".curved-tree",
145          whenAbove: { top: { max: 716 }, zIndex: 48 },
146          whenBelow: { top: { min: 716 }, zIndex: 51 }
147        }
148      },
149
150      // Soccer area
151      {
152        zIndex: {
153          selector: ".soccer-goal",
154          whenAbove: { top: { max: 456 }, zIndex: 48 },
155          whenBelow: { top: { min: 456 }, zIndex: 51 }
156        }
157      },
158      {
159        zIndex: {
160          selector: ".soccer-goal.back",
161          whenAbove: { top: { max: 456 }, zIndex: 48 },
162          whenBelow: { top: { min: 456 }, zIndex: 51 }
163        }
164      },
165      {
166        zIndex: {
167          selector: ".soccer-ball",
168          whenAbove: { top: { max: 560 }, zIndex: 48 },
169          whenBelow: { top: { min: 560 }, zIndex: 51 }
170        }
171      },
172
173      // Pond/Island
174      {
175        position: { top: { exact: 828 }, left: { min: 1412, max: 1716 } },
176        blockKey: "keyCode2",
177        description: "Pond outer top"
178      },
179      {
180        position: { top: { exact: 1212 }, left: { min: 1412, max: 1804 } },
181        blockKey: "keyCode1",
182        description: "Pond outer bottom"
183      },
184      {
185        position: { top: { exact: 972 }, left: { min: 1396, max: 1412 } },
186        blockKey: "keyCode2",
187        description: "Bridge outside bottom"
188      },
189      {
190        position: { top: { exact: 1040 }, left: { min: 1396, max: 1412 } },
191        blockKey: "keyCode1",
192        description: "Bridge outside top"
193      },
194      {
195        position: { top: { exact: 952 }, left: { min: 1548, max: 1684 } },
196        blockKey: "keyCode1",
197        description: "Island top"
198      },
199      {
200        position: { top: { exact: 1100 }, left: { min: 1548, max: 1684 } },
201        blockKey: "keyCode2",
202        description: "Island bottom"
203      },
204      {
205        zIndex: {
206          selector: ".fountain",
207          whenAbove: { top: { max: 1028 }, zIndex: 100 },
208          whenBelow: { top: { min: 1028 }, zIndex: 10 }
209        }
210      },
211      {
212        zIndex: {
213          selector: ".paper",
214          whenAbove: { top: { max: 1028 }, zIndex: 101 },
215          whenBelow: { top: { min: 1028 }, zIndex: 11 }
216        }
217      },
218      {
219        position: { top: { exact: 1044 }, left: { min: 1572, max: 1652 } },
220        blockKey: "keyCode1",
221        description: "Fountain top"
222      },
223      {
224        position: { top: { exact: 992 }, left: { min: 1572, max: 1652 } },
225        blockKey: "keyCode2",
226        description: "Fountain bottom"
227      },
228
229      // Fire Pit area
230      {
231        zIndex: {
232          selector: ".tall-tree.bottom",
233          whenAbove: { top: { max: 1064 }, zIndex: 100 },
234          whenBelow: { top: { min: 1064 }, zIndex: 5 }
235        }
236      },
237      {
238        zIndex: {
239          selector: ".tall-tree.right",
240          whenAbove: { top: { max: 1064 }, zIndex: 100 },
241          whenBelow: { top: { min: 1064 }, zIndex: 5 }
242        }
243      },
244      {
245        zIndex: {
246          selector: ".characters",
247          whenAbove: { top: { max: 1064 }, zIndex: 101 },
248          whenBelow: { top: { min: 1064 }, zIndex: 6 }
249        }
250      },
251      {
252        zIndex: {
253          selector: ".special-thanks-sign",
254          whenAbove: { top: { max: 1064 }, zIndex: 101 },
255          whenBelow: { top: { min: 1064 }, zIndex: 6 }
256        }
257      },
258      {
259        position: { top: { min: 548, max: 624 }, left: { min: 972, max: 1004 } },
260        distanceModifier: { "dylan-top": 8, "body-top": -24 },
261        description: "Fire pit staircase speed modifier"
262      },
263      {
264        position: { top: { exact: 552 }, left: { or: [{ min: 680, max: 972 }, { min: 1004, max: 1292 }] } },
265        blockKey: "keyCode2",
266        description: "Bottom cliff"
267      },
268      {
269        position: { top: { exact: 984 }, left: { min: 788, max: 1180 } },
270        blockKey: "keyCode2",
271        description: "Bottom cliff 2"
272      },
273      {
274        position: { top: { exact: 628 }, left: { or: [{ min: 1004, max: 1180 }, { min: 784, max: 968 }] } },
275        blockKey: "keyCode1",
276        description: "Top cliff"
277      },
278      {
279        position: { top: { exact: 1068 }, left: { min: 680, max: 1292 } },
280        blockKey: "keyCode1",
281        description: "Bottom trees"
282      },
283      {
284        position: { top: { exact: 876 }
284, left: { min: 684, max: 724 } },
285        blockKey: "keyCode1",
286        description: "Trees between stairs"
287      },
288      {
289        position: { top: { exact: 1016 }, left: { min: 684, max: 724 } },
290        blockKey: "keyCode2",
291        description: "Trees between stairs bottom"
292      },
293      {
294        zIndex: {
295          selector: "#bonfire",
296          whenAbove: { top: { max: 804 }, zIndex: 100 },
297          whenBelow: { top: { min: 804 }, zIndex: 10 }
298        }
299      },
300      {
301        position: { top: { exact: 780 }, left: { min: 936, max: 1032 } },
302        blockKey: "keyCode2",
303        description: "Bonfire top"
304      },
305      {
306        position: { top: { exact: 824 }, left: { min: 936, max: 1032 } },
307        blockKey: "keyCode1",
308        description: "Bonfire bottom"
309      },
310      {
311        position: { top: { exact: 900 }, left: { min: 788, max: 820 } },
312        blockKey: "keyCode2",
313        description: "Fire pit left staircase bottom"
314      },
315      {
316        position: { top: { exact: 972 }, left: { min: 788, max: 820 } },
317        blockKey: "keyCode1",
318        description: "Fire pit left staircase top"
319      },
320
321      // Nature elements
322      {
323        zIndex: {
324          selector: ".shrub.pathway.topShrubs",
325          whenAbove: { top: { max: 448 }, zIndex: 100 },
326          whenBelow: { top: { min: 448 }, zIndex: 11 }
327        }
328      },
329      {
330        position: { top: { exact: 320 }, left: { or: [{ min: 896, max: 968 }, { min: 1008, max: 1068 }] } },
331        blockKey: "keyCode2",
332        description: "Bushes by bridge top"
333      },
334      {
335        position: { top: { exact: 448 }, left: { or: [{ min: 896, max: 968 }, { min: 1008, max: 1068 }] } },
336        blockKey: "keyCode1",
337        description: "Bushes by bridge bottom"
338      },
339      {
340        zIndex: {
341          selector: ".bench",
342          whenAbove: { top: { max: 740 }, zIndex: 100 },
343          whenBelow: { top: { min: 844, max: 900 }, zIndex: 100 },
344          default: { zIndex: 10 }
345        }
346      },
347      {
348        position: { top: { or: [{ exact: 740 }, { exact: 900 }] }, left: { min: 900, max: 1064 } },
349        blockKey: "keyCode1",
350        description: "Log bench top"
351      },
352      {
353        position: { top: { or: [{ exact: 704 }, { exact: 868 }] }
353, left: { min: 900, max: 1064 } },
354        blockKey: "keyCode2",
355        description: "Log bench bottom"
356      },
357      {
358        zIndex: {
359          selector: ".tree-stump",
360          whenAbove: { top: { max: 796 }, zIndex: 100 },
361          whenBelow: { top: { min: 796 }, zIndex: 10 }
362        }
363      },
364      {
365        position: { top: { exact: 796 }, left: { or: [{ min: 1064, max: 1160 }, { min: 808, max: 904 }] } },
366        blockKey: "keyCode2",
367        description: "Wood stumps top"
368      },
369      {
370        position: { top: { exact: 836 }, left: { or: [{ min: 1064, max: 1160 }, { min: 808, max: 904 }] } },
371        blockKey: "keyCode1",
372        description: "Wood stumps bottom"
373      },
374      {
375        zIndex: {
376          selector: "#stump",
377          whenAbove: { top: { max: 376 }, zIndex: 100 },
378          whenBelow: { top: { min: 376 }, zIndex: 10 }
379        }
380      },
381      {
382        position: { top: { exact: 376 }, left: { min: 324, max: 412 } },
383        blockKey: "keyCode2",
384        description: "Stump with axe top"
385      },
386      {
387        position: { top: { exact: 412 }, left: { min: 324, max: 412 } },
388        blockKey: "keyCode1",
389        description: "Stump with axe bottom"
390      },
391      {
392        zIndex: {
393          selector: "#falling-tree",
394          whenAbove: { top: { max: 448 }, zIndex: 100 },
395          whenBelow: { top: { min: 448 }, zIndex: 10 }
396        }
397      },
398      // Tree collision (standing vs fallen)
399      {
400        condition: function() { return typeof hitCount !== "undefined" && hitCount < 7; },
401        position: { top: { exact: 464 }, left: { min: 212, max: 272 } },
402        blockKey: "keyCode1",
403        description: "Tree standing top"
404      },
405      {
406        condition: function() { return typeof hitCount !== "undefined" && hitCount < 7; },
407        position: { top: { exact: 448 }, left: { min: 212, max: 272 } },
408        blockKey: "keyCode2",
409        description: "Tree standing bottom"
410      },
411      {
412        condition: function() { return typeof hitCount !== "undefined" && hitCount >= 7; },
413        position: { top: { exact: 464 }, left: { min: 184, max: 376 } },
414        blockKey: "keyCode1",
415        description: "Tree fallen top"
416      },
417      {
418        condition: function() { return typeof hitCount !== "undefined" && hitCount >= 7; },
419        position: { top: { exact: 448 }, left: { min: 184, max: 376 } },
420        blockKey: "keyCode2",
421        description: "Tree fallen bottom"
422      },
423      {
424        zIndex: {
425          selector: "#wood-log",
426        whenAbove: { top: { max: 472 }, zIndex: 100 },
427          whenBelow: { top: { min: 472 }, zIndex: 10 }
428        }
429      },
430      {
431        zIndex: {
432          selector: ".s4",
433          whenAbove: { top: { min: 668 }, zIndex: 40 },
434          whenBelow: { top: { max: 668 }, zIndex: 51 }
435        }
436      },
437      {
438        zIndex: {
439          selector: ".s2, .s3",
440          whenAbove: { top: { min: 436 }, zIndex: 40 },
441          whenBelow: { top: { max: 436 }, zIndex: 51 }
442        }
443      },
444      {
445        zIndex: {
446          selector: ".s8",
447          whenAbove: { top: { min: 956 }, zIndex: 40 },
448          whenBelow: { top: { max: 956 }, zIndex: 51 }
449        }
450      }
451    ],
452
453    // Horizontal collisions (left/right movement)
454    horizontal: [
455      // Fences
456      {
457        position: { left: { max: 168 }, top: { min: 344 } },
458        blockKey: "keyCode1",
459        description: "Left fence"
460      },
461      {
462        position: { left: { min: 1800 } },
463        blockKey: "keyCode2",
464        description: "Right fence"
465      },
466      {
467        position: { left: { exact: 452 }, top: { max: 640 } },
468        blockKey: "keyCode1",
469        description: "Backyard fence"
470      },
471      {
472        position: { left: { exact: 412 }, top: { max: 630 } },
473        blockKey: "keyCode2",
474        description: "Backyard fence 2"
475      },
476      {
477        position: { left: { exact: 484 }, top: { min: 800 } },
478        blockKey: "keyCode1",
479        description: "Bottom left fence by trees"
480      },
481
482      // Dock
483      {
484        position: { top: { min: 1272 }, left: { max: 952 } },
485        blockKey: "keyCode1",
486        description: "Dock left"
487      },
488      {
489        position: { top: { min: 1272 }, left: { min: 1020 } },
490        blockKey: "keyCode2",
491        description: "Dock right"
492      },
493
494      // Tent 1
495      {
496        position: { top: { min: 584, max: 676 }
496, left: { or: [{ exact: 384 }, { exact: 288 }] } },
497        blockKey: "keyCode1",
498        description: "Tent 1 left wall"
499      },
500      {
501        position: { top: { min: 584, max: 676 }, left: { or: [{ exact: 200 }, { exact: 296 }] } },
502        blockKey: "keyCode2",
503        description: "Tent 1 right wall"
504      },
505
506      // Resume Island / Pond
507      {
508        position: { left: { exact: 1412 }, top: { or: [{ min: 828, max: 972 }, { min: 1040, max: 1212 }] } },
509        blockKey: "keyCode2",
510        description: "Resume island left outside"
511      },
512      {
513        position: { top: { or: [{ min: 1020, max: 1040 }, { min: 972, max: 1000 }] }, left: { exact: 1392 } },
514        blockKey: "keyCode2",
515        description: "Bridge outside left"
516      },
517      {
518        position: { top: { or: [{ min: 1020, max: 1040 }, { min: 972, max: 1000 }] }, left: { exact: 1548 } },
519        blockKey: "keyCode1",
520        description: "Bridge outside right"
521      },
522      {
523        position: { left: { exact: 1548 }, top: { or: [{ min: 1020, max: 1212 }, { min: 944, max: 996 }] } },
524        blockKey: "keyCode1",
525        description: "Pond left side inside"
526      },
527      {
528        position: { left: { exact: 1684 }, top: { min: 944, max: 1548 } },
529        blockKey: "keyCode2",
530        description: "Pond right side inside"
531      },
532      {
533        position: { top: { min: 992, max: 1044 }, left: { exact: 1652 } },
534        blockKey: "keyCode1",
535        description: "Fountain left"
536      },
537      {
538        position: { top: { min: 992, max: 1044 }, left: { exact: 1572 } },
539        blockKey: "keyCode2",
540        description: "Fountain right"
541      },
542
543      // Fire Pit
544      {
545        position: { left: { exact: 936 }, top: { min: 780, max: 824 } },
546        blockKey: "keyCode2",
547        description: "Bonfire left"
548      },
549      {
550        position: { left: { exact: 1032 }, top: { min: 780, max: 824 } },
551        blockKey: "keyCode1",
552        description: "Bonfire right"
553      },
554      {
555        zIndex: {
556          selector: ".tall-tree.walls.left",
557          whenAbove: { top: { max: 856 }, zIndex: 100 },
558          whenBelow: { top: { min: 856 }, zIndex: 10 }
559        }
560      },
561      {
562        zIndex: {
563          selector: ".intro-portfolio.s5",
564          whenAbove: { top: { max: 856 }, zIndex: 101 },
565          whenBelow: { top: { min: 856 }, zIndex: 11 }
566        }
567      },
568      {
569        position: { top: { min: 552, max: 1068 }, left: { exact: 1292 } },
570        blockKey: "keyCode1",
571        description: "Left trees right side"
572      },
573      {
574        position: { top: { or: [{ min: 556, max: 876 }, { min: 1012, max: 1068 }] }
574, left: { exact: 680 } },
575        blockKey: "keyCode2",
576        description: "Right trees left side"
577      },
578      {
579        position: { top: { min: 552, max: 624 }, left: { exact: 972 } },
580        blockKey: "keyCode1",
581        description: "Staircase left"
582      },
583      {
584        position: { top: { min: 552, max: 624 }, left: { exact: 1004 } },
585        blockKey: "keyCode2",
586        description: "Staircase right"
587      },
588      {
589        position: { top: { min: 628, max: 984 }, left: { exact: 1176 } },
590        blockKey: "keyCode2",
591        description: "Right cliff"
592      },
593      {
594        position: { top: { or: [{ min: 628, max: 904 }, { min: 936, max: 1012 }] }, left: { exact: 788 } },
595        blockKey: "keyCode1",
596        description: "Left cliff"
597      },
598      {
599        position: { top: { or: [{ min: 684, max: 904 }, { min: 936, max: 1016 }] }, left: { exact: 724 } },
600        blockKey: "keyCode2",
601        description: "Left cliff outside"
602      },
603      {
604        position: { top: { or: [{ min: 904, max: 924 }, { min: 952, max: 968 }] }
604, left: { exact: 820 } },
605        blockKey: "keyCode1",
606        description: "Staircase left 2"
607      },
608
609      // Inclined Surface
610      {
611        position: { left: { exact: 1412 }, top: { min: 344, max: 736 } },
612        blockKey: "keyCode2",
613        description: "Incline left cliff"
614      },
615      {
616        position: { left: { exact: 1572 }, top: { min: 740, max: 752 } },
617        blockKey: "keyCode2",
618        description: "Outside left staircase"
619      },
620      {
621        position: { left: { exact: 1688 }, top: { min: 360, max: 680 } },
622        blockKey: "keyCode2",
623        description: "Right side top"
624      },
625      {
626        position: { left: { exact: 1472 }, top: { min: 360, max: 680 } },
627        blockKey: "keyCode1",
628        description: "Left side top"
629      },
630      {
631        position: { left: { exact: 1608 }, top: { min: 680, max: 756 } },
632        blockKey: "keyCode1",
633        description: "Inside staircase left"
634      },
635      {
636        position: { left: { exact: 1636 }, top: { min: 680, max: 756 } },
637        blockKey: "keyCode2",
638        description: "Inside staircase right"
639      },
640
641      // Pond
642      {
643        position: { left: { exact: 1716 }, top: { min: 752, max: 832 } },
644        blockKey: "keyCode2",
645        description: "Pond right side"
646      },
647
648      // Nature
649      {
650        position: { top: { min: 320, max: 448 }, left: { exact: 960 } },
651        blockKey: "keyCode1",
652        description: "Top bushes"
653      },
654      {
655        position: { top: { min: 320, max: 448 }, left: { exact: 1008 } },
656        blockKey: "keyCode2",
657        description: "Top bushes 2"
658      },
659      {
660        position: { top: { min: 320, max: 448 }, left: { exact: 1068 } },
661        blockKey: "keyCode1",
662        description: "Top bushes 3"
663      },
664      {
665        position: { top: { min: 320, max: 448 }, left: { exact: 896 } },
666        blockKey: "keyCode2",
667        description: "Top bushes 4"
668      },
669      {
670        zIndex: {
671          selector: "#arch",
672          whenAbove: { top: { max: 344 }, zIndex: 100 },
673          whenBelow: { top: { min: 344 }, zIndex: 11 }
674        }
675      },
676      {
677        position: { top: { max: 344 }, left: { max: 952 } },
678        blockKey: "keyCode1",
679        description: "Top bridge left"
680      },
681      {
682        position: { top: { max: 344 }, left: { min: 1012 } },
683        blockKey: "keyCode2",
684        description: "Top bridge right"
685      },
686      {
687        position: { top: { max: 160 }, left: { max: 968 } },
688        blockKey: "keyCode1",
689        description: "Cave door left"
690      },
691      {
692        position: { top: { max: 160 }, left: { min: 992 } },
693        blockKey: "keyCode2",
694        description: "Cave door right"
695      },
696      {
697        position: { top: { or: [{ min: 704, max: 740 }, { min: 864, max: 900 }] }, left: { exact: 900 } },
698        blockKey: "keyCode2",
699        description: "Log in fireplace left"
700      },
701      {
702        position: { top: { or: [{ min: 704, max: 740 }, { min: 864, max: 900 }] }, left: { exact: 1064 } },
703        blockKey: "keyCode1",
704        description: "Log in fireplace right"
705      },
706      {
707        position: { top: { min: 796, max: 836 }, left: { or: [{ exact: 808 }, { exact: 1064 }] } },
708        blockKey: "keyCode2",
709        description: "Tree stumps left"
710      },
711      {
712        position: { top: { min: 796, max: 836 }, left: { or: [{ exact: 904 }, { exact: 1160 }] } },
713        blockKey: "keyCode1",
714        description: "Tree stumps right"
715      },
716      {
717        position: { top: { min: 376, max: 412 }, left: { exact: 324 } },
718        blockKey: "keyCode2",
719        description: "Stump with axe left"
720      },
721      {
722        position: { top: { min: 376, max: 412 }, left: { exact: 412 } },
723        blockKey: "keyCode1",
724        description: "Stump with axe right"
725      },
726      {
727        condition: function() { return typeof hitCount !== "undefined" && hitCount < 7; },
728        position: { top: { min: 448, max: 464 }, left: { exact: 212 } },
729        blockKey: "keyCode2",
730        description: "Tree standing left"
731      },
732      {
733        condition: function() { return typeof hitCount !== "undefined" && hitCount < 7; },
734        position: { top: { min: 448, max: 464 }, left: { exact: 272 } },
735        blockKey: "keyCode1",
736        description: "Tree standing right"
737      },
738      {
739        condition: function() { return typeof hitCount !== "undefined" && hitCount >= 7; },
740        position: { top: { min: 448, max: 464 }, left: { exact: 184 } },
741        blockKey: "keyCode2",
742        description: "Tree fallen left"
743      },
744      {
745        condition: function() { return typeof hitCount !== "undefined" && hitCount >= 7; },
746        position: { top: { min: 448, max: 464 }, left: { exact: 376 } },
747        blockKey: "keyCode1",
748        description: "Tree fallen right"
749      },
750      {
751        position: { top: { min: 356, max: 384 }, left: { exact: 652 } },
752        blockKey: "keyCode2",
753        description: "Moss log left"
754      },
755      {
756        position: { top: { min: 356, max: 384 }, left: { exact: 780 } },
757        blockKey: "keyCode1",
758        description: "Moss log right"
759      }
760    ]
761  },
762
763  // Tent 1 interior collisions (legacy)
764  tent1: {
765    globalBlocks: [
766      {
767        condition: function() { return typeof sitting !== "undefined" && sitting; },
768        description: "Block movement when sitting"
769      }
770    ],
771    distancePerIteration: {
772      "body-top": -12,
773      "body-left": -12,
774      "dylan-top": 4,
775      "dylan-left": 4
776    },
777    vertical: [
778      {
779        position: { top: { exact: 176 } },
780        blockKey: "keyCode2",
781        description: "Tent 1 bottom border"
782      },
783      {
784        position: { top: { exact: 132 }, left: { or: [{ max: 152 }, { min: 232 }] } },
785        blockKey: "keyCode2",
786        description: "Tent 1 bottom border 2"
787      },
788      {
789        position: { top: { exact: -44 } },
790        blockKey: "keyCode1",
791        description: "Tent 1 top border"
792      },
793      {
794        position: { top: { exact: 52 }, left: { min: 168, max: 264 } },
795        blockKey: "keyCode1",
796        description: "Tent 1 border wall"
797      },
798      {
799        position: { top: { exact: -32 }, left: { max: 100 } },
800        blockKey: "keyCode1",
801        description: "Kitchenware"
802      },
803      {
804        zIndex: {
805          selector: ".kitchen-table",
806          whenAbove: { top: { max: -12 }, zIndex: 10000 },
807          whenBelow: { top: { min: -12 }, zIndex: 9996 }
808        }
809      },
810      {
811        zIndex: {
812          selector: ".matchbox",
813          whenAbove: { top: { max: -12 }, zIndex: 10001 },
814          whenBelow: { top: { min: -12 }, zIndex: 9997 }
815        }
816      },
817      {
818        position: { top: { exact: 32 }, left: { min: 8, max: 120 } },
819        blockKey: "keyCode1",
820        description: "Kitchen table top"
821      },
822      {
823        position: { top: { exact: -12 }, left: { min: 8, max: 120 } },
824        blockKey: "keyCode2",
825        description: "Kitchen table bottom"
826      },
827      {
828        zIndex: {
829          selector: ".couch",
830          whenAbove: { top: { max: -4 }, zIndex: 10000 },
831          whenBelow: { top: { min: -4 }, zIndex: 9996 }
832        }
833      },
834      {
835        position: { top: { exact: 20 }, left: { min: 268, max: 384 } },
836        blockKey: "keyCode1",
837        description: "Couch top"
838      },
839      {
840        position: { top: { exact: -4 }, left: { min: 268, max: 384 } },
841        blockKey: "keyCode2",
842        description: "Couch bottom"
843      }
844    ],
845    horizontal: [
846      {
847        position: { left: { exact: 384 } },
848        blockKey: "keyCode2",
849        description: "Tent 1 right border"
850      },
851      {
852        position: { left: { exact: 0 } },
853        blockKey: "keyCode1",
854        description: "Tent 1 left border"
855      },
856      {
857        position: { top: { max: 52 }, left: { exact: 168 } },
858        blockKey: "keyCode2",
859        description: "Border wall left"
860      },
861      {
862        position: { top: { max: 52 }, left: { exact: 264 } },
863        blockKey: "keyCode1",
864        description: "Border wall right"
865      },
866      {
867        position: { top: { min: 132 }, left: { exact: 160 } },
868        blockKey: "keyCode1",
869        description: "Entrance wall left"
870      },
871      {
872        position: { top: { min: 132 }, left: { exact: 224 } },
873        blockKey: "keyCode2",
874        description: "Entrance wall right"
875      },
876      {
877        position: { top: { max: -32 }, left: { exact: 96 } },
878        blockKey: "keyCode1",
879        description: "Kitchenware left"
880      },
881      {
882        position: { top: { min: -12, max: 32 }, left: { exact: 120 } },
883        blockKey: "keyCode1",
884        description: "Kitchen table left"
885      },
886      {
887        position: { top: { min: -12, max: 32 }, left: { exact: 8 } },
888        blockKey: "keyCode2",
889        description: "Kitchen table right"
890      },
891      {
892        position: { top: { min: -4, max: 20 }
892, left: { exact: 264 } },
893        blockKey: "keyCode2",
894        description: "Couch left"
895      },
896      {
897        position: { top: { min: -4, max: 20 }, left: { exact: 384 } },
898        blockKey: "keyCode1",
899        description: "Couch right"
900      }
901    ]
902  }
903};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.