Skip to content

Commit 3c4d4e0

Browse files
committed
trolley detector: add more whimsy
1 parent 7b73905 commit 3c4d4e0

3 files changed

Lines changed: 25 additions & 33 deletions

File tree

apps/trolley_detector/trolley_detector.star

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ TROLLEY_IMAGE = TROLLEY_IMAGE_ASSET.readall()
1414
TROLLEY_IMAGE_2X = TROLLEY_IMAGE_2X_ASSET.readall()
1515

1616
SEPTA_API = "https://www3.septa.org/api/TransitView/index.php?route=G1"
17-
TROLLEY_STOPS = {"21481": "Haverford Av & 63rd St", "12196": "Richmond St & Allegheny Av", "650": "Richmond St & Cumberland St", "20984": "Richmond St & Huntingdon St", "21071": "Girard Av & 26th St", "30292": "Girard Av & 34th St - MBFS", "21035": "Girard Av & 54th St", "21100": "Girard Av & Columbia Av", "21081": "Girard Av & Ridge Av", "21005": "Girard Av & 16th St", "21021": "Girard Av & 31st St", "21061": "Girard Av & 42nd St", "21030": "Girard Av & 49th St", "21038": "Girard Av & 57th St", "20983": "Richmond St & Lehigh Av", "21033": "Girard Av & 52nd St", "21051": "Girard Av & 56th St", "21040": "Girard Av & 60th St", "20986": "Girard Av & Berks St", "21042": "Haverford Av & 62nd St", "649": "Richmond St & Cumberland St", "21086": "Girard Av & 12th St", "21070": "Girard Av & 27th St", "21018": "Girard Av & 28th St", "21022": "Girard Av & 33rd St", "20995": "Girard Av & 4th St", "21032": "Girard Av & 51st St", "21050": "Girard Av & 57th St", "21028": "Girard Av & Belmont Av", "24038": "Frankford Av & Richmond St", "21108": "Richmond St & Lehigh Av", "21016": "Girard Av & 26th St", "21069": "Girard Av & 28th St", "20993": "Girard Av & 2nd St", "21098": "Girard Av & Frankford Av- FS", "20978": "Girard Av & Front St", "30605": "Girard Av & Merion Av", "21105": "Girard Av & Richmond St", "31540": "Frankford Av & Girard Av - FS", "21110": "Richmond St & Cambria St", "21001": "Girard Av & 11th St", "21068": "Girard Av & 29th St", "30291": "Girard Av & 34th St - MBFS", "344": "Girard Av & 40th St - FS", "21101": "Girard Av & Palmer St", "20982": "Richmond St & Cambria St", "21113": "Richmond St & Clearfield St", "21075": "College Av & 24th St - FS", "21017": "Girard Av & 27th St", "21067": "Girard Av & 31st St", "21025": "Girard Av & 39th St", "21062": "Girard Av & 41st St", "21055": "Girard Av & 52nd St", "31443": "Girard Av & 62nd St", "21091": "Girard Av & 7th St", "21078": "Girard Av & Corinthian Av", "342": "Girard Av & Front St", "30550": "Girard Av & Merion Av", "21008": "Girard Av & Ridge Av", "21073": "Poplar St & Stillman St", "31347": "Frankford Av & Delaware Av Loop", "21087": "Girard Av & 11th St", "21006": "Girard Av & 17th St", "30290": "Girard Av & 19th St", "21009": "Girard Av & 20th St", "21063": "Girard Av & 39th St", "21044": "Girard Av & 63rd St - MBFS", "21072": "26th St & Poplar St", "30791": "Girard Av & 24th St", "349": "Girard Av & 59th St", "20996": "Girard Av & 5th St", "21093": "Girard Av & 5th St", "20998": "Girard Av & 7th St", "20999": "Girard Av & 8th St", "20979": "Richmond St & Clearfield St", "21114": "Richmond St & Allegheny Av", "21079": "Girard Av & 20th St", "21026": "Girard Av & 41st St", "21037": "Girard Av & 56th St", "345": "Girard Av & 59th St", "21090": "Girard Av & 8th St", "343": "Girard Av & Broad St", "352": "Girard Av & Broad St", "20989": "Girard Av & Columbia Av", "21014": "Poplar St & 25th St", "481": "Frankford Av & Girard Av", "21111": "Richmond St & Ann St", "21107": "Richmond St & Huntingdon St", "21082": "Girard Av & 17th St", "21080": "Girard Av & 19th St", "21053": "Girard Av & 54th St", "20981": "Richmond St & Ann St", "25779": "Richmond St & Girard Av", "21019": "Girard Av & 29th St", "21095": "Girard Av & 3rd St", "21048": "Girard Av & 60th St", "21103": "Girard Av & Berks St", "21058": "Girard Av & Lancaster Av", "12218": "Richmond St & Somerset St", "21041": "Haverford Av & 61st St", "21083": "Girard Av & 16th St", "21010": "Girard Av & Corinthian Av", "20988": "Girard Av & Palmer St", "341": "Richmond St & Westmoreland St Loop", "21002": "Girard Av & 12th St", "21096": "Girard Av & 2nd St", "20994": "Girard Av & 3rd St", "350": "Girard Av & 40th St", "23992": "Frankford Av & Richmond St", "21109": "Richmond St & Somerset St", "21027": "Girard Av & 42nd St", "21056": "Girard Av & 51st St", "21047": "Girard Av & 61st St", "21060": "Girard Av & Belmont Av - FS"}
17+
TROLLEY_STOPS = {"21481": "Haverford Av & 63rd St", "12196": "Richmond St & Allegheny Av", "650": "Richmond St & Cumberland St", "20984": "Richmond St & Huntingdon St", "21071": "Girard Av & 26th St", "30292": "Girard Av & 34th St - MBFS", "21035": "Girard Av & 54th St", "21100": "Girard Av & Columbia Av", "21081": "Girard Av & Ridge Av", "21005": "Girard Av & 16th St", "21021": "Girard Av & 31st St", "21061": "Girard Av & 42nd St", "21030": "Girard Av & 49th St", "21038": "Girard Av & 57th St", "20983": "Richmond St & Lehigh Av", "21033": "Girard Av & 52nd St", "21051": "Girard Av & 56th St", "21040": "Girard Av & 60th St", "20986": "Girard Av & Berks St", "21042": "Haverford Av & 62nd St", "649": "Richmond St & Cumberland St", "21086": "Girard Av & 12th St", "21070": "Girard Av & 27th St", "21018": "Girard Av & 28th St", "21022": "Girard Av & 33rd St", "20995": "Girard Av & 4th St", "21032": "Girard Av & 51st St", "21050": "Girard Av & 56th St", "21028": "Girard Av & Belmont Av", "24038": "Frankford Av & Richmond St", "21108": "Richmond St & Lehigh Av", "21016": "Girard Av & 26th St", "21069": "Girard Av & 28th St", "20993": "Girard Av & 2nd St", "21098": "Girard Av & Frankford Av- FS", "20978": "Girard Av & Front St", "30605": "Girard Av & Merion Av", "21105": "Girard Av & Richmond St", "31540": "Frankford Av & Girard Av - FS", "21110": "Richmond St & Cambria St", "21001": "Girard Av & 11th St", "21068": "Girard Av & 29th St", "30291": "Girard Av & 34th St - MBFS", "344": "Girard Av & 40th St - FS", "21101": "Girard Av & Palmer St", "20982": "Richmond St & Cambria St", "21113": "Richmond St & Clearfield St", "21075": "College Av & 24th St - FS", "21017": "Girard Av & 27th St", "21067": "Girard Av & 31st St", "21025": "Girard Av & 39th St", "21062": "Girard Av & 41st St", "21055": "Girard Av & 52nd St", "31443": "Girard Av & 62nd St", "21091": "Girard Av & 7th St", "21078": "Girard Av & Corinthian Av", "342": "Girard Av & Front St", "30550": "Girard Av & Merion Av", "21008": "Girard Av & Ridge Av", "21073": "Poplar St & Stillman St", "31347": "Frankford Av & Delaware Av Loop", "21087": "Girard Av & 11th St", "21006": "Girard Av & 17th St", "30290": "Girard Av & 19th St", "21009": "Girard Av & 20th St", "21063": "Girard Av & 39th St", "21044": "Girard Av & 63rd St - MBFS", "21072": "26th St & Poplar St", "30791": "Girard Av & 24th St", "349": "Girard Av & 59th St", "20996": "Girard Av & 5th St", "21093": "Girard Av & 5th St", "20998": "Girard Av & 7th St", "20999": "Girard Av & 8th St", "20979": "Richmond St & Clearfield St", "21114": "Richmond St & Allegheny Av", "21079": "Girard Av & 20th St", "21026": "Girard Av & 41st St", "21037": "Girard Av & 56th St", "345": "Girard Av & 59th St", "21090": "Girard Av & 8th St", "343": "Girard Av & Broad St", "352": "Girard Av & Broad St", "20989": "Girard Av & Columbia Av", "21014": "Poplar St & 25th St", "481": "Frankford Av & Girard Av", "21111": "Richmond St & Ann St", "21107": "Richmond St & Huntingdon St", "21082": "Girard Av & 17th St", "21080": "Girard Av & 19th St", "21053": "Girard Av & 54th St", "20981": "Richmond St & Ann St", "25779": "Richmond St & Girard Av", "21019": "Girard Av & 29th St", "21095": "Girard Av & 3rd St", "21048": "Girard Av & 60th St", "21103": "Girard Av & Berks St", "21058": "Girard Av & Lancaster Av", "12218": "Richmond St & Somerset St", "21041": "Haverford Av & 61st St", "21083": "Girard Av & 16th St", "21010": "Girard Av & Corinthian Av", "20988": "Girard Av & Palmer St", "341": "Richmond St & Westmoreland St Loop", "21002": "Girard Av & 12th St", "21096": "Girard Av & 2nd St", "20994": "Girard Av & 3rd St", "350": "Girard Av & 40th St", "23992": "Frankford Av & Richmond St", "21109": "Richmond St & Somerset St", "21027": "Girard Av & 42nd St", "21056": "Girard Av & 51st St", "21047": "Girard Av & 61st St", "21060": "Girard Av & Belmont Av - FS"}
1818

1919
def get_trolley_frames(id, stop_name, direction, scale, img, id_font, text_font):
2020
frames = []
@@ -25,26 +25,21 @@ def get_trolley_frames(id, stop_name, direction, scale, img, id_font, text_font)
2525
x, w, h = 1, 39, 14
2626
y_pos = 0
2727

28-
# Continuous Entrance Sequence
29-
if i < 30:
30-
# Phase 1: Slow slide from off-screen left (-40 to 1)
31-
x = int(-40.0 + (41.0 * i / 30.0))
28+
# Continuous Entrance Sequence (Phase 1 Slide -> Phase 2 Bounce -> Phase 3 Rest)
29+
if i < 30: # Phase 1: Perfectly smooth slide from off-screen left (-40 to 0)
30+
x = int(-40.0 + (40.0 * i / 29.0))
3231
elif i == 30:
33-
# Phase 2: Overshoot peak and Horizontal Squish (Overlap ID by 2 pixels)
34-
# x + w = 42. ID starts at 40.
35-
x = -1
36-
w = 43
32+
x = 1 # Step toward overshoot
3733
elif i == 31:
38-
# Phase 3: Recoil
39-
x = -1
40-
w = 39
34+
x = 2 # Step toward overshoot
4135
elif i == 32:
42-
# Phase 4: Settle
43-
x = 1
44-
w = 39
36+
x = 3 # Peak impact (2px overlap with ID starting at 40)
37+
elif i == 33:
38+
x = 2 # Recoil
39+
elif i == 34:
40+
x = 1 # Final Resting Position
4541
else:
46-
# Phase 5: Rest
47-
x = 1
42+
x = 1 # Stable Rest
4843

4944
string = direction + " at " + stop_name.replace("& ", "&\n")
5045

@@ -56,17 +51,17 @@ def get_trolley_frames(id, stop_name, direction, scale, img, id_font, text_font)
5651
pad = (40 * scale, 1 * scale, 0, 0),
5752
child = render.Text(content = id, font = id_font),
5853
),
59-
# The Trolley - Animated slide, overshoot, and squish
54+
# The Trolley - Animated smooth slide and bounce
6055
render.Padding(
6156
pad = (x * scale, y_pos * scale, 0, 0),
6257
child = render.Image(src = img, width = w * scale, height = h * scale),
6358
),
64-
# Destination text - placed at y=14 to ensure clearance for 3 lines
59+
# Destination text - placed at y=15 to ensure clearance for 3 lines
6560
render.Padding(
66-
pad = (0, 14 * scale, 0, 0),
61+
pad = (0, 15 * scale, 0, 0),
6762
child = render.Box(
6863
width = 64 * scale,
69-
height = 18 * scale,
64+
height = 17 * scale,
7065
child = render.WrappedText(string, font = text_font, align = "center", width = 64 * scale),
7166
),
7267
),
@@ -81,40 +76,37 @@ def get_empty_frames(scale, img, text_font):
8176
# Centering 39px image in 64px width: (64-39)/2 = 12.5 -> 12
8277
resting_x = 12
8378

84-
# 200 frames total (20 seconds at 100ms delay)
85-
for i in range(200):
79+
# 180 frames total (18 seconds at 100ms delay)
80+
for i in range(180):
8681
x = resting_x
8782

88-
if i < 40: # Phase 1: Slow roll in from off-screen left (-40 to 12)
89-
x = int(-40.0 + (resting_x + 40.0) * i / 40.0)
83+
if i < 40: # Phase 1: Smooth roll in from off-screen left (-40 to 12)
84+
x = int(-40.0 + (52.0 * i / 39.0))
9085
elif i < 60: # Phase 2: Pause centered
9186
x = resting_x
9287
elif i < 100: # Phase 3: Gentle Whimsical Shimmy (1-pixel shifts)
93-
# 0,0,0,1,1,1,0,0,0,-1,-1,-1...
9488
shimmy = [0, 0, 0, 1, 1, 1, 0, 0, 0, -1, -1, -1] * 4
9589
x = resting_x + shimmy[i - 60]
9690
elif i < 120: # Phase 4: Pause centered
9791
x = resting_x
98-
elif i < 160: # Phase 5: Slow roll off to right edge (12 to 64)
99-
x = int(resting_x + (64.0 - resting_x) * (i - 120) / 40.0)
92+
elif i < 160: # Phase 5: Smooth roll off to right edge (12 to 64)
93+
x = int(resting_x + (52.0 * (i - 120) / 40.0))
10094
elif i < 180: # Phase 6: Dead air pause before repeat
10195
x = 64
102-
else: # Extra buffer
96+
else:
10397
x = 64
10498

10599
frame = render.Stack(
106100
children = [
107-
# Trolley rolling across the screen at y=0
108101
render.Padding(
109102
pad = (x * scale, 0, 0, 0),
110103
child = render.Image(src = img, width = 39 * scale, height = 14 * scale),
111104
),
112-
# Text centered at bottom (starts at y=14)
113105
render.Padding(
114-
pad = (0, 14 * scale, 0, 0),
106+
pad = (0, 15 * scale, 0, 0),
115107
child = render.Box(
116108
width = 64 * scale,
117-
height = 18 * scale,
109+
height = 17 * scale,
118110
child = render.WrappedText("No trolleys spotted.\nCheck later!", font = text_font, align = "center", width = 64 * scale),
119111
),
120112
),
-10.1 KB
Loading
-18.6 KB
Loading

0 commit comments

Comments
 (0)