This is write.c in view mode; [Download] [Up]
/* SCCS Id: @(#)write.c 3.0 89/01/10
*/
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
static int FDECL(cost,(struct obj *));
/*
* returns basecost of a scroll
*/
static int
cost(scroll)
register struct obj *scroll;
{
switch(scroll->otyp) {
# ifdef MAIL
case SCR_MAIL:
return(2);
/* break; */
# endif
case SCR_LIGHT:
case SCR_GOLD_DETECTION:
case SCR_FOOD_DETECTION:
case SCR_MAGIC_MAPPING:
case SCR_AMNESIA:
case SCR_FIRE:
return(8);
/* break; */
case SCR_DESTROY_ARMOR:
case SCR_CREATE_MONSTER:
case SCR_PUNISHMENT:
return(10);
/* break; */
case SCR_CONFUSE_MONSTER:
return(12);
/* break; */
case SCR_IDENTIFY:
return(14);
/* break; */
case SCR_ENCHANT_ARMOR:
case SCR_REMOVE_CURSE:
case SCR_ENCHANT_WEAPON:
case SCR_CHARGING:
return(16);
/* break; */
case SCR_SCARE_MONSTER:
case SCR_TAMING:
case SCR_TELEPORTATION:
return(20);
/* break; */
case SCR_GENOCIDE:
return(30);
/* break; */
case SCR_BLANK_PAPER:
default:
impossible("You can't write such a weird scroll!");
}
return(1000);
}
static const char write_on[] = { SCROLL_SYM, 0 };
void
dowrite(pen)
register struct obj *pen;
{
register struct obj *paper;
char namebuf[BUFSZ], scrbuf[BUFSZ];
register struct obj *newscroll;
int basecost, actualcost;
int newquan;
int curseval;
if(!pen)
return;
if(pen->otyp != MAGIC_MARKER) {
You("can't write with that!");
return;
}
/* get paper to write on */
paper = getobj(write_on,"write on");
if(!paper)
return;
if(!(objects[paper->otyp].oc_name_known)) {
pline("In your haste, you rip the scroll to pieces.");
useup(paper);
return;
}
if(paper->otyp != SCR_BLANK_PAPER) {
You("fool, that scroll's not blank!");
return;
}
/* what to write */
pline("What type of scroll do you want to write? ");
getlin(namebuf);
if(namebuf[0] == '\033' || !namebuf[0])
return;
scrbuf[0] = '\0';
if(strncmp(namebuf,"scroll of ",10) != 0)
Strcpy(scrbuf,"scroll of ");
Strcat(scrbuf,namebuf);
newscroll = readobjnam(scrbuf);
newscroll->bknown = (paper->bknown && pen->bknown);
/* do this now, before we useup() the paper */
if(newscroll->olet != SCROLL_SYM ||
newscroll->otyp == SCR_BLANK_PAPER) {
You("can't write that!");
pline("It's obscene!");
obfree(newscroll, (struct obj *) 0); /* pb@ethz.uucp */
return;
}
/* see if there's enough ink */
basecost = cost(newscroll);
if(pen->spe < basecost/2) {
Your("marker is too dry to write that!");
obfree(newscroll, (struct obj *) 0);
return;
}
/* we're really going to write now, so calculate
* cost and useup old scroll
*/
actualcost = rn1(basecost/2,basecost/2);
curseval = bcsign(pen) + bcsign(paper);
useup(paper);
/* dry out marker */
if(pen->spe < actualcost) {
Your("marker dries out!");
pline("The scroll is now useless and disappears!");
pen->spe = 0;
obfree(newscroll, (struct obj *) 0);
return;
}
pen->spe -= actualcost;
/* can't write if we don't know it - unless we're lucky */
if(!(objects[newscroll->otyp].oc_name_known) &&
!(objects[newscroll->otyp].oc_uname) &&
(rnl(pl_character[0] == 'W' ? 3 : 15))) {
You("don't know how to write that!");
You("write \"%s was here!\" and the scroll disappears.",
plname);
obfree(newscroll, (struct obj *) 0);
return;
}
/* and now you know it! */
makeknown(newscroll->otyp);
/* success - don't forget to fool prinv() */
newscroll = addinv(newscroll);
newquan = newscroll->quan;
newscroll->quan = 1;
newscroll->blessed = (curseval > 0);
newscroll->cursed = (curseval < 0);
prinv(newscroll);
newscroll->quan = newquan;
#ifdef MAIL
if (newscroll->otyp == SCR_MAIL) newscroll->spe = 1;
#endif
newscroll->known = 1;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.