home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Games / NetHack 3.1.3 / source / src / write.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-01  |  4.6 KB  |  200 lines  |  [TEXT/R*ch]

  1. /*    SCCS Id: @(#)write.c    3.1    91/01/04
  2. /* NetHack may be freely redistributed.  See license for details. */
  3.  
  4. #include "hack.h"
  5.  
  6. static int FDECL(cost,(struct obj *));
  7.  
  8. /*
  9.  * returns basecost of a scroll or a spellbook
  10.  */
  11. static int
  12. cost(otmp)
  13. register struct obj *otmp;
  14. {
  15.  
  16.     if (otmp->oclass == SPBOOK_CLASS)
  17.         return(10 * objects[otmp->otyp].oc_level);
  18.  
  19.     switch(otmp->otyp)  {
  20. # ifdef MAIL
  21.     case SCR_MAIL:
  22.         return(2);
  23. /*        break; */
  24. # endif
  25.     case SCR_LIGHT:
  26.     case SCR_GOLD_DETECTION:
  27.     case SCR_FOOD_DETECTION:
  28.     case SCR_MAGIC_MAPPING:
  29.     case SCR_AMNESIA:
  30.     case SCR_FIRE:
  31.         return(8);
  32. /*        break; */
  33.     case SCR_DESTROY_ARMOR:
  34.     case SCR_CREATE_MONSTER:
  35.     case SCR_PUNISHMENT:
  36.         return(10);
  37. /*        break; */
  38.     case SCR_CONFUSE_MONSTER:
  39.         return(12);
  40. /*        break; */
  41.     case SCR_IDENTIFY:
  42.         return(14);
  43. /*        break; */
  44.     case SCR_ENCHANT_ARMOR:
  45.     case SCR_REMOVE_CURSE:
  46.     case SCR_ENCHANT_WEAPON:
  47.     case SCR_CHARGING:
  48.         return(16);
  49. /*        break; */
  50.     case SCR_SCARE_MONSTER:
  51.     case SCR_TAMING:
  52.     case SCR_TELEPORTATION:
  53.         return(20);
  54. /*        break; */
  55.     case SCR_GENOCIDE:
  56.         return(30);
  57. /*        break; */
  58.     case SCR_BLANK_PAPER:
  59.     default:
  60.         impossible("You can't write such a weird scroll!");
  61.     }
  62.     return(1000);
  63. }
  64.  
  65. static NEARDATA const char write_on[] = { SCROLL_CLASS, SPBOOK_CLASS, 0 };
  66.  
  67. int
  68. dowrite(pen)
  69. register struct obj *pen;
  70. {
  71.     register struct obj *paper;
  72.     char namebuf[BUFSZ], scrbuf[BUFSZ];
  73.     register struct obj *new_obj;
  74.     int basecost, actualcost;
  75.     int curseval;
  76.     char qbuf[QBUFSZ];
  77.     
  78.     if(!pen)
  79.         return(0);
  80.     /* already tested before only call of dowrite() (from doapply())
  81.     if(pen->otyp != MAGIC_MARKER)  {
  82.         You("can't write with that!");
  83.         return(0);
  84.     }
  85.     */
  86.  
  87.     /* get paper to write on */
  88.     paper = getobj(write_on,"write on");
  89.     if(!paper)
  90.         return(0);
  91.     if(Blind && !paper->dknown) {
  92.         You("don't know if that %s is blank or not!",
  93.               paper->oclass == SPBOOK_CLASS ? "spellbook" :
  94.               "scroll");
  95.         return(1);
  96.     }
  97.     paper->dknown = 1;
  98.     if(paper->otyp != SCR_BLANK_PAPER && paper->otyp != SPE_BLANK_PAPER) {
  99.         pline("That %s is not blank!",
  100.             paper->oclass == SPBOOK_CLASS ? "spellbook" :
  101.             "scroll");
  102.         exercise(A_WIS, FALSE);
  103.         return(1);
  104.     }
  105.  
  106.     /* what to write */
  107.     Sprintf(qbuf, "What type of %s do you want to write? ",
  108.           paper->oclass == SPBOOK_CLASS ? "spellbook" :
  109.           "scroll");
  110.     getlin(qbuf, namebuf);
  111.     if(namebuf[0] == '\033' || !namebuf[0])
  112.         return(1);
  113.     scrbuf[0] = '\0';
  114.     if (paper->oclass == SPBOOK_CLASS) {
  115.         if(strncmp(namebuf,"spellbook of ",13) != 0)
  116.             Strcpy(scrbuf,"spellbook of ");
  117.     }
  118.     else if(strncmp(namebuf,"scroll of ",10) != 0)
  119.         Strcpy(scrbuf,"scroll of ");
  120.     Strcat(scrbuf,namebuf);
  121.     new_obj = readobjnam(scrbuf);
  122.  
  123.     new_obj->bknown = (paper->bknown && pen->bknown);
  124.  
  125.     if((new_obj->oclass != SCROLL_CLASS ||
  126.                   new_obj->otyp == SCR_BLANK_PAPER)
  127.         && (new_obj->oclass != SPBOOK_CLASS || 
  128.                       new_obj->otyp == SPE_BLANK_PAPER)) {
  129.         You("can't write that!");
  130.         pline("It's obscene!");
  131.         obfree(new_obj, (struct obj *) 0); /* pb@ethz.uucp */
  132.         return(1);
  133.     }
  134.  
  135.     /* see if there's enough ink */
  136.     basecost = cost(new_obj);
  137.     if(pen->spe < basecost/2)  {
  138.         Your("marker is too dry to write that!");
  139.         obfree(new_obj, (struct obj *) 0);
  140.         return(1);
  141.     }
  142.  
  143.     /* we're really going to write now, so calculate cost
  144.      */
  145.     actualcost = rn1(basecost/2,basecost/2);
  146.     curseval = bcsign(pen) + bcsign(paper);
  147.     exercise(A_WIS, TRUE);
  148.     /* dry out marker */
  149.     if(pen->spe < actualcost)  {
  150.         Your("marker dries out!");
  151.         /* scrolls disappear, spellbooks don't */
  152.         if (paper->oclass == SPBOOK_CLASS)
  153.             pline("The spellbook is left unfinished.");
  154.         else {
  155.             pline("The scroll is now useless and disappears!");
  156.             useup(paper);
  157.         }
  158.         pen->spe = 0;
  159.         obfree(new_obj, (struct obj *) 0);
  160.         return(1);
  161.     }
  162.     pen->spe -= actualcost;
  163.  
  164.     /* can't write if we don't know it - unless we're lucky */
  165.     if(!(objects[new_obj->otyp].oc_name_known) && 
  166.        !(objects[new_obj->otyp].oc_uname) && 
  167.        (rnl(pl_character[0] == 'W' ? 3 : 15))) {
  168.         You("don't know how to write that!");
  169.         /* scrolls disappear, spellbooks don't */
  170.         if (paper->oclass == SPBOOK_CLASS)
  171.             You("write in your best handwriting:  \"My Diary\".");
  172.         else {
  173.             You("write \"%s was here!\" and the scroll disappears.",plname);
  174.             useup(paper);
  175.         }
  176.         obfree(new_obj, (struct obj *) 0);
  177.         return(1);
  178.     }
  179.  
  180.     /* useup old scroll / spellbook */
  181.     useup(paper);
  182.  
  183.     /* now you know it! */
  184.     makeknown(new_obj->otyp);
  185.  
  186.     /* success */
  187.     new_obj->blessed = (curseval > 0);
  188.     new_obj->cursed = (curseval < 0);
  189. #ifdef MAIL
  190.     if (new_obj->otyp == SCR_MAIL) new_obj->spe = 1;
  191. #endif
  192.     new_obj = hold_another_object(new_obj, "Oops!  %s out of your grasp!",
  193.                            The(aobjnam(new_obj, "slip")),
  194.                            (const char *)0);
  195.     if (new_obj) new_obj->known = 1;
  196.     return(1);
  197. }
  198.  
  199. /*write.c*/
  200.