2 ;; Given a kernel moon object, find the gate associated with the current
3 ;; phase. This is for the benefit of moongates trying to find a destination
5 (define (moon-get-current-gate kmoon)
6 (let ((gates (gob-data (kern-astral-body-get-gob kmoon)))
7 (phase (kern-astral-body-get-phase kmoon)))
8 (safe-eval (list-ref gates phase))))
10 (define (moon-signal-gate moon phase signal)
11 (let ((kgate (safe-eval (list-ref moon phase))))
12 (if (not (null? kgate))
13 (signal-kobj kgate signal kgate))))
15 (define (moon-phase-change kmoon old-phase new-phase)
16 (let ((moon (gob-data (kern-astral-body-get-gob kmoon))))
17 (moon-signal-gate moon old-phase 'off)
18 (moon-signal-gate moon new-phase 'on)))
20 (define source-moon-ifc
22 (method 'phase-change moon-phase-change)))
24 (define dest-moon-ifc nil)
27 (define (mk-moon tag name hours-per-phase hours-per-rev arc phase ifc gates color)
28 (bind-astral-body (kern-mk-astral-body
32 (* hours-per-phase 60) ; minutes per phase
33 (/ (* hours-per-rev 60) 360) ; minutes per degree
36 ifc ; script interface
38 (cond ((string=? color "yellow")
40 (list s_yellow_new_moon 0 "new")
41 (list s_yellow_wax_quarter_moon 16 "1/4 waxing")
42 (list s_yellow_wax_half_moon 32 "1/2 waxing")
43 (list s_yellow_wax_three_quarter_moon 64 "3/4 waxing")
44 (list s_yellow_full_moon 96 "full")
45 (list s_yellow_wane_three_quarter_moon 64 "3/4 waning")
46 (list s_yellow_wane_half_moon 32 "1/2 waning")
47 (list s_yellow_wane_quarter_moon 16 "1/4 waning")))
48 ((string=? color "blue")
50 (list s_blue_new_moon 0 "new")
51 (list s_blue_wax_quarter_moon 16 "1/4 waxing")
52 (list s_blue_wax_half_moon 32 "1/2 waxing")
53 (list s_blue_wax_three_quarter_moon 64 "3/4 waxing")
54 (list s_blue_full_moon 96 "full")
55 (list s_blue_wane_three_quarter_moon 64 "3/4 waning")
56 (list s_blue_wane_half_moon 32 "1/2 waning")
57 (list s_blue_wane_quarter_moon 16 "1/4 waning")))
60 (list s_new_moon 0 "new")
61 (list s_wax_quarter_moon 16 "1/4 waxing")
62 (list s_wax_half_moon 32 "1/2 waxing")
63 (list s_wax_three_quarter_moon 64 "3/4 waxing")
64 (list s_full_moon 96 "full")
65 (list s_wane_three_quarter_moon 64 "3/4 waning")
66 (list s_wane_half_moon 32 "1/2 waning")
67 (list s_wane_quarter_moon 16 "1/4 waning")))))