1 string messages, new_hd, new_body;
2 int num_messages;
3 object who;
4 
5 void headers();
6 
id(string str)7 int id(string str) {
8     return str == "bulletin board" || str == "board" || str == "bulletinboard";
9 }
10 
11 void long() {
12     write("You can set up new notes with the command 'note headline'.\n");
13     write("Read a note with 'read num', and remove an old note with\n");
14     write("'remove num'.\n");
15     if (num_messages == 0) {
16 	write("It is empty.\n");
17 	return;
18     }
19     write("The bulletine board contains " + num_messages);
20     if (num_messages == 1)
21 	write(" note:\n\n");
22     else
23 	write(" notes:\n\n");
24     say(this_player()->query_name() +
25 	  " studies the bulletin board.\n");
26     headers();
27 }
28 
29 string short() {
30     return ("A bulletin board");
31 }
32 
get()33 int get() {
34     write("It is secured to the ground.\n");
35     return 0;
36 }
37 
init()38 void init() {
39     add_action("new", "note");
40     add_action("read", "read");
41     add_action("remove", "remove");
42 }
43 
reset(int arg)44 void reset(int arg) {
45     if (arg)
46 	return;
47     restore_object("bulletin");
48 }
49 
headers()50 void headers() {
51     string hd, body, rest;
52     int i, tmp;
53 
54     i = 1;
55     rest = messages;
56     while(rest != 0 && rest != "") {
57 	tmp = sscanf(rest, "%s:\n**\n%s\n**\n%s", hd, body, rest);
58 	if (tmp != 2 && tmp != 3) {
59 	    write("Corrupt.\n");
60 	    return;
61 	}
62 	write(i + ":\t" + hd + "\n");
63 	i += 1;
64     }
65 }
66 
new(string hd)67 int new(string hd) {
68     if (!hd)
69 	return 0;
70     if (who && environment(who) == environment(this_object())) {
71 	write(who->query_name() + " is busy writing.\n");
72 	return 1;
73     }
74     if (num_messages == 10) {
75 	write("You have to remove an old message first.\n");
76 	return 1;
77     }
78     if (strlen(hd) > 50) {
79 	write("Too long header to fit the paper.\n");
80 	return 1;
81     }
82     new_hd = hd;
83     input_to("get_body");
84     write("Give message, and terminate with '**'.\n");
85     write("]");
86     new_body = "";
87     return 1;
88 }
89 
get_body(string str)90 void get_body(string str) {
91     if (str == "**") {
92 	new_hd = new_hd + "(" + this_player()->query_name() +
93 	    ", " + ctime(time())[4..9] + ")";
94 	messages = messages + new_hd + ":\n**\n" + new_body + "\n**\n";
95 	num_messages += 1;
96 	new_body = 0;
97 	new_hd = 0;
98 	save_object("bulletin");
99 	write("Ok.\n");
100 	who = 0;
101 	return;
102     }
103     new_body = new_body + str + "\n";
104     write("]");
105     input_to("get_body");
106 }
107 
read(string str)108 int read(string str) {
109     string hd, body, rest;
110     int i, tmp;
111 
112     if (str == 0 || (sscanf(str, "%d", i) != 1 &&
113 		     sscanf(str, "note %d", i) != 1))
114 	return 0;
115     if (i < 1 || i > num_messages) {
116 	write("Not that number of messages.\n");
117 	return 1;
118     }
119     rest = messages;
120     while(rest != 0 && rest != "") {
121 	i -= 1;
122 	tmp = sscanf(rest, "%s:\n**\n%s\n**\n%s", hd, body, rest);
123 	if (tmp != 2 && tmp != 3) {
124 	    write("Corrupt.\n");
125 	    return 0;
126 	}
127 	if (i == 0) {
128 	    say(this_player()->query_name() +
129 		  " reads a note titled '" + hd + "'.\n");
130 	    write("The note is titled '" + hd + "':\n\n");
131 	    write(body);
132 	    return 1;
133 	}
134     }
135     write("Hm. This should not happen.\n");
136     return 1;
137 }
138 
remove(string str)139 int remove(string str) {
140     string hd, body, rest;
141     int i, tmp;
142 
143     if (str == 0 || (sscanf(str, "%d", i) != 1 &&
144 		     sscanf(str, "note %d", i) != 1))
145 	return 0;
146     if (i < 1 || i > num_messages) {
147 	write("Not that number of messages.\n");
148 	return 1;
149     }
150     rest = messages;
151     messages = "";
152     while(rest != 0 && rest != "") {
153 	i -= 1;
154 	tmp = sscanf(rest, "%s:\n**\n%s\n**\n%s", hd, body, rest);
155 	if (tmp != 2 && tmp != 3) {
156 	    write("Corrupt.\n");
157 	    return 1;
158 	}
159 	if (i == 0) {
160 	    say(this_player()->query_name() +
161 		  " removed a note titled '" + hd + "'.\n");
162 	    write("Ok.\n");
163 	    messages = messages + rest;
164 	    num_messages -= 1;
165 	    save_object("bulletin");
166 	    return 1;
167 	}
168 	messages = messages + hd + ":\n**\n" + body + "\n**\n";
169     }
170     write("Hm. This should not happen.\n");
171     return 1;
172 }
173