1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 /* hack.engrave.c - version 1.0.3 */
3 /* $FreeBSD: src/games/hack/hack.engrave.c,v 1.4 1999/11/16 02:57:04 billf Exp $ */
4 /* $DragonFly: src/games/hack/hack.engrave.c,v 1.2 2003/06/17 04:25:24 dillon Exp $ */
8 extern char *nomovemsg;
10 extern struct obj zeroobj;
12 struct engr *nxt_engr;
15 unsigned engr_lth; /* for save & restore; not length of text */
16 long engr_time; /* moment engraving was (will be) finished */
24 engr_at(x,y) xchar x,y; {
25 struct engr *ep = head_engr;
27 if(x == ep->engr_x && y == ep->engr_y)
31 return((struct engr *) 0);
34 sengr_at(s,x,y) char *s; xchar x,y; {
35 struct engr *ep = engr_at(x,y);
38 if(ep && ep->engr_time <= moves) {
41 if(!strcmp(s,t)) return(1);
45 if(!strncmp(s,t,n)) return(1);
55 if(!u.uswallow && !Levitation)
56 wipe_engr_at(u.ux, u.uy, cnt);
59 wipe_engr_at(x,y,cnt) xchar x,y,cnt; {
60 struct engr *ep = engr_at(x,y);
64 if((ep->engr_type != DUST) || Levitation) {
65 cnt = rn2(1 + 50/(cnt+1)) ? 0 : 1;
67 lth = strlen(ep->engr_txt);
71 if((ch = ep->engr_txt[pos]) == ' ')
73 ep->engr_txt[pos] = (ch != '?') ? '?' : ' ';
76 while(lth && ep->engr_txt[lth-1] == ' ')
77 ep->engr_txt[--lth] = 0;
78 while(ep->engr_txt[0] == ' ')
80 if(!ep->engr_txt[0]) del_engr(ep);
84 read_engr_at(x,y) int x,y; {
85 struct engr *ep = engr_at(x,y);
86 if(ep && ep->engr_txt[0]) {
87 switch(ep->engr_type) {
89 pline("Something is written here in the dust.");
92 pline("Something is engraved here on the floor.");
95 pline("Some text has been burned here in the floor.");
98 impossible("Something is written in a very strange way.");
100 pline("You read: \"%s\".", ep->engr_txt);
110 if(ep = engr_at(x,y))
113 alloc((unsigned)(sizeof(struct engr) + strlen(s) + 1));
114 ep->nxt_engr = head_engr;
118 ep->engr_txt = (char *)(ep + 1);
119 (void) strcpy(ep->engr_txt, s);
121 ep->engr_type = DUST;
122 ep->engr_lth = strlen(s) + 1;
128 struct engr *ep, *oep = engr_at(u.ux,u.uy);
131 int spct; /* number of leading spaces */
136 pline("You're joking. Hahaha!"); /* riv05!a3 */
140 /* one may write with finger, weapon or wand */
141 otmp = getobj("#-)/", "write with");
146 if(otmp && otmp->otyp == WAN_FIRE && otmp->spe) {
150 /* first wield otmp */
152 if(uwep && uwep->cursed) {
153 /* Andreas Bormann */
154 pline("Since your weapon is welded to your hand,");
155 pline("you use the %s.", aobjnam(uwep, (char *) 0));
159 pline("You are now empty-handed.");
160 else if(otmp->cursed)
161 pline("The %s %s to your hand!",
162 aobjnam(otmp, "weld"),
163 (otmp->quan == 1) ? "itself" : "themselves");
165 pline("You now wield %s.", doname(otmp));
173 if(otmp->otyp == DAGGER || otmp->otyp == TWO_HANDED_SWORD ||
174 otmp->otyp == CRYSKNIFE ||
175 otmp->otyp == LONG_SWORD || otmp->otyp == AXE) {
177 if((int)otmp->spe <= -3) {
179 pline("Your %s too dull for engraving.",
180 aobjnam(otmp, "are"));
181 if(oep && oep->engr_type != DUST) return(1);
185 if(Levitation && type != BURN){ /* riv05!a3 */
186 pline("You can't reach the floor!");
189 if(oep && oep->engr_type == DUST){
190 pline("You wipe out the message that was written here.");
194 if(type == DUST && oep){
195 pline("You cannot wipe out the message that is %s in the rock.",
196 (oep->engr_type == BURN) ? "burned" : "engraved");
200 pline("What do you want to %s on the floor here? ",
201 (type == ENGRAVE) ? "engrave" : (type == BURN) ? "burn" : "write");
206 while(*sp == ' ') spct++, sp++;
208 if(!len || *buf == '\033') {
209 if(type == BURN) otmp->spe++;
218 nomovemsg = "You finished writing.";
221 case ENGRAVE: /* here otmp != 0 */
222 { int len2 = (otmp->spe + 3) * 2 + 1;
224 pline("Your %s dull.", aobjnam(otmp, "get"));
229 nomovemsg = "You cannot engrave more.";
232 nomovemsg = "You finished engraving.";
238 if(oep) len += strlen(oep->engr_txt) + spct;
239 ep = (struct engr *) alloc((unsigned)(sizeof(struct engr) + len + 1));
240 ep->nxt_engr = head_engr;
244 sp = (char *)(ep + 1); /* (char *)ep + sizeof(struct engr) */
247 (void) strcpy(sp, oep->engr_txt);
248 (void) strcat(sp, buf);
251 (void) strcpy(sp, buf);
252 ep->engr_lth = len+1;
253 ep->engr_type = type;
254 ep->engr_time = moves-multi;
256 /* kludge to protect pline against excessively long texts */
257 if(len > BUFSZ-20) sp[BUFSZ-20] = 0;
262 save_engravings(fd) int fd; {
263 struct engr *ep = head_engr;
265 if(!ep->engr_lth || !ep->engr_txt[0]){
269 bwrite(fd, (char *) & (ep->engr_lth), sizeof(ep->engr_lth));
270 bwrite(fd, (char *) ep, sizeof(struct engr) + ep->engr_lth);
273 bwrite(fd, (char *) nul, sizeof(unsigned));
277 rest_engravings(fd) int fd; {
282 mread(fd, (char *) <h, sizeof(unsigned));
284 ep = (struct engr *) alloc(sizeof(struct engr) + lth);
285 mread(fd, (char *) ep, sizeof(struct engr) + lth);
286 ep->nxt_engr = head_engr;
287 ep->engr_txt = (char *) (ep + 1); /* Andreas Bormann */
292 del_engr(ep) struct engr *ep; {
295 head_engr = ep->nxt_engr;
297 for(ept = head_engr; ept; ept = ept->nxt_engr) {
298 if(ept->nxt_engr == ep) {
299 ept->nxt_engr = ep->nxt_engr;
303 impossible("Error in del_engr?");