mirror of
https://github.com/vattam/BSDGames.git
synced 2025-12-20 19:04:49 +00:00
* New upstream release, whivh includes hack, back fron bsdgames-nonfree.
* Conflict and replace with old versions of bsdgames-nonfree that include
hack.
* Add hack to package description and menu file.
* Add in hack's two READ_ME files to binay package.
* Patched hack config.h as it is patched in bsdgames-nonfree.
* Unlike bsdgames-nonfree, put the help, hh, rumors, and data files in
/usr/share/games/bsdgames/hack, as the patched config.h makes it look
there.
* postinst moves over hack state files to new directory
* Patched phantasia to use strerror and not segfault if it cannot open the
var files. Closes: #187251 (patch sent upstream)
git-svn-id: file:///srv/svn/joey/bsdgames-trunk@5206 a4a2c43b-8ac3-0310-8836-e0e880c912e2
This commit is contained in:
20
NEWS
20
NEWS
@@ -11,6 +11,26 @@ changes in installation instructions. Packagers should also reread
|
||||
the PACKAGING file each version (or do a diff between the old and new
|
||||
versions of the package and read that).
|
||||
|
||||
Version 2.14 (2003-04-01)
|
||||
============
|
||||
|
||||
* Hack is now BSD-licensed
|
||||
<http://www.cwi.nl/~aeb/games/hack/hack.html>, so moves from
|
||||
bsd-games-non-free to bsd-games.
|
||||
|
||||
* Updated from NetBSD CVS of 2003-03-29. This includes:
|
||||
|
||||
+ Security fix for rogue (in bsd-games-non-free); see NetBSD
|
||||
Security Advisory 2002-021.
|
||||
|
||||
+ Optional support for large numbers in factor using libcrypto from
|
||||
OpenSSL. This can handle larger numbers than GNU factor (which is
|
||||
limited to 64-bit numbers) but not that much larger efficiently, as
|
||||
the algorithm used (Pollard rho) is O(n^{1/4}) in the number
|
||||
factored.
|
||||
|
||||
* Some bugs fixed, though a backlog of bug reports remains.
|
||||
|
||||
Version 2.13 (2001-08-30)
|
||||
============
|
||||
|
||||
|
||||
269
atc/atc.6.in
269
atc/atc.6.in
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: atc.6,v 1.11 2001/06/05 11:14:30 wiz Exp $
|
||||
.\" $NetBSD: atc.6,v 1.16 2003/02/25 10:34:44 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1990, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@@ -52,8 +52,7 @@
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
lets you try your hand at the nerve wracking duties of the air traffic
|
||||
controller without endangering the lives of millions of
|
||||
travelers each year.
|
||||
controller without endangering the lives of millions of travelers each year.
|
||||
Your responsibilities require you to direct the flight of jets
|
||||
and prop planes into and out of the flight arena and airports.
|
||||
The speed (update time) and frequency of the planes depend on the
|
||||
@@ -62,7 +61,7 @@ difficulty of the chosen arena.
|
||||
.Bl -tag -width flag
|
||||
.It Fl u
|
||||
Print the usage line and exit.
|
||||
.It Fl ?
|
||||
.It Fl \&?
|
||||
Same as
|
||||
.Fl u .
|
||||
.It Fl l
|
||||
@@ -76,18 +75,19 @@ Same as
|
||||
.It Fl p
|
||||
Print the path to the special directory where
|
||||
.Nm
|
||||
expects to find its private files. This is used during the
|
||||
installation of the program.
|
||||
expects to find its private files.
|
||||
This is used during the installation of the program.
|
||||
.It Fl g Ar game
|
||||
Play the named game. If the game listed is not one of the
|
||||
ones printed from the
|
||||
Play the named game.
|
||||
If the game listed is not one of the ones printed from the
|
||||
.Fl l
|
||||
option, the default game is played.
|
||||
.It Fl f Ar game
|
||||
Same as
|
||||
.Fl g .
|
||||
.It Fl r Ar seed
|
||||
Set the random seed. The purpose of this flag is questionable.
|
||||
Set the random seed.
|
||||
The purpose of this flag is questionable.
|
||||
.El
|
||||
.Sh GOALS
|
||||
Your goal in
|
||||
@@ -102,28 +102,29 @@ out of exit points.
|
||||
Several things will cause the end of the game.
|
||||
Each plane has a destination (see information area), and
|
||||
sending a plane to the wrong destination is an error.
|
||||
Planes can run out of fuel, or can collide. Collision is defined as
|
||||
adjacency in all three dimensions. A plane leaving the arena
|
||||
Planes can run out of fuel, or can collide.
|
||||
Collision is defined as adjacency in all three dimensions.
|
||||
A plane leaving the arena
|
||||
in any other way than through its destination exit is an error as well.
|
||||
.Pp
|
||||
Scores are sorted in order of the number of planes safe. The other
|
||||
statistics are provided merely for fun. There is no penalty for
|
||||
Scores are sorted in order of the number of planes safe.
|
||||
The other statistics are provided merely for fun.
|
||||
There is no penalty for
|
||||
taking longer than another player (except in the case of ties).
|
||||
.Pp
|
||||
Suspending a game is not permitted. If you get a talk message, tough.
|
||||
When was the last time an Air Traffic Controller got called away to
|
||||
the phone?
|
||||
.Sh "THE DISPLAY"
|
||||
Suspending a game is not permitted.
|
||||
If you get a talk message, tough.
|
||||
When was the last time an Air Traffic Controller got called away to the phone?
|
||||
.Sh THE DISPLAY
|
||||
.Pp
|
||||
Depending on the terminal you run
|
||||
.Nm
|
||||
on, the screen will be divided into 4 areas.
|
||||
It should be stressed that the terminal driver portion of the
|
||||
game was designed to be reconfigurable, so the display format can vary
|
||||
depending the version you are playing. The descriptions here are based
|
||||
on the ascii version
|
||||
of the game. The game rules and input format, however,
|
||||
should remain consistent.
|
||||
depending the version you are playing.
|
||||
The descriptions here are based on the ascii version of the game.
|
||||
The game rules and input format, however, should remain consistent.
|
||||
Control-L redraws the screen, should it become muddled.
|
||||
.Ss RADAR
|
||||
The first screen area is the radar display, showing the relative locations
|
||||
@@ -131,39 +132,41 @@ of the planes, airports, standard entry/exit points, radar
|
||||
beacons, and ``lines'' which simply serve to aid you in guiding
|
||||
the planes.
|
||||
.Pp
|
||||
Planes are shown as a single letter with an altitude. If
|
||||
the numerical altitude is a single digit, then it represents
|
||||
Planes are shown as a single letter with an altitude.
|
||||
If the numerical altitude is a single digit, then it represents
|
||||
thousands of feet.
|
||||
Some distinction is made between the prop
|
||||
planes and the jets. On ascii terminals, prop planes are
|
||||
Some distinction is made between the prop planes and the jets.
|
||||
On ascii terminals, prop planes are
|
||||
represented by a upper case letter, jets by a lower case letter.
|
||||
.Pp
|
||||
Airports are shown as a number and some indication of the direction
|
||||
planes must be going to land at the airport.
|
||||
On ascii terminals, this is one of `^', `>', `<', and `v', to indicate
|
||||
On ascii terminals, this is one of `^', `\*[Gt]', `\*[Lt]', and `v', to indicate
|
||||
north (0 degrees), east (90), west (270) and south (180), respectively.
|
||||
The planes will also
|
||||
take off in this direction.
|
||||
The planes will also take off in this direction.
|
||||
.Pp
|
||||
Beacons are represented as circles or asterisks and a number.
|
||||
Their purpose is to offer a place of easy reference to the plane pilots.
|
||||
See ``the delay command'' under the input section of this manual.
|
||||
See
|
||||
.Sx THE DELAY COMMAND
|
||||
section below.
|
||||
.Pp
|
||||
Entry/exit points are displayed as numbers along the border of the
|
||||
radar screen. Planes will enter the arena from these points without
|
||||
warning. These points have a direction associated with them, and
|
||||
planes will always enter the arena from this direction. On the
|
||||
ascii version of
|
||||
.Nm "" ,
|
||||
this direction is not displayed. It will become apparent
|
||||
what this direction is as the game progresses.
|
||||
radar screen.
|
||||
Planes will enter the arena from these points without warning.
|
||||
These points have a direction associated with them, and
|
||||
planes will always enter the arena from this direction.
|
||||
On the ascii version of
|
||||
.Nm ,
|
||||
this direction is not displayed.
|
||||
It will become apparent what this direction is as the game progresses.
|
||||
.Pp
|
||||
Incoming planes will always enter at the same altitude: 7000 feet.
|
||||
For a plane to successfully depart through an entry/exit point,
|
||||
it must be flying at 9000 feet.
|
||||
It is not necessary for the planes to be flying in any particular
|
||||
direction when they leave the arena (yet).
|
||||
.Ss "INFORMATION AREA"
|
||||
.Ss INFORMATION AREA
|
||||
The second area of the display is the information area, which lists
|
||||
the time (number of updates since start), and the number of planes you
|
||||
have directed safely out of the arena.
|
||||
@@ -171,46 +174,50 @@ Below this is a list of planes currently in the air, followed by a
|
||||
blank line, and then a list of planes on the ground (at airports).
|
||||
Each line lists the plane name and its current altitude,
|
||||
an optional asterisk indicating low fuel, the plane's destination,
|
||||
and the plane's current command. Changing altitude is not considered
|
||||
to be a command and is therefore not displayed. The following are
|
||||
some possible information lines:
|
||||
and the plane's current command.
|
||||
Changing altitude is not considered
|
||||
to be a command and is therefore not displayed.
|
||||
The following are some possible information lines:
|
||||
.Pp
|
||||
.Bd -literal -offset indent
|
||||
B4*A0: Circle @ b1
|
||||
g7 E4: 225
|
||||
.Ed
|
||||
.Pp
|
||||
The first example shows a prop plane named `B' that is flying at 4000
|
||||
feet. It is low on fuel (note the `*'). Its destination is
|
||||
Airport #0.
|
||||
The next command it expects
|
||||
to do is circle when it reaches Beacon #1.
|
||||
The first example shows a prop plane named `B' that is flying at 4000 feet.
|
||||
It is low on fuel (note the `*').
|
||||
Its destination is Airport #0.
|
||||
The next command it expects to do is circle when it reaches Beacon #1.
|
||||
The second example shows a jet named `g' at 7000 feet, destined for
|
||||
Exit #4. It is just now executing a turn to 225 degrees (South-West).
|
||||
.Ss "INPUT AREA"
|
||||
The third area of the display is the input area. It is here that
|
||||
your input is reflected. See the INPUT heading of this manual
|
||||
for more details.
|
||||
.Ss "AUTHOR AREA"
|
||||
Exit #4.
|
||||
It is just now executing a turn to 225 degrees (South-West).
|
||||
.Ss INPUT AREA
|
||||
The third area of the display is the input area.
|
||||
It is here that your input is reflected.
|
||||
See the
|
||||
.Sx INPUT
|
||||
heading of this manual for more details.
|
||||
.Ss AUTHOR AREA
|
||||
This area is used simply to give credit where credit is due. :-)
|
||||
.Sh INPUT
|
||||
A command completion interface is built into
|
||||
the game. At any time, typing `?' will list possible input characters.
|
||||
A command completion interface is built into the game.
|
||||
At any time, typing `?' will list possible input characters.
|
||||
Typing a backspace (your erase character) backs up, erasing the last part
|
||||
of the command. When a command is complete, a return enters it, and
|
||||
any semantic checking is done at that time. If no errors are detected,
|
||||
the command is sent to the appropriate plane. If an error is discovered
|
||||
of the command.
|
||||
When a command is complete, a return enters it, and
|
||||
any semantic checking is done at that time.
|
||||
If no errors are detected, the command is sent to the appropriate plane.
|
||||
If an error is discovered
|
||||
during the check, the offending statement will be underscored and a
|
||||
(hopefully) descriptive message will be printed under it.
|
||||
.Pp
|
||||
The command syntax is broken into two parts:
|
||||
.Em "Immediate Only"
|
||||
.Em Immediate Only
|
||||
and
|
||||
.Em Delayable
|
||||
commands.
|
||||
.Em "Immediate Only"
|
||||
commands happen on the next
|
||||
update.
|
||||
.Em Immediate Only
|
||||
commands happen on the next update.
|
||||
.Em Delayable
|
||||
commands also happen on the next update unless they
|
||||
are followed by an optional predicate called the
|
||||
@@ -220,16 +227,17 @@ command.
|
||||
In the following tables, the syntax
|
||||
.Em [0\-9]
|
||||
means any single digit, and
|
||||
.Em <dir>
|
||||
.Aq Em dir
|
||||
refers to a direction, given by the keys around the `s' key: ``wedcxzaq''.
|
||||
In absolute references, `q' refers to North-West or 315 degrees, and `w'
|
||||
refers to North, or 0 degrees.
|
||||
In relative references, `q' refers to -45 degrees or 45 degrees left, and `w'
|
||||
In relative references, `q' refers to \-45 degrees or 45 degrees left, and `w'
|
||||
refers to 0 degrees, or no change in direction.
|
||||
.Pp
|
||||
All commands start with a plane letter. This indicates the recipient
|
||||
of the command. Case is ignored.
|
||||
.Ss "IMMEDIATE ONLY COMMANDS"
|
||||
All commands start with a plane letter.
|
||||
This indicates the recipient of the command.
|
||||
Case is ignored.
|
||||
.Ss IMMEDIATE ONLY COMMANDS
|
||||
.Bl -tag -width "aaaa"
|
||||
.It "a [ cd+- ]" Em number
|
||||
Altitude: Change a plane's altitude, possibly requesting takeoff.
|
||||
@@ -243,18 +251,18 @@ Climb: relative altitude change.
|
||||
Descend: relative altitude change.
|
||||
.El
|
||||
.It m
|
||||
Mark: Display in highlighted mode. Plane and command information
|
||||
is displayed normally.
|
||||
Mark: Display in highlighted mode.
|
||||
Plane and command information is displayed normally.
|
||||
.It i
|
||||
Ignore: Do not display highlighted. Command is displayed as a
|
||||
line of dashes if there is no command.
|
||||
Ignore: Do not display highlighted.
|
||||
Command is displayed as a line of dashes if there is no command.
|
||||
.It u
|
||||
Unmark: Same as ignore, but if a delayed command is processed,
|
||||
the plane will become marked. This is useful if you want
|
||||
to forget about a plane during part, but not all, of its
|
||||
journey.
|
||||
the plane will become marked.
|
||||
This is useful if you want to forget about a plane during part,
|
||||
but not all, of its journey.
|
||||
.El
|
||||
.Ss "DELAYABLE COMMANDS"
|
||||
.Ss DELAYABLE COMMANDS
|
||||
.Bl -tag -width "aaaa"
|
||||
.It "c [ lr ]"
|
||||
Circle: Have the plane circle.
|
||||
@@ -267,20 +275,24 @@ Right: Circle clockwise (default).
|
||||
.It "t [ l-r+LR ] [ dir ] or tt [ abe* ]" Em number
|
||||
Turn: Change direction.
|
||||
.Bl -tag -width "aaaaaaaaaa" -compact
|
||||
.It "t<dir>"
|
||||
.It "t\*[Lt]dir\*[Gt]"
|
||||
Turn to direction: Turn to the absolute compass heading given.
|
||||
The shortest turn will be taken.
|
||||
.It "tl [ dir ]"
|
||||
Left: Turn counterclockwise: 45 degrees by default, or the amount
|
||||
specified in <dir> (not
|
||||
specified in
|
||||
.Aq dir
|
||||
(not
|
||||
.Em to
|
||||
<dir>.) `w' (0 degrees) is no turn. `e' is 45 degrees; `q' gives -45
|
||||
degrees counterclockwise, that is, 45 degrees clockwise.
|
||||
.Aq dir . )
|
||||
`w' (0 degrees) is no turn.
|
||||
`e' is 45 degrees; `q' gives \-45 degrees counterclockwise, that is,
|
||||
45 degrees clockwise.
|
||||
.It "t- [ dir ]"
|
||||
Same as left.
|
||||
.It "tr [ dir ]"
|
||||
Right: Turn clockwise, 45 degrees by default, or the amount specified
|
||||
in <dir>.
|
||||
Right: Turn clockwise, 45 degrees by default, or the amount specified in
|
||||
.Aq dir .
|
||||
.It "t+ [ dir ]"
|
||||
Same as right.
|
||||
.It tL
|
||||
@@ -288,8 +300,8 @@ Hard left: Turn counterclockwise 90 degrees.
|
||||
.It tR
|
||||
Hard right: Turn clockwise 90 degrees.
|
||||
.It "tt [abe*]"
|
||||
Towards: Turn towards a beacon, airport or exit. The turn is
|
||||
just an estimate.
|
||||
Towards: Turn towards a beacon, airport or exit.
|
||||
The turn is just an estimate.
|
||||
.It "tta" Em number
|
||||
Turn towards the given airport.
|
||||
.It "ttb" Em number
|
||||
@@ -303,33 +315,33 @@ Same as ttb.
|
||||
.Ss THE DELAY COMMAND
|
||||
The
|
||||
.Em Delay
|
||||
(a/@)
|
||||
command may be appended to any
|
||||
(a/@) command may be appended to any
|
||||
.Em Delayable
|
||||
command. It allows the controller to instruct a plane to do an action
|
||||
when the plane reaches a particular beacon (or other objects in future
|
||||
versions).
|
||||
command.
|
||||
It allows the controller to instruct a plane to do an action when the
|
||||
plane reaches a particular beacon (or other objects in future versions).
|
||||
.Bl -tag -width "aaaa"
|
||||
.It ab Em number
|
||||
Do the delayable command when the plane reaches the specified
|
||||
beacon. The `b' for ``beacon'' is redundant to allow for expansion.
|
||||
Do the delayable command when the plane reaches the specified beacon.
|
||||
The `b' for ``beacon'' is redundant to allow for expansion.
|
||||
`@' can be used instead of `a'.
|
||||
.El
|
||||
.Ss "MARKING, UNMARKING AND IGNORING"
|
||||
.Ss MARKING, UNMARKING AND IGNORING
|
||||
Planes are
|
||||
.Em marked
|
||||
by default when they enter the arena. This means they are displayed
|
||||
in highlighted mode on the radar display. A plane may also be either
|
||||
by default when they enter the arena.
|
||||
This means they are displayed in highlighted mode on the radar display.
|
||||
A plane may also be either
|
||||
.Em unmarked
|
||||
or
|
||||
.Em ignored .
|
||||
An
|
||||
.Em ignored
|
||||
plane is drawn in unhighlighted mode, and a line of dashes is displayed in
|
||||
the command field of the information area. The plane will remain this
|
||||
way until a mark command has been issued. Any other command will be issued,
|
||||
but the command line will return to a line of dashes when the command
|
||||
is completed.
|
||||
the command field of the information area.
|
||||
The plane will remain this way until a mark command has been issued.
|
||||
Any other command will be issued, but the command line will return to a
|
||||
line of dashes when the command is completed.
|
||||
.Pp
|
||||
An
|
||||
.Em unmarked
|
||||
@@ -337,12 +349,13 @@ plane is treated the same as an
|
||||
.Em ignored
|
||||
plane, except that it will automatically switch to
|
||||
.Em marked
|
||||
status when a delayed command has been processed. This is useful if
|
||||
you want to forget about a plane for a while, but its flight path has
|
||||
not yet been completely set.
|
||||
status when a delayed command has been processed.
|
||||
This is useful if you want to forget about a plane for a while, but its
|
||||
flight path has not yet been completely set.
|
||||
.Pp
|
||||
As with all of the commands, marking, unmarking and ignoring will take effect
|
||||
at the beginning of the next update. Do not be surprised if the plane does
|
||||
at the beginning of the next update.
|
||||
Do not be surprised if the plane does
|
||||
not immediately switch to unhighlighted mode.
|
||||
.Ss EXAMPLES
|
||||
.Bl -tag -width gtte4ab2 -offset indent
|
||||
@@ -359,7 +372,7 @@ Plane S: turn to 315
|
||||
.It xi
|
||||
Plane X: ignore
|
||||
.El
|
||||
.Sh "OTHER INFORMATION"
|
||||
.Sh OTHER INFORMATION
|
||||
.Bl -bullet
|
||||
.It
|
||||
Jets move every update; prop planes move every other update.
|
||||
@@ -372,16 +385,17 @@ Planes flying at an altitude of 0 crash if they are not over an airport.
|
||||
.It
|
||||
Planes waiting at airports can only be told to take off (climb in altitude).
|
||||
.El
|
||||
.Sh "NEW GAMES"
|
||||
.Sh NEW GAMES
|
||||
The
|
||||
.Pa Game_List
|
||||
file lists the currently available play fields. New field description
|
||||
file names must be placed in this file to be playable. If a player
|
||||
specifies a game not in this file, his score will not be logged.
|
||||
file lists the currently available play fields.
|
||||
New field description file names must be placed in this file to be playable.
|
||||
If a player specifies a game not in this file, his score will not be logged.
|
||||
.Pp
|
||||
The game field description files are broken into two parts. The first
|
||||
part is the definition section. Here, the four tunable game parameters
|
||||
must be set. These variables are set with the syntax:
|
||||
The game field description files are broken into two parts.
|
||||
The first part is the definition section.
|
||||
Here, the four tunable game parameters must be set.
|
||||
These variables are set with the syntax:
|
||||
.Pp
|
||||
.Dl "variable = number;"
|
||||
.Pp
|
||||
@@ -412,32 +426,32 @@ The syntax is as follows:
|
||||
.El
|
||||
.Ed
|
||||
.Pp
|
||||
For beacons, a simple x, y coordinate pair is used (enclosed in
|
||||
parenthesis). Airports and exits require a third value, which is one
|
||||
of the directions
|
||||
For beacons, a simple x, y coordinate pair is used (enclosed in parenthesis).
|
||||
Airports and exits require a third value, which is one of the directions
|
||||
.Em wedcxzaq .
|
||||
For airports, this is the direction that planes must be going to take
|
||||
off and land, and for exits, this is the direction that planes will going
|
||||
when they
|
||||
.Em enter
|
||||
the arena. This may not seem intuitive, but as there is no restriction on
|
||||
the arena.
|
||||
This may not seem intuitive, but as there is no restriction on
|
||||
direction of exit, this is appropriate.
|
||||
Lines are slightly different, since they need two coordinate pairs to
|
||||
specify the line endpoints. These endpoints must be enclosed in
|
||||
square brackets.
|
||||
specify the line endpoints.
|
||||
These endpoints must be enclosed in square brackets.
|
||||
.Pp
|
||||
All statements are semi-colon (;) terminated. Multiple item statements
|
||||
accumulate. Each definition must occur exactly once, before any
|
||||
item statements. Comments begin with a hash (#) symbol
|
||||
and terminate with a newline.
|
||||
The coordinates are between zero and width-1 and height-1
|
||||
inclusive. All of the exit coordinates must lie on the borders, and
|
||||
All statements are semi-colon (;) terminated.
|
||||
Multiple item statements accumulate.
|
||||
Each definition must occur exactly once, before any item statements.
|
||||
Comments begin with a hash (#) symbol and terminate with a newline.
|
||||
The coordinates are between zero and width-1 and height-1 inclusive.
|
||||
All of the exit coordinates must lie on the borders, and
|
||||
all of the beacons and airports must lie inside of the borders.
|
||||
Line endpoints may be anywhere within the field, so long as
|
||||
the lines are horizontal, vertical or
|
||||
.Em exactly
|
||||
diagonal.
|
||||
.Ss "FIELD FILE EXAMPLE"
|
||||
.Ss FIELD FILE EXAMPLE
|
||||
.Bd -literal
|
||||
# This is the default game.
|
||||
|
||||
@@ -465,14 +479,16 @@ line: [ ( 1 1 ) ( 6 6 ) ]
|
||||
|
||||
.Ed
|
||||
.Sh FILES
|
||||
Files are kept in a special directory. See the OPTIONS for a way to
|
||||
print this path out. It is normally
|
||||
Files are kept in a special directory.
|
||||
See the
|
||||
.Sx OPTIONS
|
||||
section for a way to print this path out.
|
||||
It is normally
|
||||
.Pa @atc_dir@ .
|
||||
.Pp
|
||||
This directory contains the file
|
||||
.Pa Game_List ,
|
||||
which holds the list of playable games, as well as the games
|
||||
themselves.
|
||||
which holds the list of playable games, as well as the games themselves.
|
||||
.Pp
|
||||
The scores are kept in
|
||||
.Pa @atc_scorefile@ .
|
||||
@@ -483,8 +499,3 @@ This game is based on someone's description of the overall flavor
|
||||
of a game written for some unknown PC many years ago, maybe.
|
||||
.Sh BUGS
|
||||
The screen sometimes refreshes after you have quit.
|
||||
.Pp
|
||||
Yet Another Curses Bug was discovered during the development of this game.
|
||||
If your curses library clrtobot.o is version 5.1 or earlier,
|
||||
you will have erase problems with the backspace operator in the input
|
||||
window.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.16 2000/05/08 07:56:01 mycroft Exp $ */
|
||||
/* $NetBSD: main.c,v 1.17 2001/09/18 18:15:49 wiz Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1980, 1993
|
||||
@@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.16 2000/05/08 07:56:01 mycroft Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.17 2001/09/18 18:15:49 wiz Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@@ -270,7 +270,7 @@ main(argc, argv)
|
||||
cturn = -1;
|
||||
}
|
||||
}
|
||||
/* initalize variables according to whose turn it is */
|
||||
/* initialize variables according to whose turn it is */
|
||||
|
||||
if (cturn == 1) { /* red */
|
||||
home = 25;
|
||||
|
||||
@@ -1,266 +0,0 @@
|
||||
/* $NetBSD: com1.c,v 1.6 1997/10/11 02:06:58 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)com1.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: com1.c,v 1.6 1997/10/11 02:06:58 lukem Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
int
|
||||
move(thataway, token)
|
||||
int thataway, token;
|
||||
{
|
||||
wordnumber++;
|
||||
if ((!notes[CANTMOVE] && !notes[LAUNCHED]) ||
|
||||
testbit(location[position].objects, LAND) ||
|
||||
(fuel > 0 && notes[LAUNCHED]))
|
||||
if (thataway) {
|
||||
position = thataway;
|
||||
newway(token);
|
||||
ourtime++;
|
||||
} else {
|
||||
puts("You can't go this way.");
|
||||
newway(token);
|
||||
whichway(location[position]);
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
if (notes[CANTMOVE] && !notes[LAUNCHED])
|
||||
puts("You aren't able to move; you better drop something.");
|
||||
else
|
||||
puts("You are out of fuel; now you will rot in space forever!");
|
||||
return (1);
|
||||
}
|
||||
|
||||
void
|
||||
convert(tothis) /* Converts day to night and vice versa. */
|
||||
int tothis; /* Day objects are permanent. Night objects
|
||||
* are added */
|
||||
{ /* at dusk, and subtracted at dawn. */
|
||||
const struct objs *p;
|
||||
unsigned int i, j;
|
||||
|
||||
if (tothis == TONIGHT) {
|
||||
for (i = 1; i <= NUMOFROOMS; i++)
|
||||
for (j = 0; j < NUMOFWORDS; j++)
|
||||
nightfile[i].objects[j] = dayfile[i].objects[j];
|
||||
for (p = nightobjs; p->room != 0; p++)
|
||||
setbit(nightfile[p->room].objects, p->obj);
|
||||
location = nightfile;
|
||||
} else {
|
||||
for (i = 1; i <= NUMOFROOMS; i++)
|
||||
for (j = 0; j < NUMOFWORDS; j++)
|
||||
dayfile[i].objects[j] = nightfile[i].objects[j];
|
||||
for (p = nightobjs; p->room != 0; p++)
|
||||
clearbit(dayfile[p->room].objects, p->obj);
|
||||
location = dayfile;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
news()
|
||||
{
|
||||
int n;
|
||||
int hurt;
|
||||
|
||||
if (ourtime > 30 && position < 32) {
|
||||
puts("An explosion of shuddering magnitude splinters bulkheads and");
|
||||
puts("ruptures the battlestar's hull. You are sucked out into the");
|
||||
puts("frozen void of space and killed.");
|
||||
die();
|
||||
}
|
||||
if (ourtime > 20 && position < 32)
|
||||
puts("Explosions rock the battlestar.");
|
||||
if (ourtime > snooze) {
|
||||
puts("You drop from exhaustion...");
|
||||
zzz();
|
||||
}
|
||||
if (ourtime > snooze - 5)
|
||||
puts("You're getting tired.");
|
||||
if (ourtime > (rythmn + CYCLE)) {
|
||||
if (location == nightfile) {
|
||||
convert(TODAY);
|
||||
if (OUTSIDE && ourtime - rythmn - CYCLE < 10) {
|
||||
puts("Dew lit sunbeams stretch out from a watery sunrise and herald the dawn.");
|
||||
puts("You awake from a misty dream-world into stark reality.");
|
||||
puts("It is day.");
|
||||
}
|
||||
} else {
|
||||
convert(TONIGHT);
|
||||
clearbit(location[POOLS].objects, BATHGOD);
|
||||
if (OUTSIDE && ourtime - rythmn - CYCLE < 10) {
|
||||
puts("The dying sun sinks into the ocean, leaving a blood stained sunset.");
|
||||
puts("The sky slowly fades from orange to violet to black. A few stars");
|
||||
puts("flicker on, and it is night.");
|
||||
puts("The world seems completly different at night.");
|
||||
}
|
||||
}
|
||||
rythmn = ourtime - ourtime % CYCLE;
|
||||
}
|
||||
if (!wiz && !tempwiz)
|
||||
if ((testbit(inven, TALISMAN) || testbit(wear, TALISMAN)) && (testbit(inven, MEDALION) || testbit(wear, MEDALION)) && (testbit(inven, AMULET) || testbit(wear, AMULET))) {
|
||||
tempwiz = 1;
|
||||
puts("The three amulets glow and reenforce each other in power.\nYou are now a wizard.");
|
||||
}
|
||||
if (testbit(location[position].objects, ELF)) {
|
||||
printf("%s\n", objdes[ELF]);
|
||||
fight(ELF, rnd(30));
|
||||
}
|
||||
if (testbit(location[position].objects, DARK)) {
|
||||
printf("%s\n", objdes[DARK]);
|
||||
fight(DARK, 100);
|
||||
}
|
||||
if (testbit(location[position].objects, WOODSMAN)) {
|
||||
printf("%s\n", objdes[WOODSMAN]);
|
||||
fight(WOODSMAN, 50);
|
||||
}
|
||||
switch (position) {
|
||||
|
||||
case 267:
|
||||
case 257: /* entering a cave */
|
||||
case 274:
|
||||
case 246:
|
||||
notes[CANTSEE] = 1;
|
||||
break;
|
||||
case 160:
|
||||
case 216: /* leaving a cave */
|
||||
case 230:
|
||||
case 231:
|
||||
case 232:
|
||||
notes[CANTSEE] = 0;
|
||||
break;
|
||||
}
|
||||
if (testbit(location[position].objects, GIRL))
|
||||
meetgirl = 1;
|
||||
if (meetgirl && CYCLE * 1.5 - ourtime < 10) {
|
||||
setbit(location[GARDEN].objects, GIRLTALK);
|
||||
setbit(location[GARDEN].objects, LAMPON);
|
||||
setbit(location[GARDEN].objects, ROPE);
|
||||
}
|
||||
if (position == DOCK && (beenthere[position] || ourtime > CYCLE)) {
|
||||
clearbit(location[DOCK].objects, GIRL);
|
||||
clearbit(location[DOCK].objects, MAN);
|
||||
}
|
||||
if (meetgirl && ourtime - CYCLE * 1.5 > 10) {
|
||||
clearbit(location[GARDEN].objects, GIRLTALK);
|
||||
clearbit(location[GARDEN].objects, LAMPON);
|
||||
clearbit(location[GARDEN].objects, ROPE);
|
||||
meetgirl = 0;
|
||||
}
|
||||
if (testbit(location[position].objects, CYLON)) {
|
||||
puts("Oh my God, you're being shot at by an alien spacecraft!");
|
||||
printf("The targeting computer says we have %d seconds to attack!\n",
|
||||
ourclock);
|
||||
fflush(stdout);
|
||||
sleep(1);
|
||||
if (!visual()) {
|
||||
hurt = rnd(NUMOFINJURIES);
|
||||
injuries[hurt] = 1;
|
||||
puts("Laser blasts sear the cockpit, and the alien veers off in a victory roll.");
|
||||
puts("The viper shudders under a terrible explosion.");
|
||||
printf("I'm afraid you have suffered %s.\n", ouch[hurt]);
|
||||
} else
|
||||
clearbit(location[position].objects, CYLON);
|
||||
}
|
||||
if (injuries[SKULL] && injuries[INCISE] && injuries[NECK]) {
|
||||
puts("I'm afraid you have suffered fatal injuries.");
|
||||
die();
|
||||
}
|
||||
for (n = 0; n < NUMOFINJURIES; n++)
|
||||
if (injuries[n] == 1) {
|
||||
injuries[n] = 2;
|
||||
if (WEIGHT > 5)
|
||||
WEIGHT -= 5;
|
||||
else
|
||||
WEIGHT = 0;
|
||||
}
|
||||
if (injuries[ARM] == 2) {
|
||||
CUMBER -= 5;
|
||||
injuries[ARM]++;
|
||||
}
|
||||
if (injuries[RIBS] == 2) {
|
||||
CUMBER -= 2;
|
||||
injuries[RIBS]++;
|
||||
}
|
||||
if (injuries[SPINE] == 2) {
|
||||
WEIGHT = 0;
|
||||
injuries[SPINE]++;
|
||||
}
|
||||
if (carrying > WEIGHT || encumber > CUMBER)
|
||||
notes[CANTMOVE] = 1;
|
||||
else
|
||||
notes[CANTMOVE] = 0;
|
||||
}
|
||||
|
||||
void
|
||||
crash()
|
||||
{
|
||||
int hurt1, hurt2;
|
||||
|
||||
fuel--;
|
||||
if (!location[position].flyhere ||
|
||||
(testbit(location[position].objects, LAND) && fuel <= 0)) {
|
||||
if (!location[position].flyhere)
|
||||
puts("You're flying too low. We're going to crash!");
|
||||
else {
|
||||
puts("You're out of fuel. We'll have to crash land!");
|
||||
if (!location[position].down) {
|
||||
puts("Your viper strikes the ground and explodes into firey fragments.");
|
||||
puts("Thick black smoke billows up from the wreckage.");
|
||||
die();
|
||||
}
|
||||
position = location[position].down;
|
||||
}
|
||||
notes[LAUNCHED] = 0;
|
||||
setbit(location[position].objects, CRASH);
|
||||
ourtime += rnd(CYCLE / 4);
|
||||
puts("The viper explodes into the ground and you lose consciousness...");
|
||||
zzz();
|
||||
hurt1 = rnd(NUMOFINJURIES - 2) + 2;
|
||||
hurt2 = rnd(NUMOFINJURIES - 2) + 2;
|
||||
injuries[hurt1] = 1;
|
||||
injuries[hurt2] = 1;
|
||||
injuries[0] = 1;/* abrasions */
|
||||
injuries[1] = 1;/* lacerations */
|
||||
printf("I'm afraid you have suffered %s and %s.\n",
|
||||
ouch[hurt1], ouch[hurt2]);
|
||||
}
|
||||
}
|
||||
@@ -1,353 +0,0 @@
|
||||
/* $NetBSD: com2.c,v 1.22 2001/06/02 17:30:28 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)com2.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: com2.c,v 1.22 2001/06/02 17:30:28 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
int
|
||||
wearit()
|
||||
{ /* synonyms = {sheathe, sheath} */
|
||||
int firstnumber, value;
|
||||
|
||||
firstnumber = wordnumber;
|
||||
wordnumber++;
|
||||
while (wordnumber <= wordcount && (wordtype[wordnumber] == OBJECT ||
|
||||
wordtype[wordnumber] == NOUNS) && wordvalue[wordnumber] != DOOR) {
|
||||
value = wordvalue[wordnumber];
|
||||
if (value >= 0 && objsht[value] == NULL)
|
||||
break;
|
||||
switch (value) {
|
||||
|
||||
case -1:
|
||||
puts("Wear what?");
|
||||
return (firstnumber);
|
||||
|
||||
default:
|
||||
printf("You can't wear %s%s!\n",
|
||||
A_OR_AN_OR_BLANK(value), objsht[value]);
|
||||
return (firstnumber);
|
||||
|
||||
case KNIFE:
|
||||
/* case SHIRT: */
|
||||
case ROBE:
|
||||
case LEVIS: /* wearable things */
|
||||
case SWORD:
|
||||
case MAIL:
|
||||
case HELM:
|
||||
case SHOES:
|
||||
case PAJAMAS:
|
||||
case COMPASS:
|
||||
case LASER:
|
||||
case AMULET:
|
||||
case TALISMAN:
|
||||
case MEDALION:
|
||||
case ROPE:
|
||||
case RING:
|
||||
case BRACELET:
|
||||
case GRENADE:
|
||||
|
||||
if (testbit(inven, value)) {
|
||||
clearbit(inven, value);
|
||||
setbit(wear, value);
|
||||
carrying -= objwt[value];
|
||||
encumber -= objcumber[value];
|
||||
ourtime++;
|
||||
printf("You are now wearing %s%s.\n",
|
||||
A_OR_AN_OR_THE(value), objsht[value]);
|
||||
} else
|
||||
if (testbit(wear, value))
|
||||
printf("You are already wearing the %s.\n",
|
||||
objsht[value]);
|
||||
else
|
||||
printf("You aren't holding the %s.\n",
|
||||
objsht[value]);
|
||||
if (wordnumber < wordcount - 1 &&
|
||||
wordvalue[++wordnumber] == AND)
|
||||
wordnumber++;
|
||||
else
|
||||
return (firstnumber);
|
||||
} /* end switch */
|
||||
} /* end while */
|
||||
puts("Don't be ridiculous.");
|
||||
return (firstnumber);
|
||||
}
|
||||
|
||||
int
|
||||
put()
|
||||
{ /* synonyms = {buckle, strap, tie} */
|
||||
if (wordvalue[wordnumber + 1] == ON) {
|
||||
wordvalue[++wordnumber] = PUTON;
|
||||
wordtype[wordnumber] = VERB;
|
||||
return (cypher());
|
||||
}
|
||||
if (wordvalue[wordnumber + 1] == DOWN) {
|
||||
wordvalue[++wordnumber] = DROP;
|
||||
wordtype[wordnumber] = VERB;
|
||||
return (cypher());
|
||||
}
|
||||
puts("I don't understand what you want to put.");
|
||||
return (-1);
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
draw()
|
||||
{ /* synonyms = {pull, carry} */
|
||||
return (take(wear));
|
||||
}
|
||||
|
||||
int
|
||||
use()
|
||||
{
|
||||
wordnumber++;
|
||||
if (wordvalue[wordnumber] == AMULET && testbit(inven, AMULET) &&
|
||||
position != FINAL) {
|
||||
puts("The amulet begins to glow.");
|
||||
if (testbit(inven, MEDALION)) {
|
||||
puts("The medallion comes to life too.");
|
||||
if (position == 114) {
|
||||
location[position].down = 160;
|
||||
whichway(location[position]);
|
||||
puts("The waves subside and it is possible to descend to the sea cave now.");
|
||||
ourtime++;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
puts("A light mist falls over your eyes and the sound of purling water trickles in");
|
||||
puts("your ears. When the mist lifts you are standing beside a cool stream.");
|
||||
if (position == 229)
|
||||
position = 224;
|
||||
else
|
||||
position = 229;
|
||||
ourtime++;
|
||||
notes[CANTSEE] = 0;
|
||||
return (0);
|
||||
} else if (position == FINAL)
|
||||
puts("The amulet won't work in here.");
|
||||
else if (wordvalue[wordnumber] == COMPASS && testbit(inven, COMPASS))
|
||||
printf("Your compass points %s.\n", truedirec(NORTH, '-'));
|
||||
else if (wordvalue[wordnumber] == COMPASS)
|
||||
puts("You aren't holding the compass.");
|
||||
else if (wordvalue[wordnumber] == AMULET)
|
||||
puts("You aren't holding the amulet.");
|
||||
else
|
||||
puts("There is no apparent use.");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
void
|
||||
murder()
|
||||
{
|
||||
int n;
|
||||
|
||||
for (n = 0; !((n == SWORD || n == KNIFE || n == TWO_HANDED || n == MACE || n == CLEAVER || n == BROAD || n == CHAIN || n == SHOVEL || n == HALBERD) && testbit(inven, n)) && n < NUMOFOBJECTS; n++);
|
||||
if (n == NUMOFOBJECTS) {
|
||||
if (testbit(inven, LASER)) {
|
||||
printf("Your laser should do the trick.\n");
|
||||
wordnumber++;
|
||||
switch(wordvalue[wordnumber]) {
|
||||
case NORMGOD:
|
||||
case TIMER:
|
||||
case NATIVE:
|
||||
case MAN:
|
||||
wordvalue[--wordnumber] = SHOOT;
|
||||
cypher();
|
||||
break;
|
||||
case -1:
|
||||
puts("Kill what?");
|
||||
break;
|
||||
default:
|
||||
if (wordtype[wordnumber] != OBJECT ||
|
||||
wordvalue[wordnumber] == EVERYTHING)
|
||||
puts("You can't kill that!");
|
||||
else
|
||||
printf("You can't kill %s%s!\n",
|
||||
A_OR_AN_OR_BLANK(wordvalue[wordnumber]),
|
||||
objsht[wordvalue[wordnumber]]);
|
||||
break;
|
||||
}
|
||||
} else
|
||||
puts("You don't have suitable weapons to kill.");
|
||||
} else {
|
||||
printf("Your %s should do the trick.\n", objsht[n]);
|
||||
wordnumber++;
|
||||
switch (wordvalue[wordnumber]) {
|
||||
|
||||
case NORMGOD:
|
||||
if (testbit(location[position].objects, BATHGOD)) {
|
||||
puts("The goddess's head slices off. Her corpse floats in the water.");
|
||||
clearbit(location[position].objects, BATHGOD);
|
||||
setbit(location[position].objects, DEADGOD);
|
||||
power += 5;
|
||||
notes[JINXED]++;
|
||||
} else
|
||||
if (testbit(location[position].objects, NORMGOD)) {
|
||||
puts("The goddess pleads but you strike her mercilessly. Her broken body lies in a\npool of blood.");
|
||||
clearbit(location[position].objects, NORMGOD);
|
||||
setbit(location[position].objects, DEADGOD);
|
||||
power += 5;
|
||||
notes[JINXED]++;
|
||||
if (wintime)
|
||||
live();
|
||||
} else
|
||||
puts("I don't see her anywhere.");
|
||||
break;
|
||||
case TIMER:
|
||||
if (testbit(location[position].objects, TIMER)) {
|
||||
puts("The old man offers no resistance.");
|
||||
clearbit(location[position].objects, TIMER);
|
||||
setbit(location[position].objects, DEADTIME);
|
||||
power++;
|
||||
notes[JINXED]++;
|
||||
} else
|
||||
puts("Who?");
|
||||
break;
|
||||
case NATIVE:
|
||||
if (testbit(location[position].objects, NATIVE)) {
|
||||
puts("The girl screams as you cut her body to shreds. She is dead.");
|
||||
clearbit(location[position].objects, NATIVE);
|
||||
setbit(location[position].objects, DEADNATIVE);
|
||||
power += 5;
|
||||
notes[JINXED]++;
|
||||
} else
|
||||
puts("What girl?");
|
||||
break;
|
||||
case MAN:
|
||||
if (testbit(location[position].objects, MAN)) {
|
||||
puts("You strike him to the ground, and he coughs up blood.");
|
||||
puts("Your fantasy is over.");
|
||||
die();
|
||||
}
|
||||
case -1:
|
||||
puts("Kill what?");
|
||||
break;
|
||||
|
||||
default:
|
||||
if (wordtype[wordnumber] != OBJECT ||
|
||||
wordvalue[wordnumber] == EVERYTHING)
|
||||
puts("You can't kill that!");
|
||||
else
|
||||
printf("You can't kill the %s!\n",
|
||||
objsht[wordvalue[wordnumber]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ravage()
|
||||
{
|
||||
while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
|
||||
continue;
|
||||
if (wordtype[wordnumber] == NOUNS && (testbit(location[position].objects, wordvalue[wordnumber])
|
||||
|| (wordvalue[wordnumber] == NORMGOD && testbit(location[position].objects, BATHGOD)))) {
|
||||
ourtime++;
|
||||
switch (wordvalue[wordnumber]) {
|
||||
case NORMGOD:
|
||||
puts("You attack the goddess, and she screams as you beat her. She falls down");
|
||||
if (testbit(location[position].objects, BATHGOD))
|
||||
puts("crying and tries to cover her nakedness.");
|
||||
else
|
||||
puts("crying and tries to hold her torn and bloodied dress around her.");
|
||||
power += 5;
|
||||
pleasure += 8;
|
||||
ego -= 10;
|
||||
wordnumber--;
|
||||
godready = -30000;
|
||||
murder();
|
||||
win = -30000;
|
||||
break;
|
||||
case NATIVE:
|
||||
puts("The girl tries to run, but you catch her and throw her down. Her face is");
|
||||
puts("bleeding, and she screams as you tear off her clothes.");
|
||||
power += 3;
|
||||
pleasure += 5;
|
||||
ego -= 10;
|
||||
wordnumber--;
|
||||
murder();
|
||||
if (rnd(100) < 50) {
|
||||
puts("Her screams have attracted attention. I think we are surrounded.");
|
||||
setbit(location[ahead].objects, WOODSMAN);
|
||||
setbit(location[ahead].objects, DEADWOOD);
|
||||
setbit(location[ahead].objects, MALLET);
|
||||
setbit(location[back].objects, WOODSMAN);
|
||||
setbit(location[back].objects, DEADWOOD);
|
||||
setbit(location[back].objects, MALLET);
|
||||
setbit(location[left].objects, WOODSMAN);
|
||||
setbit(location[left].objects, DEADWOOD);
|
||||
setbit(location[left].objects, MALLET);
|
||||
setbit(location[right].objects, WOODSMAN);
|
||||
setbit(location[right].objects, DEADWOOD);
|
||||
setbit(location[right].objects, MALLET);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
puts("You are perverted.");
|
||||
}
|
||||
} else
|
||||
puts("Who?");
|
||||
}
|
||||
|
||||
int
|
||||
follow()
|
||||
{
|
||||
if (followfight == ourtime) {
|
||||
puts("The Dark Lord leaps away and runs down secret tunnels and corridors.");
|
||||
puts("You chase him through the darkness and splash in pools of water.");
|
||||
puts("You have cornered him. His laser sword extends as he steps forward.");
|
||||
position = FINAL;
|
||||
fight(DARK, 75);
|
||||
setbit(location[position].objects, TALISMAN);
|
||||
setbit(location[position].objects, AMULET);
|
||||
return (0);
|
||||
} else
|
||||
if (followgod == ourtime) {
|
||||
puts("The goddess leads you down a steamy tunnel and into a high, wide chamber.");
|
||||
puts("She sits down on a throne.");
|
||||
position = 268;
|
||||
setbit(location[position].objects, NORMGOD);
|
||||
notes[CANTSEE] = 1;
|
||||
return (0);
|
||||
} else
|
||||
puts("There is no one to follow.");
|
||||
return (-1);
|
||||
}
|
||||
@@ -1,321 +0,0 @@
|
||||
/* $NetBSD: com3.c,v 1.7 1998/08/24 00:19:25 hubertf Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)com3.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: com3.c,v 1.7 1998/08/24 00:19:25 hubertf Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
void
|
||||
dig()
|
||||
{
|
||||
if (testbit(inven, SHOVEL)) {
|
||||
puts("OK");
|
||||
ourtime++;
|
||||
switch (position) {
|
||||
case 144: /* copse near beach */
|
||||
if (!notes[DUG]) {
|
||||
setbit(location[position].objects, DEADWOOD);
|
||||
setbit(location[position].objects, COMPASS);
|
||||
setbit(location[position].objects, KNIFE);
|
||||
setbit(location[position].objects, MACE);
|
||||
notes[DUG] = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
puts("Nothing happens.");
|
||||
}
|
||||
} else
|
||||
puts("You don't have a shovel.");
|
||||
}
|
||||
|
||||
int
|
||||
jump()
|
||||
{
|
||||
int n;
|
||||
|
||||
switch (position) {
|
||||
default:
|
||||
puts("Nothing happens.");
|
||||
return (-1);
|
||||
|
||||
case 242:
|
||||
position = 133;
|
||||
break;
|
||||
case 214:
|
||||
case 215:
|
||||
case 162:
|
||||
case 159:
|
||||
position = 145;
|
||||
break;
|
||||
case 232:
|
||||
position = 275;
|
||||
break;
|
||||
case 3:
|
||||
position = 1;
|
||||
break;
|
||||
case 172:
|
||||
position = 201;
|
||||
}
|
||||
puts("Ahhhhhhh...");
|
||||
injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
|
||||
for (n = 0; n < NUMOFOBJECTS; n++)
|
||||
if (testbit(inven, n)) {
|
||||
clearbit(inven, n);
|
||||
setbit(location[position].objects, n);
|
||||
}
|
||||
carrying = 0;
|
||||
encumber = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
bury()
|
||||
{
|
||||
int value;
|
||||
|
||||
if (testbit(inven, SHOVEL)) {
|
||||
while (wordtype[++wordnumber] != OBJECT && wordtype[wordnumber] != NOUNS && wordnumber < wordcount);
|
||||
value = wordvalue[wordnumber];
|
||||
if (wordtype[wordnumber] == NOUNS && (testbit(location[position].objects, value) || value == BODY))
|
||||
switch (value) {
|
||||
case BODY:
|
||||
wordtype[wordnumber] = OBJECT;
|
||||
if (testbit(inven, MAID) || testbit(location[position].objects, MAID))
|
||||
value = MAID;
|
||||
if (testbit(inven, DEADWOOD) || testbit(location[position].objects, DEADWOOD))
|
||||
value = DEADWOOD;
|
||||
if (testbit(inven, DEADGOD) || testbit(location[position].objects, DEADGOD))
|
||||
value = DEADGOD;
|
||||
if (testbit(inven, DEADTIME) || testbit(location[position].objects, DEADTIME))
|
||||
value = DEADTIME;
|
||||
if (testbit(inven, DEADNATIVE) || testbit(location[position].objects, DEADNATIVE))
|
||||
value = DEADNATIVE;
|
||||
break;
|
||||
|
||||
case NATIVE:
|
||||
case NORMGOD:
|
||||
puts("She screams as you wrestle her into the hole.");
|
||||
case TIMER:
|
||||
power += 7;
|
||||
ego -= 10;
|
||||
case AMULET:
|
||||
case MEDALION:
|
||||
case TALISMAN:
|
||||
wordtype[wordnumber] = OBJECT;
|
||||
break;
|
||||
|
||||
default:
|
||||
puts("Wha..?");
|
||||
}
|
||||
if (wordtype[wordnumber] == OBJECT && position > 88 && (testbit(inven, value) || testbit(location[position].objects, value))) {
|
||||
puts("Buried.");
|
||||
if (testbit(inven, value)) {
|
||||
clearbit(inven, value);
|
||||
carrying -= objwt[value];
|
||||
encumber -= objcumber[value];
|
||||
}
|
||||
clearbit(location[position].objects, value);
|
||||
switch (value) {
|
||||
case MAID:
|
||||
case DEADWOOD:
|
||||
case DEADNATIVE:
|
||||
case DEADTIME:
|
||||
case DEADGOD:
|
||||
ego += 2;
|
||||
printf("The %s should rest easier now.\n", objsht[value]);
|
||||
}
|
||||
} else
|
||||
puts("It doesn't seem to work.");
|
||||
} else
|
||||
puts("You aren't holding a shovel.");
|
||||
}
|
||||
|
||||
void
|
||||
drink()
|
||||
{
|
||||
int n;
|
||||
|
||||
if (testbit(inven, POTION)) {
|
||||
puts("The cool liquid runs down your throat but turns to fire and you choke.");
|
||||
puts("The heat reaches your limbs and tingles your spirit. You feel like falling");
|
||||
puts("asleep.");
|
||||
clearbit(inven, POTION);
|
||||
WEIGHT = MAXWEIGHT;
|
||||
CUMBER = MAXCUMBER;
|
||||
for (n = 0; n < NUMOFINJURIES; n++)
|
||||
injuries[n] = 0;
|
||||
ourtime++;
|
||||
zzz();
|
||||
} else
|
||||
puts("I'm not thirsty.");
|
||||
}
|
||||
|
||||
int
|
||||
shoot()
|
||||
{
|
||||
int firstnumber, value;
|
||||
int n;
|
||||
|
||||
firstnumber = wordnumber;
|
||||
if (!testbit(inven, LASER))
|
||||
puts("You aren't holding a blaster.");
|
||||
else {
|
||||
while (wordtype[++wordnumber] == ADJS);
|
||||
while (wordnumber <= wordcount && wordtype[wordnumber] == OBJECT) {
|
||||
value = wordvalue[wordnumber];
|
||||
printf("%s:\n", objsht[value]);
|
||||
for (n = 0; objsht[value][n]; n++);
|
||||
if (testbit(location[position].objects, value)) {
|
||||
clearbit(location[position].objects, value);
|
||||
ourtime++;
|
||||
printf("The %s explode%s\n", objsht[value], (objsht[value][n - 1] == 's' ? (objsht[value][n - 2] == 's' ? "s." : ".") : "s."));
|
||||
if (value == BOMB)
|
||||
die();
|
||||
} else
|
||||
printf("I dont see any %s around here.\n", objsht[value]);
|
||||
if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
|
||||
wordnumber++;
|
||||
else
|
||||
return (firstnumber);
|
||||
}
|
||||
/* special cases with their own return()'s */
|
||||
|
||||
if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
|
||||
ourtime++;
|
||||
switch (wordvalue[wordnumber]) {
|
||||
|
||||
case DOOR:
|
||||
switch (position) {
|
||||
case 189:
|
||||
case 231:
|
||||
puts("The door is unhinged.");
|
||||
location[189].north = 231;
|
||||
location[231].south = 189;
|
||||
whichway(location[position]);
|
||||
break;
|
||||
case 30:
|
||||
puts("The wooden door splinters.");
|
||||
location[30].west = 25;
|
||||
whichway(location[position]);
|
||||
break;
|
||||
case 31:
|
||||
puts("The laser blast has no effect on the door.");
|
||||
break;
|
||||
case 20:
|
||||
puts("The blast hits the door and it explodes into flame. The magnesium burns");
|
||||
puts("so rapidly that we have no chance to escape.");
|
||||
die();
|
||||
default:
|
||||
puts("Nothing happens.");
|
||||
}
|
||||
break;
|
||||
|
||||
case NORMGOD:
|
||||
if (testbit(location[position].objects, BATHGOD)) {
|
||||
puts("The goddess is hit in the chest and splashes back against the rocks.");
|
||||
puts("Dark blood oozes from the charred blast hole. Her naked body floats in the");
|
||||
puts("pools and then off downstream.");
|
||||
clearbit(location[position].objects, BATHGOD);
|
||||
setbit(location[180].objects, DEADGOD);
|
||||
power += 5;
|
||||
ego -= 10;
|
||||
notes[JINXED]++;
|
||||
} else
|
||||
if (testbit(location[position].objects, NORMGOD)) {
|
||||
puts("The blast catches the goddess in the stomach, knocking her to the ground.");
|
||||
puts("She writhes in the dirt as the agony of death taunts her.");
|
||||
puts("She has stopped moving.");
|
||||
clearbit(location[position].objects, NORMGOD);
|
||||
setbit(location[position].objects, DEADGOD);
|
||||
power += 5;
|
||||
ego -= 10;
|
||||
notes[JINXED]++;
|
||||
if (wintime)
|
||||
live();
|
||||
break;
|
||||
} else
|
||||
puts("I don't see any goddess around here.");
|
||||
break;
|
||||
|
||||
case TIMER:
|
||||
if (testbit(location[position].objects, TIMER)) {
|
||||
puts("The old man slumps over the bar.");
|
||||
power++;
|
||||
ego -= 2;
|
||||
notes[JINXED]++;
|
||||
clearbit(location[position].objects, TIMER);
|
||||
setbit(location[position].objects, DEADTIME);
|
||||
} else
|
||||
puts("What old timer?");
|
||||
break;
|
||||
case MAN:
|
||||
if (testbit(location[position].objects, MAN)) {
|
||||
puts("The man falls to the ground with blood pouring all over his white suit.");
|
||||
puts("Your fantasy is over.");
|
||||
die();
|
||||
} else
|
||||
puts("What man?");
|
||||
break;
|
||||
case NATIVE:
|
||||
if (testbit(location[position].objects, NATIVE)) {
|
||||
puts("The girl is blown backwards several feet and lies in a pool of blood.");
|
||||
clearbit(location[position].objects, NATIVE);
|
||||
setbit(location[position].objects, DEADNATIVE);
|
||||
power += 5;
|
||||
ego -= 2;
|
||||
notes[JINXED]++;
|
||||
} else
|
||||
puts("There is no girl here.");
|
||||
break;
|
||||
case -1:
|
||||
puts("Shoot what?");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("You can't shoot the %s.\n", objsht[wordvalue[wordnumber]]);
|
||||
}
|
||||
} else
|
||||
puts("You must be a looney.");
|
||||
}
|
||||
return (firstnumber);
|
||||
}
|
||||
@@ -1,395 +0,0 @@
|
||||
/* $NetBSD: com4.c,v 1.6 1997/10/11 02:07:04 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)com4.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: com4.c,v 1.6 1997/10/11 02:07:04 lukem Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
int
|
||||
take(from)
|
||||
unsigned int from[];
|
||||
{
|
||||
int firstnumber, heavy, bulky, value;
|
||||
int n;
|
||||
|
||||
firstnumber = wordnumber;
|
||||
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == OFF) {
|
||||
wordnumber++;
|
||||
wordvalue[wordnumber] = TAKEOFF;
|
||||
return (cypher());
|
||||
} else {
|
||||
while (wordtype[++wordnumber] == ADJS);
|
||||
while (wordnumber <= wordcount && wordtype[wordnumber] == OBJECT) {
|
||||
value = wordvalue[wordnumber];
|
||||
printf("%s:\n", objsht[value]);
|
||||
for (n = 0; objsht[value][n]; n++);
|
||||
heavy = (carrying + objwt[value]) <= WEIGHT;
|
||||
bulky = (encumber + objcumber[value]) <= CUMBER;
|
||||
if ((testbit(from, value) || wiz || tempwiz) && heavy && bulky && !testbit(inven, value)) {
|
||||
setbit(inven, value);
|
||||
carrying += objwt[value];
|
||||
encumber += objcumber[value];
|
||||
ourtime++;
|
||||
if (testbit(from, value))
|
||||
printf("Taken.\n");
|
||||
else
|
||||
printf("Zap! Taken from thin air.\n");
|
||||
clearbit(from, value);
|
||||
if (value == MEDALION)
|
||||
win--;
|
||||
} else
|
||||
if (testbit(inven, value))
|
||||
printf("You're already holding%s%s.\n", (objsht[value][n - 1] == 's' ? " " : " a "), objsht[value]);
|
||||
else
|
||||
if (!heavy)
|
||||
printf("The %s %s too heavy.\n", objsht[value], (objsht[value][n - 1] == 's' ? "are" : "is"));
|
||||
else
|
||||
if (!bulky)
|
||||
printf("The %s %s too cumbersome to hold.\n", objsht[value], (objsht[value][n - 1] == 's' ? "are" : "is"));
|
||||
else
|
||||
printf("I dont see any %s around here.\n", objsht[value]);
|
||||
if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
|
||||
wordnumber++;
|
||||
else
|
||||
return (firstnumber);
|
||||
}
|
||||
}
|
||||
/* special cases with their own return()'s */
|
||||
|
||||
if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS)
|
||||
switch (wordvalue[wordnumber]) {
|
||||
|
||||
case SWORD:
|
||||
if (testbit(from, SWORD)) {
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
}
|
||||
if (testbit(from, TWO_HANDED)) {
|
||||
wordvalue[wordnumber] = TWO_HANDED;
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
}
|
||||
wordvalue[wordnumber] = BROAD;
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
|
||||
case BODY:
|
||||
if (testbit(from, MAID)) {
|
||||
wordvalue[wordnumber] = MAID;
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
} else
|
||||
if (testbit(from, DEADWOOD)) {
|
||||
wordvalue[wordnumber] = DEADWOOD;
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
} else
|
||||
if (testbit(from, DEADNATIVE)) {
|
||||
wordvalue[wordnumber] = DEADNATIVE;
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
} else
|
||||
if (testbit(from, DEADGOD)) {
|
||||
wordvalue[wordnumber] = DEADGOD;
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
} else {
|
||||
wordvalue[wordnumber] = DEADTIME;
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
}
|
||||
break;
|
||||
|
||||
case AMULET:
|
||||
if (testbit(location[position].objects, AMULET)) {
|
||||
puts("The amulet is warm to the touch, and its beauty catches your breath.");
|
||||
puts("A mist falls over your eyes, but then it is gone. Sounds seem clearer");
|
||||
puts("and sharper but far away as if in a dream. The sound of purling water reaches");
|
||||
puts("you from afar. The mist falls again, and your heart leaps in horror. The gold");
|
||||
puts("freezes your hands and fathomless darkness engulfs your soul.");
|
||||
}
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
|
||||
case MEDALION:
|
||||
if (testbit(location[position].objects, MEDALION)) {
|
||||
puts("The medallion is warm, and it rekindles your spirit with the warmth of life.");
|
||||
puts("Your amulet begins to glow as the medallion is brought near to it, and together\nthey radiate.");
|
||||
}
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
|
||||
case TALISMAN:
|
||||
if (testbit(location[position].objects, TALISMAN)) {
|
||||
puts("The talisman is cold to the touch, and it sends a chill down your spine.");
|
||||
}
|
||||
wordtype[wordnumber--] = OBJECT;
|
||||
return (take(from));
|
||||
|
||||
case NORMGOD:
|
||||
if (testbit(location[position].objects, BATHGOD) && (testbit(wear, AMULET) || testbit(inven, AMULET))) {
|
||||
puts("She offers a delicate hand, and you help her out of the sparkling springs.");
|
||||
puts("Water droplets like liquid silver bedew her golden skin, but when they part");
|
||||
puts("from her, they fall as teardrops. She wraps a single cloth around her and");
|
||||
puts("ties it at the waist. Around her neck hangs a golden amulet.");
|
||||
puts("She bids you to follow her.");
|
||||
pleasure++;
|
||||
followgod = ourtime;
|
||||
clearbit(location[position].objects, BATHGOD);
|
||||
} else
|
||||
if (!testbit(location[position].objects, BATHGOD))
|
||||
puts("You're in no position to take her.");
|
||||
else
|
||||
puts("She moves away from you.");
|
||||
break;
|
||||
|
||||
default:
|
||||
puts("It doesn't seem to work.");
|
||||
}
|
||||
else
|
||||
puts("You've got to be kidding.");
|
||||
return (firstnumber);
|
||||
}
|
||||
|
||||
int
|
||||
throw(name)
|
||||
const char *name;
|
||||
{
|
||||
unsigned int n;
|
||||
int deposit = 0;
|
||||
int first, value;
|
||||
|
||||
first = wordnumber;
|
||||
if (drop(name) != -1) {
|
||||
switch (wordvalue[wordnumber]) {
|
||||
|
||||
case AHEAD:
|
||||
deposit = ahead;
|
||||
break;
|
||||
|
||||
case BACK:
|
||||
deposit = back;
|
||||
break;
|
||||
|
||||
case LEFT:
|
||||
deposit = left;
|
||||
break;
|
||||
|
||||
case RIGHT:
|
||||
deposit = right;
|
||||
break;
|
||||
|
||||
case UP:
|
||||
deposit = location[position].up * (location[position].access || position == FINAL);
|
||||
break;
|
||||
|
||||
case DOWN:
|
||||
deposit = location[position].down;
|
||||
break;
|
||||
}
|
||||
wordnumber = first;
|
||||
while (wordtype[++wordnumber] == ADJS);
|
||||
while (wordnumber <= wordcount) {
|
||||
value = wordvalue[wordnumber];
|
||||
if (deposit && testbit(location[position].objects, value)) {
|
||||
clearbit(location[position].objects, value);
|
||||
if (value != GRENADE)
|
||||
setbit(location[deposit].objects, value);
|
||||
else {
|
||||
puts("A thundering explosion nearby sends up a cloud of smoke and shrapnel.");
|
||||
for (n = 0; n < NUMOFWORDS; n++)
|
||||
location[deposit].objects[n] = 0;
|
||||
setbit(location[deposit].objects, CHAR);
|
||||
}
|
||||
if (value == ROPE && position == FINAL)
|
||||
location[position].access = 1;
|
||||
switch (deposit) {
|
||||
case 189:
|
||||
case 231:
|
||||
puts("The stone door is unhinged.");
|
||||
location[189].north = 231;
|
||||
location[231].south = 189;
|
||||
break;
|
||||
case 30:
|
||||
puts("The wooden door is blown open.");
|
||||
location[30].west = 25;
|
||||
break;
|
||||
case 31:
|
||||
puts("The door is not damaged.");
|
||||
}
|
||||
} else
|
||||
if (value == GRENADE && testbit(location[position].objects, value)) {
|
||||
puts("You are blown into shreds when your grenade explodes.");
|
||||
die();
|
||||
}
|
||||
if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
|
||||
wordnumber++;
|
||||
else
|
||||
return (first);
|
||||
}
|
||||
return (first);
|
||||
}
|
||||
return (first);
|
||||
}
|
||||
|
||||
int
|
||||
drop(name)
|
||||
const char *name;
|
||||
{
|
||||
|
||||
int firstnumber, value;
|
||||
|
||||
firstnumber = wordnumber;
|
||||
while (wordtype[++wordnumber] == ADJS);
|
||||
while (wordnumber <= wordcount && (wordtype[wordnumber] == OBJECT || wordtype[wordnumber] == NOUNS)) {
|
||||
value = wordvalue[wordnumber];
|
||||
printf("%s:\n", objsht[value]);
|
||||
if (testbit(inven, value)) {
|
||||
clearbit(inven, value);
|
||||
carrying -= objwt[value];
|
||||
encumber -= objcumber[value];
|
||||
if (value == BOMB) {
|
||||
puts("The bomb explodes. A blinding white light and immense concussion obliterate us.");
|
||||
die();
|
||||
}
|
||||
if (value != AMULET && value != MEDALION && value != TALISMAN)
|
||||
setbit(location[position].objects, value);
|
||||
else
|
||||
tempwiz = 0;
|
||||
ourtime++;
|
||||
if (*name == 'K')
|
||||
puts("Drop kicked.");
|
||||
else
|
||||
printf("%s.\n", name);
|
||||
} else {
|
||||
if (*name != 'K') {
|
||||
printf("You aren't holding the %s.\n", objsht[value]);
|
||||
if (testbit(location[position].objects, value)) {
|
||||
if (*name == 'T')
|
||||
puts("Kicked instead.");
|
||||
else
|
||||
if (*name == 'G')
|
||||
puts("Given anyway.");
|
||||
}
|
||||
} else
|
||||
puts("Kicked.");
|
||||
}
|
||||
if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
|
||||
wordnumber++;
|
||||
else
|
||||
return (firstnumber);
|
||||
}
|
||||
puts("Do what?");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
int
|
||||
takeoff()
|
||||
{
|
||||
wordnumber = take(wear);
|
||||
return (drop("Dropped"));
|
||||
}
|
||||
|
||||
int
|
||||
puton()
|
||||
{
|
||||
wordnumber = take(location[position].objects);
|
||||
return (wearit());
|
||||
}
|
||||
|
||||
int
|
||||
eat()
|
||||
{
|
||||
int firstnumber, value;
|
||||
|
||||
firstnumber = wordnumber;
|
||||
while (wordtype[++wordnumber] == ADJS);
|
||||
while (wordnumber <= wordcount) {
|
||||
value = wordvalue[wordnumber];
|
||||
switch (value) {
|
||||
|
||||
case -1:
|
||||
puts("Eat what?");
|
||||
return (firstnumber);
|
||||
|
||||
default:
|
||||
printf("You can't eat%s%s!\n",
|
||||
wordtype[wordnumber] == OBJECT &&
|
||||
objsht[value]
|
||||
[strlen(objsht[value]) - 1] == 's' ?
|
||||
" " : " a ",
|
||||
words[wordnumber]);
|
||||
return (firstnumber);
|
||||
|
||||
case PAPAYAS:
|
||||
case PINEAPPLE:
|
||||
case KIWI:
|
||||
case COCONUTS: /* eatable things */
|
||||
case MANGO:
|
||||
|
||||
printf("%s:\n", objsht[value]);
|
||||
if (testbit(inven, value) &&
|
||||
ourtime > ate - CYCLE &&
|
||||
testbit(inven, KNIFE)) {
|
||||
clearbit(inven, value);
|
||||
carrying -= objwt[value];
|
||||
encumber -= objcumber[value];
|
||||
ate = max(ourtime, ate) + CYCLE / 3;
|
||||
snooze += CYCLE / 10;
|
||||
ourtime++;
|
||||
puts("Eaten. You can explore a little longer now.");
|
||||
} else
|
||||
if (ourtime < ate - CYCLE)
|
||||
puts("You're stuffed.");
|
||||
else
|
||||
if (!testbit(inven, KNIFE))
|
||||
puts("You need a knife.");
|
||||
else
|
||||
printf("You aren't holding the %s.\n", objsht[value]);
|
||||
if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
|
||||
wordnumber++;
|
||||
else
|
||||
return (firstnumber);
|
||||
} /* end switch */
|
||||
} /* end while */
|
||||
return (firstnumber);
|
||||
}
|
||||
@@ -1,351 +0,0 @@
|
||||
/* $NetBSD: com5.c,v 1.9 1998/08/30 09:19:36 veego Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)com5.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: com5.c,v 1.9 1998/08/30 09:19:36 veego Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
void
|
||||
kiss()
|
||||
{
|
||||
while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount);
|
||||
if (wordtype[wordnumber] == NOUNS &&
|
||||
testbit(location[position].objects, wordvalue[wordnumber])) {
|
||||
pleasure++;
|
||||
printf("Kissed.\n");
|
||||
switch (wordvalue[wordnumber]) {
|
||||
case NORMGOD:
|
||||
switch (godready++) {
|
||||
case 0:
|
||||
puts("She squirms and avoids your advances.");
|
||||
break;
|
||||
case 1:
|
||||
puts("She is coming around; she didn't fight it as much.");
|
||||
break;
|
||||
case 2:
|
||||
puts("She's begining to like it.");
|
||||
break;
|
||||
default:
|
||||
puts("She's gone limp.");
|
||||
|
||||
}
|
||||
break;
|
||||
case NATIVE:
|
||||
puts("The lips are warm and her body robust. She pulls you down to the ground.");
|
||||
break;
|
||||
case TIMER:
|
||||
puts("The old man blushes.");
|
||||
break;
|
||||
case MAN:
|
||||
puts("The dwarf punches you in the kneecap.");
|
||||
break;
|
||||
default:
|
||||
pleasure--;
|
||||
}
|
||||
} else
|
||||
puts("I'd prefer not to.");
|
||||
}
|
||||
|
||||
void
|
||||
love()
|
||||
{
|
||||
int n;
|
||||
|
||||
while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount);
|
||||
if (wordtype[wordnumber] == NOUNS && testbit(location[position].objects, wordvalue[wordnumber])) {
|
||||
if (wordvalue[wordnumber] == NORMGOD && !loved) {
|
||||
if (godready >= 2) {
|
||||
puts("She cuddles up to you, and her mouth starts to work:\n'That was my sister's amulet. The lovely goddess, Purl, was she. The Empire\ncaptured her just after the Darkness came. My other sister, Vert, was killed\nby the Dark Lord himself. He took her amulet and warped its power.\nYour quest was foretold by my father before he died, but to get the Dark Lord's\namulet you must use cunning and skill. I will leave you my amulet.");
|
||||
puts("which you may use as you wish. As for me, I am the last goddess of the\nwaters. My father was the Island King, and the rule is rightfully mine.'\n\nShe pulls the throne out into a large bed.");
|
||||
power++;
|
||||
pleasure += 15;
|
||||
ego++;
|
||||
if (card(injuries, NUMOFINJURIES)) {
|
||||
puts("Her kisses revive you; your wounds are healed.\n");
|
||||
for (n = 0; n < NUMOFINJURIES; n++)
|
||||
injuries[n] = 0;
|
||||
WEIGHT = MAXWEIGHT;
|
||||
CUMBER = MAXCUMBER;
|
||||
}
|
||||
printf("Goddess:\n");
|
||||
if (!loved)
|
||||
setbit(location[position].objects, MEDALION);
|
||||
loved = 1;
|
||||
ourtime += 10;
|
||||
zzz();
|
||||
} else {
|
||||
puts("You wish!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (wordvalue[wordnumber] == NATIVE) {
|
||||
puts("The girl is easy prey. She peals off her sarong and indulges you.");
|
||||
power++;
|
||||
pleasure += 5;
|
||||
printf("Girl:\n");
|
||||
ourtime += 10;
|
||||
zzz();
|
||||
}
|
||||
printf("Loved.\n");
|
||||
} else
|
||||
puts("It doesn't seem to work.");
|
||||
}
|
||||
|
||||
int
|
||||
zzz()
|
||||
{
|
||||
int oldtime;
|
||||
int n;
|
||||
|
||||
oldtime = ourtime;
|
||||
if ((snooze - ourtime) < (0.75 * CYCLE)) {
|
||||
ourtime += 0.75 * CYCLE - (snooze - ourtime);
|
||||
printf("<zzz>");
|
||||
for (n = 0; n < ourtime - oldtime; n++)
|
||||
printf(".");
|
||||
printf("\n");
|
||||
snooze += 3 * (ourtime - oldtime);
|
||||
if (notes[LAUNCHED]) {
|
||||
fuel -= (ourtime - oldtime);
|
||||
if (location[position].down) {
|
||||
position = location[position].down;
|
||||
crash();
|
||||
} else
|
||||
notes[LAUNCHED] = 0;
|
||||
}
|
||||
if (OUTSIDE && rnd(100) < 50) {
|
||||
puts("You are awakened abruptly by the sound of someone nearby.");
|
||||
switch (rnd(4)) {
|
||||
case 0:
|
||||
if (ucard(inven)) {
|
||||
n = rnd(NUMOFOBJECTS);
|
||||
while (!testbit(inven, n))
|
||||
n = rnd(NUMOFOBJECTS);
|
||||
clearbit(inven, n);
|
||||
if (n != AMULET && n != MEDALION && n != TALISMAN)
|
||||
setbit(location[position].objects, n);
|
||||
carrying -= objwt[n];
|
||||
encumber -= objcumber[n];
|
||||
}
|
||||
puts("A fiendish little Elf is stealing your treasures!");
|
||||
fight(ELF, 10);
|
||||
break;
|
||||
case 1:
|
||||
setbit(location[position].objects, DEADWOOD);
|
||||
break;
|
||||
case 2:
|
||||
setbit(location[position].objects, HALBERD);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
|
||||
void
|
||||
chime()
|
||||
{
|
||||
if ((ourtime / CYCLE + 1) % 2 && OUTSIDE)
|
||||
switch ((ourtime % CYCLE) / (CYCLE / 7)) {
|
||||
case 0:
|
||||
puts("It is just after sunrise.");
|
||||
break;
|
||||
case 1:
|
||||
puts("It is early morning.");
|
||||
break;
|
||||
case 2:
|
||||
puts("It is late morning.");
|
||||
break;
|
||||
case 3:
|
||||
puts("It is near noon.");
|
||||
break;
|
||||
case 4:
|
||||
puts("It is early afternoon.");
|
||||
break;
|
||||
case 5:
|
||||
puts("It is late afternoon.");
|
||||
break;
|
||||
case 6:
|
||||
puts("It is near sunset.");
|
||||
break;
|
||||
}
|
||||
else
|
||||
if (OUTSIDE)
|
||||
switch ((ourtime % CYCLE) / (CYCLE / 7)) {
|
||||
case 0:
|
||||
puts("It is just after sunset.");
|
||||
break;
|
||||
case 1:
|
||||
puts("It is early evening.");
|
||||
break;
|
||||
case 2:
|
||||
puts("The evening is getting old.");
|
||||
break;
|
||||
case 3:
|
||||
puts("It is near midnight.");
|
||||
break;
|
||||
case 4:
|
||||
puts("These are the wee hours of the morning.");
|
||||
break;
|
||||
case 5:
|
||||
puts("The night is waning.");
|
||||
break;
|
||||
case 6:
|
||||
puts("It is almost morning.");
|
||||
break;
|
||||
}
|
||||
else
|
||||
puts("I can't tell the time in here.");
|
||||
}
|
||||
|
||||
int
|
||||
give()
|
||||
{
|
||||
int obj = -1, result = -1, person = 0, firstnumber, last1, last2;
|
||||
|
||||
last1 = last2 = 0;
|
||||
firstnumber = wordnumber;
|
||||
while (wordtype[++wordnumber] != OBJECT && wordvalue[wordnumber] != AMULET && wordvalue[wordnumber] != MEDALION && wordvalue[wordnumber] != TALISMAN && wordnumber <= wordcount);
|
||||
if (wordnumber <= wordcount) {
|
||||
obj = wordvalue[wordnumber];
|
||||
if (obj == EVERYTHING)
|
||||
wordtype[wordnumber] = -1;
|
||||
last1 = wordnumber;
|
||||
}
|
||||
wordnumber = firstnumber;
|
||||
while ((wordtype[++wordnumber] != NOUNS || wordvalue[wordnumber] == obj) && wordnumber <= wordcount);
|
||||
if (wordtype[wordnumber] == NOUNS) {
|
||||
person = wordvalue[wordnumber];
|
||||
last2 = wordnumber;
|
||||
}
|
||||
/* Setting wordnumber to last1 - 1 looks wrong if last1 is 0, e.g.,
|
||||
* plain `give'. However, detecting this case is liable to detect
|
||||
* `give foo' as well, which would give a confusing error. We
|
||||
* need to make sure the -1 value can cause no problems if it arises.
|
||||
* If in the below we get to the drop("Given") then drop will look
|
||||
* at word 0 for an object to give, and fail, which is OK; then
|
||||
* result will be -1 and we get to the end, where wordnumber gets
|
||||
* set to something more sensible. If we get to "I don't think
|
||||
* that is possible" then again wordnumber is set to something
|
||||
* sensible. The wordnumber we leave with still isn't right if
|
||||
* you include words the game doesn't know in your command, but
|
||||
* that's no worse than what other commands than give do in
|
||||
* the same place. */
|
||||
wordnumber = last1 - 1;
|
||||
if (person && testbit(location[position].objects, person))
|
||||
if (person == NORMGOD && godready < 2 && !(obj == RING || obj == BRACELET))
|
||||
puts("The goddess won't look at you.");
|
||||
else
|
||||
result = drop("Given");
|
||||
else {
|
||||
puts("I don't think that is possible.");
|
||||
wordnumber = max(last1, last2) + 1;
|
||||
return (0);
|
||||
}
|
||||
if (result != -1 && (testbit(location[position].objects, obj) || obj == AMULET || obj == MEDALION || obj == TALISMAN)) {
|
||||
clearbit(location[position].objects, obj);
|
||||
ourtime++;
|
||||
ego++;
|
||||
switch (person) {
|
||||
case NATIVE:
|
||||
puts("She accepts it shyly.");
|
||||
ego += 2;
|
||||
break;
|
||||
case NORMGOD:
|
||||
if (obj == RING || obj == BRACELET) {
|
||||
puts("She takes the charm and puts it on. A little kiss on the cheek is");
|
||||
puts("your reward.");
|
||||
ego += 5;
|
||||
godready += 3;
|
||||
}
|
||||
if (obj == AMULET || obj == MEDALION || obj == TALISMAN) {
|
||||
win++;
|
||||
ego += 5;
|
||||
power -= 5;
|
||||
if (win >= 3) {
|
||||
puts("The powers of the earth are now legitimate. You have destroyed the Darkness");
|
||||
puts("and restored the goddess to her thrown. The entire island celebrates with");
|
||||
puts("dancing and spring feasts. As a measure of her gratitude, the goddess weds you");
|
||||
puts("in the late summer and crowns you Prince Liverwort, Lord of Fungus.");
|
||||
puts("\nBut, as the year wears on and autumn comes along, you become restless and");
|
||||
puts("yearn for adventure. The goddess, too, realizes that the marriage can't last.");
|
||||
puts("She becomes bored and takes several more natives as husbands. One evening,");
|
||||
puts("after having been out drinking with the girls, she kicks the throne particulary");
|
||||
puts("hard and wakes you up. (If you want to win this game, you're going to have to\nshoot her!)");
|
||||
clearbit(location[position].objects, MEDALION);
|
||||
wintime = ourtime;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TIMER:
|
||||
if (obj == COINS) {
|
||||
puts("He fingers the coins for a moment and then looks up agape. `Kind you are and");
|
||||
puts("I mean to repay you as best I can.' Grabbing a pencil and cocktail napkin...\n");
|
||||
printf("+-----------------------------------------------------------------------------+\n");
|
||||
printf("| xxxxxxxx\\ |\n");
|
||||
printf("| xxxxx\\ CLIFFS |\n");
|
||||
printf("| FOREST xxx\\ |\n");
|
||||
printf("| \\\\ x\\ OCEAN |\n");
|
||||
printf("| || x\\ |\n");
|
||||
printf("| || ROAD x\\ |\n");
|
||||
printf("| || x\\ |\n");
|
||||
printf("| SECRET || ......... |\n");
|
||||
printf("| - + - || ........ |\n");
|
||||
printf("| ENTRANCE || ... BEACH |\n");
|
||||
printf("| || ... E |\n");
|
||||
printf("| || ... | |\n");
|
||||
printf("| // ... N <-- + --- S |\n");
|
||||
printf("| PALM GROVE // ... | |\n");
|
||||
printf("| // ... W |\n");
|
||||
printf("+-----------------------------------------------------------------------------+\n");
|
||||
puts("\n`This map shows a secret entrance to the catacombs.");
|
||||
puts("You will know when you arrive because I left an old pair of shoes there.'");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
wordnumber = max(last1, last2) + 1;
|
||||
return (firstnumber);
|
||||
}
|
||||
@@ -1,249 +0,0 @@
|
||||
/* $NetBSD: com6.c,v 1.9 1997/10/13 21:05:36 cjs Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)com6.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: com6.c,v 1.9 1997/10/13 21:05:36 cjs Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <time.h>
|
||||
#include "extern.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
int
|
||||
launch()
|
||||
{
|
||||
if (testbit(location[position].objects, VIPER) && !notes[CANTLAUNCH]) {
|
||||
if (fuel > 4) {
|
||||
clearbit(location[position].objects, VIPER);
|
||||
position = location[position].up;
|
||||
notes[LAUNCHED] = 1;
|
||||
ourtime++;
|
||||
fuel -= 4;
|
||||
puts("You climb into the viper and prepare for launch.");
|
||||
puts("With a touch of your thumb the turbo engines ignite, thrusting you back into\nyour seat.");
|
||||
return (1);
|
||||
} else
|
||||
puts("Not enough fuel to launch.");
|
||||
} else
|
||||
puts("Can't launch.");
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
land()
|
||||
{
|
||||
if (notes[LAUNCHED] && testbit(location[position].objects, LAND) &&
|
||||
location[position].down) {
|
||||
notes[LAUNCHED] = 0;
|
||||
position = location[position].down;
|
||||
setbit(location[position].objects, VIPER);
|
||||
fuel -= 2;
|
||||
ourtime++;
|
||||
puts("You are down.");
|
||||
return (1);
|
||||
} else
|
||||
puts("You can't land here.");
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
die()
|
||||
{ /* endgame */
|
||||
printf("bye.\nYour rating was %s.\n", rate());
|
||||
post(' ');
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void
|
||||
diesig(dummy)
|
||||
int dummy __attribute__((unused));
|
||||
{
|
||||
die();
|
||||
}
|
||||
|
||||
void
|
||||
live()
|
||||
{
|
||||
puts("\nYou win!");
|
||||
post('!');
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static FILE *score_fp;
|
||||
|
||||
void
|
||||
open_score_file()
|
||||
{
|
||||
score_fp = fopen(_PATH_SCORE, "a");
|
||||
if (score_fp == NULL)
|
||||
warn("open %s for append", _PATH_SCORE);
|
||||
}
|
||||
|
||||
void
|
||||
post(ch)
|
||||
char ch;
|
||||
{
|
||||
time_t tv;
|
||||
char *date;
|
||||
sigset_t sigset, osigset;
|
||||
|
||||
sigemptyset(&sigset);
|
||||
sigaddset(&sigset, SIGINT);
|
||||
sigprocmask(SIG_BLOCK, &sigset, &osigset);
|
||||
tv = time(NULL);
|
||||
date = ctime(&tv);
|
||||
date[24] = '\0';
|
||||
if (score_fp != NULL) {
|
||||
fprintf(score_fp, "%s %8s %c%20s", date, username, ch, rate());
|
||||
if (wiz)
|
||||
fprintf(score_fp, " wizard\n");
|
||||
else
|
||||
if (tempwiz)
|
||||
fprintf(score_fp, " WIZARD!\n");
|
||||
else
|
||||
fprintf(score_fp, "\n");
|
||||
}
|
||||
sigprocmask(SIG_SETMASK, &osigset, (sigset_t *) 0);
|
||||
}
|
||||
|
||||
const char *
|
||||
rate()
|
||||
{
|
||||
int score;
|
||||
|
||||
score = max(max(pleasure, power), ego);
|
||||
if (score == pleasure) {
|
||||
if (score < 5)
|
||||
return ("novice");
|
||||
else
|
||||
if (score < 20)
|
||||
return ("junior voyeur");
|
||||
else
|
||||
if (score < 35)
|
||||
return ("Don Juan");
|
||||
else
|
||||
return ("Marquis De Sade");
|
||||
} else
|
||||
if (score == power) {
|
||||
if (score < 5)
|
||||
return ("serf");
|
||||
else
|
||||
if (score < 8)
|
||||
return ("Samurai");
|
||||
else
|
||||
if (score < 13)
|
||||
return ("Klingon");
|
||||
else
|
||||
if (score < 22)
|
||||
return ("Darth Vader");
|
||||
else
|
||||
return ("Sauron the Great");
|
||||
} else {
|
||||
if (score < 5)
|
||||
return ("Polyanna");
|
||||
else
|
||||
if (score < 10)
|
||||
return ("philanthropist");
|
||||
else
|
||||
if (score < 20)
|
||||
return ("Tattoo");
|
||||
else
|
||||
return ("Mr. Roarke");
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
drive()
|
||||
{
|
||||
if (testbit(location[position].objects, CAR)) {
|
||||
puts("You hop in the car and turn the key. There is a perceptible grating noise,");
|
||||
puts("and an explosion knocks you unconscious...");
|
||||
clearbit(location[position].objects, CAR);
|
||||
setbit(location[position].objects, CRASH);
|
||||
injuries[5] = injuries[6] = injuries[7] = injuries[8] = 1;
|
||||
ourtime += 15;
|
||||
zzz();
|
||||
return (0);
|
||||
} else
|
||||
puts("There is nothing to drive here.");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
int
|
||||
ride()
|
||||
{
|
||||
if (testbit(location[position].objects, HORSE)) {
|
||||
puts("You climb onto the stallion and kick it in the guts. The stupid steed launches");
|
||||
puts("forward through bush and fern. You are thrown and the horse gallups off.");
|
||||
clearbit(location[position].objects, HORSE);
|
||||
while (!(position = rnd(NUMOFROOMS + 1)) || !OUTSIDE || !beenthere[position] || location[position].flyhere);
|
||||
setbit(location[position].objects, HORSE);
|
||||
if (location[position].north)
|
||||
position = location[position].north;
|
||||
else
|
||||
if (location[position].south)
|
||||
position = location[position].south;
|
||||
else
|
||||
if (location[position].east)
|
||||
position = location[position].east;
|
||||
else
|
||||
position = location[position].west;
|
||||
return (0);
|
||||
} else
|
||||
puts("There is no horse here.");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
void
|
||||
light()
|
||||
{ /* synonyms = {strike, smoke} *//* for
|
||||
* matches, cigars */
|
||||
if (testbit(inven, MATCHES) && matchcount) {
|
||||
puts("Your match splutters to life.");
|
||||
ourtime++;
|
||||
matchlight = 1;
|
||||
matchcount--;
|
||||
if (position == 217) {
|
||||
puts("The whole bungalow explodes with an intense blast.");
|
||||
die();
|
||||
}
|
||||
} else
|
||||
puts("You're out of matches.");
|
||||
}
|
||||
@@ -1,276 +0,0 @@
|
||||
/* $NetBSD: com7.c,v 1.6 1997/10/11 02:07:10 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)com7.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: com7.c,v 1.6 1997/10/11 02:07:10 lukem Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
int
|
||||
fight(enemy, strength)
|
||||
int enemy, strength;
|
||||
{
|
||||
int lifeline = 0;
|
||||
int hurt;
|
||||
char auxbuf[LINELENGTH];
|
||||
char *next;
|
||||
int i;
|
||||
int exhaustion;
|
||||
|
||||
exhaustion = 0;
|
||||
fighton:
|
||||
ourtime++;
|
||||
snooze -= 5;
|
||||
if (snooze > ourtime)
|
||||
exhaustion = CYCLE / (snooze - ourtime);
|
||||
else {
|
||||
puts("You collapse exhausted, and he pulverizes your skull.");
|
||||
die();
|
||||
}
|
||||
if (snooze - ourtime < 20)
|
||||
puts("You look tired! I hope you're able to fight.");
|
||||
next = getcom(auxbuf, LINELENGTH, "<fight!>-: ", 0);
|
||||
for (i = 0; next && i < 10; i++)
|
||||
next = getword(next, words[i], -1);
|
||||
parse();
|
||||
switch (wordvalue[wordnumber]) {
|
||||
|
||||
case KILL:
|
||||
case SMITE:
|
||||
if (testbit(inven, TWO_HANDED))
|
||||
hurt = rnd(70) - 2 * card(injuries, NUMOFINJURIES) - ucard(wear) - exhaustion;
|
||||
else
|
||||
if (testbit(inven, SWORD) || testbit(inven, BROAD))
|
||||
hurt = rnd(50) % (WEIGHT - carrying) - card(injuries, NUMOFINJURIES) - encumber - exhaustion;
|
||||
else
|
||||
if (testbit(inven, KNIFE) || testbit(inven, MALLET) || testbit(inven, CHAIN) || testbit(inven, MACE) || testbit(inven, HALBERD))
|
||||
hurt = rnd(15) - card(injuries, NUMOFINJURIES) - exhaustion;
|
||||
else
|
||||
hurt = rnd(7) - encumber;
|
||||
if (hurt < 5)
|
||||
switch (rnd(3)) {
|
||||
|
||||
case 0:
|
||||
puts("You swung wide and missed.");
|
||||
break;
|
||||
case 1:
|
||||
puts("He checked your blow. CLASH! CLANG!");
|
||||
break;
|
||||
case 2:
|
||||
puts("His filthy tunic hangs by one less thread.");
|
||||
break;
|
||||
}
|
||||
else
|
||||
if (hurt < 10) {
|
||||
switch (rnd(3)) {
|
||||
case 0:
|
||||
puts("He's bleeding.");
|
||||
break;
|
||||
case 1:
|
||||
puts("A trickle of blood runs down his face.");
|
||||
break;
|
||||
case 2:
|
||||
puts("A huge purple bruise is forming on the side of his face.");
|
||||
break;
|
||||
}
|
||||
lifeline++;
|
||||
} else
|
||||
if (hurt < 20) {
|
||||
switch (rnd(3)) {
|
||||
case 0:
|
||||
puts("He staggers back quavering.");
|
||||
break;
|
||||
case 1:
|
||||
puts("He jumps back with his hand over the wound.");
|
||||
break;
|
||||
case 2:
|
||||
puts("His shirt falls open with a swath across the chest.");
|
||||
break;
|
||||
}
|
||||
lifeline += 5;
|
||||
} else
|
||||
if (hurt < 30) {
|
||||
switch (rnd(3)) {
|
||||
case 0:
|
||||
printf("A bloody gash opens up on his %s side.\n", (rnd(2) ? "left" : "right"));
|
||||
break;
|
||||
case 1:
|
||||
puts("The steel bites home and scrapes along his ribs.");
|
||||
break;
|
||||
case 2:
|
||||
puts("You pierce him, and his breath hisses through clenched teeth.");
|
||||
break;
|
||||
}
|
||||
lifeline += 10;
|
||||
} else
|
||||
if (hurt < 40) {
|
||||
switch (rnd(3)) {
|
||||
case 0:
|
||||
puts("You smite him to the ground.");
|
||||
if (strength - lifeline > 20)
|
||||
puts("But in a flurry of steel he regains his feet!");
|
||||
break;
|
||||
case 1:
|
||||
puts("The force of your blow sends him to his knees.");
|
||||
puts("His arm swings lifeless at his side.");
|
||||
break;
|
||||
case 2:
|
||||
puts("Clutching his blood drenched shirt, he collapses stunned.");
|
||||
break;
|
||||
}
|
||||
lifeline += 20;
|
||||
} else {
|
||||
switch (rnd(3)) {
|
||||
case 0:
|
||||
puts("His ribs crack under your powerful swing, flooding his lungs with blood.");
|
||||
break;
|
||||
case 1:
|
||||
puts("You shatter his upheld arm in a spray of blood. The blade continues deep");
|
||||
puts("into his back, severing the spinal cord.");
|
||||
lifeline += 25;
|
||||
break;
|
||||
case 2:
|
||||
puts("With a mighty lunge the steel slides in, and gasping, he falls to the ground.");
|
||||
lifeline += 25;
|
||||
break;
|
||||
}
|
||||
lifeline += 30;
|
||||
}
|
||||
break;
|
||||
|
||||
case BACK:
|
||||
if (enemy == DARK && lifeline > strength * 0.33) {
|
||||
puts("He throws you back against the rock and pummels your face.");
|
||||
if (testbit(inven, AMULET) || testbit(wear, AMULET)) {
|
||||
printf("Lifting the amulet from you, ");
|
||||
if (testbit(inven, MEDALION) || testbit(wear, MEDALION)) {
|
||||
puts("his power grows and the walls of\nthe earth tremble.");
|
||||
puts("When he touches the medallion, your chest explodes and the foundations of the\nearth collapse.");
|
||||
puts("The planet is consumed by darkness.");
|
||||
die();
|
||||
}
|
||||
if (testbit(inven, AMULET)) {
|
||||
clearbit(inven, AMULET);
|
||||
carrying -= objwt[AMULET];
|
||||
encumber -= objcumber[AMULET];
|
||||
} else
|
||||
clearbit(wear, AMULET);
|
||||
puts("he flees down the dark caverns.");
|
||||
clearbit(location[position].objects, DARK);
|
||||
injuries[SKULL] = 1;
|
||||
followfight = ourtime;
|
||||
return (0);
|
||||
} else {
|
||||
puts("I'm afraid you have been killed.");
|
||||
die();
|
||||
}
|
||||
} else {
|
||||
puts("You escape stunned and disoriented from the fight.");
|
||||
puts("A victorious bellow echoes from the battlescene.");
|
||||
if (back && position != back)
|
||||
move(back, BACK);
|
||||
else
|
||||
if (ahead && position != ahead)
|
||||
move(ahead, AHEAD);
|
||||
else
|
||||
if (left && position != left)
|
||||
move(left, LEFT);
|
||||
else
|
||||
if (right && position != right)
|
||||
move(right, RIGHT);
|
||||
else
|
||||
move(location[position].down, AHEAD);
|
||||
return (0);
|
||||
}
|
||||
|
||||
case SHOOT:
|
||||
if (testbit(inven, LASER)) {
|
||||
if (strength - lifeline <= 50) {
|
||||
printf("The %s took a direct hit!\n", objsht[enemy]);
|
||||
lifeline += 50;
|
||||
} else {
|
||||
puts("With his bare hand he deflects the laser blast and whips the pistol from you!");
|
||||
clearbit(inven, LASER);
|
||||
setbit(location[position].objects, LASER);
|
||||
carrying -= objwt[LASER];
|
||||
encumber -= objcumber[LASER];
|
||||
}
|
||||
} else
|
||||
puts("Unfortunately, you don't have a blaster handy.");
|
||||
break;
|
||||
|
||||
case DROP:
|
||||
case DRAW:
|
||||
cypher();
|
||||
ourtime--;
|
||||
break;
|
||||
|
||||
default:
|
||||
puts("You don't have a chance, he is too quick.");
|
||||
break;
|
||||
|
||||
}
|
||||
if (lifeline >= strength) {
|
||||
printf("You have killed the %s.\n", objsht[enemy]);
|
||||
if (enemy == ELF || enemy == DARK)
|
||||
puts("A watery black smoke consumes his body and then vanishes with a peal of thunder!");
|
||||
clearbit(location[position].objects, enemy);
|
||||
power += 2;
|
||||
notes[JINXED]++;
|
||||
return (0);
|
||||
}
|
||||
puts("He attacks...");
|
||||
/* some embellisments */
|
||||
hurt = rnd(NUMOFINJURIES) - (testbit(inven, SHIELD) != 0) - (testbit(wear, MAIL) != 0) - (testbit(wear, HELM) != 0);
|
||||
hurt += (testbit(wear, AMULET) != 0) + (testbit(wear, MEDALION) != 0) + (testbit(wear, TALISMAN) != 0);
|
||||
hurt = hurt < 0 ? 0 : hurt;
|
||||
hurt = hurt >= NUMOFINJURIES ? NUMOFINJURIES - 1 : hurt;
|
||||
if (!injuries[hurt]) {
|
||||
injuries[hurt] = 1;
|
||||
printf("I'm afraid you have suffered %s.\n", ouch[hurt]);
|
||||
} else
|
||||
puts("You emerge unscathed.");
|
||||
if (injuries[SKULL] && injuries[INCISE] && injuries[NECK]) {
|
||||
puts("I'm afraid you have suffered fatal injuries.");
|
||||
die();
|
||||
}
|
||||
goto fighton;
|
||||
}
|
||||
16
bcd/bcd.6
16
bcd/bcd.6
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: bcd.6,v 1.12 2001/06/05 12:41:04 wiz Exp $
|
||||
.\" $NetBSD: bcd.6,v 1.15 2003/02/25 10:34:45 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1988, 1991, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@@ -33,7 +33,7 @@
|
||||
.\"
|
||||
.\" @(#)bcd.6 8.1 (Berkeley) 5/31/93
|
||||
.\"
|
||||
.Dd May 31, 1993
|
||||
.Dd November 26, 2002
|
||||
.Dt BCD 6
|
||||
.Os
|
||||
.Sh NAME
|
||||
@@ -45,12 +45,13 @@
|
||||
.Nm
|
||||
.Op Ar string ...
|
||||
.Nm ppt
|
||||
.Op Ar string ...
|
||||
.Op Fl d Ns \&| Ns Ar string ...
|
||||
.Nm morse
|
||||
.Op Fl ds Ar string ...
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm bcd ,
|
||||
.Nm ,
|
||||
.Nm ppt
|
||||
and
|
||||
.Nm morse
|
||||
@@ -65,10 +66,13 @@ The
|
||||
.Fl s
|
||||
option for morse produces dots and dashes rather than words.
|
||||
.It Fl d
|
||||
Decode morse output consisting of dots and slashes (as generated
|
||||
by using the
|
||||
Decode
|
||||
.Nm ppt
|
||||
output, or
|
||||
.Nm morse
|
||||
output consisting of dots and slashes (as generated by using the
|
||||
.Fl s
|
||||
option.
|
||||
option).
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Rs
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: boggle.6,v 1.3 2001/04/02 22:46:18 wiz Exp $
|
||||
.\" $NetBSD: boggle.6,v 1.5 2002/09/26 18:31:59 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@@ -103,8 +103,8 @@ Help is available during play by typing
|
||||
More detailed information on the game is given there.
|
||||
.Sh BUGS
|
||||
If there are a great many words in the cube the final display of the words
|
||||
may scroll off of the screen. (On a 25 line screen about 130 words can be
|
||||
displayed.)
|
||||
may scroll off of the screen.
|
||||
(On a 25 line screen about 130 words can be displayed.)
|
||||
.Pp
|
||||
No word can contain a
|
||||
.Sq q
|
||||
@@ -115,8 +115,7 @@ When using the
|
||||
.Ar +
|
||||
or
|
||||
.Ar ++
|
||||
options the display of words found in the board
|
||||
doesn't indicate reused cubes.
|
||||
options the display of words found in the board doesn't indicate reused cubes.
|
||||
.Sh AUTHOR
|
||||
Boggle is a trademark of Parker Brothers.
|
||||
.Pp
|
||||
|
||||
41
configure
vendored
41
configure
vendored
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# configure - home-grown configuration script for bsd-games.
|
||||
#
|
||||
# Copyright (c) 1997, 1998, 1999, 2000 Joseph Samuel Myers.
|
||||
# Copyright (c) 1997, 1998, 1999, 2000, 2003 Joseph Samuel Myers.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -338,6 +338,28 @@ echo "this blank. Leave it blank if /usr/include/ncurses is a symbolic link"
|
||||
echo "to /usr/include."
|
||||
ask "Ncurses includes" ncurses_includes ''
|
||||
|
||||
openssl_lib=
|
||||
openssl_includes=
|
||||
if building_in factor; then
|
||||
echo
|
||||
echo "factor can use libcrypto from OpenSSL to handle large numbers."
|
||||
ask_yn "Use libcrypto" use_libcrypto y
|
||||
if [ $use_libcrypto = y ]; then
|
||||
echo "If the OpenSSL includes (with files such as bn.h) are not in"
|
||||
echo "/usr/include/openssl, then you will need to specify a -I option"
|
||||
echo "here, naming a directory containing an \"openssl\" subdirectory"
|
||||
echo "with the OpenSSL headers."
|
||||
ask "OpenSSL includes" openssl_includes ''
|
||||
echo "If the OpenSSL libcrypto library is not in a location searched"
|
||||
echo "by the compiler by default, or has a strange name, you will"
|
||||
echo "need to specify the appropriate options to find it here"
|
||||
echo "(for example, -L/usr/ssl/lib -lcrypto); otherwise, leave the"
|
||||
echo "default, which is probably correct."
|
||||
ask "OpenSSL libcrypto library" openssl_lib -lcrypto
|
||||
fi
|
||||
fi
|
||||
subst_vars="$subst_vars openssl_lib openssl_includes"
|
||||
|
||||
ask "Other CFLAGS" other_cflags ''
|
||||
ask "Other LDFLAGS" other_ldflags ''
|
||||
|
||||
@@ -345,6 +367,10 @@ ask "Other LDFLAGS" other_ldflags ''
|
||||
echo "#ifndef LINUX_BSD_GAMES_H" >include/bsd-games.h
|
||||
echo "#define LINUX_BSD_GAMES_H 1" >>include/bsd-games.h
|
||||
|
||||
if [ "$use_libcrypto" = "y" ]; then
|
||||
echo "#define HAVE_OPENSSL 1" >>include/bsd-games.h
|
||||
fi
|
||||
|
||||
check_func getloadavg <<EOF
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -370,6 +396,19 @@ main(void)
|
||||
}
|
||||
EOF
|
||||
|
||||
check_func strlcpy <<EOF
|
||||
#include <string.h>
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
char s[1] = "";
|
||||
char d[1];
|
||||
strlcpy(d, s, 1);
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "#endif /* !defined(LINUX_BSD_GAMES_H) */" >>include/bsd-games.h
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: countmail.6,v 1.5 1999/03/22 18:49:11 garbled Exp $
|
||||
.\" $NetBSD: countmail.6,v 1.8 2002/09/26 18:32:00 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1997 Matthew R. Green
|
||||
.\" All rights reserved.
|
||||
@@ -44,8 +44,11 @@ The
|
||||
program first appeared in
|
||||
.Nx 1.3 .
|
||||
.Nm
|
||||
was first written by Noah Friedman <friedman@splode.com> in 1993.
|
||||
This version was written by Charles M. Hannum <mycroft@netbsd.org>.
|
||||
was first written by
|
||||
.An Noah Friedman Aq friedman@splode.com
|
||||
in 1993.
|
||||
This version was written by Charles M. Hannum
|
||||
.Aq mycroft@netbsd.org .
|
||||
.Sh CAVEATS
|
||||
The read loop is horrendously slow on every shell implementation tried.
|
||||
.Nm
|
||||
|
||||
17
debian/changelog
vendored
17
debian/changelog
vendored
@@ -1,3 +1,20 @@
|
||||
bsdgames (2.14-1) unstable; urgency=low
|
||||
|
||||
* New upstream release, whivh includes hack, back fron bsdgames-nonfree.
|
||||
* Conflict and replace with old versions of bsdgames-nonfree that include
|
||||
hack.
|
||||
* Add hack to package description and menu file.
|
||||
* Add in hack's two READ_ME files to binay package.
|
||||
* Patched hack config.h as it is patched in bsdgames-nonfree.
|
||||
* Unlike bsdgames-nonfree, put the help, hh, rumors, and data files in
|
||||
/usr/share/games/bsdgames/hack, as the patched config.h makes it look
|
||||
there.
|
||||
* postinst moves over hack state files to new directory
|
||||
* Patched phantasia to use strerror and not segfault if it cannot open the
|
||||
var files. Closes: #187251 (patch sent upstream)
|
||||
|
||||
-- Joey Hess <joeyh@debian.org> Wed, 2 Apr 2003 20:44:19 -0500
|
||||
|
||||
bsdgames (2.13-11) unstable; urgency=low
|
||||
|
||||
* Fixed silly typo in wargames man page. Closes: #169307
|
||||
|
||||
14
debian/control
vendored
14
debian/control
vendored
@@ -3,19 +3,19 @@ Section: games
|
||||
Priority: optional
|
||||
Build-Depends: debhelper (>= 4), libncurses5-dev, flex, bison, wenglish, wbritish, dpkg-dev (>= 1.9.0)
|
||||
Maintainer: Joey Hess <joeyh@debian.org>
|
||||
Standards-Version: 3.5.7.1
|
||||
Standards-Version: 3.5.9.0
|
||||
|
||||
Package: bsdgames
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, wenglish | wordlist
|
||||
Conflicts: bsdgames-nonfree (<< 2.5), suidmanager (<< 0.50)
|
||||
Replaces: bsdgames-nonfree (<< 2.5)
|
||||
Description: collection of text games from BSD systems
|
||||
Conflicts: bsdgames-nonfree (<< 2.14), suidmanager (<< 0.50)
|
||||
Replaces: bsdgames-nonfree (<< 2.14)
|
||||
Description: a collection of classic textual unix games
|
||||
This is a collection of some of the text-based games and amusements that have
|
||||
been enjoyed for decades on unix systems.
|
||||
.
|
||||
Includes these programs: adventure, arithmetic, atc, backgammon, battlestar,
|
||||
bcd, boggle, caesar, canfield, countmail, cribbage, fish, gomoku, hangman,
|
||||
hunt, mille, monop, morse, number, pig, phantasia, pom, ppt, primes, quiz,
|
||||
random, rain, robots, sail, snake, tetris, trek, wargames, worm, worms,
|
||||
bcd, boggle, caesar, canfield, countmail, cribbage, fish, gomoku, hack,
|
||||
hangman, hunt, mille, monop, morse, number, pig, phantasia, pom, ppt, primes,
|
||||
quiz, random, rain, robots, sail, snake, tetris, trek, wargames, worm, worms,
|
||||
wump, wtf
|
||||
|
||||
2
debian/menu
vendored
2
debian/menu
vendored
@@ -5,6 +5,8 @@
|
||||
command="sh -c '/usr/games/atc ; echo;echo PRESS ENTER;read line'"
|
||||
?package(bsdgames):needs="text" section="Games/Adventure" \
|
||||
title="Battlestar" command="sh -c '/usr/games/battlestar;echo PRESS ENTER;read line'"
|
||||
?package(bsdgames):needs="text" section="Games/Adventure" \
|
||||
title="Hack" command=/usr/games/hack
|
||||
?package(bsdgames):needs="text" section="Games/Card" \
|
||||
title="Canfield" command="/usr/games/canfield"
|
||||
?package(bsdgames):needs="text" section="Games/Card" \
|
||||
|
||||
18
debian/postinst
vendored
18
debian/postinst
vendored
@@ -17,8 +17,24 @@ SCOREFILES="
|
||||
/var/games/bsdgames/phantasia/motd
|
||||
/var/games/bsdgames/phantasia/scoreboard
|
||||
/var/games/bsdgames/phantasia/void
|
||||
/var/games/bsdgames/phantasia/monsters"
|
||||
/var/games/bsdgames/phantasia/monsters
|
||||
/var/games/bsdgames/hack/perm
|
||||
/var/games/bsdgames/hack/record"
|
||||
|
||||
# Hack moved over from bsdgames-nonfree.
|
||||
if [ -d /var/games/bsdgames-nonfree ]; then
|
||||
for file in perm record; do
|
||||
if [ -e /var/games/bsdgames-nonfree/hack/$file ]; then
|
||||
mv -f /var/games/bsdgames-nonfree/hack/$file \
|
||||
/var/games/bsdgames/hack/$file
|
||||
fi
|
||||
done
|
||||
cp -a -f /var/games/bsdgames-nonfree/hack/save/* \
|
||||
/var/games/bsdgames/hack/save/ 2>/dev/null || true
|
||||
rm -f /var/games/bsdgames-nonfree/hack/save/* 2>/dev/null || true
|
||||
rmdir -p /var/games/bsdgames-nonfree/hack/save 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# These files cannot just be zero-byte files:
|
||||
if [ ! -e /var/games/bsdgames/phantasia/void ]; then
|
||||
cp /usr/share/games/bsdgames/phantasia/void \
|
||||
|
||||
6
debian/postrm
vendored
6
debian/postrm
vendored
@@ -17,13 +17,17 @@ SCOREFILES="
|
||||
/var/games/bsdgames/phantasia/motd
|
||||
/var/games/bsdgames/phantasia/scoreboard
|
||||
/var/games/bsdgames/phantasia/void
|
||||
/var/games/bsdgames/phantasia/monsters"
|
||||
/var/games/bsdgames/phantasia/monsters
|
||||
/var/games/bsdgames/hack/perm
|
||||
/var/games/bsdgames/hack/record"
|
||||
|
||||
# Remove high score files on purge.
|
||||
if [ "$1" = "purge" ]; then
|
||||
rm -f $SCOREFILES
|
||||
rmdir /var/games/bsdgames/phantasia /var/games/bsdgames/sail \
|
||||
/var/games/bsdgames /var/games 2>/dev/null || true
|
||||
rm -f /var/games/bsdgames/hack/save/* 2>/dev/null || true
|
||||
rmdir -p /var/games/bsdgames/hack/save 2>/dev/null || true
|
||||
fi
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
19
debian/rules
vendored
19
debian/rules
vendored
@@ -27,7 +27,8 @@ binary-arch: build
|
||||
dh_testroot
|
||||
dh_clean
|
||||
dh_installdirs usr/share/doc/bsdgames \
|
||||
usr/share/games/bsdgames/phantasia
|
||||
usr/share/games/bsdgames/phantasia \
|
||||
var/games/bsdgames/hack/save
|
||||
|
||||
$(MAKE) install
|
||||
cp atc/BUGS debian/bsdgames/usr/share/doc/bsdgames/BUGS.atc
|
||||
@@ -36,6 +37,8 @@ binary-arch: build
|
||||
cp phantasia/README debian/bsdgames/usr/share/doc/bsdgames/README.phantasia
|
||||
cp boggle/README debian/bsdgames/usr/share/doc/bsdgames/README.boggle
|
||||
cp boggle/README.linux debian/bsdgames/usr/share/doc/bsdgames/README.linux.boggle
|
||||
cp hack/Original_READ_ME debian/bsdgames/usr/share/doc/bsdgames/Original_READ_ME.hack
|
||||
cp hack/READ_ME debian/bsdgames/usr/share/doc/bsdgames/READ_ME.hack
|
||||
# Since factor is not installed, and primes.6 is a symlink to
|
||||
# factor.6, I need to change that to the actual man page.
|
||||
-rm -f debian/bsdgames/usr/share/man/man6/factor.6.gz \
|
||||
@@ -68,7 +71,8 @@ binary-arch: build
|
||||
debian/bsdgames/usr/games/snake \
|
||||
debian/bsdgames/usr/games/tetris-bsd \
|
||||
debian/bsdgames/usr/games/phantasia \
|
||||
debian/bsdgames/usr/games/sail
|
||||
debian/bsdgames/usr/games/sail \
|
||||
debian/bsdgames/usr/games/hack
|
||||
chmod g+s debian/bsdgames/usr/games/atc \
|
||||
debian/bsdgames/usr/games/battlestar \
|
||||
debian/bsdgames/usr/games/canfield \
|
||||
@@ -77,15 +81,20 @@ binary-arch: build
|
||||
debian/bsdgames/usr/games/snake \
|
||||
debian/bsdgames/usr/games/tetris-bsd \
|
||||
debian/bsdgames/usr/games/phantasia \
|
||||
debian/bsdgames/usr/games/sail
|
||||
debian/bsdgames/usr/games/sail \
|
||||
debian/bsdgames/usr/games/hack
|
||||
# The game directories need to be sgid too, and let's
|
||||
# remove all the zero byte score files in them.
|
||||
chown root.games debian/bsdgames/var/games/bsdgames/ \
|
||||
debian/bsdgames/var/games/bsdgames/sail \
|
||||
debian/bsdgames/var/games/bsdgames/phantasia
|
||||
debian/bsdgames/var/games/bsdgames/phantasia \
|
||||
debian/bsdgames/var/games/bsdgames/hack \
|
||||
debian/bsdgames/var/games/bsdgames/hack/save
|
||||
chmod g+rws debian/bsdgames/var/games/bsdgames/ \
|
||||
debian/bsdgames/var/games/bsdgames/sail \
|
||||
debian/bsdgames/var/games/bsdgames/phantasia
|
||||
debian/bsdgames/var/games/bsdgames/phantasia \
|
||||
debian/bsdgames/var/games/bsdgames/hack \
|
||||
debian/bsdgames/var/games/bsdgames/hack/save
|
||||
find debian/bsdgames/var/games/bsdgames -size 0 -exec rm {} \;
|
||||
|
||||
dh_installdeb
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: factor.6,v 1.5 1997/10/10 12:51:27 lukem Exp $
|
||||
.\" $NetBSD: factor.6,v 1.7 2002/09/26 18:32:01 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1989, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@@ -46,8 +46,7 @@
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm primes
|
||||
.Nd
|
||||
generate primes
|
||||
.Nd generate primes
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Ar number ...
|
||||
@@ -86,6 +85,10 @@ The
|
||||
.Ar start
|
||||
value is terminated by a non-digit character (such as a newline).
|
||||
The input line must not be longer than 255 characters.
|
||||
.Sh DIAGNOSTICS
|
||||
Out of range or invalid input results in
|
||||
.Sq ouch
|
||||
being written to standard error.
|
||||
.Sh BUGS
|
||||
.Nm primes
|
||||
won't get you a world record.
|
||||
|
||||
@@ -56,7 +56,8 @@ hack_install: hack_all
|
||||
$(INSTALL_SCORE_GAME) hack/hack $(INSTALL_PREFIX)$(GAMESDIR)/hack
|
||||
$(HIDE_GAME) hack
|
||||
$(INSTALL_HACK_DIR) $(INSTALL_PREFIX)$(HACK_DIR)
|
||||
set -e; for f in data help hh rumors; do $(INSTALL_DATA) hack/$$f $(INSTALL_PREFIX)$(HACK_DIR)/$$f; done
|
||||
install -d $(INSTALL_PREFIX)/usr/share/games/bsdgames/hack
|
||||
set -e; for f in data help hh rumors; do $(INSTALL_DATA) hack/$$f $(INSTALL_PREFIX)/usr/share/games/bsdgames/hack/$$f; done
|
||||
$(INSTALL_SCORE_FILE) $(HACK_DIR)/perm
|
||||
$(INSTALL_SCORE_FILE) $(HACK_DIR)/record
|
||||
$(INSTALL_MANUAL) hack/hack.6
|
||||
|
||||
@@ -88,13 +88,19 @@
|
||||
/* #define PYRAMID_BUG */ /* avoid a bug on the Pyramid */
|
||||
/* #define NOWAITINCLUDE */ /* neither <wait.h> nor <sys/wait.h> exists */
|
||||
|
||||
#define WIZARD "bruno" /* the person allowed to use the -D option */
|
||||
//#define WIZARD "bruno" /* the person allowed to use the -D option */
|
||||
/*
|
||||
* Debian mods: use root for WIZARD, and move files that are static to
|
||||
* /usr/share/ -- JEH
|
||||
*/
|
||||
#define WIZARD "root" /* the person allowed to use the -D option */
|
||||
#define SHAREDIR "/usr/share/games/bsdgames/hack/"
|
||||
#define RECORD "record"/* the file containing the list of topscorers */
|
||||
#define NEWS "news" /* the file containing the latest hack news */
|
||||
#define HELP "help" /* the file containing a description of the commands */
|
||||
#define SHELP "hh" /* abbreviated form of the same */
|
||||
#define RUMORFILE "rumors" /* a file with fortune cookies */
|
||||
#define DATAFILE "data" /* a file giving the meaning of symbols used */
|
||||
#define HELP SHAREDIR "help" /* the file containing a description of the commands */
|
||||
#define SHELP SHAREDIR "hh" /* abbreviated form of the same */
|
||||
#define RUMORFILE SHAREDIR "rumors" /* a file with fortune cookies */
|
||||
#define DATAFILE SHAREDIR "data" /* a file giving the meaning of symbols used */
|
||||
#define FMASK 0660 /* file creation mask */
|
||||
#define HLOCK "perm" /* an empty file used for locking purposes */
|
||||
#define LLOCK "safelock" /* link to previous */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: extern.c,v 1.6 1999/09/17 20:45:48 jsm Exp $ */
|
||||
/* $NetBSD: extern.c,v 1.7 2002/01/20 00:42:51 jsm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
@@ -38,7 +38,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)extern.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: extern.c,v 1.6 1999/09/17 20:45:48 jsm Exp $");
|
||||
__RCSID("$NetBSD: extern.c,v 1.7 2002/01/20 00:42:51 jsm Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: getword.c,v 1.6 1999/09/08 21:57:17 jsm Exp $ */
|
||||
/* $NetBSD: getword.c,v 1.7 2002/01/20 00:42:51 jsm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
@@ -38,7 +38,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)getword.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: getword.c,v 1.6 1999/09/08 21:57:17 jsm Exp $");
|
||||
__RCSID("$NetBSD: getword.c,v 1.7 2002/01/20 00:42:51 jsm Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: hangman.6,v 1.7 1999/09/17 20:45:49 jsm Exp $
|
||||
.\" $NetBSD: hangman.6,v 1.11 2003/02/25 10:34:46 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1983, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@@ -38,14 +38,14 @@
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm hangman
|
||||
.Nd Computer version of the game hangman
|
||||
.Nd computer version of the game hangman
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl d Ar wordlist
|
||||
.Op Fl m Ar minlen
|
||||
.Sh DESCRIPTION
|
||||
In
|
||||
.Nm "" ,
|
||||
.Nm ,
|
||||
the computer picks a word from the on-line word list
|
||||
and you must try to guess it.
|
||||
The computer keeps track of which letters have been guessed
|
||||
@@ -57,12 +57,13 @@ Use the specified
|
||||
.Ar wordlist
|
||||
instead of the default one named below.
|
||||
.It Fl m
|
||||
Set the minimum word length to use. The default is 6 letters.
|
||||
Set the minimum word length to use.
|
||||
The default is 6 letters.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width @hangman_wordsfile@ -compact
|
||||
.It Pa @hangman_wordsfile@
|
||||
On-line word list
|
||||
.El
|
||||
.Sh AUTHOR
|
||||
Ken Arnold
|
||||
.Sh AUTHORS
|
||||
.An Ken Arnold
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: hangman.h,v 1.10 1999/09/17 20:45:49 jsm Exp $ */
|
||||
/* $NetBSD: hangman.h,v 1.11 2002/01/20 00:42:51 jsm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.9 2000/05/08 07:56:04 mycroft Exp $ */
|
||||
/* $NetBSD: main.c,v 1.10 2002/01/20 00:42:51 jsm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
@@ -43,10 +43,11 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 1993\n\
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.9 2000/05/08 07:56:04 mycroft Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.10 2002/01/20 00:42:51 jsm Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <err.h>
|
||||
#include "hangman.h"
|
||||
|
||||
/*
|
||||
@@ -62,17 +63,15 @@ main(argc, argv)
|
||||
/* Revoke setgid privileges */
|
||||
setregid(getgid(), getgid());
|
||||
|
||||
while ((ch = getopt(argc, argv, "m:d:")) != -1) {
|
||||
while ((ch = getopt(argc, argv, "d:m:")) != -1) {
|
||||
switch (ch) {
|
||||
case 'd':
|
||||
Dict_name = optarg;
|
||||
break;
|
||||
case 'm':
|
||||
Minlen = atoi(optarg);
|
||||
if (Minlen < 2) {
|
||||
fprintf(stderr, "minlen too short\n");
|
||||
exit(1);
|
||||
}
|
||||
if (Minlen < 2)
|
||||
errx(1, "minimum word length too short");
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: hunt.6,v 1.4 2001/04/04 11:41:01 wiz Exp $
|
||||
.\" $NetBSD: hunt.6,v 1.9 2003/02/25 10:34:46 wiz Exp $
|
||||
.\"
|
||||
.\" hunt
|
||||
.\" Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
|
||||
@@ -31,8 +31,7 @@ walls and players.
|
||||
The more players you kill before you die, the better your score is.
|
||||
If the
|
||||
.Fl m
|
||||
flag is given,
|
||||
you enter the game as a monitor
|
||||
flag is given, you enter the game as a monitor
|
||||
(you can see the action but you cannot play).
|
||||
.Pp
|
||||
.Nm
|
||||
@@ -44,8 +43,7 @@ argument.
|
||||
This presupposes that a hunt game is already running on that host, see
|
||||
.Xr huntd 6
|
||||
for details on how to setup a game on a specific host.
|
||||
If more than one game if found,
|
||||
you may pick which game to play in.
|
||||
If more than one game if found, you may pick which game to play in.
|
||||
.Pp
|
||||
If the
|
||||
.Fl q
|
||||
@@ -53,8 +51,9 @@ flag is given,
|
||||
.Nm
|
||||
queries the local network (or specific host)
|
||||
and reports on all active games found.
|
||||
This is useful for shell startup scripts, e.g.\&
|
||||
.Xr csh 1 Ns 's No .login .
|
||||
This is useful for shell startup scripts, e.g.,
|
||||
.Xr csh 1 Ns 's
|
||||
.Pa .login .
|
||||
.Pp
|
||||
The player name may be specified on the command line by using the
|
||||
.Fl n
|
||||
@@ -107,23 +106,18 @@ mailing list (see
|
||||
.Xr huntd 6 ) .
|
||||
.Sh PLAYING HINTS
|
||||
.Nm
|
||||
only works on crt (vdt) terminals with at least 24 lines, 80 columns, and
|
||||
only works on CRT (vdt) terminals with at least 24 lines, 80 columns, and
|
||||
cursor addressing.
|
||||
The screen is divided in to 3 areas.
|
||||
On the right hand side is the status area.
|
||||
It shows damage sustained,
|
||||
charges remaining,
|
||||
who's in the game,
|
||||
It shows damage sustained, charges remaining, who's in the game,
|
||||
who's scanning (the
|
||||
.Dq *
|
||||
in front of the name),
|
||||
who's cloaked (the
|
||||
in front of the name), who's cloaked (the
|
||||
.Dq +
|
||||
in front of the name),
|
||||
and other players' scores.
|
||||
in front of the name), and other players' scores.
|
||||
The rest of the screen is taken up by your map of the maze.
|
||||
The 24th line
|
||||
is used for longer messages that don't fit in the status area.
|
||||
The 24th line is used for longer messages that don't fit in the status area.
|
||||
.Pp
|
||||
.Nm
|
||||
uses the same keys to move as
|
||||
@@ -205,7 +199,7 @@ bomb
|
||||
small slime
|
||||
.It $
|
||||
big slime
|
||||
.It ><^v
|
||||
.It \*[Gt]\*[Lt]^v
|
||||
you facing right, left, up, or down
|
||||
.It }{i!
|
||||
other players facing right, left, up, or down
|
||||
@@ -226,8 +220,7 @@ You can only fire three shots in a row, then the gun must cool off.
|
||||
.It
|
||||
Shots move 5 times faster than you do.
|
||||
.It
|
||||
To stab someone,
|
||||
you face that player and move at them.
|
||||
To stab someone, you face that player and move at them.
|
||||
.It
|
||||
Stabbing does 2 points worth of damage and shooting does 5 points.
|
||||
.It
|
||||
@@ -246,8 +239,7 @@ The number of squares is equal to the number of charges used.
|
||||
.It
|
||||
One small mine and one large mine is placed in the maze for every new player.
|
||||
A mine has a 2% probability of tripping when you walk forward on to it;
|
||||
50% when going sideways;
|
||||
95% when backing up.
|
||||
50% when going sideways; 95% when backing up.
|
||||
Tripping a mine costs you 5 points or 10 points respectively.
|
||||
Defusing a mine is worth 1 charge or 9 charges respectively.
|
||||
.It
|
||||
@@ -280,17 +272,16 @@ Slime goes around walls, not through them.
|
||||
Walls regenerate, reappearing in the order they were destroyed.
|
||||
One percent of the regenerated walls will be diagonal walls or doors.
|
||||
When a wall is generated directly beneath a player, he is thrown in
|
||||
a random direction for a random period of time. When he lands, he
|
||||
sustains damage (up to 20 percent of the amount of damage already
|
||||
sustained); i.e.,
|
||||
the less damage he had, the more nimble he is and
|
||||
therefore less likely to hurt himself on landing.
|
||||
a random direction for a random period of time.
|
||||
When he lands, he sustains damage (up to 20 percent of the amount of
|
||||
damage already sustained); i.e., the less damage he had, the more nimble
|
||||
he is and therefore less likely to hurt himself on landing.
|
||||
.\"MP
|
||||
.\"There is a volcano close to the center of the maze which goes off
|
||||
.\"close to every 30 deaths.
|
||||
.It
|
||||
Every 30 deaths or so, a
|
||||
.Dq ?
|
||||
.Dq \&?
|
||||
will appear.
|
||||
It is a wandering bomb which will explode when it hits someone, or
|
||||
when it is slimed.
|
||||
@@ -306,10 +297,8 @@ will ask you what name you want to play under.
|
||||
If you wish to set other options than just your name,
|
||||
you can enumerate the options as follows:
|
||||
.Dl setenv HUNT "name=Sneaky,team=1,cloak,mapkey=zoFfGg1f2g3F4G"
|
||||
sets the player name to Sneaky,
|
||||
sets the team to one,
|
||||
sets the enter game attribute to cloaked,
|
||||
and the maps
|
||||
sets the player name to Sneaky, sets the team to one,
|
||||
sets the enter game attribute to cloaked, and the maps
|
||||
.Ic z
|
||||
to
|
||||
.Ic o , F
|
||||
@@ -333,8 +322,8 @@ option must be last.
|
||||
Other options are:
|
||||
.Ar scan , fly , nobeep , port=string , host=string ,
|
||||
and
|
||||
.Ar message=string
|
||||
\(em which correspond to the command line options.
|
||||
.Ar message=string ,
|
||||
which correspond to the command line options.
|
||||
String options cannot contain commas since commas
|
||||
are used to separate options.
|
||||
.It
|
||||
@@ -396,7 +385,6 @@ We thank Don Kneller,
|
||||
John Thomason, Eric Pettersen, Mark Day,
|
||||
and Scott Weiner for providing
|
||||
endless hours of play-testing to improve the character of the game.
|
||||
We hope their significant others will forgive them;
|
||||
we certainly don't.
|
||||
We hope their significant others will forgive them; we certainly don't.
|
||||
.Sh BUGS
|
||||
To keep up the pace, not everything is as realistic as possible.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: hunt.c,v 1.12 2001/02/05 00:40:45 christos Exp $ */
|
||||
/* $NetBSD: hunt.c,v 1.16 2002/12/06 01:50:56 thorpej Exp $ */
|
||||
/*
|
||||
* Hunt
|
||||
* Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
|
||||
@@ -7,12 +7,13 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: hunt.c,v 1.12 2001/02/05 00:40:45 christos Exp $");
|
||||
__RCSID("$NetBSD: hunt.c,v 1.16 2002/12/06 01:50:56 thorpej Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
# include <sys/param.h>
|
||||
# include <sys/stat.h>
|
||||
# include <sys/time.h>
|
||||
# include <sys/poll.h>
|
||||
# include <ctype.h>
|
||||
# include <err.h>
|
||||
# include <errno.h>
|
||||
@@ -48,10 +49,6 @@ static struct termios saved_tty;
|
||||
# define put_str addstr
|
||||
# endif
|
||||
|
||||
#if !defined(BSD_RELEASE) || BSD_RELEASE < 44
|
||||
extern int _putchar();
|
||||
#endif
|
||||
|
||||
#ifndef MAXHOSTNAMELEN
|
||||
#define MAXHOSTNAMELEN 256
|
||||
#endif
|
||||
@@ -411,8 +408,7 @@ list_drivers()
|
||||
static SOCKET *listv;
|
||||
static unsigned int listmax;
|
||||
unsigned int listc;
|
||||
fd_set mask;
|
||||
struct timeval wait;
|
||||
struct pollfd set[1];
|
||||
|
||||
if (initial) { /* do one time initialization */
|
||||
# ifndef BROADCAST
|
||||
@@ -465,13 +461,7 @@ list_drivers()
|
||||
|
||||
# ifdef BROADCAST
|
||||
if (initial)
|
||||
brdc = broadcast_vec(test_socket, (struct sockaddr **) &brdv);
|
||||
|
||||
if (brdc <= 0) {
|
||||
initial = FALSE;
|
||||
test.sin_addr = local_address;
|
||||
goto test_one_host;
|
||||
}
|
||||
brdc = broadcast_vec(test_socket, (void *) &brdv);
|
||||
|
||||
# ifdef SO_BROADCAST
|
||||
/* Sun's will broadcast even though this option can't be set */
|
||||
@@ -495,6 +485,13 @@ list_drivers()
|
||||
/* NOTREACHED */
|
||||
}
|
||||
}
|
||||
test.sin_addr = local_address;
|
||||
if (sendto(test_socket, (char *) &msg, sizeof msg, 0,
|
||||
(struct sockaddr *) &test, DAEMON_SIZE) < 0) {
|
||||
warn("sendto");
|
||||
leave(1, "sendto");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
# else /* !BROADCAST */
|
||||
/* loop thru all hosts on local net and send msg to them. */
|
||||
msg = htons(C_TESTMSG());
|
||||
@@ -512,9 +509,9 @@ list_drivers()
|
||||
get_response:
|
||||
namelen = DAEMON_SIZE;
|
||||
errno = 0;
|
||||
set[0].fd = test_socket;
|
||||
set[0].events = POLLIN;
|
||||
for (;;) {
|
||||
wait.tv_sec = 1;
|
||||
wait.tv_usec = 0;
|
||||
if (listc + 1 >= listmax) {
|
||||
listmax += 20;
|
||||
listv = (SOCKET *) realloc((char *) listv,
|
||||
@@ -523,9 +520,7 @@ get_response:
|
||||
leave(1, "Out of memory!");
|
||||
}
|
||||
|
||||
FD_ZERO(&mask);
|
||||
FD_SET(test_socket, &mask);
|
||||
if (select(test_socket + 1, &mask, NULL, NULL, &wait) == 1 &&
|
||||
if (poll(set, 1, 1000) == 1 &&
|
||||
recvfrom(test_socket, (char *) &port_num, sizeof(port_num),
|
||||
0, (struct sockaddr *) &listv[listc], &namelen) > 0) {
|
||||
/*
|
||||
@@ -543,8 +538,8 @@ get_response:
|
||||
}
|
||||
|
||||
if (errno != 0 && errno != EINTR) {
|
||||
warn("select/recvfrom");
|
||||
leave(1, "select/recvfrom");
|
||||
warn("poll/recvfrom");
|
||||
leave(1, "poll/recvfrom");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.5 1998/08/30 09:19:39 veego Exp $ */
|
||||
/* $NetBSD: main.c,v 1.10 2001/12/06 12:15:37 blymn Exp $ */
|
||||
|
||||
/*
|
||||
* Phantasia 3.3.2 -- Interterminal fantasy game
|
||||
@@ -288,6 +288,8 @@ initialstate()
|
||||
if ((Playersfp = fopen(_PATH_PEOPLE, "r+")) == NULL)
|
||||
error(_PATH_PEOPLE);
|
||||
/* NOTREACHED */
|
||||
if (fileno(Playersfp) < 3)
|
||||
exit(1);
|
||||
|
||||
if ((Monstfp = fopen(_PATH_MONST, "r+")) == NULL)
|
||||
error(_PATH_MONST);
|
||||
@@ -384,7 +386,7 @@ rollnewplayer()
|
||||
do {
|
||||
mvaddstr(20, 0, "Give your character a password [up to 8 characters] ? ");
|
||||
getstring(Player.p_password, SZ_PASSWORD);
|
||||
mvaddstr(21, 0, "One more time to verify ? ");
|
||||
mvaddstr(21, 0, "Enter again to verify: ");
|
||||
getstring(Databuf, SZ_PASSWORD);
|
||||
}
|
||||
while (strcmp(Player.p_password, Databuf) != 0);
|
||||
@@ -627,7 +629,7 @@ titlelist()
|
||||
fclose(fp);
|
||||
}
|
||||
/* search for king */
|
||||
fseek(Playersfp, 0L, 0);
|
||||
fseek(Playersfp, 0L, SEEK_SET);
|
||||
while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1)
|
||||
if (Other.p_specialtype == SC_KING &&
|
||||
Other.p_status != S_NOTUSED)
|
||||
@@ -643,7 +645,7 @@ titlelist()
|
||||
mvaddstr(4, 24, "There is no ruler at this time.");
|
||||
|
||||
/* search for valar */
|
||||
fseek(Playersfp, 0L, 0);
|
||||
fseek(Playersfp, 0L, SEEK_SET);
|
||||
while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1)
|
||||
if (Other.p_specialtype == SC_VALAR && Other.p_status != S_NOTUSED)
|
||||
/* found the valar */
|
||||
@@ -653,7 +655,7 @@ titlelist()
|
||||
break;
|
||||
}
|
||||
/* search for council of the wise */
|
||||
fseek(Playersfp, 0L, 0);
|
||||
fseek(Playersfp, 0L, SEEK_SET);
|
||||
Lines = 10;
|
||||
while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1)
|
||||
if (Other.p_specialtype == SC_COUNCIL && Other.p_status != S_NOTUSED)
|
||||
@@ -672,7 +674,7 @@ titlelist()
|
||||
hiexp = 0.0;
|
||||
nxtlvl = hilvl = 0;
|
||||
|
||||
fseek(Playersfp, 0L, 0);
|
||||
fseek(Playersfp, 0L, SEEK_SET);
|
||||
while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1)
|
||||
if (Other.p_experience > hiexp && Other.p_specialtype <= SC_KING && Other.p_status != S_NOTUSED)
|
||||
/* highest found so far */
|
||||
@@ -874,7 +876,7 @@ genchar(type)
|
||||
int type;
|
||||
{
|
||||
int subscript; /* used for subscripting into Stattable */
|
||||
struct charstats *statptr; /* for pointing into Stattable */
|
||||
const struct charstats *statptr; /* for pointing into Stattable */
|
||||
|
||||
subscript = type - '1';
|
||||
|
||||
@@ -983,7 +985,7 @@ playinit()
|
||||
|
||||
initscr(); /* turn on curses */
|
||||
noecho(); /* do not echo input */
|
||||
crmode(); /* do not process erase, kill */
|
||||
cbreak(); /* do not process erase, kill */
|
||||
#ifdef NCURSES_VERSION /* Ncurses needs some terminal mode fiddling */
|
||||
tcgetattr(0, &tty);
|
||||
tty.c_iflag |= ICRNL;
|
||||
@@ -1001,13 +1003,17 @@ cleanup(doexit)
|
||||
if (Windows) {
|
||||
move(LINES - 2, 0);
|
||||
refresh();
|
||||
nocrmode();
|
||||
nocbreak();
|
||||
endwin();
|
||||
}
|
||||
fclose(Playersfp);
|
||||
fclose(Monstfp);
|
||||
fclose(Messagefp);
|
||||
fclose(Energyvoidfp);
|
||||
if (Playersfp)
|
||||
fclose(Playersfp);
|
||||
if (Monstfp)
|
||||
fclose(Monstfp);
|
||||
if (Messagefp)
|
||||
fclose(Messagefp);
|
||||
if (Energyvoidfp)
|
||||
fclose(Energyvoidfp);
|
||||
|
||||
if (doexit)
|
||||
exit(0);
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
/* $NetBSD: misc.c,v 1.4 1998/08/30 09:19:39 veego Exp $ */
|
||||
/* $NetBSD: misc.c,v 1.8 2003/01/20 05:29:55 simonb Exp $ */
|
||||
|
||||
/*
|
||||
* misc.c Phantasia miscellaneous support routines
|
||||
*/
|
||||
|
||||
#include "include.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
void
|
||||
movelevel()
|
||||
{
|
||||
struct charstats *statptr; /* for pointing into Stattable */
|
||||
const struct charstats *statptr; /* for pointing into Stattable */
|
||||
double new; /* new level */
|
||||
double inc; /* increment between new and old levels */
|
||||
|
||||
@@ -60,15 +60,15 @@ movelevel()
|
||||
death("Old age");
|
||||
}
|
||||
|
||||
char *
|
||||
const char *
|
||||
descrlocation(playerp, shortflag)
|
||||
struct player *playerp;
|
||||
bool shortflag;
|
||||
{
|
||||
double circle; /* corresponding circle for coordinates */
|
||||
int quadrant; /* quandrant of grid */
|
||||
char *label; /* pointer to place name */
|
||||
static char *nametable[4][4] = /* names of places */
|
||||
const char *label; /* pointer to place name */
|
||||
static const char *const nametable[4][4] = /* names of places */
|
||||
{
|
||||
{"Anorien", "Ithilien", "Rohan", "Lorien"},
|
||||
{"Gondor", "Mordor", "Dunland", "Rovanion"},
|
||||
@@ -412,7 +412,7 @@ displaystats()
|
||||
void
|
||||
allstatslist()
|
||||
{
|
||||
static char *flags[] = /* to print value of some bools */
|
||||
static const char *const flags[] = /* to print value of some bools */
|
||||
{
|
||||
"False",
|
||||
" True"
|
||||
@@ -426,7 +426,7 @@ allstatslist()
|
||||
mvprintw(13, 0, "Sin : %9.5f", Player.p_sin);
|
||||
mvprintw(14, 0, "Poison : %9.5f", Player.p_poison);
|
||||
mvprintw(15, 0, "Gems : %9.0f", Player.p_gems);
|
||||
mvprintw(16, 0, "Age : %9d", Player.p_age);
|
||||
mvprintw(16, 0, "Age : %9ld", Player.p_age);
|
||||
mvprintw(10, 40, "Holy Water: %9d", Player.p_holywater);
|
||||
mvprintw(11, 40, "Amulets : %9d", Player.p_amulets);
|
||||
mvprintw(12, 40, "Charms : %9d", Player.p_charms);
|
||||
@@ -442,13 +442,13 @@ allstatslist()
|
||||
flags[(int)Player.p_palantir]);
|
||||
}
|
||||
|
||||
char *
|
||||
const char *
|
||||
descrtype(playerp, shortflag)
|
||||
struct player *playerp;
|
||||
bool shortflag;
|
||||
{
|
||||
int type; /* for caluculating result subscript */
|
||||
static char *results[] =/* description table */
|
||||
static const char *const results[] =/* description table */
|
||||
{
|
||||
" Magic User", " MU",
|
||||
" Fighter", " F ",
|
||||
@@ -508,12 +508,12 @@ descrtype(playerp, shortflag)
|
||||
|
||||
long
|
||||
findname(name, playerp)
|
||||
char *name;
|
||||
const char *name;
|
||||
struct player *playerp;
|
||||
{
|
||||
long loc = 0; /* location in the file */
|
||||
|
||||
fseek(Playersfp, 0L, 0);
|
||||
fseek(Playersfp, 0L, SEEK_SET);
|
||||
while (fread((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) {
|
||||
if (strcmp(playerp->p_name, name) == 0) {
|
||||
if (playerp->p_status != S_NOTUSED || Wizard)
|
||||
@@ -531,7 +531,7 @@ allocrecord()
|
||||
{
|
||||
long loc = 0L; /* location in file */
|
||||
|
||||
fseek(Playersfp, 0L, 0);
|
||||
fseek(Playersfp, 0L, SEEK_SET);
|
||||
while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) {
|
||||
if (Other.p_status == S_NOTUSED)
|
||||
/* found an empty record */
|
||||
@@ -576,11 +576,11 @@ leavegame()
|
||||
|
||||
void
|
||||
death(how)
|
||||
char *how;
|
||||
const char *how;
|
||||
{
|
||||
FILE *fp; /* for updating various files */
|
||||
int ch; /* input */
|
||||
static char *deathmesg[] =
|
||||
static const char *const deathmesg[] =
|
||||
/* add more messages here, if desired */
|
||||
{
|
||||
"You have been wounded beyond repair. ",
|
||||
@@ -638,10 +638,10 @@ death(how)
|
||||
{
|
||||
mvaddstr(4, 0,
|
||||
"Your ring has taken control of you and turned you into a monster!\n");
|
||||
fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, 0);
|
||||
fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, SEEK_SET);
|
||||
fread((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
|
||||
strcpy(Curmonster.m_name, Player.p_name);
|
||||
fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, 0);
|
||||
fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, SEEK_SET);
|
||||
fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
|
||||
fflush(Monstfp);
|
||||
}
|
||||
@@ -684,7 +684,7 @@ writerecord(playerp, place)
|
||||
struct player *playerp;
|
||||
long place;
|
||||
{
|
||||
fseek(Playersfp, place, 0);
|
||||
fseek(Playersfp, place, SEEK_SET);
|
||||
fwrite((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp);
|
||||
fflush(Playersfp);
|
||||
}
|
||||
@@ -768,7 +768,7 @@ readrecord(playerp, loc)
|
||||
struct player *playerp;
|
||||
long loc;
|
||||
{
|
||||
fseek(Playersfp, loc, 0);
|
||||
fseek(Playersfp, loc, SEEK_SET);
|
||||
fread((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp);
|
||||
}
|
||||
|
||||
@@ -790,7 +790,7 @@ adjuststats()
|
||||
|
||||
/* calculate effective quickness */
|
||||
dtemp = ((Player.p_gold + Player.p_gems / 2.0) - 1000.0) / Statptr->c_goldtote
|
||||
- Player.p_level;;
|
||||
- Player.p_level;
|
||||
dtemp = MAX(0.0, dtemp);/* gold slows player down */
|
||||
Player.p_speed = Player.p_quickness + Player.p_quksilver - dtemp;
|
||||
|
||||
@@ -928,14 +928,14 @@ readmessage()
|
||||
{
|
||||
move(3, 0);
|
||||
clrtoeol();
|
||||
fseek(Messagefp, 0L, 0);
|
||||
fseek(Messagefp, 0L, SEEK_SET);
|
||||
if (fgets(Databuf, SZ_DATABUF, Messagefp) != NULL)
|
||||
addstr(Databuf);
|
||||
}
|
||||
|
||||
void
|
||||
error(whichfile)
|
||||
char *whichfile;
|
||||
const char *whichfile;
|
||||
{
|
||||
int (*funcp) __P((const char *,...));
|
||||
|
||||
@@ -945,7 +945,7 @@ error(whichfile)
|
||||
} else
|
||||
funcp = printf;
|
||||
|
||||
(*funcp) ("An unrecoverable error has occurred reading %s. (errno = %d)\n", whichfile, errno);
|
||||
(*funcp) ("An unrecoverable error has occurred reading %s. (%s)\n", whichfile, strerror(errno));
|
||||
(*funcp) ("Please run 'setup' to determine the problem.\n");
|
||||
cleanup(TRUE);
|
||||
/* NOTREACHED */
|
||||
@@ -973,7 +973,7 @@ ill_sig(whichsig)
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
char *
|
||||
const char *
|
||||
descrstatus(playerp)
|
||||
struct player *playerp;
|
||||
{
|
||||
@@ -1064,7 +1064,7 @@ collecttaxes(gold, gems)
|
||||
dtemp = 0.0;
|
||||
fread((char *) &dtemp, sizeof(double), 1, fp);
|
||||
dtemp += floor(taxes);
|
||||
fseek(fp, 0L, 0);
|
||||
fseek(fp, 0L, SEEK_SET);
|
||||
fwrite((char *) &dtemp, sizeof(double), 1, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
@@ -27,13 +27,14 @@ Luxembourg:Luxembourg
|
||||
Malta:Valletta
|
||||
Moldova:Chisinau|Kishinev
|
||||
Monaco:Monaco
|
||||
Netherlands|Holland:The Hague|'sGravenhage|den Haag|Amsterdam
|
||||
Netherlands|Holland:Amsterdam
|
||||
Norway:Oslo
|
||||
Poland:Wars[aw|zawa]
|
||||
Portugal:Lisbo[n|a]
|
||||
R[u|o]mania:Bucharest|Bucuresti
|
||||
Russia:Mos[cow|kva]
|
||||
San Marino:San Marino
|
||||
Serbia and Montenegro:Belgrade|Beograd
|
||||
Slovakia|Slovak Republic:Bratislava
|
||||
Slovenia:Ljubljana
|
||||
Spain:Madrid
|
||||
@@ -41,4 +42,3 @@ Sweden:Stockholm
|
||||
Switzerland:Bern{e}
|
||||
Turkey:Ankara
|
||||
Ukraine:Kiev|Kyiv
|
||||
Yugoslavia:Belgrade|Beograd
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.17 2001/02/05 01:02:45 christos Exp $ */
|
||||
/* $NetBSD: main.c,v 1.18 2001/12/06 12:17:57 blymn Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1980, 1993
|
||||
@@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.17 2001/02/05 01:02:45 christos Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.18 2001/12/06 12:17:57 blymn Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@@ -152,7 +152,7 @@ main(ac, av)
|
||||
|
||||
initscr();
|
||||
signal(SIGINT, quit);
|
||||
crmode();
|
||||
cbreak();
|
||||
noecho();
|
||||
nonl();
|
||||
if (LINES != Y_SIZE || COLS != X_SIZE) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: snake.c,v 1.16 2000/05/08 07:56:05 mycroft Exp $ */
|
||||
/* $NetBSD: snake.c,v 1.17 2001/08/31 07:17:02 jsm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1980, 1993
|
||||
@@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)snake.c 8.2 (Berkeley) 1/7/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: snake.c,v 1.16 2000/05/08 07:56:05 mycroft Exp $");
|
||||
__RCSID("$NetBSD: snake.c,v 1.17 2001/08/31 07:17:02 jsm Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: scores.c,v 1.10 2000/01/21 02:10:56 jsm Exp $ */
|
||||
/* $NetBSD: scores.c,v 1.11 2002/06/02 22:17:38 wiz Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993
|
||||
@@ -153,8 +153,8 @@ void
|
||||
savescore(level)
|
||||
int level;
|
||||
{
|
||||
register struct highscore *sp;
|
||||
register int i;
|
||||
struct highscore *sp;
|
||||
int i;
|
||||
int change;
|
||||
FILE *sf;
|
||||
const char *me;
|
||||
@@ -219,9 +219,9 @@ savescore(level)
|
||||
static char *
|
||||
thisuser()
|
||||
{
|
||||
register const char *p;
|
||||
register struct passwd *pw;
|
||||
register size_t l;
|
||||
const char *p;
|
||||
struct passwd *pw;
|
||||
size_t l;
|
||||
static char u[sizeof(scores[0].hs_name)];
|
||||
|
||||
if (u[0])
|
||||
@@ -252,8 +252,8 @@ static int
|
||||
cmpscores(x, y)
|
||||
const void *x, *y;
|
||||
{
|
||||
register const struct highscore *a, *b;
|
||||
register long l;
|
||||
const struct highscore *a, *b;
|
||||
long l;
|
||||
|
||||
a = x;
|
||||
b = y;
|
||||
@@ -280,17 +280,17 @@ cmpscores(x, y)
|
||||
*/
|
||||
static int
|
||||
checkscores(hs, num)
|
||||
register struct highscore *hs;
|
||||
struct highscore *hs;
|
||||
int num;
|
||||
{
|
||||
register struct highscore *sp;
|
||||
register int i, j, k, numnames;
|
||||
struct highscore *sp;
|
||||
int i, j, k, numnames;
|
||||
int levelfound[NLEVELS];
|
||||
struct peruser {
|
||||
char *name;
|
||||
int times;
|
||||
} count[NUMSPOTS];
|
||||
register struct peruser *pu;
|
||||
struct peruser *pu;
|
||||
|
||||
/*
|
||||
* Sort so that highest totals come first.
|
||||
@@ -356,8 +356,8 @@ void
|
||||
showscores(level)
|
||||
int level;
|
||||
{
|
||||
register struct highscore *sp;
|
||||
register int i, n, c;
|
||||
struct highscore *sp;
|
||||
int i, n, c;
|
||||
const char *me;
|
||||
int levelfound[NLEVELS];
|
||||
|
||||
@@ -408,11 +408,11 @@ showscores(level)
|
||||
static void
|
||||
printem(level, offset, hs, n, me)
|
||||
int level, offset;
|
||||
register struct highscore *hs;
|
||||
register int n;
|
||||
struct highscore *hs;
|
||||
int n;
|
||||
const char *me;
|
||||
{
|
||||
register struct highscore *sp;
|
||||
struct highscore *sp;
|
||||
int nrows, row, col, item, i, highlight;
|
||||
char buf[100];
|
||||
#define TITLE "Rank Score Name (points/level)"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: screen.c,v 1.15 2000/05/24 14:43:00 blymn Exp $ */
|
||||
/* $NetBSD: screen.c,v 1.16 2001/11/02 18:27:00 christos Exp $ */
|
||||
/* For Linux: still using old termcap interface from version 1.13. */
|
||||
|
||||
/*-
|
||||
@@ -182,13 +182,13 @@ scr_init()
|
||||
stop("cannot find your termcap");
|
||||
fill = combuf;
|
||||
{
|
||||
register struct tcsinfo *p;
|
||||
struct tcsinfo *p;
|
||||
|
||||
for (p = tcstrings; p->tcaddr; p++)
|
||||
*p->tcaddr = tgetstr(p->tcname, &fill);
|
||||
}
|
||||
{
|
||||
register struct tcninfo *p;
|
||||
struct tcninfo *p;
|
||||
|
||||
for (p = tcflags; p->tcaddr; p++)
|
||||
*p->tcaddr = tgetflag(p->tcname);
|
||||
@@ -292,8 +292,8 @@ scr_set()
|
||||
newtt = oldtt;
|
||||
newtt.c_lflag &= ~(ICANON|ECHO);
|
||||
newtt.c_oflag &= ~OXTABS;
|
||||
newtt.c_cc[VMIN] = 1; /* don't lag behind 3 keystrokes on sun */
|
||||
newtt.c_cc[VTIME] = 0; /* systems -- JEH */
|
||||
newtt.c_cc[VMIN] = 1;
|
||||
newtt.c_cc[VTIME] = 0;
|
||||
if (tcsetattr(0, TCSADRAIN, &newtt) < 0)
|
||||
stop("tcsetattr() fails");
|
||||
ospeed = cfgetospeed(&newtt);
|
||||
@@ -378,9 +378,9 @@ typedef cell regcell;
|
||||
void
|
||||
scr_update()
|
||||
{
|
||||
register cell *bp, *sp;
|
||||
register regcell so, cur_so = 0;
|
||||
register int i, ccol, j;
|
||||
cell *bp, *sp;
|
||||
regcell so, cur_so = 0;
|
||||
int i, ccol, j;
|
||||
sigset_t sigset, osigset;
|
||||
static const struct shape *lastshape;
|
||||
|
||||
@@ -490,12 +490,12 @@ scr_update()
|
||||
*/
|
||||
void
|
||||
scr_msg(s, set)
|
||||
register char *s;
|
||||
char *s;
|
||||
int set;
|
||||
{
|
||||
|
||||
if (set || CEstr == NULL) {
|
||||
register int l = strlen(s);
|
||||
int l = strlen(s);
|
||||
|
||||
moveto(Rows - 2, ((Cols - l) >> 1) - 1);
|
||||
if (set)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $NetBSD: tetris.c,v 1.14 2000/01/21 02:10:57 jsm Exp $ */
|
||||
/* $NetBSD: tetris.c,v 1.15 2002/06/02 22:17:38 wiz Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993
|
||||
@@ -92,8 +92,8 @@ static void setup_board __P((void));
|
||||
static void
|
||||
setup_board()
|
||||
{
|
||||
register int i;
|
||||
register cell *p;
|
||||
int i;
|
||||
cell *p;
|
||||
|
||||
p = board;
|
||||
for (i = B_SIZE; i; i--)
|
||||
@@ -106,8 +106,8 @@ setup_board()
|
||||
static void
|
||||
elide()
|
||||
{
|
||||
register int i, j, base;
|
||||
register cell *p;
|
||||
int i, j, base;
|
||||
cell *p;
|
||||
|
||||
for (i = A_FIRST; i < A_LAST; i++) {
|
||||
base = i * B_COLS + 1;
|
||||
@@ -133,9 +133,9 @@ main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
register int pos, c;
|
||||
register const char *keys;
|
||||
register int level = 2;
|
||||
int pos, c;
|
||||
const char *keys;
|
||||
int level = 2;
|
||||
char key_write[6][10];
|
||||
int ch, i, j;
|
||||
int fd;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: trek.6,v 1.8 2001/04/02 22:42:39 wiz Exp $
|
||||
.\" $NetBSD: trek.6,v 1.10 2002/09/26 18:32:05 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1980, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@@ -40,14 +40,15 @@
|
||||
.Nm trek
|
||||
.Nd trekkie game
|
||||
.Sh SYNOPSIS
|
||||
.Nm @gamesdir@/trek
|
||||
.Nm
|
||||
.Oo
|
||||
.Op Fl a
|
||||
.Ar file
|
||||
.Oc
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
is a game of space glory and war. Below is a summary of commands.
|
||||
is a game of space glory and war.
|
||||
Below is a summary of commands.
|
||||
For complete documentation, see
|
||||
.Em Trek
|
||||
by Eric Allman.
|
||||
@@ -79,9 +80,9 @@ You should normally start out with a novice and work up.
|
||||
In general, throughout the game, if you forget what is appropriate
|
||||
the game will tell you what it expects if you just type in a question mark.
|
||||
.Sh AUTHOR
|
||||
Eric Allman
|
||||
.An Eric Allman
|
||||
.Sh SEE ALSO
|
||||
.Pa /usr/share/doc/bsdgames/trek.me.gz
|
||||
.Pa /usr/share/doc/usd/31.trek
|
||||
.Sh COMMAND SUMMARY
|
||||
.Bl -item -compact
|
||||
.It
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/sh -
|
||||
# $NetBSD: wargames.sh,v 1.3 1999/11/16 17:27:14 abs Exp $
|
||||
# $NetBSD: wargames.sh,v 1.4 2001/09/19 04:54:06 lukem Exp $
|
||||
#
|
||||
# Copyright (c) 1985, 1993
|
||||
# The Regents of the University of California. All rights reserved.
|
||||
@@ -43,7 +43,10 @@ if [ -f /usr/games/$x ] ; then
|
||||
tput clear
|
||||
exec /usr/games/$x
|
||||
else
|
||||
# Original quote "Strange game, the only winning move is not to play."
|
||||
echo "Strange, the only winning move is not to play."
|
||||
exec cat <<QUOTE
|
||||
A strange game.
|
||||
The only winning move is
|
||||
not to play.
|
||||
QUOTE
|
||||
fi
|
||||
exit 0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: wargames.6,v 1.1 2000/01/23 21:04:56 jsm Exp $
|
||||
.\" $NetBSD: wargames.6,v 1.4 2002/09/26 18:32:05 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1998 Joey Hess
|
||||
.\" All rights reserved.
|
||||
@@ -39,11 +39,11 @@
|
||||
-- computer,
|
||||
.Nm wargames
|
||||
.Pp
|
||||
Just like in the movie, the computer will happily play a
|
||||
game with you. The likelihood of Global Thermonuclear Warfare
|
||||
resulting is much smaller....
|
||||
Just like in the movie, the computer will happily play a game with you.
|
||||
The likelihood of Global Thermonuclear Warfare resulting is much smaller....
|
||||
.Sh SEE ALSO
|
||||
.Sy Wargames ,
|
||||
the movie (an MGM production, PG 13, directed by John Badham, 1983).
|
||||
.Sh AUTHOR
|
||||
This manual page was written by Joey Hess <joeyh@kitenet.net>.
|
||||
This manual page was written by Joey Hess
|
||||
.Aq joeyh@kitenet.net .
|
||||
|
||||
41
wtf/acronyms
41
wtf/acronyms
@@ -1,10 +1,14 @@
|
||||
$NetBSD: acronyms,v 1.89 2001/08/11 11:57:35 wennmach Exp $
|
||||
$NetBSD: acronyms,v 1.113 2003/02/05 20:11:04 mason Exp $
|
||||
|
||||
AFAICR as far as I can recall
|
||||
AFAICT as far as I can tell
|
||||
AFAIK as far as I know
|
||||
AFAIR as far as I recall
|
||||
AFAIU as far as I understand
|
||||
AFD away from desktop
|
||||
AFK away from keyboard
|
||||
AFW away from window
|
||||
AIU as I understand
|
||||
AIUI as I understand it
|
||||
AKA also known as
|
||||
ASAP as soon as possible
|
||||
@@ -20,34 +24,43 @@ BIALW back in a little while
|
||||
BIAS back in a second
|
||||
BIAW back in a while
|
||||
BOFH bastard operator from hell
|
||||
BOGAHICA bend over, grab ankles, here it comes again
|
||||
BOHICA bend over here it comes again
|
||||
BRB [I'll] be right back
|
||||
BTDT been there, done that
|
||||
BTTH butt to the head
|
||||
BTTH boot to the head
|
||||
BTW by the way
|
||||
CMIIW correct me if I'm wrong
|
||||
CNP continued [in my] next post
|
||||
COB close of business [day]
|
||||
CYA see you around
|
||||
DNDK don't know, don't care
|
||||
DKDC don't know, don't care
|
||||
DSTM don't shoot the messenger
|
||||
DTRT do the right thing
|
||||
DTWT do the wrong thing
|
||||
DWIM do what I mean
|
||||
EG evil grin
|
||||
EMSG email message
|
||||
EOB end of business [day]
|
||||
EOL end of life
|
||||
ETLA extended three letter acronym
|
||||
EWAG experienced wild-ass guess
|
||||
FAQ frequently asked question
|
||||
FIIK fuck[ed] if I know
|
||||
FIIR fuck[ed] if I remember
|
||||
FM fucking magic
|
||||
FOAD fall over and die
|
||||
FSDO for some definition of
|
||||
FSVO for some value of
|
||||
FTFM fuck the fuckin' manual!
|
||||
FUBAR fucked up beyond all recognition
|
||||
FUD fear, uncertainty and doubt
|
||||
FWIW for what it's worth
|
||||
FYI for your information
|
||||
G grin
|
||||
GIGO garbage in, garbage out
|
||||
GMTA great minds think alike
|
||||
GTFO get the fuck out
|
||||
HAND have a nice day
|
||||
HHIS hanging head in shame
|
||||
HTH hope this helps
|
||||
@@ -56,15 +69,18 @@ IHAFC I haven't a fucking clue
|
||||
IHNFC I have no fucking clue
|
||||
IIANM if I am not mistaken
|
||||
IIRC if I recall correctly
|
||||
IMAO in my arrogant opinion
|
||||
IMCO in my considered opinion
|
||||
IMHO in my humble opinion
|
||||
IMNSHO in my not so humble opinion
|
||||
IMO in my opinion
|
||||
IOW in other words
|
||||
IRL in real life
|
||||
ISAGN I see a great need
|
||||
ISTM it seems to me
|
||||
ISTR I seem to recall
|
||||
ITYM I think you mean
|
||||
IYSS If you say so
|
||||
JIC just in case
|
||||
JK just kidding
|
||||
JMO just my opinion
|
||||
@@ -75,9 +91,11 @@ KNF kernel normal form
|
||||
L8R later
|
||||
LART luser attitude readjustment tool (ie, hammer)
|
||||
LJBF let's just be friends
|
||||
LMAO laughing my ass off
|
||||
LMSO laughing my socks off
|
||||
LOL laughing out loud
|
||||
LTNS long time no see
|
||||
MMU memory management unit
|
||||
MOTAS member of the appropriate sex
|
||||
MOTOS member of the opposite sex
|
||||
MOTSS member of the same sex
|
||||
@@ -94,17 +112,25 @@ NRN no reply necessary
|
||||
OIC oh, I see
|
||||
OTL out to lunch
|
||||
OTOH on the other hand
|
||||
OTT over the top
|
||||
OTTOMH off the top of my head
|
||||
PFO please fuck off
|
||||
PFY pimply faced youth
|
||||
PITA pain in the ass
|
||||
PKSP pound keys and spew profanity
|
||||
PNG persona non grata
|
||||
PNP plug and pray
|
||||
POC point of contact
|
||||
POLA principle of least astonishment
|
||||
POS piece of shit
|
||||
PPL pretty please
|
||||
PTV parental tunnel vision
|
||||
QED quod erat demonstrandum
|
||||
RFC request for comments
|
||||
RL real life
|
||||
RLC rod length check
|
||||
ROFL rolling on floor laughing
|
||||
ROFLMAO rolling on floor laughing my ass off
|
||||
ROTFL rolling on the floor laughing
|
||||
RP responsible person
|
||||
RSN real soon now
|
||||
@@ -116,6 +142,7 @@ SCNR sorry, could not resist
|
||||
SEP someone else's problem
|
||||
SFA sweet fuck all
|
||||
SHID slaps head in disgust
|
||||
SIMCA sitting in my chair amused
|
||||
SMLSFB so many losers, so few bullets
|
||||
SMOP simple matter of programming
|
||||
SNAFU situation normal, all fucked up
|
||||
@@ -123,17 +150,23 @@ SNERT snot-nosed egotistical rude teenager
|
||||
SO significant other
|
||||
SOB son of [a] bitch
|
||||
SOL shit out [of] luck
|
||||
SOP standard operating procedure
|
||||
SSIA subject says it all
|
||||
SUS stupid user syndrome
|
||||
SWAG silly, wild-assed guess
|
||||
SWAHBI silly, wild-assed hare-brained idea
|
||||
SWMBO she who must be obeyed
|
||||
TANSTAAFL there ain't no such thing as a free lunch
|
||||
TBD to be {decided,determined,done}
|
||||
TIA thanks in advance
|
||||
TLA three letter acronym
|
||||
TLB translation lookaside buffer
|
||||
TMA too many abbreviations
|
||||
TMI too much information
|
||||
TOEFL test of english as a foreign language
|
||||
TTFN ta ta for now
|
||||
TTYL talk to you later
|
||||
TWIAVBP the world is a very big place
|
||||
TYVM thank you very much
|
||||
UTSL use the source, Luke
|
||||
VEG very evil grin
|
||||
@@ -141,8 +174,10 @@ WAG wild-ass guess
|
||||
WIBNI wouldn't it be nice if
|
||||
WOFTAM waste of fucking time and money
|
||||
WOMBAT waste of money, brain, and time
|
||||
WRT with respect to
|
||||
WTF {what,where,who,why} the fuck
|
||||
WTH {what,where,who,why} the hell
|
||||
WYSIWYG what you see is what you get
|
||||
YKWIM you know what I mean
|
||||
YMA yo momma's ass
|
||||
YMMV your mileage may vary
|
||||
|
||||
Reference in New Issue
Block a user