summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormartynas <martynas@openbsd.org>2011-07-03 05:12:15 +0000
committermartynas <martynas@openbsd.org>2011-07-03 05:12:15 +0000
commite9c94d5e687689a27c58585792bb10d5951f593e (patch)
treec1d295e4cd9f4f45b05d0991e0c3ba3636a3aebe
parentkqueue attach functions should return an errno or 0, not a plain 1. Fix (diff)
downloadwireguard-openbsd-e9c94d5e687689a27c58585792bb10d5951f593e.tar.xz
wireguard-openbsd-e9c94d5e687689a27c58585792bb10d5951f593e.zip
Remove rogue. Its license is not acceptable for our tree; been
unlinked from the builds for 8 years. I've been talking with the author 2 years ago, he didn't release a proper license. It's clear that the issue won't be resolved. OK tedu@.
-rw-r--r--games/rogue/CHANGES56
-rw-r--r--games/rogue/Makefile22
-rw-r--r--games/rogue/USD.doc/Makefile11
-rw-r--r--games/rogue/USD.doc/rogue.me834
-rw-r--r--games/rogue/hit.c432
-rw-r--r--games/rogue/init.c334
-rw-r--r--games/rogue/inventory.c822
-rw-r--r--games/rogue/level.c873
-rw-r--r--games/rogue/machdep.c433
-rw-r--r--games/rogue/main.c71
-rw-r--r--games/rogue/message.c353
-rw-r--r--games/rogue/monster.c875
-rw-r--r--games/rogue/move.c631
-rw-r--r--games/rogue/object.c781
-rw-r--r--games/rogue/pack.c562
-rw-r--r--games/rogue/pathnames.h35
-rw-r--r--games/rogue/play.c290
-rw-r--r--games/rogue/random.c136
-rw-r--r--games/rogue/ring.c327
-rw-r--r--games/rogue/rogue.6694
-rw-r--r--games/rogue/rogue.h789
-rw-r--r--games/rogue/room.c650
-rw-r--r--games/rogue/save.c416
-rw-r--r--games/rogue/score.c642
-rw-r--r--games/rogue/spec_hit.c511
-rw-r--r--games/rogue/throw.c308
-rw-r--r--games/rogue/trap.c273
-rw-r--r--games/rogue/use.c606
-rw-r--r--games/rogue/zap.c391
29 files changed, 0 insertions, 13158 deletions
diff --git a/games/rogue/CHANGES b/games/rogue/CHANGES
deleted file mode 100644
index ffb64da890a..00000000000
--- a/games/rogue/CHANGES
+++ /dev/null
@@ -1,56 +0,0 @@
-$OpenBSD: CHANGES,v 1.4 2001/01/28 23:41:48 niklas Exp $
-$NetBSD: CHANGES,v 1.2 1995/04/22 10:27:22 cgd Exp $
-
-From: tektronix!zeus.TEK.COM!tims@ucbvax.Berkeley.EDU
-Date: 30 Nov 87 15:08:15 PST (Mon)
-To: okeeffe.Berkeley.EDU!mckusick@ucbvax.Berkeley.EDU (Kirk McKusick)
-Subject: Re: Public domain rogue
-Return-Path: tektronix!zeus.TEK.COM!tims@ucbvax.Berkeley.EDU
-
-Here is a list of discrepencies from the documentation you sent me:
-
-The -d option not implemented.
-The -r option not implemented, use "rogue save_file" instead.
-Strength is between 1 and 99, not 3 and 32.
-The D command is not implemented.
-Only scrolls,potions,wands,and rings may be "call"ed something.
-The ^P command may be used to go 4 messages back, instead of just 1.
-The @ comand is not implemented.
-There are no dark rooms.
-ROGUEOPTS of flush,terse,seefloor,askme,inventory are ignored.
- 'askquit' is added to prevent ^\ from terminating the game accidentally.
- If 'noaskquit' is
- found in the ROGUEOPTS string, the ^\ kills the game, otherwise,
- the player is asked if he really wants to quit. In either case, no
- score file processing is attempted.
-The score is keyed to winning scores, and no player may appear twice.
-
-
-
-
-
-
-Other differences from "standard" rogue 5.3. This list covers externally
-visible differences only.
-
-There should be NO bugs with any severe consequences. Absolutely NO
- game-stopping, or game-winning bugs should be present.
-Traps fail occasionally, that is, they sometimes are sprung but miss.
-The ^A command prints out some stuff you're probably not interested in.
-The '&' command silently saves your screen into the file 'rogue.screen'
-Any inventory selection command that takes '*' as a request to list all
- appropriate items, can take one of "=?:)]!/" to list only rings,
- scrolls, or whatever.
-Scrolls and potions, once used, become identified. All other objects become
- identified only by scroll of identification.
-There is only one scroll of identification, and it works on any item.
-ROGUEOPTS
- Only the following are implemented:
- file,jump,name,askquit,tombstone,passgo
- "askquit" is used to prevent accidental termination of the game via ^\
-You may drop objects in doorways.
-Prints a picture of a skull, not a tombstone, upon death.
-The save/restore game function is faster and machine-independent, but sometimes
- requires modification when new variables are added to the source.
-The potion of detect monster lasts for the whole level.
-There is no wand of light.
diff --git a/games/rogue/Makefile b/games/rogue/Makefile
deleted file mode 100644
index d0c3f9d08c2..00000000000
--- a/games/rogue/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-# $OpenBSD: Makefile,v 1.11 2010/01/04 17:50:38 deraadt Exp $
-# @(#)Makefile 8.1 (Berkeley) 5/31/93
-
-PROG= rogue
-
-SRCS= hit.c init.c inventory.c level.c machdep.c main.c \
- message.c monster.c move.c object.c pack.c play.c random.c ring.c \
- room.c save.c score.c spec_hit.c throw.c trap.c use.c zap.c
-DPADD= ${LIBCURSES}
-LDADD= -lcurses
-MAN= rogue.6
-BINMODE=2555
-
-beforeinstall:
- @if [ ! -f ${DESTDIR}/var/games/rogue.scores ]; then \
- ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} -m 664 \
- /dev/null ${DESTDIR}/var/games/rogue.scores ; \
- else \
- true ; \
- fi
-
-.include <bsd.prog.mk>
diff --git a/games/rogue/USD.doc/Makefile b/games/rogue/USD.doc/Makefile
deleted file mode 100644
index 072f6e13c65..00000000000
--- a/games/rogue/USD.doc/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# $OpenBSD: Makefile,v 1.2 2001/01/28 23:41:48 niklas Exp $
-# $NetBSD: Makefile,v 1.2 1995/04/22 10:28:47 cgd Exp $
-
-DIR= usd/30.rogue
-SRCS= rogue.me
-MACROS= -me
-
-paper.${PRINTER}: ${SRCS}
- ${TBL} ${SRCS} | ${ROFF} > ${.TARGET}
-
-.include <bsd.doc.mk>
diff --git a/games/rogue/USD.doc/rogue.me b/games/rogue/USD.doc/rogue.me
deleted file mode 100644
index 85e6f5475c8..00000000000
--- a/games/rogue/USD.doc/rogue.me
+++ /dev/null
@@ -1,834 +0,0 @@
-.\" $OpenBSD: rogue.me,v 1.4 2003/06/03 03:01:41 millert Exp $
-.\" $NetBSD: rogue.me,v 1.2 1995/04/22 10:28:50 cgd Exp $
-.\"
-.\" Copyright (c) 1986, 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. 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.
-.\"
-.\" @(#)rogue.me 8.1 (Berkeley) 6/8/93
-.\"
-.ds E \s-2<ESCAPE>\s0
-.ds R \s-2<RETURN>\s0
-.ds U \s-2UNIX\s0
-.ie t .ds _ \d\(mi\u
-.el .ds _ _
-.de Cs
-\&\\$3\*(lq\\$1\*(rq\\$2
-..
-.sp 5
-.ce 1000
-.ps +4
-.vs +4p
-.b
-A Guide to the Dungeons of Doom
-.r
-.vs
-.ps
-.sp 2
-.i
-Michael C. Toy
-Kenneth C. R. C. Arnold
-.r
-.sp 2
-Computer Systems Research Group
-Department of Electrical Engineering and Computer Science
-University of California
-Berkeley, California 94720
-.sp 4
-.i ABSTRACT
-.ce 0
-.(b I F
-.bi Rogue
-is a visual CRT based fantasy game
-which runs under the \*U\(dg timesharing system.
-.(f
-\fR\(dg\*U is a trademark of Bell Laboratories\fP
-.)f
-This paper describes how to play rogue,
-and gives a few hints
-for those who might otherwise get lost in the Dungeons of Doom.
-.)b
-\".he '''\fBA Guide to the Dungeons of Doom\fP'
-\" .fo ''- % -''
-.eh 'USD:30-%''A Guide to the Dungeons of Doom'
-.oh 'A Guide to the Dungeons of Doom''USD:30-%'
-.sh 1 Introduction
-.pp
-You have just finished your years as a student at the local fighter's guild.
-After much practice and sweat you have finally completed your training
-and are ready to embark upon a perilous adventure.
-As a test of your skills,
-the local guildmasters have sent you into the Dungeons of Doom.
-Your task is to return with the Amulet of Yendor.
-Your reward for the completion of this task
-will be a full membership in the local guild.
-In addition,
-you are allowed to keep all the loot you bring back from the dungeons.
-.pp
-In preparation for your journey,
-you are given an enchanted mace,
-a bow, and a quiver of arrows
-taken from a dragon's hoard in the far off Dark Mountains.
-You are also outfitted with elf-crafted armor
-and given enough food to reach the dungeons.
-You say goodbye to family and friends for what may be the last time
-and head up the road.
-.pp
-You set out on your way to the dungeons
-and after several days of uneventful travel,
-you see the ancient ruins
-that mark the entrance to the Dungeons of Doom.
-It is late at night,
-so you make camp at the entrance
-and spend the night sleeping under the open skies.
-In the morning you gather your weapons,
-put on your armor,
-eat what is almost your last food,
-and enter the dungeons.
-.sh 1 "What is going on here?"
-.pp
-You have just begun a game of rogue.
-Your goal is to grab as much treasure as you can,
-find the Amulet of Yendor,
-and get out of the Dungeons of Doom alive.
-On the screen,
-a map of where you have been
-and what you have seen on the current dungeon level is kept.
-As you explore more of the level,
-it appears on the screen in front of you.
-.pp
-Rogue differs from most computer fantasy games in that it is screen oriented.
-Commands are all one or two keystrokes\**
-.(f
-\** As opposed to pseudo English sentences.
-.)f
-and the results of your commands
-are displayed graphically on the screen rather
-than being explained in words.\**
-.(f
-\** A minimum screen size of 24 lines by 80 columns is required.
-If the screen is larger, only the 24x80 section will be used
-for the map.
-.)f
-.pp
-Another major difference between rogue and other computer fantasy games
-is that once you have solved all the puzzles in a standard fantasy game,
-it has lost most of its excitement and it ceases to be fun.
-Rogue,
-on the other hand,
-generates a new dungeon every time you play it
-and even the author finds it an entertaining and exciting game.
-.sh 1 "What do all those things on the screen mean?"
-.pp
-In order to understand what is going on in rogue
-you have to first get some grasp of what rogue is doing with the screen.
-The rogue screen is intended
-to replace the \*(lqYou can see ...\*(rq descriptions
-of standard fantasy games.
-Figure 1 is a sample of what a rogue screen might look like.
-.(z
-.hl
-.nf
-.TS
-center;
-ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce.
-- - - - - - - - - - - -
-| . . . . . . . . . . +
-| . . @ . . . . ] . . |
-| . . . . B . . . . . |
-| . . . . . . . . . . |
-- - - - - + - - - - - -
-.TE
-
-
-.ce 1000
-Level: 1 Gold: 0 Hp: 12(12) Str: 16(16) Arm: 4 Exp: 1/0
-
-Figure 1
-.ce
-.hl
-.)z
-.sh 2 "The bottom line"
-.pp
-At the bottom line of the screen
-are a few pieces of cryptic information
-describing your current status.
-Here is an explanation of what these things mean:
-.ip Level \w'Level\ \ 'u
-This number indicates how deep you have gone in the dungeon.
-It starts at one and goes up as you go deeper into the dungeon.
-.ip Gold \w'Level\ \ 'u
-The number of gold pieces you have managed to find
-and keep with you so far.
-.ip Hp \w'Level\ \ 'u
-Your current and maximum health points.
-Health points indicate how much damage you can take before you die.
-The more you get hit in a fight,
-the lower they get.
-You can regain health points by resting.
-The number in parentheses
-is the maximum number your health points can reach.
-.ip Str \w'Level\ \ 'u
-Your current strength and maximum ever strength.
-This can be any integer less than or equal to 99,
-or greater than or equal to 1.
-The higher the number,
-the stronger you are.
-The number in the parentheses
-is the maximum strength you have attained so far this game.
-.ip Arm \w'Level\ \ 'u
-Your current armor protection.
-This number indicates how effective your armor is
-in stopping blows from unfriendly creatures.
-The higher this number is,
-the more effective the armor.
-.ip Exp \w'Level\ \ 'u
-These two numbers give your current experience level
-and experience points.
-As you do things,
-you gain experience points.
-At certain experience point totals,
-you gain an experience level.
-The more experienced you are,
-the better you are able to fight and to withstand magical attacks.
-.sh 2 "The top line"
-.pp
-The top line of the screen is reserved
-for printing messages that describe things
-that are impossible to represent visually.
-If you see a \*(lq--More--\*(rq on the top line,
-this means that rogue wants to print another message on the screen,
-but it wants to make certain
-that you have read the one that is there first.
-To read the next message,
-just type a space.
-.sh 2 "The rest of the screen"
-.pp
-The rest of the screen is the map of the level
-as you have explored it so far.
-Each symbol on the screen represents something.
-Here is a list of what the various symbols mean:
-.ip @
-This symbol represents you, the adventurer.
-.ip "-\^|"
-These symbols represent the walls of rooms.
-.ip +
-A door to/from a room.
-.ip .
-The floor of a room.
-.ip #
-The floor of a passage between rooms.
-.ip *
-A pile or pot of gold.
-.ip )
-A weapon of some sort.
-.ip ]
-A piece of armor.
-.ip !
-A flask containing a magic potion.
-.ip ?
-A piece of paper, usually a magic scroll.
-.ip =
-A ring with magic properties
-.ip /
-A magical staff or wand
-.ip ^
-A trap, watch out for these.
-.ip %
-A staircase to other levels
-.ip :
-A piece of food.
-.ip A-Z
-The uppercase letters
-represent the various inhabitants of the Dungeons of Doom.
-Watch out, they can be nasty and vicious.
-.sh 1 Commands
-.pp
-Commands are given to rogue by typing one or two characters.
-Most commands can be preceded by a count to repeat them
-(e.g. typing
-.Cs 10s
-will do ten searches).
-Commands for which counts make no sense
-have the count ignored.
-To cancel a count or a prefix,
-type \*E.
-The list of commands is rather long,
-but it can be read at any time during the game with the
-.Cs ?
-command.
-Here it is for reference,
-with a short explanation of each command.
-.ip ?
-The help command.
-Asks for a character to give help on.
-If you type a
-.Cs * ,
-it will list all the commands,
-otherwise it will explain what the character you typed does.
-.ip /
-This is the \*(lqWhat is that on the screen?\*(rq command.
-A
-.Cs /
-followed by any character that you see on the level,
-will tell you what that character is.
-For instance,
-typing
-.Cs /@
-will tell you that the
-.Cs @
-symbol represents you, the player.
-.ip "h, H, ^H"
-Move left.
-You move one space to the left.
-If you use upper case
-.Cs h ,
-you will continue to move left until you run into something.
-This works for all movement commands
-(e.g.
-.Cs L
-means run in direction
-.Cs l )
-If you use the \*(lqcontrol\*(rq
-.Cs h ,
-you will continue moving in the specified direction
-until you pass something interesting or run into a wall.
-You should experiment with this,
-since it is a very useful command,
-but very difficult to describe.
-This also works for all movement commands.
-.ip j
-Move down.
-.ip k
-Move up.
-.ip l
-Move right.
-.ip y
-Move diagonally up and left.
-.ip u
-Move diagonally up and right.
-.ip b
-Move diagonally down and left.
-.ip n
-Move diagonally down and right.
-.ip t
-Throw an object.
-This is a prefix command.
-When followed with a direction
-it throws an object in the specified direction.
-(e.g. type
-.Cs th
-to throw
-something to the left.)
-.ip f
-Fight until someone dies.
-When followed with a direction
-this will force you to fight the creature in that direction
-until either you or it bites the big one.
-.ip m
-Move onto something without picking it up.
-This will move you one space in the direction you specify and,
-if there is an object there you can pick up,
-it won't do it.
-.ip z
-Zap prefix.
-Point a staff or wand in a given direction
-and fire it.
-Even non-directional staves must be pointed in some direction
-to be used.
-.ip ^
-Identify trap command.
-If a trap is on your map
-and you can't remember what type it is,
-you can get rogue to remind you
-by getting next to it and typing
-.Cs ^
-followed by the direction that would move you on top of it.
-.ip s
-Search for traps and secret doors.
-Examine each space immediately adjacent to you
-for the existence of a trap or secret door.
-There is a large chance that even if there is something there,
-you won't find it,
-so you might have to search a while before you find something.
-.ip >
-Climb down a staircase to the next level.
-Not surprisingly, this can only be done if you are standing on staircase.
-.ip <
-Climb up a staircase to the level above.
-This can't be done without the Amulet of Yendor in your possession.
-.ip "."
-Rest.
-This is the \*(lqdo nothing\*(rq command.
-This is good for waiting and healing.
-.ip ,
-Pick up something.
-This picks up whatever you are currently standing on,
-if you are standing on anything at all.
-.ip i
-Inventory.
-List what you are carrying in your pack.
-.ip I
-Selective inventory.
-Tells you what a single item in your pack is.
-.ip q
-Quaff one of the potions you are carrying.
-.ip r
-Read one of the scrolls in your pack.
-.ip e
-Eat food from your pack.
-.ip w
-Wield a weapon.
-Take a weapon out of your pack and carry it for use in combat,
-replacing the one you are currently using (if any).
-.ip W
-Wear armor.
-You can only wear one suit of armor at a time.
-This takes extra time.
-.ip T
-Take armor off.
-You can't remove armor that is cursed.
-This takes extra time.
-.ip P
-Put on a ring.
-You can wear only two rings at a time
-(one on each hand).
-If you aren't wearing any rings,
-this command will ask you which hand you want to wear it on,
-otherwise, it will place it on the unused hand.
-The program assumes that you wield your sword in your right hand.
-.ip R
-Remove a ring.
-If you are only wearing one ring,
-this command takes it off.
-If you are wearing two,
-it will ask you which one you wish to remove,
-.ip d
-Drop an object.
-Take something out of your pack and leave it lying on the floor.
-Only one object can occupy each space.
-You cannot drop a cursed object at all
-if you are wielding or wearing it.
-.ip c
-Call an object something.
-If you have a type of object in your pack
-which you wish to remember something about,
-you can use the call command to give a name to that type of object.
-This is usually used when you figure out what a
-potion, scroll, ring, or staff is
-after you pick it up but before it is truly identified. Each type of
-scroll and potion will become identified after its first use.
-.ip o
-Examine and set options.
-This command is further explained in the section on options.
-.ip ^R
-Redraws the screen.
-Useful if spurious messages or transmission errors
-have messed up the display.
-.ip ^P
-Print last message.
-Useful when a message disappears before you can read it.
-Consecutive repetitions of this command will reveal the last
-five messages.
-.ip \*E
-Cancel a command, prefix, or count.
-.ip !
-Escape to a shell for some commands.
-.ip Q
-Quit.
-Leave the game.
-.ip S
-Save the current game in a file.
-It will ask you whether you wish to use the default save file.
-.i Caveat :
-Rogue won't let you start up a copy of a saved game,
-and it removes the save file as soon as you start up a restored game.
-This is to prevent people from saving a game just before a dangerous position
-and then restarting it if they die.
-To restore a saved game,
-give the file name as an argument to rogue.
-As in
-.ti +1i
-.nf
-% rogue \fIsave\*_file\fP
-.ip v
-Prints the program version number.
-.ip )
-Print the weapon you are currently wielding
-.ip ]
-Print the armor you are currently wearing
-.ip =
-Print the rings you are currently wearing
-.sh 1 Rooms
-.pp
-Rooms in the dungeons are lit as you enter them.
-Upon leaving a room,
-all monsters inside the room are erased from the screen.
-In the darkness of a corridor, you can only see one space
-in all directions around you.
-.sh 1 Fighting
-.pp
-If you see a monster and you wish to fight it,
-just attempt to run into it.
-Many times a monster you find will mind its own business
-unless you attack it.
-It is often the case that discretion is the better part of valor.
-.sh 1 "Objects you can find"
-.pp
-When you find something in the dungeon,
-it is common to want to pick the object up.
-This is accomplished in rogue by walking over the object
-(unless you use the
-.Cs m
-prefix, see above).
-If you are carrying too many things,
-the program will tell you and it won't pick up the object,
-otherwise it will add it to your pack
-and tell you what you just picked up.
-.pp
-Many of the commands that operate on objects must prompt you
-to find out which object you want to use.
-If you change your mind and don't want to do that command after all,
-just type an \*E and the command will be aborted.
-.pp
-Some objects, like armor and weapons,
-are easily differentiated.
-Others, like scrolls and potions,
-are given labels which vary according to type.
-During a game,
-any two of the same kind of object
-with the same label
-are the same type.
-However,
-the labels will vary from game to game.
-.pp
-When you use one of these labeled objects,
-if its effect may be obvious. Potions or scrolls will
-become identified at this point, but not other items.
-You may want to call these other items something
-so you will recognize it later,
-you can use the
-.Cs call
-command
-(see above).
-.sh 2 Weapons
-.pp
-Some weapons,
-like arrows,
-come in bunches,
-but most come one at a time.
-In order to use a weapon,
-you must wield it.
-To fire an arrow out of a bow,
-you must first wield the bow,
-then throw the arrow.
-You can only wield one weapon at a time,
-but you can't change weapons if the one
-you are currently wielding is cursed.
-The commands to use weapons are
-.Cs w
-(wield)
-and
-.Cs t
-(throw).
-.sh 2 Armor
-.pp
-There are various sorts of armor lying around in the dungeon.
-Some of it is enchanted,
-some is cursed,
-and some is just normal.
-Different armor types have different armor protection.
-The higher the armor protection,
-the more protection the armor affords against the blows of monsters.
-Here is a list of the various armor types and their normal armor protection:
-.(b
-.TS
-box center;
-l r.
-\ \ \fIType Protection\fP
-None 0
-Leather armor 2
-Studded leather / Ring mail 3
-Scale mail 4
-Chain mail 5
-Banded mail / Splint mail 6
-Plate mail 7
-.TE
-.)b
-.lp
-If a piece of armor is enchanted,
-its armor protection will be higher than normal.
-If a suit of armor is cursed,
-its armor protection will be lower,
-and you will not be able to remove it.
-However, not all armor with a protection that is lower than normal is cursed.
-.pp
-The commands to use weapons are
-.Cs W
-(wear)
-and
-.Cs T
-(take off).
-.sh 2 Scrolls
-.pp
-Scrolls come with titles in an unknown tongue\**.
-.(f
-\** Actually, it's a dialect spoken only by the twenty-seven members
-of a tribe in Outer Mongolia,
-but you're not supposed to
-.i know
-that.
-.)f
-After you read a scroll,
-it disappears from your pack.
-The command to use a scroll is
-.Cs r
-(read).
-.sh 2 Potions
-.pp
-Potions are labeled by the color of the liquid inside the flask.
-They disappear after being quaffed.
-The command to quaff a potion is
-.Cs q
-(quaff).
-.sh 2 "Staves and Wands"
-.pp
-Staves and wands do the same kinds of things.
-Staves are identified by a type of wood;
-wands by a type of metal or bone.
-They are generally things you want to do to something
-over a long distance,
-so you must point them at what you wish to affect
-to use them.
-Some staves are not affected by the direction they are pointed, though.
-Staves come with multiple magic charges,
-the number being random,
-and when they are used up,
-the staff is just a piece of wood or metal.
-.pp
-The command to use a wand or staff is
-.Cs z
-(zap)
-.sh 2 Rings
-.pp
-Rings are very useful items,
-since they are relatively permanent magic,
-unlike the usually fleeting effects of potions, scrolls, and staves.
-Of course,
-the bad rings are also more powerful.
-Most rings also cause you to use up food more rapidly,
-the rate varying with the type of ring.
-Rings are differentiated by their stone settings.
-The commands to use rings are
-.Cs P
-(put on)
-and
-.Cs R
-(remove).
-.sh 2 Food
-.pp
-Food is necessary to keep you going.
-If you go too long without eating you will faint,
-and eventually die of starvation.
-The command to use food is
-.Cs e
-(eat).
-.sh 1 Options
-.pp
-Due to variations in personal tastes
-and conceptions of the way rogue should do things,
-there are a set of options you can set
-that cause rogue to behave in various different ways.
-.sh 2 "Setting the options"
-.pp
-There are two ways to set the options.
-The first is with the
-.Cs o
-command of rogue;
-the second is with the
-.Cs ROGUEOPTS
-environment variable\**.
-.(f
-\** On Version 6 systems,
-there is no equivalent of the ROGUEOPTS feature.
-.br
-.)f
-.br
-.sh 3 "Using the `o' command"
-.pp
-When you type
-.Cs o
-in rogue,
-it clears the screen
-and displays the current settings for all the options.
-It then places the cursor by the value of the first option
-and waits for you to type.
-You can type a \*R
-which means to go to the next option,
-a
-.Cs \-
-which means to go to the previous option,
-an \*E
-which means to return to the game,
-or you can give the option a value.
-For boolean options this merely involves typing
-.Cs t
-for true or
-.Cs f
-for false.
-For string options,
-type the new value followed by a \*R.
-.sh 3 "Using the ROGUEOPTS variable"
-.pp
-The ROGUEOPTS variable is a string
-containing a comma separated list of initial values
-for the various options.
-Boolean variables can be turned on by listing their name
-or turned off by putting a
-.Cs no
-in front of the name.
-Thus to set up an environment variable so that
-.b jump
-is on,
-.b passgo
-is off,
-and the
-.b name
-is set to \*(lqBlue Meanie\*(rq,
-use the command
-.nf
-.ti +3n
-% setenv ROGUEOPTS "jump,nopassgo,name=Blue Meanie"\**
-.fi
-.(f
-\**
-For those of you who use the Bourne shell sh (1), the commands would be
-.in +3
-.nf
-$ ROGUEOPTS="jump,nopassgo,name=Blue Meanie"
-$ export ROGUEOPTS
-.fi
-.in +0
-.)f
-.sh 2 "Option list"
-.pp
-Here is a list of the options
-and an explanation of what each one is for.
-The default value for each is enclosed in square brackets.
-For character string options,
-input over forty characters will be ignored.
-.ip "\fBjump\fP [\fI\^nojump\^\fP]"
-If this option is set,
-running moves will not be displayed
-until you reach the end of the move.
-This saves considerable cpu and display time.
-This option defaults to
-.i jump
-if you are using a slow terminal.
-.ip "\fBpassgo\fP [\fI\^nopassgo\^\fP]"
-Follow turnings in passageways.
-If you run in a passage
-and you run into stone or a wall,
-rogue will see if it can turn to the right or left.
-If it can only turn one way,
-it will turn that way.
-If it can turn either or neither,
-it will stop.
-This algorithm can sometimes lead to slightly confusing occurrences
-which is why it defaults to \fInopassgo\fP.
-.ip "\fBskull\fP [\fI\^skull\^\fP]"
-Print out the skull at the end if you get killed.
-This is nice but slow, so you can turn it off if you like.
-.ip "\fBname\fP [account name]"
-This is the name of your character.
-It is used if you get on the top ten scorer's list.
-.ip "\fBfruit\fP [\fI\^slime-mold\^\fP]"
-This should hold the name of a fruit that you enjoy eating.
-It is basically a whimsey that rogue uses in a couple of places.
-.ip "\fBfile\fP [\fI\^~/rogue.save\^\fP]"
-The default file name for saving the game.
-If your phone is hung up by accident,
-rogue will automatically save the game in this file.
-The file name may start with the special character
-.Cs ~
-which expands to be your home directory.
-.sh 1 Scoring
-.pp
-Rogue maintains a list
-of the top scoring people or scores on your machine.
-If you score higher than someone else on this list,
-or better your previous score on the list,
-you will be inserted in the proper place
-under your current name.
-.pp
-If you quit the game, you get out with all of your gold intact.
-If, however, you get killed in the Dungeons of Doom,
-your body is forwarded to your next-of-kin,
-along with 90% of your gold;
-ten percent of your gold is kept by the Dungeons' wizard as a fee\**.
-.(f
-\** The Dungeon's wizard is named Wally the Wonder Badger.
-Invocations should be accompanied by a sizable donation.
-.)f
-This should make you consider whether you want to take one last hit
-at that monster and possibly live,
-or quit and thus stop with whatever you have.
-If you quit, you do get all your gold,
-but if you swing and live, you might find more.
-.pp
-If you just want to see what the current top players/games list is,
-you can type
-.ti +1i
-.nf
-% rogue \-s
-.br
-.sh 1 Acknowledgements
-.pp
-Rogue was originally conceived of by Glenn Wichman and Michael Toy.
-Ken Arnold and Michael Toy then smoothed out the user interface,
-and added jillions of new features.
-We would like to thank
-Bob Arnold,
-Michelle Busch,
-Andy Hatcher,
-Kipp Hickman,
-Mark Horton,
-Daniel Jensen,
-Bill Joy,
-Joe Kalash,
-Steve Maurer,
-Marty McNary,
-Jan Miller,
-and
-Scott Nelson
-for their ideas and assistance;
-and also the teeming multitudes
-who graciously ignored work, school, and social life to play rogue
-and send us bugs, complaints, suggestions, and just plain flames.
-And also Mom.
-.pp
-The public domain version of rogue now distributed with Berkeley UNIX
-was written by Timothy Stoehr.
diff --git a/games/rogue/hit.c b/games/rogue/hit.c
deleted file mode 100644
index dc751ea00ac..00000000000
--- a/games/rogue/hit.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* $OpenBSD: hit.c,v 1.8 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: hit.c,v 1.3 1995/04/22 10:27:30 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * hit.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-object *fight_monster = 0;
-char hit_message[HIT_MESSAGE_LEN] = "";
-
-void
-mon_hit(object *monster)
-{
- short damage, hit_chance;
- const char *mn;
- float minus;
-
- if (fight_monster && (monster != fight_monster)) {
- fight_monster = 0;
- }
- monster->trow = NO_ROOM;
- if (cur_level >= (AMULET_LEVEL * 2)) {
- hit_chance = 100;
- } else {
- hit_chance = monster->m_hit_chance;
- hit_chance -= (((2 * rogue.exp) + (2 * ring_exp)) - r_rings);
- }
- if (wizard) {
- hit_chance /= 2;
- }
- if (!fight_monster) {
- interrupted = 1;
- }
- mn = mon_name(monster);
-
- if (!rand_percent(hit_chance)) {
- if (!fight_monster) {
- messagef(1, "%sthe %s misses", hit_message, mn);
- hit_message[0] = 0;
- }
- return;
- }
- if (!fight_monster) {
- messagef(1, "%sthe %s hit", hit_message, mn);
- hit_message[0] = 0;
- }
- if (!(monster->m_flags & STATIONARY)) {
- damage = get_damage(monster->m_damage, 1);
- if (cur_level >= (AMULET_LEVEL * 2)) {
- minus = (float) ((AMULET_LEVEL * 2) - cur_level);
- } else {
- minus = (float) get_armor_class(rogue.armor) * 3.00;
- minus = minus/100.00 * (float) damage;
- }
- damage -= (short) minus;
- } else {
- damage = monster->stationary_damage++;
- }
- if (wizard) {
- damage /= 3;
- }
- if (damage > 0) {
- rogue_damage(damage, monster, 0);
- }
- if (monster->m_flags & SPECIAL_HIT) {
- special_hit(monster);
- }
-}
-
-void
-rogue_hit(object *monster, boolean force_hit)
-{
- short damage, hit_chance;
-
- if (monster) {
- if (check_imitator(monster)) {
- return;
- }
- hit_chance = force_hit ? 100 : get_hit_chance(rogue.weapon);
-
- if (wizard) {
- hit_chance *= 2;
- }
- if (!rand_percent(hit_chance)) {
- if (!fight_monster) {
- (void) strlcpy(hit_message, "you miss ",
- sizeof(hit_message));
- }
- goto RET;
- }
- damage = get_weapon_damage(rogue.weapon);
- if (wizard) {
- damage *= 3;
- }
- if (con_mon) {
- s_con_mon(monster);
- }
- if (mon_damage(monster, damage)) { /* still alive? */
- if (!fight_monster) {
- (void) strlcpy(hit_message, "you hit ",
- sizeof(hit_message));
- }
- }
-RET: check_gold_seeker(monster);
- wake_up(monster);
- }
-}
-
-void
-rogue_damage(short d, object *monster, short other)
-{
- if (d >= rogue.hp_current) {
- rogue.hp_current = 0;
- print_stats(STAT_HP);
- killed_by(monster, other);
- }
- if (d > 0) {
- rogue.hp_current -= d;
- print_stats(STAT_HP);
- }
-}
-
-int
-get_damage(const char *ds, boolean r)
-{
- int i = 0, j, n, d, total = 0;
-
- while (ds[i]) {
- n = get_number(ds + i);
- while ((ds[i] != 'd') && ds[i])
- i++;
- if (ds[i] == 'd')
- i++;
- d = get_number(ds + i);
- while ((ds[i] != '/') && ds[i])
- i++;
- if (ds[i] == '/')
- i++;
-
- for (j = 0; j < n; j++) {
- if (r) {
- total += get_rand(1, d);
- } else {
- total += d;
- }
- }
- }
- return(total);
-}
-
-int
-get_w_damage(const object *obj)
-{
- char new_damage[32];
- int tmp_to_hit, tmp_damage;
- int i = 0;
-
- if ((!obj) || (obj->what_is != WEAPON)) {
- return(-1);
- }
- tmp_to_hit = get_number(obj->damage) + obj->hit_enchant;
- while ((obj->damage[i++] != 'd') && obj->damage[i])
- i++;
- if (obj->damage[i] == 'd')
- i++;
- tmp_damage = get_number(obj->damage + i) + obj->d_enchant;
-
- snprintf(new_damage, sizeof(new_damage), "%dd%d", tmp_to_hit, tmp_damage);
-
- return(get_damage(new_damage, 1));
-}
-
-int
-get_number(const char *s)
-{
- int i = 0;
- int total = 0;
-
- while ((s[i] >= '0') && (s[i] <= '9')) {
- total = (10 * total) + (s[i] - '0');
- i++;
- }
- return(total);
-}
-
-int
-to_hit(object *obj)
-{
- if (!obj) {
- return(1);
- }
- return(get_number(obj->damage) + obj->hit_enchant);
-}
-
-int
-damage_for_strength(void)
-{
- short strength;
-
- strength = rogue.str_current + add_strength;
-
- if (strength <= 6) {
- return(strength-5);
- }
- if (strength <= 14) {
- return(1);
- }
- if (strength <= 17) {
- return(3);
- }
- if (strength <= 18) {
- return(4);
- }
- if (strength <= 20) {
- return(5);
- }
- if (strength <= 21) {
- return(6);
- }
- if (strength <= 30) {
- return(7);
- }
- return(8);
-}
-
-int
-mon_damage(object *monster, short damage)
-{
- const char *mn;
- short row, col;
-
- monster->hp_to_kill -= damage;
-
- if (monster->hp_to_kill <= 0) {
- row = monster->row;
- col = monster->col;
- dungeon[row][col] &= ~MONSTER;
- mvaddch(row, col, (int) get_dungeon_char(row, col));
-
- fight_monster = 0;
- cough_up(monster);
- mn = mon_name(monster);
- messagef(1, "%sdefeated the %s", hit_message, mn);
- hit_message[0] = 0;
- add_exp(monster->kill_exp, 1);
- take_from_pack(monster, &level_monsters);
-
- if (monster->m_flags & HOLDS) {
- being_held = 0;
- }
- free_object(monster);
- return(0);
- }
- return(1);
-}
-
-void
-fight(boolean to_the_death)
-{
- short ch, c, d;
- short row, col;
- boolean first_miss = 1;
- short possible_damage;
- object *monster;
-
- while (!is_direction(ch = rgetchar(), &d)) {
- beep();
- if (first_miss) {
- messagef(0, "direction?");
- first_miss = 0;
- }
- }
- check_message();
- if (ch == CANCEL) {
- return;
- }
- row = rogue.row; col = rogue.col;
- get_dir_rc(d, &row, &col, 0);
-
- c = mvinch(row, col);
- if (((c < 'A') || (c > 'Z')) ||
- (!can_move(rogue.row, rogue.col, row, col))) {
- messagef(0, "I see no monster there");
- return;
- }
- if (!(fight_monster = object_at(&level_monsters, row, col))) {
- return;
- }
- if (!(fight_monster->m_flags & STATIONARY)) {
- possible_damage = ((get_damage(fight_monster->m_damage, 0) * 2) / 3);
- } else {
- possible_damage = fight_monster->stationary_damage - 1;
- }
- while (fight_monster) {
- (void) one_move_rogue(ch, 0);
- if (((!to_the_death) && (rogue.hp_current <= possible_damage)) ||
- interrupted || (!(dungeon[row][col] & MONSTER))) {
- fight_monster = 0;
- } else {
- monster = object_at(&level_monsters, row, col);
- if (monster != fight_monster) {
- fight_monster = 0;
- }
- }
- }
-}
-
-void
-get_dir_rc(short dir, short *row, short *col, short allow_off_screen)
-{
- switch(dir) {
- case LEFT:
- if (allow_off_screen || (*col > 0)) {
- (*col)--;
- }
- break;
- case DOWN:
- if (allow_off_screen || (*row < (DROWS-2))) {
- (*row)++;
- }
- break;
- case UPWARD:
- if (allow_off_screen || (*row > MIN_ROW)) {
- (*row)--;
- }
- break;
- case RIGHT:
- if (allow_off_screen || (*col < (DCOLS-1))) {
- (*col)++;
- }
- break;
- case UPLEFT:
- if (allow_off_screen || ((*row > MIN_ROW) && (*col > 0))) {
- (*row)--;
- (*col)--;
- }
- break;
- case UPRIGHT:
- if (allow_off_screen || ((*row > MIN_ROW) && (*col < (DCOLS-1)))) {
- (*row)--;
- (*col)++;
- }
- break;
- case DOWNRIGHT:
- if (allow_off_screen || ((*row < (DROWS-2)) && (*col < (DCOLS-1)))) {
- (*row)++;
- (*col)++;
- }
- break;
- case DOWNLEFT:
- if (allow_off_screen || ((*row < (DROWS-2)) && (*col > 0))) {
- (*row)++;
- (*col)--;
- }
- break;
- }
-}
-
-int
-get_hit_chance(object *weapon)
-{
- short hit_chance;
-
- hit_chance = 40;
- hit_chance += 3 * to_hit(weapon);
- hit_chance += (((2 * rogue.exp) + (2 * ring_exp)) - r_rings);
- return(hit_chance);
-}
-
-int
-get_weapon_damage(object *weapon)
-{
- short damage;
-
- damage = get_w_damage(weapon);
- damage += damage_for_strength();
- damage += ((((rogue.exp + ring_exp) - r_rings) + 1) / 2);
- return(damage);
-}
-
-void
-s_con_mon(object *monster)
-{
- if (con_mon) {
- monster->m_flags |= CONFUSED;
- monster->moves_confused += get_rand(12, 22);
- messagef(0, "the monster appears confused");
- con_mon = 0;
- }
-}
diff --git a/games/rogue/init.c b/games/rogue/init.c
deleted file mode 100644
index 2c93ebab551..00000000000
--- a/games/rogue/init.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/* $OpenBSD: init.c,v 1.12 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: init.c,v 1.4 1995/04/28 23:49:19 mycroft Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * init.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include <err.h>
-#include "rogue.h"
-
-char login_name[LOGIN_NAME_LEN];
-char *nick_name = NULL;
-char *rest_file = 0;
-boolean cant_int = 0;
-boolean did_int = 0;
-boolean score_only;
-boolean init_curses = 0;
-boolean save_is_interactive = 1;
-boolean ask_quit = 1;
-boolean no_skull = 0;
-boolean passgo = 0;
-const char *error_file = "rogue.esave";
-const char *byebye_string = "Okay, bye bye!";
-gid_t gid, egid;
-
-int
-init(int argc, char *argv[])
-{
- char *pn;
- int seed;
-
- gid = getgid();
- egid = getegid();
- setegid(gid);
- pn = md_gln();
- if ((!pn) || (strlen(pn) >= LOGIN_NAME_LEN))
- clean_up("Hey! Who are you?");
- (void) strlcpy(login_name, pn, sizeof(login_name));
- /* ':' is reserved. If it's in a login_name, we're on a weird
- * system... */
- while ((pn = strchr(login_name, ':')) != NULL)
- *pn = ';';
-
- do_args(argc, argv);
- do_opts();
-
- if (!score_only && !rest_file) {
- printf("Hello %s, just a moment while I dig the dungeon...",
- nick_name);
- fflush(stdout);
- }
-
- initscr();
- init_curses = 1;
- if ((LINES < DROWS) || (COLS < DCOLS)) {
- clean_up("must be played on 24 x 80 screen (or larger)");
- }
- start_window();
-
- md_heed_signals();
-
- if (score_only) {
- put_scores((object *) NULL, 0);
- }
- seed = md_gseed();
- (void) srrandom(seed);
- if (rest_file) {
- restore(rest_file);
- return(1);
- }
- mix_colors();
- get_wand_and_ring_materials();
- make_scroll_titles();
-
- level_objects.next_object = (object *) 0;
- level_monsters.next_monster = (object *) 0;
- player_init();
- ring_stats(0);
- return(0);
-}
-
-void
-player_init(void)
-{
- object *obj;
-
- rogue.pack.next_object = (object *) 0;
-
- obj = alloc_object();
- get_food(obj, 1);
- (void) add_to_pack(obj, &rogue.pack, 1);
-
- obj = alloc_object(); /* initial armor */
- obj->what_is = ARMOR;
- obj->which_kind = RINGMAIL;
- obj->class = RINGMAIL+2;
- obj->is_protected = 0;
- obj->d_enchant = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
- do_wear(obj);
-
- obj = alloc_object(); /* initial weapons */
- obj->what_is = WEAPON;
- obj->which_kind = MACE;
- obj->damage = "2d3";
- obj->hit_enchant = obj->d_enchant = 1;
- obj->identified = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
- do_wield(obj);
-
- obj = alloc_object();
- obj->what_is = WEAPON;
- obj->which_kind = BOW;
- obj->damage = "1d2";
- obj->hit_enchant = 1;
- obj->d_enchant = 0;
- obj->identified = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
-
- obj = alloc_object();
- obj->what_is = WEAPON;
- obj->which_kind = ARROW;
- obj->quantity = get_rand(25, 35);
- obj->damage = "1d2";
- obj->hit_enchant = 0;
- obj->d_enchant = 0;
- obj->identified = 1;
- (void) add_to_pack(obj, &rogue.pack, 1);
-}
-
-void
-clean_up(const char *estr)
-{
- if (save_is_interactive) {
- if (init_curses) {
- move(DROWS-1, 0);
- refresh();
- stop_window();
- }
- printf("\n%s\n", estr);
- }
- md_exit(0);
-}
-
-void
-start_window(void)
-{
- cbreak();
- noecho();
-#ifndef BAD_NONL
- nonl();
-#endif
-}
-
-void
-stop_window(void)
-{
- endwin();
-}
-
-void
-byebye(int dummy)
-{
- md_ignore_signals();
- if (ask_quit) {
- quit(1);
- } else {
- clean_up(byebye_string);
- }
- md_heed_signals();
-}
-
-void
-onintr(int dummy)
-{
- md_ignore_signals();
- if (cant_int) {
- did_int = 1;
- } else {
- check_message();
- messagef(1, "interrupt");
- }
- md_heed_signals();
-}
-
-void
-error_save(int dummy)
-{
- save_is_interactive = 0;
- save_into_file(error_file);
- clean_up("");
-}
-
-void
-do_args(int argc, char *argv[])
-{
- int i, j;
-
- for (i = 1; i < argc; i++) {
- if (argv[i][0] == '-') {
- for (j = 1; argv[i][j]; j++) {
- switch(argv[i][j]) {
- case 's':
- score_only = 1;
- break;
- }
- }
- } else {
- rest_file = argv[i];
- }
- }
-}
-
-void
-do_opts(void)
-{
- char *eptr;
-
- if ((eptr = md_getenv("ROGUEOPTS"))) {
- for (;;) {
- while ((*eptr) == ' ') {
- eptr++;
- }
- if (!(*eptr))
- break;
- if (!strncmp(eptr, "fruit=", 6)) {
- eptr += 6;
- env_get_value(&fruit, eptr, 1);
- } else if (!strncmp(eptr, "file=", 5)) {
- eptr += 5;
- env_get_value(&save_file, eptr, 0);
- } else if (!strncmp(eptr, "jump", 4)) {
- jump = 1;
- } else if (!strncmp(eptr, "name=", 5)) {
- eptr += 5;
- env_get_value(&nick_name, eptr, 0);
- } else if (!strncmp(eptr, "noaskquit", 9)) {
- ask_quit = 0;
- } else if (!strncmp(eptr, "noskull", 5) ||
- !strncmp(eptr,"notomb", 6)) {
- no_skull = 1;
- } else if (!strncmp(eptr, "passgo", 5)) {
- passgo = 1;
- }
- while ((*eptr) && (*eptr != ',')) {
- eptr++;
- }
- if (!(*(eptr++))) {
- break;
- }
- }
- }
- /* If some strings have not been set through ROGUEOPTS, assign defaults
- * to them so that the options editor has data to work with.
- */
- init_str(&nick_name, login_name);
- init_str(&save_file, "rogue.save");
- init_str(&fruit, "slime-mold");
-}
-
-void
-env_get_value(char **s, char *e, boolean add_blank)
-{
- short i = 0;
- char *t;
-
- t = e;
-
- while ((*e) && (*e != ',')) {
- e++;
- if (++i >= MAX_OPT_LEN)
- break;
- }
- /* room.c:edit_opts() depends on length MAX_OPT_LEN + 2 */
- if (!(*s = md_malloc(MAX_OPT_LEN + 2)))
- clean_up("out of memory");
- (void) strlcpy(*s, t, MAX_OPT_LEN + 2);
- if (add_blank) {
- (*s)[i++] = ' ';
- }
- (*s)[i] = '\0';
-}
-
-void
-init_str(char **str, const char *dflt)
-{
- if (!(*str)) {
- /* room.c:edit_opts() depends on length MAX_OPT_LEN + 2 */
- *str = md_malloc(MAX_OPT_LEN + 2);
- if (*str == NULL)
- clean_up("out of memory");
- (void) strlcpy(*str, dflt, MAX_OPT_LEN + 2);
- }
-}
diff --git a/games/rogue/inventory.c b/games/rogue/inventory.c
deleted file mode 100644
index e160ab37a47..00000000000
--- a/games/rogue/inventory.c
+++ /dev/null
@@ -1,822 +0,0 @@
-/* $OpenBSD: inventory.c,v 1.10 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: inventory.c,v 1.3 1995/04/22 10:27:35 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * inventory.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include <stdarg.h>
-#include "rogue.h"
-
-boolean is_wood[WANDS];
-const char *press_space = " --press space to continue--";
-
-const char *wand_materials[WAND_MATERIALS] = {
- "steel ",
- "bronze ",
- "gold ",
- "silver ",
- "copper ",
- "nickel ",
- "cobalt ",
- "tin ",
- "iron ",
- "magnesium ",
- "chrome ",
- "carbon ",
- "platinum ",
- "silicon ",
- "titanium ",
-
- "teak ",
- "oak ",
- "cherry ",
- "birch ",
- "pine ",
- "cedar ",
- "redwood ",
- "balsa ",
- "ivory ",
- "walnut ",
- "maple ",
- "mahogany ",
- "elm ",
- "palm ",
- "wooden "
-};
-
-const char *gems[GEMS] = {
- "diamond ",
- "stibotantalite ",
- "lapi-lazuli ",
- "ruby ",
- "emerald ",
- "sapphire ",
- "amethyst ",
- "quartz ",
- "tiger-eye ",
- "opal ",
- "agate ",
- "turquoise ",
- "pearl ",
- "garnet "
-};
-
-const char *syllables[MAXSYLLABLES] = {
- "blech ",
- "foo ",
- "barf ",
- "rech ",
- "bar ",
- "blech ",
- "quo ",
- "bloto ",
- "oh ",
- "caca ",
- "blorp ",
- "erp ",
- "festr ",
- "rot ",
- "slie ",
- "snorf ",
- "iky ",
- "yuky ",
- "ooze ",
- "ah ",
- "bahl ",
- "zep ",
- "druhl ",
- "flem ",
- "behil ",
- "arek ",
- "mep ",
- "zihr ",
- "grit ",
- "kona ",
- "kini ",
- "ichi ",
- "tims ",
- "ogr ",
- "oo ",
- "ighr ",
- "coph ",
- "swerr ",
- "mihln ",
- "poxi "
-};
-
-#define COMS 48
-
-struct id_com_s {
- short com_char;
- const char *com_desc;
-};
-
-struct id_com_s com_id_tab[COMS] = {
- {'?', "? prints help"},
- {'r', "r read scroll"},
- {'/', "/ identify object"},
- {'e', "e eat food"},
- {'h', "h left "},
- {'w', "w wield a weapon"},
- {'j', "j down"},
- {'W', "W wear armor"},
- {'k', "k up"},
- {'T', "T take armor off"},
- {'l', "l right"},
- {'P', "P put on ring"},
- {'y', "y up & left"},
- {'R', "R remove ring"},
- {'u', "u up & right"},
- {'d', "d drop object"},
- {'b', "b down & left"},
- {'c', "c call object"},
- {'n', "n down & right"},
- {'\0', "<SHIFT><dir>: run that way"},
- {')', ") print current weapon"},
- {'\0', "<CTRL><dir>: run till adjacent"},
- {']', "] print current armor"},
- {'f', "f<dir> fight till death or near death"},
- {'=', "= print current rings"},
- {'t', "t<dir> throw something"},
- {'\001', "^A print Hp-raise average"},
- {'m', "m<dir> move onto without picking up"},
- {'z', "z<dir> zap a wand in a direction"},
- {'o', "o examine/set options"},
- {'^', "^<dir> identify trap type"},
- {'\022', "^R redraw screen"},
- {'&', "& save screen into 'rogue.screen'"},
- {'s', "s search for trap/secret door"},
- {'\020', "^P repeat last message"},
- {'>', "> go down a staircase"},
- {'\033', "^[ cancel command"},
- {'<', "< go up a staircase"},
- {'S', "S save game"},
- {'.', ". rest for a turn"},
- {'Q', "Q quit"},
- {',', ", pick something up"},
- {'!', "! shell escape"},
- {'i', "i inventory"},
- {'F', "F<dir> fight till either of you dies"},
- {'I', "I inventory single item"},
- {'v', "v print version number"},
- {'q', "q quaff potion"}
-};
-
-void
-inventory(object *pack, unsigned short mask)
-{
- object *obj;
- short i = 0, j;
- size_t maxlen = 0, n;
- short row, col;
- struct {
- short letter;
- short sepchar;
- char desc[DCOLS];
- char savebuf[DCOLS+8];
- } descs[MAX_PACK_COUNT+1];
-
- obj = pack->next_object;
-
- if (!obj) {
- messagef(0, "your pack is empty");
- return;
- }
- while (obj) {
- if (obj->what_is & mask) {
- descs[i].letter = obj->ichar;
- descs[i].sepchar = ((obj->what_is & ARMOR) && obj->is_protected)
- ? '}' : ')';
- get_desc(obj, descs[i].desc, sizeof(descs[i].desc));
- n = strlen(descs[i].desc) + 4;
- if (n > maxlen) {
- maxlen = n;
- }
- i++;
- if (i > MAX_PACK_COUNT) {
- clean_up("Too many objects in pack?!?");
- }
- }
- obj = obj->next_object;
- }
- if (maxlen < 27)
- maxlen = 27;
- if (maxlen > DCOLS - 2)
- maxlen = DCOLS - 2;
- col = DCOLS - (maxlen + 2);
-
- for (row = 0; ((row <= i) && (row < DROWS)); row++) {
- for (j = col; j < DCOLS; j++) {
- descs[row].savebuf[j - col] = mvinch(row, j);
- }
- descs[row].savebuf[j - col] = '\0';
- if (row < i) {
- mvprintw(row, col, " %c%c %s",
- descs[row].letter, descs[row].sepchar,
- descs[row].desc);
- } else {
- mvaddstr(row, col, press_space);
- }
- clrtoeol();
- }
- refresh();
- wait_for_ack();
-
- move(0, 0);
- clrtoeol();
-
- for (j = 1; ((j <= i) && (j < DROWS)); j++) {
- mvaddstr(j, col, descs[j].savebuf);
- }
-}
-
-void
-id_com(void)
-{
- int ch = 0;
- short i, j, k;
-
- while (ch != CANCEL) {
- check_message();
- messagef(0, "Character you want help for (* for all):");
-
- refresh();
- ch = getch();
-
- switch(ch) {
- case LIST:
- {
- char save[(((COMS / 2) + (COMS % 2)) + 1)][DCOLS];
- short rows = (((COMS / 2) + (COMS % 2)) + 1);
- boolean need_two_screens = FALSE;
-
- if (rows > LINES) {
- need_two_screens = 1;
- rows = LINES;
- }
- k = 0;
-
- for (i = 0; i < rows; i++) {
- for (j = 0; j < DCOLS; j++) {
- save[i][j] = mvinch(i, j);
- }
- }
-MORE:
- for (i = 0; i < rows; i++) {
- move(i, 0);
- clrtoeol();
- }
- for (i = 0; i < (rows-1); i++) {
- if (i < (LINES-1)) {
- if (((i + i) < COMS) && ((i+i+k) < COMS)) {
- mvaddstr(i, 0, com_id_tab[i+i+k].com_desc);
- }
- if (((i + i + 1) < COMS) && ((i+i+k+1) < COMS)) {
- mvaddstr(i, (DCOLS/2),
- com_id_tab[i+i+k+1].com_desc);
- }
- }
- }
- mvaddstr(rows - 1, 0, need_two_screens ? more : press_space);
- refresh();
- wait_for_ack();
-
- if (need_two_screens) {
- k += ((rows-1) * 2);
- need_two_screens = 0;
- goto MORE;
- }
- for (i = 0; i < rows; i++) {
- move(i, 0);
- for (j = 0; j < DCOLS; j++) {
- addch(save[i][j]);
- }
- }
- }
- break;
- default:
- if (!pr_com_id(ch)) {
- if (!pr_motion_char(ch)) {
- check_message();
- messagef(0, "unknown character");
- }
- }
- ch = CANCEL;
- break;
- }
- }
-}
-
-int
-pr_com_id(int ch)
-{
- int i;
-
- if (!get_com_id(&i, ch)) {
- return(0);
- }
- check_message();
- messagef(0, "%s", com_id_tab[i].com_desc);
- return(1);
-}
-
-int
-get_com_id(int *indexp, short ch)
-{
- short i;
-
- for (i = 0; i < COMS; i++) {
- if (com_id_tab[i].com_char == ch) {
- *indexp = i;
- return(1);
- }
- }
- return(0);
-}
-
-int
-pr_motion_char(int ch)
-{
- if ( (ch == 'J') ||
- (ch == 'K') ||
- (ch == 'L') ||
- (ch == 'H') ||
- (ch == 'Y') ||
- (ch == 'U') ||
- (ch == 'N') ||
- (ch == 'B') ||
- (ch == '\012') ||
- (ch == '\013') ||
- (ch == '\010') ||
- (ch == '\014') ||
- (ch == '\025') ||
- (ch == '\031') ||
- (ch == '\016') ||
- (ch == '\002')) {
- const char *until;
- int n;
-
- if (ch <= '\031') {
- ch += 96;
- until = " until adjacent";
- } else {
- ch += 32;
- until = "";
- }
- (void) get_com_id(&n, ch);
- check_message();
- messagef(0, "run %s%s", com_id_tab[n].com_desc + 8, until);
- return(1);
- } else {
- return(0);
- }
-}
-
-void
-mix_colors(void)
-{
- short i, j, k;
- char t[MAX_TITLE_LENGTH];
-
- for (i = 0; i <= 32; i++) {
- j = get_rand(0, (POTIONS - 1));
- k = get_rand(0, (POTIONS - 1));
- strlcpy(t, id_potions[j].title, sizeof(t));
- strlcpy(id_potions[j].title, id_potions[k].title,
- sizeof(id_potions[j].title));
- strlcpy(id_potions[k].title, t, sizeof(id_potions[k].title));
- }
-}
-
-void
-make_scroll_titles(void)
-{
- short i, j, n;
- short sylls, s;
- size_t maxlen;
-
- maxlen = sizeof(id_scrolls[0].title);
- for (i = 0; i < SCROLS; i++) {
- sylls = get_rand(2, 5);
- (void) strlcpy(id_scrolls[i].title, "'", maxlen);
-
- for (j = 0; j < sylls; j++) {
- s = get_rand(1, (MAXSYLLABLES-1));
- (void) strlcat(id_scrolls[i].title, syllables[s], maxlen);
- }
- /* trim trailing space */
- n = strlen(id_scrolls[i].title);
- id_scrolls[i].title[n-1] = '\'';
- strlcat(id_scrolls[i].title, " ", maxlen);
- }
-}
-
-struct sbuf {
- char *buf;
- size_t maxlen;
-};
-
-static void sbuf_init(struct sbuf *s, char *buf, size_t maxlen);
-static void sbuf_addstr(struct sbuf *s, const char *str);
-static void sbuf_addf(struct sbuf *s, const char *fmt, ...);
-static void desc_count(struct sbuf *s, int n);
-static void desc_called(struct sbuf *s, const object *);
-
-static void
-sbuf_init(struct sbuf *s, char *buf, size_t maxlen)
-{
- s->buf = buf;
- s->maxlen = maxlen;
- s->buf[0] = 0;
-}
-
-static void
-sbuf_addstr(struct sbuf *s, const char *str)
-{
- strlcat(s->buf, str, s->maxlen);
-}
-
-static void
-sbuf_addf(struct sbuf *s, const char *fmt, ...)
-{
- va_list ap;
- size_t initlen;
-
- initlen = strlen(s->buf);
- va_start(ap, fmt);
- vsnprintf(s->buf+initlen, s->maxlen-initlen, fmt, ap);
- va_end(ap);
-}
-
-static void
-desc_count(struct sbuf *s, int n)
-{
- if (n == 1) {
- sbuf_addstr(s, "an ");
- } else {
- sbuf_addf(s, "%d ", n);
- }
-}
-
-static void
-desc_called(struct sbuf *s, const object *obj)
-{
- struct id *id_table;
-
- id_table = get_id_table(obj);
- sbuf_addstr(s, name_of(obj));
- sbuf_addstr(s, "called ");
- sbuf_addstr(s, id_table[obj->which_kind].title);
-}
-
-void
-get_desc(const object *obj, char *desc, size_t desclen)
-{
- const char *item_name;
- struct id *id_table;
- struct sbuf db;
- unsigned short objtype_id_status;
-
- if (obj->what_is == AMULET) {
- (void) strlcpy(desc, "the amulet of Yendor ", desclen);
- return;
- }
- if (obj->what_is == GOLD) {
- snprintf(desc, desclen, "%d pieces of gold", obj->quantity);
- return;
- }
-
- item_name = name_of(obj);
- id_table = get_id_table(obj);
- if (wizard || id_table == NULL) {
- objtype_id_status = IDENTIFIED;
- } else {
- objtype_id_status = id_table[obj->which_kind].id_status;
- }
- if (obj->what_is & (WEAPON | ARMOR | WAND | RING)) {
- if (obj->identified) {
- objtype_id_status = IDENTIFIED;
- }
- }
- sbuf_init(&db, desc, desclen);
-
- switch(obj->what_is) {
- case FOOD:
- if (obj->which_kind == RATION) {
- if (obj->quantity > 1) {
- sbuf_addf(&db, "%d rations of %s", obj->quantity,
- item_name);
- } else {
- sbuf_addf(&db, "some %s", item_name);
- }
- } else {
- sbuf_addf(&db, "an %s", item_name);
- }
- break;
- case SCROL:
- desc_count(&db, obj->quantity);
- if (objtype_id_status==UNIDENTIFIED) {
- sbuf_addstr(&db, item_name);
- sbuf_addstr(&db, "entitled: ");
- sbuf_addstr(&db, id_table[obj->which_kind].title);
- } else if (objtype_id_status==CALLED) {
- desc_called(&db, obj);
- } else {
- sbuf_addstr(&db, item_name);
- sbuf_addstr(&db, id_table[obj->which_kind].real);
- }
- break;
- case POTION:
- desc_count(&db, obj->quantity);
- if (objtype_id_status==UNIDENTIFIED) {
- sbuf_addstr(&db, id_table[obj->which_kind].title);
- sbuf_addstr(&db, item_name);
- } else if (objtype_id_status==CALLED) {
- desc_called(&db, obj);
- } else {
- sbuf_addstr(&db, item_name);
- sbuf_addstr(&db, id_table[obj->which_kind].real);
- }
- break;
- case WAND:
- desc_count(&db, obj->quantity);
- if (objtype_id_status==UNIDENTIFIED) {
- sbuf_addstr(&db, id_table[obj->which_kind].title);
- sbuf_addstr(&db, item_name);
- } else if (objtype_id_status==CALLED) {
- desc_called(&db, obj);
- } else {
- sbuf_addstr(&db, item_name);
- sbuf_addstr(&db, id_table[obj->which_kind].real);
- if (wizard || obj->identified) {
- sbuf_addf(&db, "[%d]", obj->class);
- }
- }
- break;
- case RING:
- desc_count(&db, obj->quantity);
- if (objtype_id_status==UNIDENTIFIED) {
- sbuf_addstr(&db, id_table[obj->which_kind].title);
- sbuf_addstr(&db, item_name);
- } else if (objtype_id_status==CALLED) {
- desc_called(&db, obj);
- } else {
- if ((wizard || obj->identified) &&
- (obj->which_kind == DEXTERITY ||
- obj->which_kind == ADD_STRENGTH))
- sbuf_addf(&db, "%+d ", obj->class);
- sbuf_addstr(&db, item_name);
- sbuf_addstr(&db, id_table[obj->which_kind].real);
- }
- break;
- case ARMOR:
- /* no desc_count() */
- if (objtype_id_status==UNIDENTIFIED) {
- sbuf_addstr(&db, id_table[obj->which_kind].title);
- } else {
- sbuf_addf(&db, "%+d %s[%d] ", obj->d_enchant,
- id_table[obj->which_kind].title,
- get_armor_class(obj));
- }
- break;
- case WEAPON:
- desc_count(&db, obj->quantity);
- if (objtype_id_status==UNIDENTIFIED) {
- sbuf_addstr(&db, name_of(obj));
- } else {
- sbuf_addf(&db, "%+d,%+d %s", obj->hit_enchant,
- obj->d_enchant, name_of(obj));
- }
- break;
- /* Should never execute */
- default:
- sbuf_addstr(&db, "grot");
- break;
- }
-
- if (obj->in_use_flags & BEING_WIELDED) {
- sbuf_addstr(&db, "in hand");
- } else if (obj->in_use_flags & BEING_WORN) {
- sbuf_addstr(&db, "being worn");
- } else if (obj->in_use_flags & ON_LEFT_HAND) {
- sbuf_addstr(&db, "on left hand");
- } else if (obj->in_use_flags & ON_RIGHT_HAND) {
- sbuf_addstr(&db, "on right hand");
- }
-
- if (!strncmp(db.buf, "an ", 3)) {
- if (!is_vowel(db.buf[3])) {
- memmove(db.buf+2, db.buf+3, strlen(db.buf+3)+1);
- db.buf[1] = ' ';
- }
- }
-}
-
-void
-get_wand_and_ring_materials(void)
-{
- short i, j;
- boolean used[WAND_MATERIALS];
-
- for (i = 0; i < WAND_MATERIALS; i++) {
- used[i] = 0;
- }
- for (i = 0; i < WANDS; i++) {
- do {
- j = get_rand(0, WAND_MATERIALS-1);
- } while (used[j]);
- used[j] = 1;
- strlcpy(id_wands[i].title, wand_materials[j],
- sizeof(id_wands[i].title));
- is_wood[i] = (j > MAX_METAL);
- }
- for (i = 0; i < GEMS; i++) {
- used[i] = 0;
- }
- for (i = 0; i < RINGS; i++) {
- do {
- j = get_rand(0, GEMS-1);
- } while (used[j]);
- used[j] = 1;
- strlcpy(id_rings[i].title, gems[j],
- sizeof(id_rings[i].title));
- }
-}
-
-void
-single_inv(short ichar)
-{
- short ch, ch2;
- char desc[DCOLS];
- object *obj;
-
- ch = ichar ? ichar : pack_letter("inventory what?", ALL_OBJECTS);
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- ch2 = ((obj->what_is & ARMOR) && obj->is_protected) ? '}' : ')';
- get_desc(obj, desc, sizeof(desc));
- messagef(0, "%c%c %s", ch, ch2, desc);
-}
-
-struct id *
-get_id_table(const object *obj)
-{
- switch(obj->what_is) {
- case SCROL:
- return(id_scrolls);
- case POTION:
- return(id_potions);
- case WAND:
- return(id_wands);
- case RING:
- return(id_rings);
- case WEAPON:
- return(id_weapons);
- case ARMOR:
- return(id_armors);
- }
- return((struct id *) 0);
-}
-
-void
-inv_armor_weapon(boolean is_weapon)
-{
- if (is_weapon) {
- if (rogue.weapon) {
- single_inv(rogue.weapon->ichar);
- } else {
- messagef(0, "not wielding anything");
- }
- } else {
- if (rogue.armor) {
- single_inv(rogue.armor->ichar);
- } else {
- messagef(0, "not wearing anything");
- }
- }
-}
-
-void
-id_type(void)
-{
- const char *id;
- int ch;
-
- messagef(0, "what do you want identified?");
-
- ch = rgetchar();
-
- if ((ch >= 'A') && (ch <= 'Z')) {
- id = m_names[ch-'A'];
- } else if (ch < 32) {
- check_message();
- return;
- } else {
- switch(ch) {
- case '@':
- id = "you";
- break;
- case '%':
- id = "staircase";
- break;
- case '^':
- id = "trap";
- break;
- case '+':
- id = "door";
- break;
- case '-':
- case '|':
- id = "wall of a room";
- break;
- case '.':
- id = "floor";
- break;
- case '#':
- id = "passage";
- break;
- case ' ':
- id = "solid rock";
- break;
- case '=':
- id = "ring";
- break;
- case '?':
- id = "scroll";
- break;
- case '!':
- id = "potion";
- break;
- case '/':
- id = "wand or staff";
- break;
- case ')':
- id = "weapon";
- break;
- case ']':
- id = "armor";
- break;
- case '*':
- id = "gold";
- break;
- case ':':
- id = "food";
- break;
- case ',':
- id = "the Amulet of Yendor";
- break;
- default:
- id = "unknown character";
- break;
- }
- }
- check_message();
- messagef(0, "'%c': %s", ch, id);
-}
diff --git a/games/rogue/level.c b/games/rogue/level.c
deleted file mode 100644
index 19245b19da3..00000000000
--- a/games/rogue/level.c
+++ /dev/null
@@ -1,873 +0,0 @@
-/* $OpenBSD: level.c,v 1.9 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: level.c,v 1.3 1995/04/22 10:27:37 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * level.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-#define swap(x,y) {t = x; x = y; y = t;}
-
-short cur_level = 0;
-short max_level = 1;
-short cur_room;
-const char *new_level_message = 0;
-short party_room = NO_ROOM;
-short r_de;
-
-long level_points[MAX_EXP_LEVEL] = {
- 10L,
- 20L,
- 40L,
- 80L,
- 160L,
- 320L,
- 640L,
- 1300L,
- 2600L,
- 5200L,
- 10000L,
- 20000L,
- 40000L,
- 80000L,
- 160000L,
- 320000L,
- 1000000L,
- 3333333L,
- 6666666L,
- MAX_EXP,
- 99900000L
-};
-
-short random_rooms[MAXROOMS] = {3, 7, 5, 2, 0, 6, 1, 4, 8};
-
-void
-make_level(void)
-{
- short i, j;
- short must_1, must_2, must_3;
- boolean big_room;
-
- if (cur_level < LAST_DUNGEON) {
- cur_level++;
- }
- if (cur_level > max_level) {
- max_level = cur_level;
- }
- must_1 = get_rand(0, 5);
-
- switch(must_1) {
- case 0:
- must_1 = 0;
- must_2 = 1;
- must_3 = 2;
- break;
- case 1:
- must_1 = 3;
- must_2 = 4;
- must_3 = 5;
- break;
- case 2:
- must_1 = 6;
- must_2 = 7;
- must_3 = 8;
- break;
- case 3:
- must_1 = 0;
- must_2 = 3;
- must_3 = 6;
- break;
- case 4:
- must_1 = 1;
- must_2 = 4;
- must_3 = 7;
- break;
- case 5:
- must_1 = 2;
- must_2 = 5;
- must_3 = 8;
- break;
- }
- if (rand_percent(8)) {
- party_room = 0;
- }
- big_room = ((party_room != NO_ROOM) && rand_percent(1));
- if (big_room) {
- make_room(BIG_ROOM, 0, 0, 0);
- } else {
- for (i = 0; i < MAXROOMS; i++) {
- make_room(i, must_1, must_2, must_3);
- }
- }
- if (!big_room) {
- add_mazes();
-
- mix_random_rooms();
-
- for (j = 0; j < MAXROOMS; j++) {
-
- i = random_rooms[j];
-
- if (i < (MAXROOMS-1)) {
- (void) connect_rooms(i, i+1);
- }
- if (i < (MAXROOMS-3)) {
- (void) connect_rooms(i, i+3);
- }
- if (i < (MAXROOMS-2)) {
- if (rooms[i+1].is_room & R_NOTHING) {
- if (connect_rooms(i, i+2)) {
- rooms[i+1].is_room = R_CROSS;
- }
- }
- }
- if (i < (MAXROOMS-6)) {
- if (rooms[i+3].is_room & R_NOTHING) {
- if (connect_rooms(i, i+6)) {
- rooms[i+3].is_room = R_CROSS;
- }
- }
- }
- if (is_all_connected()) {
- break;
- }
- }
- fill_out_level();
- }
- if (!has_amulet() && (cur_level >= AMULET_LEVEL)) {
- put_amulet();
- }
-}
-
-void
-make_room(short rn, short r1, short r2, short r3)
-{
- short left_col, right_col, top_row, bottom_row;
- short width, height;
- short row_offset, col_offset;
- short i, j, ch;
-
- switch(rn) {
- case 0:
- left_col = 0;
- right_col = COL1-1;
- top_row = MIN_ROW;
- bottom_row = ROW1-1;
- break;
- case 1:
- left_col = COL1+1;
- right_col = COL2-1;
- top_row = MIN_ROW;
- bottom_row = ROW1-1;
- break;
- case 2:
- left_col = COL2+1;
- right_col = DCOLS-1;
- top_row = MIN_ROW;
- bottom_row = ROW1-1;
- break;
- case 3:
- left_col = 0;
- right_col = COL1-1;
- top_row = ROW1+1;
- bottom_row = ROW2-1;
- break;
- case 4:
- left_col = COL1+1;
- right_col = COL2-1;
- top_row = ROW1+1;
- bottom_row = ROW2-1;
- break;
- case 5:
- left_col = COL2+1;
- right_col = DCOLS-1;
- top_row = ROW1+1;
- bottom_row = ROW2-1;
- break;
- case 6:
- left_col = 0;
- right_col = COL1-1;
- top_row = ROW2+1;
- bottom_row = DROWS - 2;
- break;
- case 7:
- left_col = COL1+1;
- right_col = COL2-1;
- top_row = ROW2+1;
- bottom_row = DROWS - 2;
- break;
- case 8:
- left_col = COL2+1;
- right_col = DCOLS-1;
- top_row = ROW2+1;
- bottom_row = DROWS - 2;
- break;
- case BIG_ROOM:
- top_row = get_rand(MIN_ROW, MIN_ROW+5);
- bottom_row = get_rand(DROWS-7, DROWS-2);
- left_col = get_rand(0, 10);
- right_col = get_rand(DCOLS-11, DCOLS-1);
- rn = 0;
- goto B;
- default:
- clean_up("failed makeroom()");
- break;
- }
- height = get_rand(4, (bottom_row - top_row + 1));
- width = get_rand(7, (right_col - left_col - 2));
-
- row_offset = get_rand(0, ((bottom_row - top_row) - height + 1));
- col_offset = get_rand(0, ((right_col - left_col) - width + 1));
-
- top_row += row_offset;
- bottom_row = top_row + height - 1;
-
- left_col += col_offset;
- right_col = left_col + width - 1;
-
- if ((rn != r1) && (rn != r2) && (rn != r3) && rand_percent(40)) {
- goto END;
- }
-B:
- rooms[rn].is_room = R_ROOM;
-
- for (i = top_row; i <= bottom_row; i++) {
- for (j = left_col; j <= right_col; j++) {
- if ((i == top_row) || (i == bottom_row)) {
- ch = HORWALL;
- } else if ( ((i != top_row) && (i != bottom_row)) &&
- ((j == left_col) || (j == right_col))) {
- ch = VERTWALL;
- } else {
- ch = FLOOR;
- }
- dungeon[i][j] = ch;
- }
- }
-END:
- rooms[rn].top_row = top_row;
- rooms[rn].bottom_row = bottom_row;
- rooms[rn].left_col = left_col;
- rooms[rn].right_col = right_col;
-}
-
-int
-connect_rooms(short room1, short room2)
-{
- short row1, col1, row2, col2, dir;
-
- if ((!(rooms[room1].is_room & (R_ROOM | R_MAZE))) ||
- (!(rooms[room2].is_room & (R_ROOM | R_MAZE)))) {
- return(0);
- }
- if (same_row(room1, room2) &&
- (rooms[room1].left_col > rooms[room2].right_col)) {
- put_door(&rooms[room1], LEFT, &row1, &col1);
- put_door(&rooms[room2], RIGHT, &row2, &col2);
- dir = LEFT;
- } else if (same_row(room1, room2) &&
- (rooms[room2].left_col > rooms[room1].right_col)) {
- put_door(&rooms[room1], RIGHT, &row1, &col1);
- put_door(&rooms[room2], LEFT, &row2, &col2);
- dir = RIGHT;
- } else if (same_col(room1, room2) &&
- (rooms[room1].top_row > rooms[room2].bottom_row)) {
- put_door(&rooms[room1], UPWARD, &row1, &col1);
- put_door(&rooms[room2], DOWN, &row2, &col2);
- dir = UPWARD;
- } else if (same_col(room1, room2) &&
- (rooms[room2].top_row > rooms[room1].bottom_row)) {
- put_door(&rooms[room1], DOWN, &row1, &col1);
- put_door(&rooms[room2], UPWARD, &row2, &col2);
- dir = DOWN;
- } else {
- return(0);
- }
-
- do {
- draw_simple_passage(row1, col1, row2, col2, dir);
- } while (rand_percent(4));
-
- rooms[room1].doors[dir/2].oth_room = room2;
- rooms[room1].doors[dir/2].oth_row = row2;
- rooms[room1].doors[dir/2].oth_col = col2;
-
- rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_room = room1;
- rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_row = row1;
- rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_col = col1;
- return(1);
-}
-
-void
-clear_level(void)
-{
- short i, j;
-
- for (i = 0; i < MAXROOMS; i++) {
- rooms[i].is_room = R_NOTHING;
- for (j = 0; j < 4; j++) {
- rooms[i].doors[j].oth_room = NO_ROOM;
- }
- }
-
- for (i = 0; i < MAX_TRAPS; i++) {
- traps[i].trap_type = NO_TRAP;
- }
- for (i = 0; i < DROWS; i++) {
- for (j = 0; j < DCOLS; j++) {
- dungeon[i][j] = NOTHING;
- }
- }
- detect_monster = see_invisible = 0;
- being_held = bear_trap = 0;
- party_room = NO_ROOM;
- rogue.row = rogue.col = -1;
- clear();
-}
-
-void
-put_door(room *rm, short dir, short *row, short *col)
-{
- short wall_width;
-
- wall_width = (rm->is_room & R_MAZE) ? 0 : 1;
-
- switch(dir) {
- case UPWARD:
- case DOWN:
- *row = ((dir == UPWARD) ? rm->top_row : rm->bottom_row);
- do {
- *col = get_rand(rm->left_col+wall_width,
- rm->right_col-wall_width);
- } while (!(dungeon[*row][*col] & (HORWALL | TUNNEL)));
- break;
- case RIGHT:
- case LEFT:
- *col = (dir == LEFT) ? rm->left_col : rm->right_col;
- do {
- *row = get_rand(rm->top_row+wall_width,
- rm->bottom_row-wall_width);
- } while (!(dungeon[*row][*col] & (VERTWALL | TUNNEL)));
- break;
- }
- if (rm->is_room & R_ROOM) {
- dungeon[*row][*col] = DOOR;
- }
- if ((cur_level > 2) && rand_percent(HIDE_PERCENT)) {
- dungeon[*row][*col] |= HIDDEN;
- }
- rm->doors[dir/2].door_row = *row;
- rm->doors[dir/2].door_col = *col;
-}
-
-void
-draw_simple_passage(short row1, short col1, short row2, short col2, short dir)
-{
- short i, middle, t;
-
- if ((dir == LEFT) || (dir == RIGHT)) {
- if (col1 > col2) {
- swap(row1, row2);
- swap(col1, col2);
- }
- middle = get_rand(col1+1, col2-1);
- for (i = col1+1; i != middle; i++) {
- dungeon[row1][i] = TUNNEL;
- }
- for (i = row1; i != row2; i += (row1 > row2) ? -1 : 1) {
- dungeon[i][middle] = TUNNEL;
- }
- for (i = middle; i != col2; i++) {
- dungeon[row2][i] = TUNNEL;
- }
- } else {
- if (row1 > row2) {
- swap(row1, row2);
- swap(col1, col2);
- }
- middle = get_rand(row1+1, row2-1);
- for (i = row1+1; i != middle; i++) {
- dungeon[i][col1] = TUNNEL;
- }
- for (i = col1; i != col2; i += (col1 > col2) ? -1 : 1) {
- dungeon[middle][i] = TUNNEL;
- }
- for (i = middle; i != row2; i++) {
- dungeon[i][col2] = TUNNEL;
- }
- }
- if (rand_percent(HIDE_PERCENT)) {
- hide_boxed_passage(row1, col1, row2, col2, 1);
- }
-}
-
-int
-same_row(int room1, int room2)
-{
- return((room1 / 3) == (room2 / 3));
-}
-
-int
-same_col(int room1, int room2)
-{
- return((room1 % 3) == (room2 % 3));
-}
-
-void
-add_mazes(void)
-{
- short i, j;
- short start;
- short maze_percent;
-
- if (cur_level > 1) {
- start = get_rand(0, (MAXROOMS-1));
- maze_percent = (cur_level * 5) / 4;
-
- if (cur_level > 15) {
- maze_percent += cur_level;
- }
- for (i = 0; i < MAXROOMS; i++) {
- j = ((start + i) % MAXROOMS);
- if (rooms[j].is_room & R_NOTHING) {
- if (rand_percent(maze_percent)) {
- rooms[j].is_room = R_MAZE;
- make_maze(get_rand(rooms[j].top_row+1, rooms[j].bottom_row-1),
- get_rand(rooms[j].left_col+1, rooms[j].right_col-1),
- rooms[j].top_row, rooms[j].bottom_row,
- rooms[j].left_col, rooms[j].right_col);
- hide_boxed_passage(rooms[j].top_row, rooms[j].left_col,
- rooms[j].bottom_row, rooms[j].right_col,
- get_rand(0, 2));
- }
- }
- }
- }
-}
-
-void
-fill_out_level(void)
-{
- short i, rn;
-
- mix_random_rooms();
-
- r_de = NO_ROOM;
-
- for (i = 0; i < MAXROOMS; i++) {
- rn = random_rooms[i];
- if ((rooms[rn].is_room & R_NOTHING) ||
- ((rooms[rn].is_room & R_CROSS) && coin_toss())) {
- fill_it(rn, 1);
- }
- }
- if (r_de != NO_ROOM) {
- fill_it(r_de, 0);
- }
-}
-
-void
-fill_it(int rn, boolean do_rec_de)
-{
- short i, tunnel_dir, door_dir, drow, dcol;
- short target_room, rooms_found = 0;
- short srow, scol, t;
- static short offsets[4] = {-1, 1, 3, -3};
- boolean did_this = 0;
-
- for (i = 0; i < 10; i++) {
- srow = get_rand(0, 3);
- scol = get_rand(0, 3);
- t = offsets[srow];
- offsets[srow] = offsets[scol];
- offsets[scol] = t;
- }
- for (i = 0; i < 4; i++) {
-
- target_room = rn + offsets[i];
-
- if (((target_room < 0) || (target_room >= MAXROOMS)) ||
- (!(same_row(rn,target_room) || same_col(rn,target_room))) ||
- (!(rooms[target_room].is_room & (R_ROOM | R_MAZE)))) {
- continue;
- }
- if (same_row(rn, target_room)) {
- tunnel_dir = (rooms[rn].left_col < rooms[target_room].left_col) ?
- RIGHT : LEFT;
- } else {
- tunnel_dir = (rooms[rn].top_row < rooms[target_room].top_row) ?
- DOWN : UPWARD;
- }
- door_dir = ((tunnel_dir + 4) % DIRS);
- if (rooms[target_room].doors[door_dir/2].oth_room != NO_ROOM) {
- continue;
- }
- if (((!do_rec_de) || did_this) ||
- (!mask_room(rn, &srow, &scol, TUNNEL))) {
- srow = (rooms[rn].top_row + rooms[rn].bottom_row) / 2;
- scol = (rooms[rn].left_col + rooms[rn].right_col) / 2;
- }
- put_door(&rooms[target_room], door_dir, &drow, &dcol);
- rooms_found++;
- draw_simple_passage(srow, scol, drow, dcol, tunnel_dir);
- rooms[rn].is_room = R_DEADEND;
- dungeon[srow][scol] = TUNNEL;
-
- if ((i < 3) && (!did_this)) {
- did_this = 1;
- if (coin_toss()) {
- continue;
- }
- }
- if ((rooms_found < 2) && do_rec_de) {
- recursive_deadend(rn, offsets, srow, scol);
- }
- break;
- }
-}
-
-void
-recursive_deadend(short rn, short *offsets, short srow, short scol)
-{
- short i, de;
- short drow, dcol, tunnel_dir;
-
- rooms[rn].is_room = R_DEADEND;
- dungeon[srow][scol] = TUNNEL;
-
- for (i = 0; i < 4; i++) {
- de = rn + offsets[i];
- if (((de < 0) || (de >= MAXROOMS)) ||
- (!(same_row(rn, de) || same_col(rn, de)))) {
- continue;
- }
- if (!(rooms[de].is_room & R_NOTHING)) {
- continue;
- }
- drow = (rooms[de].top_row + rooms[de].bottom_row) / 2;
- dcol = (rooms[de].left_col + rooms[de].right_col) / 2;
- if (same_row(rn, de)) {
- tunnel_dir = (rooms[rn].left_col < rooms[de].left_col) ?
- RIGHT : LEFT;
- } else {
- tunnel_dir = (rooms[rn].top_row < rooms[de].top_row) ?
- DOWN : UPWARD;
- }
- draw_simple_passage(srow, scol, drow, dcol, tunnel_dir);
- r_de = de;
- recursive_deadend(de, offsets, drow, dcol);
- }
-}
-
-boolean
-mask_room(short rn, short *row, short *col, unsigned short mask)
-{
- short i, j;
-
- for (i = rooms[rn].top_row; i <= rooms[rn].bottom_row; i++) {
- for (j = rooms[rn].left_col; j <= rooms[rn].right_col; j++) {
- if (dungeon[i][j] & mask) {
- *row = i;
- *col = j;
- return(1);
- }
- }
- }
- return(0);
-}
-
-void
-make_maze(short r, short c, short tr, short br, short lc, short rc)
-{
- char dirs[4];
- short i, t;
-
- dirs[0] = UPWARD;
- dirs[1] = DOWN;
- dirs[2] = LEFT;
- dirs[3] = RIGHT;
-
- dungeon[r][c] = TUNNEL;
-
- if (rand_percent(20)) {
- for (i = 0; i < 10; i++) {
- short t1, t2;
-
- t1 = get_rand(0, 3);
- t2 = get_rand(0, 3);
-
- swap(dirs[t1], dirs[t2]);
- }
- }
- for (i = 0; i < 4; i++) {
- switch(dirs[i]) {
- case UPWARD:
- if (((r-1) >= tr) &&
- (dungeon[r-1][c] != TUNNEL) &&
- (dungeon[r-1][c-1] != TUNNEL) &&
- (dungeon[r-1][c+1] != TUNNEL) &&
- (dungeon[r-2][c] != TUNNEL)) {
- make_maze((r-1), c, tr, br, lc, rc);
- }
- break;
- case DOWN:
- if (((r+1) <= br) &&
- (dungeon[r+1][c] != TUNNEL) &&
- (dungeon[r+1][c-1] != TUNNEL) &&
- (dungeon[r+1][c+1] != TUNNEL) &&
- (dungeon[r+2][c] != TUNNEL)) {
- make_maze((r+1), c, tr, br, lc, rc);
- }
- break;
- case LEFT:
- if (((c-1) >= lc) &&
- (dungeon[r][c-1] != TUNNEL) &&
- (dungeon[r-1][c-1] != TUNNEL) &&
- (dungeon[r+1][c-1] != TUNNEL) &&
- (dungeon[r][c-2] != TUNNEL)) {
- make_maze(r, (c-1), tr, br, lc, rc);
- }
- break;
- case RIGHT:
- if (((c+1) <= rc) &&
- (dungeon[r][c+1] != TUNNEL) &&
- (dungeon[r-1][c+1] != TUNNEL) &&
- (dungeon[r+1][c+1] != TUNNEL) &&
- (dungeon[r][c+2] != TUNNEL)) {
- make_maze(r, (c+1), tr, br, lc, rc);
- }
- break;
- }
- }
-}
-
-void
-hide_boxed_passage(short row1, short col1, short row2, short col2, short n)
-{
- short i, j, t;
- short row, col, row_cut, col_cut;
- short h, w;
-
- if (cur_level > 2) {
- if (row1 > row2) {
- swap(row1, row2);
- }
- if (col1 > col2) {
- swap(col1, col2);
- }
- h = row2 - row1;
- w = col2 - col1;
-
- if ((w >= 5) || (h >= 5)) {
- row_cut = ((h >= 2) ? 1 : 0);
- col_cut = ((w >= 2) ? 1 : 0);
-
- for (i = 0; i < n; i++) {
- for (j = 0; j < 10; j++) {
- row = get_rand(row1 + row_cut, row2 - row_cut);
- col = get_rand(col1 + col_cut, col2 - col_cut);
- if (dungeon[row][col] == TUNNEL) {
- dungeon[row][col] |= HIDDEN;
- break;
- }
- }
- }
- }
- }
-}
-
-void
-put_player(short nr) /* try not to put in this room */
-{
- short rn = nr, misses;
- short row, col;
-
- for (misses = 0; ((misses < 2) && (rn == nr)); misses++) {
- gr_row_col(&row, &col, (FLOOR | TUNNEL | OBJECT | STAIRS));
- rn = get_room_number(row, col);
- }
- rogue.row = row;
- rogue.col = col;
-
- if (dungeon[rogue.row][rogue.col] & TUNNEL) {
- cur_room = PASSAGE;
- } else {
- cur_room = rn;
- }
- if (cur_room != PASSAGE) {
- light_up_room(cur_room);
- } else {
- light_passage(rogue.row, rogue.col);
- }
- rn = get_room_number(rogue.row, rogue.col);
- wake_room(rn, 1, rogue.row, rogue.col);
- if (new_level_message) {
- messagef(0, "%s", new_level_message);
- new_level_message = NULL;
- }
- mvaddch(rogue.row, rogue.col, rogue.fchar);
-}
-
-int
-drop_check(void)
-{
- if (wizard) {
- return(1);
- }
- if (dungeon[rogue.row][rogue.col] & STAIRS) {
- if (levitate) {
- messagef(0, "you're floating in the air!");
- return(0);
- }
- return(1);
- }
- messagef(0, "I see no way down");
- return(0);
-}
-
-int
-check_up(void)
-{
- if (!wizard) {
- if (!(dungeon[rogue.row][rogue.col] & STAIRS)) {
- messagef(0, "I see no way up");
- return(0);
- }
- if (!has_amulet()) {
- messagef(0, "your way is magically blocked");
- return(0);
- }
- }
- new_level_message = "you feel a wrenching sensation in your gut";
- if (cur_level == 1) {
- win();
- } else {
- cur_level -= 2;
- return(1);
- }
- return(0);
-}
-
-void
-add_exp(int e, boolean promotion)
-{
- short new_exp;
- short i, hp;
-
- rogue.exp_points += e;
-
- if (rogue.exp_points >= level_points[rogue.exp-1]) {
- new_exp = get_exp_level(rogue.exp_points);
- if (rogue.exp_points > MAX_EXP) {
- rogue.exp_points = MAX_EXP + 1;
- }
- for (i = rogue.exp+1; i <= new_exp; i++) {
- messagef(0, "welcome to level %d", i);
- if (promotion) {
- hp = hp_raise();
- rogue.hp_current += hp;
- rogue.hp_max += hp;
- }
- rogue.exp = i;
- print_stats(STAT_HP | STAT_EXP);
- }
- } else {
- print_stats(STAT_EXP);
- }
-}
-
-int
-get_exp_level(long e)
-{
- short i;
-
- for (i = 0; i < (MAX_EXP_LEVEL - 1); i++) {
- if (level_points[i] > e) {
- break;
- }
- }
- return(i+1);
-}
-
-int
-hp_raise(void)
-{
- int hp;
-
- hp = (wizard ? 10 : get_rand(3, 10));
- return(hp);
-}
-
-void
-show_average_hp(void)
-{
- float real_average;
- float effective_average;
-
- if (rogue.exp == 1) {
- real_average = effective_average = 0.00;
- } else {
- real_average = (float)
- ((rogue.hp_max - extra_hp - INIT_HP) + less_hp) / (rogue.exp - 1);
- effective_average = (float) (rogue.hp_max - INIT_HP) / (rogue.exp - 1);
-
- }
- messagef(0, "R-Hp: %.2f, E-Hp: %.2f (!: %d, V: %d)", real_average,
- effective_average, extra_hp, less_hp);
-}
-
-void
-mix_random_rooms(void)
-{
- short i, t;
- short x, y;
-
- for (i = 0; i < (3 * MAXROOMS); i++) {
- do {
- x = get_rand(0, (MAXROOMS-1));
- y = get_rand(0, (MAXROOMS-1));
- } while (x == y);
- swap(random_rooms[x], random_rooms[y]);
- }
-}
diff --git a/games/rogue/machdep.c b/games/rogue/machdep.c
deleted file mode 100644
index 9dae396f4df..00000000000
--- a/games/rogue/machdep.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/* $OpenBSD: machdep.c,v 1.12 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: machdep.c,v 1.5 1995/04/28 23:49:22 mycroft Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * machdep.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-/* Included in this file are all system dependent routines. */
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <pwd.h>
-#include <time.h>
-
-#include <signal.h>
-#include <stdlib.h>
-#include <termios.h>
-#include <unistd.h>
-#include "rogue.h"
-#include "pathnames.h"
-
-/* md_slurp:
- *
- * This routine throws away all keyboard input that has not
- * yet been read. It is used to get rid of input that the user may have
- * typed-ahead.
- *
- * This function is not necessary, so it may be stubbed. The might cause
- * message-line output to flash by because the game has continued to read
- * input without waiting for the user to read the message. Not such a
- * big deal.
- */
-
-void
-md_slurp(void)
-{
- (void)fpurge(stdin);
-}
-
-/* md_heed_signals():
- *
- * This routine tells the program to call particular routines when
- * certain interrupts/events occur:
- *
- * SIGINT: call onintr() to interrupt fight with monster or long rest.
- * SIGQUIT: call byebye() to check for game termination.
- * SIGHUP: call error_save() to save game when terminal hangs up.
- *
- * On VMS, SIGINT and SIGQUIT correspond to ^C and ^Y.
- *
- * This routine is not strictly necessary and can be stubbed. This will
- * mean that the game cannot be interrupted properly with keyboard
- * input, this is not usually critical.
- */
-
-void
-md_heed_signals(void)
-{
- signal(SIGINT, onintr);
- signal(SIGQUIT, byebye);
- signal(SIGHUP, error_save);
-}
-
-/* md_ignore_signals():
- *
- * This routine tells the program to completely ignore the events mentioned
- * in md_heed_signals() above. The event handlers will later be turned on
- * by a future call to md_heed_signals(), so md_heed_signals() and
- * md_ignore_signals() need to work together.
- *
- * This function should be implemented or the user risks interrupting
- * critical sections of code, which could cause score file, or saved-game
- * file, corruption.
- */
-
-void
-md_ignore_signals(void)
-{
- signal(SIGQUIT, SIG_IGN);
- signal(SIGINT, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
-}
-
-/* md_get_file_id():
- *
- * This function returns an integer that uniquely identifies the specified
- * file. It need not check for the file's existence. In UNIX, the inode
- * number is used.
- *
- * This function is used to identify saved-game files.
- */
-
-int
-md_get_file_id(const char *fname)
-{
- struct stat sbuf;
-
- if (stat(fname, &sbuf)) {
- return(-1);
- }
- return((int) sbuf.st_ino);
-}
-
-/* md_link_count():
- *
- * This routine returns the number of hard links to the specified file.
- *
- * This function is not strictly necessary. On systems without hard links
- * this routine can be stubbed by just returning 1.
- */
-
-int
-md_link_count(char *fname)
-{
- struct stat sbuf;
-
- stat(fname, &sbuf);
- return((int) sbuf.st_nlink);
-}
-
-/* md_gct(): (Get Current Time)
- *
- * This function returns the current year, month(1-12), day(1-31), hour(0-23),
- * minute(0-59), and second(0-59). This is used for identifying the time
- * at which a game is saved.
- *
- * This function is not strictly necessary. It can be stubbed by returning
- * zeros instead of the correct year, month, etc. If your operating
- * system doesn't provide all of the time units requested here, then you
- * can provide only those that it does, and return zeros for the others.
- * If you cannot provide good time values, then users may be able to copy
- * saved-game files and play them.
- */
-
-void
-md_gct(struct rogue_time *rt_buf)
-{
- struct tm *t;
- time_t seconds;
-
- time(&seconds);
- t = localtime(&seconds);
-
- rt_buf->year = t->tm_year;
- rt_buf->month = t->tm_mon + 1;
- rt_buf->day = t->tm_mday;
- rt_buf->hour = t->tm_hour;
- rt_buf->minute = t->tm_min;
- rt_buf->second = t->tm_sec;
-}
-
-/* md_gfmt: (Get File Modification Time)
- *
- * This routine returns a file's date of last modification in the same format
- * as md_gct() above.
- *
- * This function is not strictly necessary. It is used to see if saved-game
- * files have been modified since they were saved. If you have stubbed the
- * routine md_gct() above by returning constant values, then you may do
- * exactly the same here.
- * Or if md_gct() is implemented correctly, but your system does not provide
- * file modification dates, you may return some date far in the past so
- * that the program will never know that a saved-game file being modified.
- * You may also do this if you wish to be able to restore games from
- * saved-games that have been modified.
- */
-
-void
-md_gfmt(char *fname, struct rogue_time *rt_buf)
-{
- struct stat sbuf;
- time_t seconds;
- struct tm *t;
-
- stat(fname, &sbuf);
- seconds = (long) sbuf.st_mtime;
- t = localtime(&seconds);
-
- rt_buf->year = t->tm_year;
- rt_buf->month = t->tm_mon + 1;
- rt_buf->day = t->tm_mday;
- rt_buf->hour = t->tm_hour;
- rt_buf->minute = t->tm_min;
- rt_buf->second = t->tm_sec;
-}
-
-/* md_df: (Delete File)
- *
- * This function deletes the specified file, and returns true (1) if the
- * operation was successful. This is used to delete saved-game files
- * after restoring games from them.
- *
- * Again, this function is not strictly necessary, and can be stubbed
- * by simply returning 1. In this case, saved-game files will not be
- * deleted and can be replayed.
- */
-
-boolean
-md_df(const char *fname)
-{
- if (unlink(fname)) {
- return(0);
- }
- return(1);
-}
-
-/* md_gln: (Get login name)
- *
- * This routine returns the login name of the user. This string is
- * used mainly for identifying users in score files.
- *
- * A dummy string may be returned if you are unable to implement this
- * function, but then the score file would only have one name in it.
- */
-
-char *
-md_gln(void)
-{
- struct passwd *p;
-
- if (!(p = getpwuid(getuid())))
- return((char *)NULL);
- return(p->pw_name);
-}
-
-/* md_sleep:
- *
- * This routine causes the game to pause for the specified number of
- * seconds.
- *
- * This routine is not particularly necessary at all. It is used for
- * delaying execution, which is useful to this program at some times.
- */
-
-void
-md_sleep(int nsecs)
-{
- (void) sleep(nsecs);
-}
-
-/* md_getenv()
- *
- * This routine gets certain values from the user's environment. These
- * values are strings, and each string is identified by a name. The names
- * of the values needed, and their use, is as follows:
- *
- * ROGUEOPTS
- * A string containing the various game options. This need not be
- * defined.
- * HOME
- * The user's home directory. This is only used when the user specifies
- * '~' as the first character of a saved-game file. This string need
- * not be defined.
- * SHELL
- * The user's favorite shell. If not found, "/bin/sh" is assumed.
- *
- * If your system does not provide a means of searching for these values,
- * you will have to do it yourself. None of the values above really need
- * to be defined. You can get by simply always returning zero, which
- * indicates that there is no defined value for the given string.
- */
-
-char *
-md_getenv(const char *name)
-{
- char *value;
-
- value = getenv(name);
-
- return(value);
-}
-
-/* md_malloc()
- *
- * This routine allocates, and returns a pointer to, the specified number
- * of bytes. This routines absolutely MUST be implemented for your
- * particular system or the program will not run at all. Return zero
- * when no more memory can be allocated.
- */
-
-char *
-md_malloc(int n)
-{
- char *t;
-
- t = malloc(n);
- return(t);
-}
-
-/* md_gseed() (Get Seed)
- *
- * This function returns a seed for the random number generator (RNG). This
- * seed causes the RNG to begin generating numbers at some point in it's
- * sequence. Without a random seed, the RNG will generate the same set
- * of numbers, and every game will start out exactly the same way. A good
- * number to use is the process id, given by getpid() on most UNIX systems.
- *
- * You need to find some single random integer, such as:
- * process id.
- * current time (minutes + seconds) returned from md_gct(), if implemented.
- *
- * It will not help to return "get_rand()" or "rand()" or the return value of
- * any pseudo-RNG. If you don't have a random number, you can just return 1,
- * but this means your games will ALWAYS start the same way, and will play
- * exactly the same way given the same input.
- */
-
-int
-md_gseed(void)
-{
- return(getpid());
-}
-
-/* md_exit():
- *
- * This function causes the program to discontinue execution and exit.
- * This function must be implemented or the program will continue to
- * hang when it should quit.
- */
-
-void
-md_exit(int status)
-{
- exit(status);
-}
-
-/* md_lock():
- *
- * This function is intended to give the user exclusive access to the score
- * file. It does so by flock'ing the score file. The full path name of the
- * score file should be defined for any particular site in rogue.h. The
- * constants _PATH_SCOREFILE defines this file name.
- *
- * When the parameter 'l' is non-zero (true), a lock is requested. Otherwise
- * the lock is released.
- */
-
-void
-md_lock(boolean l)
-{
- extern gid_t gid, egid;
- static int fd;
- short tries;
-
- if (l) {
- setegid(egid);
- if ((fd = open(_PATH_SCOREFILE, O_RDONLY)) < 1) {
- setegid(gid);
- messagef(0, "cannot lock score file");
- return;
- }
- setegid(gid);
- for (tries = 0; tries < 5; tries++)
- if (!flock(fd, LOCK_EX|LOCK_NB))
- return;
- } else {
- (void)flock(fd, LOCK_NB);
- (void)close(fd);
- }
-}
-
-/* md_shell():
- *
- * This function spawns a shell for the user to use. When this shell is
- * terminated, the game continues.
- *
- * It is important that the game not give the shell the privileges the
- * game uses to access the scores file. This version of the game runs
- * with privileges low by default; only the saved gid (if setgid) or uid
- * (if setuid) will be privileged, but that privilege is discarded by
- * exec().
- */
-
-void
-md_shell(const char *shell)
-{
- int w;
- pid_t pid;
-
- pid = fork();
- switch(pid) {
- case -1:
- break;
- case 0:
- execl(shell, shell, (char *)NULL);
- _exit(255);
- default:
- waitpid(pid, &w, 0);
- break;
- }
-}
diff --git a/games/rogue/main.c b/games/rogue/main.c
deleted file mode 100644
index cc6d42ad941..00000000000
--- a/games/rogue/main.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $OpenBSD: main.c,v 1.7 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: main.c,v 1.3 1995/04/22 10:27:41 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * main.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-int
-main(int argc, char *argv[])
-{
- if (init(argc, argv)) { /* restored game */
- goto PL;
- }
-
- for (;;) {
- clear_level();
- make_level();
- put_objects();
- put_stairs();
- add_traps();
- put_mons();
- put_player(party_room);
- print_stats(STAT_ALL);
-PL:
- play_level();
- free_stuff(&level_objects);
- free_stuff(&level_monsters);
- }
-}
diff --git a/games/rogue/message.c b/games/rogue/message.c
deleted file mode 100644
index 0a7d370d946..00000000000
--- a/games/rogue/message.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/* $OpenBSD: message.c,v 1.13 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: message.c,v 1.5 1995/04/22 10:27:43 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * message.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include <signal.h>
-#include <termios.h>
-#include <stdarg.h>
-#include "rogue.h"
-
-char msgs[NMESSAGES][DCOLS] = {"", "", "", "", ""};
-short msg_col = 0, imsg = -1;
-boolean msg_cleared = 1, rmsg = 0;
-char hunger_str[HUNGER_STR_LEN] = "";
-const char *more = "-more-";
-
-static void message(const char *, boolean);
-
-static void
-message(const char *msg, boolean intrpt)
-{
- cant_int = 1;
-
- if (!save_is_interactive) {
- return;
- }
- if (intrpt) {
- interrupted = 1;
- md_slurp();
- }
-
- if (!msg_cleared) {
- mvaddstr(MIN_ROW-1, msg_col, more);
- refresh();
- wait_for_ack();
- check_message();
- }
- if (!rmsg) {
- imsg = (imsg + 1) % NMESSAGES;
- strlcpy(msgs[imsg], msg, sizeof(msgs[imsg]));
- }
- mvaddstr(MIN_ROW-1, 0, msg);
- addch(' ');
- refresh();
- msg_cleared = 0;
- msg_col = strlen(msg);
-
- cant_int = 0;
-
- if (did_int) {
- did_int = 0;
- onintr(0);
- }
-}
-
-void
-messagef(boolean intrpt, const char *fmt, ...)
-{
- va_list ap;
- char buf[DCOLS];
-
- va_start(ap, fmt);
- vsnprintf(buf, sizeof(buf), fmt, ap);
- va_end(ap);
-
- message(buf, intrpt);
-}
-
-void
-remessage(short c)
-{
- if (imsg != -1) {
- check_message();
- rmsg = 1;
- while (c > imsg) {
- c -= NMESSAGES;
- }
- message(msgs[((imsg - c) % NMESSAGES)], 0);
- rmsg = 0;
- move(rogue.row, rogue.col);
- refresh();
- }
-}
-
-void
-check_message(void)
-{
- if (msg_cleared) {
- return;
- }
- move(MIN_ROW-1, 0);
- clrtoeol();
- refresh();
- msg_cleared = 1;
-}
-
-int
-get_input_line(const char *prompt, const char *insert, char *buf,
- size_t buflen, const char *if_cancelled, boolean add_blank,
- boolean do_echo)
-{
- int ch;
- int i = 0, n;
-
- message(prompt, 0);
- n = strlen(prompt);
-
- if (insert[0]) {
- mvaddstr(0, n + 1, insert);
- strlcpy(buf, insert, buflen);
- i = strlen(buf);
- move(0, (n + i + 1));
- refresh();
- }
-
- while (((ch = rgetchar()) != '\r') && (ch != '\n') && (ch != CANCEL)) {
- if ((ch >= ' ') && (ch <= '~') && (i < (int)(buflen - 2))) {
- if ((ch != ' ') || (i > 0)) {
- buf[i++] = ch;
- if (do_echo) {
- addch(ch);
- }
- }
- }
- if (((ch == '\b') || (ch == erasechar())) && (i > 0)) {
- if (do_echo) {
- mvaddch(0, i + n, ' ');
- move(MIN_ROW-1, i+n);
- }
- i--;
- }
- refresh();
- }
- check_message();
- if (add_blank) {
- buf[i++] = ' ';
- } else {
- while ((i > 0) && (buf[i-1] == ' ')) {
- i--;
- }
- }
-
- buf[i] = '\0';
-
- if ((ch == CANCEL) || (i == 0) || ((i == 1) && add_blank)) {
- if (if_cancelled) {
- message(if_cancelled, 0);
- }
- return(0);
- }
- return(i);
-}
-
-int
-rgetchar(void)
-{
- int ch;
-
- for(;;) {
- ch = getch();
-
- switch(ch) {
- case '\022':
- wrefresh(curscr);
- break;
- case '&':
- save_screen();
- break;
- case EOF:
- clean_up("");
- break;
- default:
- return(ch);
- }
- }
-}
-
-/*
-Level: 99 Gold: 999999 Hp: 999(999) Str: 99(99) Arm: 99 Exp: 21/10000000 Hungry
-0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5
-*/
-
-void
-print_stats(int stat_mask)
-{
- char buf[16];
- boolean label;
- short row = DROWS - 1;
-
- label = (stat_mask & STAT_LABEL) ? 1 : 0;
-
- if (stat_mask & STAT_LEVEL) {
- if (label) {
- mvaddstr(row, 0, "Level: ");
- }
- /* max level taken care of in make_level() */
- mvprintw(row, 7, "%-2d", cur_level);
- }
- if (stat_mask & STAT_GOLD) {
- if (label) {
- mvaddstr(row, 10, "Gold: ");
- }
- if (rogue.gold > MAX_GOLD) {
- rogue.gold = MAX_GOLD;
- }
- mvprintw(row, 16, "%-6ld", rogue.gold);
- }
- if (stat_mask & STAT_HP) {
- if (label) {
- mvaddstr(row, 23, "Hp: ");
- }
- if (rogue.hp_max > MAX_HP) {
- rogue.hp_current -= (rogue.hp_max - MAX_HP);
- rogue.hp_max = MAX_HP;
- }
- snprintf(buf, sizeof(buf), "%d(%d)",
- rogue.hp_current, rogue.hp_max);
- mvprintw(row, 27, "%-8s", buf);
- }
- if (stat_mask & STAT_STRENGTH) {
- if (label) {
- mvaddstr(row, 36, "Str: ");
- }
- if (rogue.str_max > MAX_STRENGTH) {
- rogue.str_current -= (rogue.str_max - MAX_STRENGTH);
- rogue.str_max = MAX_STRENGTH;
- }
- snprintf(buf, sizeof(buf), "%d(%d)",
- (rogue.str_current + add_strength), rogue.str_max);
- mvprintw(row, 41, "%-6s", buf);
- }
- if (stat_mask & STAT_ARMOR) {
- if (label) {
- mvaddstr(row, 48, "Arm: ");
- }
- if (rogue.armor && (rogue.armor->d_enchant > MAX_ARMOR)) {
- rogue.armor->d_enchant = MAX_ARMOR;
- }
- mvprintw(row, 53, "%-2d", get_armor_class(rogue.armor));
- }
- if (stat_mask & STAT_EXP) {
- if (label) {
- mvaddstr(row, 56, "Exp: ");
- }
- if (rogue.exp_points > MAX_EXP) {
- rogue.exp_points = MAX_EXP;
- }
- if (rogue.exp > MAX_EXP_LEVEL) {
- rogue.exp = MAX_EXP_LEVEL;
- }
- snprintf(buf, sizeof(buf), "%d/%ld",
- rogue.exp, rogue.exp_points);
- mvprintw(row, 61, "%-11s", buf);
- }
- if (stat_mask & STAT_HUNGER) {
- mvaddstr(row, 73, hunger_str);
- clrtoeol();
- }
- refresh();
-}
-
-void
-save_screen(void)
-{
- FILE *fp;
- short i, j;
- char buf[DCOLS+2];
-
- if ((fp = fopen("rogue.screen", "w")) != NULL) {
- for (i = 0; i < DROWS; i++) {
- for (j = 0; j < DCOLS; j++) {
- buf[j] = mvinch(i, j);
- }
- for (j = DCOLS; j > 0 && buf[j - 1] == ' '; j--)
- ;
- buf[j] = '\0';
- fputs(buf, fp);
- putc('\n', fp);
- }
- fclose(fp);
- } else {
- beep();
- }
-}
-
-boolean
-is_digit(short ch)
-{
- return((ch >= '0') && (ch <= '9'));
-}
-
-int
-r_index(const char *str, int ch, boolean last)
-{
- int i = 0;
-
- if (last) {
- for (i = strlen(str) - 1; i >= 0; i--) {
- if (str[i] == ch) {
- return(i);
- }
- }
- } else {
- for (i = 0; str[i]; i++) {
- if (str[i] == ch) {
- return(i);
- }
- }
- }
- return(-1);
-}
diff --git a/games/rogue/monster.c b/games/rogue/monster.c
deleted file mode 100644
index 1ff93c4cd88..00000000000
--- a/games/rogue/monster.c
+++ /dev/null
@@ -1,875 +0,0 @@
-/* $OpenBSD: monster.c,v 1.10 2009/11/12 21:57:46 dms Exp $ */
-/* $NetBSD: monster.c,v 1.3 1995/04/22 10:27:45 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * monster.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-object level_monsters;
-boolean mon_disappeared;
-
-const char *m_names[] = {
- "aquator",
- "bat",
- "centaur",
- "dragon",
- "emu",
- "venus fly-trap",
- "griffin",
- "hobgoblin",
- "ice monster",
- "jabberwock",
- "kestrel",
- "leprechaun",
- "medusa",
- "nymph",
- "orc",
- "phantom",
- "quagga",
- "rattlesnake",
- "snake",
- "troll",
- "black unicorn",
- "vampire",
- "wraith",
- "xeroc",
- "yeti",
- "zombie"
-};
-
-object mon_tab[MONSTERS] = {
- {(ASLEEP|WAKENS|WANDERS|RUSTS),"0d0",25,'A',20,9,18,100,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WANDERS|FLITS|FLIES),"1d3",10,'B',2,1,8,60,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WANDERS),"3d3/2d5",32,'C',15,7,16,85,0,10,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|FLAMES),"4d6/4d9",145,'D',5000,21,126,100,0,90,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS),"1d3",11,'E',2,1,7,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,NULL},
- {(HOLDS|STATIONARY),"5d5",73,'F',91,12,126,80,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS|FLIES),"5d5/5d5",115,'G',
- 2000,20,126,85,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS),"1d3/1d2",15,'H',3,1,10,67,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|FREEZES),"0d0",15,'I',5,2,11,68,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,NULL},
- {(ASLEEP|WANDERS),"3d10/4d5",132,'J',3000,21,126,100,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS|FLIES),"1d4",10,'K',2,1,6,60,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|STEALS_GOLD),"0d0",25,'L',21,6,16,75,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS|CONFUSES),"4d4/3d7",97,'M',
- 250,18,126,85,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|STEALS_ITEM),"0d0",25,'N',39,10,19,75,0,100,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,NULL},
- {(ASLEEP|WANDERS|WAKENS|SEEKS_GOLD),"1d6",25,'O',5,4,13,70,0,10,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|INVISIBLE|WANDERS|FLITS),"5d4",76,'P',120,15,24,80,0,50,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS),"3d5",30,'Q',20,8,17,78,0,20,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS|STINGS),"2d5",19,'R',10,3,12,70,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS),"1d3",8,'S',2,1,9,50,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS),"4d6/1d4",75,'T',125,13,22,75,0,33,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS),"4d10",90,'U',
- 200,17,26,85,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS|DRAINS_LIFE),"1d14/1d4",55,'V',
- 350,19,126,85,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|WANDERS|DROPS_LEVEL),"2d8",45,'W',55,14,23,75,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,NULL},
- {(ASLEEP|IMITATES),"4d6",42,'X',110,16,25,75,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,NULL},
- {(ASLEEP|WANDERS),"3d6",35,'Y',50,11,20,80,0,20,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,NULL},
- {(ASLEEP|WAKENS|WANDERS),"1d7",21,'Z',8,5,14,69,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,NULL}
-};
-
-void
-put_mons(void)
-{
- short i;
- short n;
- object *monster;
- short row, col;
-
- n = get_rand(4, 6);
-
- for (i = 0; i < n; i++) {
- monster = gr_monster((object *) 0, 0);
- if ((monster->m_flags & WANDERS) && coin_toss()) {
- wake_up(monster);
- }
- gr_row_col(&row, &col, (FLOOR | TUNNEL | STAIRS | OBJECT));
- put_m_at(row, col, monster);
- }
-}
-
-object *
-gr_monster(object *monster, int mn)
-{
- if (!monster) {
- monster = alloc_object();
-
- for (;;) {
- mn = get_rand(0, MONSTERS-1);
- if ((cur_level >= mon_tab[mn].first_level) &&
- (cur_level <= mon_tab[mn].last_level)) {
- break;
- }
- }
- }
- *monster = mon_tab[mn];
- if (monster->m_flags & IMITATES) {
- monster->disguise = gr_obj_char();
- }
- if (cur_level > (AMULET_LEVEL + 2)) {
- monster->m_flags |= HASTED;
- }
- monster->trow = NO_ROOM;
- return(monster);
-}
-
-void
-mv_mons(void)
-{
- object *monster, *next_monster;
- boolean flew;
-
- if (haste_self % 2) {
- return;
- }
-
- monster = level_monsters.next_monster;
-
- while (monster) {
- next_monster = monster->next_monster;
- mon_disappeared = 0;
- if (monster->m_flags & HASTED) {
- mv_1_monster(monster, rogue.row, rogue.col);
- if (mon_disappeared) {
- goto NM;
- }
- } else if (monster->m_flags & SLOWED) {
- monster->slowed_toggle = !monster->slowed_toggle;
- if (monster->slowed_toggle) {
- goto NM;
- }
- }
- if ((monster->m_flags & CONFUSED) && move_confused(monster)) {
- goto NM;
- }
- flew = 0;
- if ( (monster->m_flags & FLIES) &&
- !(monster->m_flags & NAPPING) &&
- !mon_can_go(monster, rogue.row, rogue.col)) {
- flew = 1;
- mv_1_monster(monster, rogue.row, rogue.col);
- if (mon_disappeared) {
- goto NM;
- }
- }
- if (!(flew && mon_can_go(monster, rogue.row, rogue.col))) {
- mv_1_monster(monster, rogue.row, rogue.col);
- }
-NM: monster = next_monster;
- }
-}
-
-void
-party_monsters(int rn, int n)
-{
- short i, j;
- short row, col;
- object *monster;
- boolean found;
-
- n += n;
-
- for (i = 0; i < MONSTERS; i++) {
- mon_tab[i].first_level -= (cur_level % 3);
- }
- for (i = 0; i < n; i++) {
- if (no_room_for_monster(rn)) {
- break;
- }
- for (j = found = 0; ((!found) && (j < 250)); j++) {
- row = get_rand(rooms[rn].top_row+1,
- rooms[rn].bottom_row-1);
- col = get_rand(rooms[rn].left_col+1,
- rooms[rn].right_col-1);
- if ((!(dungeon[row][col] & MONSTER)) &&
- (dungeon[row][col] & (FLOOR | TUNNEL))) {
- found = 1;
- }
- }
- if (found) {
- monster = gr_monster((object *) 0, 0);
- if (!(monster->m_flags & IMITATES)) {
- monster->m_flags |= WAKENS;
- }
- put_m_at(row, col, monster);
- }
- }
- for (i = 0; i < MONSTERS; i++) {
- mon_tab[i].first_level += (cur_level % 3);
- }
-}
-
-char
-gmc_row_col(short row, short col)
-{
- object *monster;
-
- if ((monster = object_at(&level_monsters, row, col))) {
- if ((!(detect_monster || see_invisible || r_see_invisible) &&
- (monster->m_flags & INVISIBLE)) || blind) {
- return(monster->trail_char);
- }
- if (monster->m_flags & IMITATES) {
- return(monster->disguise);
- }
- return(monster->m_char);
- } else {
- return('&'); /* BUG if this ever happens */
- }
-}
-
-char
-gmc(object *monster)
-{
- if ((!(detect_monster || see_invisible || r_see_invisible) &&
- (monster->m_flags & INVISIBLE))
- || blind) {
- return(monster->trail_char);
- }
- if (monster->m_flags & IMITATES) {
- return(monster->disguise);
- }
- return(monster->m_char);
-}
-
-void
-mv_1_monster(object *monster, short row, short col)
-{
- short i, n;
- boolean tried[6];
-
- if (monster->m_flags & ASLEEP) {
- if (monster->m_flags & NAPPING) {
- if (--monster->nap_length <= 0) {
- monster->m_flags &= (~(NAPPING | ASLEEP));
- }
- return;
- }
- if ((monster->m_flags & WAKENS) &&
- rogue_is_around(monster->row, monster->col) &&
- rand_percent(((stealthy > 0) ?
- (WAKE_PERCENT / (STEALTH_FACTOR + stealthy)) :
- WAKE_PERCENT))) {
- wake_up(monster);
- }
- return;
- } else if (monster->m_flags & ALREADY_MOVED) {
- monster->m_flags &= (~ALREADY_MOVED);
- return;
- }
- if ((monster->m_flags & FLITS) && flit(monster)) {
- return;
- }
- if ((monster->m_flags & STATIONARY) &&
- (!mon_can_go(monster, rogue.row, rogue.col))) {
- return;
- }
- if (monster->m_flags & FREEZING_ROGUE) {
- return;
- }
- if ((monster->m_flags & CONFUSES) && m_confuse(monster)) {
- return;
- }
- if (mon_can_go(monster, rogue.row, rogue.col)) {
- mon_hit(monster);
- return;
- }
- if ((monster->m_flags & FLAMES) && flame_broil(monster)) {
- return;
- }
- if ((monster->m_flags & SEEKS_GOLD) && seek_gold(monster)) {
- return;
- }
- if ((monster->trow == monster->row) &&
- (monster->tcol == monster->col)) {
- monster->trow = NO_ROOM;
- } else if (monster->trow != NO_ROOM) {
- row = monster->trow;
- col = monster->tcol;
- }
- if (monster->row > row) {
- row = monster->row - 1;
- } else if (monster->row < row) {
- row = monster->row + 1;
- }
- if ((dungeon[row][monster->col] & DOOR) &&
- mtry(monster, row, monster->col)) {
- return;
- }
- if (monster->col > col) {
- col = monster->col - 1;
- } else if (monster->col < col) {
- col = monster->col + 1;
- }
- if ((dungeon[monster->row][col] & DOOR) &&
- mtry(monster, monster->row, col)) {
- return;
- }
- if (mtry(monster, row, col)) {
- return;
- }
-
- for (i = 0; i <= 5; i++) tried[i] = 0;
-
- for (i = 0; i < 6; i++) {
-NEXT_TRY: n = get_rand(0, 5);
- switch(n) {
- case 0:
- if (!tried[n] && mtry(monster, row, monster->col-1)) {
- goto O;
- }
- break;
- case 1:
- if (!tried[n] && mtry(monster, row, monster->col)) {
- goto O;
- }
- break;
- case 2:
- if (!tried[n] && mtry(monster, row, monster->col+1)) {
- goto O;
- }
- break;
- case 3:
- if (!tried[n] && mtry(monster, monster->row-1, col)) {
- goto O;
- }
- break;
- case 4:
- if (!tried[n] && mtry(monster, monster->row, col)) {
- goto O;
- }
- break;
- case 5:
- if (!tried[n] && mtry(monster, monster->row+1, col)) {
- goto O;
- }
- break;
- }
- if (!tried[n]) {
- tried[n] = 1;
- } else {
- goto NEXT_TRY;
- }
- }
-O:
- if ((monster->row == monster->o_row) && (monster->col == monster->o_col)) {
- if (++(monster->o) > 4) {
- if ((monster->trow == NO_ROOM) &&
- (!mon_sees(monster, rogue.row, rogue.col))) {
- monster->trow = get_rand(1, (DROWS - 2));
- monster->tcol = get_rand(0, (DCOLS - 1));
- } else {
- monster->trow = NO_ROOM;
- monster->o = 0;
- }
- }
- } else {
- monster->o_row = monster->row;
- monster->o_col = monster->col;
- monster->o = 0;
- }
-}
-
-int
-mtry(object *monster, short row, short col)
-{
- if (mon_can_go(monster, row, col)) {
- move_mon_to(monster, row, col);
- return(1);
- }
- return(0);
-}
-
-void
-move_mon_to(object *monster, short row, short col)
-{
- short c;
- short mrow, mcol;
-
- mrow = monster->row;
- mcol = monster->col;
-
- dungeon[mrow][mcol] &= ~MONSTER;
- dungeon[row][col] |= MONSTER;
-
- c = mvinch(mrow, mcol);
-
- if ((c >= 'A') && (c <= 'Z')) {
- if (!detect_monster) {
- mvaddch(mrow, mcol, monster->trail_char);
- } else {
- if (rogue_can_see(mrow, mcol)) {
- mvaddch(mrow, mcol, monster->trail_char);
- } else {
- if (monster->trail_char == '.') {
- monster->trail_char = ' ';
- }
- mvaddch(mrow, mcol, monster->trail_char);
- }
- }
- }
- monster->trail_char = mvinch(row, col);
- if (!blind && (detect_monster || rogue_can_see(row, col))) {
- if ((!(monster->m_flags & INVISIBLE) ||
- (detect_monster || see_invisible || r_see_invisible))) {
- mvaddch(row, col, gmc(monster));
- }
- }
- if ((dungeon[row][col] & DOOR) &&
- (get_room_number(row, col) != cur_room) &&
- (dungeon[mrow][mcol] == FLOOR) && !blind) {
- mvaddch(mrow, mcol, ' ');
- }
- if (dungeon[row][col] & DOOR) {
- dr_course(monster, ((dungeon[mrow][mcol] & TUNNEL) ? 1 : 0),
- row, col);
- } else {
- monster->row = row;
- monster->col = col;
- }
-}
-
-int
-mon_can_go(object *monster, short row, short col)
-{
- object *obj;
- short dr, dc;
-
- dr = monster->row - row; /* check if move distance > 1 */
- if ((dr >= 2) || (dr <= -2)) {
- return(0);
- }
- dc = monster->col - col;
- if ((dc >= 2) || (dc <= -2)) {
- return(0);
- }
- if ((!dungeon[monster->row][col]) || (!dungeon[row][monster->col])) {
- return(0);
- }
- if ((!is_passable(row, col)) || (dungeon[row][col] & MONSTER)) {
- return(0);
- }
- if ((monster->row!=row)&&(monster->col!=col)&&((dungeon[row][col]&DOOR) ||
- (dungeon[monster->row][monster->col]&DOOR))) {
- return(0);
- }
- if (!(monster->m_flags & (FLITS | CONFUSED | CAN_FLIT)) &&
- (monster->trow == NO_ROOM)) {
- if ((monster->row < rogue.row) && (row < monster->row)) return(0);
- if ((monster->row > rogue.row) && (row > monster->row)) return(0);
- if ((monster->col < rogue.col) && (col < monster->col)) return(0);
- if ((monster->col > rogue.col) && (col > monster->col)) return(0);
- }
- if (dungeon[row][col] & OBJECT) {
- obj = object_at(&level_objects, row, col);
- if ((obj->what_is == SCROL) && (obj->which_kind == SCARE_MONSTER)) {
- return(0);
- }
- }
- return(1);
-}
-
-void
-wake_up(object *monster)
-{
- if (!(monster->m_flags & NAPPING)) {
- monster->m_flags &= (~(ASLEEP | IMITATES | WAKENS));
- }
-}
-
-void
-wake_room(short rn, boolean entering, short row, short col)
-{
- object *monster;
- short wake_percent;
- boolean in_room;
-
- wake_percent = (rn == party_room) ? PARTY_WAKE_PERCENT : WAKE_PERCENT;
- if (stealthy > 0) {
- wake_percent /= (STEALTH_FACTOR + stealthy);
- }
-
- monster = level_monsters.next_monster;
-
- while (monster) {
- in_room = (rn == get_room_number(monster->row, monster->col));
- if (in_room) {
- if (entering) {
- monster->trow = NO_ROOM;
- } else {
- monster->trow = row;
- monster->tcol = col;
- }
- }
- if ((monster->m_flags & WAKENS) &&
- (rn == get_room_number(monster->row, monster->col))) {
- if (rand_percent(wake_percent)) {
- wake_up(monster);
- }
- }
- monster = monster->next_monster;
- }
-}
-
-const char *
-mon_name(object *monster)
-{
- short ch;
-
- if (blind || ((monster->m_flags & INVISIBLE) &&
- !(detect_monster || see_invisible || r_see_invisible))) {
- return("something");
- }
- if (halluc) {
- ch = get_rand('A', 'Z') - 'A';
- return(m_names[ch]);
- }
- ch = monster->m_char - 'A';
- return(m_names[ch]);
-}
-
-int
-rogue_is_around(short row, short col)
-{
- short rdif, cdif, retval;
-
- rdif = row - rogue.row;
- cdif = col - rogue.col;
-
- retval = (rdif >= -1) && (rdif <= 1) && (cdif >= -1) && (cdif <= 1);
- return(retval);
-}
-
-void
-wanderer(void)
-{
- object *monster;
- short row, col, i;
- boolean found = 0;
-
- for (i = 0; ((i < 15) && (!found)); i++) {
- monster = gr_monster((object *) 0, 0);
- if (!(monster->m_flags & (WAKENS | WANDERS))) {
- free_object(monster);
- } else {
- found = 1;
- }
- }
- if (found) {
- found = 0;
- wake_up(monster);
- for (i = 0; ((i < 25) && (!found)); i++) {
- gr_row_col(&row, &col, (FLOOR | TUNNEL | STAIRS | OBJECT));
- if (!rogue_can_see(row, col)) {
- put_m_at(row, col, monster);
- found = 1;
- }
- }
- if (!found) {
- free_object(monster);
- }
- }
-}
-
-void
-show_monsters(void)
-{
- object *monster;
-
- detect_monster = 1;
-
- if (blind) {
- return;
- }
- monster = level_monsters.next_monster;
-
- while (monster) {
- mvaddch(monster->row, monster->col, monster->m_char);
- if (monster->m_flags & IMITATES) {
- monster->m_flags &= (~IMITATES);
- monster->m_flags |= WAKENS;
- }
- monster = monster->next_monster;
- }
-}
-
-void
-create_monster(void)
-{
- short row, col;
- short i;
- boolean found = 0;
- object *monster;
-
- row = rogue.row;
- col = rogue.col;
-
- for (i = 0; i < 9; i++) {
- rand_around(i, &row, &col);
- if (((row == rogue.row) && (col == rogue.col)) ||
- (row < MIN_ROW) || (row > (DROWS-2)) ||
- (col < 0) || (col > (DCOLS-1))) {
- continue;
- }
- if ((!(dungeon[row][col] & MONSTER)) &&
- (dungeon[row][col] & (FLOOR|TUNNEL|STAIRS|DOOR))) {
- found = 1;
- break;
- }
- }
- if (found) {
- monster = gr_monster((object *) 0, 0);
- put_m_at(row, col, monster);
- mvaddch(row, col, gmc(monster));
- if (monster->m_flags & (WANDERS | WAKENS)) {
- wake_up(monster);
- }
- } else {
- messagef(0, "you hear a faint cry of anguish in the distance");
- }
-}
-
-void
-put_m_at(short row, short col, object *monster)
-{
- monster->row = row;
- monster->col = col;
- dungeon[row][col] |= MONSTER;
- monster->trail_char = mvinch(row, col);
- (void) add_to_pack(monster, &level_monsters, 0);
- aim_monster(monster);
-}
-
-void
-aim_monster(object *monster)
-{
- short i, rn, d, r;
-
- rn = get_room_number(monster->row, monster->col);
- r = get_rand(0, 12);
-
- for (i = 0; i < 4; i++) {
- d = (r + i) % 4;
- if (rooms[rn].doors[d].oth_room != NO_ROOM) {
- monster->trow = rooms[rn].doors[d].door_row;
- monster->tcol = rooms[rn].doors[d].door_col;
- break;
- }
- }
-}
-
-int
-rogue_can_see(short row, short col)
-{
- int retval;
-
- retval = !blind &&
- (((get_room_number(row, col) == cur_room) &&
- !(rooms[cur_room].is_room & R_MAZE)) ||
- rogue_is_around(row, col));
-
- return(retval);
-}
-
-int
-move_confused(object *monster)
-{
- short i, row, col;
-
- if (!(monster->m_flags & ASLEEP)) {
- if (--monster->moves_confused <= 0) {
- monster->m_flags &= (~CONFUSED);
- }
- if (monster->m_flags & STATIONARY) {
- return(coin_toss() ? 1 : 0);
- } else if (rand_percent(15)) {
- return(1);
- }
- row = monster->row;
- col = monster->col;
-
- for (i = 0; i < 9; i++) {
- rand_around(i, &row, &col);
- if ((row == rogue.row) && (col == rogue.col)) {
- return(0);
- }
- if (mtry(monster, row, col)) {
- return(1);
- }
- }
- }
- return(0);
-}
-
-int
-flit(object *monster)
-{
- short i, row, col;
-
- if (!rand_percent(FLIT_PERCENT + ((monster->m_flags & FLIES) ? 20 : 0))) {
- return(0);
- }
- if (rand_percent(10)) {
- return(1);
- }
- row = monster->row;
- col = monster->col;
-
- for (i = 0; i < 9; i++) {
- rand_around(i, &row, &col);
- if ((row == rogue.row) && (col == rogue.col)) {
- continue;
- }
- if (mtry(monster, row, col)) {
- return(1);
- }
- }
- return(1);
-}
-
-char
-gr_obj_char(void)
-{
- short r;
- const char *rs = "%!?]=/):*";
-
- r = get_rand(0, 8);
-
- return(rs[r]);
-}
-
-int
-no_room_for_monster(int rn)
-{
- short i, j;
-
- for (i = rooms[rn].top_row+1; i < rooms[rn].bottom_row; i++) {
- for (j = rooms[rn].left_col+1; j < rooms[rn].right_col; j++) {
- if (!(dungeon[i][j] & MONSTER)) {
- return(0);
- }
- }
- }
- return(1);
-}
-
-void
-aggravate(void)
-{
- object *monster;
-
- messagef(0, "you hear a high pitched humming noise");
-
- monster = level_monsters.next_monster;
-
- while (monster) {
- wake_up(monster);
- monster->m_flags &= (~IMITATES);
- if (rogue_can_see(monster->row, monster->col)) {
- mvaddch(monster->row, monster->col, monster->m_char);
- }
- monster = monster->next_monster;
- }
-}
-
-boolean
-mon_sees(object *monster, short row, short col)
-{
- short rn, rdif, cdif, retval;
-
- rn = get_room_number(row, col);
-
- if ( (rn != NO_ROOM) &&
- (rn == get_room_number(monster->row, monster->col)) &&
- !(rooms[rn].is_room & R_MAZE)) {
- return(1);
- }
- rdif = row - monster->row;
- cdif = col - monster->col;
-
- retval = (rdif >= -1) && (rdif <= 1) && (cdif >= -1) && (cdif <= 1);
- return(retval);
-}
-
-void
-mv_aquatars(void)
-{
- object *monster;
-
- monster = level_monsters.next_monster;
-
- while (monster) {
- if ((monster->m_char == 'A') &&
- mon_can_go(monster, rogue.row, rogue.col)) {
- mv_1_monster(monster, rogue.row, rogue.col);
- monster->m_flags |= ALREADY_MOVED;
- }
- monster = monster->next_monster;
- }
-}
diff --git a/games/rogue/move.c b/games/rogue/move.c
deleted file mode 100644
index 33e6fb54c79..00000000000
--- a/games/rogue/move.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/* $OpenBSD: move.c,v 1.8 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: move.c,v 1.3 1995/04/22 10:27:47 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * move.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-short m_moves = 0;
-boolean jump = 0;
-const char *you_can_move_again = "you can move again";
-
-int
-one_move_rogue(short dirch, short pickup)
-{
- short row, col;
- object *obj;
- char desc[DCOLS];
- short status, d;
-
- row = rogue.row;
- col = rogue.col;
-
- if (confused) {
- dirch = gr_dir();
- }
- (void) is_direction(dirch, &d);
- get_dir_rc(d, &row, &col, 1);
-
- if (!can_move(rogue.row, rogue.col, row, col)) {
- return(MOVE_FAILED);
- }
- if (being_held || bear_trap) {
- if (!(dungeon[row][col] & MONSTER)) {
- if (being_held) {
- messagef(1, "you are being held");
- } else {
- messagef(0, "you are still stuck in the bear trap");
- (void) reg_move();
- }
- return(MOVE_FAILED);
- }
- }
- if (r_teleport) {
- if (rand_percent(R_TELE_PERCENT)) {
- tele();
- return(STOPPED_ON_SOMETHING);
- }
- }
- if (dungeon[row][col] & MONSTER) {
- rogue_hit(object_at(&level_monsters, row, col), 0);
- (void) reg_move();
- return(MOVE_FAILED);
- }
- if (dungeon[row][col] & DOOR) {
- if (cur_room == PASSAGE) {
- cur_room = get_room_number(row, col);
- light_up_room(cur_room);
- wake_room(cur_room, 1, row, col);
- } else {
- light_passage(row, col);
- }
- } else if ((dungeon[rogue.row][rogue.col] & DOOR) &&
- (dungeon[row][col] & TUNNEL)) {
- light_passage(row, col);
- wake_room(cur_room, 0, rogue.row, rogue.col);
- darken_room(cur_room);
- cur_room = PASSAGE;
- } else if (dungeon[row][col] & TUNNEL) {
- light_passage(row, col);
- }
- mvaddch(rogue.row, rogue.col, get_dungeon_char(rogue.row, rogue.col));
- mvaddch(row, col, rogue.fchar);
-
- if (!jump) {
- refresh();
- }
- rogue.row = row;
- rogue.col = col;
- if (dungeon[row][col] & OBJECT) {
- if (levitate && pickup) {
- return(STOPPED_ON_SOMETHING);
- }
- if (pickup && !levitate) {
- if ((obj = pick_up(row, col, &status))) {
- get_desc(obj, desc, sizeof(desc));
- if (obj->what_is == GOLD) {
- free_object(obj);
- messagef(1, "%s", desc);
- goto NOT_IN_PACK;
- }
- } else if (!status) {
- goto MVED;
- } else {
- goto MOVE_ON;
- }
- } else {
-MOVE_ON:
- obj = object_at(&level_objects, row, col);
- get_desc(obj, desc, sizeof(desc));
- messagef(1, "moved onto %s", desc);
- goto NOT_IN_PACK;
- }
- messagef(1, "%s(%c)", desc, obj->ichar);
-NOT_IN_PACK:
- (void) reg_move();
- return(STOPPED_ON_SOMETHING);
- }
- if (dungeon[row][col] & (DOOR | STAIRS | TRAP)) {
- if ((!levitate) && (dungeon[row][col] & TRAP)) {
- trap_player(row, col);
- }
- (void) reg_move();
- return(STOPPED_ON_SOMETHING);
- }
-MVED: if (reg_move()) { /* fainted from hunger */
- return(STOPPED_ON_SOMETHING);
- }
- return((confused ? STOPPED_ON_SOMETHING : MOVED));
-}
-
-void
-multiple_move_rogue(short dirch)
-{
- short row, col;
- short m;
-
- switch(dirch) {
- case '\010':
- case '\012':
- case '\013':
- case '\014':
- case '\031':
- case '\025':
- case '\016':
- case '\002':
- do {
- row = rogue.row;
- col = rogue.col;
- if (((m = one_move_rogue((dirch + 96), 1)) == MOVE_FAILED) ||
- (m == STOPPED_ON_SOMETHING) ||
- interrupted) {
- break;
- }
- } while (!next_to_something(row, col));
- if ( (!interrupted) && passgo && (m == MOVE_FAILED) &&
- (dungeon[rogue.row][rogue.col] & TUNNEL)) {
- turn_passage(dirch + 96, 0);
- }
- break;
- case 'H':
- case 'J':
- case 'K':
- case 'L':
- case 'B':
- case 'Y':
- case 'U':
- case 'N':
- while ((!interrupted) && (one_move_rogue((dirch + 32), 1) == MOVED)) ;
-
- if ( (!interrupted) && passgo &&
- (dungeon[rogue.row][rogue.col] & TUNNEL)) {
- turn_passage(dirch + 32, 1);
- }
- break;
- }
-}
-
-boolean
-is_passable(short row, short col)
-{
- if ((row < MIN_ROW) || (row > (DROWS - 2)) || (col < 0) ||
- (col > (DCOLS-1))) {
- return(0);
- }
- if (dungeon[row][col] & HIDDEN) {
- return((dungeon[row][col] & TRAP) ? 1 : 0);
- }
- return(dungeon[row][col] & (FLOOR | TUNNEL | DOOR | STAIRS | TRAP));
-}
-
-boolean
-next_to_something(short drow, short dcol)
-{
- short i, j, i_end, j_end, row, col;
- short pass_count = 0;
- unsigned short s;
-
- if (confused) {
- return(1);
- }
- if (blind) {
- return(0);
- }
- i_end = (rogue.row < (DROWS-2)) ? 1 : 0;
- j_end = (rogue.col < (DCOLS-1)) ? 1 : 0;
-
- for (i = ((rogue.row > MIN_ROW) ? -1 : 0); i <= i_end; i++) {
- for (j = ((rogue.col > 0) ? -1 : 0); j <= j_end; j++) {
- if ((i == 0) && (j == 0)) {
- continue;
- }
- if (((rogue.row+i) == drow) && ((rogue.col+j) == dcol)) {
- continue;
- }
- row = rogue.row + i;
- col = rogue.col + j;
- s = dungeon[row][col];
- if (s & HIDDEN) {
- continue;
- }
- /* If the rogue used to be right, up, left, down, or right of
- * row,col, and now isn't, then don't stop */
- if (s & (MONSTER | OBJECT | STAIRS)) {
- if (((row == drow) || (col == dcol)) &&
- (!((row == rogue.row) || (col == rogue.col)))) {
- continue;
- }
- return(1);
- }
- if (s & TRAP) {
- if (!(s & HIDDEN)) {
- if (((row == drow) || (col == dcol)) &&
- (!((row == rogue.row) || (col == rogue.col)))) {
- continue;
- }
- return(1);
- }
- }
- if ((((i - j) == 1) || ((i - j) == -1)) && (s & TUNNEL)) {
- if (++pass_count > 1) {
- return(1);
- }
- }
- if ((s & DOOR) && ((i == 0) || (j == 0))) {
- return(1);
- }
- }
- }
- return(0);
-}
-
-boolean
-can_move(short row1, short col1, short row2, short col2)
-{
- if (!is_passable(row2, col2)) {
- return(0);
- }
- if ((row1 != row2) && (col1 != col2)) {
- if ((dungeon[row1][col1] & DOOR) || (dungeon[row2][col2] & DOOR)) {
- return(0);
- }
- if ((!dungeon[row1][col2]) || (!dungeon[row2][col1])) {
- return(0);
- }
- }
- return(1);
-}
-
-void
-move_onto(void)
-{
- short ch, d;
- boolean first_miss = 1;
-
- while (!is_direction(ch = rgetchar(), &d)) {
- beep();
- if (first_miss) {
- messagef(0, "direction? ");
- first_miss = 0;
- }
- }
- check_message();
- if (ch != CANCEL) {
- (void) one_move_rogue(ch, 0);
- }
-}
-
-boolean
-is_direction(short c, short *d)
-{
- switch(c) {
- case 'h':
- *d = LEFT;
- break;
- case 'j':
- *d = DOWN;
- break;
- case 'k':
- *d = UPWARD;
- break;
- case 'l':
- *d = RIGHT;
- break;
- case 'b':
- *d = DOWNLEFT;
- break;
- case 'y':
- *d = UPLEFT;
- break;
- case 'u':
- *d = UPRIGHT;
- break;
- case 'n':
- *d = DOWNRIGHT;
- break;
- case CANCEL:
- break;
- default:
- return(0);
- }
- return(1);
-}
-
-boolean
-check_hunger(boolean msg_only)
-{
- short i, n;
- boolean fainted = 0;
-
- if (rogue.moves_left == HUNGRY) {
- (void) strlcpy(hunger_str, "hungry", HUNGER_STR_LEN);
- messagef(0, "%s", hunger_str);
- print_stats(STAT_HUNGER);
- }
- if (rogue.moves_left == WEAK) {
- (void) strlcpy(hunger_str, "weak", HUNGER_STR_LEN);
- messagef(1, "%s", hunger_str);
- print_stats(STAT_HUNGER);
- }
- if (rogue.moves_left <= FAINT) {
- if (rogue.moves_left == FAINT) {
- (void) strlcpy(hunger_str, "faint", HUNGER_STR_LEN);
- messagef(1, "%s", hunger_str);
- print_stats(STAT_HUNGER);
- }
- n = get_rand(0, (FAINT - rogue.moves_left));
- if (n > 0) {
- fainted = 1;
- if (rand_percent(40)) {
- rogue.moves_left++;
- }
- messagef(1, "you faint");
- for (i = 0; i < n; i++) {
- if (coin_toss()) {
- mv_mons();
- }
- }
- messagef(1, "%s", you_can_move_again);
- }
- }
- if (msg_only) {
- return(fainted);
- }
- if (rogue.moves_left <= STARVE) {
- killed_by((object *) 0, STARVATION);
- }
-
- switch(e_rings) {
- /*case -2:
- Subtract 0, i.e. do nothing.
- break;*/
- case -1:
- rogue.moves_left -= (rogue.moves_left % 2);
- break;
- case 0:
- rogue.moves_left--;
- break;
- case 1:
- rogue.moves_left--;
- (void) check_hunger(1);
- rogue.moves_left -= (rogue.moves_left % 2);
- break;
- case 2:
- rogue.moves_left--;
- (void) check_hunger(1);
- rogue.moves_left--;
- break;
- }
- return(fainted);
-}
-
-boolean
-reg_move(void)
-{
- boolean fainted;
-
- if ((rogue.moves_left <= HUNGRY) || (cur_level >= max_level)) {
- fainted = check_hunger(0);
- } else {
- fainted = 0;
- }
-
- mv_mons();
-
- if (++m_moves >= 120) {
- m_moves = 0;
- wanderer();
- }
- if (halluc) {
- if (!(--halluc)) {
- unhallucinate();
- } else {
- hallucinate();
- }
- }
- if (blind) {
- if (!(--blind)) {
- unblind();
- }
- }
- if (confused) {
- if (!(--confused)) {
- unconfuse();
- }
- }
- if (bear_trap) {
- bear_trap--;
- }
- if (levitate) {
- if (!(--levitate)) {
- messagef(1, "you float gently to the ground");
- if (dungeon[rogue.row][rogue.col] & TRAP) {
- trap_player(rogue.row, rogue.col);
- }
- }
- }
- if (haste_self) {
- if (!(--haste_self)) {
- messagef(0, "you feel yourself slowing down");
- }
- }
- heal();
- if (auto_search > 0) {
- search(auto_search, auto_search);
- }
- return(fainted);
-}
-
-void
-rest(int count)
-{
- int i;
-
- interrupted = 0;
-
- for (i = 0; i < count; i++) {
- if (interrupted) {
- break;
- }
- (void) reg_move();
- }
-}
-
-char
-gr_dir(void)
-{
- short d;
-
- d = get_rand(1, 8);
-
- switch(d) {
- case 1:
- d = 'j';
- break;
- case 2:
- d = 'k';
- break;
- case 3:
- d = 'l';
- break;
- case 4:
- d = 'h';
- break;
- case 5:
- d = 'y';
- break;
- case 6:
- d = 'u';
- break;
- case 7:
- d = 'b';
- break;
- case 8:
- d = 'n';
- break;
- }
- return(d);
-}
-
-void
-heal(void)
-{
- static short heal_exp = -1, n, c = 0;
- static boolean alt;
-
- if (rogue.hp_current == rogue.hp_max) {
- c = 0;
- return;
- }
- if (rogue.exp != heal_exp) {
- heal_exp = rogue.exp;
-
- switch(heal_exp) {
- case 1:
- n = 20;
- break;
- case 2:
- n = 18;
- break;
- case 3:
- n = 17;
- break;
- case 4:
- n = 14;
- break;
- case 5:
- n = 13;
- break;
- case 6:
- n = 10;
- break;
- case 7:
- n = 9;
- break;
- case 8:
- n = 8;
- break;
- case 9:
- n = 7;
- break;
- case 10:
- n = 4;
- break;
- case 11:
- n = 3;
- break;
- case 12:
- default:
- n = 2;
- }
- }
- if (++c >= n) {
- c = 0;
- rogue.hp_current++;
- if ((alt = !alt)) {
- rogue.hp_current++;
- }
- if ((rogue.hp_current += regeneration) > rogue.hp_max) {
- rogue.hp_current = rogue.hp_max;
- }
- print_stats(STAT_HP);
- }
-}
-
-boolean
-can_turn(short nrow, short ncol)
-{
- if ((dungeon[nrow][ncol] & TUNNEL) && is_passable(nrow, ncol)) {
- return(1);
- }
- return(0);
-}
-
-void
-turn_passage(short dir, boolean fast)
-{
- short crow = rogue.row, ccol = rogue.col, turns = 0;
- short ndir = 0;
-
- if ((dir != 'h') && can_turn(crow, ccol + 1)) {
- turns++;
- ndir = 'l';
- }
- if ((dir != 'l') && can_turn(crow, ccol - 1)) {
- turns++;
- ndir = 'h';
- }
- if ((dir != 'k') && can_turn(crow + 1, ccol)) {
- turns++;
- ndir = 'j';
- }
- if ((dir != 'j') && can_turn(crow - 1, ccol)) {
- turns++;
- ndir = 'k';
- }
- if (turns == 1) {
- multiple_move_rogue(ndir - (fast ? 32 : 96));
- }
-}
diff --git a/games/rogue/object.c b/games/rogue/object.c
deleted file mode 100644
index 87a4193845b..00000000000
--- a/games/rogue/object.c
+++ /dev/null
@@ -1,781 +0,0 @@
-/* $OpenBSD: object.c,v 1.11 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: object.c,v 1.3 1995/04/22 10:27:50 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * object.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-object level_objects;
-unsigned short dungeon[DROWS][DCOLS];
-short foods = 0;
-object *free_list = (object *) 0;
-char *fruit = (char *) 0;
-
-fighter rogue = {
- INIT_AW, /* armor */
- INIT_AW, /* weapon */
- INIT_RINGS, /* left ring */
- INIT_RINGS, /* right ring */
- INIT_HP, /* Hp current */
- INIT_HP, /* Hp max */
- INIT_STR, /* Str current */
- INIT_STR, /* Str max */
- INIT_PACK, /* pack */
- INIT_GOLD, /* gold */
- INIT_EXPLEVEL, /* exp level */
- INIT_EXP, /* exp points */
- 0, 0, /* row, col */
- INIT_CHAR, /* char */
- INIT_MOVES /* moves */
-};
-
-struct id id_potions[POTIONS] = {
-{100, "blue ", "of increase strength ", 0},
-{250, "red ", "of restore strength ", 0},
-{100, "green ", "of healing ", 0},
-{200, "grey ", "of extra healing ", 0},
- {10, "brown ", "of poison ", 0},
-{300, "clear ", "of raise level ", 0},
- {10, "pink ", "of blindness ", 0},
- {25, "white ", "of hallucination ", 0},
-{100, "purple ", "of detect monster ", 0},
-{100, "black ", "of detect things ", 0},
- {10, "yellow ", "of confusion ", 0},
- {80, "plaid ", "of levitation ", 0},
-{150, "burgundy ", "of haste self ", 0},
-{145, "beige ", "of see invisible ", 0}
-};
-
-struct id id_scrolls[SCROLS] = {
-{505, "", "of protect armor ", 0},
-{200, "", "of hold monster ", 0},
-{235, "", "of enchant weapon ", 0},
-{235, "", "of enchant armor ", 0},
-{175, "", "of identify ", 0},
-{190, "", "of teleportation ", 0},
- {25, "", "of sleep ", 0},
-{610, "", "of scare monster ", 0},
-{210, "", "of remove curse ", 0},
- {80, "", "of create monster ",0},
- {25, "", "of aggravate monster ",0},
-{180, "", "of magic mapping ", 0},
- {90, "", "of confuse monster ", 0}
-};
-
-struct id id_weapons[WEAPONS] = {
- {150, "short bow ", "", 0},
- {8, "darts ", "", 0},
- {15, "arrows ", "", 0},
- {27, "daggers ", "", 0},
- {35, "shurikens ", "", 0},
- {360, "mace ", "", 0},
- {470, "long sword ", "", 0},
- {580, "two-handed sword ", "", 0}
-};
-
-struct id id_armors[ARMORS] = {
- {300, "leather armor ", "", (UNIDENTIFIED)},
- {300, "ring mail ", "", (UNIDENTIFIED)},
- {400, "scale mail ", "", (UNIDENTIFIED)},
- {500, "chain mail ", "", (UNIDENTIFIED)},
- {600, "banded mail ", "", (UNIDENTIFIED)},
- {600, "splint mail ", "", (UNIDENTIFIED)},
- {700, "plate mail ", "", (UNIDENTIFIED)}
-};
-
-struct id id_wands[WANDS] = {
- {25, "", "of teleport away ",0},
- {50, "", "of slow monster ", 0},
- {8, "", "of invisibility ",0},
- {55, "", "of polymorph ",0},
- {2, "", "of haste monster ",0},
- {20, "", "of magic missile ",0},
- {20, "", "of cancellation ",0},
- {0, "", "of do nothing ",0},
- {35, "", "of drain life ",0},
- {20, "", "of cold ",0},
- {20, "", "of fire ",0}
-};
-
-struct id id_rings[RINGS] = {
- {250, "", "of stealth ",0},
- {100, "", "of teleportation ", 0},
- {255, "", "of regeneration ",0},
- {295, "", "of slow digestion ",0},
- {200, "", "of add strength ",0},
- {250, "", "of sustain strength ",0},
- {250, "", "of dexterity ",0},
- {25, "", "of adornment ",0},
- {300, "", "of see invisible ",0},
- {290, "", "of maintain armor ",0},
- {270, "", "of searching ",0},
-};
-
-void
-put_objects(void)
-{
- short i, n;
- object *obj;
-
- if (cur_level < max_level) {
- return;
- }
- n = coin_toss() ? get_rand(2, 4) : get_rand(3, 5);
- while (rand_percent(33)) {
- n++;
- }
- if (party_room != NO_ROOM) {
- make_party();
- }
- for (i = 0; i < n; i++) {
- obj = gr_object();
- rand_place(obj);
- }
- put_gold();
-}
-
-void
-put_gold(void)
-{
- short i, j;
- short row,col;
- boolean is_maze, is_room;
-
- for (i = 0; i < MAXROOMS; i++) {
- is_maze = (rooms[i].is_room & R_MAZE) ? 1 : 0;
- is_room = (rooms[i].is_room & R_ROOM) ? 1 : 0;
-
- if (!(is_room || is_maze)) {
- continue;
- }
- if (is_maze || rand_percent(GOLD_PERCENT)) {
- for (j = 0; j < 50; j++) {
- row = get_rand(rooms[i].top_row+1,
- rooms[i].bottom_row-1);
- col = get_rand(rooms[i].left_col+1,
- rooms[i].right_col-1);
- if ((dungeon[row][col] == FLOOR) ||
- (dungeon[row][col] == TUNNEL)) {
- plant_gold(row, col, is_maze);
- break;
- }
- }
- }
- }
-}
-
-void
-plant_gold(short row, short col, boolean is_maze)
-{
- object *obj;
-
- obj = alloc_object();
- obj->row = row; obj->col = col;
- obj->what_is = GOLD;
- obj->quantity = get_rand((2 * cur_level), (16 * cur_level));
- if (is_maze) {
- obj->quantity += obj->quantity / 2;
- }
- dungeon[row][col] |= OBJECT;
- (void) add_to_pack(obj, &level_objects, 0);
-}
-
-void
-place_at(object *obj, short row, short col)
-{
- obj->row = row;
- obj->col = col;
- dungeon[row][col] |= OBJECT;
- (void) add_to_pack(obj, &level_objects, 0);
-}
-
-object *
-object_at(object *pack, short row, short col)
-{
- object *obj = (object *) 0;
-
- if (dungeon[row][col] & (MONSTER | OBJECT)) {
- obj = pack->next_object;
-
- while (obj && ((obj->row != row) || (obj->col != col))) {
- obj = obj->next_object;
- }
- if (!obj) {
- messagef(1, "object_at(): inconsistent");
- }
- }
- return(obj);
-}
-
-object *
-get_letter_object(int ch)
-{
- object *obj;
-
- obj = rogue.pack.next_object;
-
- while (obj && (obj->ichar != ch)) {
- obj = obj->next_object;
- }
- return(obj);
-}
-
-void
-free_stuff(object *objlist)
-{
- object *obj;
-
- while (objlist->next_object) {
- obj = objlist->next_object;
- objlist->next_object =
- objlist->next_object->next_object;
- free_object(obj);
- }
-}
-
-const char *
-name_of(const object *obj)
-{
- const char *retstring;
-
- switch(obj->what_is) {
- case SCROL:
- retstring = obj->quantity > 1 ? "scrolls " : "scroll ";
- break;
- case POTION:
- retstring = obj->quantity > 1 ? "potions " : "potion ";
- break;
- case FOOD:
- if (obj->which_kind == RATION) {
- retstring = "food ";
- } else {
- retstring = fruit;
- }
- break;
- case WAND:
- retstring = is_wood[obj->which_kind] ? "staff " : "wand ";
- break;
- case WEAPON:
- switch(obj->which_kind) {
- case DART:
- retstring=obj->quantity > 1 ? "darts " : "dart ";
- break;
- case ARROW:
- retstring=obj->quantity > 1 ? "arrows " : "arrow ";
- break;
- case DAGGER:
- retstring=obj->quantity > 1 ? "daggers " : "dagger ";
- break;
- case SHURIKEN:
- retstring=obj->quantity > 1?"shurikens ":"shuriken ";
- break;
- default:
- retstring = id_weapons[obj->which_kind].title;
- }
- break;
- case ARMOR:
- retstring = "armor ";
- break;
- case RING:
- retstring = "ring ";
- break;
- case AMULET:
- retstring = "amulet ";
- break;
- default:
- retstring = "unknown ";
- break;
- }
- return(retstring);
-}
-
-object *
-gr_object(void)
-{
- object *obj;
-
- obj = alloc_object();
-
- if (foods < (cur_level / 3)) {
- obj->what_is = FOOD;
- foods++;
- } else {
- obj->what_is = gr_what_is();
- }
- switch(obj->what_is) {
- case SCROL:
- gr_scroll(obj);
- break;
- case POTION:
- gr_potion(obj);
- break;
- case WEAPON:
- gr_weapon(obj, 1);
- break;
- case ARMOR:
- gr_armor(obj);
- break;
- case WAND:
- gr_wand(obj);
- break;
- case FOOD:
- get_food(obj, 0);
- break;
- case RING:
- gr_ring(obj, 1);
- break;
- }
- return(obj);
-}
-
-unsigned short
-gr_what_is(void)
-{
- short percent;
- unsigned short what_is;
-
- percent = get_rand(1, 91);
-
- if (percent <= 30) {
- what_is = SCROL;
- } else if (percent <= 60) {
- what_is = POTION;
- } else if (percent <= 64) {
- what_is = WAND;
- } else if (percent <= 74) {
- what_is = WEAPON;
- } else if (percent <= 83) {
- what_is = ARMOR;
- } else if (percent <= 88) {
- what_is = FOOD;
- } else {
- what_is = RING;
- }
- return(what_is);
-}
-
-void
-gr_scroll(object *obj)
-{
- short percent;
-
- percent = get_rand(0, 91);
-
- obj->what_is = SCROL;
-
- if (percent <= 5) {
- obj->which_kind = PROTECT_ARMOR;
- } else if (percent <= 10) {
- obj->which_kind = HOLD_MONSTER;
- } else if (percent <= 20) {
- obj->which_kind = CREATE_MONSTER;
- } else if (percent <= 35) {
- obj->which_kind = IDENTIFY;
- } else if (percent <= 43) {
- obj->which_kind = TELEPORT;
- } else if (percent <= 50) {
- obj->which_kind = SLEEP;
- } else if (percent <= 55) {
- obj->which_kind = SCARE_MONSTER;
- } else if (percent <= 64) {
- obj->which_kind = REMOVE_CURSE;
- } else if (percent <= 69) {
- obj->which_kind = ENCH_ARMOR;
- } else if (percent <= 74) {
- obj->which_kind = ENCH_WEAPON;
- } else if (percent <= 80) {
- obj->which_kind = AGGRAVATE_MONSTER;
- } else if (percent <= 86) {
- obj->which_kind = CON_MON;
- } else {
- obj->which_kind = MAGIC_MAPPING;
- }
-}
-
-void
-gr_potion(object *obj)
-{
- short percent;
-
- percent = get_rand(1, 118);
-
- obj->what_is = POTION;
-
- if (percent <= 5) {
- obj->which_kind = RAISE_LEVEL;
- } else if (percent <= 15) {
- obj->which_kind = DETECT_OBJECTS;
- } else if (percent <= 25) {
- obj->which_kind = DETECT_MONSTER;
- } else if (percent <= 35) {
- obj->which_kind = INCREASE_STRENGTH;
- } else if (percent <= 45) {
- obj->which_kind = RESTORE_STRENGTH;
- } else if (percent <= 55) {
- obj->which_kind = HEALING;
- } else if (percent <= 65) {
- obj->which_kind = EXTRA_HEALING;
- } else if (percent <= 75) {
- obj->which_kind = BLINDNESS;
- } else if (percent <= 85) {
- obj->which_kind = HALLUCINATION;
- } else if (percent <= 95) {
- obj->which_kind = CONFUSION;
- } else if (percent <= 105) {
- obj->which_kind = POISON;
- } else if (percent <= 110) {
- obj->which_kind = LEVITATION;
- } else if (percent <= 114) {
- obj->which_kind = HASTE_SELF;
- } else {
- obj->which_kind = SEE_INVISIBLE;
- }
-}
-
-void
-gr_weapon(object *obj, int assign_wk)
-{
- short percent;
- short i;
- short blessing, increment;
-
- obj->what_is = WEAPON;
- if (assign_wk) {
- obj->which_kind = get_rand(0, (WEAPONS - 1));
- }
- if ((obj->which_kind == ARROW) || (obj->which_kind == DAGGER) ||
- (obj->which_kind == SHURIKEN) | (obj->which_kind == DART)) {
- obj->quantity = get_rand(3, 15);
- obj->quiver = get_rand(0, 126);
- } else {
- obj->quantity = 1;
- }
- obj->hit_enchant = obj->d_enchant = 0;
-
- percent = get_rand(1, 96);
- blessing = get_rand(1, 3);
-
- if (percent <= 32) {
- if (percent <= 16) {
- increment = 1;
- } else {
- increment = -1;
- obj->is_cursed = 1;
- }
- for (i = 0; i < blessing; i++) {
- if (coin_toss()) {
- obj->hit_enchant += increment;
- } else {
- obj->d_enchant += increment;
- }
- }
- }
- switch(obj->which_kind) {
- case BOW:
- case DART:
- obj->damage = "1d1";
- break;
- case ARROW:
- obj->damage = "1d2";
- break;
- case DAGGER:
- obj->damage = "1d3";
- break;
- case SHURIKEN:
- obj->damage = "1d4";
- break;
- case MACE:
- obj->damage = "2d3";
- break;
- case LONG_SWORD:
- obj->damage = "3d4";
- break;
- case TWO_HANDED_SWORD:
- obj->damage = "4d5";
- break;
- }
-}
-
-void
-gr_armor(object *obj)
-{
- short percent;
- short blessing;
-
- obj->what_is = ARMOR;
- obj->which_kind = get_rand(0, (ARMORS - 1));
- obj->class = obj->which_kind + 2;
- if ((obj->which_kind == PLATE) || (obj->which_kind == SPLINT)) {
- obj->class--;
- }
- obj->is_protected = 0;
- obj->d_enchant = 0;
-
- percent = get_rand(1, 100);
- blessing = get_rand(1, 3);
-
- if (percent <= 16) {
- obj->is_cursed = 1;
- obj->d_enchant -= blessing;
- } else if (percent <= 33) {
- obj->d_enchant += blessing;
- }
-}
-
-void
-gr_wand(object *obj)
-{
- obj->what_is = WAND;
- obj->which_kind = get_rand(0, (WANDS - 1));
- obj->class = get_rand(3, 7);
-}
-
-void
-get_food(object *obj, boolean force_ration)
-{
- obj->what_is = FOOD;
-
- if (force_ration || rand_percent(80)) {
- obj->which_kind = RATION;
- } else {
- obj->which_kind = FRUIT;
- }
-}
-
-void
-put_stairs(void)
-{
- short row, col;
-
- gr_row_col(&row, &col, (FLOOR | TUNNEL));
- dungeon[row][col] |= STAIRS;
-}
-
-int
-get_armor_class(const object *obj)
-{
- if (obj) {
- return(obj->class + obj->d_enchant);
- }
- return(0);
-}
-
-object *
-alloc_object(void)
-{
- object *obj;
-
- if (free_list) {
- obj = free_list;
- free_list = free_list->next_object;
- } else if (!(obj = (object *) md_malloc(sizeof(object)))) {
- messagef(0, "cannot allocate object, saving game");
- save_into_file(error_file);
- }
- obj->quantity = 1;
- obj->ichar = 'L';
- obj->picked_up = obj->is_cursed = 0;
- obj->in_use_flags = NOT_USED;
- obj->identified = UNIDENTIFIED;
- obj->damage = "1d1";
- return(obj);
-}
-
-void
-free_object(object *obj)
-{
- obj->next_object = free_list;
- free_list = obj;
-}
-
-void
-make_party(void)
-{
- short n;
-
- party_room = gr_room();
-
- n = rand_percent(99) ? party_objects(party_room) : 11;
- if (rand_percent(99)) {
- party_monsters(party_room, n);
- }
-}
-
-void
-show_objects(void)
-{
- object *obj;
- short mc, rc, row, col;
- object *monster;
-
- obj = level_objects.next_object;
-
- while (obj) {
- row = obj->row;
- col = obj->col;
-
- rc = get_mask_char(obj->what_is);
-
- if (dungeon[row][col] & MONSTER) {
- if ((monster =
- object_at(&level_monsters, row, col))) {
- monster->trail_char = rc;
- }
- }
- mc = mvinch(row, col);
- if (((mc < 'A') || (mc > 'Z')) &&
- ((row != rogue.row) || (col != rogue.col))) {
- mvaddch(row, col, rc);
- }
- obj = obj->next_object;
- }
-
- monster = level_monsters.next_object;
-
- while (monster) {
- if (monster->m_flags & IMITATES) {
- mvaddch(monster->row, monster->col, (int) monster->disguise);
- }
- monster = monster->next_monster;
- }
-}
-
-void
-put_amulet(void)
-{
- object *obj;
-
- obj = alloc_object();
- obj->what_is = AMULET;
- rand_place(obj);
-}
-
-void
-rand_place(object *obj)
-{
- short row, col;
-
- gr_row_col(&row, &col, (FLOOR | TUNNEL));
- place_at(obj, row, col);
-}
-
-void
-c_object_for_wizard(void)
-{
- short ch, max, wk;
- object *obj;
- char buf[80];
-
- max = 0;
- if (pack_count((object *) 0) >= MAX_PACK_COUNT) {
- messagef(0, "pack full");
- return;
- }
- messagef(0, "type of object?");
-
- while (r_index("!?:)]=/,\033", (ch = rgetchar()), 0) == -1) {
- beep();
- }
- check_message();
-
- if (ch == '\033') {
- return;
- }
- obj = alloc_object();
-
- switch(ch) {
- case '!':
- obj->what_is = POTION;
- max = POTIONS - 1;
- break;
- case '?':
- obj->what_is = SCROL;
- max = SCROLS - 1;
- break;
- case ',':
- obj->what_is = AMULET;
- break;
- case ':':
- get_food(obj, 0);
- break;
- case ')':
- gr_weapon(obj, 0);
- max = WEAPONS - 1;
- break;
- case ']':
- gr_armor(obj);
- max = ARMORS - 1;
- break;
- case '/':
- gr_wand(obj);
- max = WANDS - 1;
- break;
- case '=':
- max = RINGS - 1;
- obj->what_is = RING;
- break;
- }
- if ((ch != ',') && (ch != ':')) {
-GIL:
- if (get_input_line("which kind?", "", buf, sizeof(buf), "", 0, 1)) {
- wk = get_number(buf);
- if ((wk >= 0) && (wk <= max)) {
- obj->which_kind = (unsigned short) wk;
- if (obj->what_is == RING) {
- gr_ring(obj, 0);
- }
- } else {
- beep();
- goto GIL;
- }
- } else {
- free_object(obj);
- return;
- }
- }
- get_desc(obj, buf, sizeof(buf));
- messagef(0, "%s", buf);
- (void) add_to_pack(obj, &rogue.pack, 1);
-}
diff --git a/games/rogue/pack.c b/games/rogue/pack.c
deleted file mode 100644
index 4af04f04e5c..00000000000
--- a/games/rogue/pack.c
+++ /dev/null
@@ -1,562 +0,0 @@
-/* $OpenBSD: pack.c,v 1.12 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: pack.c,v 1.3 1995/04/22 10:27:54 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * pack.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-const char *curse_message = "you can't, it appears to be cursed";
-
-object *
-add_to_pack(object *obj, object *pack, int condense)
-{
- object *op;
-
- if (condense) {
- if ((op = check_duplicate(obj, pack))) {
- free_object(obj);
- return(op);
- } else {
- obj->ichar = next_avail_ichar();
- }
- }
- if (pack->next_object == 0) {
- pack->next_object = obj;
- } else {
- op = pack->next_object;
-
- while (op->next_object) {
- op = op->next_object;
- }
- op->next_object = obj;
- }
- obj->next_object = 0;
- return(obj);
-}
-
-void
-take_from_pack(object *obj, object *pack)
-{
- while (pack->next_object != obj) {
- pack = pack->next_object;
- }
- pack->next_object = pack->next_object->next_object;
-}
-
-/* Note: *status is set to 0 if the rogue attempts to pick up a scroll
- * of scare-monster and it turns to dust. *status is otherwise set to 1.
- */
-
-object *
-pick_up(short row, short col, short *status)
-{
- object *obj;
-
- *status = 1;
-
- if (levitate) {
- messagef(0, "you're floating in the air!");
- return((object *) 0);
- }
- obj = object_at(&level_objects, row, col);
- if (!obj) {
- messagef(1, "pick_up(): inconsistent");
- return(obj);
- }
- if ( (obj->what_is == SCROL) &&
- (obj->which_kind == SCARE_MONSTER) &&
- obj->picked_up) {
- messagef(0, "the scroll turns to dust as you pick it up");
- dungeon[row][col] &= (~OBJECT);
- vanish(obj, 0, &level_objects);
- *status = 0;
- if (id_scrolls[SCARE_MONSTER].id_status == UNIDENTIFIED) {
- id_scrolls[SCARE_MONSTER].id_status = IDENTIFIED;
- }
- return((object *) 0);
- }
- if (obj->what_is == GOLD) {
- rogue.gold += obj->quantity;
- dungeon[row][col] &= ~(OBJECT);
- take_from_pack(obj, &level_objects);
- print_stats(STAT_GOLD);
- return(obj); /* obj will be free_object()ed in caller */
- }
- if (pack_count(obj) >= MAX_PACK_COUNT) {
- messagef(1, "pack too full");
- return((object *) 0);
- }
- dungeon[row][col] &= ~(OBJECT);
- take_from_pack(obj, &level_objects);
- obj = add_to_pack(obj, &rogue.pack, 1);
- obj->picked_up = 1;
- return(obj);
-}
-
-void
-drop(void)
-{
- object *obj, *new;
- short ch;
- char desc[DCOLS];
-
- if (dungeon[rogue.row][rogue.col] & (OBJECT | STAIRS | TRAP)) {
- messagef(0, "there's already something there");
- return;
- }
- if (!rogue.pack.next_object) {
- messagef(0, "you have nothing to drop");
- return;
- }
- if ((ch = pack_letter("drop what?", ALL_OBJECTS)) == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- if (obj->in_use_flags & BEING_WIELDED) {
- if (obj->is_cursed) {
- messagef(0, "%s", curse_message);
- return;
- }
- unwield(rogue.weapon);
- } else if (obj->in_use_flags & BEING_WORN) {
- if (obj->is_cursed) {
- messagef(0, "%s", curse_message);
- return;
- }
- mv_aquatars();
- unwear(rogue.armor);
- print_stats(STAT_ARMOR);
- } else if (obj->in_use_flags & ON_EITHER_HAND) {
- if (obj->is_cursed) {
- messagef(0, "%s", curse_message);
- return;
- }
- un_put_on(obj);
- }
- obj->row = rogue.row;
- obj->col = rogue.col;
-
- if ((obj->quantity > 1) && (obj->what_is != WEAPON)) {
- obj->quantity--;
- new = alloc_object();
- *new = *obj;
- new->quantity = 1;
- obj = new;
- } else {
- obj->ichar = 'L';
- take_from_pack(obj, &rogue.pack);
- }
- place_at(obj, rogue.row, rogue.col);
- get_desc(obj, desc, sizeof(desc));
- messagef(0, "dropped %s", desc);
- (void) reg_move();
-}
-
-object *
-check_duplicate(object *obj, object *pack)
-{
- object *op;
-
- if (!(obj->what_is & (WEAPON | FOOD | SCROL | POTION))) {
- return(0);
- }
- if ((obj->what_is == FOOD) && (obj->which_kind == FRUIT)) {
- return(0);
- }
- op = pack->next_object;
-
- while (op) {
- if ((op->what_is == obj->what_is) &&
- (op->which_kind == obj->which_kind)) {
-
- if ((obj->what_is != WEAPON) ||
- ((obj->what_is == WEAPON) &&
- ((obj->which_kind == ARROW) ||
- (obj->which_kind == DAGGER) ||
- (obj->which_kind == DART) ||
- (obj->which_kind == SHURIKEN)) &&
- (obj->quiver == op->quiver))) {
- op->quantity += obj->quantity;
- return(op);
- }
- }
- op = op->next_object;
- }
- return(0);
-}
-
-short
-next_avail_ichar(void)
-{
- object *obj;
- int i;
- boolean ichars[26];
-
- for (i = 0; i < 26; i++) {
- ichars[i] = 0;
- }
- obj = rogue.pack.next_object;
- while (obj) {
- if (obj->ichar >= 'a' && obj->ichar <= 'z')
- ichars[(obj->ichar - 'a')] = 1;
- else
- clean_up("next_avail_ichar");
- obj = obj->next_object;
- }
- for (i = 0; i < 26; i++) {
- if (!ichars[i]) {
- return(i + 'a');
- }
- }
- return('?');
-}
-
-void
-wait_for_ack(void)
-{
- while (rgetchar() != ' ') ;
-}
-
-short
-pack_letter(const char *prompt, unsigned short mask)
-{
- short ch;
- unsigned short tmask = mask;
-
- if (!mask_pack(&rogue.pack, mask)) {
- messagef(0, "nothing appropriate");
- return(CANCEL);
- }
- for (;;) {
-
- messagef(0, "%s", prompt);
-
- for (;;) {
- ch = rgetchar();
- if (!is_pack_letter(&ch, &mask)) {
- beep();
- } else {
- break;
- }
- }
-
- if (ch == LIST) {
- check_message();
- mask = tmask;
- inventory(&rogue.pack, mask);
- } else {
- break;
- }
- mask = tmask;
- }
- check_message();
- return(ch);
-}
-
-void
-take_off(void)
-{
- char desc[DCOLS];
- object *obj;
-
- if (rogue.armor) {
- if (rogue.armor->is_cursed) {
- messagef(0, "%s", curse_message);
- } else {
- mv_aquatars();
- obj = rogue.armor;
- unwear(rogue.armor);
- get_desc(obj, desc, sizeof(desc));
- messagef(0, "was wearing %s", desc);
- print_stats(STAT_ARMOR);
- (void) reg_move();
- }
- } else {
- messagef(0, "not wearing any");
- }
-}
-
-void
-wear(void)
-{
- short ch;
- object *obj;
- char desc[DCOLS];
-
- if (rogue.armor) {
- messagef(0, "you're already wearing some");
- return;
- }
- ch = pack_letter("wear what?", ARMOR);
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- if (obj->what_is != ARMOR) {
- messagef(0, "you can't wear that");
- return;
- }
- obj->identified = 1;
- (void) strlcpy(desc, "wearing ", sizeof desc);
- get_desc(obj, desc, sizeof(desc));
- messagef(0, "wearing %s", desc);
- do_wear(obj);
- print_stats(STAT_ARMOR);
- (void) reg_move();
-}
-
-void
-unwear(object *obj)
-{
- if (obj) {
- obj->in_use_flags &= (~BEING_WORN);
- }
- rogue.armor = (object *) 0;
-}
-
-void
-do_wear(object *obj)
-{
- rogue.armor = obj;
- obj->in_use_flags |= BEING_WORN;
- obj->identified = 1;
-}
-
-void
-wield(void)
-{
- short ch;
- object *obj;
- char desc[DCOLS];
-
- if (rogue.weapon && rogue.weapon->is_cursed) {
- messagef(0, "%s", curse_message);
- return;
- }
- ch = pack_letter("wield what?", WEAPON);
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "No such item.");
- return;
- }
- if (obj->what_is & (ARMOR | RING)) {
- messagef(0, "you can't wield %s",
- ((obj->what_is == ARMOR) ? "armor" : "rings"));
- return;
- }
- if (obj->in_use_flags & BEING_WIELDED) {
- messagef(0, "in use");
- } else {
- unwield(rogue.weapon);
- get_desc(obj, desc, sizeof(desc));
- messagef(0, "wielding %s", desc);
- do_wield(obj);
- (void) reg_move();
- }
-}
-
-void
-do_wield(object *obj)
-{
- rogue.weapon = obj;
- obj->in_use_flags |= BEING_WIELDED;
-}
-
-void
-unwield(object *obj)
-{
- if (obj) {
- obj->in_use_flags &= (~BEING_WIELDED);
- }
- rogue.weapon = (object *) 0;
-}
-
-void
-call_it(void)
-{
- short ch;
- object *obj;
- struct id *id_table;
- char buf[MAX_TITLE_LENGTH+2];
-
- ch = pack_letter("call what?", (SCROL | POTION | WAND | RING));
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- if (!(obj->what_is & (SCROL | POTION | WAND | RING))) {
- messagef(0, "surely you already know what that's called");
- return;
- }
- id_table = get_id_table(obj);
-
- if (get_input_line("call it:", "", buf, sizeof(buf),
- id_table[obj->which_kind].title, 1, 1)) {
- id_table[obj->which_kind].id_status = CALLED;
- (void) strlcpy(id_table[obj->which_kind].title, buf,
- sizeof(id_table[obj->which_kind].title));
- }
-}
-
-short
-pack_count(object *new_obj)
-{
- object *obj;
- short count = 0;
-
- obj = rogue.pack.next_object;
-
- while (obj) {
- if (obj->what_is != WEAPON) {
- count += obj->quantity;
- } else if (!new_obj) {
- count++;
- } else if ((new_obj->what_is != WEAPON) ||
- ((obj->which_kind != ARROW) &&
- (obj->which_kind != DAGGER) &&
- (obj->which_kind != DART) &&
- (obj->which_kind != SHURIKEN)) ||
- (new_obj->which_kind != obj->which_kind) ||
- (obj->quiver != new_obj->quiver)) {
- count++;
- }
- obj = obj->next_object;
- }
- return(count);
-}
-
-boolean
-mask_pack(object *pack, unsigned short mask)
-{
- while (pack->next_object) {
- pack = pack->next_object;
- if (pack->what_is & mask) {
- return(1);
- }
- }
- return(0);
-}
-
-boolean
-is_pack_letter(short *c, unsigned short *mask)
-{
- if (((*c == '?') || (*c == '!') || (*c == ':') || (*c == '=') ||
- (*c == ')') || (*c == ']') || (*c == '/') || (*c == ','))) {
- switch(*c) {
- case '?':
- *mask = SCROL;
- break;
- case '!':
- *mask = POTION;
- break;
- case ':':
- *mask = FOOD;
- break;
- case ')':
- *mask = WEAPON;
- break;
- case ']':
- *mask = ARMOR;
- break;
- case '/':
- *mask = WAND;
- break;
- case '=':
- *mask = RING;
- break;
- case ',':
- *mask = AMULET;
- break;
- }
- *c = LIST;
- return(1);
- }
- return(((*c >= 'a') && (*c <= 'z')) || (*c == CANCEL) || (*c == LIST));
-}
-
-boolean
-has_amulet(void)
-{
- return(mask_pack(&rogue.pack, AMULET));
-}
-
-void
-kick_into_pack(void)
-{
- object *obj;
- char desc[DCOLS];
- short stat;
-
- if (!(dungeon[rogue.row][rogue.col] & OBJECT)) {
- messagef(0, "nothing here");
- } else {
- if ((obj = pick_up(rogue.row, rogue.col, &stat))) {
- get_desc(obj, desc, sizeof(desc));
- if (obj->what_is == GOLD) {
- messagef(0, "%s", desc);
- free_object(obj);
- } else {
- messagef(0, "%s(%c)", desc, obj->ichar);
- }
- }
- if (obj || (!stat)) {
- (void) reg_move();
- }
- }
-}
diff --git a/games/rogue/pathnames.h b/games/rogue/pathnames.h
deleted file mode 100644
index bee8c700ab9..00000000000
--- a/games/rogue/pathnames.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $OpenBSD: pathnames.h,v 1.3 2003/06/03 03:01:41 millert Exp $ */
-/* $NetBSD: pathnames.h,v 1.3 1995/04/22 10:27:59 cgd Exp $ */
-
-/*-
- * Copyright (c) 1990, 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. 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.
- *
- * @(#)pathnames.h 8.1 (Berkeley) 5/31/93
- */
-
-#define _PATH_SCOREFILE "/var/games/rogue.scores"
diff --git a/games/rogue/play.c b/games/rogue/play.c
deleted file mode 100644
index 99b083a4732..00000000000
--- a/games/rogue/play.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/* $OpenBSD: play.c,v 1.8 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: play.c,v 1.3 1995/04/22 10:28:04 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * play.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-boolean interrupted = 0;
-const char *unknown_command = "unknown command";
-
-void
-play_level(void)
-{
- short ch;
- int count;
-
- for (;;) {
- interrupted = 0;
- if (hit_message[0]) {
- messagef(1, "%s", hit_message);
- hit_message[0] = 0;
- }
- if (trap_door) {
- trap_door = 0;
- return;
- }
- move(rogue.row, rogue.col);
- refresh();
-
- ch = rgetchar();
-CMCH:
- check_message();
- count = 0;
-CH:
- switch(ch) {
- case '.':
- rest((count > 0) ? count : 1);
- break;
- case 's':
- search(((count > 0) ? count : 1), 0);
- break;
- case 'i':
- inventory(&rogue.pack, ALL_OBJECTS);
- break;
- case 'f':
- fight(0);
- break;
- case 'F':
- fight(1);
- break;
- case 'h':
- case 'j':
- case 'k':
- case 'l':
- case 'y':
- case 'u':
- case 'n':
- case 'b':
- (void) one_move_rogue(ch, 1);
- break;
- case 'H':
- case 'J':
- case 'K':
- case 'L':
- case 'B':
- case 'Y':
- case 'U':
- case 'N':
- case '\010':
- case '\012':
- case '\013':
- case '\014':
- case '\031':
- case '\025':
- case '\016':
- case '\002':
- multiple_move_rogue(ch);
- break;
- case 'e':
- eat();
- break;
- case 'q':
- quaff();
- break;
- case 'r':
- read_scroll();
- break;
- case 'm':
- move_onto();
- break;
- case ',':
- kick_into_pack();
- break;
- case 'd':
- drop();
- break;
- case 'P':
- put_on_ring();
- break;
- case 'R':
- remove_ring();
- break;
- case '\020':
- do {
- remessage(count++);
- ch = rgetchar();
- } while (ch == '\020');
- goto CMCH;
- break;
- case '\027':
- wizardize();
- break;
- case '>':
- if (drop_check()) {
- return;
- }
- break;
- case '<':
- if (check_up()) {
- return;
- }
- break;
- case ')':
- case ']':
- inv_armor_weapon(ch == ')');
- break;
- case '=':
- inv_rings();
- break;
- case '^':
- id_trap();
- break;
- case '/':
- id_type();
- break;
- case '?':
- id_com();
- break;
- case '!':
- do_shell();
- break;
- case 'o':
- edit_opts();
- break;
- case 'I':
- single_inv(0);
- break;
- case 'T':
- take_off();
- break;
- case 'W':
- wear();
- break;
- case 'w':
- wield();
- break;
- case 'c':
- call_it();
- break;
- case 'z':
- zapp();
- break;
- case 't':
- throw();
- break;
- case 'v':
- messagef(0, "rogue-clone: Version III. (Tim Stoehr was here), tektronix!zeus!tims");
- break;
- case 'Q':
- quit(0);
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- move(rogue.row, rogue.col);
- refresh();
- do {
- if (count < 100) {
- count = (10 * count) + (ch - '0');
- }
- ch = rgetchar();
- } while (is_digit(ch));
- if (ch != CANCEL) {
- goto CH;
- }
- break;
- case ' ':
- break;
- case '\011':
- if (wizard) {
- inventory(&level_objects, ALL_OBJECTS);
- } else {
- messagef(0, "%s", unknown_command);
- }
- break;
- case '\023':
- if (wizard) {
- draw_magic_map();
- } else {
- messagef(0, "%s", unknown_command);
- }
- break;
- case '\024':
- if (wizard) {
- show_traps();
- } else {
- messagef(0, "%s", unknown_command);
- }
- break;
- case '\017':
- if (wizard) {
- show_objects();
- } else {
- messagef(0, "%s", unknown_command);
- }
- break;
- case '\001':
- show_average_hp();
- break;
- case '\003':
- if (wizard) {
- c_object_for_wizard();
- } else {
- messagef(0, "%s", unknown_command);
- }
- break;
- case '\015':
- if (wizard) {
- show_monsters();
- } else {
- messagef(0, "%s", unknown_command);
- }
- break;
- case 'S':
- save_game();
- break;
- default:
- messagef(0, "%s", unknown_command);
- break;
- }
- }
-}
diff --git a/games/rogue/random.c b/games/rogue/random.c
deleted file mode 100644
index 2cb9d491683..00000000000
--- a/games/rogue/random.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* $OpenBSD: random.c,v 1.7 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: random.c,v 1.3 1995/04/22 10:28:06 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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 "rogue.h"
-
-/*
- * random.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-static long rntb[32] = {
- 3, 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342,
- 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, 0x7449e56b,
- 0xbeb1dbb0, 0xab5c5918, 0x946554fd, 0x8c2e680f, 0xeb3d799f,
- 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88, 0xe369735d,
- 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,
- 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e,
- 0x8999220b, 0x27fb47b9
-};
-
-static long *fptr = &rntb[4];
-static long *rptr = &rntb[1];
-static long *state = &rntb[1];
-static int rand_type = 3;
-static int rand_deg = 31;
-static int rand_sep = 3;
-static long *end_ptr = &rntb[32];
-
-void
-srrandom(int x)
-{
- int i;
-
- state[0] = (long) x;
- if (rand_type != 0) {
- for (i = 1; i < rand_deg; i++) {
- state[i] = 1103515245 * state[i - 1] + 12345;
- }
- fptr = &state[rand_sep];
- rptr = &state[0];
- for (i = 0; i < 10 * rand_deg; i++) {
- (void) rrandom();
- }
- }
-}
-
-long
-rrandom(void)
-{
- long i;
-
- if (rand_type == 0) {
- i = state[0] = (state[0]*1103515245 + 12345) & 0x7fffffff;
- } else {
- *fptr += *rptr;
- i = (*fptr >> 1) & 0x7fffffff;
- if (++fptr >= end_ptr) {
- fptr = state;
- ++rptr;
- } else {
- if (++rptr >= end_ptr) {
- rptr = state;
- }
- }
- }
- return(i);
-}
-
-int
-get_rand(int x, int y)
-{
- int r, t;
- long lr;
-
- if (x > y) {
- t = y;
- y = x;
- x = t;
- }
- lr = rrandom();
- lr &= (long) 0x00003fff;
- r = (int) lr;
- r = (r % ((y - x) + 1)) + x;
- return(r);
-}
-
-int
-rand_percent(int percentage)
-{
- return(get_rand(1, 100) <= percentage);
-}
-
-int
-coin_toss(void)
-{
- return(((rrandom() & 01) ? 1 : 0));
-}
diff --git a/games/rogue/ring.c b/games/rogue/ring.c
deleted file mode 100644
index 0aecf4194ad..00000000000
--- a/games/rogue/ring.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/* $OpenBSD: ring.c,v 1.8 2009/10/27 23:59:26 deraadt Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * ring.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-const char *left_or_right = "left or right hand?";
-const char *no_ring = "there's no ring on that hand";
-short stealthy;
-short r_rings;
-short add_strength;
-short e_rings;
-short regeneration;
-short ring_exp;
-short auto_search;
-boolean r_teleport;
-boolean r_see_invisible;
-boolean sustain_strength;
-boolean maintain_armor;
-
-void
-put_on_ring(void)
-{
- short ch;
- char desc[DCOLS];
- object *ring;
-
- if (r_rings == 2) {
- messagef(0, "wearing two rings already");
- return;
- }
- if ((ch = pack_letter("put on what?", RING)) == CANCEL) {
- return;
- }
- if (!(ring = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- if (!(ring->what_is & RING)) {
- messagef(0, "that's not a ring");
- return;
- }
- if (ring->in_use_flags & (ON_LEFT_HAND | ON_RIGHT_HAND)) {
- messagef(0, "that ring is already being worn");
- return;
- }
- if (r_rings == 1) {
- ch = (rogue.left_ring ? 'r' : 'l');
- } else {
- messagef(0, "%s", left_or_right);
- do {
- ch = rgetchar();
- } while ((ch != CANCEL) && (ch != 'l') && (ch != 'r') && (ch != '\n') &&
- (ch != '\r'));
- }
- if ((ch != 'l') && (ch != 'r')) {
- check_message();
- return;
- }
- if (((ch == 'l') && rogue.left_ring)||((ch == 'r') && rogue.right_ring)) {
- check_message();
- messagef(0, "there's already a ring on that hand");
- return;
- }
- if (ch == 'l') {
- do_put_on(ring, 1);
- } else {
- do_put_on(ring, 0);
- }
- ring_stats(1);
- check_message();
- get_desc(ring, desc, sizeof(desc));
- messagef(0, "%s", desc);
- (void) reg_move();
-}
-
-/*
- * Do not call ring_stats() from within do_put_on(). It will cause
- * serious problems when do_put_on() is called from read_pack() in restore().
- */
-
-void
-do_put_on(object *ring, boolean on_left)
-{
- if (on_left) {
- ring->in_use_flags |= ON_LEFT_HAND;
- rogue.left_ring = ring;
- } else {
- ring->in_use_flags |= ON_RIGHT_HAND;
- rogue.right_ring = ring;
- }
-}
-
-void
-remove_ring(void)
-{
- boolean left = 0, right = 0;
- short ch;
- char buf[DCOLS];
- object *ring;
-
- ring = NULL;
- if (r_rings == 0) {
- inv_rings();
- } else if (rogue.left_ring && !rogue.right_ring) {
- left = 1;
- } else if (!rogue.left_ring && rogue.right_ring) {
- right = 1;
- } else {
- messagef(0, "%s", left_or_right);
- do {
- ch = rgetchar();
- } while ((ch != CANCEL) && (ch != 'l') && (ch != 'r') &&
- (ch != '\n') && (ch != '\r'));
- left = (ch == 'l');
- right = (ch == 'r');
- check_message();
- }
- if (left || right) {
- if (left) {
- if (rogue.left_ring) {
- ring = rogue.left_ring;
- } else {
- messagef(0, "%s", no_ring);
- }
- } else {
- if (rogue.right_ring) {
- ring = rogue.right_ring;
- } else {
- messagef(0, "%s", no_ring);
- }
- }
- if (ring->is_cursed) {
- messagef(0, "%s", curse_message);
- } else {
- un_put_on(ring);
- get_desc(ring, buf, sizeof(buf));
- messagef(0, "removed %s", buf);
- (void) reg_move();
- }
- }
-}
-
-void
-un_put_on(object *ring)
-{
- if (ring && (ring->in_use_flags & ON_LEFT_HAND)) {
- ring->in_use_flags &= (~ON_LEFT_HAND);
- rogue.left_ring = 0;
- } else if (ring && (ring->in_use_flags & ON_RIGHT_HAND)) {
- ring->in_use_flags &= (~ON_RIGHT_HAND);
- rogue.right_ring = 0;
- }
- ring_stats(1);
-}
-
-void
-gr_ring(object *ring, boolean assign_wk)
-{
- ring->what_is = RING;
- if (assign_wk) {
- ring->which_kind = get_rand(0, (RINGS - 1));
- }
- ring->class = 0;
-
- switch(ring->which_kind) {
- /*
- case STEALTH:
- break;
- case SLOW_DIGEST:
- break;
- case REGENERATION:
- break;
- case R_SEE_INVISIBLE:
- break;
- case SUSTAIN_STRENGTH:
- break;
- case R_MAINTAIN_ARMOR:
- break;
- case SEARCHING:
- break;
- */
- case R_TELEPORT:
- ring->is_cursed = 1;
- break;
- case ADD_STRENGTH:
- case DEXTERITY:
- while ((ring->class = (get_rand(0, 4) - 2)) == 0) ;
- ring->is_cursed = (ring->class < 0);
- break;
- case ADORNMENT:
- ring->is_cursed = coin_toss();
- break;
- }
-}
-
-void
-inv_rings(void)
-{
- char buf[DCOLS];
-
- if (r_rings == 0) {
- messagef(0, "not wearing any rings");
- } else {
- if (rogue.left_ring) {
- get_desc(rogue.left_ring, buf, sizeof(buf));
- messagef(0, "%s", buf);
- }
- if (rogue.right_ring) {
- get_desc(rogue.right_ring, buf, sizeof(buf));
- messagef(0, "%s", buf);
- }
- }
- if (wizard) {
- messagef(0, "ste %d, r_r %d, e_r %d, r_t %d, s_s %d, a_s %d, reg %d, r_e %d, s_i %d, m_a %d, aus %d",
- stealthy, r_rings, e_rings, r_teleport, sustain_strength,
- add_strength, regeneration, ring_exp, r_see_invisible,
- maintain_armor, auto_search);
- }
-}
-
-void
-ring_stats(boolean pr)
-{
- short i;
- object *ring;
-
- stealthy = 0;
- r_rings = 0;
- e_rings = 0;
- r_teleport = 0;
- sustain_strength = 0;
- add_strength = 0;
- regeneration = 0;
- ring_exp = 0;
- r_see_invisible = 0;
- maintain_armor = 0;
- auto_search = 0;
-
- for (i = 0; i < 2; i++) {
- if (!(ring = ((i == 0) ? rogue.left_ring : rogue.right_ring))) {
- continue;
- }
- r_rings++;
- e_rings++;
- switch(ring->which_kind) {
- case STEALTH:
- stealthy++;
- break;
- case R_TELEPORT:
- r_teleport = 1;
- break;
- case REGENERATION:
- regeneration++;
- break;
- case SLOW_DIGEST:
- e_rings -= 2;
- break;
- case ADD_STRENGTH:
- add_strength += ring->class;
- break;
- case SUSTAIN_STRENGTH:
- sustain_strength = 1;
- break;
- case DEXTERITY:
- ring_exp += ring->class;
- break;
- case ADORNMENT:
- break;
- case R_SEE_INVISIBLE:
- r_see_invisible = 1;
- break;
- case MAINTAIN_ARMOR:
- maintain_armor = 1;
- break;
- case SEARCHING:
- auto_search += 2;
- break;
- }
- }
- if (pr) {
- print_stats(STAT_STRENGTH);
- relight();
- }
-}
diff --git a/games/rogue/rogue.6 b/games/rogue/rogue.6
deleted file mode 100644
index 787305a92cf..00000000000
--- a/games/rogue/rogue.6
+++ /dev/null
@@ -1,694 +0,0 @@
-.\" $OpenBSD: rogue.6,v 1.16 2010/04/08 16:53:50 jmc Exp $
-.\"
-.\" Copyright (c) 1988, 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. 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.
-.\"
-.\" @(#)rogue.6 8.1 (Berkeley) 5/31/93
-.\"
-.Dd $Mdocdate: April 8 2010 $
-.Dt ROGUE 6
-.Os
-.Sh NAME
-.Nm rogue
-.Nd Exploring The Dungeons of Doom
-.Sh SYNOPSIS
-.Nm rogue
-.Op Fl s
-.Op Ar save_file
-.\" .Op Fl r
-.\" .Op Fl d
-.Sh DESCRIPTION
-.Nm
-is a computer fantasy game.
-The object of the game is to survive the
-attacks of various monsters and collect a lot of gold.
-.Pp
-To get started you really only need to know two commands.
-The command
-.Ic ?\&
-will give you a list of the available commands and the command
-.Ic \&/
-will identify the things you see on the screen.
-.Pp
-To beat the game you must locate the Amulet of Yendor which is
-somewhere below the 20th level of the dungeon and get it out.
-Nobody has achieved this yet and if somebody does, they will probably go down
-in history as a hero among heroes.
-.Pp
-When the game ends, either by your death, when you quit, or if
-.Pq by some miracle
-you manage to win,
-.Nm
-will give you a list of the top-ten scorers.
-The scoring is based entirely upon how much gold you get.
-There is a 10% penalty for getting yourself killed.
-.Pp
-If
-.Ar save_file
-is specified,
-rogue will be restored from the specified saved game file.
-.Pp
-The
-.Fl s
-option will print out the list of scores and exit.
-.Sh INTRODUCTION
-You have just finished your years as a student at the local fighter's
-guild.
-After much practice and sweat you have finally completed your
-training and are ready to embark upon a perilous adventure.
-As a test of your skills,
-the local guildmasters have sent you into the Dungeons of Doom.
-Your task is to return with the Amulet of Yendor.
-Your reward for the completion of this task
-will be a full membership in the local guild.
-In addition, you are allowed to keep all the loot you bring back
-from the dungeons.
-.Pp
-In preparation for your journey, you are given an enchanted mace, a
-bow, and a quiver of arrows taken from a dragon's hoard in the far off
-Dark Mountains.
-You are also outfitted with elf-crafted armor and given
-enough food to reach the dungeons.
-You say goodbye to family and
-friends for what may be the last time and head up the road.
-.Pp
-You set out on your way to the dungeons and after several days of
-uneventful travel, you see the ancient ruins that mark the entrance to
-the Dungeons of Doom.
-It is late at night, so you make camp at the
-entrance and spend the night sleeping under the open skies.
-In the morning you gather your weapons,
-put on your armor, eat what is almost
-your last food, and enter the dungeons.
-.Sh GAMEPLAY
-You have just begun a game of rogue.
-Your goal is to grab as much
-treasure as you can, find the Amulet of Yendor, and get out of the
-Dungeons of Doom alive.
-On the screen, a map of where you have been and
-what you have seen on the current dungeon level is kept.
-As you explore more of the level,
-it appears on the screen in front of you.
-.Pp
-Rogue differs from older computer fantasy games in that it is screen
-oriented.
-Commands are all one or two keystrokes and the results of
-your commands are displayed graphically on the screen rather than being
-explained in words.
-.Pp
-Another major difference between
-.Nm
-and other computer fantasy games
-is that once you have solved all the puzzles in a standard fantasy
-game, it has lost most of its excitement and it ceases to be fun.
-.Nm ,
-on the other hand, generates a new dungeon every time you play
-it and even the author finds it an entertaining and exciting game.
-.Sh COMMANDS
-Commands are given to rogue by typing one or two characters.
-Most commands can be preceded by a count to repeat them
-(e.g. typing
-.Sq 10s
-will do ten searches).
-Commands for which counts make no sense
-have the count ignored.
-To cancel a count or a prefix,
-type
-.Aq ESC .
-The list of commands is rather long,
-but it can be read at any time during the game with the
-.Sq ?\&
-command.
-Here it is for reference,
-with a short explanation of each command.
-.Bl -tag -width indent
-.It Ic ?\&
-The help command.
-Asks for a character to give help on.
-If you type a
-.Sq * ,
-it will list all the commands,
-otherwise it will explain what the character you typed does.
-.It Ic /
-This is the
-.Sq What is that on the screen?
-command.
-A
-.Sq /
-followed by any character that you see on the level,
-will tell you what that character is.
-For instance,
-typing
-.Sq /@
-will tell you that the
-.Sq @
-symbol represents you, the player.
-.It Ic h, H, ^H
-Move left.
-You move one space to the left.
-If you use upper case
-.Sq h ,
-you will continue to move left until you run into something.
-This works for all movement commands
-(e.g.\&
-.Sq L
-means run in direction
-.Sq l ) .
-If you use the \*(lqcontrol\*(rq
-.Sq h ,
-you will continue moving in the specified direction
-until you pass something interesting or run into a wall.
-You should experiment with this,
-since it is a very useful command,
-but very difficult to describe.
-This also works for all movement commands.
-.It Ic j
-Move down.
-.It Ic k
-Move up.
-.It Ic l
-Move right.
-.It Ic y
-Move diagonally up and left.
-.It Ic u
-Move diagonally up and right.
-.It Ic b
-Move diagonally down and left.
-.It Ic n
-Move diagonally down and right.
-.It Ic t
-Throw an object.
-This is a prefix command.
-When followed with a direction
-it throws an object in the specified direction
-(e.g. type
-.Sq th
-to throw
-something to the left).
-.It Ic f
-Fight until someone dies.
-When followed with a direction
-this will force you to fight the creature in that direction
-until either you or it bites the big one.
-.It Ic m
-Move onto something without picking it up.
-This will move you one space in the direction you specify and,
-if there is an object there you can pick up,
-it won't do it.
-.It Ic z
-Zap prefix.
-Point a staff or wand in a given direction
-and fire it.
-Even non-directional staves must be pointed in some direction
-to be used.
-.It Ic ^
-Identify trap command.
-If a trap is on your map
-and you can't remember what type it is,
-you can get rogue to remind you
-by getting next to it and typing
-.Sq ^
-followed by the direction that would move you on top of it.
-.It Ic s
-Search for traps and secret doors.
-Examine each space immediately adjacent to you
-for the existence of a trap or secret door.
-There is a large chance that even if there is something there,
-you won't find it,
-so you might have to search a while before you find something.
-.It Ic \*(Gt
-Climb down a staircase to the next level.
-Not surprisingly, this can only be done if you are standing on
-a staircase.
-.It Ic \*(Lt
-Climb up a staircase to the level above.
-This can't be done without the Amulet of Yendor in your possession.
-.It Ic .\&
-Rest.
-This is the \*(lqdo nothing\*(rq command.
-This is good for waiting and healing.
-.It Ic ,\&
-Pick up something.
-This picks up whatever you are currently standing on,
-if you are standing on anything at all.
-.It Ic i
-Inventory.
-List what you are carrying in your pack.
-.It Ic I
-Selective inventory.
-Tells you what a single item in your pack is.
-.It Ic q
-Quaff one of the potions you are carrying.
-.It Ic r
-Read one of the scrolls in your pack.
-.It Ic e
-Eat food from your pack.
-.It Ic w
-Wield a weapon.
-Take a weapon out of your pack and carry it for use in combat,
-replacing the one you are currently using (if any).
-.It Ic W
-Wear armor.
-You can only wear one suit of armor at a time.
-This takes extra time.
-.It Ic T
-Take armor off.
-You can't remove armor that is cursed.
-This takes extra time.
-.It Ic P
-Put on a ring.
-You can wear only two rings at a time
-(one on each hand).
-If you aren't wearing any rings,
-this command will ask you which hand you want to wear it on,
-otherwise, it will place it on the unused hand.
-The program assumes that you wield your sword in your right hand.
-.It Ic R
-Remove a ring.
-If you are only wearing one ring,
-this command takes it off.
-If you are wearing two,
-it will ask you which one you wish to remove,
-.It Ic d
-Drop an object.
-Take something out of your pack and leave it lying on the floor.
-Only one object can occupy each space.
-You cannot drop a cursed object at all
-if you are wielding or wearing it.
-.It Ic c
-Call an object something.
-If you have a type of object in your pack
-which you wish to remember something about,
-you can use the call command to give a name to that type of object.
-This is usually used when you figure out what a
-potion, scroll, ring, or staff is
-after you pick it up but before it is truly identified.
-Each type of
-scroll and potion will become identified after its first use.
-.It Ic o
-Examine and set options.
-This command is further explained in the section on options.
-.It Ic ^R
-Redraws the screen.
-Useful if spurious messages or transmission errors
-have messed up the display.
-.It Ic ^P
-Print last message.
-Useful when a message disappears before you can read it.
-Consecutive repetitions of this command will reveal the last
-five messages.
-.It Aq Ic ESC
-Cancel a command, prefix, or count.
-.It Ic !\&
-Escape to a shell for some commands.
-.It Ic Q
-Quit.
-Leave the game.
-.It Ic S
-Save the current game in a file.
-It will ask you whether you wish to use the default save file.
-.Sy Caveat :
-Rogue won't let you start up a copy of a saved game,
-and it removes the save file as soon as you start up a restored game.
-This is to prevent people from saving a game just before a dangerous
-position
-and then restarting it if they die.
-To restore a saved game,
-give the file name as an argument to rogue.
-As in:
-.Pp
-.Dl $ rogue Aq save_file
-.It Ic v
-Prints the program version number.
-.It Ic )\&
-Print the weapon you are currently wielding
-.It Ic ]\&
-Print the armor you are currently wearing
-.It Ic =
-Print the rings you are currently wearing
-.El
-.Sh ROOMS
-Rooms in the dungeons are lit as you enter them.
-Upon leaving a room,
-all monsters inside the room are erased from the screen.
-In the darkness of a corridor,
-you can only see one space in all directions around you.
-.Sh FIGHTING
-If you see a monster and you wish to fight it, just attempt to run into it.
-Many times a monster you find will mind its own business unless you
-attack it.
-It is often the case that discretion is the better part of valor.
-.Sh OBJECTS
-When you find something in the dungeon,
-it is common to want to pick the object up.
-This is accomplished in rogue by walking over the object
-(unless you use the
-.Sq m
-prefix, see above).
-If you are carrying too many things,
-the program will tell you and it won't pick up the object,
-otherwise it will add it to your pack
-and tell you what you just picked up.
-.Pp
-Many of the commands that operate on objects must prompt you
-to find out which object you want to use.
-If you change your mind and don't want to do that command after all,
-just type an
-.Aq ESC
-and the command will be aborted.
-.Pp
-Some objects, like armor and weapons,
-are easily differentiated.
-Others, like scrolls and potions,
-are given labels which vary according to type.
-During a game,
-any two of the same kind of object
-with the same label
-are the same type.
-However,
-the labels will vary from game to game.
-.Pp
-When you use one of these labeled objects,
-its effect may be obvious.
-Potions or scrolls will
-become identified at this point, but not other items.
-You may want to call these other items something
-so you will recognize it later,
-you can use the
-.Sq call
-command
-(see above).
-.Ss Weapons
-Some weapons,
-like arrows,
-come in bunches,
-but most come one at a time.
-In order to use a weapon,
-you must wield it.
-To fire an arrow out of a bow,
-you must first wield the bow,
-then throw the arrow.
-You can only wield one weapon at a time,
-but you can't change weapons if the one
-you are currently wielding is cursed.
-The commands to use weapons are
-.Sq w
-(wield)
-and
-.Sq t
-(throw).
-.Ss Armor
-There are various sorts of armor lying around in the dungeon.
-Some of it is enchanted,
-some is cursed,
-and some is just normal.
-Different armor types have different armor protection.
-The higher the armor protection,
-the more protection the armor affords against the blows of monsters.
-Here is a list of the various armor types and their normal armor
-protection:
-.Bl -column "Studded leather" "Protection" -offset indent
-.It Sy "Type" Ta Sy "Protection"
-.It "None" Ta 0
-.It "Leather armor" Ta 2
-.It "Studded leather" Ta 3
-.It "Ring mail" Ta 3
-.It "Scale mail" Ta 4
-.It "Chain mail" Ta 5
-.It "Banded mail" Ta 6
-.It "Splint mail" Ta 6
-.It "Plate mail" Ta 7
-.El
-.Pp
-If a piece of armor is enchanted,
-its armor protection will be higher than normal.
-If a suit of armor is cursed,
-its armor protection will be lower,
-and you will not be able to remove it.
-However, not all armor with a protection that is lower than normal is
-cursed.
-.Pp
-The commands to use weapons are
-.Sq W
-(wear)
-and
-.Sq T
-(take off).
-.Ss Scrolls
-Scrolls come with titles in an unknown tongue.
-After you read a scroll,
-it disappears from your pack.
-The command to use a scroll is
-.Sq r
-(read).
-.Ss Potions
-Potions are labeled by the color of the liquid inside the flask.
-They disappear after being quaffed.
-The command to quaff a potion is
-.Sq q
-(quaff).
-.Ss Staves and Wands
-Staves and wands do the same kinds of things.
-Staves are identified by a type of wood;
-wands by a type of metal or bone.
-They are generally things you want to do to something
-over a long distance,
-so you must point them at what you wish to affect
-to use them.
-Some staves are not affected by the direction they are pointed, though.
-Staves come with multiple magic charges,
-the number being random,
-and when they are used up,
-the staff is just a piece of wood or metal.
-.Pp
-The command to use a wand or staff is
-.Sq z
-(zap)
-.Ss Rings
-Rings are very useful items,
-since they are relatively permanent magic,
-unlike the usually fleeting effects of potions, scrolls, and staves.
-Of course,
-the bad rings are also more powerful.
-Most rings also cause you to use up food more rapidly,
-the rate varying with the type of ring.
-Rings are differentiated by their stone settings.
-The commands to use rings are
-.Sq P
-(put on)
-and
-.Sq R
-(remove).
-.Ss Food
-Food is necessary to keep you going.
-If you go too long without eating you will faint,
-and eventually die of starvation.
-The command to use food is
-.Sq e
-(eat).
-.Sh OPTIONS
-Due to variations in personal tastes
-and conceptions of the way
-.Nm
-should do things,
-there are a set of options you can set that cause
-.Nm
-to behave in various different ways.
-.Ss Setting the options
-There are two ways to set the options.
-The first is with the
-.Sq o
-command of
-.Nm ;
-the second is with the
-.Ev ROGUEOPTS
-environment variable.
-.Pp
-When you type
-.Sq o
-in
-.Nm ,
-it clears the screen
-and displays the current settings for all the options.
-It then places the cursor by the value of the first option
-and waits for you to type.
-You can type a
-.Aq RETURN
-which means to go to the next option, a
-.Sq -
-which means to go to the previous option,
-an
-.Aq ESC ,
-which means to return to the game,
-or you can give the option a value.
-For boolean options this merely involves typing
-.Sq t
-for true or
-.Sq f
-for false.
-For string options,
-type the new value followed by a
-.Aq RETURN .
-.Pp
-The
-.Ev ROGUEOPTS
-variable is a string
-containing a comma separated list of initial values
-for the various options.
-Boolean variables can be turned on by listing their name
-or turned off by putting a
-.Sq no
-in front of the name.
-Thus to set up an environment variable so that
-.Dq jump
-is on,
-.Dq passgo
-is off,
-and the
-.Dq name
-is set to
-.Dq Blue Meanie ,
-use the following command:
-.Bd -literal -offset indent
-$ setenv ROGUEOPTS "jump,nopassgo,name=Blue Meanie"
-.Ed
-.Ss Option list
-Here is a list of the options
-and an explanation of what each one is for.
-The default value for each is enclosed in square brackets.
-For character string options,
-input over forty characters will be ignored.
-.Bl -tag -width indent
-.It Ic jump Ar nojump
-If this option is set,
-running moves will not be displayed
-until you reach the end of the move.
-This saves considerable CPU and display time.
-This option defaults to
-.Ic jump
-if you are using a slow terminal.
-.It Ic passgo Ar nopassgo
-Follow turnings in passageways.
-If you run in a passage
-and you run into stone or a wall,
-rogue will see if it can turn to the right or left.
-If it can only turn one way,
-it will turn that way.
-If it can turn either or neither,
-it will stop.
-This algorithm can sometimes lead to slightly confusing occurrences
-which is why it defaults to
-.Ic nopassgo .
-.It Ic skull Ar skull
-Print out the skull at the end if you get killed.
-This is nice but slow, so you can turn it off if you like.
-.It Ic name Ar account name
-This is the name of your character.
-It is used if you get on the top ten scorer's list.
-.It Ic fruit Ar slime-mold
-This should hold the name of a fruit that you enjoy eating.
-It is basically a whimsey that
-.Nm
-uses in a couple of places.
-.It Ic file Ar ~/rogue.save
-The default file name for saving the game.
-If your phone is hung up by accident,
-rogue will automatically save the game in this file.
-The file name may start with the special character
-.Sq ~
-which expands to your home directory.
-.El
-.Sh SCORING
-.Nm
-maintains a list of the top scoring people or scores on your machine.
-If you score higher than someone else on this list, or better
-your previous score on the list, you will be inserted in the proper
-place under your current name.
-.Pp
-If you quit the game, you get out with all of your gold intact.
-If, however, you get killed in the Dungeons of Doom, your body is forwarded
-to your next-of-kin, along with 90% of your gold; ten percent of your
-gold is kept by the Dungeons' wizard as a fee.
-This should make you
-consider whether you want to take one last hit at that monster and
-possibly live, or quit and thus stop with whatever you have.
-If you quit, you do get all your gold, but if you swing and live,
-you might find more.
-.Pp
-If you just want to see what the current top players/games list is,
-you can type:
-.Pp
-.Dl $ rogue -s
-.Sh FILES
-.Bl -tag -width "/var/games/rogue.scoresXXX" -compact
-.It Pa /var/games/rogue.scores
-Score file
-.It Pa ~/rogue.save
-Default save file
-.El
-.Sh HISTORY
-Rogue was originally conceived of by Glenn Wichman and Michael Toy.
-Ken Arnold and Michael Toy then smoothed out the user interface,
-and added jillions of new features.
-We would like to thank
-Bob Arnold,
-Michelle Busch,
-Andy Hatcher,
-Kipp Hickman,
-Mark Horton,
-Daniel Jensen,
-Bill Joy,
-Joe Kalash,
-Steve Maurer,
-Marty McNary,
-Jan Miller,
-and
-Scott Nelson
-for their ideas and assistance;
-and also the teeming multitudes
-who graciously ignored work, school, and social life to play
-.Nm
-and send us bugs, complaints, suggestions, and just plain flames.
-And also Mom.
-.Pp
-The public domain version of
-.Nm
-distributed with Berkeley
-.Ux
-was written by Timothy Stoehr.
-.Sh AUTHORS
-Timothy Stoehr,
-Michael C. Toy,
-Kenneth C. R. C. Arnold,
-Glenn Wichman.
-.Sh BUGS
-Probably infinite, although none are known.
-However,
-that Ice Monsters sometimes transfix you permanently is
-.Em not
-a bug.
-It's a feature.
diff --git a/games/rogue/rogue.h b/games/rogue/rogue.h
deleted file mode 100644
index 7ecc9e4a789..00000000000
--- a/games/rogue/rogue.h
+++ /dev/null
@@ -1,789 +0,0 @@
-/* $OpenBSD: rogue.h,v 1.16 2006/03/07 14:35:24 otto Exp $ */
-/* $NetBSD: rogue.h,v 1.4 1995/04/24 12:25:04 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- *
- * @(#)rogue.h 8.1 (Berkeley) 5/31/93
- */
-
-/*
- * rogue.h
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) This notice shall not be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- */
-
-#define boolean char
-
-#define NOTHING ((unsigned short) 0)
-#define OBJECT ((unsigned short) 01)
-#define MONSTER ((unsigned short) 02)
-#define STAIRS ((unsigned short) 04)
-#define HORWALL ((unsigned short) 010)
-#define VERTWALL ((unsigned short) 020)
-#define DOOR ((unsigned short) 040)
-#define FLOOR ((unsigned short) 0100)
-#define TUNNEL ((unsigned short) 0200)
-#define TRAP ((unsigned short) 0400)
-#define HIDDEN ((unsigned short) 01000)
-
-#define ARMOR ((unsigned short) 01)
-#define WEAPON ((unsigned short) 02)
-#define SCROL ((unsigned short) 04)
-#define POTION ((unsigned short) 010)
-#define GOLD ((unsigned short) 020)
-#define FOOD ((unsigned short) 040)
-#define WAND ((unsigned short) 0100)
-#define RING ((unsigned short) 0200)
-#define AMULET ((unsigned short) 0400)
-#define ALL_OBJECTS ((unsigned short) 0777)
-
-#define LEATHER 0
-#define RINGMAIL 1
-#define SCALE 2
-#define CHAIN 3
-#define BANDED 4
-#define SPLINT 5
-#define PLATE 6
-#define ARMORS 7
-
-#define BOW 0
-#define DART 1
-#define ARROW 2
-#define DAGGER 3
-#define SHURIKEN 4
-#define MACE 5
-#define LONG_SWORD 6
-#define TWO_HANDED_SWORD 7
-#define WEAPONS 8
-
-#define MAX_PACK_COUNT 24
-
-#define PROTECT_ARMOR 0
-#define HOLD_MONSTER 1
-#define ENCH_WEAPON 2
-#define ENCH_ARMOR 3
-#define IDENTIFY 4
-#define TELEPORT 5
-#define SLEEP 6
-#define SCARE_MONSTER 7
-#define REMOVE_CURSE 8
-#define CREATE_MONSTER 9
-#define AGGRAVATE_MONSTER 10
-#define MAGIC_MAPPING 11
-#define CON_MON 12
-#define SCROLS 13
-
-#define INCREASE_STRENGTH 0
-#define RESTORE_STRENGTH 1
-#define HEALING 2
-#define EXTRA_HEALING 3
-#define POISON 4
-#define RAISE_LEVEL 5
-#define BLINDNESS 6
-#define HALLUCINATION 7
-#define DETECT_MONSTER 8
-#define DETECT_OBJECTS 9
-#define CONFUSION 10
-#define LEVITATION 11
-#define HASTE_SELF 12
-#define SEE_INVISIBLE 13
-#define POTIONS 14
-
-#define TELE_AWAY 0
-#define SLOW_MONSTER 1
-#define INVISIBILITY 2
-#define POLYMORPH 3
-#define HASTE_MONSTER 4
-#define MAGIC_MISSILE 5
-#define CANCELLATION 6
-#define DO_NOTHING 7
-#define DRAIN_LIFE 8
-#define COLD 9
-#define FIRE 10
-#define WANDS 11
-
-#define STEALTH 0
-#define R_TELEPORT 1
-#define REGENERATION 2
-#define SLOW_DIGEST 3
-#define ADD_STRENGTH 4
-#define SUSTAIN_STRENGTH 5
-#define DEXTERITY 6
-#define ADORNMENT 7
-#define R_SEE_INVISIBLE 8
-#define MAINTAIN_ARMOR 9
-#define SEARCHING 10
-#define RINGS 11
-
-#define RATION 0
-#define FRUIT 1
-
-#define NOT_USED ((unsigned short) 0)
-#define BEING_WIELDED ((unsigned short) 01)
-#define BEING_WORN ((unsigned short) 02)
-#define ON_LEFT_HAND ((unsigned short) 04)
-#define ON_RIGHT_HAND ((unsigned short) 010)
-#define ON_EITHER_HAND ((unsigned short) 014)
-#define BEING_USED ((unsigned short) 017)
-
-#define NO_TRAP -1
-#define TRAP_DOOR 0
-#define BEAR_TRAP 1
-#define TELE_TRAP 2
-#define DART_TRAP 3
-#define SLEEPING_GAS_TRAP 4
-#define RUST_TRAP 5
-#define TRAPS 6
-
-#define STEALTH_FACTOR 3
-#define R_TELE_PERCENT 8
-
-#define UNIDENTIFIED ((unsigned short) 00) /* MUST BE ZERO! */
-#define IDENTIFIED ((unsigned short) 01)
-#define CALLED ((unsigned short) 02)
-
-#define DROWS 24
-#define DCOLS 80
-#define NMESSAGES 5
-#define MAX_TITLE_LENGTH 30
-#define MAXSYLLABLES 40
-#define MAX_METAL 14
-#define WAND_MATERIALS 30
-#define GEMS 14
-
-#define NUM_SCORE_ENTRIES 10
-
-#define GOLD_PERCENT 46
-
-#define MAX_OPT_LEN 40
-
-struct id {
- short value;
- char title[MAX_TITLE_LENGTH];
- const char *real;
- unsigned short id_status;
-};
-
-/* The following #defines provide more meaningful names for some of the
- * struct object fields that are used for monsters. This, since each monster
- * and object (scrolls, potions, etc) are represented by a struct object.
- * Ideally, this should be handled by some kind of union structure.
- */
-
-#define m_damage damage
-#define hp_to_kill quantity
-#define m_char ichar
-#define first_level is_protected
-#define last_level is_cursed
-#define m_hit_chance class
-#define stationary_damage identified
-#define drop_percent which_kind
-#define trail_char d_enchant
-#define slowed_toggle quiver
-#define moves_confused hit_enchant
-#define nap_length picked_up
-#define disguise what_is
-#define next_monster next_object
-
-struct obj { /* comment is monster meaning */
- unsigned long m_flags; /* monster flags */
- const char *damage; /* damage it does */
- short quantity; /* hit points to kill */
- short ichar; /* 'A' is for aquatar */
- short kill_exp; /* exp for killing it */
- short is_protected; /* level starts */
- short is_cursed; /* level ends */
- short class; /* chance of hitting you */
- short identified; /* 'F' damage, 1,2,3... */
- unsigned short which_kind; /* item carry/drop % */
- short o_row, o_col, o; /* o is how many times stuck at o_row, o_col */
- short row, col; /* current row, col */
- short d_enchant; /* room char when detect_monster */
- short quiver; /* monster slowed toggle */
- short trow, tcol; /* target row, col */
- short hit_enchant; /* how many moves is confused */
- unsigned short what_is; /* imitator's character (?!%: */
- short picked_up; /* sleep from wand of sleep */
- unsigned short in_use_flags;
- struct obj *next_object; /* next monster */
-};
-
-typedef struct obj object;
-
-#define INIT_AW (object*)0
-#define INIT_RINGS (object*)0
-#define INIT_HP 12
-#define INIT_STR 16
-#define INIT_EXPLEVEL 1
-#define INIT_EXP 0
-#define INIT_PACK {0, (char *)NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (struct obj *)NULL}
-#define INIT_GOLD 0
-#define INIT_CHAR '@'
-#define INIT_MOVES 1250
-
-struct fightr {
- object *armor;
- object *weapon;
- object *left_ring, *right_ring;
- short hp_current;
- short hp_max;
- short str_current;
- short str_max;
- object pack;
- long gold;
- short exp;
- long exp_points;
- short row, col;
- short fchar;
- short moves_left;
-};
-
-typedef struct fightr fighter;
-
-struct dr {
- short oth_room;
- short oth_row,
- oth_col;
- short door_row,
- door_col;
-};
-
-typedef struct dr door;
-
-struct rm {
- short bottom_row, right_col, left_col, top_row;
- door doors[4];
- unsigned short is_room;
-};
-
-typedef struct rm room;
-
-#define MAXROOMS 9
-#define BIG_ROOM 10
-
-#define NO_ROOM -1
-
-#define PASSAGE -3 /* cur_room value */
-
-#define AMULET_LEVEL 26
-
-#define R_NOTHING ((unsigned short) 01)
-#define R_ROOM ((unsigned short) 02)
-#define R_MAZE ((unsigned short) 04)
-#define R_DEADEND ((unsigned short) 010)
-#define R_CROSS ((unsigned short) 020)
-
-#define MAX_EXP_LEVEL 21
-#define MAX_EXP 10000001L
-#define MAX_GOLD 999999
-#define MAX_ARMOR 99
-#define MAX_HP 999
-#define MAX_STRENGTH 99
-#define LAST_DUNGEON 99
-
-#define STAT_LEVEL 01
-#define STAT_GOLD 02
-#define STAT_HP 04
-#define STAT_STRENGTH 010
-#define STAT_ARMOR 020
-#define STAT_EXP 040
-#define STAT_HUNGER 0100
-#define STAT_LABEL 0200
-#define STAT_ALL 0377
-
-#define PARTY_TIME 10 /* one party somewhere in each 10 level span */
-
-#define MAX_TRAPS 10 /* maximum traps per level */
-
-#define HIDE_PERCENT 12
-
-struct tr {
- short trap_type;
- short trap_row, trap_col;
-};
-
-typedef struct tr trap;
-
-extern fighter rogue;
-extern room rooms[];
-extern trap traps[];
-extern unsigned short dungeon[DROWS][DCOLS];
-extern object level_objects;
-
-extern struct id id_scrolls[];
-extern struct id id_potions[];
-extern struct id id_wands[];
-extern struct id id_rings[];
-extern struct id id_weapons[];
-extern struct id id_armors[];
-
-extern object mon_tab[];
-extern object level_monsters;
-
-#define MONSTERS 26
-
-#define HASTED 01L
-#define SLOWED 02L
-#define INVISIBLE 04L
-#define ASLEEP 010L
-#define WAKENS 020L
-#define WANDERS 040L
-#define FLIES 0100L
-#define FLITS 0200L
-#define CAN_FLIT 0400L /* can, but usually doesn't, flit */
-#define CONFUSED 01000L
-#define RUSTS 02000L
-#define HOLDS 04000L
-#define FREEZES 010000L
-#define STEALS_GOLD 020000L
-#define STEALS_ITEM 040000L
-#define STINGS 0100000L
-#define DRAINS_LIFE 0200000L
-#define DROPS_LEVEL 0400000L
-#define SEEKS_GOLD 01000000L
-#define FREEZING_ROGUE 02000000L
-#define RUST_VANISHED 04000000L
-#define CONFUSES 010000000L
-#define IMITATES 020000000L
-#define FLAMES 040000000L
-#define STATIONARY 0100000000L /* damage will be 1,2,3,... */
-#define NAPPING 0200000000L /* can't wake up for a while */
-#define ALREADY_MOVED 0400000000L
-
-#define SPECIAL_HIT (RUSTS|HOLDS|FREEZES|STEALS_GOLD|STEALS_ITEM|STINGS|DRAINS_LIFE|DROPS_LEVEL)
-
-#define WAKE_PERCENT 45
-#define FLIT_PERCENT 40
-#define PARTY_WAKE_PERCENT 75
-
-#define HYPOTHERMIA 1
-#define STARVATION 2
-#define POISON_DART 3
-#define QUIT 4
-#define WIN 5
-#define KFIRE 6
-
-#define UPWARD 0
-#define UPRIGHT 1
-#define RIGHT 2
-#define DOWNRIGHT 3
-#define DOWN 4
-#define DOWNLEFT 5
-#define LEFT 6
-#define UPLEFT 7
-#define DIRS 8
-
-#define ROW1 7
-#define ROW2 15
-
-#define COL1 26
-#define COL2 52
-
-#define MOVED 0
-#define MOVE_FAILED -1
-#define STOPPED_ON_SOMETHING -2
-#define CANCEL '\033'
-#define LIST '*'
-
-#define HUNGRY 300
-#define WEAK 150
-#define FAINT 20
-#define STARVE 0
-
-#define MIN_ROW 1
-
-struct rogue_time {
- short year; /* >= 1987 */
- short month; /* 1 - 12 */
- short day; /* 1 - 31 */
- short hour; /* 0 - 23 */
- short minute; /* 0 - 59 */
- short second; /* 0 - 59 */
-};
-
-#include <curses.h>
-
-/*
- * external routine declarations.
- */
-#include <sys/types.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-object *alloc_object(void);
-object *check_duplicate(object *, object *);
-const char *get_ench_color(void);
-object *get_letter_object(int);
-object *get_thrown_at_monster(object *, short, short *, short *);
-object *get_zapped_monster(short, short *, short *);
-object *gr_monster(object *, int);
-object *gr_object(void);
-char *md_getenv(const char *);
-char *md_gln(void);
-char *md_malloc(int);
-const char *mon_name(object *);
-const char *name_of(const object *);
-object *object_at(object *, short, short);
-object *pick_up(short, short, short *);
-void add_exp(int, boolean);
-void add_mazes(void);
-void add_traps(void);
-void aggravate(void);
-void aim_monster(object *);
-void bounce(short, short, short, short, short);
-void byebye(int);
-void c_object_for_wizard(void);
-void call_it(void);
-boolean can_move(short, short, short, short);
-boolean can_turn(short, short);
-void center(short, const char *);
-void check_gold_seeker(object *);
-boolean check_hunger(boolean);
-boolean check_imitator(object *);
-void check_message(void);
-int check_up(void);
-void clean_up(const char *);
-void clear_level(void);
-void cnfs(void);
-int coin_toss(void);
-int connect_rooms(short, short);
-void cough_up(object *);
-void create_monster(void);
-int damage_for_strength(void);
-void darken_room(short);
-void disappear(object *);
-void do_args(int, char **);
-void do_opts(void);
-void do_put_on(object *, boolean);
-void do_shell(void);
-void do_wear(object *);
-void do_wield(object *);
-void dr_course(object *, boolean, short, short);
-void drain_life(void);
-void draw_magic_map(void);
-void draw_simple_passage(short, short, short, short, short);
-void drop(void);
-int drop_check(void);
-void drop_level(void);
-void eat(void);
-void edit_opts(void);
-void env_get_value(char **, char *, boolean);
-void error_save(int);
-void fight(boolean);
-void fill_it(int, boolean);
-void fill_out_level(void);
-boolean flame_broil(object *);
-int flit(object *);
-void flop_weapon(object *, short, short);
-void free_object(object *);
-void free_stuff(object *);
-void freeze(object *);
-int get_armor_class(const object *);
-int get_com_id(int *, short);
-int get_damage(const char *, boolean);
-void get_desc(const object *, char *, size_t);
-int get_dir(short, short, short, short);
-void get_dir_rc(short, short *, short *, short);
-char get_dungeon_char(short, short);
-int get_exp_level(long);
-void get_food(object *, boolean);
-int get_hit_chance(object *);
-int get_input_line(const char *, const char *, char *, size_t, const char *, boolean, boolean);
-char get_mask_char(unsigned short);
-int get_number(const char *);
-boolean get_oth_room(short, short *, short *);
-int get_rand(int, int);
-short get_room_number(short, short);
-int get_value(object *);
-int get_w_damage(const object *);
-void get_wand_and_ring_materials(void);
-int get_weapon_damage(object *);
-char gmc(object *);
-char gmc_row_col(short, short);
-void go_blind(void);
-boolean gold_at(short, short);
-void gr_armor(object *);
-char gr_dir(void);
-char gr_obj_char(void);
-void gr_potion(object *);
-void gr_ring(object *, boolean);
-short gr_room(void);
-void gr_row_col(short *, short *, unsigned short);
-void gr_scroll(object *);
-void gr_wand(object *);
-void gr_weapon(object *, int);
-void hallucinate(void);
-boolean has_amulet(void);
-void heal(void);
-void hide_boxed_passage(short, short, short, short, short);
-void hold_monster(void);
-int hp_raise(void);
-void id_all(void);
-void id_com(void);
-void id_trap(void);
-void id_type(void);
-void idntfy(void);
-boolean imitating(short, short);
-int init(int, char **);
-void init_str(char **, const char *);
-void inv_armor_weapon(boolean);
-void inv_rings(void);
-void inventory(object *, unsigned short);
-boolean is_all_connected(void);
-boolean is_digit(short);
-boolean is_direction(short, short *);
-boolean is_pack_letter(short *, unsigned short *);
-boolean is_passable(short, short);
-boolean is_vowel(short);
-void kick_into_pack(void);
-void killed_by(const object *, short);
-void light_passage(short, short);
-void light_up_room(int);
-boolean m_confuse(object *);
-void make_level(void);
-void make_maze(short, short, short, short, short, short);
-void make_party(void);
-void make_room(short, short, short, short);
-void make_scroll_titles(void);
-boolean mask_pack(object *, unsigned short);
-boolean mask_room(short, short *, short *, unsigned short);
-boolean md_df(const char *);
-void md_exit(int);
-void md_gct(struct rogue_time *);
-int md_get_file_id(const char *);
-void md_gfmt(char *, struct rogue_time *);
-int md_gseed(void);
-void md_heed_signals(void);
-void md_ignore_signals(void);
-int md_link_count(char *);
-void md_lock(boolean);
-void md_shell(const char *);
-void md_sleep(int);
-void md_slurp(void);
-void messagef(boolean, const char *, ...)
-#ifdef __GNUC__
- __attribute__((__format__(__printf__, 2, 3)))
-#endif
- ;
-void mix_colors(void);
-void mix_random_rooms(void);
-int mon_can_go(object *, short, short);
-int mon_damage(object *, short);
-void mon_hit(object *);
-boolean mon_sees(object *, short, short);
-int move_confused(object *);
-void move_mon_to(object *, short, short);
-void move_onto(void);
-int mtry(object *, short, short);
-void multiple_move_rogue(short);
-void mv_1_monster(object *, short, short);
-void mv_aquatars(void);
-void mv_mons(void);
-short next_avail_ichar(void);
-boolean next_to_something(short, short);
-int no_room_for_monster(int);
-int one_move_rogue(short, short);
-void onintr(int);
-void opt_erase(int);
-void opt_go(int);
-void opt_show(int);
-short pack_count(object *);
-short pack_letter(const char *, unsigned short);
-void party_monsters(int, int);
-short party_objects(int);
-void place_at(object *, short, short);
-void plant_gold(short, short, boolean);
-void play_level(void);
-void player_init(void);
-void potion_heal(int);
-int pr_com_id(int);
-int pr_motion_char(int);
-void print_stats(int);
-void put_amulet(void);
-void put_door(room *, short, short *, short *);
-void put_gold(void);
-void put_m_at(short, short, object *);
-void put_mons(void);
-void put_objects(void);
-void put_on_ring(void);
-void put_player(short);
-void put_scores(const object *, short);
-void put_stairs(void);
-void quaff(void);
-void quit(boolean);
-int r_index(const char *, int, boolean);
-void rand_around(short, short *, short *);
-int rand_percent(int);
-void rand_place(object *);
-void read_scroll(void);
-void recursive_deadend(short, short *, short, short);
-boolean reg_move(void);
-void relight(void);
-void remessage(short);
-void remove_ring(void);
-void rest(int);
-void restore(char *);
-int rgetchar(void);
-void ring_stats(boolean);
-int rogue_can_see(short, short);
-void rogue_damage(short, object *, short);
-void rogue_hit(object *, boolean);
-int rogue_is_around(short, short);
-long rrandom(void);
-void rust(object *);
-void s_con_mon(object *);
-int same_col(int, int);
-int same_row(int, int);
-void save_game(void);
-void save_into_file(const char *);
-void save_screen(void);
-void search(short, boolean);
-boolean seek_gold(object *);
-void sell_pack(void);
-void sf_error(void);
-void show_average_hp(void);
-void show_monsters(void);
-void show_objects(void);
-void show_traps(void);
-void single_inv(short);
-void special_hit(object *);
-void srrandom(int);
-void start_window(void);
-void steal_gold(object *);
-void steal_item(object *);
-void sting(object *);
-void stop_window(void);
-void take_a_nap(void);
-void take_from_pack(object *, object *);
-void take_off(void);
-void tele(void);
-void tele_away(object *);
-void throw(void);
-boolean throw_at_monster(object *, object *);
-int to_hit(object *);
-short trap_at(short, short);
-void trap_player(short, short);
-boolean try_to_cough(short, short, object *);
-void turn_passage(short, boolean);
-void un_put_on(object *);
-void unblind(void);
-void unconfuse(void);
-void uncurse_all(void);
-void unhallucinate(void);
-void unwear(object *);
-void unwield(object *);
-void vanish(object *, short, object *);
-void visit_rooms(int);
-void wait_for_ack(void);
-void wake_room(short, boolean, short, short);
-void wake_up(object *);
-void wanderer(void);
-void wdrain_life(object *);
-void wear(void);
-void wield(void);
-void win(void);
-void wizardize(void);
-long xxx(boolean);
-void xxxx(char *, short);
-void zap_monster(object *, unsigned short);
-void zapp(void);
-object *add_to_pack(object *, object *, int);
-struct id *get_id_table(const object *);
-unsigned short gr_what_is(void);
-
-extern boolean ask_quit;
-extern boolean being_held;
-extern boolean cant_int;
-extern boolean con_mon;
-extern boolean detect_monster;
-extern boolean did_int;
-extern boolean interrupted;
-extern boolean is_wood[];
-extern boolean jump;
-extern boolean maintain_armor;
-extern boolean mon_disappeared;
-extern boolean msg_cleared;
-extern boolean no_skull;
-extern boolean passgo;
-extern boolean r_see_invisible;
-extern boolean r_teleport;
-extern boolean save_is_interactive;
-extern boolean score_only;
-extern boolean see_invisible;
-extern boolean sustain_strength;
-extern boolean trap_door;
-extern boolean wizard;
-#define HIT_MESSAGE_LEN 80
-extern char hit_message[HIT_MESSAGE_LEN];
-#define HUNGER_STR_LEN 8
-extern char hunger_str[HUNGER_STR_LEN];
-#define LOGIN_NAME_LEN 40
-extern char login_name[LOGIN_NAME_LEN];
-extern const char *byebye_string;
-extern const char *curse_message;
-extern const char *error_file;
-extern char *fruit;
-extern const char *m_names[];
-extern const char *more;
-extern const char *new_level_message;
-extern char *nick_name;
-extern const char *press_space;
-extern char *save_file;
-extern const char *you_can_move_again;
-extern long level_points[];
-extern short add_strength;
-extern short auto_search;
-extern short bear_trap;
-extern short blind;
-extern short confused;
-extern short cur_level;
-extern short cur_room;
-extern short e_rings;
-extern short extra_hp;
-extern short foods;
-extern short halluc;
-extern short haste_self;
-extern short less_hp;
-extern short levitate;
-extern short m_moves;
-extern short max_level;
-extern short party_room;
-extern short r_rings;
-extern short regeneration;
-extern short ring_exp;
-extern short stealthy;
diff --git a/games/rogue/room.c b/games/rogue/room.c
deleted file mode 100644
index dcb65e82858..00000000000
--- a/games/rogue/room.c
+++ /dev/null
@@ -1,650 +0,0 @@
-/* $OpenBSD: room.c,v 1.10 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: room.c,v 1.3 1995/04/22 10:28:17 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * room.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-room rooms[MAXROOMS];
-boolean rooms_visited[MAXROOMS];
-
-#define NOPTS 7
-
-const struct option {
- const char *prompt;
- boolean is_bool;
- char **strval;
- boolean *bval;
-} options[NOPTS] = {
- {
- "Show position only at end of run (\"jump\"): ",
- 1, (char **) NULL, &jump
- },
- {
- "Follow turnings in passageways (\"passgo\"): ",
- 1, (char **) NULL, &passgo
- },
- {
- "Don't print skull when killed (\"noskull\" or \"notombstone\"): ",
- 1, (char **) NULL, &no_skull
- },
- {
- "Ask player before saying 'Okay, bye-bye!' (\"askquit\"): ",
- 1, (char **) NULL, &ask_quit
- },
- {
- "Name (\"name\"): ",
- 0, &nick_name, (boolean *) NULL
- },
- {
- "Fruit (\"fruit\"): ",
- 0, &fruit, (boolean *) NULL
- },
- {
- "Save file (\"file\"): ",
- 0, &save_file, (boolean *) NULL
- }
-};
-
-void
-light_up_room(int rn)
-{
- short i, j;
-
- if (!blind) {
- for (i = rooms[rn].top_row;
- i <= rooms[rn].bottom_row; i++) {
- for (j = rooms[rn].left_col;
- j <= rooms[rn].right_col; j++) {
- if (dungeon[i][j] & MONSTER) {
- object *monster;
-
- if ((monster = object_at(&level_monsters, i, j))) {
- dungeon[monster->row][monster->col] &= (~MONSTER);
- monster->trail_char =
- get_dungeon_char(monster->row, monster->col);
- dungeon[monster->row][monster->col] |= MONSTER;
- }
- }
- mvaddch(i, j, get_dungeon_char(i, j));
- }
- }
- mvaddch(rogue.row, rogue.col, rogue.fchar);
- }
-}
-
-void
-light_passage(short row, short col)
-{
- short i, j, i_end, j_end;
-
- if (blind) {
- return;
- }
- i_end = (row < (DROWS-2)) ? 1 : 0;
- j_end = (col < (DCOLS-1)) ? 1 : 0;
-
- for (i = ((row > MIN_ROW) ? -1 : 0); i <= i_end; i++) {
- for (j = ((col > 0) ? -1 : 0); j <= j_end; j++) {
- if (can_move(row, col, row+i, col+j)) {
- mvaddch(row+i, col+j, get_dungeon_char(row+i, col+j));
- }
- }
- }
-}
-
-void
-darken_room(short rn)
-{
- short i, j;
-
- for (i = rooms[rn].top_row + 1; i < rooms[rn].bottom_row; i++) {
- for (j = rooms[rn].left_col + 1; j < rooms[rn].right_col; j++) {
- if (blind) {
- mvaddch(i, j, ' ');
- } else {
- if (!(dungeon[i][j] & (OBJECT | STAIRS)) &&
- !(detect_monster && (dungeon[i][j] & MONSTER))) {
- if (!imitating(i, j)) {
- mvaddch(i, j, ' ');
- }
- if ((dungeon[i][j] & TRAP) && (!(dungeon[i][j] & HIDDEN))) {
- mvaddch(i, j, '^');
- }
- }
- }
- }
- }
-}
-
-char
-get_dungeon_char(short row, short col)
-{
- unsigned short mask = dungeon[row][col];
-
- if (mask & MONSTER) {
- return(gmc_row_col(row, col));
- }
- if (mask & OBJECT) {
- object *obj;
-
- obj = object_at(&level_objects, row, col);
- return(get_mask_char(obj->what_is));
- }
- if (mask & (TUNNEL | STAIRS | HORWALL | VERTWALL | FLOOR | DOOR)) {
- if ((mask & (TUNNEL| STAIRS)) && (!(mask & HIDDEN))) {
- return(((mask & STAIRS) ? '%' : '#'));
- }
- if (mask & HORWALL) {
- return('-');
- }
- if (mask & VERTWALL) {
- return('|');
- }
- if (mask & FLOOR) {
- if (mask & TRAP) {
- if (!(dungeon[row][col] & HIDDEN)) {
- return('^');
- }
- }
- return('.');
- }
- if (mask & DOOR) {
- if (mask & HIDDEN) {
- if (((col > 0) && (dungeon[row][col-1] & HORWALL)) ||
- ((col < (DCOLS-1)) && (dungeon[row][col+1] & HORWALL))) {
- return('-');
- } else {
- return('|');
- }
- } else {
- return('+');
- }
- }
- }
- return(' ');
-}
-
-char
-get_mask_char(unsigned short mask)
-{
- switch(mask) {
- case SCROL:
- return('?');
- case POTION:
- return('!');
- case GOLD:
- return('*');
- case FOOD:
- return(':');
- case WAND:
- return('/');
- case ARMOR:
- return(']');
- case WEAPON:
- return(')');
- case RING:
- return('=');
- case AMULET:
- return(',');
- default:
- return('~'); /* unknown, something is wrong */
- }
-}
-
-void
-gr_row_col(short *row, short *col, unsigned short mask)
-{
- short rn;
- short r, c;
-
- do {
- r = get_rand(MIN_ROW, DROWS-2);
- c = get_rand(0, DCOLS-1);
- rn = get_room_number(r, c);
- } while ((rn == NO_ROOM) ||
- (!(dungeon[r][c] & mask)) ||
- (dungeon[r][c] & (~mask)) ||
- (!(rooms[rn].is_room & (R_ROOM | R_MAZE))) ||
- ((r == rogue.row) && (c == rogue.col)));
-
- *row = r;
- *col = c;
-}
-
-short
-gr_room(void)
-{
- short i;
-
- do {
- i = get_rand(0, MAXROOMS-1);
- } while (!(rooms[i].is_room & (R_ROOM | R_MAZE)));
-
- return(i);
-}
-
-short
-party_objects(int rn)
-{
- short i, j, nf = 0;
- object *obj;
- short n, N, row, col;
- boolean found;
-
- N = ((rooms[rn].bottom_row - rooms[rn].top_row) - 1) *
- ((rooms[rn].right_col - rooms[rn].left_col) - 1);
- n = get_rand(5, 10);
- if (n > N) {
- n = N - 2;
- }
- for (i = 0; i < n; i++) {
- for (j = found = 0; ((!found) && (j < 250)); j++) {
- row = get_rand(rooms[rn].top_row+1,
- rooms[rn].bottom_row-1);
- col = get_rand(rooms[rn].left_col+1,
- rooms[rn].right_col-1);
- if ((dungeon[row][col] == FLOOR) || (dungeon[row][col] == TUNNEL)) {
- found = 1;
- }
- }
- if (found) {
- obj = gr_object();
- place_at(obj, row, col);
- nf++;
- }
- }
- return(nf);
-}
-
-short
-get_room_number(short row, short col)
-{
- short i;
-
- for (i = 0; i < MAXROOMS; i++) {
- if ((row >= rooms[i].top_row) && (row <= rooms[i].bottom_row) &&
- (col >= rooms[i].left_col) && (col <= rooms[i].right_col)) {
- return(i);
- }
- }
- return(NO_ROOM);
-}
-
-boolean
-is_all_connected(void)
-{
- short i, starting_room;
-
- starting_room = 0;
- for (i = 0; i < MAXROOMS; i++) {
- rooms_visited[i] = 0;
- if (rooms[i].is_room & (R_ROOM | R_MAZE)) {
- starting_room = i;
- }
- }
-
- visit_rooms(starting_room);
-
- for (i = 0; i < MAXROOMS; i++) {
- if ((rooms[i].is_room & (R_ROOM | R_MAZE)) && (!rooms_visited[i])) {
- return(0);
- }
- }
- return(1);
-}
-
-void
-visit_rooms(int rn)
-{
- short i;
- short oth_rn;
-
- rooms_visited[rn] = 1;
-
- for (i = 0; i < 4; i++) {
- oth_rn = rooms[rn].doors[i].oth_room;
- if ((oth_rn >= 0) && (!rooms_visited[oth_rn])) {
- visit_rooms(oth_rn);
- }
- }
-}
-
-void
-draw_magic_map(void)
-{
- short i, j, ch, och;
- unsigned short mask = (HORWALL | VERTWALL | DOOR | TUNNEL | TRAP | STAIRS |
- MONSTER);
- unsigned short s;
-
- for (i = 0; i < DROWS; i++) {
- for (j = 0; j < DCOLS; j++) {
- s = dungeon[i][j];
- if (s & mask) {
- if (((ch = mvinch(i, j)) == ' ') ||
- ((ch >= 'A') && (ch <= 'Z')) || (s & (TRAP | HIDDEN))) {
- och = ch;
- dungeon[i][j] &= (~HIDDEN);
- if (s & HORWALL) {
- ch = '-';
- } else if (s & VERTWALL) {
- ch = '|';
- } else if (s & DOOR) {
- ch = '+';
- } else if (s & TRAP) {
- ch = '^';
- } else if (s & STAIRS) {
- ch = '%';
- } else if (s & TUNNEL) {
- ch = '#';
- } else {
- continue;
- }
- if ((!(s & MONSTER)) || (och == ' ')) {
- addch(ch);
- }
- if (s & MONSTER) {
- object *monster;
-
- if ((monster = object_at(&level_monsters, i, j)))
- {
- monster->trail_char = ch;
- }
- }
- }
- }
- }
- }
-}
-
-void
-dr_course(object *monster, boolean entering, short row, short col)
-{
- short i, j, k, rn;
- short r, rr;
-
- monster->row = row;
- monster->col = col;
-
- if (mon_sees(monster, rogue.row, rogue.col)) {
- monster->trow = NO_ROOM;
- return;
- }
- rn = get_room_number(row, col);
-
- if (entering) { /* entering room */
- /* look for door to some other room */
- r = get_rand(0, MAXROOMS-1);
- for (i = 0; i < MAXROOMS; i++) {
- rr = (r + i) % MAXROOMS;
- if ((!(rooms[rr].is_room & (R_ROOM | R_MAZE))) || (rr == rn)) {
- continue;
- }
- for (k = 0; k < 4; k++) {
- if (rooms[rr].doors[k].oth_room == rn) {
- monster->trow = rooms[rr].doors[k].oth_row;
- monster->tcol = rooms[rr].doors[k].oth_col;
- if ((monster->trow == row) &&
- (monster->tcol == col)) {
- continue;
- }
- return;
- }
- }
- }
- /* look for door to dead end */
- for (i = rooms[rn].top_row; i <= rooms[rn].bottom_row; i++) {
- for (j = rooms[rn].left_col; j <= rooms[rn].right_col; j++) {
- if ((i != monster->row) && (j != monster->col) &&
- (dungeon[i][j] & DOOR)) {
- monster->trow = i;
- monster->tcol = j;
- return;
- }
- }
- }
- /* return monster to room that he came from */
- for (i = 0; i < MAXROOMS; i++) {
- for (j = 0; j < 4; j++) {
- if (rooms[i].doors[j].oth_room == rn) {
- for (k = 0; k < 4; k++) {
- if (rooms[rn].doors[k].oth_room == i) {
- monster->trow = rooms[rn].doors[k].oth_row;
- monster->tcol = rooms[rn].doors[k].oth_col;
- return;
- }
- }
- }
- }
- }
- /* no place to send monster */
- monster->trow = NO_ROOM;
- } else { /* exiting room */
- if (!get_oth_room(rn, &row, &col)) {
- monster->trow = NO_ROOM;
- } else {
- monster->trow = row;
- monster->tcol = col;
- }
- }
-}
-
-boolean
-get_oth_room(short rn, short *row, short *col)
-{
- short d = -1;
-
- if (*row == rooms[rn].top_row) {
- d = UPWARD/2;
- } else if (*row == rooms[rn].bottom_row) {
- d = DOWN/2;
- } else if (*col == rooms[rn].left_col) {
- d = LEFT/2;
- } else if (*col == rooms[rn].right_col) {
- d = RIGHT/2;
- }
- if ((d != -1) && (rooms[rn].doors[d].oth_room >= 0)) {
- *row = rooms[rn].doors[d].oth_row;
- *col = rooms[rn].doors[d].oth_col;
- return(1);
- }
- return(0);
-}
-
-void
-edit_opts(void)
-{
- char save[NOPTS+1][DCOLS];
- short i, j;
- short ch;
- boolean done = 0;
- char buf[MAX_OPT_LEN + 2];
-
- for (i = 0; i < NOPTS+1; i++) {
- for (j = 0; j < DCOLS; j++) {
- save[i][j] = mvinch(i, j);
- }
- if (i < NOPTS) {
- opt_show(i);
- }
- }
- opt_go(0);
- i = 0;
-
- while (!done) {
- refresh();
- ch = rgetchar();
-CH:
- switch(ch) {
- case '\033':
- done = 1;
- break;
- case '\012':
- case '\015':
- if (i == (NOPTS - 1)) {
- mvaddstr(NOPTS, 0, press_space);
- refresh();
- wait_for_ack();
- done = 1;
- } else {
- i++;
- opt_go(i);
- }
- break;
- case '-':
- if (i > 0) {
- opt_go(--i);
- } else {
- beep();
- }
- break;
- case 't':
- case 'T':
- case 'f':
- case 'F':
- if (options[i].is_bool) {
- *(options[i].bval) = (((ch == 't') || (ch == 'T')) ? 1 : 0);
- opt_show(i);
- opt_go(++i);
- break;
- }
- default:
- if (options[i].is_bool) {
- beep();
- break;
- }
- j = 0;
- if ((ch == '\b') || ((ch >= ' ') && (ch <= '~'))) {
- opt_erase(i);
- do {
- if ((ch >= ' ') && (ch <= '~') && (j < MAX_OPT_LEN)) {
- buf[j++] = ch;
- buf[j] = '\0';
- addch(ch);
- } else if ((ch == '\b' || ch == erasechar()) &&
- (j > 0)) {
- buf[--j] = '\0';
- move(i, j + strlen(options[i].prompt));
- addch(' ');
- move(i, j + strlen(options[i].prompt));
- }
- refresh();
- ch = rgetchar();
- } while ((ch != '\012') && (ch != '\015') && (ch != '\033'));
- if (j != 0) {
- /* We rely on the option string being
- * allocated to hold MAX_OPT_LEN+2
- * bytes. This is arranged in init.c.
- */
- (void) strlcpy(*(options[i].strval),
- buf, MAX_OPT_LEN+2);
- }
- opt_show(i);
- goto CH;
- } else {
- beep();
- }
- break;
- }
- }
-
- for (i = 0; i < NOPTS+1; i++) {
- move(i, 0);
- for (j = 0; j < DCOLS; j++) {
- addch(save[i][j]);
- }
- }
-}
-
-void
-opt_show(int i)
-{
- const char *s;
- const struct option *opt = &options[i];
-
- opt_erase(i);
-
- if (opt->is_bool) {
- s = *(opt->bval) ? "True" : "False";
- } else {
- s = *(opt->strval);
- }
- addstr(s);
-}
-
-void
-opt_erase(int i)
-{
- const struct option *opt = &options[i];
-
- mvaddstr(i, 0, opt->prompt);
- clrtoeol();
-}
-
-void
-opt_go(int i)
-{
- move(i, strlen(options[i].prompt));
-}
-
-void
-do_shell(void)
-{
- const char *sh;
-
- md_ignore_signals();
- if (!(sh = md_getenv("SHELL"))) {
- sh = "/bin/sh";
- }
- move(LINES-1, 0);
- refresh();
- stop_window();
- printf("\nCreating new shell...\n");
- md_shell(sh);
- start_window();
- wrefresh(curscr);
- md_heed_signals();
-}
diff --git a/games/rogue/save.c b/games/rogue/save.c
deleted file mode 100644
index f62e43a9153..00000000000
--- a/games/rogue/save.c
+++ /dev/null
@@ -1,416 +0,0 @@
-/* $OpenBSD: save.c,v 1.13 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: save.c,v 1.3 1995/04/22 10:28:21 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * save.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <unistd.h>
-#include "rogue.h"
-
-char *save_file = (char *) NULL;
-
-static short write_failed = 0;
-
-static void write_pack(object *, int);
-static void read_pack(object *, int, boolean);
-static void rw_dungeon(int, boolean);
-static void rw_id(struct id *, int, int, boolean);
-static void write_string(char *, int);
-static void read_string(char *, size_t, int);
-static void rw_rooms(int, boolean);
-static void r_read(int, char *, size_t);
-static void r_write(int, char *, size_t);
-static boolean has_been_touched(struct rogue_time *, struct rogue_time *);
-
-
-void
-save_game(void)
-{
- char fname[MAXPATHLEN];
-
- if (!get_input_line("file name?", save_file, fname, sizeof(fname),
- "game not saved", 0, 1)) {
- return;
- }
- check_message();
- messagef(0, "%s", fname);
- save_into_file(fname);
-}
-
-void
-save_into_file(const char *sfile)
-{
- int fp;
- int file_id;
- char name_buffer[MAXPATHLEN];
- char *hptr;
- struct rogue_time rt_buf;
-
- if (sfile[0] == '~') {
- if ((hptr = md_getenv("HOME"))) {
- if (strlen(hptr) + strlen(sfile+1) < sizeof(name_buffer)) {
- (void) strlcpy(name_buffer, hptr,
- sizeof name_buffer);
- (void) strlcat(name_buffer, sfile+1,
- sizeof name_buffer);
- sfile = name_buffer;
- } else {
- messagef(0, "homedir is too long");
- return;
- }
- }
- }
- if ( ((fp = open(sfile, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) ||
- ((file_id = md_get_file_id(sfile)) == -1)) {
- messagef(0, "problem accessing the save file");
- if (fp != -1)
- close(fp);
- return;
- }
- md_ignore_signals();
- write_failed = 0;
- (void) xxx(1);
- r_write(fp, (char *) &detect_monster, sizeof(detect_monster));
- r_write(fp, (char *) &cur_level, sizeof(cur_level));
- r_write(fp, (char *) &max_level, sizeof(max_level));
- write_string(hunger_str, fp);
- write_string(login_name, fp);
- r_write(fp, (char *) &party_room, sizeof(party_room));
- write_pack(&level_monsters, fp);
- write_pack(&level_objects, fp);
- r_write(fp, (char *) &file_id, sizeof(file_id));
- rw_dungeon(fp, 1);
- r_write(fp, (char *) &foods, sizeof(foods));
- r_write(fp, (char *) &rogue, sizeof(fighter));
- write_pack(&rogue.pack, fp);
- rw_id(id_potions, fp, POTIONS, 1);
- rw_id(id_scrolls, fp, SCROLS, 1);
- rw_id(id_wands, fp, WANDS, 1);
- rw_id(id_rings, fp, RINGS, 1);
- r_write(fp, (char *) traps, (MAX_TRAPS * sizeof(trap)));
- r_write(fp, (char *) is_wood, (WANDS * sizeof(boolean)));
- r_write(fp, (char *) &cur_room, sizeof(cur_room));
- rw_rooms(fp, 1);
- r_write(fp, (char *) &being_held, sizeof(being_held));
- r_write(fp, (char *) &bear_trap, sizeof(bear_trap));
- r_write(fp, (char *) &halluc, sizeof(halluc));
- r_write(fp, (char *) &blind, sizeof(blind));
- r_write(fp, (char *) &confused, sizeof(confused));
- r_write(fp, (char *) &levitate, sizeof(levitate));
- r_write(fp, (char *) &haste_self, sizeof(haste_self));
- r_write(fp, (char *) &see_invisible, sizeof(see_invisible));
- r_write(fp, (char *) &detect_monster, sizeof(detect_monster));
- r_write(fp, (char *) &wizard, sizeof(wizard));
- r_write(fp, (char *) &score_only, sizeof(score_only));
- r_write(fp, (char *) &m_moves, sizeof(m_moves));
- md_gct(&rt_buf);
- rt_buf.second += 10; /* allow for some processing time */
- r_write(fp, (char *) &rt_buf, sizeof(rt_buf));
- close(fp);
-
- if (write_failed) {
- (void) md_df(sfile); /* delete file */
- } else {
- clean_up("");
- }
-}
-
-void
-restore(char *fname)
-{
- int fp;
- struct rogue_time saved_time, mod_time;
- char buf[4];
- char tbuf[LOGIN_NAME_LEN];
- int new_file_id, saved_file_id;
-
- if (((new_file_id = md_get_file_id(fname)) == -1) ||
- ((fp = open(fname, O_RDONLY, 0)) == -1)) {
- clean_up("cannot open file");
- return; /* NOT REACHED */
- }
- if (md_link_count(fname) > 1) {
- clean_up("file has link");
- }
- (void) xxx(1);
- r_read(fp, (char *) &detect_monster, sizeof(detect_monster));
- r_read(fp, (char *) &cur_level, sizeof(cur_level));
- r_read(fp, (char *) &max_level, sizeof(max_level));
- read_string(hunger_str, HUNGER_STR_LEN, fp);
-
- strlcpy(tbuf, login_name, sizeof(tbuf));
- read_string(login_name, LOGIN_NAME_LEN, fp);
- if (strcmp(tbuf, login_name)) {
- clean_up("you're not the original player");
- }
-
- r_read(fp, (char *) &party_room, sizeof(party_room));
- read_pack(&level_monsters, fp, 0);
- read_pack(&level_objects, fp, 0);
- r_read(fp, (char *) &saved_file_id, sizeof(saved_file_id));
- if (new_file_id != saved_file_id) {
- clean_up("sorry, saved game is not in the same file");
- }
- rw_dungeon(fp, 0);
- r_read(fp, (char *) &foods, sizeof(foods));
- r_read(fp, (char *) &rogue, sizeof(fighter));
- read_pack(&rogue.pack, fp, 1);
- rw_id(id_potions, fp, POTIONS, 0);
- rw_id(id_scrolls, fp, SCROLS, 0);
- rw_id(id_wands, fp, WANDS, 0);
- rw_id(id_rings, fp, RINGS, 0);
- r_read(fp, (char *) traps, (MAX_TRAPS * sizeof(trap)));
- r_read(fp, (char *) is_wood, (WANDS * sizeof(boolean)));
- r_read(fp, (char *) &cur_room, sizeof(cur_room));
- rw_rooms(fp, 0);
- r_read(fp, (char *) &being_held, sizeof(being_held));
- r_read(fp, (char *) &bear_trap, sizeof(bear_trap));
- r_read(fp, (char *) &halluc, sizeof(halluc));
- r_read(fp, (char *) &blind, sizeof(blind));
- r_read(fp, (char *) &confused, sizeof(confused));
- r_read(fp, (char *) &levitate, sizeof(levitate));
- r_read(fp, (char *) &haste_self, sizeof(haste_self));
- r_read(fp, (char *) &see_invisible, sizeof(see_invisible));
- r_read(fp, (char *) &detect_monster, sizeof(detect_monster));
- r_read(fp, (char *) &wizard, sizeof(wizard));
- r_read(fp, (char *) &score_only, sizeof(score_only));
- r_read(fp, (char *) &m_moves, sizeof(m_moves));
- r_read(fp, (char *) &saved_time, sizeof(saved_time));
-
- if (read(fp, buf, 1) > 0) {
- clear();
- clean_up("extra characters in file");
- }
-
- md_gfmt(fname, &mod_time); /* get file modification time */
-
- if (has_been_touched(&saved_time, &mod_time)) {
- clear();
- clean_up("sorry, file has been touched");
- }
- if ((!wizard) && !md_df(fname)) {
- clean_up("cannot delete file");
- }
- msg_cleared = 0;
- ring_stats(0);
- close(fp);
-}
-
-static void
-write_pack(object *pack, int fp)
-{
- object t;
-
- while ((pack = pack->next_object)) {
- r_write(fp, (char *) pack, sizeof(object));
- }
- t.ichar = t.what_is = 0;
- r_write(fp, (char *) &t, sizeof(object));
-}
-
-static void
-read_pack(object *pack, int fp, boolean is_rogue)
-{
- object read_obj, *new_obj;
-
- for (;;) {
- r_read(fp, (char *) &read_obj, sizeof(object));
- if (read_obj.ichar == 0) {
- pack->next_object = (object *) 0;
- break;
- }
- new_obj = alloc_object();
- *new_obj = read_obj;
- if (is_rogue) {
- if (new_obj->in_use_flags & BEING_WORN) {
- do_wear(new_obj);
- } else if (new_obj->in_use_flags & BEING_WIELDED) {
- do_wield(new_obj);
- } else if (new_obj->in_use_flags & (ON_EITHER_HAND)) {
- do_put_on(new_obj,
- ((new_obj->in_use_flags & ON_LEFT_HAND) ? 1 : 0));
- }
- }
- pack->next_object = new_obj;
- pack = new_obj;
- }
-}
-
-static void
-rw_dungeon(int fp, boolean rw)
-{
- short i, j;
- char buf[DCOLS];
-
- for (i = 0; i < DROWS; i++) {
- if (rw) {
- r_write(fp, (char *) dungeon[i], (DCOLS * sizeof(dungeon[0][0])));
- for (j = 0; j < DCOLS; j++) {
- buf[j] = mvinch(i, j);
- }
- r_write(fp, buf, DCOLS);
- } else {
- r_read(fp, (char *) dungeon[i], (DCOLS * sizeof(dungeon[0][0])));
- r_read(fp, buf, DCOLS);
- for (j = 0; j < DCOLS; j++) {
- mvaddch(i, j, buf[j]);
- }
- }
- }
-}
-
-static void
-rw_id(struct id id_table[], int fp, int n, boolean wr)
-{
- short i;
-
- for (i = 0; i < n; i++) {
- if (wr) {
- r_write(fp, (char *) &(id_table[i].value), sizeof(short));
- r_write(fp, (char *) &(id_table[i].id_status),
- sizeof(unsigned short));
- write_string(id_table[i].title, fp);
- } else {
- r_read(fp, (char *) &(id_table[i].value), sizeof(short));
- r_read(fp, (char *) &(id_table[i].id_status),
- sizeof(unsigned short));
- read_string(id_table[i].title, sizeof(id_table[i].title),
- fp);
- }
- }
-}
-
-static void
-write_string(char *s, int fp)
-{
- short n;
-
- n = strlen(s) + 1;
- xxxx(s, n);
- r_write(fp, (char *) &n, sizeof(short));
- r_write(fp, s, n);
-}
-
-static void
-read_string(char *s, size_t maxlen, int fp)
-{
- short n;
-
- r_read(fp, (char *) &n, sizeof(short));
- if (n <= 0 || (size_t)(unsigned short)n > maxlen)
- clean_up("saved game is corrupt");
- r_read(fp, s, n);
- xxxx(s, n);
- /* ensure NUL termination */
- s[n - 1] = '\0';
-}
-
-static void
-rw_rooms(int fp, boolean rw)
-{
- short i;
-
- for (i = 0; i < MAXROOMS; i++) {
- rw ? r_write(fp, (char *) (rooms + i), sizeof(room)) :
- r_read(fp, (char *) (rooms + i), sizeof(room));
- }
-}
-
-static void
-r_read(int fp, char *buf, size_t n)
-{
- if (read(fp, buf, n) != n) {
- clean_up("read() failed, don't know why");
- }
-}
-
-static void
-r_write(int fp, char *buf, size_t n)
-{
- if (!write_failed) {
- if (write(fp, buf, n) != n) {
- messagef(0, "write() failed, don't know why");
- beep();
- write_failed = 1;
- }
- }
-}
-
-static boolean
-has_been_touched(struct rogue_time *saved_time, struct rogue_time *mod_time)
-{
- if (saved_time->year < mod_time->year) {
- return(1);
- } else if (saved_time->year > mod_time->year) {
- return(0);
- }
- if (saved_time->month < mod_time->month) {
- return(1);
- } else if (saved_time->month > mod_time->month) {
- return(0);
- }
- if (saved_time->day < mod_time->day) {
- return(1);
- } else if (saved_time->day > mod_time->day) {
- return(0);
- }
- if (saved_time->hour < mod_time->hour) {
- return(1);
- } else if (saved_time->hour > mod_time->hour) {
- return(0);
- }
- if (saved_time->minute < mod_time->minute) {
- return(1);
- } else if (saved_time->minute > mod_time->minute) {
- return(0);
- }
- if (saved_time->second < mod_time->second) {
- return(1);
- }
- return(0);
-}
diff --git a/games/rogue/score.c b/games/rogue/score.c
deleted file mode 100644
index a3400714ff3..00000000000
--- a/games/rogue/score.c
+++ /dev/null
@@ -1,642 +0,0 @@
-/* $OpenBSD: score.c,v 1.12 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: score.c,v 1.5 1995/04/22 10:28:26 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * score.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "rogue.h"
-#include "pathnames.h"
-
-void
-killed_by(const object *monster, short other)
-{
- const char *mechanism = "killed by something unknown (?)";
- char mechanism_buf[128];
- const char *article;
- char message_buf[128];
-
- md_ignore_signals();
-
- if (other != QUIT) {
- rogue.gold = ((rogue.gold * 9) / 10);
- }
-
- if (other) {
- switch(other) {
- case HYPOTHERMIA:
- mechanism = "died of hypothermia";
- break;
- case STARVATION:
- mechanism = "died of starvation";
- break;
- case POISON_DART:
- mechanism = "killed by a dart";
- break;
- case QUIT:
- mechanism = "quit";
- break;
- case KFIRE:
- mechanism = "killed by fire";
- break;
- }
- } else {
- if (is_vowel(m_names[monster->m_char - 'A'][0])) {
- article = "an";
- } else {
- article = "a";
- }
- snprintf(mechanism_buf, sizeof(mechanism_buf),
- "Killed by %s %s", article, m_names[monster->m_char - 'A']);
- mechanism = mechanism_buf;
- }
- snprintf(message_buf, sizeof(message_buf),
- "%s with %ld gold", mechanism, rogue.gold);
- if ((!other) && (!no_skull)) {
- clear();
- mvaddstr(4, 32, "__---------__");
- mvaddstr(5, 30, "_~ ~_");
- mvaddstr(6, 29, "/ \\");
- mvaddstr(7, 28, "~ ~");
- mvaddstr(8, 27, "/ \\");
- mvaddstr(9, 27, "| XXXX XXXX |");
- mvaddstr(10, 27, "| XXXX XXXX |");
- mvaddstr(11, 27, "| XXX XXX |");
- mvaddstr(12, 28, "\\ @ /");
- mvaddstr(13, 29, "--\\ @@@ /--");
- mvaddstr(14, 30, "| | @@@ | |");
- mvaddstr(15, 30, "| | | |");
- mvaddstr(16, 30, "| vvVvvvvvvvVvv |");
- mvaddstr(17, 30, "| ^^^^^^^^^^^ |");
- mvaddstr(18, 31, "\\_ _/");
- mvaddstr(19, 33, "~---------~");
- center(21, nick_name);
- center(22, message_buf);
- } else {
- messagef(0, "%s", message_buf);
- }
- messagef(0, "");
- put_scores(monster, other);
-}
-
-void
-win(void)
-{
- unwield(rogue.weapon); /* disarm and relax */
- unwear(rogue.armor);
- un_put_on(rogue.left_ring);
- un_put_on(rogue.right_ring);
-
- clear();
- mvaddstr(10, 11, "@ @ @@@ @ @ @ @ @ @@@ @ @ @");
- mvaddstr(11, 11, " @ @ @ @ @ @ @ @ @ @ @ @@ @ @");
- mvaddstr(12, 11, " @ @ @ @ @ @ @ @ @ @ @ @ @ @");
- mvaddstr(13, 11, " @ @ @ @ @ @ @ @ @ @ @ @@");
- mvaddstr(14, 11, " @ @@@ @@@ @@ @@ @@@ @ @ @");
- mvaddstr(17, 11, "Congratulations, you have been admitted to the");
- mvaddstr(18, 11, "Fighters' Guild. You return home, sell all your");
- mvaddstr(19, 11, "treasures at great profit and retire into comfort.");
- messagef(0, "");
- messagef(0, "");
- id_all();
- sell_pack();
- put_scores((object *) 0, WIN);
-}
-
-void
-quit(boolean from_intrpt)
-{
- char buf[DCOLS];
- short i, orow, ocol;
- boolean mc;
- short ch;
-
- md_ignore_signals();
-
- if (from_intrpt) {
- orow = rogue.row;
- ocol = rogue.col;
-
- mc = msg_cleared;
-
- for (i = 0; i < DCOLS; i++) {
- buf[i] = mvinch(0, i);
- }
- }
- check_message();
- messagef(1, "really quit?");
- if ((ch = rgetchar()) != 'y' && ch != 'Y') {
- md_heed_signals();
- check_message();
- if (from_intrpt) {
- for (i = 0; i < DCOLS; i++) {
- mvaddch(0, i, buf[i]);
- }
- msg_cleared = mc;
- move(orow, ocol);
- refresh();
- }
- return;
- }
- if (from_intrpt) {
- clean_up(byebye_string);
- }
- check_message();
- killed_by((object *) 0, QUIT);
-}
-
-/*
- * The score file on disk is up to ten entries of the form
- * score block [80 bytes]
- * nickname block [30 bytes]
- *
- * The score block is to be parsed as follows:
- * bytes 0-1 Rank (" 1" to "10")
- * bytes 2-4 space padding
- * bytes 5-15 Score/gold
- * byte 15 up to a ':' Login name
- * past the ':' Death mechanism
- *
- * The nickname block is an alternate name to be printed in place of the
- * login name. Both blocks are supposed to contain a null-terminator.
- *
- * XXX This score file format is historic, but the sizes can lead to
- * truncation in cause of death and nickname. Currently LOGIN_NAME_LEN
- * is short enough actual scorefile corruption is not possible.
- */
-
-struct score_entry {
- long gold;
- char username[LOGIN_NAME_LEN];
- char death[80];
- char nickname[MAX_OPT_LEN + 1];
-};
-
-static void pad_spaces(char *, size_t);
-static void unpad_spaces(char *);
-static int read_score_entry(struct score_entry *, FILE *);
-static void write_score_entry(const struct score_entry *, int, FILE *);
-static void make_score(struct score_entry *, const object *, int);
-
-
-static void
-pad_spaces(char *str, size_t len)
-{
- size_t x;
-
- for (x = strlen(str); x < len - 1; x++) {
- str[x] = ' ';
- }
- str[len-1] = '\0';
-}
-
-static void
-unpad_spaces(char *str)
-{
- size_t x;
-
- for (x = strlen(str); x > 0 && str[x - 1] == ' '; x--)
- ;
- str[x] = '\0';
-}
-
-static int
-read_score_entry(struct score_entry *se, FILE *fp)
-{
- char score_block[80];
- char nickname_block[30];
- size_t n, x;
-
- n = fread(score_block, 1, sizeof(score_block), fp);
- if (n == 0) {
- /* EOF */
- return(0);
- }
- if (n != sizeof(score_block)) {
- sf_error();
- }
-
- n = fread(nickname_block, 1, sizeof(nickname_block), fp);
- if (n != sizeof(nickname_block)) {
- sf_error();
- }
-
- xxxx(score_block, sizeof(score_block));
- xxxx(nickname_block, sizeof(nickname_block));
-
- /* Ensure null termination */
- score_block[sizeof(score_block) - 1] = '\0';
- nickname_block[sizeof(nickname_block) - 1] = '\0';
-
- /* If there are other nulls in the score block, file is corrupt */
- if (strlen(score_block) != sizeof(score_block) - 1) {
- sf_error();
- }
- /* but this is NOT true of the nickname block */
-
- /* quash trailing spaces */
- unpad_spaces(score_block);
- unpad_spaces(nickname_block);
-
- se->gold = strtol(score_block + 5, NULL, 10);
-
- for (x = 15; score_block[x] != '\0' && score_block[x] != ':'; x++);
- if (score_block[x] == '\0') {
- sf_error();
- }
- score_block[x++] = '\0';
- strlcpy(se->username, score_block + 15, sizeof(se->username));
-
- strlcpy(se->death, score_block + x, sizeof(se->death));
- strlcpy(se->nickname, nickname_block, sizeof(se->nickname));
-
- return(1);
-}
-
-static void
-write_score_entry(const struct score_entry *se, int rank, FILE *fp)
-{
- char score_block[80];
- char nickname_block[30];
-
- /* avoid writing crap to score file */
- memset(nickname_block, 0, sizeof(nickname_block));
-
- snprintf(score_block, sizeof(score_block),
- "%2d %6ld %s: %s",
- rank + 1, se->gold, se->username, se->death);
- strlcpy(nickname_block, se->nickname, sizeof(nickname_block));
-
- /* pad blocks out with spaces */
- pad_spaces(score_block, sizeof(score_block));
- /*pad_spaces(nickname_block, sizeof(nickname_block)); -- wrong! */
-
- xxxx(score_block, sizeof(score_block));
- xxxx(nickname_block, sizeof(nickname_block));
-
- fwrite(score_block, 1, sizeof(score_block), fp);
- fwrite(nickname_block, 1, sizeof(nickname_block), fp);
-}
-
-void
-put_scores(const object *monster, short other)
-{
- short i, rank = -1, found_player = -1, numscores = 0;
- struct score_entry scores[NUM_SCORE_ENTRIES];
- const char *name;
- FILE *fp;
- boolean dopause = score_only;
- extern gid_t gid, egid;
-
- md_lock(1);
-
- setegid(egid);
- if ((fp = fopen(_PATH_SCOREFILE, "r+")) == NULL &&
- (fp = fopen(_PATH_SCOREFILE, "w+")) == NULL) {
- setegid(gid);
- messagef(0, "cannot read/write/create score file");
- sf_error();
- }
- setegid(gid);
- rewind(fp);
- (void) xxx(1);
-
- for (numscores = 0; numscores < NUM_SCORE_ENTRIES; numscores++) {
- if (read_score_entry(&scores[numscores], fp) == 0)
- break;
- }
-
- /* Search the score list. */
- for (i = 0; i < numscores; i++) {
- if (!strcmp(scores[i].username, login_name)) {
- if (rogue.gold < scores[i].gold) {
- score_only = 1;
- } else {
- /* we did better; mark entry for removal */
- found_player = i;
- }
- break;
- }
- }
-
- /* Remove a superseded entry, if any. */
- if (found_player != -1) {
- numscores--;
- for (i = found_player; i < numscores; i++) {
- scores[i] = scores[i + 1];
- }
- }
-
- /* If we're going to insert ourselves, do it now */
- if (!score_only) {
- /* If we aren't better than anyone, add at end; otherwise, find
- * our slot.
- */
- rank = numscores;
- for (i = 0; i < numscores; i++) {
- if (rogue.gold >= scores[i].gold) {
- rank = i;
- break;
- }
- }
- if (rank < NUM_SCORE_ENTRIES) {
- for (i = numscores; i > rank; i--) {
- scores[i] = scores[i-1];
- }
- numscores++;
- make_score(&scores[rank], monster, other);
- }
-
- /* Now rewrite the score file */
- md_ignore_signals();
- rewind(fp);
- (void) xxx(1);
- for (i = 0; i < numscores; i++) {
- write_score_entry(&scores[i], i, fp);
- }
- }
- md_lock(0);
- fclose(fp);
-
- /* Display scores */
- clear();
- mvaddstr(3, 30, "Top Ten Rogueists");
- mvaddstr(8, 0, "Rank Score Name");
- for (i = 0; i < numscores; i++) {
- if (i == rank) {
- standout();
- }
- if (scores[i].nickname[0]) {
- name = scores[i].nickname;
- } else {
- name = scores[i].username;
- }
- mvprintw(i+10, 0, "%2d %6ld %s: %s",
- i + 1, scores[i].gold, name, scores[i].death);
- if (i == rank) {
- standend();
- }
- }
- refresh();
- messagef(0, "");
- if (dopause) {
- messagef(0, "");
- }
- clean_up("");
-}
-
-static void
-make_score(struct score_entry *se, const object *monster, int other)
-{
- const char *death = "bolts from the blue (?)";
- const char *hasamulet;
- char deathbuf[80];
-
- se->gold = rogue.gold;
- strlcpy(se->username, login_name, sizeof(se->username));
- if (other) {
- switch(other) {
- case HYPOTHERMIA:
- death = "died of hypothermia";
- break;
- case STARVATION:
- death = "died of starvation";
- break;
- case POISON_DART:
- death = "killed by a dart";
- break;
- case QUIT:
- death = "quit";
- break;
- case WIN:
- death = "a total winner";
- break;
- case KFIRE:
- death = "killed by fire";
- break;
- }
- } else {
- const char *mn, *article;
-
- mn = m_names[monster->m_char - 'A'];
- if (is_vowel(mn[0])) {
- article = "an";
- } else {
- article = "a";
- }
- snprintf(deathbuf, sizeof(deathbuf), "killed by %s %s",
- article, mn);
- death = deathbuf;
- }
- if (other != WIN && has_amulet()) {
- hasamulet = " with amulet";
- } else {
- hasamulet = "";
- }
- snprintf(se->death, sizeof(se->death), "%s on level %d%s",
- death, max_level, hasamulet);
- strlcpy(se->nickname, nick_name, sizeof(se->nickname));
-}
-
-boolean
-is_vowel(short ch)
-{
- return( (ch == 'a') ||
- (ch == 'e') ||
- (ch == 'i') ||
- (ch == 'o') ||
- (ch == 'u') );
-}
-
-void
-sell_pack(void)
-{
- object *obj;
- short row = 2, val;
- char buf[DCOLS];
-
- obj = rogue.pack.next_object;
-
- clear();
- mvaddstr(1, 0, "Value Item");
-
- while (obj) {
- if (obj->what_is != FOOD) {
- obj->identified = 1;
- val = get_value(obj);
- rogue.gold += val;
-
- if (row < DROWS) {
- get_desc(obj, buf, sizeof(buf));
- mvprintw(row++, 0, "%5d %s", val, buf);
- }
- }
- obj = obj->next_object;
- }
- refresh();
- if (rogue.gold > MAX_GOLD) {
- rogue.gold = MAX_GOLD;
- }
- messagef(0, "");
-}
-
-int
-get_value(object *obj)
-{
- short wc;
- int val;
-
- val = 0;
- wc = obj->which_kind;
-
- switch(obj->what_is) {
- case WEAPON:
- val = id_weapons[wc].value;
- if ((wc == ARROW) || (wc == DAGGER) || (wc == SHURIKEN) ||
- (wc == DART)) {
- val *= obj->quantity;
- }
- val += (obj->d_enchant * 85);
- val += (obj->hit_enchant * 85);
- break;
- case ARMOR:
- val = id_armors[wc].value;
- val += (obj->d_enchant * 75);
- if (obj->is_protected) {
- val += 200;
- }
- break;
- case WAND:
- val = id_wands[wc].value * (obj->class + 1);
- break;
- case SCROL:
- val = id_scrolls[wc].value * obj->quantity;
- break;
- case POTION:
- val = id_potions[wc].value * obj->quantity;
- break;
- case AMULET:
- val = 5000;
- break;
- case RING:
- val = id_rings[wc].value * (obj->class + 1);
- break;
- }
- if (val <= 0) {
- val = 10;
- }
- return(val);
-}
-
-void
-id_all(void)
-{
- short i;
-
- for (i = 0; i < SCROLS; i++) {
- id_scrolls[i].id_status = IDENTIFIED;
- }
- for (i = 0; i < WEAPONS; i++) {
- id_weapons[i].id_status = IDENTIFIED;
- }
- for (i = 0; i < ARMORS; i++) {
- id_armors[i].id_status = IDENTIFIED;
- }
- for (i = 0; i < WANDS; i++) {
- id_wands[i].id_status = IDENTIFIED;
- }
- for (i = 0; i < POTIONS; i++) {
- id_potions[i].id_status = IDENTIFIED;
- }
-}
-
-void
-xxxx(char *buf, short n)
-{
- short i;
- unsigned char c;
-
- for (i = 0; i < n; i++) {
-
- /* It does not matter if accuracy is lost during this assignment */
- c = (unsigned char) xxx(0);
-
- buf[i] ^= c;
- }
-}
-
-long
-xxx(boolean st)
-{
- static long f, s;
- long r;
-
- if (st) {
- f = 37;
- s = 7;
- return(0L);
- }
- r = ((f * s) + 9337) % 8887;
- f = s;
- s = r;
- return(r);
-}
-
-void
-center(short row, const char *buf)
-{
- short margin;
-
- margin = ((DCOLS - strlen(buf)) / 2);
- mvaddstr(row, margin, buf);
-}
-
-void
-sf_error(void)
-{
- md_lock(0);
- messagef(1, "");
- clean_up("sorry, score file is out of order");
-}
diff --git a/games/rogue/spec_hit.c b/games/rogue/spec_hit.c
deleted file mode 100644
index edb1ef5702e..00000000000
--- a/games/rogue/spec_hit.c
+++ /dev/null
@@ -1,511 +0,0 @@
-/* $OpenBSD: spec_hit.c,v 1.8 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: spec_hit.c,v 1.3 1995/04/22 10:28:29 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * special_hit.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-short less_hp = 0;
-boolean being_held;
-
-void
-special_hit(object *monster)
-{
- if ((monster->m_flags & CONFUSED) && rand_percent(66))
- return;
- if (wizard && rand_percent(50))
- return;
- if (monster->m_flags & RUSTS)
- rust(monster);
- if ((monster->m_flags & HOLDS) && !levitate)
- being_held = 1;
- if (monster->m_flags & FREEZES)
- freeze(monster);
- if (monster->m_flags & STINGS)
- sting(monster);
- if (monster->m_flags & DRAINS_LIFE)
- drain_life();
- if (monster->m_flags & DROPS_LEVEL)
- drop_level();
- if (monster->m_flags & STEALS_GOLD)
- steal_gold(monster);
- else if (monster->m_flags & STEALS_ITEM)
- steal_item(monster);
-}
-
-void
-rust(object *monster)
-{
- if ((!rogue.armor) || (get_armor_class(rogue.armor) <= 1) ||
- (rogue.armor->which_kind == LEATHER)) {
- return;
- }
- if ((rogue.armor->is_protected) || maintain_armor) {
- if (monster && (!(monster->m_flags & RUST_VANISHED))) {
- messagef(0, "the rust vanishes instantly");
- monster->m_flags |= RUST_VANISHED;
- }
- } else {
- rogue.armor->d_enchant--;
- messagef(0, "your armor weakens");
- print_stats(STAT_ARMOR);
- }
-}
-
-void
-freeze(object *monster)
-{
- short freeze_percent = 99;
- short i, n;
-
- if (rand_percent(12)) {
- return;
- }
- freeze_percent -= (rogue.str_current+(rogue.str_current / 2));
- freeze_percent -= ((rogue.exp + ring_exp) * 4);
- freeze_percent -= (get_armor_class(rogue.armor) * 5);
- freeze_percent -= (rogue.hp_max / 3);
-
- if (freeze_percent > 10) {
- monster->m_flags |= FREEZING_ROGUE;
- messagef(1, "you are frozen");
-
- n = get_rand(4, 8);
- for (i = 0; i < n; i++) {
- mv_mons();
- }
- if (rand_percent(freeze_percent)) {
- for (i = 0; i < 50; i++) {
- mv_mons();
- }
- killed_by((object *)0, HYPOTHERMIA);
- }
- messagef(1, "%s", you_can_move_again);
- monster->m_flags &= (~FREEZING_ROGUE);
- }
-}
-
-void
-steal_gold(object *monster)
-{
- int amount;
-
- if ((rogue.gold <= 0) || rand_percent(10)) {
- return;
- }
-
- amount = get_rand((cur_level * 10), (cur_level * 30));
-
- if (amount > rogue.gold) {
- amount = rogue.gold;
- }
- rogue.gold -= amount;
- messagef(0, "your purse feels lighter");
- print_stats(STAT_GOLD);
- disappear(monster);
-}
-
-void
-steal_item(object *monster)
-{
- object *obj;
- short i, n, t = 0;
- char desc[80];
- boolean has_something = 0;
-
- if (rand_percent(15)) {
- return;
- }
- obj = rogue.pack.next_object;
-
- if (!obj) {
- goto DSPR;
- }
- while (obj) {
- if (!(obj->in_use_flags & BEING_USED)) {
- has_something = 1;
- break;
- }
- obj = obj->next_object;
- }
- if (!has_something) {
- goto DSPR;
- }
- n = get_rand(0, MAX_PACK_COUNT);
- obj = rogue.pack.next_object;
-
- for (i = 0; i <= n; i++) {
- obj = obj->next_object;
- while ((!obj) || (obj->in_use_flags & BEING_USED)) {
- if (!obj) {
- obj = rogue.pack.next_object;
- } else {
- obj = obj->next_object;
- }
- }
- }
- if (obj->what_is != WEAPON) {
- t = obj->quantity;
- obj->quantity = 1;
- }
- get_desc(obj, desc, sizeof(desc));
- messagef(0, "she stole %s", desc);
-
- obj->quantity = ((obj->what_is != WEAPON) ? t : 1);
-
- vanish(obj, 0, &rogue.pack);
-DSPR:
- disappear(monster);
-}
-
-void
-disappear(object *monster)
-{
- short row, col;
-
- row = monster->row;
- col = monster->col;
-
- dungeon[row][col] &= ~MONSTER;
- if (rogue_can_see(row, col)) {
- mvaddch(row, col, get_dungeon_char(row, col));
- }
- take_from_pack(monster, &level_monsters);
- free_object(monster);
- mon_disappeared = 1;
-}
-
-void
-cough_up(object *monster)
-{
- object *obj;
- short row, col, i, n;
-
- if (cur_level < max_level) {
- return;
- }
-
- if (monster->m_flags & STEALS_GOLD) {
- obj = alloc_object();
- obj->what_is = GOLD;
- obj->quantity = get_rand((cur_level * 15), (cur_level * 30));
- } else {
- if (!rand_percent((int) monster->drop_percent)) {
- return;
- }
- obj = gr_object();
- }
- row = monster->row;
- col = monster->col;
-
- for (n = 0; n <= 5; n++) {
- for (i = -n; i <= n; i++) {
- if (try_to_cough(row+n, col+i, obj)) {
- return;
- }
- if (try_to_cough(row-n, col+i, obj)) {
- return;
- }
- }
- for (i = -n; i <= n; i++) {
- if (try_to_cough(row+i, col-n, obj)) {
- return;
- }
- if (try_to_cough(row+i, col+n, obj)) {
- return;
- }
- }
- }
- free_object(obj);
-}
-
-boolean
-try_to_cough(short row, short col, object *obj)
-{
- if ((row < MIN_ROW) ||
- (row > (DROWS-2)) || (col < 0) || (col>(DCOLS-1))) {
- return(0);
- }
- if ((!(dungeon[row][col] & (OBJECT | STAIRS | TRAP))) &&
- (dungeon[row][col] & (TUNNEL | FLOOR | DOOR))) {
- place_at(obj, row, col);
- if (((row != rogue.row) || (col != rogue.col)) &&
- (!(dungeon[row][col] & MONSTER))) {
- mvaddch(row, col, get_dungeon_char(row, col));
- }
- return(1);
- }
- return(0);
-}
-
-boolean
-seek_gold(object *monster)
-{
- short i, j, rn, s;
-
- if ((rn = get_room_number(monster->row, monster->col)) < 0) {
- return(0);
- }
- for (i = rooms[rn].top_row+1; i < rooms[rn].bottom_row; i++) {
- for (j = rooms[rn].left_col+1; j < rooms[rn].right_col; j++) {
- if ((gold_at(i, j)) && !(dungeon[i][j] & MONSTER)) {
- monster->m_flags |= CAN_FLIT;
- s = mon_can_go(monster, i, j);
- monster->m_flags &= (~CAN_FLIT);
- if (s) {
- move_mon_to(monster, i, j);
- monster->m_flags |= ASLEEP;
- monster->m_flags &= (~(WAKENS | SEEKS_GOLD));
- return(1);
- }
- monster->m_flags &= (~SEEKS_GOLD);
- monster->m_flags |= CAN_FLIT;
- mv_1_monster(monster, i, j);
- monster->m_flags &= (~CAN_FLIT);
- monster->m_flags |= SEEKS_GOLD;
- return(1);
- }
- }
- }
- return(0);
-}
-
-boolean
-gold_at(short row, short col)
-{
- if (dungeon[row][col] & OBJECT) {
- object *obj;
-
- if ((obj = object_at(&level_objects, row, col)) &&
- (obj->what_is == GOLD)) {
- return(1);
- }
- }
- return(0);
-}
-
-void
-check_gold_seeker(object *monster)
-{
- monster->m_flags &= (~SEEKS_GOLD);
-}
-
-boolean
-check_imitator(object *monster)
-{
- if (monster->m_flags & IMITATES) {
- wake_up(monster);
- if (!blind) {
- mvaddch(monster->row, monster->col,
- get_dungeon_char(monster->row, monster->col));
- check_message();
- messagef(1, "wait, that's a %s!", mon_name(monster));
- }
- return(1);
- }
- return(0);
-}
-
-boolean
-imitating(short row, short col)
-{
- if (dungeon[row][col] & MONSTER) {
- object *monster;
-
- if ((monster = object_at(&level_monsters, row, col))) {
- if (monster->m_flags & IMITATES) {
- return(1);
- }
- }
- }
- return(0);
-}
-
-void
-sting(object *monster)
-{
- short sting_chance = 35;
-
- if ((rogue.str_current <= 3) || sustain_strength) {
- return;
- }
- sting_chance += (6 * (6 - get_armor_class(rogue.armor)));
-
- if ((rogue.exp + ring_exp) > 8) {
- sting_chance -= (6 * ((rogue.exp + ring_exp) - 8));
- }
- if (rand_percent(sting_chance)) {
- messagef(0, "the %s's bite has weakened you",
- mon_name(monster));
- rogue.str_current--;
- print_stats(STAT_STRENGTH);
- }
-}
-
-void
-drop_level(void)
-{
- int hp;
-
- if (rand_percent(80) || (rogue.exp <= 5)) {
- return;
- }
- rogue.exp_points = level_points[rogue.exp-2] - get_rand(9, 29);
- rogue.exp -= 2;
- hp = hp_raise();
- if ((rogue.hp_current -= hp) <= 0) {
- rogue.hp_current = 1;
- }
- if ((rogue.hp_max -= hp) <= 0) {
- rogue.hp_max = 1;
- }
- add_exp(1, 0);
-}
-
-void
-drain_life(void)
-{
- short n;
-
- if (rand_percent(60) || (rogue.hp_max <= 30) || (rogue.hp_current < 10)) {
- return;
- }
- n = get_rand(1, 3); /* 1 Hp, 2 Str, 3 both */
-
- if ((n != 2) || (!sustain_strength)) {
- messagef(0, "you feel weaker");
- }
- if (n != 2) {
- rogue.hp_max--;
- rogue.hp_current--;
- less_hp++;
- }
- if (n != 1) {
- if ((rogue.str_current > 3) && (!sustain_strength)) {
- rogue.str_current--;
- if (coin_toss()) {
- rogue.str_max--;
- }
- }
- }
- print_stats((STAT_STRENGTH | STAT_HP));
-}
-
-boolean
-m_confuse(object *monster)
-{
- if (!rogue_can_see(monster->row, monster->col)) {
- return(0);
- }
- if (rand_percent(45)) {
- monster->m_flags &= (~CONFUSES); /* will not confuse the rogue */
- return(0);
- }
- if (rand_percent(55)) {
- monster->m_flags &= (~CONFUSES);
- messagef(1, "the gaze of the %s has confused you",
- mon_name(monster));
- cnfs();
- return(1);
- }
- return(0);
-}
-
-boolean
-flame_broil(object *monster)
-{
- short row, col, dir;
-
- if ((!mon_sees(monster, rogue.row, rogue.col)) || coin_toss()) {
- return(0);
- }
- row = rogue.row - monster->row;
- col = rogue.col - monster->col;
- if (row < 0) {
- row = -row;
- }
- if (col < 0) {
- col = -col;
- }
- if (((row != 0) && (col != 0) && (row != col)) ||
- ((row > 7) || (col > 7))) {
- return(0);
- }
- dir = get_dir(monster->row, monster->col, row, col);
- bounce(FIRE, dir, monster->row, monster->col, 0);
-
- return(1);
-}
-
-int
-get_dir(short srow, short scol, short drow, short dcol)
-{
- if (srow == drow) {
- if (scol < dcol) {
- return(RIGHT);
- } else {
- return(LEFT);
- }
- }
- if (scol == dcol) {
- if (srow < drow) {
- return(DOWN);
- } else {
- return(UPWARD);
- }
- }
- if ((srow > drow) && (scol > dcol)) {
- return(UPLEFT);
- }
- if ((srow < drow) && (scol < dcol)) {
- return(DOWNRIGHT);
- }
- if ((srow < drow) && (scol > dcol)) {
- return(DOWNLEFT);
- }
- /*if ((srow > drow) && (scol < dcol)) {*/
- return(UPRIGHT);
- /*}*/
-}
diff --git a/games/rogue/throw.c b/games/rogue/throw.c
deleted file mode 100644
index e40dd4acaa6..00000000000
--- a/games/rogue/throw.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/* $OpenBSD: throw.c,v 1.9 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: throw.c,v 1.3 1995/04/22 10:28:32 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * throw.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-void
-throw(void)
-{
- short wch, d;
- boolean first_miss = 1;
- object *weapon;
- short dir, row, col;
- object *monster;
-
- while (!is_direction(dir = rgetchar(), &d)) {
- beep();
- if (first_miss) {
- messagef(0, "direction? ");
- first_miss = 0;
- }
- }
- check_message();
- if (dir == CANCEL) {
- return;
- }
- if ((wch = pack_letter("throw what?", WEAPON)) == CANCEL) {
- return;
- }
- check_message();
-
- if (!(weapon = get_letter_object(wch))) {
- messagef(0, "no such item.");
- return;
- }
- if ((weapon->in_use_flags & BEING_USED) && weapon->is_cursed) {
- messagef(0, "%s", curse_message);
- return;
- }
- row = rogue.row; col = rogue.col;
-
- if ((weapon->in_use_flags & BEING_WIELDED) && (weapon->quantity <= 1)) {
- unwield(rogue.weapon);
- } else if (weapon->in_use_flags & BEING_WORN) {
- mv_aquatars();
- unwear(rogue.armor);
- print_stats(STAT_ARMOR);
- } else if (weapon->in_use_flags & ON_EITHER_HAND) {
- un_put_on(weapon);
- }
- monster = get_thrown_at_monster(weapon, d, &row, &col);
- mvaddch(rogue.row, rogue.col, rogue.fchar);
- refresh();
-
- if (rogue_can_see(row, col) && ((row != rogue.row) || (col != rogue.col))){
- mvaddch(row, col, get_dungeon_char(row, col));
- }
- if (monster) {
- wake_up(monster);
- check_gold_seeker(monster);
-
- if (!throw_at_monster(monster, weapon)) {
- flop_weapon(weapon, row, col);
- }
- } else {
- flop_weapon(weapon, row, col);
- }
- vanish(weapon, 1, &rogue.pack);
-}
-
-boolean
-throw_at_monster(object *monster, object *weapon)
-{
- short damage, hit_chance;
- short t;
-
- hit_chance = get_hit_chance(weapon);
- damage = get_weapon_damage(weapon);
- if ((weapon->which_kind == ARROW) &&
- (rogue.weapon && (rogue.weapon->which_kind == BOW))) {
- damage += get_weapon_damage(rogue.weapon);
- damage = ((damage * 2) / 3);
- hit_chance += (hit_chance / 3);
- } else if ((weapon->in_use_flags & BEING_WIELDED) &&
- ((weapon->which_kind == DAGGER) ||
- (weapon->which_kind == SHURIKEN) ||
- (weapon->which_kind == DART))) {
- damage = ((damage * 3) / 2);
- hit_chance += (hit_chance / 3);
- }
- t = weapon->quantity;
- weapon->quantity = 1;
- snprintf(hit_message, HIT_MESSAGE_LEN, "the %s", name_of(weapon));
- weapon->quantity = t;
-
- if (!rand_percent(hit_chance)) {
- (void) strlcat(hit_message, "misses ", HIT_MESSAGE_LEN);
- return(0);
- }
- s_con_mon(monster);
- (void) strlcat(hit_message, "hit ", HIT_MESSAGE_LEN);
- (void) mon_damage(monster, damage);
- return(1);
-}
-
-object *
-get_thrown_at_monster(object *obj, short dir, short *row, short *col)
-{
- short orow, ocol;
- short i, ch;
-
- orow = *row; ocol = *col;
-
- ch = get_mask_char(obj->what_is);
-
- for (i = 0; i < 24; i++) {
- get_dir_rc(dir, row, col, 0);
- if ( (((*col <= 0) || (*col >= DCOLS-1)) ||
- (dungeon[*row][*col] == NOTHING)) ||
- ((dungeon[*row][*col] & (HORWALL | VERTWALL | HIDDEN)) &&
- (!(dungeon[*row][*col] & TRAP)))) {
- *row = orow;
- *col = ocol;
- return(0);
- }
- if ((i != 0) && rogue_can_see(orow, ocol)) {
- mvaddch(orow, ocol, get_dungeon_char(orow, ocol));
- }
- if (rogue_can_see(*row, *col)) {
- if (!(dungeon[*row][*col] & MONSTER)) {
- mvaddch(*row, *col, ch);
- }
- refresh();
- }
- orow = *row; ocol = *col;
- if (dungeon[*row][*col] & MONSTER) {
- if (!imitating(*row, *col)) {
- return(object_at(&level_monsters, *row, *col));
- }
- }
- if (dungeon[*row][*col] & TUNNEL) {
- i += 2;
- }
- }
- return(0);
-}
-
-void
-flop_weapon(object *weapon, short row, short col)
-{
- object *new_weapon, *monster;
- short i = 0;
- boolean found = 0;
- short mch, dch;
- unsigned short mon;
-
- while ((i < 9) && dungeon[row][col] & ~(FLOOR | TUNNEL | DOOR | MONSTER)) {
- rand_around(i++, &row, &col);
- if ((row > (DROWS-2)) || (row < MIN_ROW) ||
- (col > (DCOLS-1)) || (col < 0) || (!dungeon[row][col]) ||
- (dungeon[row][col] & ~(FLOOR | TUNNEL | DOOR | MONSTER))) {
- continue;
- }
- found = 1;
- break;
- }
-
- if (found || (i == 0)) {
- new_weapon = alloc_object();
- *new_weapon = *weapon;
- new_weapon->in_use_flags = NOT_USED;
- new_weapon->quantity = 1;
- new_weapon->ichar = 'L';
- place_at(new_weapon, row, col);
- if (rogue_can_see(row, col) &&
- ((row != rogue.row) || (col != rogue.col))) {
- mon = dungeon[row][col] & MONSTER;
- dungeon[row][col] &= (~MONSTER);
- dch = get_dungeon_char(row, col);
- if (mon) {
- mch = mvinch(row, col);
- if ((monster = object_at(&level_monsters, row, col))) {
- monster->trail_char = dch;
- }
- if ((mch < 'A') || (mch > 'Z')) {
- mvaddch(row, col, dch);
- }
- } else {
- mvaddch(row, col, dch);
- }
- dungeon[row][col] |= mon;
- }
- } else {
- short t;
-
- t = weapon->quantity;
- weapon->quantity = 1;
- messagef(0, "the %svanishes as it hits the ground",
- name_of(weapon));
- weapon->quantity = t;
- }
-}
-
-void
-rand_around(short i, short *r, short *c)
-{
- static char pos[] = "\010\007\001\003\004\005\002\006\0";
- static short row, col;
- short j;
-
- if (i == 0) {
- short x, y, o, t;
-
- row = *r;
- col = *c;
-
- o = get_rand(1, 8);
-
- for (j = 0; j < 5; j++) {
- x = get_rand(0, 8);
- y = (x + o) % 9;
- t = pos[x];
- pos[x] = pos[y];
- pos[y] = t;
- }
- }
- switch((short)pos[i]) {
- case 0:
- *r = row + 1;
- *c = col + 1;
- break;
- case 1:
- *r = row + 1;
- *c = col - 1;
- break;
- case 2:
- *r = row - 1;
- *c = col + 1;
- break;
- case 3:
- *r = row - 1;
- *c = col - 1;
- break;
- case 4:
- *r = row;
- *c = col + 1;
- break;
- case 5:
- *r = row + 1;
- *c = col;
- break;
- case 6:
- *r = row;
- *c = col;
- break;
- case 7:
- *r = row - 1;
- *c = col;
- break;
- case 8:
- *r = row;
- *c = col - 1;
- break;
- }
-}
diff --git a/games/rogue/trap.c b/games/rogue/trap.c
deleted file mode 100644
index f50f5d81e1d..00000000000
--- a/games/rogue/trap.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/* $OpenBSD: trap.c,v 1.8 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: trap.c,v 1.3 1995/04/22 10:28:35 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * trap.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-trap traps[MAX_TRAPS];
-boolean trap_door = 0;
-short bear_trap = 0;
-
-const char *trap_strings[TRAPS * 2] = {
- "trap door",
- "you fell down a trap",
- "bear trap",
- "you are caught in a bear trap",
- "teleport trap",
- "teleport",
- "poison dart trap",
- "a small dart just hit you in the shoulder",
- "sleeping gas trap",
- "a strange white mist envelops you and you fall asleep",
- "rust trap",
- "a gush of water hits you on the head"
-};
-
-short
-trap_at(short row, short col)
-{
- short i;
-
- for (i = 0; ((i < MAX_TRAPS) && (traps[i].trap_type != NO_TRAP)); i++) {
- if ((traps[i].trap_row == row) && (traps[i].trap_col == col)) {
- return(traps[i].trap_type);
- }
- }
- return(NO_TRAP);
-}
-
-void
-trap_player(short row, short col)
-{
- short t;
-
- if ((t = trap_at(row, col)) == NO_TRAP) {
- return;
- }
- dungeon[row][col] &= (~HIDDEN);
- if (rand_percent(rogue.exp + ring_exp)) {
- messagef(1, "the trap failed");
- return;
- }
- switch(t) {
- case TRAP_DOOR:
- trap_door = 1;
- new_level_message = trap_strings[(t*2)+1];
- break;
- case BEAR_TRAP:
- messagef(1, "%s", trap_strings[(t*2)+1]);
- bear_trap = get_rand(4, 7);
- break;
- case TELE_TRAP:
- mvaddch(rogue.row, rogue.col, '^');
- tele();
- break;
- case DART_TRAP:
- messagef(1, "%s", trap_strings[(t*2)+1]);
- rogue.hp_current -= get_damage("1d6", 1);
- if (rogue.hp_current <= 0) {
- rogue.hp_current = 0;
- }
- if ((!sustain_strength) && rand_percent(40) &&
- (rogue.str_current >= 3)) {
- rogue.str_current--;
- }
- print_stats(STAT_HP | STAT_STRENGTH);
- if (rogue.hp_current <= 0) {
- killed_by((object *) 0, POISON_DART);
- }
- break;
- case SLEEPING_GAS_TRAP:
- messagef(1, "%s", trap_strings[(t*2)+1]);
- take_a_nap();
- break;
- case RUST_TRAP:
- messagef(1, "%s", trap_strings[(t*2)+1]);
- rust((object *) 0);
- break;
- }
-}
-
-void
-add_traps(void)
-{
- short i, n, tries = 0;
- short row, col;
-
- if (cur_level <= 2) {
- n = 0;
- } else if (cur_level <= 7) {
- n = get_rand(0, 2);
- } else if (cur_level <= 11) {
- n = get_rand(1, 2);
- } else if (cur_level <= 16) {
- n = get_rand(2, 3);
- } else if (cur_level <= 21) {
- n = get_rand(2, 4);
- } else if (cur_level <= (AMULET_LEVEL + 2)) {
- n = get_rand(3, 5);
- } else {
- n = get_rand(5, MAX_TRAPS);
- }
- for (i = 0; i < n; i++) {
- traps[i].trap_type = get_rand(0, (TRAPS - 1));
-
- if ((i == 0) && (party_room != NO_ROOM)) {
- do {
- row = get_rand((rooms[party_room].top_row+1),
- (rooms[party_room].bottom_row-1));
- col = get_rand((rooms[party_room].left_col+1),
- (rooms[party_room].right_col-1));
- tries++;
- } while (((dungeon[row][col] & (OBJECT|STAIRS|TRAP|TUNNEL)) ||
- (dungeon[row][col] == NOTHING)) && (tries < 15));
- if (tries >= 15) {
- gr_row_col(&row, &col, (FLOOR | MONSTER));
- }
- } else {
- gr_row_col(&row, &col, (FLOOR | MONSTER));
- }
- traps[i].trap_row = row;
- traps[i].trap_col = col;
- dungeon[row][col] |= (TRAP | HIDDEN);
- }
-}
-
-void
-id_trap(void)
-{
- short dir, row, col, d, t;
-
- messagef(0, "direction? ");
-
- while (!is_direction(dir = rgetchar(), &d)) {
- beep();
- }
- check_message();
-
- if (dir == CANCEL) {
- return;
- }
- row = rogue.row;
- col = rogue.col;
-
- get_dir_rc(d, &row, &col, 0);
-
- if ((dungeon[row][col] & TRAP) && (!(dungeon[row][col] & HIDDEN))) {
- t = trap_at(row, col);
- messagef(0, "%s", trap_strings[t*2]);
- } else {
- messagef(0, "no trap there");
- }
-}
-
-void
-show_traps(void)
-{
- short i, j;
-
- for (i = 0; i < DROWS; i++) {
- for (j = 0; j < DCOLS; j++) {
- if (dungeon[i][j] & TRAP) {
- mvaddch(i, j, '^');
- }
- }
- }
-}
-
-void
-search(short n, boolean is_auto)
-{
- short s, i, j, row, col, t;
- short shown = 0, found = 0;
- static boolean reg_search;
-
- for (i = -1; i <= 1; i++) {
- for (j = -1; j <= 1; j++) {
- row = rogue.row + i;
- col = rogue.col + j;
- if ((row < MIN_ROW) || (row >= (DROWS-1)) ||
- (col < 0) || (col >= DCOLS)) {
- continue;
- }
- if (dungeon[row][col] & HIDDEN) {
- found++;
- }
- }
- }
- for (s = 0; s < n; s++) {
- for (i = -1; i <= 1; i++) {
- for (j = -1; j <= 1; j++) {
- row = rogue.row + i;
- col = rogue.col + j ;
- if ((row < MIN_ROW) || (row >= (DROWS-1)) ||
- (col < 0) || (col >= DCOLS)) {
- continue;
- }
- if (dungeon[row][col] & HIDDEN) {
- if (rand_percent(17 + (rogue.exp + ring_exp))) {
- dungeon[row][col] &= (~HIDDEN);
- if ((!blind) && ((row != rogue.row) ||
- (col != rogue.col))) {
- mvaddch(row, col, get_dungeon_char(row, col));
- }
- shown++;
- if (dungeon[row][col] & TRAP) {
- t = trap_at(row, col);
- messagef(1, "%s", trap_strings[t*2]);
- }
- }
- }
- if (((shown == found) && (found > 0)) || interrupted) {
- return;
- }
- }
- }
- if ((!is_auto) && (reg_search = !reg_search)) {
- (void) reg_move();
- }
- }
-}
diff --git a/games/rogue/use.c b/games/rogue/use.c
deleted file mode 100644
index 3291363a859..00000000000
--- a/games/rogue/use.c
+++ /dev/null
@@ -1,606 +0,0 @@
-/* $OpenBSD: use.c,v 1.9 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: use.c,v 1.3 1995/04/22 10:28:38 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * use.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-short halluc = 0;
-short blind = 0;
-short confused = 0;
-short levitate = 0;
-short haste_self = 0;
-boolean see_invisible = 0;
-short extra_hp = 0;
-boolean detect_monster = 0;
-boolean con_mon = 0;
-const char *strange_feeling = "you have a strange feeling for a moment, then it passes";
-
-void
-quaff(void)
-{
- short ch;
- object *obj;
-
- ch = pack_letter("quaff what?", POTION);
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- if (obj->what_is != POTION) {
- messagef(0, "you can't drink that");
- return;
- }
- switch(obj->which_kind) {
- case INCREASE_STRENGTH:
- messagef(0, "you feel stronger now, what bulging muscles!");
- rogue.str_current++;
- if (rogue.str_current > rogue.str_max) {
- rogue.str_max = rogue.str_current;
- }
- break;
- case RESTORE_STRENGTH:
- rogue.str_current = rogue.str_max;
- messagef(0, "this tastes great, you feel warm all over");
- break;
- case HEALING:
- messagef(0, "you begin to feel better");
- potion_heal(0);
- break;
- case EXTRA_HEALING:
- messagef(0, "you begin to feel much better");
- potion_heal(1);
- break;
- case POISON:
- if (!sustain_strength) {
- rogue.str_current -= get_rand(1, 3);
- if (rogue.str_current < 1) {
- rogue.str_current = 1;
- }
- }
- messagef(0, "you feel very sick now");
- if (halluc) {
- unhallucinate();
- }
- break;
- case RAISE_LEVEL:
- rogue.exp_points = level_points[rogue.exp - 1];
- messagef(0, "you suddenly feel much more skillful");
- add_exp(1, 1);
- break;
- case BLINDNESS:
- go_blind();
- break;
- case HALLUCINATION:
- messagef(0, "oh wow, everything seems so cosmic");
- halluc += get_rand(500, 800);
- break;
- case DETECT_MONSTER:
- show_monsters();
- if (!(level_monsters.next_monster)) {
- messagef(0, "%s", strange_feeling);
- }
- break;
- case DETECT_OBJECTS:
- if (level_objects.next_object) {
- if (!blind) {
- show_objects();
- }
- } else {
- messagef(0, "%s", strange_feeling);
- }
- break;
- case CONFUSION:
- messagef(0, (halluc ? "what a trippy feeling" :
- "you feel confused"));
- cnfs();
- break;
- case LEVITATION:
- messagef(0, "you start to float in the air");
- levitate += get_rand(15, 30);
- being_held = bear_trap = 0;
- break;
- case HASTE_SELF:
- messagef(0, "you feel yourself moving much faster");
- haste_self += get_rand(11, 21);
- if (!(haste_self % 2)) {
- haste_self++;
- }
- break;
- case SEE_INVISIBLE:
- messagef(0, "hmm, this potion tastes like %s juice", fruit);
- if (blind) {
- unblind();
- }
- see_invisible = 1;
- relight();
- break;
- }
- print_stats((STAT_STRENGTH | STAT_HP));
- if (id_potions[obj->which_kind].id_status != CALLED) {
- id_potions[obj->which_kind].id_status = IDENTIFIED;
- }
- vanish(obj, 1, &rogue.pack);
-}
-
-void
-read_scroll(void)
-{
- short ch;
- object *obj;
-
- ch = pack_letter("read what?", SCROL);
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- if (obj->what_is != SCROL) {
- messagef(0, "you can't read that");
- return;
- }
- switch(obj->which_kind) {
- case SCARE_MONSTER:
- messagef(0, "you hear a maniacal laughter in the distance");
- break;
- case HOLD_MONSTER:
- hold_monster();
- break;
- case ENCH_WEAPON:
- if (rogue.weapon) {
- if (rogue.weapon->what_is == WEAPON) {
- messagef(0, "your %sglow%s %sfor a moment",
- name_of(rogue.weapon),
- ((rogue.weapon->quantity <= 1) ? "s" : ""),
- get_ench_color());
- if (coin_toss()) {
- rogue.weapon->hit_enchant++;
- } else {
- rogue.weapon->d_enchant++;
- }
- }
- rogue.weapon->is_cursed = 0;
- } else {
- messagef(0, "your hands tingle");
- }
- break;
- case ENCH_ARMOR:
- if (rogue.armor) {
- messagef(0, "your armor glows %sfor a moment",
- get_ench_color());
- rogue.armor->d_enchant++;
- rogue.armor->is_cursed = 0;
- print_stats(STAT_ARMOR);
- } else {
- messagef(0, "your skin crawls");
- }
- break;
- case IDENTIFY:
- messagef(0, "this is a scroll of identify");
- obj->identified = 1;
- id_scrolls[obj->which_kind].id_status = IDENTIFIED;
- idntfy();
- break;
- case TELEPORT:
- tele();
- break;
- case SLEEP:
- messagef(0, "you fall asleep");
- take_a_nap();
- break;
- case PROTECT_ARMOR:
- if (rogue.armor) {
- messagef(0, "your armor is covered by a shimmering gold shield");
- rogue.armor->is_protected = 1;
- rogue.armor->is_cursed = 0;
- } else {
- messagef(0, "your acne seems to have disappeared");
- }
- break;
- case REMOVE_CURSE:
- messagef(0, (!halluc) ?
- "you feel as though someone is watching over you" :
- "you feel in touch with the universal oneness");
- uncurse_all();
- break;
- case CREATE_MONSTER:
- create_monster();
- break;
- case AGGRAVATE_MONSTER:
- aggravate();
- break;
- case MAGIC_MAPPING:
- messagef(0, "this scroll seems to have a map on it");
- draw_magic_map();
- break;
- case CON_MON:
- con_mon = 1;
- messagef(0, "your hands glow %sfor a moment", get_ench_color());
- break;
- }
- if (id_scrolls[obj->which_kind].id_status != CALLED) {
- id_scrolls[obj->which_kind].id_status = IDENTIFIED;
- }
- vanish(obj, (obj->which_kind != SLEEP), &rogue.pack);
-}
-
-/* vanish() does NOT handle a quiver of weapons with more than one
- * arrow (or whatever) in the quiver. It will only decrement the count.
- */
-
-void
-vanish(object *obj, short rm, object *pack)
-{
- if (obj->quantity > 1) {
- obj->quantity--;
- } else {
- if (obj->in_use_flags & BEING_WIELDED) {
- unwield(obj);
- } else if (obj->in_use_flags & BEING_WORN) {
- unwear(obj);
- } else if (obj->in_use_flags & ON_EITHER_HAND) {
- un_put_on(obj);
- }
- take_from_pack(obj, pack);
- free_object(obj);
- }
- if (rm) {
- (void) reg_move();
- }
-}
-
-void
-potion_heal(int extra)
-{
- float ratio;
- short add;
-
- rogue.hp_current += rogue.exp;
-
- ratio = ((float)rogue.hp_current) / rogue.hp_max;
-
- if (ratio >= 1.00) {
- rogue.hp_max += (extra ? 2 : 1);
- extra_hp += (extra ? 2 : 1);
- rogue.hp_current = rogue.hp_max;
- } else if (ratio >= 0.90) {
- rogue.hp_max += (extra ? 1 : 0);
- extra_hp += (extra ? 1 : 0);
- rogue.hp_current = rogue.hp_max;
- } else {
- if (ratio < 0.33) {
- ratio = 0.33;
- }
- if (extra) {
- ratio += ratio;
- }
- add = (short)(ratio * ((float)rogue.hp_max - rogue.hp_current));
- rogue.hp_current += add;
- if (rogue.hp_current > rogue.hp_max) {
- rogue.hp_current = rogue.hp_max;
- }
- }
- if (blind) {
- unblind();
- }
- if (confused && extra) {
- unconfuse();
- } else if (confused) {
- confused = (confused / 2) + 1;
- }
- if (halluc && extra) {
- unhallucinate();
- } else if (halluc) {
- halluc = (halluc / 2) + 1;
- }
-}
-
-void
-idntfy(void)
-{
- short ch;
- object *obj;
- struct id *id_table;
- char desc[DCOLS];
-AGAIN:
- ch = pack_letter("what would you like to identify?", ALL_OBJECTS);
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item, try again");
- messagef(0, "");
- check_message();
- goto AGAIN;
- }
- obj->identified = 1;
- if (obj->what_is & (SCROL | POTION | WEAPON | ARMOR | WAND | RING)) {
- id_table = get_id_table(obj);
- id_table[obj->which_kind].id_status = IDENTIFIED;
- }
- get_desc(obj, desc, sizeof(desc));
- messagef(0, "%s", desc);
-}
-
-void
-eat(void)
-{
- short ch;
- short moves;
- object *obj;
-
- ch = pack_letter("eat what?", FOOD);
-
- if (ch == CANCEL) {
- return;
- }
- if (!(obj = get_letter_object(ch))) {
- messagef(0, "no such item.");
- return;
- }
- if (obj->what_is != FOOD) {
- messagef(0, "you can't eat that");
- return;
- }
- if ((obj->which_kind == FRUIT) || rand_percent(60)) {
- moves = get_rand(950, 1150);
- if (obj->which_kind == RATION) {
- messagef(0, "yum, that tasted good");
- } else {
- messagef(0, "my, that was a yummy %s", fruit);
- }
- } else {
- moves = get_rand(750, 950);
- messagef(0, "yuk, that food tasted awful");
- add_exp(2, 1);
- }
- rogue.moves_left /= 3;
- rogue.moves_left += moves;
- hunger_str[0] = 0;
- print_stats(STAT_HUNGER);
-
- vanish(obj, 1, &rogue.pack);
-}
-
-void
-hold_monster(void)
-{
- short i, j;
- short mcount = 0;
- object *monster;
- short row, col;
-
- for (i = -2; i <= 2; i++) {
- for (j = -2; j <= 2; j++) {
- row = rogue.row + i;
- col = rogue.col + j;
- if ((row < MIN_ROW) || (row > (DROWS-2)) || (col < 0) ||
- (col > (DCOLS-1))) {
- continue;
- }
- if (dungeon[row][col] & MONSTER) {
- monster = object_at(&level_monsters, row, col);
- monster->m_flags |= ASLEEP;
- monster->m_flags &= (~WAKENS);
- mcount++;
- }
- }
- }
- if (mcount == 0) {
- messagef(0, "you feel a strange sense of loss");
- } else if (mcount == 1) {
- messagef(0, "the monster freezes");
- } else {
- messagef(0, "the monsters around you freeze");
- }
-}
-
-void
-tele(void)
-{
- mvaddch(rogue.row, rogue.col, get_dungeon_char(rogue.row, rogue.col));
-
- if (cur_room >= 0) {
- darken_room(cur_room);
- }
- put_player(get_room_number(rogue.row, rogue.col));
- being_held = 0;
- bear_trap = 0;
-}
-
-void
-hallucinate(void)
-{
- object *obj, *monster;
- short ch;
-
- if (blind) return;
-
- obj = level_objects.next_object;
-
- while (obj) {
- ch = mvinch(obj->row, obj->col);
- if (((ch < 'A') || (ch > 'Z')) &&
- ((obj->row != rogue.row) || (obj->col != rogue.col)))
- if ((ch != ' ') && (ch != '.') && (ch != '#') && (ch != '+')) {
- addch(gr_obj_char());
- }
- obj = obj->next_object;
- }
- monster = level_monsters.next_monster;
-
- while (monster) {
- ch = mvinch(monster->row, monster->col);
- if ((ch >= 'A') && (ch <= 'Z')) {
- addch(get_rand('A', 'Z'));
- }
- monster = monster->next_monster;
- }
-}
-
-void
-unhallucinate(void)
-{
- halluc = 0;
- relight();
- messagef(1, "everything looks SO boring now");
-}
-
-void
-unblind(void)
-{
- blind = 0;
- messagef(1, "the veil of darkness lifts");
- relight();
- if (halluc) {
- hallucinate();
- }
- if (detect_monster) {
- show_monsters();
- }
-}
-
-void
-relight(void)
-{
- if (cur_room == PASSAGE) {
- light_passage(rogue.row, rogue.col);
- } else {
- light_up_room(cur_room);
- }
- mvaddch(rogue.row, rogue.col, rogue.fchar);
-}
-
-void
-take_a_nap(void)
-{
- short i;
-
- i = get_rand(2, 5);
- md_sleep(1);
-
- while (i--) {
- mv_mons();
- }
- md_sleep(1);
- messagef(0, "%s", you_can_move_again);
-}
-
-void
-go_blind(void)
-{
- short i, j;
-
- if (!blind) {
- messagef(0, "a cloak of darkness falls around you");
- }
- blind += get_rand(500, 800);
-
- if (detect_monster) {
- object *monster;
-
- monster = level_monsters.next_monster;
-
- while (monster) {
- mvaddch(monster->row, monster->col, monster->trail_char);
- monster = monster->next_monster;
- }
- }
- if (cur_room >= 0) {
- for (i = rooms[cur_room].top_row + 1;
- i < rooms[cur_room].bottom_row; i++) {
- for (j = rooms[cur_room].left_col + 1;
- j < rooms[cur_room].right_col; j++) {
- mvaddch(i, j, ' ');
- }
- }
- }
- mvaddch(rogue.row, rogue.col, rogue.fchar);
-}
-
-const char *
-get_ench_color(void)
-{
- if (halluc) {
- return(id_potions[get_rand(0, POTIONS-1)].title);
- } else if (con_mon) {
- return("red ");
- }
- return("blue ");
-}
-
-void
-cnfs(void)
-{
- confused += get_rand(12, 22);
-}
-
-void
-unconfuse(void)
-{
- confused = 0;
- messagef(1, "you feel less %s now", (halluc ? "trippy" : "confused"));
-}
-
-void
-uncurse_all(void)
-{
- object *obj;
-
- obj = rogue.pack.next_object;
-
- while (obj) {
- obj->is_cursed = 0;
- obj = obj->next_object;
- }
-}
diff --git a/games/rogue/zap.c b/games/rogue/zap.c
deleted file mode 100644
index 54f39c0f2a3..00000000000
--- a/games/rogue/zap.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/* $OpenBSD: zap.c,v 1.8 2009/10/27 23:59:26 deraadt Exp $ */
-/* $NetBSD: zap.c,v 1.3 1995/04/22 10:28:41 cgd Exp $ */
-
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Timothy C. Stoehr.
- *
- * 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. 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.
- */
-
-/*
- * zap.c
- *
- * This source herein may be modified and/or distributed by anybody who
- * so desires, with the following restrictions:
- * 1.) No portion of this notice shall be removed.
- * 2.) Credit shall not be taken for the creation of this source.
- * 3.) This code is not to be traded, sold, or used for personal
- * gain or profit.
- *
- */
-
-#include "rogue.h"
-
-boolean wizard = 0;
-
-void
-zapp(void)
-{
- short wch;
- boolean first_miss = 1;
- object *wand;
- short dir, d, row, col;
- object *monster;
-
- while (!is_direction(dir = rgetchar(), &d)) {
- beep();
- if (first_miss) {
- messagef(0, "direction? ");
- first_miss = 0;
- }
- }
- check_message();
- if (dir == CANCEL) {
- return;
- }
- if ((wch = pack_letter("zap with what?", WAND)) == CANCEL) {
- return;
- }
- check_message();
-
- if (!(wand = get_letter_object(wch))) {
- messagef(0, "no such item.");
- return;
- }
- if (wand->what_is != WAND) {
- messagef(0, "you can't zap with that");
- return;
- }
- if (wand->class <= 0) {
- messagef(0, "nothing happens");
- } else {
- wand->class--;
- row = rogue.row; col = rogue.col;
- if ((wand->which_kind == COLD) || (wand->which_kind == FIRE)) {
- bounce((short) wand->which_kind, d, row, col, 0);
- } else {
- monster = get_zapped_monster(d, &row, &col);
- if (wand->which_kind == DRAIN_LIFE) {
- wdrain_life(monster);
- } else if (monster) {
- wake_up(monster);
- s_con_mon(monster);
- zap_monster(monster, wand->which_kind);
- relight();
- }
- }
- }
- (void) reg_move();
-}
-
-object *
-get_zapped_monster(short dir, short *row, short *col)
-{
- short orow, ocol;
-
- for (;;) {
- orow = *row; ocol = *col;
- get_dir_rc(dir, row, col, 0);
- if (((*row == orow) && (*col == ocol)) ||
- (dungeon[*row][*col] & (HORWALL | VERTWALL)) ||
- (dungeon[*row][*col] == NOTHING)) {
- return(0);
- }
- if (dungeon[*row][*col] & MONSTER) {
- if (!imitating(*row, *col)) {
- return(object_at(&level_monsters, *row, *col));
- }
- }
- }
-}
-
-void
-zap_monster(object *monster, unsigned short kind)
-{
- short row, col;
- object *nm;
- short tc;
-
- row = monster->row;
- col = monster->col;
-
- switch(kind) {
- case SLOW_MONSTER:
- if (monster->m_flags & HASTED) {
- monster->m_flags &= (~HASTED);
- } else {
- monster->slowed_toggle = 0;
- monster->m_flags |= SLOWED;
- }
- break;
- case HASTE_MONSTER:
- if (monster->m_flags & SLOWED) {
- monster->m_flags &= (~SLOWED);
- } else {
- monster->m_flags |= HASTED;
- }
- break;
- case TELE_AWAY:
- tele_away(monster);
- break;
- case INVISIBILITY:
- monster->m_flags |= INVISIBLE;
- break;
- case POLYMORPH:
- if (monster->m_flags & HOLDS) {
- being_held = 0;
- }
- nm = monster->next_monster;
- tc = monster->trail_char;
- (void) gr_monster(monster, get_rand(0, MONSTERS-1));
- monster->row = row;
- monster->col = col;
- monster->next_monster = nm;
- monster->trail_char = tc;
- if (!(monster->m_flags & IMITATES)) {
- wake_up(monster);
- }
- break;
- case MAGIC_MISSILE:
- rogue_hit(monster, 1);
- break;
- case CANCELLATION:
- if (monster->m_flags & HOLDS) {
- being_held = 0;
- }
- if (monster->m_flags & STEALS_ITEM) {
- monster->drop_percent = 0;
- }
- monster->m_flags &= (~(FLIES | FLITS | SPECIAL_HIT | INVISIBLE |
- FLAMES | IMITATES | CONFUSES | SEEKS_GOLD | HOLDS));
- break;
- case DO_NOTHING:
- messagef(0, "nothing happens");
- break;
- }
-}
-
-void
-tele_away(object *monster)
-{
- short row, col;
-
- if (monster->m_flags & HOLDS) {
- being_held = 0;
- }
- gr_row_col(&row, &col, (FLOOR | TUNNEL | STAIRS | OBJECT));
- mvaddch(monster->row, monster->col, monster->trail_char);
- dungeon[monster->row][monster->col] &= ~MONSTER;
- monster->row = row; monster->col = col;
- dungeon[row][col] |= MONSTER;
- monster->trail_char = mvinch(row, col);
- if (detect_monster || rogue_can_see(row, col)) {
- mvaddch(row, col, gmc(monster));
- }
-}
-
-void
-wizardize(void)
-{
- char buf[10];
-
- if (wizard) {
- wizard = 0;
- messagef(0, "not wizard anymore");
- } else {
- if (get_input_line("wizard's password:", "", buf, sizeof(buf),
- "", 0, 0)) {
- (void) xxx(1);
- xxxx(buf, strlen(buf));
- if (!strncmp(buf, "\247\104\126\272\115\243\027", 7)) {
- wizard = 1;
- score_only = 1;
- messagef(0, "Welcome, mighty wizard!");
- } else {
- messagef(0, "sorry");
- }
- }
- }
-}
-
-void
-wdrain_life(object *monster)
-{
- short hp;
- object *lmon, *nm;
-
- hp = rogue.hp_current / 3;
- rogue.hp_current = (rogue.hp_current + 1) / 2;
-
- if (cur_room >= 0) {
- lmon = level_monsters.next_monster;
- while (lmon) {
- nm = lmon->next_monster;
- if (get_room_number(lmon->row, lmon->col) == cur_room) {
- wake_up(lmon);
- (void) mon_damage(lmon, hp);
- }
- lmon = nm;
- }
- } else {
- if (monster) {
- wake_up(monster);
- (void) mon_damage(monster, hp);
- }
- }
- print_stats(STAT_HP);
- relight();
-}
-
-void
-bounce(short ball, short dir, short row, short col, short r)
-{
- short orow, ocol;
- const char *s;
- short i, ch, new_dir = -1, damage;
- static short btime;
-
- if (++r == 1) {
- btime = get_rand(3, 6);
- } else if (r > btime) {
- return;
- }
-
- if (ball == FIRE) {
- s = "fire";
- } else {
- s = "ice";
- }
- if (r > 1) {
- messagef(0, "the %s bounces", s);
- }
- orow = row;
- ocol = col;
- do {
- ch = mvinch(orow, ocol);
- standout();
- mvaddch(orow, ocol, ch);
- get_dir_rc(dir, &orow, &ocol, 1);
- } while (!( (ocol <= 0) ||
- (ocol >= DCOLS-1) ||
- (dungeon[orow][ocol] == NOTHING) ||
- (dungeon[orow][ocol] & MONSTER) ||
- (dungeon[orow][ocol] & (HORWALL | VERTWALL)) ||
- ((orow == rogue.row) && (ocol == rogue.col))));
- standend();
- refresh();
- do {
- orow = row;
- ocol = col;
- ch = mvinch(row, col);
- mvaddch(row, col, ch);
- get_dir_rc(dir, &row, &col, 1);
- } while (!( (col <= 0) ||
- (col >= DCOLS-1) ||
- (dungeon[row][col] == NOTHING) ||
- (dungeon[row][col] & MONSTER) ||
- (dungeon[row][col] & (HORWALL | VERTWALL)) ||
- ((row == rogue.row) && (col == rogue.col))));
-
- if (dungeon[row][col] & MONSTER) {
- object *monster;
-
- monster = object_at(&level_monsters, row, col);
-
- wake_up(monster);
- if (rand_percent(33)) {
- messagef(0, "the %s misses the %s", s, mon_name(monster));
- goto ND;
- }
- if (ball == FIRE) {
- if (!(monster->m_flags & RUSTS)) {
- if (monster->m_flags & FREEZES) {
- damage = monster->hp_to_kill;
- } else if (monster->m_flags & FLAMES) {
- damage = (monster->hp_to_kill / 10) + 1;
- } else {
- damage = get_rand((rogue.hp_current / 3), rogue.hp_max);
- }
- } else {
- damage = (monster->hp_to_kill / 2) + 1;
- }
- messagef(0, "the %s hits the %s", s, mon_name(monster));
- (void) mon_damage(monster, damage);
- } else {
- damage = -1;
- if (!(monster->m_flags & FREEZES)) {
- if (rand_percent(33)) {
- messagef(0, "the monster is frozen");
- monster->m_flags |= (ASLEEP | NAPPING);
- monster->nap_length = get_rand(3, 6);
- } else {
- damage = rogue.hp_current / 4;
- }
- } else {
- damage = -2;
- }
- if (damage != -1) {
- messagef(0, "the %s hits the %s", s, mon_name(monster));
- (void) mon_damage(monster, damage);
- }
- }
- } else if ((row == rogue.row) && (col == rogue.col)) {
- if (rand_percent(10 + (3 * get_armor_class(rogue.armor)))) {
- messagef(0, "the %s misses", s);
- goto ND;
- } else {
- damage = get_rand(3, (3 * rogue.exp));
- if (ball == FIRE) {
- damage = (damage * 3) / 2;
- damage -= get_armor_class(rogue.armor);
- }
- rogue_damage(damage, (object *) 0,
- ((ball == FIRE) ? KFIRE : HYPOTHERMIA));
- messagef(0, "the %s hits", s);
- }
- } else {
- short nrow, ncol;
-
-ND: for (i = 0; i < 10; i++) {
- dir = get_rand(0, DIRS-1);
- nrow = orow;
- ncol = ocol;
- get_dir_rc(dir, &nrow, &ncol, 1);
- if (((ncol >= 0) && (ncol <= DCOLS-1)) &&
- (dungeon[nrow][ncol] != NOTHING) &&
- (!(dungeon[nrow][ncol] & (VERTWALL | HORWALL)))) {
- new_dir = dir;
- break;
- }
- }
- if (new_dir != -1) {
- bounce(ball, new_dir, orow, ocol, r);
- }
- }
-}