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