Home | History | Annotate | Line # | Download | only in hack
hack.mkobj.c revision 1.4
      1 /*	$NetBSD: hack.mkobj.c,v 1.4 1997/10/19 16:58:29 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
      5  */
      6 
      7 #include <sys/cdefs.h>
      8 #ifndef lint
      9 __RCSID("$NetBSD: hack.mkobj.c,v 1.4 1997/10/19 16:58:29 christos Exp $");
     10 #endif				/* not lint */
     11 
     12 #include "hack.h"
     13 #include "extern.h"
     14 
     15 char            mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%";
     16 
     17 struct obj     *
     18 mkobj_at(let, x, y)
     19 	int let, x, y;
     20 {
     21 	struct obj     *otmp = mkobj(let);
     22 	otmp->ox = x;
     23 	otmp->oy = y;
     24 	otmp->nobj = fobj;
     25 	fobj = otmp;
     26 	return (otmp);
     27 }
     28 
     29 void
     30 mksobj_at(otyp, x, y)
     31 	int otyp, x, y;
     32 {
     33 	struct obj     *otmp = mksobj(otyp);
     34 	otmp->ox = x;
     35 	otmp->oy = y;
     36 	otmp->nobj = fobj;
     37 	fobj = otmp;
     38 }
     39 
     40 struct obj     *
     41 mkobj(let)
     42 	int let;
     43 {
     44 	if (!let)
     45 		let = mkobjstr[rn2(sizeof(mkobjstr) - 1)];
     46 	return (
     47 		mksobj(
     48 		       letter(let) ?
     49 	  CORPSE + ((let > 'Z') ? (let - 'a' + 'Z' - '@' + 1) : (let - '@'))
     50 		       : probtype(let)
     51 		       )
     52 		);
     53 }
     54 
     55 
     56 struct obj      zeroobj;
     57 
     58 struct obj     *
     59 mksobj(otyp)
     60 	int otyp;
     61 {
     62 	struct obj     *otmp;
     63 	char            let = objects[otyp].oc_olet;
     64 
     65 	otmp = newobj(0);
     66 	*otmp = zeroobj;
     67 	otmp->age = moves;
     68 	otmp->o_id = flags.ident++;
     69 	otmp->quan = 1;
     70 	otmp->olet = let;
     71 	otmp->otyp = otyp;
     72 	otmp->dknown = strchr("/=!?*", let) ? 0 : 1;
     73 	switch (let) {
     74 	case WEAPON_SYM:
     75 		otmp->quan = (otmp->otyp <= ROCK) ? rn1(6, 6) : 1;
     76 		if (!rn2(11))
     77 			otmp->spe = rnd(3);
     78 		else if (!rn2(10)) {
     79 			otmp->cursed = 1;
     80 			otmp->spe = -rnd(3);
     81 		}
     82 		break;
     83 	case FOOD_SYM:
     84 		if (otmp->otyp >= CORPSE)
     85 			break;
     86 #ifdef NOT_YET_IMPLEMENTED
     87 		/* if tins are to be identified, need to adapt doname() etc */
     88 		if (otmp->otyp == TIN)
     89 			otmp->spe = rnd(...);
     90 #endif	/* NOT_YET_IMPLEMENTED */
     91 		/* fall into next case */
     92 	case GEM_SYM:
     93 		otmp->quan = rn2(6) ? 1 : 2;
     94 	case TOOL_SYM:
     95 	case CHAIN_SYM:
     96 	case BALL_SYM:
     97 	case ROCK_SYM:
     98 	case POTION_SYM:
     99 	case SCROLL_SYM:
    100 	case AMULET_SYM:
    101 		break;
    102 	case ARMOR_SYM:
    103 		if (!rn2(8))
    104 			otmp->cursed = 1;
    105 		if (!rn2(10))
    106 			otmp->spe = rnd(3);
    107 		else if (!rn2(9)) {
    108 			otmp->spe = -rnd(3);
    109 			otmp->cursed = 1;
    110 		}
    111 		break;
    112 	case WAND_SYM:
    113 		if (otmp->otyp == WAN_WISHING)
    114 			otmp->spe = 3;
    115 		else
    116 			otmp->spe = rn1(5,
    117 			       (objects[otmp->otyp].bits & NODIR) ? 11 : 4);
    118 		break;
    119 	case RING_SYM:
    120 		if (objects[otmp->otyp].bits & SPEC) {
    121 			if (!rn2(3)) {
    122 				otmp->cursed = 1;
    123 				otmp->spe = -rnd(2);
    124 			} else
    125 				otmp->spe = rnd(2);
    126 		} else if (otmp->otyp == RIN_TELEPORTATION ||
    127 			   otmp->otyp == RIN_AGGRAVATE_MONSTER ||
    128 			   otmp->otyp == RIN_HUNGER || !rn2(9))
    129 			otmp->cursed = 1;
    130 		break;
    131 	default:
    132 		panic("impossible mkobj");
    133 	}
    134 	otmp->owt = weight(otmp);
    135 	return (otmp);
    136 }
    137 
    138 int
    139 letter(c)
    140 	int c;
    141 {
    142 	return (('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
    143 }
    144 
    145 int
    146 weight(obj)
    147 	struct obj     *obj;
    148 {
    149 	int             wt = objects[obj->otyp].oc_weight;
    150 	return (wt ? wt * obj->quan : (obj->quan + 1) / 2);
    151 }
    152 
    153 void
    154 mkgold(num, x, y)
    155 	long            num;
    156 {
    157 	struct gold    *gold;
    158 	long            amount = (num ? num : 1 + (rnd(dlevel + 2) * rnd(30)));
    159 
    160 	if ((gold = g_at(x, y)) != NULL)
    161 		gold->amount += amount;
    162 	else {
    163 		gold = newgold();
    164 		gold->ngold = fgold;
    165 		gold->gx = x;
    166 		gold->gy = y;
    167 		gold->amount = amount;
    168 		fgold = gold;
    169 		/* do sth with display? */
    170 	}
    171 }
    172