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