From c3de34fcf8f28f8b1d0090907c4eb2116be93d2e Mon Sep 17 00:00:00 2001 From: dholland Date: Tue, 19 Feb 2008 06:05:26 +0000 Subject: Split some code from moreobj.c into action.c, as per larn 12.2. --- larn/Makefile | 4 +- larn/action.c | 305 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ larn/extern.h | 13 ++- larn/moreobj.c | 195 +++--------------------------------- 4 files changed, 332 insertions(+), 185 deletions(-) create mode 100644 larn/action.c (limited to 'larn') diff --git a/larn/Makefile b/larn/Makefile index 8008499f..05b4ba16 100644 --- a/larn/Makefile +++ b/larn/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.18 2008/01/28 05:38:53 dholland Exp $ +# $NetBSD: Makefile,v 1.19 2008/02/19 06:05:26 dholland Exp $ # @(#)Makefile 5.12 (Berkeley) 5/30/93 # EXTRA @@ -62,7 +62,7 @@ MAN= larn.6 CPPFLAGS+=-DBSD -DVER=12 -DSUBVER=0 -DNONAP -DUIDSCORE -DTERMIOS SRCS= main.c object.c create.c tok.c display.c global.c data.c io.c \ monster.c store.c diag.c help.c config.c nap.c bill.c scores.c \ - signal.c moreobj.c movem.c regen.c fortune.c savelev.c + signal.c action.c moreobj.c movem.c regen.c fortune.c savelev.c DPADD= ${LIBTERM} LDADD= -ltermcap HIDEGAME=hidegame diff --git a/larn/action.c b/larn/action.c new file mode 100644 index 00000000..6fe1a88e --- /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 +#ifndef lint +__RCSID("$NetBSD: action.c,v 1.1 2008/02/19 06:05:26 dholland Exp $"); +#endif /* not lint */ +#include +#include +#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"); +} diff --git a/larn/extern.h b/larn/extern.h index 97b697bc..5f527eb3 100644 --- a/larn/extern.h +++ b/larn/extern.h @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.11 2008/02/04 01:07:01 dholland Exp $ */ +/* $NetBSD: extern.h,v 1.12 2008/02/19 06:05:26 dholland Exp $ */ /* * Copyright (c) 1997 Christos Zoulas. All rights reserved. @@ -29,6 +29,17 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* action.c */ +void act_remove_gems(int); +void act_sit_throne(int); +void act_drink_fountain(void); +void act_wash_fountain(void); +void act_desecrate_altar(void); +void act_donation_pray(void); +void act_just_pray(void); +void act_ignore_altar(void); +void act_open_chest(int, int); + /* bill.c */ void mailbill(void); diff --git a/larn/moreobj.c b/larn/moreobj.c index b515fbff..b0cb5961 100644 --- a/larn/moreobj.c +++ b/larn/moreobj.c @@ -1,4 +1,4 @@ -/* $NetBSD: moreobj.c,v 1.10 2008/02/04 01:07:01 dholland Exp $ */ +/* $NetBSD: moreobj.c,v 1.11 2008/02/19 06:05:26 dholland Exp $ */ /* * moreobj.c Larn is copyrighted 1986 by Noah Morgan. @@ -9,14 +9,13 @@ */ #include #ifndef lint -__RCSID("$NetBSD: moreobj.c,v 1.10 2008/02/04 01:07:01 dholland Exp $"); +__RCSID("$NetBSD: moreobj.c,v 1.11 2008/02/19 06:05:26 dholland Exp $"); #endif /* not lint */ #include #include #include "header.h" #include "extern.h" -static void ohear(void); static void fch(int, long *); /* @@ -25,7 +24,6 @@ static void fch(int, long *); void oaltar() { - long amt; lprcat("\nDo you (p) pray (d) desecrate"); iopts(); @@ -37,56 +35,11 @@ oaltar() while (1) switch (ttgetch()) { case 'j': - 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)); + act_just_pray(); return; case 'm': - 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(); + act_donation_pray(); return; case '\33': @@ -95,43 +48,18 @@ oaltar() case 'd': lprcat(" desecrate"); - 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"); + act_desecrate_altar(); return; case 'i': case '\33': ignore(); - if (rnd(100) < 30) { - createmonster(makemonst(level + 1)); - c[AGGRAVATE] += rnd(450); - } else - lprcat("\nnothing happens"); + act_ignore_altar(); return; }; } } -/* - function to cast a +3 protection on the player - */ -static void -ohear() -{ - lprcat("\nYou have been heard!"); - if (c[ALTPRO] == 0) - c[MOREDEFENSES] += 3; - c[ALTPRO] += 500; /* protection field */ - bottomline(); -} - /* subroutine to process a throne object */ @@ -139,7 +67,6 @@ void othrone(arg) int arg; { - int i, k; lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts(); @@ -148,34 +75,12 @@ othrone(arg) switch (ttgetch()) { case 'p': lprcat(" pry off"); - 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_remove_gems(arg); return; case 's': lprcat(" sit down"); - 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"); + act_sit_throne(arg); return; case 'i': @@ -221,7 +126,7 @@ odeadthrone() void ochest() { - int i, k; + lprcat("\nDo you (t) take it, (o) try to open it"); iopts(); while (1) { @@ -229,42 +134,7 @@ ochest() switch (ttgetch()) { case 'o': lprcat(" open it"); - 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[playerx][playery] = know[playerx][playery] = 0; - if (rnd(100) < 69) - creategem(); /* gems from the chest */ - dropgold(rnd(110 * iarg[playerx][playery] + 200)); - for (i = 0; i < rnd(4); i++) - something(iarg[playerx][playery] + 2); - } else - lprcat("\nnothing happens"); + act_open_chest(playerx, playery); return; case 't': @@ -287,7 +157,7 @@ ochest() void ofountain() { - int x; + cursors(); lprcat("\nDo you (d) drink, (w) wash yourself"); iopts(); @@ -295,32 +165,7 @@ ofountain() switch (ttgetch()) { case 'd': lprcat("drink"); - 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; - } + act_drink_fountain(); return; case '\33': @@ -330,21 +175,7 @@ ofountain() case 'w': lprcat("wash yourself"); - 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"); + act_wash_fountain(); return; } } -- cgit v1.2.3-56-ge451