forked from envs/starlanes
init source v1.3.0
This commit is contained in:
commit
ba30e92f1b
|
@ -0,0 +1,334 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675
|
||||||
|
Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your freedom to
|
||||||
|
share and change it. By contrast, the GNU General Public License is intended
|
||||||
|
to guarantee your freedom to share and change free software--to make sure
|
||||||
|
the software is free for all its users. This General Public License applies
|
||||||
|
to most of the Free Software Foundation's software and to any other program
|
||||||
|
whose authors commit to using it. (Some other Free Software Foundation
|
||||||
|
software is covered by the GNU Library General Public License instead.) You
|
||||||
|
can apply it to your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not price. Our
|
||||||
|
General Public Licenses are designed to make sure that you have the freedom
|
||||||
|
to distribute copies of free software (and charge for this service if you
|
||||||
|
wish), that you receive source code or can get it if you want it, that you
|
||||||
|
can change the software or use pieces of it in new free programs; and that
|
||||||
|
you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid anyone to
|
||||||
|
deny you these rights or to ask you to surrender the rights. These
|
||||||
|
restrictions translate to certain responsibilities for you if you distribute
|
||||||
|
copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether gratis or
|
||||||
|
for a fee, you must give the recipients all the rights that you have. You
|
||||||
|
must make sure that they, too, receive or can get the source code. And you
|
||||||
|
must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and (2)
|
||||||
|
offer you this license which gives you legal permission to copy, distribute
|
||||||
|
and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain that
|
||||||
|
everyone understands that there is no warranty for this free software. If
|
||||||
|
the software is modified by someone else and passed on, we want its
|
||||||
|
recipients to know that what they have is not the original, so that any
|
||||||
|
problems introduced by others will not reflect on the original authors'
|
||||||
|
reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software patents. We
|
||||||
|
wish to avoid the danger that redistributors of a free program will
|
||||||
|
individually obtain patent licenses, in effect making the program
|
||||||
|
proprietary. To prevent this, we have made it clear that any patent must be
|
||||||
|
licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and modification
|
||||||
|
follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains a notice
|
||||||
|
placed by the copyright holder saying it may be distributed under the terms
|
||||||
|
of this General Public License. The "Program", below, refers to any such
|
||||||
|
program or work, and a "work based on the Program" means either the Program
|
||||||
|
or any derivative work under copyright law: that is to say, a work
|
||||||
|
containing the Program or a portion of it, either verbatim or with
|
||||||
|
modifications and/or translated into another language. (Hereinafter,
|
||||||
|
translation is included without limitation in the term "modification".) Each
|
||||||
|
licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not covered
|
||||||
|
by this License; they are outside its scope. The act of running the Program
|
||||||
|
is not restricted, and the output from the Program is covered only if its
|
||||||
|
contents constitute a work based on the Program (independent of having been
|
||||||
|
made by running the Program). Whether that is true depends on what the
|
||||||
|
Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's source code
|
||||||
|
as you receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice and
|
||||||
|
disclaimer of warranty; keep intact all the notices that refer to this
|
||||||
|
License and to the absence of any warranty; and give any other recipients of
|
||||||
|
the Program a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and you
|
||||||
|
may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion of it,
|
||||||
|
thus forming a work based on the Program, and copy and distribute such
|
||||||
|
modifications or work under the terms of Section 1 above, provided that you
|
||||||
|
also meet all of these conditions:
|
||||||
|
|
||||||
|
* a) You must cause the modified files to carry prominent notices stating
|
||||||
|
that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
* b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any part
|
||||||
|
thereof, to be licensed as a whole at no charge to all third parties
|
||||||
|
under the terms of this License.
|
||||||
|
|
||||||
|
* c) If the modified program normally reads commands interactively when
|
||||||
|
run, you must cause it, when started running for such interactive use
|
||||||
|
in the most ordinary way, to print or display an announcement including
|
||||||
|
an appropriate copyright notice and a notice that there is no warranty
|
||||||
|
(or else, saying that you provide a warranty) and that users may
|
||||||
|
redistribute the program under these conditions, and telling the user
|
||||||
|
how to view a copy of this License. (Exception: if the Program itself
|
||||||
|
is interactive but does not normally print such an announcement, your
|
||||||
|
work based on the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If identifiable
|
||||||
|
sections of that work are not derived from the Program, and can be
|
||||||
|
reasonably considered independent and separate works in themselves, then
|
||||||
|
this License, and its terms, do not apply to those sections when you
|
||||||
|
distribute them as separate works. But when you distribute the same sections
|
||||||
|
as part of a whole which is a work based on the Program, the distribution of
|
||||||
|
the whole must be on the terms of this License, whose permissions for other
|
||||||
|
licensees extend to the entire whole, and thus to each and every part
|
||||||
|
regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest your
|
||||||
|
rights to work written entirely by you; rather, the intent is to exercise
|
||||||
|
the right to control the distribution of derivative or collective works
|
||||||
|
based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program with
|
||||||
|
the Program (or with a work based on the Program) on a volume of a storage
|
||||||
|
or distribution medium does not bring the other work under the scope of this
|
||||||
|
License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it, under
|
||||||
|
Section 2) in object code or executable form under the terms of Sections 1
|
||||||
|
and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
* a) Accompany it with the complete corresponding machine-readable source
|
||||||
|
code, which must be distributed under the terms of Sections 1 and 2
|
||||||
|
above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
* b) Accompany it with a written offer, valid for at least three years,
|
||||||
|
to give any third party, for a charge no more than your cost of
|
||||||
|
physically performing source distribution, a complete machine-readable
|
||||||
|
copy of the corresponding source code, to be distributed under the
|
||||||
|
terms of Sections 1 and 2 above on a medium customarily used for
|
||||||
|
software interchange; or,
|
||||||
|
|
||||||
|
* c) Accompany it with the information you received as to the offer to
|
||||||
|
distribute corresponding source code. (This alternative is allowed only
|
||||||
|
for noncommercial distribution and only if you received the program in
|
||||||
|
object code or executable form with such an offer, in accord with
|
||||||
|
Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for making
|
||||||
|
modifications to it. For an executable work, complete source code means all
|
||||||
|
the source code for all modules it contains, plus any associated interface
|
||||||
|
definition files, plus the scripts used to control compilation and
|
||||||
|
installation of the executable. However, as a special exception, the source
|
||||||
|
code distributed need not include anything that is normally distributed (in
|
||||||
|
either source or binary form) with the major components (compiler, kernel,
|
||||||
|
and so on) of the operating system on which the executable runs, unless that
|
||||||
|
component itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering access to
|
||||||
|
copy from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place counts as distribution of the source code,
|
||||||
|
even though third parties are not compelled to copy the source along with
|
||||||
|
the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program except as
|
||||||
|
expressly provided under this License. Any attempt otherwise to copy,
|
||||||
|
modify, sublicense or distribute the Program is void, and will automatically
|
||||||
|
terminate your rights under this License. However, parties who have received
|
||||||
|
copies, or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not signed
|
||||||
|
it. However, nothing else grants you permission to modify or distribute the
|
||||||
|
Program or its derivative works. These actions are prohibited by law if you
|
||||||
|
do not accept this License. Therefore, by modifying or distributing the
|
||||||
|
Program (or any work based on the Program), you indicate your acceptance of
|
||||||
|
this License to do so, and all its terms and conditions for copying,
|
||||||
|
distributing or modifying the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the original
|
||||||
|
licensor to copy, distribute or modify the Program subject to these terms
|
||||||
|
and conditions. You may not impose any further restrictions on the
|
||||||
|
recipients' exercise of the rights granted herein. You are not responsible
|
||||||
|
for enforcing compliance by third parties to this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot distribute so
|
||||||
|
as to satisfy simultaneously your obligations under this License and any
|
||||||
|
other pertinent obligations, then as a consequence you may not distribute
|
||||||
|
the Program at all. For example, if a patent license would not permit
|
||||||
|
royalty-free redistribution of the Program by all those who receive copies
|
||||||
|
directly or indirectly through you, then the only way you could satisfy both
|
||||||
|
it and this License would be to refrain entirely from distribution of the
|
||||||
|
Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply and
|
||||||
|
the section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any patents
|
||||||
|
or other property right claims or to contest validity of any such claims;
|
||||||
|
this section has the sole purpose of protecting the integrity of the free
|
||||||
|
software distribution system, which is implemented by public license
|
||||||
|
practices. Many people have made generous contributions to the wide range of
|
||||||
|
software distributed through that system in reliance on consistent
|
||||||
|
application of that system; it is up to the author/donor to decide if he or
|
||||||
|
she is willing to distribute software through any other system and a
|
||||||
|
licensee cannot impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to be a
|
||||||
|
consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in certain
|
||||||
|
countries either by patents or by copyrighted interfaces, the original
|
||||||
|
copyright holder who places the Program under this License may add an
|
||||||
|
explicit geographical distribution limitation excluding those countries, so
|
||||||
|
that distribution is permitted only in or among countries not thus excluded.
|
||||||
|
In such case, this License incorporates the limitation as if written in the
|
||||||
|
body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the General Public License from time to time. Such new versions will be
|
||||||
|
similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free programs
|
||||||
|
whose distribution conditions are different, write to the author to ask for
|
||||||
|
permission. For software which is copyrighted by the Free Software
|
||||||
|
Foundation, write to the Free Software Foundation; we sometimes make
|
||||||
|
exceptions for this. Our decision will be guided by the two goals of
|
||||||
|
preserving the free status of all derivatives of our free software and of
|
||||||
|
promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||||
|
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO
|
||||||
|
THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM
|
||||||
|
PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
|
||||||
|
CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
|
||||||
|
LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
|
||||||
|
THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest possible
|
||||||
|
use to the public, the best way to achieve this is to make it free software
|
||||||
|
which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest to
|
||||||
|
attach them to the start of each source file to most effectively convey the
|
||||||
|
exclusion of warranty; and each file should have at least the "copyright"
|
||||||
|
line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
one line to give the program's name and an idea of what it does.
|
||||||
|
Copyright (C) 19yy name of author
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this when
|
||||||
|
it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
|
||||||
|
type `show w'. This is free software, and you are welcome
|
||||||
|
to redistribute it under certain conditions; type `show c'
|
||||||
|
for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may be
|
||||||
|
called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright
|
||||||
|
interest in the program `Gnomovision'
|
||||||
|
(which makes passes at compilers) written
|
||||||
|
by James Hacker.
|
||||||
|
|
||||||
|
signature of Ty Coon, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General Public
|
||||||
|
License instead of this License.
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
#
|
||||||
|
# Makefile for Starlanes
|
||||||
|
#
|
||||||
|
CC=/usr/bin/gcc
|
||||||
|
#CCOPTS=-Wall
|
||||||
|
CCOPTS=-O2
|
||||||
|
CURSESLIB=ncurses
|
||||||
|
INSTALLDIR=/usr/local
|
||||||
|
|
||||||
|
all: starlanes
|
||||||
|
|
||||||
|
clean: *.o starlanes
|
||||||
|
rm -f *.o starlanes
|
||||||
|
|
||||||
|
ai.o: ai.c common.h
|
||||||
|
$(CC) -g $(CCOPTS) -c ai.c
|
||||||
|
|
||||||
|
starlanes.o: starlanes.c ai.c common.h
|
||||||
|
$(CC) -g $(CCOPTS) -c starlanes.c
|
||||||
|
|
||||||
|
starlanes: starlanes.o ai.o
|
||||||
|
$(CC) -g starlanes.o ai.o -o starlanes -l$(CURSESLIB)
|
||||||
|
|
||||||
|
install:
|
||||||
|
cp starlanes $(INSTALLDIR)/bin
|
||||||
|
cp starlanes.6 $(INSTALLDIR)/man/man6/
|
||||||
|
chown bin:bin $(INSTALLDIR)/bin/starlanes
|
||||||
|
chown root:root $(INSTALLDIR)/man/man6/starlanes.6
|
||||||
|
chmod 755 $(INSTALLDIR)/bin/starlanes
|
||||||
|
chmod 444 $(INSTALLDIR)/man/man6/starlanes.6
|
||||||
|
|
||||||
|
# fakeinstall just echos the install commands:
|
||||||
|
fakeinstall:
|
||||||
|
@echo cp starlanes $(INSTALLDIR)/bin
|
||||||
|
@echo cp starlanes.6 $(INSTALLDIR)/man/man6
|
||||||
|
@echo chown bin:bin $(INSTALLDIR)/bin/starlanes
|
||||||
|
@echo chown root:root $(INSTALLDIR)/man/man6/starlanes.6
|
||||||
|
@echo chmod 755 $(INSTALLDIR)/bin/starlanes
|
||||||
|
@echo chmod 444 $(INSTALLDIR)/man/man6/starlanes.6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
Type "make" to build the starlanes binaries, then sign on as root
|
||||||
|
an type "make fakeinstall"
|
||||||
|
which will, uh, pretend to install everything. If all the commands that
|
||||||
|
it's going to execute look correct, go ahead and type "make install" (as
|
||||||
|
root) to install the goods.
|
||||||
|
|
||||||
|
I would like to claim that the reason there is no
|
||||||
|
configure file is because for a small program
|
||||||
|
a configure file would be overkill but the
|
||||||
|
truth is that I don't as yet know how to make
|
||||||
|
one. Hence the make file may need adjusting.
|
||||||
|
For instance sometimes the curses program is
|
||||||
|
called plain curses and sometimes ncurses
|
||||||
|
It also expects there to be a /man/man6/ directory
|
||||||
|
in which case you should
|
||||||
|
|
||||||
|
Please, if you have any problems while installing
|
||||||
|
let me, David, know ("dejvid@zamir.net" and
|
||||||
|
"dejvid@barnsdle.demon.co.uk") even if you
|
||||||
|
solve them.
|
||||||
|
|
||||||
|
Of course you can always just change to the directory where
|
||||||
|
you installed starlanes and type "./starlanes"
|
||||||
|
|
||||||
|
David
|
||||||
|
"dejvid@zamir.net" and "dejvid@barnsdle.demon.co.uk"
|
||||||
|
|
||||||
|
This is a port to C from a version of Starlanes for the Osborne 1. The
|
||||||
|
original source is from a First Osborne Group (FOG) disk that I probably
|
||||||
|
picked up in 1982. The author isn't identified. Based on comments in
|
||||||
|
a TRS-80 version I picked up off the web, it would appear that it was
|
||||||
|
first published in Creative Computing magazine.
|
||||||
|
|
||||||
|
-Beej
|
||||||
|
beej@ecst.csuchico.edu
|
||||||
|
|
|
@ -0,0 +1,383 @@
|
||||||
|
/* Artificial Inteligence -anything in relation to non human players */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This program is free software; you can redistribute it and/or
|
||||||
|
** modify it under the terms of the GNU General Public License
|
||||||
|
** as published by the Free Software Foundation; either version 2
|
||||||
|
** of the License, or (at your option) any later version.
|
||||||
|
**
|
||||||
|
** This program is distributed in the hope that it will be useful,
|
||||||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
** GNU General Public License for more details.
|
||||||
|
**
|
||||||
|
** You should have received a copy of the GNU General Public License
|
||||||
|
** along with this program; if not, write to the Free Software
|
||||||
|
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
int move;
|
||||||
|
char map[120]; */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
**void generate_nme(nme)
|
||||||
|
**used in place of getting name from humans
|
||||||
|
*/
|
||||||
|
#define up_obj(move) (((move)-MAPX < 0)?OFFMAP:map[(move)-MAPX])
|
||||||
|
#define down_obj(move) (((move)+MAPX >= MAPX*MAPY)?OFFMAP:map[(move)+MAPX])
|
||||||
|
#define left_obj(move) (((move)%MAPX)?map[(move)-1]:OFFMAP)
|
||||||
|
#define right_obj(move) (((move)%MAPX == MAPX-1)?OFFMAP:map[(move)+1])
|
||||||
|
|
||||||
|
void generate_nme(char *nme)
|
||||||
|
{
|
||||||
|
static int nmeNmr=0;
|
||||||
|
|
||||||
|
switch(nmeNmr) {
|
||||||
|
case 0: strcpy(nme, "Vorg");break;
|
||||||
|
case 1: strcpy(nme, "Zhara");break;
|
||||||
|
case 2: strcpy(nme, "Dushan");break;
|
||||||
|
case 3: strcpy(nme, "Peko Pekovich");break;
|
||||||
|
case 4: strcpy(nme, "Agram Anastija");break;
|
||||||
|
default: strcpy(nme, "Man with no name");break;
|
||||||
|
};
|
||||||
|
nmeNmr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum compass { North,East ,West,South } ;//type;
|
||||||
|
|
||||||
|
enum farcompass {NorthW , FNorth, NorthE, FEast ,SouthE ,FSouth, SouthW ,FWest};// type;
|
||||||
|
|
||||||
|
enum investstatus { none,small ,signif,main };// type;
|
||||||
|
|
||||||
|
/* getfarmove gets the charecter value of a location 2 steps away.
|
||||||
|
** It makes no distiction between an empty space and an off map
|
||||||
|
** location
|
||||||
|
*/
|
||||||
|
char getfarmove(enum farcompass fcom, char *map, int loc)
|
||||||
|
{
|
||||||
|
static int MAPX=Mx ;
|
||||||
|
static int MAPY=My;
|
||||||
|
char ch;
|
||||||
|
switch(fcom) {
|
||||||
|
case NorthW: if ((loc-1*MAPX )< 0) ch=SPACE;
|
||||||
|
else {
|
||||||
|
ch=left_obj(loc-1*MAPX);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FNorth: if ((loc-2*MAPX )< 0) ch=SPACE; else ch=map[loc-2*MAPX];break;
|
||||||
|
case NorthE: if ((loc-1*MAPX )< 0) ch=SPACE;
|
||||||
|
else {
|
||||||
|
ch=right_obj(loc-1*MAPX);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FEast: if ((loc%MAPX)!=((loc+2)%MAPX)) ch=map[loc+2];
|
||||||
|
else ch=SPACE ;
|
||||||
|
break;
|
||||||
|
case SouthE: if ((loc+MAPX )> (MAPX*MAPY)) ch=SPACE;
|
||||||
|
else {
|
||||||
|
ch=right_obj(loc+1*MAPX);
|
||||||
|
}
|
||||||
|
case FSouth: if ((loc+2*MAPX) > (MAPX*MAPY)) ch=SPACE; else ch=map[loc-2*MAPX];break;
|
||||||
|
/*(((loc)+2*MAPX > MAPX*MAPY)?SPACE:map[(loc)+2*MAPX]);break;*/
|
||||||
|
case SouthW: if ((loc+MAPX )> (MAPX*MAPY)) ch=SPACE;
|
||||||
|
else {
|
||||||
|
ch=left_obj(loc+1*MAPX);
|
||||||
|
}
|
||||||
|
case FWest: if ((loc%MAPX)!=((loc-2)%MAPX)) ch=map[loc-2];
|
||||||
|
else ch=SPACE ;
|
||||||
|
break;
|
||||||
|
/*if ((loc%MAPX)!=(loc-2)%MAPX))) ch=map[(loc)-2];else ch=SPACE;break;*/
|
||||||
|
default: ch= '?';break;
|
||||||
|
};
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum compass revdir(enum compass dir)
|
||||||
|
{
|
||||||
|
enum compass rev;
|
||||||
|
switch(dir) {
|
||||||
|
case North:rev=South; break;
|
||||||
|
case East:rev=West; break;
|
||||||
|
case West:rev=East; break;
|
||||||
|
case South:rev=North; break;
|
||||||
|
}
|
||||||
|
return rev;
|
||||||
|
}
|
||||||
|
|
||||||
|
int onestep(enum compass dir, int loc)
|
||||||
|
{
|
||||||
|
int newloc;
|
||||||
|
switch(dir) {
|
||||||
|
case North:if ((loc)-Mx < 0) newloc=-1;
|
||||||
|
else newloc=loc-Mx;
|
||||||
|
break;
|
||||||
|
case South:if ((loc)+Mx > Mx*My) newloc=-1;
|
||||||
|
else newloc=loc+Mx;
|
||||||
|
break;
|
||||||
|
case West: if ((loc)%Mx ==0)newloc=-1;
|
||||||
|
else newloc=loc-1;
|
||||||
|
break;
|
||||||
|
case East: if ((loc)%Mx ==Mx-1)newloc=-1;
|
||||||
|
else newloc=loc+1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return newloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** placemove( move)
|
||||||
|
** place move is passed the location of the numbers
|
||||||
|
** that appear on the screen to humans and selects one of these
|
||||||
|
** locations for the computer players move
|
||||||
|
*/
|
||||||
|
|
||||||
|
char placemove(PLAYER *pla,int *move, COMPANY *co, int turn,char *map, int Difficulty)
|
||||||
|
{
|
||||||
|
static int MAPX=Mx ,MAPY=My;
|
||||||
|
char mvch; long moveval[NUMMOVES]; int neighb[4];int nc, ncom;
|
||||||
|
enum compass dir;
|
||||||
|
enum investstatus curst[NUMCO];
|
||||||
|
double coholdings[NUMCO]; double tothold[NUMCO];int curpl;
|
||||||
|
char locs[South];
|
||||||
|
int seed,intchar ,mvop,curCo,curMax,
|
||||||
|
smallC,bigC; /*this is for the implications of each move */
|
||||||
|
long bgain,sgain; /* gains in mergers */
|
||||||
|
|
||||||
|
mvch= '1';
|
||||||
|
curMax=-1000;
|
||||||
|
if ((Difficulty>1 )||(rand()%100>50))
|
||||||
|
for (curCo=0;curCo<=NUMCO;curCo++){
|
||||||
|
tothold[curCo] =0;
|
||||||
|
/*finds the proportion of holdings relativ to other players*/
|
||||||
|
for (curpl=0;curpl<MAXPLAYERS;curpl++)
|
||||||
|
tothold[curCo]=pla[curpl].holdings[curCo] +tothold[curCo];
|
||||||
|
if (tothold[curCo]==0) coholdings[curCo]=0;
|
||||||
|
else coholdings[curCo]=pla[turn].holdings[curCo]/tothold[curCo];
|
||||||
|
}
|
||||||
|
for (curCo=0;curCo<=NUMCO;curCo++){
|
||||||
|
if (pla[turn].holdings[curCo]>0) curst[curCo]=signif;
|
||||||
|
else curst[curCo]=none;
|
||||||
|
}
|
||||||
|
if ((Difficulty>1 )||(rand()%100>50))
|
||||||
|
for (mvop=0;mvop<=4;mvop++){
|
||||||
|
seed=0;
|
||||||
|
locs[North] = up_obj(move[mvop]);
|
||||||
|
locs[South] = down_obj(move[mvop]);
|
||||||
|
locs[West] = left_obj(move[mvop]);
|
||||||
|
locs[East] = right_obj(move[mvop]);
|
||||||
|
moveval[mvop]=NEWCOCOST;
|
||||||
|
ncom=0;
|
||||||
|
for(dir=North;dir<=South;dir++){
|
||||||
|
if (locs[dir]== STAR) moveval[mvop]=moveval[mvop]+STARCOST ;
|
||||||
|
if (locs[dir]== BLACKHOLE) moveval[mvop]=moveval[mvop]+BLACKHOLECOST ;
|
||||||
|
if (locs[dir]== NEWCO) {
|
||||||
|
moveval[mvop]=moveval[mvop]+NEWCOCOST ;
|
||||||
|
}
|
||||||
|
if iscompany(locs[dir]) {
|
||||||
|
nc=locs[dir]-'A';
|
||||||
|
if ((ncom==0)||(nc!=neighb[1])){
|
||||||
|
ncom++; /* todo add for cases when 3 co ajacent*/
|
||||||
|
neighb[ncom]= nc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ncom==0) if (moveval[mvop]>100) moveval[mvop]*=FOUNDER_BONUS; else moveval[mvop]=0 ;
|
||||||
|
/*need to check here whether company eliminated by black hole */
|
||||||
|
else if (ncom==1){
|
||||||
|
/*if company next door and holding is minimal then value will be reversed*/
|
||||||
|
moveval[mvop]=moveval[mvop]*( coholdings[neighb[1]]-0.25)*tothold[ncom];
|
||||||
|
}
|
||||||
|
else if (ncom>1){
|
||||||
|
/*calculate value of merger*/
|
||||||
|
smallC=1;
|
||||||
|
bigC=1;
|
||||||
|
for (curCo=2;curCo<=ncom;curCo++){
|
||||||
|
if (co[neighb[curCo]].price<co[neighb[smallC]].price)
|
||||||
|
smallC= curCo;
|
||||||
|
if (co[neighb[curCo]].price>co[neighb[bigC]].price)
|
||||||
|
bigC= curCo;
|
||||||
|
}
|
||||||
|
sgain=co[neighb[smallC]].price*tothold[neighb[smallC]]*
|
||||||
|
(coholdings[neighb[smallC]]-0.25)/2;/*bonus*/
|
||||||
|
sgain+=co[bigC].price*tothold[neighb[smallC]]*
|
||||||
|
(coholdings[neighb[smallC]]-0.25);
|
||||||
|
bgain=(moveval[mvop]+co[neighb[smallC]].price)*
|
||||||
|
tothold[neighb[bigC]]*(coholdings[neighb[bigC]]-0.25);
|
||||||
|
moveval[mvop]=sgain+bgain;
|
||||||
|
|
||||||
|
}
|
||||||
|
if (moveval[mvop]>curMax) {
|
||||||
|
intchar= mvop +(int)'1';
|
||||||
|
mvch= (char) intchar;
|
||||||
|
curMax=moveval[mvop] ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else mvch=1;
|
||||||
|
return mvch;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** distantblackhole starts at the black hole, moves two away and then
|
||||||
|
** looks at the three ajacent points for companies. It then increases
|
||||||
|
** the risk factor for any companies found. It isn't
|
||||||
|
** always able to detect when the route between the black hole
|
||||||
|
** and company is blocked so sometimes sees a risk that isn't there.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void distantblackhole(COMPANY *co,char *map,int loc)
|
||||||
|
{
|
||||||
|
int step,cloc;
|
||||||
|
enum compass dir,end;
|
||||||
|
int neighb[4], ncom, new,isnew,curCo;
|
||||||
|
|
||||||
|
for (dir=North;dir<=South;dir++){
|
||||||
|
step =onestep(dir, loc);
|
||||||
|
if (step>-1) if (map[step]==SPACE){
|
||||||
|
step =onestep(dir, step);
|
||||||
|
ncom=0;
|
||||||
|
if (step>-1) if (!(iscompany(map[step]))) for (end=North;end<=South;end++)
|
||||||
|
if (end!=revdir(dir)){ /*point ajacent bh checked elsewhere*/
|
||||||
|
cloc= onestep(end, step);
|
||||||
|
if iscompany(map[cloc]) {
|
||||||
|
new=map[cloc]-'A';
|
||||||
|
isnew=1;
|
||||||
|
curCo=0;
|
||||||
|
while ((curCo<=ncom) && (isnew==1)){
|
||||||
|
if (curCo==ncom) /* no need to check if co already found if first */
|
||||||
|
neighb[curCo]=new;
|
||||||
|
else if (neighb[curCo]==new) isnew=0;
|
||||||
|
curCo++;
|
||||||
|
}
|
||||||
|
if (isnew==1) {
|
||||||
|
ncom++;
|
||||||
|
neighb[curCo]=new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curCo=1;
|
||||||
|
while (curCo<=ncom){
|
||||||
|
co[neighb[curCo]].risk+= BLACKHOLECOST/2;
|
||||||
|
curCo++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
**ai_buy_sell not only choses the most promising investments but
|
||||||
|
**actually executes the sales
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ai_buy_sell(PLAYER *pl, COMPANY *co, int turn,char *map, int Difficulty)
|
||||||
|
{
|
||||||
|
int curloc,curCo,BuyCo,SecCo,amt ;
|
||||||
|
static int MAPX=Mx , MAPY=My;
|
||||||
|
int localpt, localris;
|
||||||
|
enum compass dir;
|
||||||
|
int neighb[4];
|
||||||
|
int nc, ncom,smallC,bigC;
|
||||||
|
char locs[South];
|
||||||
|
|
||||||
|
for(curCo=0;curCo<NUMCO;curCo++) { /*reset values*/
|
||||||
|
co[curCo].potential=co[curCo].risk=0;
|
||||||
|
}
|
||||||
|
for (curloc=1;curloc<=(Mx*My);curloc++){
|
||||||
|
if (map[curloc]==BLACKHOLE) distantblackhole(co,map,curloc);
|
||||||
|
if (map[curloc]==SPACE);{
|
||||||
|
locs[North] = up_obj(curloc); /*get the chars of the 4 ajacent points*/
|
||||||
|
locs[South] = down_obj(curloc);
|
||||||
|
locs[West] = left_obj(curloc);
|
||||||
|
locs[East] = right_obj(curloc);
|
||||||
|
localris=0;
|
||||||
|
localpt=NEWCOCOST; /*the gain from the point itself */
|
||||||
|
for(dir=North;dir<=South;dir++){
|
||||||
|
if (locs[dir]== STAR) localpt=localpt+STARCOST ;/*First check the value or */
|
||||||
|
if ((Difficulty>2 )||(rand()%100>50))
|
||||||
|
if (locs[dir]== BLACKHOLE)
|
||||||
|
localris=localris+BLACKHOLECOST;/*loss from the point*/
|
||||||
|
if (locs[dir]== NEWCO) localpt=localpt+NEWCOCOST ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ncom=0;
|
||||||
|
for(dir=North;dir<=South;dir++){ /*Then add those values to the potetial of companies*/
|
||||||
|
if (iscompany(locs[dir])) { /*that are in the vicinity */
|
||||||
|
nc=locs[dir]-'A';
|
||||||
|
if ((ncom==0)||(nc!=neighb[1])){
|
||||||
|
ncom++; /* todo add for cases when 3 co ajacent*/
|
||||||
|
neighb[ncom]= nc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ncom==1 ){
|
||||||
|
co[nc].potential=co[nc].potential+localpt;
|
||||||
|
co[nc].risk=co[nc].risk+localris;
|
||||||
|
}
|
||||||
|
else if (ncom>1){
|
||||||
|
smallC=1;
|
||||||
|
bigC=1;
|
||||||
|
for (curCo=2;curCo<=ncom;curCo++){
|
||||||
|
if (co[neighb[curCo]].price<co[neighb[smallC]].price)
|
||||||
|
smallC= curCo;
|
||||||
|
if (co[neighb[curCo]].price>co[neighb[bigC]].price)
|
||||||
|
bigC= curCo;
|
||||||
|
}
|
||||||
|
/* bonus ignored for now*/
|
||||||
|
co[neighb[bigC]].potential=co[neighb[bigC]].potential+(co[neighb[smallC]].price);
|
||||||
|
co[neighb[smallC]].potential=co[neighb[smallC]].potential+co[neighb[bigC]].price/2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SecCo=BuyCo=-1 ;
|
||||||
|
for(curCo=0;curCo<NUMCO;curCo++) /*Find the co with greatest potential*/
|
||||||
|
if (co[curCo].price>0) {
|
||||||
|
co[curCo].netpot=(co[curCo].potential+co[curCo].risk)/
|
||||||
|
(co[curCo].price);
|
||||||
|
if ((co[curCo].netpot>0)){
|
||||||
|
if (BuyCo==-1) BuyCo=curCo;
|
||||||
|
else {
|
||||||
|
if (co[curCo].netpot>co[BuyCo].netpot) {
|
||||||
|
SecCo=BuyCo;
|
||||||
|
BuyCo=curCo;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (SecCo==-1) SecCo=curCo;
|
||||||
|
else if (co[curCo].netpot>co[SecCo].netpot)
|
||||||
|
SecCo=curCo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((Difficulty>2 )||((Difficulty>1 )&&(rand()%100>50)) )
|
||||||
|
for(curCo=0;curCo<NUMCO;curCo++){ /*sell all*/
|
||||||
|
pl[turn].cash += pl[turn].holdings[curCo]*co[curCo].price;
|
||||||
|
pl[turn].holdings[curCo]=0;
|
||||||
|
}
|
||||||
|
if (BuyCo>-1){ /*now buy shares in the company with the best prospects*/
|
||||||
|
if (co[BuyCo].risk<0) { /*don't put all your eggs into one basket*/
|
||||||
|
amt= pl[turn].cash/(co[BuyCo].price*2);
|
||||||
|
pl[turn].cash += (-amt * co[BuyCo].price);
|
||||||
|
pl[turn].holdings[BuyCo] += amt;
|
||||||
|
if (SecCo>-1){
|
||||||
|
amt= pl[turn].cash/co[SecCo].price;
|
||||||
|
pl[turn].cash += (-amt * co[SecCo].price);
|
||||||
|
pl[turn].holdings[SecCo] += amt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
amt= pl[turn].cash/co[BuyCo].price;
|
||||||
|
pl[turn].cash += (-amt * co[BuyCo].price);
|
||||||
|
pl[turn].holdings[BuyCo] += amt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
Version 1.3.0 released 2004 by David Barnsdale
|
||||||
|
dejvid@barnsdle.demon.co.uk and dejvid@zamir.net
|
||||||
|
|
||||||
|
AI implemented. All AI related stuff placed in "ai.c".
|
||||||
|
|
||||||
|
Information screen giving holdings of all players added.
|
||||||
|
|
||||||
|
Bug caused by player earning excess money removed.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.2.2 released 1997 by Brian "Beej" Hall
|
||||||
|
"beej@ecst.csuchico.edu"
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
** This program is free software; you can redistribute it and/or
|
||||||
|
** modify it under the terms of the GNU General Public License
|
||||||
|
** as published by the Free Software Foundation; either version 2
|
||||||
|
** of the License, or (at your option) any later version.
|
||||||
|
**
|
||||||
|
** This program is distributed in the hope that it will be useful,
|
||||||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
** GNU General Public License for more details.
|
||||||
|
**
|
||||||
|
** You should have received a copy of the GNU General Public License
|
||||||
|
** along with this program; if not, write to the Free Software
|
||||||
|
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define OFFMAP '-' /* space character */
|
||||||
|
#define SPACE '.' /* space character */
|
||||||
|
#define NEWCO '+' /* new company character */
|
||||||
|
#define STAR '*' /* star character */
|
||||||
|
#define BLACKHOLE '@' /* black hole character */
|
||||||
|
|
||||||
|
#define NUMCO 5 /* number of companies (don't change) */
|
||||||
|
#define INIT_CO_COST 100 /* initial company start cost */
|
||||||
|
#define FOUNDER_BONUS 5 /* founder gets this much stock */
|
||||||
|
#define NUMMOVES 5 /* number of moves options a player gets */
|
||||||
|
#define MAXPLAYERS 4 /* total number of players a game can have */
|
||||||
|
#define STARCOST 500 /* company's price increase near star */
|
||||||
|
#define BLACKHOLECOST -500 /* price increase near black hole */
|
||||||
|
#define NEWCOCOST 100 /* company's price increase near new co */
|
||||||
|
|
||||||
|
|
||||||
|
#define Mx 12 /* x dimension of map */
|
||||||
|
#define My 10 /* y dimension of map */
|
||||||
|
|
||||||
|
/* macros to look at surrounding spaces on the map: */
|
||||||
|
|
||||||
|
|
||||||
|
#define iscompany(c) ((c)>='A'&&(c)<='Z')
|
||||||
|
#define ripe(c) ((c)==STAR||(c)==NEWCO)
|
||||||
|
#define co_near(move) (iscompany(up_obj(move))||iscompany(down_obj(move))||iscompany(left_obj(move))||iscompany(right_obj(move)))
|
||||||
|
#define s_or_bh(c) ((c)==SPACE||(c)==BLACKHOLE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* player and company structures: */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char name[100];
|
||||||
|
int holdings[NUMCO];
|
||||||
|
long int svalue; /* stock value -- not always accurate!! */
|
||||||
|
long int cash;
|
||||||
|
int ishuman;
|
||||||
|
} PLAYER;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char name[100];
|
||||||
|
int price;
|
||||||
|
int size;
|
||||||
|
int potential;
|
||||||
|
int risk; /* value related to chance of being swallowed by Black Hole */
|
||||||
|
int netpot; /* potential - risk */
|
||||||
|
} COMPANY;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,425 @@
|
||||||
|
.TH STARLANES 6 "29 March 1996" "Starlanes V1.2.2"
|
||||||
|
.SH NAME
|
||||||
|
starlanes \- the game of starlanes
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.BR "starlanes " [ -v | c | m ]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B Starlanes
|
||||||
|
is a game of interstellar commerce for 1 to 4 players. Players take
|
||||||
|
two-phase turns: the first phase is movement, the second is trading.
|
||||||
|
.PP
|
||||||
|
The object of the game is to become as wealthy as possible by trading
|
||||||
|
and merging companies whilst out-smarting your friends and enemies.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP 5
|
||||||
|
-v
|
||||||
|
Print version information
|
||||||
|
.TP 5
|
||||||
|
-c
|
||||||
|
Force the game to play in color mode
|
||||||
|
.TP 5
|
||||||
|
-m
|
||||||
|
Force the game to play in mono mode
|
||||||
|
.SH PLAYING STARLANES
|
||||||
|
.SS The Starlanes User Interface
|
||||||
|
.B Starlanes
|
||||||
|
is written using color ncurses, but will detect a black and white
|
||||||
|
screen and will modify its output accordingly. On Linux, setting
|
||||||
|
.B TERM=console
|
||||||
|
or
|
||||||
|
.B TERM=linux
|
||||||
|
either on a virtual console or in a
|
||||||
|
.B color_xterm
|
||||||
|
window works well.
|
||||||
|
.PP
|
||||||
|
After the initial player determination screen, you will be presented
|
||||||
|
with the main
|
||||||
|
.B Starlanes
|
||||||
|
screen. This screen is split into three individual windows: the
|
||||||
|
.BR "map window" ,
|
||||||
|
the
|
||||||
|
.BR "company window" ,
|
||||||
|
and the
|
||||||
|
.BR "general info window" .
|
||||||
|
.PP
|
||||||
|
The
|
||||||
|
.B map window
|
||||||
|
shows the terrain of the universe. The legend is:
|
||||||
|
.PP
|
||||||
|
.RS
|
||||||
|
.BR * " - Star"
|
||||||
|
.br
|
||||||
|
.BR @ " - Black hole"
|
||||||
|
.br
|
||||||
|
.BR + " - Infant company"
|
||||||
|
.br
|
||||||
|
.BR . " - Empty space"
|
||||||
|
.br
|
||||||
|
.BR A
|
||||||
|
- Company A (Altair Starways)
|
||||||
|
.RE
|
||||||
|
.PP
|
||||||
|
The companies are
|
||||||
|
.BR "Altair Starways" ,
|
||||||
|
.BR "Beetlejuice Ltd." ,
|
||||||
|
.BR "Capella Freight Co." ,
|
||||||
|
.BR "Denebola Shippers" ,
|
||||||
|
and
|
||||||
|
.BR "Eridani Expediters" .
|
||||||
|
On the map, the companies are represented by the first letter of their
|
||||||
|
name.
|
||||||
|
.PP
|
||||||
|
The
|
||||||
|
.B company window
|
||||||
|
shows information concerning the currently existing companies,
|
||||||
|
including the company name, its price per share, and the current
|
||||||
|
player's holdings.
|
||||||
|
.PP
|
||||||
|
The
|
||||||
|
.B general info window
|
||||||
|
will prompt the user for input if the player is waiting to move or
|
||||||
|
trade, but will also display special announcements as they come up.
|
||||||
|
During a player's turn, that player's name is displayed in the title
|
||||||
|
bar of the window, along with his cash holdings.
|
||||||
|
.PP
|
||||||
|
Also, mention should be made of two other windows: the
|
||||||
|
.B player standings window
|
||||||
|
and the
|
||||||
|
.B company detail window
|
||||||
|
(not to be confused with the
|
||||||
|
.BR "company info window" .)
|
||||||
|
.PP
|
||||||
|
The
|
||||||
|
.B player standings window
|
||||||
|
can be brought up during the player's move by pressing the
|
||||||
|
.RB ' s '
|
||||||
|
key. This window shows all the player's names, stock holdings, cash,
|
||||||
|
and total worth, sorted by total worth. It also shows the number of
|
||||||
|
sectors that remain to be filled by companies before the game ends.
|
||||||
|
.PP
|
||||||
|
The
|
||||||
|
.B company detail window
|
||||||
|
is invoked with the
|
||||||
|
.RB ' c '
|
||||||
|
key. It shows, for each active company, its name, price per share,
|
||||||
|
size, and total worth (all player's shares * price per share). The
|
||||||
|
company size and total worth are useful in determining the result of a
|
||||||
|
.B merger
|
||||||
|
(see below.)
|
||||||
|
.PP
|
||||||
|
If a screen redraw is necessary, pressing
|
||||||
|
.RB ' ^L '
|
||||||
|
at almost any of the prompts will accomplish that.
|
||||||
|
.PP
|
||||||
|
Finally, if the players want to
|
||||||
|
.B quit
|
||||||
|
before the game before is over, press
|
||||||
|
.RB ' q '
|
||||||
|
or
|
||||||
|
.RB ' ^C '
|
||||||
|
and a quit verification window will pop up. If
|
||||||
|
.RB ' y '
|
||||||
|
is pressed, the final game standings will be displayed, and the
|
||||||
|
program will end.
|
||||||
|
.SS Player Movement
|
||||||
|
During the first phase of a player's turn, the computer will prompt
|
||||||
|
for a move from a choice of 5. These moves are chosen randomly (for
|
||||||
|
the most part). Upon making your move, there are several things that
|
||||||
|
might happen. (NOTE: it is important to remember that two objects on
|
||||||
|
the map are adjacent
|
||||||
|
.I only
|
||||||
|
if they are orthogonally adjacent. Diagonals
|
||||||
|
.B don't
|
||||||
|
count!)
|
||||||
|
.PP
|
||||||
|
If you move into a sector that is completely surrounded by empty space
|
||||||
|
.RB ( . ),
|
||||||
|
that sector will then contain an infant company
|
||||||
|
.RB ( + ).
|
||||||
|
.PP
|
||||||
|
If you move next to an existing company
|
||||||
|
.RB ( A - E ),
|
||||||
|
that company will expand into that sector of the map. If the new
|
||||||
|
extension of the company touches an infant company
|
||||||
|
.RB ( + ),
|
||||||
|
that infant company will also be assimilated.
|
||||||
|
.PP
|
||||||
|
Given that you're not moving next to an existing company, if you move next
|
||||||
|
to a star
|
||||||
|
.RB ( * )
|
||||||
|
or an infant company
|
||||||
|
.RB ( + ),
|
||||||
|
a new company will be formed. You, as company founder, will receive
|
||||||
|
.B 5
|
||||||
|
shares in the company for free. For calculating how much a company
|
||||||
|
will be worth, see
|
||||||
|
.BR "Company Pricing" ,
|
||||||
|
below.
|
||||||
|
.PP
|
||||||
|
If you happen to move next to a black hole
|
||||||
|
.RB ( @ ),
|
||||||
|
one of many things could happen, depending on the circumstances. See
|
||||||
|
.BR "Black Holes" ,
|
||||||
|
below.
|
||||||
|
.SS Company Pricing
|
||||||
|
Determining a company's price per share is fairly simple. Generally
|
||||||
|
speaking, a company is worth
|
||||||
|
.B $100
|
||||||
|
for every sector it occupies (as given on the
|
||||||
|
.B "company info window"
|
||||||
|
under ``Size''), plus
|
||||||
|
.BR $500
|
||||||
|
for every sector it occupies which is adjacent to a star
|
||||||
|
.RB ( * ),
|
||||||
|
minus
|
||||||
|
.BR $500
|
||||||
|
for every sector it occupies which is adjacent to a black hole
|
||||||
|
.RB ( @ ).
|
||||||
|
If a
|
||||||
|
company's price per share drops to 0 or less, the company vanishes
|
||||||
|
(see
|
||||||
|
.BR "Black Holes" ,
|
||||||
|
below.) Also note that you will not be able to visually estimate a
|
||||||
|
company's price per share if that company has undergone a stock split
|
||||||
|
(see
|
||||||
|
.BR "Stock Splits" ,
|
||||||
|
below.)
|
||||||
|
.SS Holding Bonus
|
||||||
|
Immediately after a player's move, he is awarded a cash bonus equal to
|
||||||
|
.B 5%
|
||||||
|
of the total worth of his complete holdings. This bonus is awarded
|
||||||
|
even if the game ends directly following the move (see
|
||||||
|
.BR "Game's End" ,
|
||||||
|
below.) This is the cash that the player will then use during the
|
||||||
|
trading phase (see
|
||||||
|
.BR Trading ,
|
||||||
|
below.)
|
||||||
|
.SS Trading
|
||||||
|
If any companies exist after a player moves on the map, that player
|
||||||
|
will be given the chance to buy and sell stock. This is where the
|
||||||
|
game is really played. One must determine which companies are going
|
||||||
|
to earn the highest profits in the next round and invest in those
|
||||||
|
companies more heavily than ones that only have a small chance of turning a
|
||||||
|
profit. (See
|
||||||
|
.BR Strategy ,
|
||||||
|
below.) The current player's cash value is printed next to his name
|
||||||
|
in the
|
||||||
|
.B general info window
|
||||||
|
title.
|
||||||
|
.PP
|
||||||
|
Use the arrow keys to select a company you wish to trade stock in,
|
||||||
|
then press
|
||||||
|
.BR return .
|
||||||
|
You will be asked for an amount to trade. Enter the number of shares
|
||||||
|
you wish to purchase in this company. (Just press
|
||||||
|
.B return
|
||||||
|
again or enter
|
||||||
|
.RB `` 0 ''
|
||||||
|
if you don't really want to trade with this company.)
|
||||||
|
Choose a negative amount if you want to sell shares (at
|
||||||
|
.B 100%
|
||||||
|
of their value.) At this point, the user can also press the
|
||||||
|
.RB ' m '
|
||||||
|
key to purchase the maximum number of shares possible, or press the
|
||||||
|
.RB ' n '
|
||||||
|
key to sell all of his holdings in this company.
|
||||||
|
.PP
|
||||||
|
Once the player has completed trading, he can press
|
||||||
|
.B escape
|
||||||
|
to end his turn, thereby transferring control to the next player.
|
||||||
|
.SS Mergers
|
||||||
|
When a player chooses a sector of the map that would cause two or
|
||||||
|
more companies to touch, a
|
||||||
|
.B merger
|
||||||
|
occurs.
|
||||||
|
.PP
|
||||||
|
First, the companies sizes are checked
|
||||||
|
and the company with the larger size absorbs the smaller.
|
||||||
|
.PP
|
||||||
|
If the companies are the same size, the company with the highest total
|
||||||
|
worth absorbs the smaller.
|
||||||
|
(The user can view company size and company total worth on the
|
||||||
|
.BR "company detail window" ,
|
||||||
|
see above.)
|
||||||
|
.PP
|
||||||
|
Finally, if both company sizes and total worths match, the companies
|
||||||
|
will merge at random.
|
||||||
|
.PP
|
||||||
|
If a three or four-way
|
||||||
|
.B merger
|
||||||
|
occurs, the merges will take place one at a time, in an order that is
|
||||||
|
somewhat clockwise.
|
||||||
|
.PP
|
||||||
|
After a
|
||||||
|
.BR merger ,
|
||||||
|
each player will have half the number of shares of
|
||||||
|
held in the vanquished company added to the number of shares held in the
|
||||||
|
still-existing company. The value of the still-existing company's
|
||||||
|
price per share will increase by the vanquished company's
|
||||||
|
price per share.
|
||||||
|
.PP
|
||||||
|
Additionally, each player receives a cash bonus equal to
|
||||||
|
.PP
|
||||||
|
.RS
|
||||||
|
.RB "10 * " "stock price" " * " "holdings percentage" ,
|
||||||
|
.RE
|
||||||
|
.PP
|
||||||
|
where
|
||||||
|
.B stock price
|
||||||
|
is the old price per share of the vanquished company and
|
||||||
|
.B holdings percentage
|
||||||
|
is the percentage of total stock once owned in the vanquished company.
|
||||||
|
For example, imagine that
|
||||||
|
.B Altair Starways
|
||||||
|
(worth
|
||||||
|
.B $500
|
||||||
|
per share) is merged into
|
||||||
|
.BR "Denebola Shippers" .
|
||||||
|
Also, assume that the player owned
|
||||||
|
.B 50%
|
||||||
|
of the total shares in
|
||||||
|
.BR "Altair Starways" .
|
||||||
|
Using the formula, that player would receive a bonus of
|
||||||
|
.PP
|
||||||
|
.RS
|
||||||
|
.RB "10 * " $500 " * " 50% " = " $2,500 .
|
||||||
|
.RE
|
||||||
|
.PP
|
||||||
|
For more hints on how to deal with
|
||||||
|
.BR mergers ,
|
||||||
|
see
|
||||||
|
.BR Strategy ,
|
||||||
|
below.
|
||||||
|
.SS Stock Splits
|
||||||
|
When a company's price per share climbs above
|
||||||
|
.BR $3,000 ,
|
||||||
|
a
|
||||||
|
.B stock split
|
||||||
|
occurs. All player holdings in that company are doubled, and the
|
||||||
|
price per share is halved. See
|
||||||
|
.BR Strategy ,
|
||||||
|
below, for money making tips during and after stock splits.
|
||||||
|
.SS Black Holes
|
||||||
|
Since
|
||||||
|
.B black holes
|
||||||
|
drain
|
||||||
|
.B $500
|
||||||
|
from any company that is in contact with them, it is possible that the
|
||||||
|
company's price per share will drop to 0 or less. If this happens,
|
||||||
|
the entire company is sucked out of space and all player holdings are
|
||||||
|
lost.
|
||||||
|
.PP
|
||||||
|
If a player attempts to place an infant company
|
||||||
|
.RB ( + )
|
||||||
|
near a
|
||||||
|
.BR "black hole " ( @ ),
|
||||||
|
that infant company will be immediately sucked up, resulting again in
|
||||||
|
an empty sector.
|
||||||
|
.PP
|
||||||
|
Likewise, if a player attempts to start a new company that would
|
||||||
|
normally be worth $500 or less per share next to a
|
||||||
|
.BR "black hole" ,
|
||||||
|
the sectors that the new company would have occupied all become empty
|
||||||
|
space
|
||||||
|
.RB ( . ).
|
||||||
|
.PP
|
||||||
|
For some ways to make
|
||||||
|
.B black holes
|
||||||
|
work to your advantage, see
|
||||||
|
.BR Strategy ,
|
||||||
|
below.
|
||||||
|
.SS Game's End
|
||||||
|
The game ends when
|
||||||
|
.B 54%
|
||||||
|
of the map is filled with companies (about
|
||||||
|
.B 70
|
||||||
|
sectors.) The player who made the final move receives his
|
||||||
|
.B 5%
|
||||||
|
holdings bonus (see
|
||||||
|
.BR "Holding Bonus" ,
|
||||||
|
above) and the final standings window is displayed. The player with
|
||||||
|
the highest total worth is the winner.
|
||||||
|
.SS Strategy
|
||||||
|
In order to maximize your profits, you must wisely invent your cash.
|
||||||
|
For instance, if a company is near a black hole, it is likely that it
|
||||||
|
will lose $500 per share in the next few rounds. Likewise, if a
|
||||||
|
company is near a star, it might soon have a $500 gain.
|
||||||
|
.PP
|
||||||
|
Also, the
|
||||||
|
larger the company, the greater that chance that it will be added onto
|
||||||
|
(just because it takes up more room on the map.) If you own 300
|
||||||
|
shares in a company, and its value goes up by $100 per share, that's a
|
||||||
|
$30,000 increase in your net worth.
|
||||||
|
.PP
|
||||||
|
Another thing to watch for is when companies are about to merge.
|
||||||
|
Remember that the number of shares you own in the smaller company will
|
||||||
|
be halved before being added to the bigger one when they merge. This
|
||||||
|
can be used to your advantage, especially if the smaller company is
|
||||||
|
worth significantly less than the larger. If the big company is worth
|
||||||
|
$2,000 per share, and the small is worth $200 per share, you can buy 10
|
||||||
|
times as many shares in the smaller. When the companies merge, the
|
||||||
|
number of shares in the smaller company is halved, but it's still 5
|
||||||
|
times the amount of stock you could've purchased in the larger company.
|
||||||
|
.PP
|
||||||
|
Don't forget that when two companies merge, the players receive a cash
|
||||||
|
bonus that depends on the percentage of stock they owned in the
|
||||||
|
smaller company (see
|
||||||
|
.BR Mergers ,
|
||||||
|
above.) It is good to try to own a higher percentage than anyone
|
||||||
|
else.
|
||||||
|
.PP
|
||||||
|
A way to gain profit earning potential is to have a large number of
|
||||||
|
shares in a company when the stock splits two-for-one (see
|
||||||
|
.BR "Stock Splits" ,
|
||||||
|
above.) Even though your initial net worth remains the same after a
|
||||||
|
stock split, you'll now increase your net worth by twice the value you
|
||||||
|
used to whenever the company's price per share rises. Also, if your
|
||||||
|
opponent has 100 shares and you have 150 before the split, that'll
|
||||||
|
change to 200 shares and 300 shares, effectively increasing your lead
|
||||||
|
in shares by 100%.
|
||||||
|
.PP
|
||||||
|
Black holes weren't present in the original game, but were added to
|
||||||
|
give players who have fallen behind a chance to shaft the leaders. If
|
||||||
|
your opponent owns 100 shares of Altair Starways and you only own 50,
|
||||||
|
you can extend the company against a black hole. Your opponent will
|
||||||
|
lose $50,000 from his net worth, but you'll only lose $25,000.
|
||||||
|
.PP
|
||||||
|
Finally, a reminder to invest as much money as you possible can each
|
||||||
|
round (unless it's too risky.) The reason for this is the 5% cash
|
||||||
|
bonus all players receive each round based on their holdings (see
|
||||||
|
.BR "Holdings Bonus" ,
|
||||||
|
above.) Your cash earns you no interest.
|
||||||
|
.SH FILES
|
||||||
|
.I /usr/local/games/starlanes
|
||||||
|
.br
|
||||||
|
.I /usr/local/man/man6/starlanes.6
|
||||||
|
.SH AUTHOR
|
||||||
|
This version of
|
||||||
|
.B Starlanes
|
||||||
|
was written and is Copyright (C) by Brian
|
||||||
|
.RB `` Beej ''
|
||||||
|
Hall 1995-1997. The author can be reached at
|
||||||
|
.BR beej@ecst.csuchico.edu .
|
||||||
|
.B Starlanes
|
||||||
|
comes with ABSOLUTELY NO WARRANTY. This is
|
||||||
|
free software, and you are welcome to redistribute it under certain
|
||||||
|
conditions; read the file
|
||||||
|
.I COPYING
|
||||||
|
for details.
|
||||||
|
.SH ACKNOWLEDGMENTS
|
||||||
|
I'd like to thank the unnamed authors of the original Starlanes for
|
||||||
|
creating such a thought provoking and fun to play text-based game. I
|
||||||
|
got my first copy on a First Osborne Group (FOG) disk in what must have
|
||||||
|
been 1982 or so, and used to spend endless hours playing against my
|
||||||
|
friends. For us, the game is just as fun as ever. To the original
|
||||||
|
authors, I salute you!
|
||||||
|
.SH BUGS
|
||||||
|
There are no computer controlled players.
|
||||||
|
.PP
|
||||||
|
Doesn't respond if ^Z is pressed to suspend the game.
|
||||||
|
.PP
|
||||||
|
If only one person is playing, he or she will frequently make enough
|
||||||
|
money to break the fixed-field-length windows and/or cause the
|
||||||
|
variable that holds player cash to overflow. Try to keep your
|
||||||
|
earnings under $2 billion until I convert these variables to long
|
||||||
|
doubles. :-)
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,396 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STARLANES(6) STARLANES(6)
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
starlanes - the game of starlanes
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
starlanes [-v|c|m]
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Starlanes is a game of interstellar commerce for 1 to 4
|
||||||
|
players. Players take two-phase turns: the first phase is
|
||||||
|
movement, the second is trading.
|
||||||
|
|
||||||
|
The object of the game is to become as wealthy as possible
|
||||||
|
by trading and merging companies whilst out-smarting your
|
||||||
|
friends and enemies.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
-v Print version information
|
||||||
|
|
||||||
|
-c Force the game to play in color mode
|
||||||
|
|
||||||
|
-m Force the game to play in mono mode
|
||||||
|
|
||||||
|
PLAYING STARLANES
|
||||||
|
The Starlanes User Interface
|
||||||
|
Starlanes is written using color ncurses, but will detect
|
||||||
|
a black and white screen and will modify its output
|
||||||
|
accordingly. On Linux, setting TERM=console or TERM=linux
|
||||||
|
either on a virtual console or in a color_xterm window
|
||||||
|
works well.
|
||||||
|
|
||||||
|
After the initial player determination screen, you will be
|
||||||
|
presented with the main Starlanes screen. This screen is
|
||||||
|
split into three individual windows: the map window, the
|
||||||
|
company window, and the general info window.
|
||||||
|
|
||||||
|
The map window shows the terrain of the universe. The
|
||||||
|
legend is:
|
||||||
|
|
||||||
|
* - Star
|
||||||
|
@ - Black hole
|
||||||
|
+ - Infant company
|
||||||
|
. - Empty space
|
||||||
|
A - Company A (Altair Starways)
|
||||||
|
|
||||||
|
The companies are Altair Starways, Beetlejuice Ltd.,
|
||||||
|
Capella Freight Co., Denebola Shippers, and Eridani Expe-
|
||||||
|
diters. On the map, the companies are represented by the
|
||||||
|
first letter of their name.
|
||||||
|
|
||||||
|
The company window shows information concerning the cur-
|
||||||
|
rently existing companies, including the company name, its
|
||||||
|
price per share, and the current player's holdings.
|
||||||
|
|
||||||
|
The general info window will prompt the user for input if
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Starlanes V1.2.2 29 March 1996 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STARLANES(6) STARLANES(6)
|
||||||
|
|
||||||
|
|
||||||
|
the player is waiting to move or trade, but will also dis-
|
||||||
|
play special announcements as they come up. During a
|
||||||
|
player's turn, that player's name is displayed in the
|
||||||
|
title bar of the window, along with his cash holdings.
|
||||||
|
|
||||||
|
Also, mention should be made of two other windows: the
|
||||||
|
player standings window and the company detail window (not
|
||||||
|
to be confused with the company info window.)
|
||||||
|
|
||||||
|
The player standings window can be brought up during the
|
||||||
|
player's move by pressing the 's' key. This window shows
|
||||||
|
all the player's names, stock holdings, cash, and total
|
||||||
|
worth, sorted by total worth. It also shows the number of
|
||||||
|
sectors that remain to be filled by companies before the
|
||||||
|
game ends.
|
||||||
|
|
||||||
|
The company detail window is invoked with the 'c' key. It
|
||||||
|
shows, for each active company, its name, price per share,
|
||||||
|
size, and total worth (all player's shares * price per
|
||||||
|
share). The company size and total worth are useful in
|
||||||
|
determining the result of a merger (see below.)
|
||||||
|
|
||||||
|
If a screen redraw is necessary, pressing '^L' at almost
|
||||||
|
any of the prompts will accomplish that.
|
||||||
|
|
||||||
|
Finally, if the players want to quit before the game
|
||||||
|
before is over, press 'q' or '^C' and a quit verification
|
||||||
|
window will pop up. If 'y' is pressed, the final game
|
||||||
|
standings will be displayed, and the program will end.
|
||||||
|
|
||||||
|
Player Movement
|
||||||
|
During the first phase of a player's turn, the computer
|
||||||
|
will prompt for a move from a choice of 5. These moves
|
||||||
|
are chosen randomly (for the most part). Upon making your
|
||||||
|
move, there are several things that might happen. (NOTE:
|
||||||
|
it is important to remember that two objects on the map
|
||||||
|
are adjacent only if they are orthogonally adjacent.
|
||||||
|
Diagonals don't count!)
|
||||||
|
|
||||||
|
If you move into a sector that is completely surrounded by
|
||||||
|
empty space (.), that sector will then contain an infant
|
||||||
|
company (+).
|
||||||
|
|
||||||
|
If you move next to an existing company (A-E), that com-
|
||||||
|
pany will expand into that sector of the map. If the new
|
||||||
|
extension of the company touches an infant company (+),
|
||||||
|
that infant company will also be assimilated.
|
||||||
|
|
||||||
|
Given that you're not moving next to an existing company,
|
||||||
|
if you move next to a star (*) or an infant company (+), a
|
||||||
|
new company will be formed. You, as company founder, will
|
||||||
|
receive 5 shares in the company for free. For calculating
|
||||||
|
how much a company will be worth, see Company Pricing,
|
||||||
|
below.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Starlanes V1.2.2 29 March 1996 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STARLANES(6) STARLANES(6)
|
||||||
|
|
||||||
|
|
||||||
|
If you happen to move next to a black hole (@), one of
|
||||||
|
many things could happen, depending on the circumstances.
|
||||||
|
See Black Holes, below.
|
||||||
|
|
||||||
|
Company Pricing
|
||||||
|
Determining a company's price per share is fairly simple.
|
||||||
|
Generally speaking, a company is worth $100 for every sec-
|
||||||
|
tor it occupies (as given on the company info window under
|
||||||
|
``Size''), plus $500 for every sector it occupies which is
|
||||||
|
adjacent to a star (*), minus $500 for every sector it
|
||||||
|
occupies which is adjacent to a black hole (@). If a com-
|
||||||
|
pany's price per share drops to 0 or less, the company
|
||||||
|
vanishes (see Black Holes, below.) Also note that you
|
||||||
|
will not be able to visually estimate a company's price
|
||||||
|
per share if that company has undergone a stock split (see
|
||||||
|
Stock Splits, below.)
|
||||||
|
|
||||||
|
Holding Bonus
|
||||||
|
Immediately after a player's move, he is awarded a cash
|
||||||
|
bonus equal to 5% of the total worth of his complete hold-
|
||||||
|
ings. This bonus is awarded even if the game ends
|
||||||
|
directly following the move (see Game's End, below.) This
|
||||||
|
is the cash that the player will then use during the trad-
|
||||||
|
ing phase (see Trading, below.)
|
||||||
|
|
||||||
|
Trading
|
||||||
|
If any companies exist after a player moves on the map,
|
||||||
|
that player will be given the chance to buy and sell
|
||||||
|
stock. This is where the game is really played. One must
|
||||||
|
determine which companies are going to earn the highest
|
||||||
|
profits in the next round and invest in those companies
|
||||||
|
more heavily than ones that only have a small chance of
|
||||||
|
turning a profit. (See Strategy, below.) The current
|
||||||
|
player's cash value is printed next to his name in the
|
||||||
|
general info window title.
|
||||||
|
|
||||||
|
Use the arrow keys to select a company you wish to trade
|
||||||
|
stock in, then press return. You will be asked for an
|
||||||
|
amount to trade. Enter the number of shares you wish to
|
||||||
|
purchase in this company. (Just press return again or
|
||||||
|
enter ``0'' if you don't really want to trade with this
|
||||||
|
company.) Choose a negative amount if you want to sell
|
||||||
|
shares (at 100% of their value.) At this point, the user
|
||||||
|
can also press the 'm' key to purchase the maximum number
|
||||||
|
of shares possible, or press the 'n' key to sell all of
|
||||||
|
his holdings in this company.
|
||||||
|
|
||||||
|
Once the player has completed trading, he can press escape
|
||||||
|
to end his turn, thereby transferring control to the next
|
||||||
|
player.
|
||||||
|
|
||||||
|
Mergers
|
||||||
|
When a player chooses a sector of the map that would cause
|
||||||
|
two or more companies to touch, a merger occurs.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Starlanes V1.2.2 29 March 1996 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STARLANES(6) STARLANES(6)
|
||||||
|
|
||||||
|
|
||||||
|
First, the companies sizes are checked and the company
|
||||||
|
with the larger size absorbs the smaller.
|
||||||
|
|
||||||
|
If the companies are the same size, the company with the
|
||||||
|
highest total worth absorbs the smaller. (The user can
|
||||||
|
view company size and company total worth on the company
|
||||||
|
detail window, see above.)
|
||||||
|
|
||||||
|
Finally, if both company sizes and total worths match, the
|
||||||
|
companies will merge at random.
|
||||||
|
|
||||||
|
If a three or four-way merger occurs, the merges will take
|
||||||
|
place one at a time, in an order that is somewhat clock-
|
||||||
|
wise.
|
||||||
|
|
||||||
|
After a merger, each player will have half the number of
|
||||||
|
shares of held in the vanquished company added to the num-
|
||||||
|
ber of shares held in the still-existing company. The
|
||||||
|
value of the still-existing company's price per share will
|
||||||
|
increase by the vanquished company's price per share.
|
||||||
|
|
||||||
|
Additionally, each player receives a cash bonus equal to
|
||||||
|
|
||||||
|
10 * stock price * holdings percentage,
|
||||||
|
|
||||||
|
where stock price is the old price per share of the van-
|
||||||
|
quished company and holdings percentage is the percentage
|
||||||
|
of total stock once owned in the vanquished company. For
|
||||||
|
example, imagine that Altair Starways (worth $500 per
|
||||||
|
share) is merged into Denebola Shippers. Also, assume
|
||||||
|
that the player owned 50% of the total shares in Altair
|
||||||
|
Starways. Using the formula, that player would receive a
|
||||||
|
bonus of
|
||||||
|
|
||||||
|
10 * $500 * 50% = $2,500.
|
||||||
|
|
||||||
|
For more hints on how to deal with mergers, see Strategy,
|
||||||
|
below.
|
||||||
|
|
||||||
|
Stock Splits
|
||||||
|
When a company's price per share climbs above $3,000, a
|
||||||
|
stock split occurs. All player holdings in that company
|
||||||
|
are doubled, and the price per share is halved. See
|
||||||
|
Strategy, below, for money making tips during and after
|
||||||
|
stock splits.
|
||||||
|
|
||||||
|
Black Holes
|
||||||
|
Since black holes drain $500 from any company that is in
|
||||||
|
contact with them, it is possible that the company's price
|
||||||
|
per share will drop to 0 or less. If this happens, the
|
||||||
|
entire company is sucked out of space and all player hold-
|
||||||
|
ings are lost.
|
||||||
|
|
||||||
|
If a player attempts to place an infant company (+) near a
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Starlanes V1.2.2 29 March 1996 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STARLANES(6) STARLANES(6)
|
||||||
|
|
||||||
|
|
||||||
|
black hole (@), that infant company will be immediately
|
||||||
|
sucked up, resulting again in an empty sector.
|
||||||
|
|
||||||
|
Likewise, if a player attempts to start a new company that
|
||||||
|
would normally be worth $500 or less per share next to a
|
||||||
|
black hole, the sectors that the new company would have
|
||||||
|
occupied all become empty space (.).
|
||||||
|
|
||||||
|
For some ways to make black holes work to your advantage,
|
||||||
|
see Strategy, below.
|
||||||
|
|
||||||
|
Game's End
|
||||||
|
The game ends when 54% of the map is filled with companies
|
||||||
|
(about 70 sectors.) The player who made the final move
|
||||||
|
receives his 5% holdings bonus (see Holding Bonus, above)
|
||||||
|
and the final standings window is displayed. The player
|
||||||
|
with the highest total worth is the winner.
|
||||||
|
|
||||||
|
Strategy
|
||||||
|
In order to maximize your profits, you must wisely invent
|
||||||
|
your cash. For instance, if a company is near a black
|
||||||
|
hole, it is likely that it will lose $500 per share in the
|
||||||
|
next few rounds. Likewise, if a company is near a star,
|
||||||
|
it might soon have a $500 gain.
|
||||||
|
|
||||||
|
Also, the larger the company, the greater that chance that
|
||||||
|
it will be added onto (just because it takes up more room
|
||||||
|
on the map.) If you own 300 shares in a company, and its
|
||||||
|
value goes up by $100 per share, that's a $30,000 increase
|
||||||
|
in your net worth.
|
||||||
|
|
||||||
|
Another thing to watch for is when companies are about to
|
||||||
|
merge. Remember that the number of shares you own in the
|
||||||
|
smaller company will be halved before being added to the
|
||||||
|
bigger one when they merge. This can be used to your
|
||||||
|
advantage, especially if the smaller company is worth sig-
|
||||||
|
nificantly less than the larger. If the big company is
|
||||||
|
worth $2,000 per share, and the small is worth $200 per
|
||||||
|
share, you can buy 10 times as many shares in the smaller.
|
||||||
|
When the companies merge, the number of shares in the
|
||||||
|
smaller company is halved, but it's still 5 times the
|
||||||
|
amount of stock you could've purchased in the larger com-
|
||||||
|
pany.
|
||||||
|
|
||||||
|
Don't forget that when two companies merge, the players
|
||||||
|
receive a cash bonus that depends on the percentage of
|
||||||
|
stock they owned in the smaller company (see Mergers,
|
||||||
|
above.) It is good to try to own a higher percentage than
|
||||||
|
anyone else.
|
||||||
|
|
||||||
|
A way to gain profit earning potential is to have a large
|
||||||
|
number of shares in a company when the stock splits two-
|
||||||
|
for-one (see Stock Splits, above.) Even though your ini-
|
||||||
|
tial net worth remains the same after a stock split,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Starlanes V1.2.2 29 March 1996 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STARLANES(6) STARLANES(6)
|
||||||
|
|
||||||
|
|
||||||
|
you'll now increase your net worth by twice the value you
|
||||||
|
used to whenever the company's price per share rises.
|
||||||
|
Also, if your opponent has 100 shares and you have 150
|
||||||
|
before the split, that'll change to 200 shares and 300
|
||||||
|
shares, effectively increasing your lead in shares by
|
||||||
|
100%.
|
||||||
|
|
||||||
|
Black holes weren't present in the original game, but were
|
||||||
|
added to give players who have fallen behind a chance to
|
||||||
|
shaft the leaders. If your opponent owns 100 shares of
|
||||||
|
Altair Starways and you only own 50, you can extend the
|
||||||
|
company against a black hole. Your opponent will lose
|
||||||
|
$50,000 from his net worth, but you'll only lose $25,000.
|
||||||
|
|
||||||
|
Finally, a reminder to invest as much money as you possi-
|
||||||
|
ble can each round (unless it's too risky.) The reason
|
||||||
|
for this is the 5% cash bonus all players receive each
|
||||||
|
round based on their holdings (see Holdings Bonus, above.)
|
||||||
|
Your cash earns you no interest.
|
||||||
|
|
||||||
|
FILES
|
||||||
|
/usr/local/games/starlanes
|
||||||
|
/usr/local/man/man6/starlanes.6
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
This version of Starlanes was written and is Copyright (C)
|
||||||
|
by Brian ``Beej'' Hall 1995-1997. The author can be
|
||||||
|
reached at beej@ecst.csuchico.edu. Starlanes comes with
|
||||||
|
ABSOLUTELY NO WARRANTY. This is free software, and you
|
||||||
|
are welcome to redistribute it under certain conditions;
|
||||||
|
read the file COPYING for details.
|
||||||
|
|
||||||
|
ACKNOWLEDGMENTS
|
||||||
|
I'd like to thank the unnamed authors of the original
|
||||||
|
Starlanes for creating such a thought provoking and fun to
|
||||||
|
play text-based game. I got my first copy on a First
|
||||||
|
Osborne Group (FOG) disk in what must have been 1982 or
|
||||||
|
so, and used to spend endless hours playing against my
|
||||||
|
friends. For us, the game is just as fun as ever. To the
|
||||||
|
original authors, I salute you!
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
There are no computer controlled players.
|
||||||
|
|
||||||
|
Doesn't respond if ^Z is pressed to suspend the game.
|
||||||
|
|
||||||
|
If only one person is playing, he or she will frequently
|
||||||
|
make enough money to break the fixed-field-length windows
|
||||||
|
and/or cause the variable that holds player cash to over-
|
||||||
|
flow. Try to keep your earnings under $2 billion until I
|
||||||
|
convert these variables to long doubles. :-)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Starlanes V1.2.2 29 March 1996 6
|
||||||
|
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue