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