]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/timmy/simple.c
add games/mus midi converter (by qu7uux)
[plan9front.git] / sys / src / games / timmy / simple.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include "dat.h"
5 #include "fns.h"
6
7 void
8 objpolyinit(Obj *o)
9 {
10         o->poly = polydup(o->tab->poly);
11 }
12
13 void
14 objpolymove(Obj *o, double x, double y, double θ)
15 {
16         Hinge *h;
17         double c, s;
18
19         o->p.x = x;
20         o->p.y = y;
21         o->θ = θ;
22         polytrans(o->tab->poly, o->poly, x, y, θ);
23         polybbox(o->poly, &o->bbox);
24         if(o->hinge != nil){
25                 c = cos(θ * DEG);
26                 s = sin(θ * DEG);
27                 for(h = o->hinge; h != nil; h = h->onext){
28                         h->p.x = c * h->p0.x - s * h->p0.y + x;
29                         h->p.y = s * h->p0.x + c * h->p0.y + y;
30                 }
31         }
32 }
33
34 void
35 objpolydraw(Obj *o, Image *i)
36 {
37         Hinge *h;
38         Point p;
39
40         polydraw(o->poly, i, o->tab->fill, o->tab->line);
41         for(h = o->hinge; h != nil; h = h->onext){
42                 p.x = i->r.min.x + (int)(h->p.x + 0.5);
43                 p.y = i->r.min.y + (int)(h->p.y + 0.5);
44                 ellipse(i, p, 2, 2, 0, display->black, ZP);
45         }
46 }
47
48 void
49 mkobjpoly(ObjT *t, Poly *p, Image *fill, Image *line, double imass)
50 {
51         t->init = objpolyinit;
52         t->draw = objpolydraw;
53         t->move = objpolymove;
54         t->poly = p;
55         t->line = line;
56         t->fill = fill;
57         t->imass = imass;
58 }
59
60 void
61 addhinge(ObjT *t, double x, double y)
62 {
63         Hinge *h, **hp;
64         
65         h = emalloc(sizeof(Hinge));
66         h->p.x = x;
67         h->p.y = y;
68         h->p0 = h->p;
69         h->cnext = h->cprev = h;
70         for(hp = &t->hinge; *hp != nil; hp = &(*hp)->onext)
71                 ;
72         *hp = h;
73 }
74
75 Poly *
76 mkball(int n)
77 {
78         Poly *p;
79         int i;
80         
81         p = emalloc(sizeof(Poly));
82         p->nvert = n;
83         p->vert = emalloc(sizeof(Vec) * (n + 1));
84         for(i = 0; i < n; i++){
85                 p->vert[i].x = 10 * cos(2 * PI * i / n);
86                 p->vert[i].y = 10 * sin(2 * PI * i / n);
87         }
88         p->vert[n] = p->vert[0];
89         polyfix(p);
90         return p;
91 }
92
93 ObjT tdomino, tboard, thboard, tball, tfix;
94
95 void
96 simpleinit(void)
97 {
98         mkobjpoly(&tdomino, mkpoly(4, 0.0, 0.0, 10.0, 0.0, 10.0, 40.0, 0.0, 40.0), rgb(0xFF0000FF), display->black, 10);
99         mkobjpoly(&tboard, mkpoly(4, 0.0, 0.0, 100.0, 0.0, 100.0, 6.0, 0.0, 6.0), rgb(0x663300FF), nil, 0);
100         mkobjpoly(&thboard, mkpoly(4, 0.0, 0.0, 100.0, 0.0, 100.0, 6.0, 0.0, 6.0), rgb(0x884400FF), nil, 0.5);
101         addhinge(&thboard, 48.0, 0.0);
102         addhinge(&thboard, -48.0, 0.0);
103         mkobjpoly(&tball, mkball(17), rgb(0x00FF00FF), nil, 3);
104         mkobjpoly(&tfix, mkpoly(3, 0.0, 0.0, 10.0, -17.3, 20.0, 0.0), rgb(0x663300FF), display->black, 0);
105         addhinge(&tfix, 0.0, 0.0);
106         addtray(&tdomino, &tboard, &thboard, &tfix, &tball, nil);
107 }