diff options
| author | B. Watson <yalhcru@gmail.com> | 2015-05-07 16:32:32 -0400 | 
|---|---|---|
| committer | B. Watson <yalhcru@gmail.com> | 2015-05-07 16:32:32 -0400 | 
| commit | 013ac7742311556022304e8b30ca170d48b3a016 (patch) | |
| tree | 53faa33e75991363f1a6dcc7edc83a66b70e6995 /larn/action.c | |
| download | bsd-games-extra-013ac7742311556022304e8b30ca170d48b3a016.tar.gz | |
initial commit
Diffstat (limited to 'larn/action.c')
| -rw-r--r-- | larn/action.c | 305 | 
1 files changed, 305 insertions, 0 deletions
| diff --git a/larn/action.c b/larn/action.c new file mode 100644 index 0000000..6fe1a88 --- /dev/null +++ b/larn/action.c @@ -0,0 +1,305 @@ +/*	$NetBSD: action.c,v 1.1 2008/02/19 06:05:26 dholland Exp $	*/ + +/* + * action.c 		Larn is copyrighted 1986 by Noah Morgan. + *  + * Routines in this file: + *  + * ... + */ +#include <sys/cdefs.h> +#ifndef lint +__RCSID("$NetBSD: action.c,v 1.1 2008/02/19 06:05:26 dholland Exp $"); +#endif				/* not lint */ +#include <stdlib.h> +#include <unistd.h> +#include "header.h" +#include "extern.h" + +static void ohear(void); + +/* + * act_remove_gems + * + * Remove gems from a throne. + * + * arg is zero if there is a gnome king associated with the throne. + * + * Assumes that cursors() has been called previously, and that a check + * has been made that the throne actually has gems. + */ +void +act_remove_gems(int arg) +{ +	int i, k; + +	k = rnd(101); +	if (k < 25) { +		for (i = 0; i < rnd(4); i++) +			creategem();	/* gems pop off the +					 * throne */ +		item[playerx][playery] = ODEADTHRONE; +		know[playerx][playery] = 0; +	} else if (k < 40 && arg == 0) { +		createmonster(GNOMEKING); +		item[playerx][playery] = OTHRONE2; +		know[playerx][playery] = 0; +	} else +		lprcat("\nnothing happens"); +} + +/* + * act_sit_throne + * + * Sit on a throne. + * + * arg is zero if there is a gnome king associated with the throne + * + * Assumes that cursors() has been called previously. + */ +void +act_sit_throne(int arg) +{ +	int k; + +	k = rnd(101); +	if (k < 30 && arg == 0) { +		createmonster(GNOMEKING); +		item[playerx][playery] = OTHRONE2; +		know[playerx][playery] = 0; +	} else if (k < 35) { +		lprcat("\nZaaaappp!  You've been teleported!\n"); +		beep(); +		oteleport(0); +	} else +		lprcat("\nnothing happens"); +} + +/* + * Code to perform the action of drinking at a fountain.  Assumes that + * cursors() has already been called, and that a check has been made + * that the player is actually standing at a live fountain. + */ +void +act_drink_fountain(void) +{ +	int x; + +	if (rnd(1501) < 2) { +		lprcat("\nOops!  You seem to have caught the dreadful sleep!"); +		beep(); +		lflush(); +		sleep(3); +		died(280); +		return; +	} +	x = rnd(100); +	if (x < 7) { +		c[HALFDAM] += 200 + rnd(200); +		lprcat("\nYou feel a sickness coming on"); +	} else if (x < 13) +		quaffpotion(23);	/* see invisible */ +	else if (x < 45) +		lprcat("\nnothing seems to have happened"); +	else if (rnd(3) != 2) +		fntchange(1);	/* change char levels upward	 */ +	else +		fntchange(-1);	/* change char levels +				 * downward	 */ +	if (rnd(12) < 3) { +		lprcat("\nThe fountains bubbling slowly quiets"); +		item[playerx][playery] = ODEADFOUNTAIN;	/* dead fountain */ +		know[playerx][playery] = 0; +	} +} + +/* + * Code to perform the action of washing at a fountain.  Assumes that + * cursors() has already been called and that a check has been made + * that the player is actually standing at a live fountain. + */ +void +act_wash_fountain(void) +{ +	int x; + +	if (rnd(100) < 11) { +		x = rnd((level << 2) + 2); +		lprintf("\nOh no!  The water was foul!  You suffer %ld hit points!", (long) x); +		lastnum = 273; +		losehp(x); +		bottomline(); +		cursors(); +	} else if (rnd(100) < 29) +		lprcat("\nYou got the dirt off!"); +	else if (rnd(100) < 31) +		lprcat("\nThis water seems to be hard water!  The dirt didn't come off!"); +	else if (rnd(100) < 34) +		createmonster(WATERLORD);	/* make water lord		 */ +	else +		lprcat("\nnothing seems to have happened"); +} + +/* + * Perform the actions associated with altar desecration. + */ +void +act_desecrate_altar(void) +{ +	if (rnd(100) < 60) { +		createmonster(makemonst(level + 2) + 8); +		c[AGGRAVATE] += 2500; +	} else if (rnd(101) < 30) { +		lprcat("\nThe altar crumbles into a pile of dust before your eyes"); +		forget();	/* remember to destroy +				 * the altar	 */ +	} else +		lprcat("\nnothing happens"); +} + +/* + * Perform the actions associated with praying at an altar and giving + * a donation. + */ +void +act_donation_pray(void) +{ +	long amt; + +	lprcat("\n\n"); +	cursor(1, 24); +	cltoeoln(); +	cursor(1, 23); +	cltoeoln(); +	lprcat("how much do you donate? "); +	amt = readnum((long) c[GOLD]); +	if (amt < 0 || c[GOLD] < amt) { +		lprcat("\nYou don't have that much!"); +		return; +	} +	c[GOLD] -= amt; +	if (amt < c[GOLD] / 10 || amt < rnd(50)) { +		createmonster(makemonst(level + 1)); +		c[AGGRAVATE] += 200; +	} else if (rnd(101) > 50) { +		ohear(); +		return; +	} else if (rnd(43) == 5) { +		if (c[WEAR]) +			lprcat("\nYou feel your armor vibrate for a moment"); +		enchantarmor(); +		return; +	} else if (rnd(43) == 8) { +		if (c[WIELD]) +			lprcat("\nYou feel your weapon vibrate for a moment"); +		enchweapon(); +		return; +	} else +		lprcat("\nThank You."); +	bottomline(); +} + +/* + *  Performs the actions associated with 'just praying' at the altar.  Called + *  when the user responds 'just pray' when in prompt mode, or enters 0 to + *  the money prompt when praying. + * + *  Assumes cursors(), and that any leading \n have been printed. + */ +void +act_just_pray(void) +{ +	if (rnd(100) < 75) +		lprcat("\nnothing happens"); +	else if (rnd(13) < 4) +		ohear(); +	else if (rnd(43) == 10) { +		if (c[WEAR]) +			lprcat("\nYou feel your armor vibrate for a moment"); +		enchantarmor(); +		return; +	} else if (rnd(43) == 10) { +		if (c[WIELD]) +			lprcat("\nYou feel your weapon vibrate for a moment"); +		enchweapon(); +		return; +	} else +		createmonster(makemonst(level + 1)); +} + +/* + * Function to cast a +3 protection on the player + */ +static void +ohear(void) +{ +	lprcat("\nYou have been heard!"); +	if (c[ALTPRO] == 0) +		c[MOREDEFENSES] += 3; +	c[ALTPRO] += 500;	/* protection field */ +	bottomline(); +} + +/* + * Performs the act of ignoring an altar. + * + * Assumptions:  cursors() has been called. + */ +void +act_ignore_altar(void) +{ +	if (rnd(100) < 30) { +		createmonster(makemonst(level + 1)); +		c[AGGRAVATE] += rnd(450); +	} else +		lprcat("\nnothing happens"); +} + +/* + * Performs the act of opening a chest.   + * + * Parameters:   x,y location of the chest to open. + * Assumptions:  cursors() has been called previously + */ +void +act_open_chest(int x, int y) +{ +	int i, k; + +	k = rnd(101); +	if (k < 40) { +		lprcat("\nThe chest explodes as you open it"); +		beep(); +		i = rnd(10); +		lastnum = 281;	/* in case he dies */ +		lprintf("\nYou suffer %ld hit points damage!", (long) i); +		checkloss(i); +		switch (rnd(10)) {	/* see if he gets a +					 * curse */ +		case 1: +			c[ITCHING] += rnd(1000) + 100; +			lprcat("\nYou feel an irritation spread over your skin!"); +			beep(); +			break; + +		case 2: +			c[CLUMSINESS] += rnd(1600) + 200; +			lprcat("\nYou begin to lose hand to eye coordination!"); +			beep(); +			break; + +		case 3: +			c[HALFDAM] += rnd(1600) + 200; +			beep(); +			lprcat("\nA sickness engulfs you!"); +			break; +		}; +		item[x][y] = know[x][y] = 0; +		if (rnd(100) < 69) +			creategem();	/* gems from the chest */ +		dropgold(rnd(110 * iarg[x][y] + 200)); +		for (i = 0; i < rnd(4); i++) +			something(iarg[x][y] + 2); +	} else +		lprcat("\nnothing happens"); +} | 
