Source:SLASH'EM 0.0.7E7F2/gypsy.c

Below is the full text to gypsy.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/gypsy.c#line123 ]], for example.

The latest source code for vanilla NetHack is at Source code.

1.   /*** gypsy.c ***/ 2.    3.    #include "hack.h"  4.    #include "egyp.h"  5.    #include "qtext.h"  6. 7.    8.    /* To do: 9.    *	fortune_lev 10.   *	Fourtunes for suited cards 11.   *	On-line help 12.   */  13.    14.    15.   /*** Money-related functions ***/ 16.   17.   static void 18.  gypsy_charge (mtmp, amount) 19.  	struct monst *mtmp; 20.  	long amount; 21.  {  22.   #ifdef GOLDOBJ 23.  	struct obj *gypgold; 24.  #endif 25.   26.   	/* Take from credit first */ 27.  	if (amount > EGYP(mtmp)->credit) { 28.  		/* Do in several steps, for broken compilers */ 29.  		amount -= EGYP(mtmp)->credit; 30.  		EGYP(mtmp)->credit = 0; 31.  #ifdef GOLDOBJ 32.  		money2mon(mtmp, amount); 33.  #else 34.  		u.ugold -= amount; 35.  #endif 36.  		flags.botl = 1; 37.  	} else 38.  		EGYP(mtmp)->credit -= amount; 39.   40.   	/* The gypsy never carries cash; it might get stolen! */ 41.   #ifdef GOLDOBJ 42.  	gypgold = findgold(mtmp->minvent); 43.  	if (gypgold) 44.  		m_useup(mtmp, gypgold); 45.  #endif 46.  	return; 47.  }  48.    49.   static boolean 50.  gypsy_offer (mtmp, cost, txt) 51.  	struct monst *mtmp; 52.  	long cost; 53.  	char *txt; 54.  {  55.   #ifdef GOLDOBJ 56.  	long umoney; 57.  	umoney = money_cnt(invent); 58.  #endif 59.  	verbalize("For %ld credit I will %s!", cost, txt); 60.  	if (EGYP(mtmp)->credit >= cost) { 61.  		if (yn("Accept this offer?") == 'y') { 62.  			EGYP(mtmp)->credit -= cost; 63.  			return (TRUE); 64.  		}  65.   #ifndef GOLDOBJ 66.  	} else if (EGYP(mtmp)->credit + u.ugold >= cost) 67.  		verbalize("What a pity that I can't accept gold!"); 68.  #else 69.  	} else if (EGYP(mtmp)->credit + umoney >= cost) 70.  		verbalize("What a pity that I can't accept money!"); 71.  #endif 72.  		/* Maybe you could try gambling some of it for credit... */ 73.   	else 74.  		verbalize("What a pity that you don't have enough!"); 75.  	return (FALSE); 76.  }  77.    78.   static long 79.  gypsy_bet (mtmp, minimum) 80.  	struct monst *mtmp; 81.  	long minimum; 82.  {  83.   	char prompt[BUFSZ], buf[BUFSZ]; 84.  	long bet = 0L; 85.  #ifdef GOLDOBJ 86.  	long umoney; 87.  	umoney = money_cnt(invent); 88.  #endif 89.   90.   	if (minimum > EGYP(mtmp)->credit +  91.   #ifndef GOLDOBJ  92.   													u.ugold) { 93.  #else 94.   													umoney) {		  95.   #endif  96.   		You("don't have enough money for the minimum bet.");  97.   		return (0L);  98.   	}  99.    100.  	/* Prompt for an amount */  101.  	Sprintf(prompt, "Bet how much (%ld to %ld)?", minimum, 102. 			EGYP(mtmp)->credit + 103. #ifndef GOLDOBJ 104. 													u.ugold);  105.  #else  106.  													umoney); 107. #endif 108. 	getlin(prompt, buf); 109. 	(void) sscanf(buf, "%ld", &bet); 110.  111.  	/* Validate the amount */ 112. 	if (bet == 0L) { 113. 		pline("Never mind."); 114. 		return (0L); 115. 	}  116.  	if (bet < minimum) { 117. 		You("must bet at least %ld.", minimum); 118. 		return (0L); 119. 	}  120.  	if (bet > EGYP(mtmp)->credit +  121.  #ifndef GOLDOBJ  122.  								u.ugold) { 123. #else 124. 								umoney) {												  125.  #endif  126.  		You("don't have that much money to bet!");  127.  		return (0L);  128.  	}  129.  	return (bet);  130.  }  131.   132.   133.  /*** Card-related functions ***/  134.   135.  static const char *suits[CARD_SUITS] =  136.  { "swords", "wands",     "shields",  "rings" };          /* Special */  137.  /* swords    wands/rods  roses/cups  pentacles/disks/coins  Tarot */  138.  /* spade     bastoni     coppe       denari                 Italian */  139.  /* swords    batons      cups        coins                  (translated) */  140.  /* spades    clubs       hearts      diamonds               French */  141.   142.   143.  static const char *ranks[CARD_RANKS] =  144.  { "ace", "2", "3", "4", "5", "6", "7", "8", "9", "10",  145.     /*none*/       "jack",       "queen", "king" }; /* French */  146.  /* page/princess  knight/prince  queen    king        Tarot */ 147.  148.   149.  static const char *trumps[CARD_TRUMPS] = 150. {	"the Fool",               /* This is NOT a Joker */ 151. 	"the Magician",           /* same as the Magus */ 152. 	"the High Priestess",     /* sometimes placed after the Emperor */ 153. #if 0 154. 	"the Empress",            /* not included here */ 155. 	"the Emperor",            /* not included here */ 156. #endif 157. 	"the Oracle",             /* same as the Hierophant */ 158. 	"the Lovers", 159. 	"the Chariot", 160. 	"Strength",               /* sometimes Adjustment */ 161. 	"the Hermit", 162. 	"the Wheel of Fortune",   /* sometimes Fortune */ 163. 	"Justice",                /* sometimes Lust */ 164. 	"Punishment",             /* replaces the Hanged Man */ 165. 	"the Devil",              /* normally #15 */ 166. 	"Sorcery",                /* replaces Art or Temperance */ 167. 	"Death",                  /* swapped with the Devil so it remains #13 */ 168. 	"the Tower",              /* really! */ 169.  	"the Star", 170. 	"the Moon", 171. 	"the Sun", 172. 	"Judgement",              /* sometimes Aeon */ 173. 	"Infinity"                /* replaces the World or the Universe */ 174. };  175.   176.   177.  static void 178. card_shuffle (mtmp) 179. 	struct monst *mtmp; 180. {  181.  	xchar *cards = &EGYP(mtmp)->cards[0]; 182. 	int i, j, k;  183. 184.  185.  	pline("%s shuffles the cards.", Monnam(mtmp)); 186. 	for (i = 0; i < CARD_TOTAL; i++) 187. 		/* Initialize the value */ 188. 		cards[i] = i;  189. for (i = 0; i < CARD_TOTAL; i++) { 190. 		/* Swap this value with another randomly chosen one */ 191. 		j = rn2(CARD_TOTAL); 192. 		k = cards[j]; 193. 		cards[j] = cards[i]; 194. 		cards[i] = k;  195. } 196.  	EGYP(mtmp)->top = CARD_TOTAL; 197. }  198.   199.  static xchar 200. card_draw (mtmp) 201. 	struct monst *mtmp; 202. {  203.  	if (EGYP(mtmp)->top <= 0) 204. 		/* The deck is empty */ 205. 		return (-1); 206. 	return (EGYP(mtmp)->cards[--EGYP(mtmp)->top]); 207. }  208.   209.  static void 210. card_name (num, buf) 211. 	xchar num; 212. 	char *buf; 213. {  214.  	int r, s;  215. 216.  217.  	if (!buf) return; 218. 	if (Hallucination) num = rn2(CARD_TOTAL); 219. 	if (num < 0 || num >= CARD_TOTAL) { 220. 		/* Invalid card */ 221. 		impossible("no such card %d", num); 222. 		Strcpy(buf, "a card"); 223. 	} else if (card_istrump(num)) { 224. 		/* Handle trump cards */ 225. 		r = card_trump(num); 226. 		if (!r) 227. 			Sprintf(buf, "the zero of trumps (%s)", trumps[r]); 228. 		else 229. 			Sprintf(buf, "the %d of trumps (%s)", r, trumps[r]); 230. 	} else { 231. 		/* Handle suited cards */ 232. 		r = card_rank(num); 233. 		s = card_suit(num); 234. 		Sprintf(buf, "the %s of %s", ranks[r], suits[s]); 235. 	}  236.  	return; 237. }  238.   239.   240.  /*** Fortunes ***/ 241.  242.  #define FORTUNE_COST	50			/* Cost to play */ 243.  244.  static short birthstones[12] = 245. {  246.  	/* Jan */  GARNET,      /* Feb */  AMETHYST, 247. 	/* Mar */  AQUAMARINE,  /* Apr */  DIAMOND, 248. 	/* May */  EMERALD,     /* Jun */  OPAL, 249. 	/* Jul */  RUBY,        /* Aug */  CHRYSOBERYL, 250. 	/* Sep */  SAPPHIRE,    /* Oct */  BLACK_OPAL, 251. 	/* Nov */  TOPAZ,       /* Dec */  TURQUOISE 252. };  253.   254.   255.  static void 256. fortune_lev (mtmp, name, txt) 257. 	struct monst *mtmp; 258. 	char *name, *txt; 259. {  260.  	/*** FIXME -- still very buggy ***/ 261. /*	d_level *lev;*/ 262. 	schar dep; 263.  264.   265.  	dep = lev_by_name(name); 266. 	if (!dep) { 267. 		/* Perhaps the level doesn't exist? */ 268.  		verbalize("The vision is hazy."); 269. 		return; 270. 	}  271.   272.  	if (dep == depth(&u.uz)) 273. 		verbalize("I see %s here.", txt); 274. 	else { 275. 		verbalize("I see %s on level %d.", txt, (int)dep); 276. /*		if (gypsy_offer(mtmp, 5000L, "teleport you there")) 277. 			;*/  278.  	}  279.  	return; 280. }  281.   282.  static void 283. fortune (mtmp) 284. 	struct monst *mtmp; 285. {  286.  	xchar card; 287. 	char buf[BUFSZ]; 288. 	short otyp; 289. 	struct obj *otmp; 290.  291.   292.  	/* Shuffle the deck, if neccessary, and draw a card */ 293. 	gypsy_charge(mtmp, FORTUNE_COST); 294. 	if (EGYP(mtmp)->top <= 0) 295. 		card_shuffle(mtmp); 296. 	card = card_draw(mtmp); 297. #ifdef WIZARD 298. 	if (wizard) { 299. 		long t = -1; 300.  301.  		getlin("Which trump?", buf); 302. 		(void) sscanf(buf, "%ld", &t); 303. 		if (t >= 0) card = t + CARD_SUITED; 304. 	}  305.  #endif 306. 	card_name(card, buf); 307. 	verbalize("You have drawn %s.", buf); 308.  309.  	if (card_istrump(card)) 310. 		switch (card_trump(card)) { 311. 		case 0:	/* the Fool */ 312. 			adjattrib(A_WIS, -1, 0); 313. 			change_luck(-3); 314. 			break; 315. 		case 1:	/* the Magician */ 316. 			if (u.uevent.udemigod) 317. 				resurrect; 318. 			else 319. 				fortune_lev(mtmp, "fakewiz1",  320.  					"an entrance to the Wizard's tower"); 321. 				/*fortune_lev(mtmp, &portal_level);*/ 322. 			break; 323. 		case 2: /* the High Priestess */ 324. 			if (u.uhave.amulet) 325. 				verbalize("I see a high altar in the heavens."); 326. 				/* Can only get there by ascending... */ 327.  			else 328. 				verbalize("I see a high altar on level %d.",  329.  						depth(&sanctum_level)); 330. 				/* Can only get there by invocation... */ 331.  			break; 332. 		case 3: /* the Oracle */ 333. 			fortune_lev(mtmp, "oracle", "the Oracle"); 334. 			/*fortune_lev(mtmp, &oracle_level);*/ 335. 			break; 336. 		case 4: /* the Lovers */ 337. 			makemon(&mons[flags.female ? PM_INCUBUS : PM_SUCCUBUS],  338.  				u.ux, u.uy, 0); 339. 			break; 340. 		case 5: /* the Chariot */ 341. 			if (gypsy_offer(mtmp, 5000L, 342. 					"teleport you to a level of your choosing")) { 343. 				incr_itimeout(&HTeleport_control, 1); 344. 				level_tele; 345. 			}  346.  			break; 347. 		case 6: /* Strength */ 348. 			adjattrib(A_STR, 1, 0); 349. 			incr_itimeout(&HHalf_physical_damage, rn1(500, 500)); 350. 			break; 351. 		case 7: /* the Hermit */ 352. 			You_feel("like hiding!"); 353. 			incr_itimeout(&HTeleportation, rn1(300, 300)); 354. 			incr_itimeout(&HInvis, rn1(500, 500)); 355. 			newsym(u.ux, u.uy); 356. 			break; 357. 		case 8: /* the Wheel of Fortune */ 358. 			if (Hallucination) 359. 				pline("Where is Vanna?"); 360. 			else 361. 				You_feel("lucky!"); 362. 			if (u.uluck < 0) 363. 				u.uluck = 0; 364. 			else 365. 				change_luck(3); 366. 			break; 367. 		case 9: /* Justice */ 368. 			makemon(&mons[PM_ERINYS], u.ux, u.uy, 0); 369. 			break; 370. 		case 10: /* Punishment */ 371. 			if (!Punished) 372. 				punish((struct obj *)0); 373. 			else 374. 				rndcurse; 375. 			break; 376. 		case 11: /* the Devil */ 377. 			summon_minion(A_NONE, TRUE); 378. 			break; 379. 		case 12: /* Sorcery */ 380. 			adjattrib(urole.spelstat, 1, 0); 381. 			incr_itimeout(&HHalf_spell_damage, rn1(500, 500)); 382. 			break; 383. 		case 13: /* Death */ 384. 			if (nonliving(youmonst.data) || is_demon(youmonst.data)  385.  					|| Antimagic) 386. 				shieldeff(u.ux, u.uy); 387. 			else if(Hallucination) 388. 				You("have an out of body experience."); 389. 			else  { 390. 				killer_format = KILLED_BY; 391. 				killer = "the card of Death"; 392. 				done(DIED); 393. 			}  394.  			break; 395. 		case 14: /* the Tower */ 396. 			fortune_lev(mtmp, "vlad\'s tower", "Vlad the Impaler"); 397. 			/* fortune_lev(mtmp, &vlad_level); */ 398. 			break; 399. 		case 15: /* the Star */ 400. 			otyp = birthstones[getmonth]; 401. 			makeknown(otyp); 402. 			if ((otmp = mksobj(otyp, TRUE, FALSE)) != (struct obj *)0) { 403. 				pline("%s reaches behind your %s and pulls out %s.",  404.  						Monnam(mtmp), body_part(HEAD), doname(otmp)); 405. 				if (pickup_object(otmp, otmp->quan, FALSE) <= 0) { 406. 					obj_extract_self(otmp); 407. 					place_object(otmp, u.ux, u.uy); 408. 					newsym(u.ux, u.uy); 409. 				}  410.  			}  411.  			break; 412. 		case 16: /* the Moon */ 413. 			/* Reset the old moonphase */ 414. 			if (flags.moonphase == FULL_MOON) 415. 				change_luck(-1); 416.  417.  			/* Set the new moonphase */ 418. 			flags.moonphase = phase_of_the_moon; 419. 			switch (flags.moonphase) { 420. 				case NEW_MOON: 421. 					pline("Be careful!  New moon tonight."); 422. 					break; 423. 				case 1:	case 2:	case 3: 424. 					pline_The("moon is waxing tonight."); 425. 					break; 426. 				case FULL_MOON: 427. 					You("are lucky!  Full moon tonight."); 428. 					change_luck(1); 429. 					break; 430. 				case 5:	case 6:	case 7: 431. 					pline_The("moon is waning tonight."); 432. 					break; 433. 				default: 434. 					impossible("wierd moonphase %d", flags.moonphase); 435. 					break; 436. 			}  437.  			break; 438. 		case 17: /* the Sun */ 439. 			if (midnight) 440. 				verbalize("It is the witching hour.  Beware of the undead!"); 441. 			else if (night) 442. 				verbalize("It is nighttime.  Beware of creatures of the night!"); 443. 			else 444. 				verbalize("It is daytime.  Shouldn't you be working?"); 445. 			break; 446. 		case 18: /* Judgement */ 447. 			fortune_lev(mtmp, "portal to quest",  448.  				"a portal to a quest"); 449. 			/* fortune_lev(mtmp, &quest_level); */ 450. 			break; 451. 		case 19: /* Infinity */ 452. 			if (mtmp->mcan) { 453. 				verbalize("I wish I wasn't here!"); 454. 				mongone(mtmp); 455. 			} else if (gypsy_offer(mtmp, 10000L, "grant you a wish")) { 456. 				mtmp->mcan = TRUE; 457. 				makewish; 458. 			}  459.  			break; 460. 		default: 461. 			impossible("unknown trump %d", card_trump(card)); 462. 			break; 463. 		}	/* End trumps */ 464. 	else 465. 		/* Suited card */ 466. 		com_pager(QT_GYPSY + card); 467.  468.  	return; 469. }  470.   471.   472.  /*** Three-card monte ***/ 473.  474.  #define MONTE_COST	1			/* Minimum bet */ 475. #define MONTE_MAX	10			/* Maximum value of monteluck */ 476.  477.   478.  static void 479. monte (mtmp) 480. 	struct monst *mtmp; 481. {  482.  	long bet, n;  483. char buf[BUFSZ]; 484. 	winid win; 485. 	anything any; 486. 	menu_item *selected; 487. 	int delta; 488.  489.   490.  	/* Get the bet */ 491. 	bet = gypsy_bet(mtmp, MONTE_COST); 492. 	if (!bet) return; 493.  494.  	/* Shuffle and pick */ 495. 	if (flags.verbose) 496. 		pline("%s places three cards and rearranges them.", Monnam(mtmp)); 497. 	any.a_void = 0;	/* zero out all bits */ 498. 	win = create_nhwindow(NHW_MENU); 499. 	start_menu(win); 500. 	any.a_char = 'l'; 501. 	add_menu(win, NO_GLYPH, &any, 'l', 0, ATR_NONE,  502.  			"Left card", MENU_UNSELECTED); 503. 	any.a_char = 'c'; 504. 	add_menu(win, NO_GLYPH, &any, 'c', 0, ATR_NONE,  505.  			"Center card", MENU_UNSELECTED); 506. 	any.a_char = 'r'; 507. 	add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,  508.  			"Right card", MENU_UNSELECTED); 509. 	end_menu(win, "Pick a card:"); 510. 	while (select_menu(win, PICK_ONE, &selected) != 1) ; 511. 	destroy_nhwindow(win); 512.  513.  	/* Calculate the change in odds for next time */ 514. 	/* Start out easy, but get harder once the player is suckered */ 515. 	delta = rnl(4) - 3;	/* Luck helps */ 516. 	if (u.umontelast == selected[0].item.a_char) 517. 		/* Only suckers keep picking the same card */ 518. 		delta++; 519. 	u.umontelast = selected[0].item.a_char; 520. 	for (n = bet; n > 0; n /= 10L) 521. 		/* Penalize big bets */ 522. 		delta++; 523. /*	pline("luck = %d; delta = %d", u.umonteluck, delta);*/ 524.  525.  	/* Did we win? */ 526.  	if (u.umonteluck <= rn2(MONTE_MAX)) { 527. 		if (u.umonteluck == 0) 528. 			verbalize("You win!  Wasn't that easy?"); 529. 		else 530. 			verbalize("You win!"); 531. 		EGYP(mtmp)->credit += bet; 532.  533.  		/* Make it harder for next time */ 534. 		if (delta > 0) u.umonteluck += delta; 535. 		if (u.umonteluck > MONTE_MAX) u.umonteluck = MONTE_MAX; 536. 	} else { 537. 		card_name(rn1(2, 1), buf); 538. 		verbalize("Sorry, you picked %s.  Try again.", buf); 539. 		gypsy_charge(mtmp, bet); 540.  541.  		/* Make it a little easier for next time */ 542. 		if (delta < 0) u.umonteluck += delta; 543. 		if (u.umonteluck < 0) u.umonteluck = 0; 544. 	}  545.  	return; 546. }  547.   548.   549.  /*** Ninety-nine ***/ 550.  551.  #define NINETYNINE_COST		1	/* Minimum bet */ 552. #define NINETYNINE_HAND		3	/* Number of cards in hand */ 553. #define NINETYNINE_GOAL		99	/* Limit of the total */ 554.  555.  static boolean 556. nn_playable (card, total) 557. 	xchar card; 558. 	int total; 559. {  560.  	if (card_istrump(card)) 561. 		/* The fool always loses; other trumps are always playable */ 562. 		return (card != CARD_SUITED); 563. 	switch (card_rank(card)+1) { 564. 		case 11:	/* Jack */ 565. 		case 12:	/* Queen */ 566. 			return (total >= 10); 567. 		case 13:	/* King */ 568. 			return (TRUE); 569. 		default:	/* Ace through 10 */ 570. 			return ((total + card_rank(card) + 1) <= NINETYNINE_GOAL); 571. 	}  572.  }  573.   574.  static int 575. nn_play (card, total) 576. 	xchar card; 577. 	int total; 578. {  579.  	if (card_istrump(card)) { 580. 		if (card == CARD_SUITED) 581. 			/* The Fool always loses */ 582. 			return (NINETYNINE_GOAL+1); 583. 		else 584. 			/* Other trumps leave the total unchanged */ 585. 			return (total); 586. 	}  587.  	switch (card_rank(card)+1) { 588. 		case 11:	/* Jack */ 589. 		case 12:	/* Queen */ 590. 			return (total - 10); 591. 		case 13:	/* King */ 592. 			return (NINETYNINE_GOAL); 593. 		default:	/* Ace through 10 */ 594. 			return (total + card_rank(card) + 1); 595. 	}  596.  }  597.   598.  static int 599. nn_pref (card) 600. 	xchar card; 601. {  602.  	/* Computer's preferences for playing cards: 603. 	 * 3.  Get rid of Ace through 10 whenever we can. Highest priority. 604. 	 * 2.  King will challenge the player. High priority. 605. 	 * 1.  Jack and queen may help us, or the hero. Low priority. 606. 	 * 0.  Trumps can always be played (except the fool). Lowest priority. 607. 	 */  608.  	if (card_istrump(card)) 609. 		/* The fool always loses; other trumps are always playable */ 610. 		return (0); 611. 	switch (card_rank(card)+1) { 612. 		case 11:	/* Jack */ 613. 		case 12:	/* Queen */ 614. 			return (1); 615. 		case 13:	/* King */ 616. 			return (2); 617. 		default:	/* Ace through 10 */ 618. 			return (3); 619. 	}  620.  }  621.   622.   623.  static void 624. ninetynine (mtmp) 625. 	struct monst *mtmp; 626. {  627.  	long bet; 628. 	int i, n, which, total = 0; 629. 	xchar uhand[NINETYNINE_HAND], ghand[NINETYNINE_HAND]; 630. 	char buf[BUFSZ]; 631. 	winid win; 632. 	anything any; 633. 	menu_item *selected; 634.  635.   636.  	/* Get the bet */ 637. 	bet = gypsy_bet(mtmp, NINETYNINE_COST); 638. 	if (!bet) return; 639.  640.  	/* Shuffle the deck and deal */ 641. 	card_shuffle(mtmp); 642. 	for (i = 0; i < NINETYNINE_HAND; i++) { 643. 		uhand[i] = card_draw(mtmp); 644. 		ghand[i] = card_draw(mtmp); 645. 	}  646.   647.  	while (1) { 648. 		/* Let the user pick a card */ 649. 		any.a_void = 0;	/* zero out all bits */ 650. 		win = create_nhwindow(NHW_MENU); 651. 		start_menu(win); 652. 		for (i = 0; i < NINETYNINE_HAND; i++) { 653. 			any.a_int = (nn_playable(uhand[i], total) ? i+1 : 0); 654. 			card_name(uhand[i], buf); 655. 			add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,  656.  					buf, MENU_UNSELECTED); 657. 		}  658.  		any.a_int = NINETYNINE_HAND + 1; 659. 		add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE,  660.  				"Forfeit", MENU_UNSELECTED); 661. 		end_menu(win, "Play a card:"); 662. 		while (select_menu(win, PICK_ONE, &selected) != 1) ; 663. 		destroy_nhwindow(win); 664.  665.  		/* Play the card */ 666. 		which = selected[0].item.a_int-1; 667. 		if (which >= NINETYNINE_HAND) { 668. 			You("forfeit."); 669. 			gypsy_charge(mtmp, bet); 670. 			return; 671. 		}  672.  		card_name(uhand[which], buf); 673. 		total = nn_play(uhand[which], total); 674. 		You("play %s for a total of %d.", buf, total); 675. 		if (total < 0 || total > NINETYNINE_GOAL) { 676. 			You("lose!"); 677. 			gypsy_charge(mtmp, bet); 678. 			return; 679. 		}  680.   681.  		/* Draw a new card */ 682. 		uhand[which] = card_draw(mtmp); 683. 		if (uhand[which] < 0) { 684. 			pline_The("deck is empty.  You win!"); 685. 			EGYP(mtmp)->credit += bet; 686. 			return; 687. 		}  688.   689.  		/* Let the gypsy pick a card */ 690. 		n = 0; 691. 		for (i = 0; i < NINETYNINE_HAND; i++) 692. 			if (nn_playable(ghand[i], total)) { 693. 				/* The card is playable, but is it the best? */ 694.  				if (!n++ || nn_pref(ghand[i]) > nn_pref(ghand[which])) 695. 					which = i;  696. } 697.  		if (!n) { 698. 			/* No playable cards */ 699. 			pline("%s forfeits.  You win!", Monnam(mtmp)); 700. 			EGYP(mtmp)->credit += bet; 701. 			return; 702. 		}  703.   704.  		/* Play the card */ 705. 		card_name(ghand[which], buf); 706. 		total = nn_play(ghand[which], total); 707. 		pline("%s plays %s for a total of %d.", Monnam(mtmp), buf, total); 708.  709.  		/* Draw a new card */ 710. 		ghand[which] = card_draw(mtmp); 711. 		if (ghand[which] < 0) { 712. 			pline_The("deck is empty.  You win!"); 713. 			EGYP(mtmp)->credit += bet; 714. 			return; 715. 		}  716.  	}  717.   718.  	return; 719. }  720.   721.   722.   723.  /*** Pawn gems ***/ 724.  725.  STATIC_OVL NEARDATA const char pawnables[] = { ALLOW_COUNT, GEM_CLASS, 0 }; 726.  727.  static void 728. pawn (mtmp) 729. 	struct monst *mtmp; 730. {  731.  	struct obj *otmp; 732. 	long value; 733.  734.   735.  	/* Prompt for an item */ 736. 	otmp = getobj((const char *)pawnables, "pawn"); 737.  738.  	/* Is the item valid? */ 739.  	if (!otmp) return; 740. 	if (!objects[otmp->otyp].oc_name_known) { 741. 		/* Reject unknown objects */ 742. 		verbalize("Is this merchandise authentic?"); 743. 		return; 744. 	}  745.  	if (otmp->otyp < DILITHIUM_CRYSTAL || otmp->otyp > LAST_GEM) { 746. 		/* Reject glass */ 747. 		verbalize("Don\'t bother with that junk!"); 748. 		return; 749. 	}  750.   751.  	/* Give the credit */ 752. 	value = otmp->quan * objects[otmp->otyp].oc_cost; 753. 	pline("%s gives you %ld zorkmid%s credit.", Monnam(mtmp),  754.  			value, plur(value)); 755. 	EGYP(mtmp)->credit += value; 756.  757.  	/* Gypsies don't keep merchandise; it could get stolen! */ 758.  	otmp->quan = 1L; 759. 	useup(otmp); 760. 	return; 761. }  762.   763.   764.  /*** Yendorian Tarocchi ***/ 765.  766.  #define TAROCCHI_COST	500		/* Cost to play */ 767. #define TAROCCHI_HAND	10		/* Number of cards in hand */ 768.  769.  static void 770. tarocchi (mtmp) 771. 	struct monst *mtmp; 772. {  773.  	int turn; 774.  775.  	/* Shuffle the deck and deal */ 776. 	gypsy_charge(mtmp, TAROCCHI_COST); 777. 	card_shuffle(mtmp); 778.  779.  	/* Play the given number of turns */ 780. 	for (turn = TAROCCHI_HAND; turn > 0; turn--) { 781. 	}  782.   783.  	return; 784. }  785.   786.   787.  /*** Monster-related functions ***/ 788.  789.  void 790. gypsy_init (mtmp) 791. 	struct monst *mtmp; 792. {  793.  	mtmp->isgyp = TRUE; 794. 	mtmp->mpeaceful = TRUE; 795. 	mtmp->msleeping = 0; 796. 	mtmp->mtrapseen = ~0;	/* traps are known */ 797. 	EGYP(mtmp)->credit = 0L; 798. 	EGYP(mtmp)->top = 0; 799. 	return; 800. }  801.   802.   803.  void 804. gypsy_chat (mtmp) 805. 	struct monst *mtmp; 806. {  807.  	long money; 808. 	winid win; 809. 	anything any; 810. 	menu_item *selected; 811. #ifdef GOLDOBJ 812. 	long umoney; 813. #endif 814. 	int n;  815. 816. #ifdef GOLDOBJ 817. 	umoney = money_cnt(invent); 818. #endif 819.  820.  	/* Sanity checks */ 821. 	if (!mtmp || !mtmp->mpeaceful || !mtmp->isgyp ||  822.  			!humanoid(mtmp->data)) 823. 		return; 824.  825.  	/* Add up your available money */ 826. 	You("have %ld zorkmid%s credit and are carrying %ld zorkmid%s.",  827.  			EGYP(mtmp)->credit, plur(EGYP(mtmp)->credit),  828.  #ifndef GOLDOBJ  829.  			u.ugold, plur(u.ugold)); 830. #else 831. 			umoney, plur(umoney));			  832.  #endif  833.  	money = EGYP(mtmp)->credit +  834.  #ifndef GOLDOBJ  835.  											u.ugold;  836.  #else  837.  											umoney;  838.  #endif  839.   840.  	/* Create the menu */  841.  	any.a_void = 0;	/* zero out all bits */  842.  	win = create_nhwindow(NHW_MENU);  843.  	start_menu(win);  844.   845.  	/* Fortune */  846.  	any.a_char = 'f';  847.  	if (money >= FORTUNE_COST)  848.  		add_menu(win, NO_GLYPH, &any, 'f', 0, ATR_NONE, 849. 				"Read your fortune", MENU_UNSELECTED);  850.   851.  	/* Three-card monte */  852.  	any.a_char = 'm';  853.  	if (money >= MONTE_COST)  854.  		add_menu(win, NO_GLYPH, &any, 'm', 0, ATR_NONE, 855. 				"Three-card monte", MENU_UNSELECTED);  856.   857.  	/* Ninety-nine */  858.  	any.a_char = 'n';  859.  	if (money >= NINETYNINE_COST)  860.  		add_menu(win, NO_GLYPH, &any, 'n', 0, ATR_NONE, 861. 				"Ninety-nine", MENU_UNSELECTED);  862.   863.  	/* Pawn gems (always available) */  864.  	any.a_char = 'p';  865.  	add_menu(win, NO_GLYPH, &any, 'p', 0, ATR_NONE, 866. 			"Pawn gems", MENU_UNSELECTED);  867.   868.  	/* Yendorian Tarocchi */  869.  	any.a_char = 't';  870.  /*	if (money >= TAROCCHI_COST)  871.  		add_menu(win, NO_GLYPH, &any, 't', 0, ATR_NONE, 872. 				"Yendorian Tarocchi", MENU_UNSELECTED);*/  873.   874.  	/* Help */  875.  	any.a_char = '?';  876.  		add_menu(win, NO_GLYPH, &any, '?', 0, ATR_NONE, 877. 				"Help", MENU_UNSELECTED);  878.   879.  	/* Display the menu */  880.  	end_menu(win, "Play which game?");  881.  	n = select_menu(win, PICK_ONE, &selected);  882.  	destroy_nhwindow(win);  883.  	if (n > 0) switch (selected[0].item.a_char) {  884.  		case 'f':  885.  			fortune(mtmp);  886.  			break;  887.  		case 'm':  888.  			monte(mtmp);  889.  			break;  890.  		case 'n':  891.  			ninetynine(mtmp);  892.  			break;  893.  		case 'p':  894.  			pawn(mtmp);  895.  			break;  896.  		case 't':  897.  			tarocchi(mtmp);  898.  			break;  899.  		case '?':  900.  			display_file_area(FILE_AREA_SHARE, "gypsy.txt", TRUE);  901.  			break;  902.  	}  903.   904.  	return;  905.  }  906.   907.