CONST A0 = (-250, 250); CONST B0 = (250, 250); CONST Reveal = 1; CONST A1 = (5 / 30, 5 / 30) REL (A0, B0), A2 = (9 / 30, 1 / 30) REL (A0, B0), A3 = (11 / 30, 3 / 30) REL (A0, B0), A4 = (13 / 30, 1 / 30) REL (A0, B0), A5 = (14 / 30, 1 / 30) REL (A0, B0), AB = (19 / 30, 6 / 30) REL (A0, B0), B1 = (26 / 30, 4 / 30) REL (A0, B0), B2 = (25 / 30, 4 / 30) REL (A0, B0), B3 = (23 / 30, 2 / 30) REL (A0, B0); CONST X = (19 / 30, -1 / 30) REL (A0, B0), Y = (18 / 30, -2 / 30) REL (A0, B0); CONST AX = (19 / 30, 0) REL (A0, B0), AY = (18 / 30, 0) REL (A0, B0), BX = (19 / 30, 0) REL (A0, B0), BY = (20 / 30, 0) REL (A0, B0); CONST S0 = (19, 11) REL (X, Y), S1 = (15, 7) REL (X, Y), S2 = (15, 6) REL (X, Y), S3 = (17, 4) REL (X, Y), S4 = (14, 1) REL (X, Y), S5 = (11, 4) REL (X, Y), S6 = (13, 6) REL (X, Y), S7 = (13, 7) REL (X, Y), S8 = (10, 10) REL (X, Y), S9 = (8, 8) REL (X, Y), SA = (6, 10) REL (X, Y), SB = (5, 10) REL (X, Y), SC = (2, 7) REL (X, Y), SD = (2, 6) REL (X, Y), SE = (4, 4) REL (X, Y), SF = (0, 0) REL (X, Y); CONST T0 = (9, 4) REL (X, Y), T1 = (8, 5) REL (X, Y), T2 = (7, 4) REL (X, Y), T3 = (8, 3) REL (X, Y); PROC Background() IS SAVE PS IN PS.SetWidth(2); PS.MoveTo(A0); PS.LineTo(A1); PS.LineTo(A2); PS.LineTo(A3); PS.LineTo(A4); PS.LineTo(A5); PS.LineTo(AB); PS.LineTo(B3); PS.LineTo(B2); PS.LineTo(B1); PS.LineTo(B0); PS.Stroke(); Level(0); IF Reveal > 0 -> PS.SetColor(Color.FromGrey(0.9)); PS.MoveTo(S0); PS.LineTo(S1); PS.LineTo(S2); PS.LineTo(S3); PS.LineTo(S4); PS.LineTo(S5); PS.LineTo(S6); PS.LineTo(S7); PS.LineTo(S8); PS.LineTo(S9); PS.LineTo(SA); PS.LineTo(SB); PS.LineTo(SC); PS.LineTo(SD); PS.LineTo(SE); PS.LineTo(SF); PS.LineTo((0, 11) REL (X, Y)); PS.Close(); PS.MoveTo(T0); PS.LineTo(T1); PS.LineTo(T2); PS.LineTo(T3); PS.Close(); PS.Fill(); PS.SetColor(Color.Black); PS.SetWidth(2); PS.MoveTo(S0); PS.LineTo(S1); PS.LineTo(S2); PS.LineTo(S3); PS.LineTo(S4); PS.LineTo(S5); PS.LineTo(S6); PS.LineTo(S7); PS.LineTo(S8); PS.LineTo(S9); PS.LineTo(SA); PS.LineTo(SB); PS.LineTo(SC); PS.LineTo(SD); PS.LineTo(SE); PS.LineTo(SF); PS.Stroke(); PS.MoveTo(T0); PS.LineTo(T1); PS.LineTo(T2); PS.LineTo(T3); PS.Close(); PS.Stroke(); PS.SetWidth(1); PS.MoveTo((0, 0) REL (X, Y)); PS.LineTo((19, 0) REL (X, Y)); PS.LineTo((19, 11) REL (X, Y)); PS.LineTo((0, 11) REL (X, Y)); PS.Close(); PS.Stroke() | SKIP FI END; PS.SavePage() END; PROC Heart(a, g) IS IF VAR b ~ (-0.3415, 0.1707) REL (a, g), c ~ (-0.1658, 0.5415) REL (a, g), d ~ (0.161, 0.5415) REL (a, g), e ~ (0.5024, 0.5415) REL (a, g), f ~ (0.6829, 0.08781) REL (a, g), h ~ (0.6829, -0.08781) REL (a, g), i ~ (0.5024, -0.5415) REL (a, g), j ~ (0.161, -0.5415) REL (a, g), k ~ (-0.1658, -0.5415) REL (a, g), l ~ (-0.3415, -0.1707) REL (a, g) IN PS.MoveTo(a); PS.CurveTo(b, c, d); PS.CurveTo(e, f, g); PS.CurveTo(h, i, j); PS.CurveTo(k, l, a); PS.Close(); PS.Fill() END FI END; PROC Level(d) IS PS.MoveTo((-0.2, d / 30) REL (A0, B0)); PS.LineTo((1.2, d / 30) REL (A0, B0)); PS.Stroke() END; PROC h := AHeight(a) IS IF a < 5 -> h := 6 - a | a < 6 -> h := 1 | a < 8 -> h := a - 5 | a < 10 -> h := 11 - a | a < 14 -> h := a - 9 | h := 19 - a FI END; PROC h := BHeight(b) IS IF b < 4 -> h := 6 - b | b < 6 -> h := b - 2 | b < 7 -> h := 4 | h := 11 - b FI END; PROC DrawState(a, b) IS PS.RestorePage(); PS.SetWidth(1); Level(AHeight(a)); PS.SetWidth(2); SAVE PS IN PS.SetColor(Color.Red); Circle.DrawR((a, -AHeight(a)) REL (AX, AY), 6); PS.Fill() END; IF b > 0 -> SAVE PS IN Circle.DrawR((b, BHeight(b)) REL (BX, BY), 6); PS.SetColor(Color.Blue); PS.Fill() END | SAVE PS IN PS.SetColor(Color.Magenta); Heart((b, BHeight(b) + 0.5) REL (BX, BY), (b, BHeight(b) - 1) REL (BX, BY)); PS.Fill(); PS.SetWidth(1); Level(AHeight(a)) END FI; IF Reveal > 0 -> SAVE PS IN PS.SetColor(Color.Red); PS.MoveTo((a, b) REL (X, Y)); PS.LineTo((a, 0) REL (X, Y)); PS.LineTo((a, -AHeight(a)) REL (AX, AY)); PS.Stroke() END; IF b > 0 -> SAVE PS IN PS.SetColor(Color.Blue); PS.MoveTo((a, b) REL (X, Y)); PS.LineTo((0, b) REL (X, Y)); PS.LineTo((b, BHeight(b)) REL (BX, BY)); PS.Stroke() END | SAVE PS IN PS.SetColor(Color.Magenta); PS.MoveTo((0, 0) REL (X, Y)); PS.LineTo((0, BHeight(0)) REL (BX, BY)); PS.Stroke() END FI; Circle.DrawR((a, b) REL (X, Y), 6); PS.Fill() | SKIP FI END; PROC AHead(a, b) IS IF VAR c = (0.5, 0) REL (a, b), d ~ (0.3, 0.2) REL (a, b), e ~ (0.3, -0.2) REL (a, b), f ~ (0.7, 0) REL (a, b) IN R2.Length2(R2.Minus(f, d)) = 140 AND R2.Length2(R2.Minus(f, e)) = 140 AND R2.Length2(R2.Minus(d, e)) = 90 AND R2.Length2(R2.Minus(f, c)) = 10 AND Geometry.Colinear(f, a, b) AND Geometry.Colinear((0.5, 0) REL (d, e), a, b) -> PS.MoveTo(d); PS.LineTo(f); PS.LineTo(e); PS.Stroke() END FI END; PROC Orient() IS Background(); ArrowHeads() END; PROC ArrowHeads() IS SAVE PS IN PS.SetWidth(2); PS.SetColor(Color.FromRGB(0, 0.25, 0)); AHead(S0, S1); AHead(S1, S2); AHead(S2, S3); AHead(S3, S4); AHead(S4, S5); AHead(S5, S6); AHead(S6, S7); AHead(S7, S8); AHead(S8, S9); AHead(S9, SA); AHead(SA, SB); AHead(SB, SC); AHead(SC, SD); AHead(SD, SE); AHead(SE, SF); AHead(T0, T3); AHead(T3, T2); AHead(T2, T1); AHead(T1, T0); PS.SetColor(Color.Red); AHead((19, 0) REL (AX, AY), (9, 0) REL (AX, AY)); AHead((10, 0) REL (AX, AY), (0, 0) REL (AX, AY)); PS.SetColor(Color.FromRGB(0.1, 0.05, 1)); AHead((11, 0) REL (BX, BY), (5, 0) REL (BX, BY)); AHead((6, 0) REL (BX, BY), (0, 0) REL (BX, BY)); PS.SetColor(Color.Black); PS.MoveTo(AX); PS.LineTo(AB); PS.Stroke(); PS.SetColor(Color.FromRGB(0.7, 0, 1)); AHead(AX, (0.6, 0) REL (AX, AB)); AHead((0.4, 0) REL (AX, AB), AB) END END; UI Template(Orient); PROC Scene0() IS Background(); DrawState(19, 11) END; UI Template(Scene0); PROC Scene1Frame(t) IS DrawState(19 - t, 11 - t) END; PROC a := sn1() IS a := (CLOSE(Scene1Frame), 4) END; PROC Scene1() IS Background(); Anim.Play(sn1()) END; UI Template(Scene1); PROC Scene2Frame(t) IS DrawState(15, 7 - t) END; PROC a := sn2() IS a := (CLOSE(Scene2Frame), 1) END; PROC Scene2() IS Background(); Anim.Play(sn2()) END; UI Template(Scene2); PROC Scene3Frame(t) IS DrawState(15 + t, 6 - t) END; PROC a := sn3() IS a := (CLOSE(Scene3Frame), 2) END; PROC Scene3() IS Background(); Anim.Play(sn3()) END; UI Template(Scene3); PROC Scene4Frame(t) IS DrawState(17 - t, 4 - t) END; PROC a := sn4() IS a := (CLOSE(Scene4Frame), 3) END; PROC Scene4() IS Background(); Anim.Play(sn4()) END; UI Template(Scene4); PROC Scene5Frame(t) IS DrawState(14 - t, 1 + t) END; PROC a := sn5() IS a := (CLOSE(Scene5Frame), 3) END; PROC Scene5() IS Background(); Anim.Play(sn5()) END; UI Template(Scene5); PROC Scene6Frame(t) IS DrawState(11 + t, 4 + t) END; PROC a := sn6() IS a := (CLOSE(Scene6Frame), 2) END; PROC Scene6() IS Background(); Anim.Play(sn6()) END; UI Template(Scene6); PROC Scene7Frame(t) IS DrawState(13, 6 + t) END; PROC a := sn7() IS a := (CLOSE(Scene7Frame), 1) END; PROC Scene7() IS Background(); Anim.Play(sn7()) END; UI Template(Scene7); PROC Scene8Frame(t) IS DrawState(13 - t, 7 + t) END; PROC a := sn8() IS a := (CLOSE(Scene8Frame), 3) END; PROC Scene8() IS Background(); Anim.Play(sn8()) END; UI Template(Scene8); PROC Scene9Frame(t) IS DrawState(10 - t, 10 - t) END; PROC a := sn9() IS a := (CLOSE(Scene9Frame), 2) END; PROC Scene9() IS Background(); Anim.Play(sn9()) END; UI Template(Scene9); PROC SceneAFrame(t) IS DrawState(8 - t, 8 + t) END; PROC a := snA() IS a := (CLOSE(SceneAFrame), 2) END; PROC SceneA() IS Background(); Anim.Play(snA()) END; UI Template(SceneA); PROC SceneBFrame(t) IS DrawState(6 - t, 10) END; PROC a := snB() IS a := (CLOSE(SceneBFrame), 1) END; PROC SceneB() IS Background(); Anim.Play(snB()) END; UI Template(SceneB); PROC SceneCFrame(t) IS DrawState(5 - t, 10 - t) END; PROC a := snC() IS a := (CLOSE(SceneCFrame), 3) END; PROC SceneC() IS Background(); Anim.Play(snC()) END; UI Template(SceneC); PROC SceneDFrame(t) IS DrawState(2, 7 - t) END; PROC a := snD() IS a := (CLOSE(SceneDFrame), 1) END; PROC SceneD() IS Background(); Anim.Play(snD()) END; UI Template(SceneD); PROC SceneEFrame(t) IS DrawState(2 + t, 6 - t) END; PROC a := snE() IS a := (CLOSE(SceneEFrame), 2) END; PROC SceneE() IS Background(); Anim.Play(snE()) END; UI Template(SceneE); PROC SceneFFrame(t) IS DrawState(4 - t, 4 - t) END; PROC a := snF() IS a := (CLOSE(SceneFFrame), 4) END; PROC SceneF() IS Background(); Anim.Play(snF()) END; UI Template(SceneF); PROC LastHalfInner() IS Anim.Play(Anim.Seq(Anim.Seq(sn9(), snA()), Anim.Seq(snB(), snC()))); Anim.Play(Anim.Seq(Anim.Seq(snD(), snE()), snF())) END; PROC LastHalf() IS Background(); LastHalfInner() END; UI Template(LastHalf); PROC MovieInner() IS Anim.Play(Anim.Seq(Anim.Seq(sn1(), sn2()), Anim.Seq(sn3(), sn4()))); Anim.Play(Anim.Seq(Anim.Seq(sn5(), sn6()), Anim.Seq(sn7(), sn8()))); Anim.Play(Anim.Seq(Anim.Seq(sn9(), snA()), Anim.Seq(snB(), snC()))); Anim.Play(Anim.Seq(Anim.Seq(snD(), snE()), snF())) END; PROC Movie() IS Background(); MovieInner() END; UI Template(Movie); PROC Lost1Frame(t) IS DrawState(9 - t, 4 - t) END; PROC a := tn1() IS a := (CLOSE(Lost1Frame), 1) END; PROC Lost1() IS Background(); Anim.Play(tn1()) END; UI Template(Lost1); PROC Lost2Frame(t) IS DrawState(8 - t, 3 + t) END; PROC a := tn2() IS a := (CLOSE(Lost2Frame), 1) END; PROC Lost2() IS Background(); Anim.Play(tn2()) END; UI Template(Lost2); PROC Lost3Frame(t) IS DrawState(7 + t, 4 + t) END; PROC a := tn3() IS a := (CLOSE(Lost3Frame), 1) END; PROC Lost3() IS Background(); Anim.Play(tn3()) END; UI Template(Lost3); PROC Lost4Frame(t) IS DrawState(8 + t, 5 - t) END; PROC a := tn4() IS a := (CLOSE(Lost4Frame), 1) END; PROC Lost4() IS Background(); Anim.Play(tn4()) END; UI Template(Lost4); PROC RealLostInner() IS Anim.Play(Anim.Repeat(Anim.Seq(Anim.Seq(tn2(), tn3()), Anim.Seq(tn4(), tn1())), 4)) END; PROC RealLost() IS Background(); RealLostInner() END; UI Template(RealLost); PROC Skip() IS SKIP END; UI Template(Skip);