Skip to content

Commit 2a71326

Browse files
committed
Attempt to add NWM T-int support to Metarules.
1 parent 98879ec commit 2a71326

3 files changed

Lines changed: 126 additions & 34 deletions

File tree

src/main/scala/module/CrossingGenerator.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ object CrossingGenerator {
1111
minor <- Network.values.iterator
1212
if minor != Subway && !isHrw(minor) && (main.isRhw || minor.isRhw ||
1313
(main.isNwm && (minor.isRhw || minor.isNwm || minor.base.isEmpty)) ||
14-
(main.isNwm && isSingleTile(main) && main.height == 0 && (minor == L1Dtr || minor == L2Dtr))
14+
(main.isNwm && isSingleTile(main) && main.height == 0 && (minor == L1Dtr || minor == L2Dtr)) //||
15+
//(main.isViaduct || minor.isViaduct)
1516
) && intersectionAllowed(main, minor)
1617
} yield minor
1718
}
@@ -29,6 +30,10 @@ trait CrossingGenerator extends Adjacencies { this: RuleGenerator =>
2930
Rules += main~WE~EW | (base ~> main)~WE~EW & orient(minor~ES) // OxD
3031
Rules += main~SE~ES | (base ~> main)~WN~NW & orient(minor~NS) // DxO
3132
Rules += main~SE~ES | (base ~> main)~WN~NW & orient(minor~NE) // DxD
33+
if (main.isNwm) {
34+
Rules += main~WE~EW | (base ~> main)~WE~EW & orient(minor~CS) // OxO T 1
35+
Rules += main~WE~EW | (base ~> main)~WE~EW & orient(minor~NC) // OxO T 2
36+
}
3237
// Shared diagonals on minor are not relevant here since the shared diagonal is an inner tile (i.e. without an edge).
3338
}
3439
if (hasRightShoulder(minor)) entryCode(identity)

src/main/scala/module/MiscResolver.scala

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ class MiscResolver extends IdResolver {
5454
add(0x5c040000, L2Onewayroad~NS); add(0x5c040200, L2Onewayroad~ES)
5555
add(0x5c050000, L2Avenue ~NS); add(0x5c050200, L2Avenue ~NE); add(0x5c050300, L2Avenue~SharedDiagLeft)
5656

57+
add(0x5c000100, L1Road ~CS); add(0x5c000300, L1Road ~(0,0,0,1))
58+
add(0x5c010100, L1Onewayroad~CS); add(0x5c010300, L1Onewayroad~(0,0,0,1))
59+
add(0x5c020100, L1Avenue ~CS); //add(0x5c020200, L1Avenue ~NE); add(0x5c020300, L1Avenue~SharedDiagLeft)
60+
add(0x5c030100, L2Road ~CS); add(0x5c030300, L2Road ~(0,0,0,1))
61+
add(0x5c040100, L2Onewayroad~CS); add(0x5c040300, L2Onewayroad~(0,0,0,1))
62+
add(0x5c050100, L2Avenue ~CS); //add(0x5c050200, L2Avenue ~NE); add(0x5c050300, L2Avenue~SharedDiagLeft)
63+
64+
5765
add(0x5e54b100, Sam1~NS)
5866
add(0x5e54b200, Sam2~NS)
5967
add(0x5e54b300, Sam3~NS)
@@ -584,39 +592,8 @@ class MiscResolver extends IdResolver {
584592
add(0x5f882600 + offset, glr~WS & Avenue~SharedDiagRight)
585593
}
586594

587-
// NWM x Street T-intersections
588-
// Street thru, NWM ends
589-
// OxO
590-
add(0x51004000, Street~NS & Tla3~CE) // Tla3 Ends
591-
add(0x51014000, Street~NS & Ave2~CE) // Ave2 Ends
592-
add(0x51024000, Street~NS & Ard3~CE) // Ard3 Ends
593-
add(0x51034000, Street~NS & Owr1~CE) // Owr1 Ends
594-
add(0x51044000, Street~NS & Owr3~CE) // Owr3 Ends
595-
add(0x51054000, Street~NS & Nrd4~CE) // Nrd4 Ends
596-
// OxD
597-
add(0x5100B500, Street~NS & Tla3~CSE) // Tla3 Ends
598-
add(0x5101B500, Street~NS & Ave2~CSE) // Ave2 Ends
599-
add(0x5102B500, Street~NS & Ard3~CSE) // Ard3 Ends
600-
add(0x5103B500, Street~NS & Owr1~CSE) // Owr1 Ends
601-
add(0x5104B500, Street~NS & Owr3~CSE) // Owr1 Ends
602-
add(0x5105B500, Street~NS & Nrd4~CSE) // Nrd4 Ends
603-
// NWM thru, Street ends
604-
// OxO short T
605-
add(0x51003000, Street~CS & Tla3~WE)
606-
add(0x51013000, Street~CS & Ave2~WE)
607-
add(0x51023000, Street~CS & Ard3~WE)
608-
add(0x51023080, Street~CS & Ard3~EW)
609-
add(0x51033000, Street~CS & Owr1~WE)
610-
add(0x51043000, Street~CS & Owr3~WE)
611-
add(0x51053000, Street~CS & Nrd4~WE)
612-
add(0x51103000, Street~CN & (Tla5~EW).projectLeft)
613-
add(0x71103000, Street~CN & (Tla5~EW).projectRight)
614-
add(0x51113000, Street~CN & Owr4~EW)
615-
add(0x51153000, Street~CN & Owr4m~EW)
616-
add(0x51123000, Street~CN & Owr5~EW)
617-
add(0x51133000, Street~CN & Rd4~EW)
618-
add(0x51143000, Street~CN & Rd6~EW)
619-
add(0x51203000, Street~CN & Ave6~EW)
595+
// NWM x Street T-intersections - now covered in NwmResolver
596+
620597

621598
builder.result()
622599
}

src/main/scala/module/NwmResolver.scala

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,116 @@ class NwmResolver extends IdResolver {
234234
builder ++= withProjections(n~SE & n2~SW, IdTile(off8(id + 0x8000 + rev10), R0F0), when = asymmOrShared(n) && (n != n2))
235235
builder ++= withProjections(n~SE & n2~WS, IdTile(off8(id + 0x8000 + rev11), R0F0), when = asymmOrShared(n) && asymmOrShared(n2))
236236
}
237+
238+
//T-intersections
239+
//OxO NWM-Thru
240+
for (n <- Seq(Tla3, Ave2, Ard3, Owr1, Owr3, Nrd4)) {
241+
add(nwmRangeId(n) + 0x3000, n~WE & Street~CS) // Street
242+
add(nwmRangeId(n) + 0x3100, n~WE & Road~CS) // Road
243+
add(nwmRangeId(n) + 0x3200, n~WE & Onewayroad~CS) // Onewayroad
244+
add(nwmRangeId(n) + 0x4300, n~WE & Avenue~NC, when = n != Owr1) // Avenue
245+
add(nwmRangeId(n) + 0x3800, n~NS & Tla3~CE) // TLA-3
246+
add(nwmRangeId(n) + 0x3900, n~NS & Ave2~CE) // AVE-2
247+
add(nwmRangeId(n) + 0x3A00, n~NS & Ard3~EC, when = n != Owr1 && n != Tla3) // ARD-3a
248+
// add(nwmRangeId(n) + 0x3A80, n~NS & Ard3~EC, when = n != Owr1 && (n == Ard3)) // ARD-3b
249+
add(nwmRangeId(n) + 0x3B00, n~NS & Owr1~CE) // OWR-1
250+
add(nwmRangeId(n) + 0x3C00, n~NS & Owr3~CE, when = n != Ave2 || n != Owr1) // OWR-3
251+
add(nwmRangeId(n) + 0x3D00, n~NS & Nrd4~CE, when = n != Owr1) // NRD-4
252+
add(nwmRangeId(n) + 0x4800, n~NS & Tla5~EC, when = n != Owr1) // TLA-5
253+
add(nwmRangeId(n) + 0x4A00, n~NS & Rd4~EC, when = n != Owr1) // RD-4
254+
}
255+
256+
for (n <- Seq(Ard3, Owr3, Nrd4)) {
257+
add(nwmRangeId(n) + 0x4B00, n~NS & Rd6~EC) // RD-4
258+
add(nwmRangeId(n) + 0x4C00, n~NS & Ave6~EC) // AVE-6
259+
add(nwmRangeId(n) + 0x4C09, n~NS & Tla7m~EC) // TLA-M
260+
add(nwmRangeId(n) + 0x4D09, n~NS & Ave6m~EC) // AVE-M
261+
}
262+
263+
for (n <- Seq(Nrd4)) {
264+
add(nwmRangeId(n) + 0x4900, n~NS & Owr4~EC) // OWR-4
265+
add(nwmRangeId(n) + 0x4909, n~NS & Owr4m~EC) // OWR-4m
266+
add(nwmRangeId(n) + 0x4D00, n~NS & Ave8~EC) // AVE-8
267+
}
268+
269+
for (n <- Seq(Tla3)) {
270+
builder.addOne((Tla3~NS).projectLeft & Ard3~CE, IdTile(0x51003A80, R0F0, nonMirroredOnly))
271+
builder.addOne((Tla3~NS).projectRight & Ard3~EC, IdTile(0x51003A00, R0F0, nonMirroredOnly))
272+
}
273+
274+
for (n <- Seq(Ard3)) {
275+
add(nwmRangeId(n) + 0x3080, n~EW & Street~CS) // Street
276+
add(nwmRangeId(n) + 0x3180, n~EW & Road~CS) // Road
277+
add(nwmRangeId(n) + 0x3280, n~EW & Onewayroad~CS) // Onewayroad
278+
add(nwmRangeId(n) + 0x4380, n~EW & Avenue~NC) // Avenue
279+
add(nwmRangeId(n) + 0x3880, n~SN & Tla3~CE) // TLA-3b
280+
add(nwmRangeId(n) + 0x3980, n~SN & Ave2~CE) // AVE-2b
281+
add(nwmRangeId(n) + 0x3A80, n~SN & Ard3~CE) // ARD-3b
282+
add(nwmRangeId(n) + 0x3B80, n~SN & Owr1~CE) // OWR-1b
283+
add(nwmRangeId(n) + 0x3C80, n~SN & Owr3~CE) // OWR-3b
284+
add(nwmRangeId(n) + 0x3D80, n~SN & Nrd4~CE) // NRD-4b
285+
add(nwmRangeId(n) + 0x4880, n~SN & Tla5~EC) // TLA-5b
286+
add(nwmRangeId(n) + 0x4A80, n~SN & Rd4~EC) // RD-4b
287+
add(nwmRangeId(n) + 0x4B80, n~SN & Rd6~EC) // RD-6b
288+
add(nwmRangeId(n) + 0x4C80, n~SN & Ave6~EC) // AVE-6b
289+
add(nwmRangeId(n) + 0x4C89, n~SN & Tla7m~EC) // TLA-Mb
290+
add(nwmRangeId(n) + 0x4D89, n~SN & Ave6m~EC) // AVE-Mb
291+
}
292+
293+
for (n <- Seq(Tla5, Owr4, Owr4m, Owr5, Rd4, Rd6, Ave6, Ave8)) {
294+
add(nwmRangeId(n) + 0x3000, n~EW & Street~NC) // Street Short
295+
add(nwmRangeId(n) + 0x3080, n~WE & Street~NC) // Street Long
296+
add(nwmRangeId(n) + 0x3100, n~EW & Road~NC) // Road Short
297+
add(nwmRangeId(n) + 0x3180, n~WE & Road~NC) // Road Long
298+
add(nwmRangeId(n) + 0x3200, n~EW & Onewayroad~NC) // Onewayroad Short
299+
add(nwmRangeId(n) + 0x3280, n~WE & Onewayroad~NC) // Onewayroad Long
300+
add(nwmRangeId(n) + 0x4300, n~EW & Avenue~NC) // Avenue Short
301+
add(nwmRangeId(n) + 0x4400, n~WE & Avenue~NC) // Avenue Long
302+
add(nwmRangeId(n) + 0x3800, n~EW & Tla3~NC) // TLA-3 Short
303+
add(nwmRangeId(n) + 0x3880, n~WE & Tla3~NC) // TLA-3 Long
304+
add(nwmRangeId(n) + 0x3900, n~EW & Ave2~NC) // AVE-2 Short
305+
add(nwmRangeId(n) + 0x3980, n~WE & Ave2~NC) // AVE-2 Long
306+
add(nwmRangeId(n) + 0x3A00, n~EW & Ard3~NC) // ARD-3 Short
307+
add(nwmRangeId(n) + 0x3A80, n~WE & Ard3~NC) // ARD-3 Long
308+
add(nwmRangeId(n) + 0x3B00, n~EW & Owr1~NC) // OWR-1 Short
309+
add(nwmRangeId(n) + 0x3B80, n~WE & Owr1~NC) // OWR-1 Long
310+
add(nwmRangeId(n) + 0x3C00, n~EW & Owr3~NC) // OWR-3 Short - restrict to Owr4/m, Owr5, Rd6, Ave6, Ave8
311+
add(nwmRangeId(n) + 0x3C80, n~WE & Owr3~NC) // OWR-3 Long
312+
add(nwmRangeId(n) + 0x3D00, n~EW & Nrd4~NC) // NRD-4 Short
313+
add(nwmRangeId(n) + 0x3D80, n~WE & Nrd4~NC) // NRD-4 Long
314+
add(nwmRangeId(n) + 0x3E00, n~WE & Tla5~NC) // TLA-5 Long
315+
add(nwmRangeId(n) + 0x3F00, n~WE & Owr4~NC) // OWR-4 Long
316+
add(nwmRangeId(n) + 0x3F09, n~WE & Owr4m~NC) // OWR-4m Long
317+
add(nwmRangeId(n) + 0x4000, n~WE & Owr5~NC) // OWR-5 Long
318+
add(nwmRangeId(n) + 0x4100, n~WE & Rd4~NC) // RD-4 Long
319+
add(nwmRangeId(n) + 0x4200, n~WE & Rd6~NC) // RD-6 Long
320+
add(nwmRangeId(n) + 0x4800, n~WE & Ave6~NC) // AVE-6 Long
321+
add(nwmRangeId(n) + 0x4880, n~WE & Tla7m~NC) // TLA-M Long
322+
add(nwmRangeId(n) + 0x4900, n~WE & Ave8~NC) // AVE-8 Long
323+
add(nwmRangeId(n) + 0x4980, n~WE & Ave6m~NC) // AVE-M Long
324+
}
325+
326+
//OxO NWM-End
327+
for (n <- Seq(Tla3, Ave2, Ard3, Owr1, Owr3, Nrd4)) {
328+
add(nwmRangeId(n) + 0x4000, n~CE & Street~NS) // Street
329+
add(nwmRangeId(n) + 0x4100, n~CE & Road~NS) // Road
330+
add(nwmRangeId(n) + 0x4200, n~CE & Onewayroad~NS) // Onewayroad
331+
add(nwmRangeId(n) + 0x3300, n~CE & Avenue~SN, when = n != Owr3) // Avenue Short - disable for OWR-3
332+
add(nwmRangeId(n) + 0x3400, n~WC & Avenue~SN) // Avenue Long
333+
}
334+
//OWR-5 does not have any valid T-ints with Maxis networks - just itself, RD-6, and the Triple-Tile networks
335+
for (n <- Seq(Tla5, Owr4, Owr4m, Rd4, Rd6, Ave6, Ave8, Tla7m, Ave6m)) {
336+
add(nwmRangeId(n) + 0x3400, n~NC & Avenue~WE, when = n != Owr5) // Avenue Long
337+
}
338+
//OWR-5 does not have any valid T-ints with Maxis networks - just itself, RD-6, and the Triple-Tile networks
339+
for (n <- Seq(Tla5, Rd4)) {
340+
add(nwmRangeId(n) + 0x4500, n~CE & Road~NS) // Road - dummy for OWR-5/RD-6/AVE-6/AVE-8
341+
add(nwmRangeId(n) + 0x4600, n~CE & Onewayroad~NS) // Onewayroad - dummy for OWR-5/RD-6/AVE-6/AVE-8
342+
add(nwmRangeId(n) + 0x4700, n~CE & Street~NS) // Street
343+
// add(nwmRangeId(n) + 0x3300, n~NC & Avenue~EW) // Avenue Short - disable for all but TLA-5 and RD-4
344+
}
345+
346+
237347
}
238348

239349
builder.result()

0 commit comments

Comments
 (0)