summaryrefslogtreecommitdiffstats
path: root/larn
diff options
context:
space:
mode:
authordholland <dholland@NetBSD.org>2008-02-19 06:05:26 +0000
committerdholland <dholland@NetBSD.org>2008-02-19 06:05:26 +0000
commitc3de34fcf8f28f8b1d0090907c4eb2116be93d2e (patch)
tree3e6bd42fed76dea2dcfeea18d7a3fe05be8f5be5 /larn
parente56d75c2f9cc30dd639b9070119f0159aec6e97e (diff)
downloadbsdgames-darwin-c3de34fcf8f28f8b1d0090907c4eb2116be93d2e.tar.gz
bsdgames-darwin-c3de34fcf8f28f8b1d0090907c4eb2116be93d2e.tar.zst
bsdgames-darwin-c3de34fcf8f28f8b1d0090907c4eb2116be93d2e.zip
Split some code from moreobj.c into action.c, as per larn 12.2.
Diffstat (limited to 'larn')
-rw-r--r--larn/Makefile4
-rw-r--r--larn/action.c305
-rw-r--r--larn/extern.h13
-rw-r--r--larn/moreobj.c195
4 files changed, 332 insertions, 185 deletions
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 <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");
+}
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 <sys/cdefs.h>
#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 <stdlib.h>
#include <unistd.h>
#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,51 +48,25 @@ 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
*/
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;
}
}