abstract
| - Below is the full text to mkobj.c from the source code of NetHack 2.2a. To link to a particular line, write [[NetHack 2.2a/mkobj.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)mkobj.c 2.2 87/11/29 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. 4. #include "hack.h" 5. #ifdef SPELLS 6. char mkobjstr[] = "))[[!!!!????+%%%%/=**))[[!!!!????+%%%%/=**(%"; 7. #else 8. char mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%"; 9. #endif 10. 11. struct obj *mkobj(), *mksobj(); 12. 13. struct obj * 14. mkobj_at(let,x,y) 15. register int let,x,y; 16. { 17. register struct obj *otmp = mkobj(let); 18. otmp->ox = x; 19. otmp->oy = y; 20. otmp->nobj = fobj; 21. fobj = otmp; 22. return(otmp); 23. } 24. 25. struct obj * 26. mksobj_at(otyp,x,y) 27. register int otyp,x,y; 28. { 29. register struct obj *otmp = mksobj(otyp); 30. otmp->ox = x; 31. otmp->oy = y; 32. otmp->nobj = fobj; 33. return((fobj = otmp)); 34. } 35. 36. #ifdef RPH 37. struct obj * 38. mk_named_obj_at (let, x, y, nm, lth) /* used for named corpses */ 39. register let, x, y; 40. char * nm; 41. register int lth; 42. { 43. register struct obj *otmp; 44. register struct obj *obj2; 45. 46. if (lth == 0) return (mkobj_at (let,x,y)); 47. 48. otmp = mkobj(let); 49. obj2 = newobj(lth); 50. *obj2 = *otmp; 51. obj2->onamelth = lth; 52. (void) strcpy (ONAME(obj2), nm); 53. free( (char *)otmp); 54. obj2->ox = x; 55. obj2->oy = y; 56. obj2->nobj = fobj; 57. fobj = obj2; 58. return(obj2); 59. } 60. #endif 61. 62. struct obj * 63. mkobj(let) { 64. int realtype; 65. switch (let) { 66. case RANDOM_SYM: { 67. realtype=probtype(mkobjstr[rn2(sizeof(mkobjstr)-1)]); 68. break; 69. } 70. case '3': { realtype = DEAD_SOLDIER; break; } 71. case '9': { realtype = DEAD_GIANT; break; } 72. case '&': { realtype = DEAD_DEMON; break; } 73. default: realtype = letter(let) ? 74. CORPSE + ((let>'Z') ? (let-'a'+'Z'-'@'+1) : (let-'@')) 75. : probtype(let); 76. } 77. return(mksobj(realtype)); 78. } 79. 80. 81. struct obj zeroobj; 82. 83. struct obj * 84. mksobj(otyp) 85. register otyp; 86. { 87. register struct obj *otmp; 88. char let = objects[otyp].oc_olet; 89. 90. otmp = newobj(0); 91. *otmp = zeroobj; 92. otmp->age = moves; 93. otmp->o_id = flags.ident++; 94. otmp->quan = 1; 95. otmp->olet = let; 96. otmp->otyp = otyp; 97. otmp->dknown = index( 98. #ifdef KAA 99. #ifdef SPELLS 100. "/=!?*+)", 101. #else 102. "/=!?*)", 103. #endif 104. #else 105. #ifdef SPELLS 106. "/=!?*+", 107. #else 108. "/=!?*", 109. #endif 110. #endif 111. let) ? 0 : 1; 112. switch(let) { 113. case WEAPON_SYM: 114. otmp->quan = (otmp->otyp <= ROCK) ? rn1(6,6) : 1; 115. if(!rn2(11)) otmp->spe = rne(2); 116. else if(!rn2(10)) { 117. otmp->cursed = 1; 118. otmp->spe = -rne(2); 119. } 120. break; 121. case FOOD_SYM: 122. if(otmp->otyp >= CORPSE) break; 123. #ifdef NOT_YET_IMPLEMENTED 124. /* if tins are to be identified, need to adapt doname() etc */ 125. if(otmp->otyp == TIN) 126. otmp->spe = rnd(...); 127. #endif 128. /* fall into next case */ 129. case GEM_SYM: 130. otmp->quan = rn2(6) ? 1 : 2; 131. case TOOL_SYM: 132. case CHAIN_SYM: 133. case BALL_SYM: 134. case ROCK_SYM: 135. case POTION_SYM: 136. case SCROLL_SYM: 137. case AMULET_SYM: 138. break; 139. #ifdef SPELLS 140. case SPBOOK_SYM: 141. if(!rn2(17)) otmp->cursed = 1; 142. break; 143. #endif 144. case ARMOR_SYM: 145. if(!rn2(8)) otmp->cursed = 1; 146. if(!rn2(10)) otmp->spe = rne(2); 147. else if(!rn2(9)) { 148. otmp->spe = -rne(2); 149. otmp->cursed = 1; 150. } 151. break; 152. case WAND_SYM: 153. #ifdef HARD 154. if(otmp->otyp == WAN_WISHING) otmp->spe = rnd(3); else 155. #else 156. if(otmp->otyp == WAN_WISHING) otmp->spe = 3; else 157. #endif 158. otmp->spe = rn1(5, 159. (objects[otmp->otyp].bits & NODIR) ? 11 : 4); 160. break; 161. case RING_SYM: 162. if(objects[otmp->otyp].bits & SPEC) { 163. if(!rn2(3)) { 164. otmp->cursed = 1; 165. otmp->spe = -rne(3); 166. } else otmp->spe = rne(3); 167. } else if(otmp->otyp == RIN_TELEPORTATION || 168. otmp->otyp == RIN_POLYMORPH || 169. otmp->otyp == RIN_AGGRAVATE_MONSTER || 170. otmp->otyp == RIN_HUNGER || !rn2(9)) 171. otmp->cursed = 1; 172. break; 173. default: 174. panic("impossible mkobj %d, sym '%c'.", otmp->otyp, let); 175. } 176. otmp->owt = weight(otmp); 177. return(otmp); 178. } 179. 180. letter(c) { 181. return(('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z')); 182. } 183. 184. weight(obj) 185. register struct obj *obj; 186. { 187. register int wt = objects[obj->otyp].oc_weight; 188. return(wt ? wt*obj->quan : (obj->quan + 1)/2); 189. } 190. 191. mkgold(num,x,y) 192. register long num; 193. { 194. register struct gold *gold; 195. register long amount = (num ? num : 1 + (rnd(dlevel+2) * rnd(30))); 196. 197. if(gold = g_at(x,y)) 198. gold->amount += amount; 199. else { 200. gold = newgold(); 201. gold->ngold = fgold; 202. gold->gx = x; 203. gold->gy = y; 204. gold->amount = amount; 205. fgold = gold; 206. /* do sth with display? */ 207. } 208. }
|