132689Sbostic /* 236704Sbostic * Copyright (c) 1988 The Regents of the University of California. 336704Sbostic * All rights reserved. 436704Sbostic * 536704Sbostic * This code is derived from software contributed to Berkeley by 636704Sbostic * Timothy C. Stoehr. 736704Sbostic * 8*42599Sbostic * %sccs.include.redist.c% 936704Sbostic */ 1036704Sbostic 1136704Sbostic #ifndef lint 12*42599Sbostic static char sccsid[] = "@(#)object.c 5.3 (Berkeley) 06/01/90"; 1336704Sbostic #endif /* not lint */ 1436704Sbostic 1536704Sbostic /* 1632689Sbostic * object.c 1732689Sbostic * 1832689Sbostic * This source herein may be modified and/or distributed by anybody who 1932689Sbostic * so desires, with the following restrictions: 2032689Sbostic * 1.) No portion of this notice shall be removed. 2132689Sbostic * 2.) Credit shall not be taken for the creation of this source. 2232689Sbostic * 3.) This code is not to be traded, sold, or used for personal 2332689Sbostic * gain or profit. 2432689Sbostic * 2532689Sbostic */ 2632689Sbostic 2732689Sbostic #include "rogue.h" 2832689Sbostic 2932689Sbostic object level_objects; 3032689Sbostic unsigned short dungeon[DROWS][DCOLS]; 3132689Sbostic short foods = 0; 3232689Sbostic object *free_list = (object *) 0; 3332689Sbostic char *fruit = (char *) 0; 3432689Sbostic 3532689Sbostic fighter rogue = { 3632689Sbostic INIT_AW, /* armor, weapon */ 3732689Sbostic INIT_RINGS, /* rings */ 3832689Sbostic INIT_HP, /* Hp current,max */ 3932689Sbostic INIT_STR, /* Str current,max */ 4032689Sbostic INIT_PACK, /* pack */ 4132689Sbostic INIT_GOLD, /* gold */ 4232689Sbostic INIT_EXP, /* exp level,points */ 4332689Sbostic 0, 0, /* row, col */ 4432689Sbostic INIT_CHAR, /* char */ 4532689Sbostic INIT_MOVES /* moves */ 4632689Sbostic }; 4732689Sbostic 4832689Sbostic struct id id_potions[POTIONS] = { 4932689Sbostic {100, "blue \0 ", "of increase strength ", 0}, 5032689Sbostic {250, "red \0 ", "of restore strength ", 0}, 5132689Sbostic {100, "green \0 ", "of healing ", 0}, 5232689Sbostic {200, "grey \0 ", "of extra healing ", 0}, 5332689Sbostic {10, "brown \0 ", "of poison ", 0}, 5432689Sbostic {300, "clear \0 ", "of raise level ", 0}, 5532689Sbostic {10, "pink \0 ", "of blindness ", 0}, 5632689Sbostic {25, "white \0 ", "of hallucination ", 0}, 5732689Sbostic {100, "purple \0 ", "of detect monster ", 0}, 5832689Sbostic {100, "black \0 ", "of detect things ", 0}, 5932689Sbostic {10, "yellow \0 ", "of confusion ", 0}, 6032689Sbostic {80, "plaid \0 ", "of levitation ", 0}, 6132689Sbostic {150, "burgundy \0 ", "of haste self ", 0}, 6232689Sbostic {145, "beige \0 ", "of see invisible ", 0} 6332689Sbostic }; 6432689Sbostic 6532689Sbostic struct id id_scrolls[SCROLS] = { 6632689Sbostic {505, " ", "of protect armor ", 0}, 6732689Sbostic {200, " ", "of hold monster ", 0}, 6832689Sbostic {235, " ", "of enchant weapon ", 0}, 6932689Sbostic {235, " ", "of enchant armor ", 0}, 7032689Sbostic {175, " ", "of identify ", 0}, 7132689Sbostic {190, " ", "of teleportation ", 0}, 7232689Sbostic {25, " ", "of sleep ", 0}, 7332689Sbostic {610, " ", "of scare monster ", 0}, 7432689Sbostic {210, " ", "of remove curse ", 0}, 7532689Sbostic {80, " ", "of create monster ",0}, 7632689Sbostic {25, " ", "of aggravate monster ",0}, 7732689Sbostic {180, " ", "of magic mapping ", 0}, 7832689Sbostic {90, " ", "of confuse monster ", 0} 7932689Sbostic }; 8032689Sbostic 8132689Sbostic struct id id_weapons[WEAPONS] = { 8232689Sbostic {150, "short bow ", "", 0}, 8332689Sbostic {8, "darts ", "", 0}, 8432689Sbostic {15, "arrows ", "", 0}, 8532689Sbostic {27, "daggers ", "", 0}, 8632689Sbostic {35, "shurikens ", "", 0}, 8732689Sbostic {360, "mace ", "", 0}, 8832689Sbostic {470, "long sword ", "", 0}, 8932689Sbostic {580, "two-handed sword ", "", 0} 9032689Sbostic }; 9132689Sbostic 9232689Sbostic struct id id_armors[ARMORS] = { 9332689Sbostic {300, "leather armor ", "", (UNIDENTIFIED)}, 9432689Sbostic {300, "ring mail ", "", (UNIDENTIFIED)}, 9532689Sbostic {400, "scale mail ", "", (UNIDENTIFIED)}, 9632689Sbostic {500, "chain mail ", "", (UNIDENTIFIED)}, 9732689Sbostic {600, "banded mail ", "", (UNIDENTIFIED)}, 9832689Sbostic {600, "splint mail ", "", (UNIDENTIFIED)}, 9932689Sbostic {700, "plate mail ", "", (UNIDENTIFIED)} 10032689Sbostic }; 10132689Sbostic 10232689Sbostic struct id id_wands[WANDS] = { 10332689Sbostic {25, " ", "of teleport away ",0}, 10432689Sbostic {50, " ", "of slow monster ", 0}, 10532689Sbostic {8, " ", "of invisibility ",0}, 10632689Sbostic {55, " ", "of polymorph ",0}, 10732689Sbostic {2, " ", "of haste monster ",0}, 10832689Sbostic {20, " ", "of magic missile ",0}, 10932689Sbostic {20, " ", "of cancellation ",0}, 11032689Sbostic {0, " ", "of do nothing ",0}, 11132689Sbostic {35, " ", "of drain life ",0}, 11232689Sbostic {20, " ", "of cold ",0}, 11332689Sbostic {20, " ", "of fire ",0} 11432689Sbostic }; 11532689Sbostic 11632689Sbostic struct id id_rings[RINGS] = { 11732689Sbostic {250, " ", "of stealth ",0}, 11832689Sbostic {100, " ", "of teleportation ", 0}, 11932689Sbostic {255, " ", "of regeneration ",0}, 12032689Sbostic {295, " ", "of slow digestion ",0}, 12132689Sbostic {200, " ", "of add strength ",0}, 12232689Sbostic {250, " ", "of sustain strength ",0}, 12332689Sbostic {250, " ", "of dexterity ",0}, 12432689Sbostic {25, " ", "of adornment ",0}, 12532689Sbostic {300, " ", "of see invisible ",0}, 12632689Sbostic {290, " ", "of maintain armor ",0}, 12732689Sbostic {270, " ", "of searching ",0}, 12832689Sbostic }; 12932689Sbostic 13032689Sbostic extern short cur_level, max_level; 13132689Sbostic extern short party_room; 13232689Sbostic extern char *error_file; 13332689Sbostic extern boolean is_wood[]; 13432689Sbostic 13532689Sbostic put_objects() 13632689Sbostic { 13732689Sbostic short i, n; 13832689Sbostic object *obj; 13932689Sbostic 14032689Sbostic if (cur_level < max_level) { 14132689Sbostic return; 14232689Sbostic } 14332689Sbostic n = coin_toss() ? get_rand(2, 4) : get_rand(3, 5); 14432689Sbostic while (rand_percent(33)) { 14532689Sbostic n++; 14632689Sbostic } 14732689Sbostic if (party_room != NO_ROOM) { 14832689Sbostic make_party(); 14932689Sbostic } 15032689Sbostic for (i = 0; i < n; i++) { 15132689Sbostic obj = gr_object(); 15232689Sbostic rand_place(obj); 15332689Sbostic } 15432689Sbostic put_gold(); 15532689Sbostic } 15632689Sbostic 15732689Sbostic put_gold() 15832689Sbostic { 15932689Sbostic short i, j; 16032689Sbostic short row,col; 16132689Sbostic boolean is_maze, is_room; 16232689Sbostic 16332689Sbostic for (i = 0; i < MAXROOMS; i++) { 16432689Sbostic is_maze = (rooms[i].is_room & R_MAZE) ? 1 : 0; 16532689Sbostic is_room = (rooms[i].is_room & R_ROOM) ? 1 : 0; 16632689Sbostic 16732689Sbostic if (!(is_room || is_maze)) { 16832689Sbostic continue; 16932689Sbostic } 17032689Sbostic if (is_maze || rand_percent(GOLD_PERCENT)) { 17132689Sbostic for (j = 0; j < 50; j++) { 17232689Sbostic row = get_rand(rooms[i].top_row+1, 17332689Sbostic rooms[i].bottom_row-1); 17432689Sbostic col = get_rand(rooms[i].left_col+1, 17532689Sbostic rooms[i].right_col-1); 17632689Sbostic if ((dungeon[row][col] == FLOOR) || 17732689Sbostic (dungeon[row][col] == TUNNEL)) { 17832689Sbostic plant_gold(row, col, is_maze); 17932689Sbostic break; 18032689Sbostic } 18132689Sbostic } 18232689Sbostic } 18332689Sbostic } 18432689Sbostic } 18532689Sbostic 18632689Sbostic plant_gold(row, col, is_maze) 18732689Sbostic short row, col; 18832689Sbostic boolean is_maze; 18932689Sbostic { 19032689Sbostic object *obj; 19132689Sbostic 19232689Sbostic obj = alloc_object(); 19332689Sbostic obj->row = row; obj->col = col; 19432689Sbostic obj->what_is = GOLD; 19532689Sbostic obj->quantity = get_rand((2 * cur_level), (16 * cur_level)); 19632689Sbostic if (is_maze) { 19732689Sbostic obj->quantity += obj->quantity / 2; 19832689Sbostic } 19932689Sbostic dungeon[row][col] |= OBJECT; 20032689Sbostic (void) add_to_pack(obj, &level_objects, 0); 20132689Sbostic } 20232689Sbostic 20332689Sbostic place_at(obj, row, col) 20432689Sbostic object *obj; 20532689Sbostic { 20632689Sbostic obj->row = row; 20732689Sbostic obj->col = col; 20832689Sbostic dungeon[row][col] |= OBJECT; 20932689Sbostic (void) add_to_pack(obj, &level_objects, 0); 21032689Sbostic } 21132689Sbostic 21232689Sbostic object * 21332689Sbostic object_at(pack, row, col) 21432689Sbostic register object *pack; 21532689Sbostic short row, col; 21632689Sbostic { 21732689Sbostic object *obj = (object *) 0; 21832689Sbostic 21932689Sbostic if (dungeon[row][col] & (MONSTER | OBJECT)) { 22032689Sbostic obj = pack->next_object; 22132689Sbostic 22232689Sbostic while (obj && ((obj->row != row) || (obj->col != col))) { 22332689Sbostic obj = obj->next_object; 22432689Sbostic } 22532689Sbostic if (!obj) { 22632689Sbostic message("object_at(): inconsistent", 1); 22732689Sbostic } 22832689Sbostic } 22932689Sbostic return(obj); 23032689Sbostic } 23132689Sbostic 23232689Sbostic object * 23332689Sbostic get_letter_object(ch) 23432689Sbostic { 23532689Sbostic object *obj; 23632689Sbostic 23732689Sbostic obj = rogue.pack.next_object; 23832689Sbostic 23932689Sbostic while (obj && (obj->ichar != ch)) { 24032689Sbostic obj = obj->next_object; 24132689Sbostic } 24232689Sbostic return(obj); 24332689Sbostic } 24432689Sbostic 24532689Sbostic free_stuff(objlist) 24632689Sbostic object *objlist; 24732689Sbostic { 24832689Sbostic object *obj; 24932689Sbostic 25032689Sbostic while (objlist->next_object) { 25132689Sbostic obj = objlist->next_object; 25232689Sbostic objlist->next_object = 25332689Sbostic objlist->next_object->next_object; 25432689Sbostic free_object(obj); 25532689Sbostic } 25632689Sbostic } 25732689Sbostic 25832689Sbostic char * 25932689Sbostic name_of(obj) 26032689Sbostic object *obj; 26132689Sbostic { 26232689Sbostic char *retstring; 26332689Sbostic 26432689Sbostic switch(obj->what_is) { 26532689Sbostic case SCROL: 26632689Sbostic retstring = obj->quantity > 1 ? "scrolls " : "scroll "; 26732689Sbostic break; 26832689Sbostic case POTION: 26932689Sbostic retstring = obj->quantity > 1 ? "potions " : "potion "; 27032689Sbostic break; 27132689Sbostic case FOOD: 27232689Sbostic if (obj->which_kind == RATION) { 27332689Sbostic retstring = "food "; 27432689Sbostic } else { 27532689Sbostic retstring = fruit; 27632689Sbostic } 27732689Sbostic break; 27832689Sbostic case WAND: 27932689Sbostic retstring = is_wood[obj->which_kind] ? "staff " : "wand "; 28032689Sbostic break; 28132689Sbostic case WEAPON: 28232689Sbostic switch(obj->which_kind) { 28332689Sbostic case DART: 28432689Sbostic retstring=obj->quantity > 1 ? "darts " : "dart "; 28532689Sbostic break; 28632689Sbostic case ARROW: 28732689Sbostic retstring=obj->quantity > 1 ? "arrows " : "arrow "; 28832689Sbostic break; 28932689Sbostic case DAGGER: 29032689Sbostic retstring=obj->quantity > 1 ? "daggers " : "dagger "; 29132689Sbostic break; 29232689Sbostic case SHURIKEN: 29332689Sbostic retstring=obj->quantity > 1?"shurikens ":"shuriken "; 29432689Sbostic break; 29532689Sbostic default: 29632689Sbostic retstring = id_weapons[obj->which_kind].title; 29732689Sbostic } 29832689Sbostic break; 29932689Sbostic case ARMOR: 30032689Sbostic retstring = "armor "; 30132689Sbostic break; 30232689Sbostic case RING: 30332689Sbostic retstring = "ring "; 30432689Sbostic break; 30532689Sbostic case AMULET: 30632689Sbostic retstring = "amulet "; 30732689Sbostic break; 30832689Sbostic default: 30932689Sbostic retstring = "unknown "; 31032689Sbostic break; 31132689Sbostic } 31232689Sbostic return(retstring); 31332689Sbostic } 31432689Sbostic 31532689Sbostic object * 31632689Sbostic gr_object() 31732689Sbostic { 31832689Sbostic object *obj; 31932689Sbostic 32032689Sbostic obj = alloc_object(); 32132689Sbostic 32232689Sbostic if (foods < (cur_level / 3)) { 32332689Sbostic obj->what_is = FOOD; 32432689Sbostic foods++; 32532689Sbostic } else { 32632689Sbostic obj->what_is = gr_what_is(); 32732689Sbostic } 32832689Sbostic switch(obj->what_is) { 32932689Sbostic case SCROL: 33032689Sbostic gr_scroll(obj); 33132689Sbostic break; 33232689Sbostic case POTION: 33332689Sbostic gr_potion(obj); 33432689Sbostic break; 33532689Sbostic case WEAPON: 33632689Sbostic gr_weapon(obj, 1); 33732689Sbostic break; 33832689Sbostic case ARMOR: 33932689Sbostic gr_armor(obj); 34032689Sbostic break; 34132689Sbostic case WAND: 34232689Sbostic gr_wand(obj); 34332689Sbostic break; 34432689Sbostic case FOOD: 34532689Sbostic get_food(obj, 0); 34632689Sbostic break; 34732689Sbostic case RING: 34832689Sbostic gr_ring(obj, 1); 34932689Sbostic break; 35032689Sbostic } 35132689Sbostic return(obj); 35232689Sbostic } 35332689Sbostic 35432689Sbostic unsigned short 35532689Sbostic gr_what_is() 35632689Sbostic { 35732689Sbostic short percent; 35832689Sbostic unsigned short what_is; 35932689Sbostic 36032689Sbostic percent = get_rand(1, 91); 36132689Sbostic 36232689Sbostic if (percent <= 30) { 36332689Sbostic what_is = SCROL; 36432689Sbostic } else if (percent <= 60) { 36532689Sbostic what_is = POTION; 36632689Sbostic } else if (percent <= 64) { 36732689Sbostic what_is = WAND; 36832689Sbostic } else if (percent <= 74) { 36932689Sbostic what_is = WEAPON; 37032689Sbostic } else if (percent <= 83) { 37132689Sbostic what_is = ARMOR; 37232689Sbostic } else if (percent <= 88) { 37332689Sbostic what_is = FOOD; 37432689Sbostic } else { 37532689Sbostic what_is = RING; 37632689Sbostic } 37732689Sbostic return(what_is); 37832689Sbostic } 37932689Sbostic 38032689Sbostic gr_scroll(obj) 38132689Sbostic object *obj; 38232689Sbostic { 38332689Sbostic short percent; 38432689Sbostic 38532689Sbostic percent = get_rand(0, 91); 38632689Sbostic 38732689Sbostic obj->what_is = SCROL; 38832689Sbostic 38932689Sbostic if (percent <= 5) { 39032689Sbostic obj->which_kind = PROTECT_ARMOR; 39132689Sbostic } else if (percent <= 10) { 39232689Sbostic obj->which_kind = HOLD_MONSTER; 39332689Sbostic } else if (percent <= 20) { 39432689Sbostic obj->which_kind = CREATE_MONSTER; 39532689Sbostic } else if (percent <= 35) { 39632689Sbostic obj->which_kind = IDENTIFY; 39732689Sbostic } else if (percent <= 43) { 39832689Sbostic obj->which_kind = TELEPORT; 39932689Sbostic } else if (percent <= 50) { 40032689Sbostic obj->which_kind = SLEEP; 40132689Sbostic } else if (percent <= 55) { 40232689Sbostic obj->which_kind = SCARE_MONSTER; 40332689Sbostic } else if (percent <= 64) { 40432689Sbostic obj->which_kind = REMOVE_CURSE; 40532689Sbostic } else if (percent <= 69) { 40632689Sbostic obj->which_kind = ENCH_ARMOR; 40732689Sbostic } else if (percent <= 74) { 40832689Sbostic obj->which_kind = ENCH_WEAPON; 40932689Sbostic } else if (percent <= 80) { 41032689Sbostic obj->which_kind = AGGRAVATE_MONSTER; 41132689Sbostic } else if (percent <= 86) { 41232689Sbostic obj->which_kind = CON_MON; 41332689Sbostic } else { 41432689Sbostic obj->which_kind = MAGIC_MAPPING; 41532689Sbostic } 41632689Sbostic } 41732689Sbostic 41832689Sbostic gr_potion(obj) 41932689Sbostic object *obj; 42032689Sbostic { 42132689Sbostic short percent; 42232689Sbostic 42332689Sbostic percent = get_rand(1, 118); 42432689Sbostic 42532689Sbostic obj->what_is = POTION; 42632689Sbostic 42732689Sbostic if (percent <= 5) { 42832689Sbostic obj->which_kind = RAISE_LEVEL; 42932689Sbostic } else if (percent <= 15) { 43032689Sbostic obj->which_kind = DETECT_OBJECTS; 43132689Sbostic } else if (percent <= 25) { 43232689Sbostic obj->which_kind = DETECT_MONSTER; 43332689Sbostic } else if (percent <= 35) { 43432689Sbostic obj->which_kind = INCREASE_STRENGTH; 43532689Sbostic } else if (percent <= 45) { 43632689Sbostic obj->which_kind = RESTORE_STRENGTH; 43732689Sbostic } else if (percent <= 55) { 43832689Sbostic obj->which_kind = HEALING; 43932689Sbostic } else if (percent <= 65) { 44032689Sbostic obj->which_kind = EXTRA_HEALING; 44132689Sbostic } else if (percent <= 75) { 44232689Sbostic obj->which_kind = BLINDNESS; 44332689Sbostic } else if (percent <= 85) { 44432689Sbostic obj->which_kind = HALLUCINATION; 44532689Sbostic } else if (percent <= 95) { 44632689Sbostic obj->which_kind = CONFUSION; 44732689Sbostic } else if (percent <= 105) { 44832689Sbostic obj->which_kind = POISON; 44932689Sbostic } else if (percent <= 110) { 45032689Sbostic obj->which_kind = LEVITATION; 45132689Sbostic } else if (percent <= 114) { 45232689Sbostic obj->which_kind = HASTE_SELF; 45332689Sbostic } else { 45432689Sbostic obj->which_kind = SEE_INVISIBLE; 45532689Sbostic } 45632689Sbostic } 45732689Sbostic 45832689Sbostic gr_weapon(obj, assign_wk) 45932689Sbostic object *obj; 46032689Sbostic int assign_wk; 46132689Sbostic { 46232689Sbostic short percent; 46332689Sbostic short i; 46432689Sbostic short blessing, increment; 46532689Sbostic 46632689Sbostic obj->what_is = WEAPON; 46732689Sbostic if (assign_wk) { 46832689Sbostic obj->which_kind = get_rand(0, (WEAPONS - 1)); 46932689Sbostic } 47032689Sbostic if ((obj->which_kind == ARROW) || (obj->which_kind == DAGGER) || 47132689Sbostic (obj->which_kind == SHURIKEN) | (obj->which_kind == DART)) { 47232689Sbostic obj->quantity = get_rand(3, 15); 47332689Sbostic obj->quiver = get_rand(0, 126); 47432689Sbostic } else { 47532689Sbostic obj->quantity = 1; 47632689Sbostic } 47732689Sbostic obj->hit_enchant = obj->d_enchant = 0; 47832689Sbostic 47932689Sbostic percent = get_rand(1, 96); 48032689Sbostic blessing = get_rand(1, 3); 48132689Sbostic 48232689Sbostic if (percent <= 16) { 48332689Sbostic increment = 1; 48432689Sbostic } else if (percent <= 32) { 48532689Sbostic increment = -1; 48632689Sbostic obj->is_cursed = 1; 48732689Sbostic } 48832689Sbostic if (percent <= 32) { 48932689Sbostic for (i = 0; i < blessing; i++) { 49032689Sbostic if (coin_toss()) { 49132689Sbostic obj->hit_enchant += increment; 49232689Sbostic } else { 49332689Sbostic obj->d_enchant += increment; 49432689Sbostic } 49532689Sbostic } 49632689Sbostic } 49732689Sbostic switch(obj->which_kind) { 49832689Sbostic case BOW: 49932689Sbostic case DART: 50032689Sbostic obj->damage = "1d1"; 50132689Sbostic break; 50232689Sbostic case ARROW: 50332689Sbostic obj->damage = "1d2"; 50432689Sbostic break; 50532689Sbostic case DAGGER: 50632689Sbostic obj->damage = "1d3"; 50732689Sbostic break; 50832689Sbostic case SHURIKEN: 50932689Sbostic obj->damage = "1d4"; 51032689Sbostic break; 51132689Sbostic case MACE: 51232689Sbostic obj->damage = "2d3"; 51332689Sbostic break; 51432689Sbostic case LONG_SWORD: 51532689Sbostic obj->damage = "3d4"; 51632689Sbostic break; 51732689Sbostic case TWO_HANDED_SWORD: 51832689Sbostic obj->damage = "4d5"; 51932689Sbostic break; 52032689Sbostic } 52132689Sbostic } 52232689Sbostic 52332689Sbostic gr_armor(obj) 52432689Sbostic object *obj; 52532689Sbostic { 52632689Sbostic short percent; 52732689Sbostic short blessing; 52832689Sbostic 52932689Sbostic obj->what_is = ARMOR; 53032689Sbostic obj->which_kind = get_rand(0, (ARMORS - 1)); 53132689Sbostic obj->class = obj->which_kind + 2; 53232689Sbostic if ((obj->which_kind == PLATE) || (obj->which_kind == SPLINT)) { 53332689Sbostic obj->class--; 53432689Sbostic } 53532689Sbostic obj->is_protected = 0; 53632689Sbostic obj->d_enchant = 0; 53732689Sbostic 53832689Sbostic percent = get_rand(1, 100); 53932689Sbostic blessing = get_rand(1, 3); 54032689Sbostic 54132689Sbostic if (percent <= 16) { 54232689Sbostic obj->is_cursed = 1; 54332689Sbostic obj->d_enchant -= blessing; 54432689Sbostic } else if (percent <= 33) { 54532689Sbostic obj->d_enchant += blessing; 54632689Sbostic } 54732689Sbostic } 54832689Sbostic 54932689Sbostic gr_wand(obj) 55032689Sbostic object *obj; 55132689Sbostic { 55232689Sbostic obj->what_is = WAND; 55332689Sbostic obj->which_kind = get_rand(0, (WANDS - 1)); 55432689Sbostic obj->class = get_rand(3, 7); 55532689Sbostic } 55632689Sbostic 55732689Sbostic get_food(obj, force_ration) 55832689Sbostic object *obj; 55932689Sbostic boolean force_ration; 56032689Sbostic { 56132689Sbostic obj->what_is = FOOD; 56232689Sbostic 56332689Sbostic if (force_ration || rand_percent(80)) { 56432689Sbostic obj->which_kind = RATION; 56532689Sbostic } else { 56632689Sbostic obj->which_kind = FRUIT; 56732689Sbostic } 56832689Sbostic } 56932689Sbostic 57032689Sbostic put_stairs() 57132689Sbostic { 57232689Sbostic short row, col; 57332689Sbostic 57432689Sbostic gr_row_col(&row, &col, (FLOOR | TUNNEL)); 57532689Sbostic dungeon[row][col] |= STAIRS; 57632689Sbostic } 57732689Sbostic 57832689Sbostic get_armor_class(obj) 57932689Sbostic object *obj; 58032689Sbostic { 58132689Sbostic if (obj) { 58232689Sbostic return(obj->class + obj->d_enchant); 58332689Sbostic } 58432689Sbostic return(0); 58532689Sbostic } 58632689Sbostic 58732689Sbostic object * 58832689Sbostic alloc_object() 58932689Sbostic { 59032689Sbostic object *obj; 59132689Sbostic 59232689Sbostic if (free_list) { 59332689Sbostic obj = free_list; 59432689Sbostic free_list = free_list->next_object; 59532689Sbostic } else if (!(obj = (object *) md_malloc(sizeof(object)))) { 59632689Sbostic message("cannot allocate object, saving game", 0); 59732689Sbostic save_into_file(error_file); 59832689Sbostic } 59932689Sbostic obj->quantity = 1; 60032689Sbostic obj->ichar = 'L'; 60132689Sbostic obj->picked_up = obj->is_cursed = 0; 60232689Sbostic obj->in_use_flags = NOT_USED; 60332689Sbostic obj->identified = UNIDENTIFIED; 60432689Sbostic obj->damage = "1d1"; 60532689Sbostic return(obj); 60632689Sbostic } 60732689Sbostic 60832689Sbostic free_object(obj) 60932689Sbostic object *obj; 61032689Sbostic { 61132689Sbostic obj->next_object = free_list; 61232689Sbostic free_list = obj; 61332689Sbostic } 61432689Sbostic 61532689Sbostic make_party() 61632689Sbostic { 61732689Sbostic short n; 61832689Sbostic 61932689Sbostic party_room = gr_room(); 62032689Sbostic 62132689Sbostic n = rand_percent(99) ? party_objects(party_room) : 11; 62232689Sbostic if (rand_percent(99)) { 62332689Sbostic party_monsters(party_room, n); 62432689Sbostic } 62532689Sbostic } 62632689Sbostic 62732689Sbostic show_objects() 62832689Sbostic { 62932689Sbostic object *obj; 63032689Sbostic short mc, rc, row, col; 63132689Sbostic object *monster; 63232689Sbostic 63332689Sbostic obj = level_objects.next_object; 63432689Sbostic 63532689Sbostic while (obj) { 63632689Sbostic row = obj->row; 63732689Sbostic col = obj->col; 63832689Sbostic 63932689Sbostic rc = get_mask_char(obj->what_is); 64032689Sbostic 64132689Sbostic if (dungeon[row][col] & MONSTER) { 64232689Sbostic if (monster = object_at(&level_monsters, row, col)) { 64332689Sbostic monster->trail_char = rc; 64432689Sbostic } 64532689Sbostic } 64632689Sbostic mc = mvinch(row, col); 64732689Sbostic if (((mc < 'A') || (mc > 'Z')) && 64832689Sbostic ((row != rogue.row) || (col != rogue.col))) { 64932689Sbostic mvaddch(row, col, rc); 65032689Sbostic } 65132689Sbostic obj = obj->next_object; 65232689Sbostic } 65332689Sbostic 65432689Sbostic monster = level_monsters.next_object; 65532689Sbostic 65632689Sbostic while (monster) { 65732689Sbostic if (monster->m_flags & IMITATES) { 65832689Sbostic mvaddch(monster->row, monster->col, (int) monster->disguise); 65932689Sbostic } 66032689Sbostic monster = monster->next_monster; 66132689Sbostic } 66232689Sbostic } 66332689Sbostic 66432689Sbostic put_amulet() 66532689Sbostic { 66632689Sbostic object *obj; 66732689Sbostic 66832689Sbostic obj = alloc_object(); 66932689Sbostic obj->what_is = AMULET; 67032689Sbostic rand_place(obj); 67132689Sbostic } 67232689Sbostic 67332689Sbostic rand_place(obj) 67432689Sbostic object *obj; 67532689Sbostic { 67632689Sbostic short row, col; 67732689Sbostic 67832689Sbostic gr_row_col(&row, &col, (FLOOR | TUNNEL)); 67932689Sbostic place_at(obj, row, col); 68032689Sbostic } 68132689Sbostic 68232689Sbostic c_object_for_wizard() 68332689Sbostic { 68432689Sbostic short ch, max, wk; 68532689Sbostic object *obj; 68632689Sbostic char buf[80]; 68732689Sbostic 68832689Sbostic if (pack_count((object *) 0) >= MAX_PACK_COUNT) { 68932689Sbostic message("pack full", 0); 69032689Sbostic return; 69132689Sbostic } 69232689Sbostic message("type of object?", 0); 69332689Sbostic 69432689Sbostic while (r_index("!?:)]=/,\033", (ch = rgetchar()), 0) == -1) { 69532689Sbostic sound_bell(); 69632689Sbostic } 69732689Sbostic check_message(); 69832689Sbostic 69932689Sbostic if (ch == '\033') { 70032689Sbostic return; 70132689Sbostic } 70232689Sbostic obj = alloc_object(); 70332689Sbostic 70432689Sbostic switch(ch) { 70532689Sbostic case '!': 70632689Sbostic obj->what_is = POTION; 70732689Sbostic max = POTIONS - 1; 70832689Sbostic break; 70932689Sbostic case '?': 71032689Sbostic obj->what_is = SCROL; 71132689Sbostic max = SCROLS - 1; 71232689Sbostic break; 71332689Sbostic case ',': 71432689Sbostic obj->what_is = AMULET; 71532689Sbostic break; 71632689Sbostic case ':': 71732689Sbostic get_food(obj, 0); 71832689Sbostic break; 71932689Sbostic case ')': 72032689Sbostic gr_weapon(obj, 0); 72132689Sbostic max = WEAPONS - 1; 72232689Sbostic break; 72332689Sbostic case ']': 72432689Sbostic gr_armor(obj); 72532689Sbostic max = ARMORS - 1; 72632689Sbostic break; 72732689Sbostic case '/': 72832689Sbostic gr_wand(obj); 72932689Sbostic max = WANDS - 1; 73032689Sbostic break; 73132689Sbostic case '=': 73232689Sbostic max = RINGS - 1; 73332689Sbostic obj->what_is = RING; 73432689Sbostic break; 73532689Sbostic } 73632689Sbostic if ((ch != ',') && (ch != ':')) { 73732689Sbostic GIL: 73832689Sbostic if (get_input_line("which kind?", "", buf, "", 0, 1)) { 73932689Sbostic wk = get_number(buf); 74032689Sbostic if ((wk >= 0) && (wk <= max)) { 74132689Sbostic obj->which_kind = (unsigned short) wk; 74232689Sbostic if (obj->what_is == RING) { 74332689Sbostic gr_ring(obj, 0); 74432689Sbostic } 74532689Sbostic } else { 74632689Sbostic sound_bell(); 74732689Sbostic goto GIL; 74832689Sbostic } 74932689Sbostic } else { 75032689Sbostic free_object(obj); 75132689Sbostic return; 75232689Sbostic } 75332689Sbostic } 75432689Sbostic get_desc(obj, buf); 75532689Sbostic message(buf, 0); 75632689Sbostic (void) add_to_pack(obj, &rogue.pack, 1); 75732689Sbostic } 758