-
Notifications
You must be signed in to change notification settings - Fork 0
/
server-show.5c
127 lines (119 loc) · 3.61 KB
/
server-show.5c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
* $Id: show.5c,v 1.4 2003/06/01 04:34:50 cworth Exp $
*
* Copyright © 2003 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
autoload Server
extend namespace Server {
public namespace Show {
void show_first_object (file f, &Object o) {
if (o.walls.above)
File::fprintf (f, " ===");
else
File::fprintf (f, " ");
}
void show_color (file f, Color c, bool active) {
int ch;
switch (c) {
case Color.Red: ch = 'r'; break;
case Color.Yellow: ch = 'y'; break;
case Color.Green: ch = 'g'; break;
case Color.Blue: ch = 'b'; break;
case Color.Whirl: ch = 'w'; break;
}
if (active)
ch = Ctype::toupper (ch);
File::fprintf (f, "%c", ch);
}
void show_shape (file f, Shape s, bool active) {
int ch;
switch (s) {
case Shape.Triangle: ch = 't'; break;
case Shape.Square: ch = 's'; break;
case Shape.Octagon: ch = 'o'; break;
case Shape.Circle: ch = 'c'; break;
case Shape.Whirl: ch = 'w'; break;
}
if (active)
ch = Ctype::toupper (ch);
File::fprintf (f, "%c", ch);
}
void show_second_object (file f, &Object o) {
if (o.walls.left)
File::fprintf (f, "|");
else
File::fprintf (f, " ");
union switch (o.robot) {
case none:
File::fprintf (f, ".");
break;
case robot r:
show_color (f, r.color, r.active);
break;
}
union switch (o.target) {
case none:
File::fprintf (f, "..");
break;
case target t:
show_color (f, t.color, t.active);
show_shape (f, t.shape, t.active);
break;
}
}
void show_last_col (file f, &Object o) {
if (o.walls.right)
File::fprintf (f, "|");
else
File::fprintf (f, " ");
File::fprintf (f, "\n");
}
void show_first_row (file f, &Board b, int row) {
for (int col = 0; col < Width; col++)
show_first_object (f, &b[col,row]);
File::fprintf (f, " \n");
}
void show_second_row (file f, &Board b, int row) {
for (int col = 0; col < Width; col++)
show_second_object (f, &b[col,row]);
show_last_col (f, &b[Width-1,row]);
}
void show_row (file f, &Board b, int row) {
show_first_row (f, &b, row);
show_second_row (f, &b, row);
}
void show_last_row (file f, &Board b) {
for (int col = 0; col < Width; col++)
{
if (b[col,Height-1].walls.below)
File::fprintf (f, " ===");
else
File::fprintf (f, " ");
}
File::fprintf (f, " ");
}
public void show (file f, &Board b) {
for (int row = 0; row < Height; row++)
show_row (f, &b, row);
show_last_row (f, &b);
}
}
}