Initial revision

vendor
stpohle 23 years ago
commit 5eda6e2fe7

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
GNU GENERAL PUBLIC LICENSE
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 a brief 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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,223 @@
Version 0.9.6
=============
2003-04-23
- better handling with the masterserver menu. If you want to join
a game you don't need anymore to refresh the list.
Because the game will get some updates from the MasterServer.
- You can finaly get more as only one illness. And you can get the
Ill now from another player.
- Some work in the menu.
- In the game you will see now the little Player Graphic left from
the name. It will help you to see who is who in the game.
- Fixed Problem with PI_keys Illness. (that the one with the mixed
up keys)
Version 0.9.5
=============
2003-04-13
- Add: Chatting you are able to chat now.. it's connecting all
running games together into the chat. You will see Chats who
are not from your server beginning with BC: or IRC: depends
who this message come from.
- Better Graphics
- Better Network, the option for how many packets will be send
is chaning within the game. Depends on how much packets timed
out.
4) 2003-04-06
- You can no join into running games.
- Fixed some network bugs. Which had to do with joining and
leaving running games
0-3) 2003-03-29
- internal change for the positions on the field to 16bit.
player moves smother now.
- diffrent screen resolutions
- random player start positions
- the size of the field can be changed
- playergraphic is better now.
- menus are diffrent now.
- configuration is saved in a special file.
on linux $HOME/.bomberclone.cfg
on windows bomberclone.cfg
Version 0.8
===========
0-2) 2003-03-15
- Added two more Powerups (diffrent speeds, and ilness)
- Fixed some problems with the bombes which didn't wanted
to explode.
- Debug-Messages can now be switched off.
this improve the speed in the game on slow computers.
Version 0.7
===========
1) 2003-03-06
- Master GameServer Support, So everyone will see
running games. You don't need to deal anymore with the
Servernames.
- GFX: New Playerfile now we have three diffrent Players
Version 0.6
===========
12) 2003-02-27
- Fixed: The ServerMode Packet will be send with the PKGF_ackreq Flag.
Because sometimes the clients haven't got the packet. And couldn't play
in the game.
- Fixed: Single Player Problem after trying to open a Multiplayer server
is the Single Player mode not working right.. the Player could not die.
- Fixed: Multiplayer, the game was counting the poinbts wrong and there
was always a winner marked even if everybody died.
11) 2003-02-24
- Fixed: bombs which are exploding more times on slow networks.
I had some little misstake in the inpkg_check function.
- I am sending now only needed packages, moving packages will be
only every second time maybe every third time. The user is able
to choose how often the package should be send.
- Finaly there is a playerstatistic in the end of the game.
It will hold the points and who have won the game.
- The game is not ending right there where the last player died.
I put a timeout in the game of 5 seconds. So the last few bombs
will explode.
- pkg_error: will be shown on the screen.
- version controll: old bomberclone versions will be ignored and
they get a error message back.
10) 2003-02-21
- Some work on the Network Protocoll, because there are
still some problems with sending the Data
Version 0.5
===========
9) 2003-02-14
- In Multiplayergames, only the Server will let the
Bombs explode. Manny tests have shown that this
is the best way to prevent some difficults in the
game with the field, bomb and explosion data.
- code optimized in working with struct _sockaddr
because sockaddr_in6 is larger as sockaddr which is
usualy used for all/the most type of network
connection.
5-8) 2003-02-13
- i made some experiments with sending bomb information
and field information over the network.
- created a inpkg_index to check for incoming packets
which we have already got.
4) 2003-02-12
- bomb explosion will be send over the network
3) 2003-02-12
- Better Network Handling
Check for important packages (pkg_field, pkg_bomb)
and send them again. Created a resend_cache.
- Windows: i put now WSAStartup and WASCleanup in the
network_init and network_shutdown function. Windows
User should now able to join more times games without
restarting the game.
- MSVC: moved the function "explosion_check_field"
in file bomb.c out of the function "do_explosion"
and the function "check_field" in file player.c
out of the function "move_player". The same i
have done with "draw_netupdatestate" and
"wait_draw_select". Because MSVC had some
problems with function in function declaration.
Version 0.4
===========
2) 2003-02-11:
- if the server don't reply after a while we will
get back in the join menu.
1) 2003-02-10:
- mouse cursor is not anymore on the windows/screen.
- Fixed: Bomb Under Player Bug
- Build Number is now included.
It will show up in the Main Menu.
2003-02-07:
- Save every sockaddr in the in_pl struct so we don't have to look up
them again and again
- Making changes in the Data Download Sequence.
- Chaning the Network Protocol from TCP to UDP. And putting
everything inside what is needed for a basic work.
- Linux supports IPv6 and IPv4, you can choose it in the settings
- I have got the first animated player for the game.
I hope the next will follow soon.
Version 0.3
===========
- First Try to Compile everything on Windows and Linux.
- Network doesn't work fine with more as two Players and a Windows Client
It works only with more as two players on Linux Systems.
Version 0.2
===========
- Added functions for animations.
- Network Support does now work somehow on Linux
Version 0.1
===========
- You can finally move your player
the bombs are exploding.
- Basic Graphics, just some experiments within the game

@ -0,0 +1,182 @@
Basic Installation
==================
These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, a file
`config.cache' that saves the results of its tests to speed up
reconfiguring, and a file `config.log' containing compiler output
(useful mainly for debugging `configure').
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If at some point `config.cache'
contains results you don't want to keep, you may remove or edit it.
The file `configure.in' is used to create `configure' by a program
called `autoconf'. You only need `configure.in' if you want to change
it or regenerate `configure' using a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using
a Bourne-compatible shell, you can do that on the command line like
this:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
Or on systems that have the `env' program, you can do it like this:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not supports the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory. After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=PATH' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on. Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
CPU-COMPANY-SYSTEM
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.
If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Operation Controls
==================
`configure' recognizes the following options to control how it
operates.
`--cache-file=FILE'
Use and save the results of the tests in FILE instead of
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`configure' also accepts some other, not widely useful, options.

@ -0,0 +1,27 @@
## Process this file with automake to produce Makefile.in
## Created by Anjuta - will be overwritten
## If you don't want it to overwrite it,
## Please disable it in the Anjuta project configuration
SUBDIRS = src
bomberclonedocdir = ${prefix}/doc/bomberclone
bomberclonedoc_DATA = \
README\
COPYING\
AUTHORS\
ChangeLog\
INSTALL\
NEWS\
TODO
EXTRA_DIST = bomberclone.prj $(bomberclonedoc_DATA)
# Copy all the spec files. Of cource, only one is actually used.
dist-hook:
for specfile in *.spec; do \
if test -f $$specfile; then \
cp -p $$specfile $(distdir); \
fi \
done

@ -0,0 +1,450 @@
# Makefile.in generated automatically by automake 1.5 from Makefile.am.
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
AMTAR = @AMTAR@
AWK = @AWK@
CC = @CC@
DEPDIR = @DEPDIR@
EXEEXT = @EXEEXT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
NO_PREFIX_PACKAGE_DATA_DIR = @NO_PREFIX_PACKAGE_DATA_DIR@
NO_PREFIX_PACKAGE_DOC_DIR = @NO_PREFIX_PACKAGE_DOC_DIR@
NO_PREFIX_PACKAGE_HELP_DIR = @NO_PREFIX_PACKAGE_HELP_DIR@
NO_PREFIX_PACKAGE_MENU_DIR = @NO_PREFIX_PACKAGE_MENU_DIR@
NO_PREFIX_PACKAGE_PIXMAPS_DIR = @NO_PREFIX_PACKAGE_PIXMAPS_DIR@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_DATA_DIR = @PACKAGE_DATA_DIR@
PACKAGE_DOC_DIR = @PACKAGE_DOC_DIR@
PACKAGE_HELP_DIR = @PACKAGE_HELP_DIR@
PACKAGE_MENU_DIR = @PACKAGE_MENU_DIR@
PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@
SDL_CFLAGS = @SDL_CFLAGS@
SDL_CONFIG = @SDL_CONFIG@
SDL_LIBS = @SDL_LIBS@
VERSION = @VERSION@
am__include = @am__include@
am__quote = @am__quote@
install_sh = @install_sh@
SUBDIRS = src
bomberclonedocdir = ${prefix}/doc/bomberclone
bomberclonedoc_DATA = \
README\
COPYING\
AUTHORS\
ChangeLog\
INSTALL\
NEWS\
TODO
EXTRA_DIST = bomberclone.prj $(bomberclonedoc_DATA)
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES =
DIST_SOURCES =
DATA = $(bomberclonedoc_DATA)
RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
uninstall-info-recursive all-recursive install-data-recursive \
install-exec-recursive installdirs-recursive install-recursive \
uninstall-recursive check-recursive installcheck-recursive
DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 \
config.h.in configure configure.in depcomp install-sh missing \
mkinstalldirs
DIST_SUBDIRS = $(SUBDIRS)
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
.SUFFIXES:
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && \
CONFIG_HEADERS= CONFIG_LINKS= \
CONFIG_FILES=$@ $(SHELL) ./config.status
$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
cd $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): configure.in
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
config.h: stamp-h
@if test ! -f $@; then \
rm -f stamp-h; \
$(MAKE) stamp-h; \
else :; fi
stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
@rm -f stamp-h stamp-hT
@echo timestamp > stamp-hT 2> /dev/null
cd $(top_builddir) \
&& CONFIG_FILES= CONFIG_HEADERS=config.h \
$(SHELL) ./config.status
@mv stamp-hT stamp-h
$(srcdir)/config.h.in: $(srcdir)/./stamp-h.in
@if test ! -f $@; then \
rm -f $(srcdir)/./stamp-h.in; \
$(MAKE) $(srcdir)/./stamp-h.in; \
else :; fi
$(srcdir)/./stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) $(top_srcdir)/acconfig.h
@rm -f $(srcdir)/./stamp-h.in $(srcdir)/./stamp-h.inT
@echo timestamp > $(srcdir)/./stamp-h.inT 2> /dev/null
cd $(top_srcdir) && $(AUTOHEADER)
@mv $(srcdir)/./stamp-h.inT $(srcdir)/./stamp-h.in
distclean-hdr:
-rm -f config.h
uninstall-info-am:
install-bomberclonedocDATA: $(bomberclonedoc_DATA)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(bomberclonedocdir)
@list='$(bomberclonedoc_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(bomberclonedocdir)/$$f"; \
$(INSTALL_DATA) $$d$$p $(DESTDIR)$(bomberclonedocdir)/$$f; \
done
uninstall-bomberclonedocDATA:
@$(NORMAL_UNINSTALL)
@list='$(bomberclonedoc_DATA)'; for p in $$list; do \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " rm -f $(DESTDIR)$(bomberclonedocdir)/$$f"; \
rm -f $(DESTDIR)$(bomberclonedocdir)/$$f; \
done
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@set fnord $(MAKEFLAGS); amf=$$2; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
@set fnord $(MAKEFLAGS); amf=$$2; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique $(LISP)
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
|| etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP)
GTAGS:
here=`CDPATH=: && cd $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = .
# Avoid unsightly `./'.
distdir = $(PACKAGE)-$(VERSION)
GZIP_ENV = --best
distdir: $(DISTFILES)
-chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
mkdir $(distdir)
@for file in $(DISTFILES); do \
if test -f $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
$(mkinstalldirs) "$(distdir)/$$dir"; \
fi; \
if test -d $$d/$$file; then \
cp -pR $$d/$$file $(distdir) \
|| exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
for subdir in $(SUBDIRS); do \
if test "$$subdir" = .; then :; else \
test -d $(distdir)/$$subdir \
|| mkdir $(distdir)/$$subdir \
|| exit 1; \
(cd $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$(top_distdir)" \
distdir=../$(distdir)/$$subdir \
distdir) \
|| exit 1; \
fi; \
done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="${top_distdir}" distdir="$(distdir)" \
dist-hook
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r $(distdir)
dist: distdir
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
-chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir)
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/=build
mkdir $(distdir)/=inst
chmod a-w $(distdir)
dc_install_base=`CDPATH=: && cd $(distdir)/=inst && pwd` \
&& cd $(distdir)/=build \
&& ../configure --srcdir=.. --prefix=$$dc_install_base \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& (test `find $$dc_install_base -type f -print | wc -l` -le 1 \
|| (echo "Error: files left after uninstall" 1>&2; \
exit 1) ) \
&& $(MAKE) $(AM_MAKEFLAGS) dist \
&& $(MAKE) $(AM_MAKEFLAGS) distclean \
&& rm -f $(distdir).tar.gz \
&& (test `find . -type f -print | wc -l` -eq 0 \
|| (echo "Error: files left after distclean" 1>&2; \
exit 1) )
-chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir)
@echo "$(distdir).tar.gz is ready for distribution" | \
sed 'h;s/./=/g;p;x;p;x'
check-am: all-am
check: check-recursive
all-am: Makefile $(DATA) config.h
installdirs: installdirs-recursive
installdirs-am:
$(mkinstalldirs) $(DESTDIR)$(bomberclonedocdir)
install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-recursive
clean-am: clean-generic mostlyclean-am
dist-all: distdir
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
distclean: distclean-recursive
-rm -f config.status config.cache config.log
distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
dvi: dvi-recursive
dvi-am:
info: info-recursive
info-am:
install-data-am: install-bomberclonedocDATA
install-exec-am:
install-info: install-info-recursive
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-generic
uninstall-am: uninstall-bomberclonedocDATA uninstall-info-am
uninstall-info: uninstall-info-recursive
.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
clean-generic clean-recursive dist dist-all distcheck distclean \
distclean-generic distclean-hdr distclean-recursive \
distclean-tags distdir dvi dvi-am dvi-recursive info info-am \
info-recursive install install-am install-bomberclonedocDATA \
install-data install-data-am install-data-recursive \
install-exec install-exec-am install-exec-recursive \
install-info install-info-am install-info-recursive install-man \
install-recursive install-strip installcheck installcheck-am \
installdirs installdirs-am installdirs-recursive \
maintainer-clean maintainer-clean-generic \
maintainer-clean-recursive mostlyclean mostlyclean-generic \
mostlyclean-recursive tags tags-recursive uninstall \
uninstall-am uninstall-bomberclonedocDATA uninstall-info-am \
uninstall-info-recursive uninstall-recursive
# Copy all the spec files. Of cource, only one is actually used.
dist-hook:
for specfile in *.spec; do \
if test -f $$specfile; then \
cp -p $$specfile $(distdir); \
fi \
done
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

@ -0,0 +1,97 @@
Compilation
===========
Windows:
On Windows i used cygwin with mingw-gcc compiler. (http://www.cygwin.com)
You will even need the Source from the "Simply DirectMedia Layer" Library.
(http://www.libsdl.org/index.php)
1. Install Cygwin and Compile the SDL Library into it.
./configure --prefix=/usr
make
make install
The SDL.DLL file you will find under /usr/lib
2. Compile the Source of BomberClone
./configure
make
if this doesn't work try
aclocal -f
autoheader -f
autoconf -f
automake -a
./configure
make
then run the game with
src/bomberclone.exe
Linux:
if everything goes right, you only need to run
./configure
make
if nothing goes right, you will need :
aclocal
autoheader
autoconf
automake
./configure
make
src/bomberclone
Network
=======
(Ver. 0.3)
The Game uses TCP port 11000, and it needs that other clients can
connect to this port. So check your network configuration.
(Ver. 0.4)
This Version uses only UDP Port 11000, so check it again.. :o)
Animations
==========
How to save the single frames into one big image for the animations
The Dieing sequence will be in version 0.4
Image:
left | right | up | down | dieing
F1 | F1 | F1 | F1 | F1
F2 | F2 | F2 | F2 | F2
F3 | F3 | F3 | F3 | F3
F4 | F4 | F4 | F4 | F4
F5 | F5 | F5 | F5 | F5
Testers
=======
Linux : Marcus, Patty, x-coder
Windows: boogieman, deadlock
Contact
=======
programming : Steffen Pohle stpohle@gmx.net
graphic : TekkRat -no email yet-
You can find us on :
irc://irc.d-t-net.de #programmierer
http://stpohle.bei.t-online.de/bomberclone

@ -0,0 +1,6 @@
- better gfx, more players, a better fire.
- we need some sound
- find better way for menus..

@ -0,0 +1,13 @@
#undef ENABLE_NLS
#undef HAVE_CATGETS
#undef HAVE_GETTEXT
#undef HAVE_LC_MESSAGES
#undef HAVE_STPCPY
#undef HAVE_LIBSM
#undef PACKAGE_LOCALE_DIR
#undef PACKAGE_DOC_DIR
#undef PACKAGE_DATA_DIR
#undef PACKAGE_PIXMAPS_DIR
#undef PACKAGE_HELP_DIR
#undef PACKAGE_MENU_DIR
#undef PACKAGE_SOURCE_DIR

842
aclocal.m4 vendored

@ -0,0 +1,842 @@
# aclocal.m4 generated automatically by aclocal 1.5
# Copyright 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
# Do all the work for Automake. This macro actually does too much --
# some checks are only needed if your package does certain things.
# But this isn't really a big deal.
# serial 5
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
# We require 2.13 because we rely on SHELL being computed by configure.
AC_PREREQ([2.13])
# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
# -----------------------------------------------------------
# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED.
# The purpose of this macro is to provide the user with a means to
# check macros which are provided without letting her know how the
# information is coded.
# If this macro is not defined by Autoconf, define it here.
ifdef([AC_PROVIDE_IFELSE],
[],
[define([AC_PROVIDE_IFELSE],
[ifdef([AC_PROVIDE_$1],
[$2], [$3])])])
# AM_INIT_AUTOMAKE(PACKAGE,VERSION, [NO-DEFINE])
# ----------------------------------------------
AC_DEFUN([AM_INIT_AUTOMAKE],
[AC_REQUIRE([AC_PROG_INSTALL])dnl
# test to see if srcdir already configured
if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" &&
test -f $srcdir/config.status; then
AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])
fi
# Define the identity of the package.
PACKAGE=$1
AC_SUBST(PACKAGE)dnl
VERSION=$2
AC_SUBST(VERSION)dnl
ifelse([$3],,
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])
# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow
# the ones we care about.
ifdef([m4_pattern_allow],
[m4_pattern_allow([^AM_[A-Z]+FLAGS])])dnl
# Autoconf 2.50 always computes EXEEXT. However we need to be
# compatible with 2.13, for now. So we always define EXEEXT, but we
# don't compute it.
AC_SUBST(EXEEXT)
# Similar for OBJEXT -- only we only use OBJEXT if the user actually
# requests that it be used. This is a bit dumb.
: ${OBJEXT=o}
AC_SUBST(OBJEXT)
# Some tools Automake needs.
AC_REQUIRE([AM_SANITY_CHECK])dnl
AC_REQUIRE([AC_ARG_PROGRAM])dnl
AM_MISSING_PROG(ACLOCAL, aclocal)
AM_MISSING_PROG(AUTOCONF, autoconf)
AM_MISSING_PROG(AUTOMAKE, automake)
AM_MISSING_PROG(AUTOHEADER, autoheader)
AM_MISSING_PROG(MAKEINFO, makeinfo)
AM_MISSING_PROG(AMTAR, tar)
AM_PROG_INSTALL_SH
AM_PROG_INSTALL_STRIP
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
AC_REQUIRE([AM_SET_DEPDIR])dnl
AC_PROVIDE_IFELSE([AC_PROG_][CC],
[_AM_DEPENDENCIES(CC)],
[define([AC_PROG_][CC],
defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_][CXX],
[_AM_DEPENDENCIES(CXX)],
[define([AC_PROG_][CXX],
defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl
])
#
# Check to make sure that the build environment is sane.
#
# serial 3
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_MSG_CHECKING([whether build environment is sane])
# Just in case
sleep 1
echo timestamp > conftest.file
# Do `set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
if test "$[*]" = "X"; then
# -L didn't work.
set X `ls -t $srcdir/configure conftest.file`
fi
rm -f conftest.file
if test "$[*]" != "X $srcdir/configure conftest.file" \
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
# If neither matched, then we have a broken ls. This can happen
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
alias in your environment])
fi
test "$[2]" = conftest.file
)
then
# Ok.
:
else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
AC_MSG_RESULT(yes)])
# serial 2
# AM_MISSING_PROG(NAME, PROGRAM)
# ------------------------------
AC_DEFUN([AM_MISSING_PROG],
[AC_REQUIRE([AM_MISSING_HAS_RUN])
$1=${$1-"${am_missing_run}$2"}
AC_SUBST($1)])
# AM_MISSING_HAS_RUN
# ------------------
# Define MISSING if not defined so far and test if it supports --run.
# If it does, set am_missing_run to use it, otherwise, to nothing.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
# Use eval to expand $SHELL
if eval "$MISSING --run true"; then
am_missing_run="$MISSING --run "
else
am_missing_run=
am_backtick='`'
AC_MSG_WARN([${am_backtick}missing' script is too old or missing])
fi
])
# AM_AUX_DIR_EXPAND
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
#
# Of course, Automake must honor this variable whenever it calls a
# tool from the auxiliary directory. The problem is that $srcdir (and
# therefore $ac_aux_dir as well) can be either absolute or relative,
# depending on how configure is run. This is pretty annoying, since
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
# source directory, any form will work fine, but in subdirectories a
# relative path needs to be adjusted first.
#
# $ac_aux_dir/missing
# fails when called from a subdirectory if $ac_aux_dir is relative
# $top_srcdir/$ac_aux_dir/missing
# fails if $ac_aux_dir is absolute,
# fails when called from a subdirectory in a VPATH build with
# a relative $ac_aux_dir
#
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
# are both prefixed by $srcdir. In an in-source build this is usually
# harmless because $srcdir is `.', but things will broke when you
# start a VPATH build or use an absolute $srcdir.
#
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
# and then we would define $MISSING as
# MISSING="\${SHELL} $am_aux_dir/missing"
# This will work as long as MISSING is not called from configure, because
# unfortunately $(top_srcdir) has no meaning in configure.
# However there are other variables, like CC, which are often used in
# configure, and could therefore not use this "fixed" $ac_aux_dir.
#
# Another solution, used here, is to always expand $ac_aux_dir to an
# absolute PATH. The drawback is that using absolute paths prevent a
# configured tree to be moved without reconfiguration.
AC_DEFUN([AM_AUX_DIR_EXPAND], [
# expand $ac_aux_dir to an absolute path
am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd`
])
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
AC_DEFUN([AM_PROG_INSTALL_SH],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
install_sh=${install_sh-"$am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
# One issue with vendor `install' (even GNU) is that you can't
# specify the program used to strip binaries. This is especially
# annoying in cross-compiling environments, where the build's strip
# is unlikely to handle the host's binaries.
# Fortunately install-sh will honor a STRIPPROG variable, so we
# always use install-sh in `make install-strip', and initialize
# STRIPPROG with the value of the STRIP variable (set by the user).
AC_DEFUN([AM_PROG_INSTALL_STRIP],
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
# serial 4 -*- Autoconf -*-
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
# _AM_DEPENDENCIES(NAME)
# ---------------------
# See how the compiler implements dependency checking.
# NAME is "CC", "CXX" or "OBJC".
# We try a few techniques and use that to set a single cache variable.
#
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
# dependency, and given that the user is not expected to run this macro,
# just rely on AC_PROG_CC.
AC_DEFUN([_AM_DEPENDENCIES],
[AC_REQUIRE([AM_SET_DEPDIR])dnl
AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
[$1], CXX, [depcc="$CXX" am_compiler_list=],
[$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc']
[$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
[depcc="$$1" am_compiler_list=])
AC_CACHE_CHECK([dependency style of $depcc],
[am_cv_$1_dependencies_compiler_type],
[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
cp "$am_depcomp" conftest.dir
cd conftest.dir
am_cv_$1_dependencies_compiler_type=none
if test "$am_compiler_list" = ""; then
am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
fi
for depmode in $am_compiler_list; do
# We need to recreate these files for each test, as the compiler may
# overwrite some of them when testing with obscure command lines.
# This happens at least with the AIX C compiler.
echo '#include "conftest.h"' > conftest.c
echo 'int i;' > conftest.h
echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
case $depmode in
nosideeffect)
# after this tag, mechanisms are not by side-effect, so they'll
# only be used when explicitly requested
if test "x$enable_dependency_tracking" = xyes; then
continue
else
break
fi
;;
none) break ;;
esac
# We check with `-c' and `-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
# handle `-M -o', and we need to detect this.
if depmode=$depmode \
source=conftest.c object=conftest.o \
depfile=conftest.Po tmpdepfile=conftest.TPo \
$SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
grep conftest.h conftest.Po > /dev/null 2>&1 &&
${MAKE-make} -s -f confmf > /dev/null 2>&1; then
am_cv_$1_dependencies_compiler_type=$depmode
break
fi
done
cd ..
rm -rf conftest.dir
else
am_cv_$1_dependencies_compiler_type=none
fi
])
$1DEPMODE="depmode=$am_cv_$1_dependencies_compiler_type"
AC_SUBST([$1DEPMODE])
])
# AM_SET_DEPDIR
# -------------
# Choose a directory name for dependency files.
# This macro is AC_REQUIREd in _AM_DEPENDENCIES
AC_DEFUN([AM_SET_DEPDIR],
[rm -f .deps 2>/dev/null
mkdir .deps 2>/dev/null
if test -d .deps; then
DEPDIR=.deps
else
# MS-DOS does not allow filenames that begin with a dot.
DEPDIR=_deps
fi
rmdir .deps 2>/dev/null
AC_SUBST(DEPDIR)
])
# AM_DEP_TRACK
# ------------
AC_DEFUN([AM_DEP_TRACK],
[AC_ARG_ENABLE(dependency-tracking,
[ --disable-dependency-tracking Speeds up one-time builds
--enable-dependency-tracking Do not reject slow dependency extractors])
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
pushdef([subst], defn([AC_SUBST]))
subst(AMDEPBACKSLASH)
popdef([subst])
])
# Generate code to set up dependency tracking.
# This macro should only be invoked once -- use via AC_REQUIRE.
# Usage:
# AM_OUTPUT_DEPENDENCY_COMMANDS
#
# This code is only required when automatic dependency tracking
# is enabled. FIXME. This creates each `.P' file that we will
# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],[
AC_OUTPUT_COMMANDS([
test x"$AMDEP_TRUE" != x"" ||
for mf in $CONFIG_FILES; do
case "$mf" in
Makefile) dirpart=.;;
*/Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;;
*) continue;;
esac
grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
# Extract the definition of DEP_FILES from the Makefile without
# running `make'.
DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
test -z "$DEPDIR" && continue
# When using ansi2knr, U may be empty or an underscore; expand it
U=`sed -n -e '/^U = / s///p' < "$mf"`
test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
# We invoke sed twice because it is the simplest approach to
# changing $(DEPDIR) to its actual value in the expansion.
for file in `sed -n -e '
/^DEP_FILES = .*\\\\$/ {
s/^DEP_FILES = //
:loop
s/\\\\$//
p
n
/\\\\$/ b loop
p
}
/^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`echo "$file" | sed -e 's|/[^/]*$||'`
$ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1
# echo "creating $dirpart/$file"
echo '# dummy' > "$dirpart/$file"
done
done
], [AMDEP_TRUE="$AMDEP_TRUE"
ac_aux_dir="$ac_aux_dir"])])
# AM_MAKE_INCLUDE()
# -----------------
# Check to see how make treats includes.
AC_DEFUN([AM_MAKE_INCLUDE],
[am_make=${MAKE-make}
cat > confinc << 'END'
doit:
@echo done
END
# If we don't find an include directive, just comment out the code.
AC_MSG_CHECKING([for style of include used by $am_make])
am__include='#'
am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
# We grep out `Entering directory' and `Leaving directory'
# messages which can occur if `w' ends up in MAKEFLAGS.
# In particular we don't look at `^make:' because GNU make might
# be invoked under some other name (usually "gmake"), in which
# case it prints its new name instead of `make'.
if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then
am__include=include
am__quote=
_am_result=GNU
fi
# Now try BSD make style include.
if test "$am__include" = "#"; then
echo '.include "confinc"' > confmf
if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
am__include=.include
am__quote='"'
_am_result=BSD
fi
fi
AC_SUBST(am__include)
AC_SUBST(am__quote)
AC_MSG_RESULT($_am_result)
rm -f confinc confmf
])
# serial 3
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
# -------------------------------------
# Define a conditional.
#
# FIXME: Once using 2.50, use this:
# m4_match([$1], [^TRUE\|FALSE$], [AC_FATAL([$0: invalid condition: $1])])dnl
AC_DEFUN([AM_CONDITIONAL],
[ifelse([$1], [TRUE],
[errprint(__file__:__line__: [$0: invalid condition: $1
])dnl
m4exit(1)])dnl
ifelse([$1], [FALSE],
[errprint(__file__:__line__: [$0: invalid condition: $1
])dnl
m4exit(1)])dnl
AC_SUBST([$1_TRUE])
AC_SUBST([$1_FALSE])
if $2; then
$1_TRUE=
$1_FALSE='#'
else
$1_TRUE='#'
$1_FALSE=
fi])
# Like AC_CONFIG_HEADER, but automatically create stamp file.
# serial 3
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. We must strip everything past the first ":",
# and everything past the last "/".
AC_PREREQ([2.12])
AC_DEFUN([AM_CONFIG_HEADER],
[ifdef([AC_FOREACH],dnl
[dnl init our file count if it isn't already
m4_ifndef([_AM_Config_Header_Index], m4_define([_AM_Config_Header_Index], [0]))
dnl prepare to store our destination file list for use in config.status
AC_FOREACH([_AM_File], [$1],
[m4_pushdef([_AM_Dest], m4_patsubst(_AM_File, [:.*]))
m4_define([_AM_Config_Header_Index], m4_incr(_AM_Config_Header_Index))
dnl and add it to the list of files AC keeps track of, along
dnl with our hook
AC_CONFIG_HEADERS(_AM_File,
dnl COMMANDS, [, INIT-CMDS]
[# update the timestamp
echo timestamp >"AS_ESCAPE(_AM_DIRNAME(]_AM_Dest[))/stamp-h]_AM_Config_Header_Index["
][$2]m4_ifval([$3], [, [$3]]))dnl AC_CONFIG_HEADERS
m4_popdef([_AM_Dest])])],dnl
[AC_CONFIG_HEADER([$1])
AC_OUTPUT_COMMANDS(
ifelse(patsubst([$1], [[^ ]], []),
[],
[test -z "$CONFIG_HEADERS" || echo timestamp >dnl
patsubst([$1], [^\([^:]*/\)?.*], [\1])stamp-h]),dnl
[am_indx=1
for am_file in $1; do
case " \$CONFIG_HEADERS " in
*" \$am_file "*)
am_dir=\`echo \$am_file |sed 's%:.*%%;s%[^/]*\$%%'\`
if test -n "\$am_dir"; then
am_tmpdir=\`echo \$am_dir |sed 's%^\(/*\).*\$%\1%'\`
for am_subdir in \`echo \$am_dir |sed 's%/% %'\`; do
am_tmpdir=\$am_tmpdir\$am_subdir/
if test ! -d \$am_tmpdir; then
mkdir \$am_tmpdir
fi
done
fi
echo timestamp > "\$am_dir"stamp-h\$am_indx
;;
esac
am_indx=\`expr \$am_indx + 1\`
done])
])]) # AM_CONFIG_HEADER
# _AM_DIRNAME(PATH)
# -----------------
# Like AS_DIRNAME, only do it during macro expansion
AC_DEFUN([_AM_DIRNAME],
[m4_if(m4_regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1,
m4_if(m4_regexp([$1], [^//\([^/]\|$\)]), -1,
m4_if(m4_regexp([$1], [^/.*]), -1,
[.],
m4_patsubst([$1], [^\(/\).*], [\1])),
m4_patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])),
m4_patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl
]) # _AM_DIRNAME
#serial 1
# This test replaces the one in autoconf.
# Currently this macro should have the same name as the autoconf macro
# because gettext's gettext.m4 (distributed in the automake package)
# still uses it. Otherwise, the use in gettext.m4 makes autoheader
# give these diagnostics:
# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
undefine([AC_ISC_POSIX])
AC_DEFUN([AC_ISC_POSIX],
[
dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
]
)
# serial 1
# @defmac AC_PROG_CC_STDC
# @maindex PROG_CC_STDC
# @ovindex CC
# If the C compiler in not in ANSI C mode by default, try to add an option
# to output variable @code{CC} to make it so. This macro tries various
# options that select ANSI C on some system or another. It considers the
# compiler to be in ANSI C mode if it handles function prototypes correctly.
#
# If you use this macro, you should check after calling it whether the C
# compiler has been set to accept ANSI C; if not, the shell variable
# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source
# code in ANSI C, you can make an un-ANSIfied copy of it by using the
# program @code{ansi2knr}, which comes with Ghostscript.
# @end defmac
AC_DEFUN([AM_PROG_CC_STDC],
[AC_REQUIRE([AC_PROG_CC])
AC_BEFORE([$0], [AC_C_INLINE])
AC_BEFORE([$0], [AC_C_CONST])
dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require
dnl a magic option to avoid problems with ANSI preprocessor commands
dnl like #elif.
dnl FIXME: can't do this because then AC_AIX won't work due to a
dnl circular dependency.
dnl AC_BEFORE([$0], [AC_PROG_CPP])
AC_MSG_CHECKING([for ${CC-cc} option to accept ANSI C])
AC_CACHE_VAL(am_cv_prog_cc_stdc,
[am_cv_prog_cc_stdc=no
ac_save_CC="$CC"
# Don't try gcc -ansi; that turns off useful extensions and
# breaks some systems' header files.
# AIX -qlanglvl=ansi
# Ultrix and OSF/1 -std1
# HP-UX 10.20 and later -Ae
# HP-UX older versions -Aa -D_HPUX_SOURCE
# SVR4 -Xc -D__EXTENSIONS__
for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
AC_TRY_COMPILE(
[#include <stdarg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
char **p;
int i;
{
return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
char *s;
va_list v;
va_start (v,p);
s = g (p, va_arg (v,int));
va_end (v);
return s;
}
int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
], [
return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
],
[am_cv_prog_cc_stdc="$ac_arg"; break])
done
CC="$ac_save_CC"
])
if test -z "$am_cv_prog_cc_stdc"; then
AC_MSG_RESULT([none needed])
else
AC_MSG_RESULT([$am_cv_prog_cc_stdc])
fi
case "x$am_cv_prog_cc_stdc" in
x|xno) ;;
*) CC="$CC $am_cv_prog_cc_stdc" ;;
esac
])
# Configure paths for SDL
# Sam Lantinga 9/21/99
# stolen from Manish Singh
# stolen back from Frank Belew
# stolen from Manish Singh
# Shamelessly stolen from Owen Taylor
dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS
dnl
AC_DEFUN(AM_PATH_SDL,
[dnl
dnl Get the cflags and libraries from the sdl-config script
dnl
AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)],
sdl_prefix="$withval", sdl_prefix="")
AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)],
sdl_exec_prefix="$withval", sdl_exec_prefix="")
AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program],
, enable_sdltest=yes)
if test x$sdl_exec_prefix != x ; then
sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix"
if test x${SDL_CONFIG+set} != xset ; then
SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config
fi
fi
if test x$sdl_prefix != x ; then
sdl_args="$sdl_args --prefix=$sdl_prefix"
if test x${SDL_CONFIG+set} != xset ; then
SDL_CONFIG=$sdl_prefix/bin/sdl-config
fi
fi
AC_REQUIRE([AC_CANONICAL_TARGET])
AC_PATH_PROG(SDL_CONFIG, sdl-config, no)
min_sdl_version=ifelse([$1], ,0.11.0,$1)
AC_MSG_CHECKING(for SDL - version >= $min_sdl_version)
no_sdl=""
if test "$SDL_CONFIG" = "no" ; then
no_sdl=yes
else
SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags`
SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs`
sdl_major_version=`$SDL_CONFIG $sdl_args --version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
if test "x$enable_sdltest" = "xyes" ; then
ac_save_CFLAGS="$CFLAGS"
ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $SDL_CFLAGS"
LIBS="$LIBS $SDL_LIBS"
dnl
dnl Now check if the installed SDL is sufficiently new. (Also sanity
dnl checks the results of sdl-config to some extent
dnl
rm -f conf.sdltest
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SDL.h"
char*
my_strdup (char *str)
{
char *new_str;
if (str)
{
new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
strcpy (new_str, str);
}
else
new_str = NULL;
return new_str;
}
int main (int argc, char *argv[])
{
int major, minor, micro;
char *tmp_version;
/* This hangs on some systems (?)
system ("touch conf.sdltest");
*/
{ FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }
/* HP/UX 9 (%@#!) writes to sscanf strings */
tmp_version = my_strdup("$min_sdl_version");
if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
printf("%s, bad version string\n", "$min_sdl_version");
exit(1);
}
if (($sdl_major_version > major) ||
(($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
(($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
{
return 0;
}
else
{
printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version);
printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro);
printf("*** best to upgrade to the required version.\n");
printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n");
printf("*** to point to the correct copy of sdl-config, and remove the file\n");
printf("*** config.cache before re-running configure\n");
return 1;
}
}
],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
fi
if test "x$no_sdl" = x ; then
AC_MSG_RESULT(yes)
ifelse([$2], , :, [$2])
else
AC_MSG_RESULT(no)
if test "$SDL_CONFIG" = "no" ; then
echo "*** The sdl-config script installed by SDL could not be found"
echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
echo "*** your path, or set the SDL_CONFIG environment variable to the"
echo "*** full path to sdl-config."
else
if test -f conf.sdltest ; then
:
else
echo "*** Could not run SDL test program, checking why..."
CFLAGS="$CFLAGS $SDL_CFLAGS"
LIBS="$LIBS $SDL_LIBS"
AC_TRY_LINK([
#include <stdio.h>
#include "SDL.h"
int main(int argc, char *argv[])
{ return 0; }
#undef main
#define main K_and_R_C_main
], [ return 0; ],
[ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding SDL or finding the wrong"
echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
echo "*** to the installed location Also, make sure you have run ldconfig if that"
echo "*** is required on your system"
echo "***"
echo "*** If you have an old version installed, it is best to remove it, although"
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
[ echo "*** The test program failed to compile or link. See the file config.log for the"
echo "*** exact error that occured. This usually means SDL was incorrectly installed"
echo "*** or that you have moved SDL since it was installed. In the latter case, you"
echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
fi
SDL_CFLAGS=""
SDL_LIBS=""
ifelse([$3], , :, [$3])
fi
AC_SUBST(SDL_CFLAGS)
AC_SUBST(SDL_LIBS)
rm -f conf.sdltest
])

@ -0,0 +1,150 @@
#!/bin/sh
# Run this to generate all the initial makefiles, etc.
srcdir=`dirname $0`
PKG_NAME="the package."
DIE=0
aclocal
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`autoconf' installed to."
echo "Download the appropriate package for your distribution,"
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && {
(libtool --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`libtool' installed."
echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
}
grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && {
grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
(gettext --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`gettext' installed."
echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
}
grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && {
grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
(gettext --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`gettext' installed."
echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
}
(automake --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`automake' installed."
echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
NO_AUTOMAKE=yes
}
# if no automake, don't bother testing for aclocal
test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: Missing \`aclocal'. The version of \`automake'"
echo "installed doesn't appear recent enough."
echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
echo "(or a newer version if it is available)"
DIE=1
}
if test "$DIE" -eq 1; then
exit 1
fi
if test -z "$*"; then
echo "**Warning**: I am going to run \`configure' with no arguments."
echo "If you wish to pass any to it, please specify them on the"
echo \`$0\'" command line."
echo
fi
case $CC in
xlc )
am_opt=--include-deps;;
esac
for coin in `find $srcdir -name configure.in -print`
do
dr=`dirname $coin`
if test -f $dr/NO-AUTO-GEN; then
echo skipping $dr -- flagged as no auto-gen
else
echo processing $dr
macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
( cd $dr
aclocalinclude="$ACLOCAL_FLAGS"
for k in $macrodirs; do
if test -d $k; then
aclocalinclude="$aclocalinclude -I $k"
##else
## echo "**Warning**: No such directory \`$k'. Ignored."
fi
done
if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
if grep "sed.*POTFILES" configure.in >/dev/null; then
: do nothing -- we still have an old unmodified configure.in
else
echo "Creating $dr/aclocal.m4 ..."
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
echo "Running gettextize... Ignore non-fatal messages."
echo "no" | gettextize --force --copy
echo "Making $dr/aclocal.m4 writable ..."
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
fi
fi
if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
echo "Creating $dr/aclocal.m4 ..."
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
echo "Running gettextize... Ignore non-fatal messages."
echo "no" | gettextize --force --copy
echo "Making $dr/aclocal.m4 writable ..."
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
fi
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
echo "Running libtoolize..."
libtoolize --force --copy
fi
echo "Running aclocal $aclocalinclude ..."
aclocal $aclocalinclude
if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
echo "Running autoheader..."
autoheader
fi
echo "Running automake --gnu $am_opt ..."
automake --add-missing --gnu $am_opt
echo "Running autoconf ..."
autoconf
)
fi
done
#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
if test x$NOCONFIGURE = x; then
echo Running $srcdir/configure $conf_flags "$@" ...
$srcdir/configure $conf_flags "$@" \
&& echo Now type \`make\' to compile $PKG_NAME
else
echo Skipping configure process.
fi

@ -0,0 +1,13 @@
resolutionx=640
resolutiony=480
fullscreen=0
ai_family=2
fieldsizex=25
fieldsizey=15
notify=1
debug=0
pkgsend=4
maxplayer=5
masterserver=x.yz.to:11100
selectplayer=1
playername=

@ -0,0 +1,157 @@
# Anjuta Version 0.1.9
Compatibility Level: 1
<PROJECT_DESCRIPTION_START>
it's a Bomberman Clone<PROJECT_DESCRIPTION_END>
<CONFIG_PROGS_START>
<CONFIG_PROGS_END>
<CONFIG_LIBS_START>
dnl Check for SDL
AM_PATH_SDL(1.1.0,
:,
AC_MSG_ERROR(SDL not found. Make sure sdl-config is in your PATH, or specify with --with-sdl-prefix)
)
CFLAGS="$SDL_CFLAGS $CFLAGS"
LIBS="$SDL_LIBS $LIBS"
<CONFIG_LIBS_END>
<CONFIG_HEADERS_START>
<CONFIG_HEADERS_END>
<CONFIG_CHARACTERISTICS_START>
case "$target" in
*-*-cygwin* | *-*-mingw32*)
CFLAGS="$CFLAGS"
LIBS="$LIBS -liberty -lwsock32"
;;
esac
CFLAGS="$CFLAGS -Wall"
<CONFIG_CHARACTERISTICS_END>
<CONFIG_LIB_FUNCS_START>
<CONFIG_LIB_FUNCS_END>
<CONFIG_ADDITIONAL_START>
<CONFIG_ADDITIONAL_END>
<CONFIG_FILES_START>
<CONFIG_FILES_END>
<MAKEFILE_AM_START>
<MAKEFILE_AM_END>
props.file.type=project
anjuta.version=0.1.9
anjuta.compatibility.level=1
project.name=bomberclone
project.type=GENERIC
project.target.type=EXECUTABLE
project.version=0.9
project.author=steffen
project.source.target=bomberclone
project.excluded.modules=
project.has.gettext=0
project.programming.language=C
project.menu.entry=bomberclone Version 0.9
project.menu.group=Games
project.menu.comment=bomberclone Version 0.9
project.menu.icon=
project.menu.need.terminal=0
project.configure.options=
anjuta.program.arguments=
project.config.blocked=0
project.config.disable.overwriting=0 0 1 0 0 0 0 0 0
project.config.extra.modules.before=
project.config.extra.modules.after=
module.include.name=include
module.include.type=
module.include.expanded=0
module.include.files=
module.source.name=src
module.source.type=
module.source.expanded=1
module.source.files=\
main.c\
bomb.c\
bomberclone.h\
debug.c\
packets.c\
font.c\
gfx.c\
player.c\
packets.h\
game.c\
netmenu.c\
network.c\
menu.c\
field.c\
network.h\
configuration.c\
udp.c\
sysfunc.c\
pkgcache.c\
gamesrv.h\
gamesrv.c\
gfx.h\
basic.h\
chat.c\
multiwait.c\
chat.h\
keybinput.c\
keybinput.h
module.pixmap.name=pixmaps
module.pixmap.type=
module.pixmap.expanded=0
module.pixmap.files=
module.data.name=data
module.data.type=
module.data.expanded=0
module.data.files=
module.help.name=help
module.help.type=
module.help.expanded=0
module.help.files=
module.doc.name=doc
module.doc.type=
module.doc.expanded=0
module.doc.files=
module.po.expanded=0
module.po.files=
compiler.options.supports=
compiler.options.include.paths=
compiler.options.library.paths=
compiler.options.libraries=
compiler.options.libraries.selected=
compiler.options.defines=
compiler.options.warning.buttons=0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1
compiler.options.optimize.buttons=0 1 0 0
compiler.options.other.buttons=1 0
compiler.options.other.c.flags=
compiler.options.other.l.flags=
compiler.options.other.l.libs=
project.source.paths=

@ -0,0 +1,51 @@
[executer]
RunInTerminal=false
[Project DBase]
ShowLocals=true
[filenumbers]
0=1028
1=10
2=7
3=477
4=33
5=129
6=370
7=252
8=144
9=8
10=1
[filemarkers]
0=
1=
2=
3=
4=
5=
6=
7=
8=
9=
10=
[replace_text]
0=fieldsize
1=(struct _net_addr *addr
2=struct _net_addr *addr)
3=&addr
[find_text]
0=set_ill
1=playercol
2=GFX INIT
3=gameloop
4=do_playerdata
5=player_die
6=net_pl
7=pingack
[find_in_files]
0=old

@ -0,0 +1,25 @@
/* config.h.in. Generated automatically from configure.in by autoheader 2.13. */
/* Define if you have the ANSI C header files. */
#undef STDC_HEADERS
#undef ENABLE_NLS
#undef HAVE_CATGETS
#undef HAVE_GETTEXT
#undef HAVE_LC_MESSAGES
#undef HAVE_STPCPY
#undef HAVE_LIBSM
#undef PACKAGE_LOCALE_DIR
#undef PACKAGE_DOC_DIR
#undef PACKAGE_DATA_DIR
#undef PACKAGE_PIXMAPS_DIR
#undef PACKAGE_HELP_DIR
#undef PACKAGE_MENU_DIR
#undef PACKAGE_SOURCE_DIR
/* Name of package */
#undef PACKAGE
/* Version number of package */
#undef VERSION

@ -0,0 +1,42 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
configure:569: checking for a BSD compatible install
configure:622: checking whether build environment is sane
configure:693: checking for mawk
configure:723: checking whether make sets ${MAKE}
configure:845: checking for strerror in -lcposix
configure:864: cc -o conftest conftest.c -lcposix 1>&5
/usr/bin/ld: cannot find -lcposix
collect2: ld returned 1 exit status
configure: failed program was:
#line 853 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char strerror();
int main() {
strerror()
; return 0; }
configure:889: checking for gcc
configure:1002: checking whether the C compiler (gcc ) works
configure:1018: gcc -o conftest conftest.c 1>&5
configure:1044: checking whether the C compiler (gcc ) is a cross-compiler
configure:1049: checking whether we are using GNU C
configure:1058: gcc -E conftest.c
configure:1077: checking whether gcc accepts -g
configure:1116: checking for style of include used by make
configure:1150: checking dependency style of gcc
configure:1220: checking for gcc option to accept ANSI C
configure:1274: gcc -c -g -O2 conftest.c 1>&5
configure:1298: checking how to run the C preprocessor
configure:1319: gcc -E conftest.c >/dev/null 2>conftest.out
configure:1378: checking for ANSI C header files
configure:1391: gcc -E conftest.c >/dev/null 2>conftest.out
configure:1458: gcc -o conftest -g -O2 conftest.c 1>&5
configure:1483: checking target system type
configure:1542: checking for sdl-config
configure:1577: checking for SDL - version >= 1.1.0
configure:1662: gcc -o conftest -g -O2 -I/usr/include/SDL -D_REENTRANT conftest.c -L/usr/lib -lSDL -lpthread 1>&5

@ -0,0 +1,366 @@
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host steffenp:
#
# ./configure
#
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.
ac_cs_usage="Usage: ./config.status [--recheck] [--version] [--help]"
for ac_option
do
case "$ac_option" in
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
echo "running ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion"
exec ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
echo "./config.status generated by autoconf version 2.13"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "$ac_cs_usage"; exit 0 ;;
*) echo "$ac_cs_usage"; exit 1 ;;
esac
done
ac_given_srcdir=.
ac_given_INSTALL="/usr/bin/install -c"
trap 'rm -fr
Makefile
src/Makefile
config.h conftest*; exit 1' 1 2 15
# Protect against being on the right side of a sed subst in config.status.
sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g;
s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
/^[ ]*VPATH[ ]*=[^:]*$/d
s%@SHELL@%/bin/sh%g
s%@CFLAGS@%-I/usr/include/SDL -D_REENTRANT -g -O2 -Wall%g
s%@CPPFLAGS@%%g
s%@CXXFLAGS@%%g
s%@FFLAGS@%%g
s%@DEFS@%-DHAVE_CONFIG_H%g
s%@LDFLAGS@%%g
s%@LIBS@%-L/usr/lib -lSDL -lpthread %g
s%@exec_prefix@%${prefix}%g
s%@prefix@%/usr/local%g
s%@program_transform_name@%s,x,x,%g
s%@bindir@%${exec_prefix}/bin%g
s%@sbindir@%${exec_prefix}/sbin%g
s%@libexecdir@%${exec_prefix}/libexec%g
s%@datadir@%${prefix}/share%g
s%@sysconfdir@%${prefix}/etc%g
s%@sharedstatedir@%${prefix}/com%g
s%@localstatedir@%${prefix}/var%g
s%@libdir@%${exec_prefix}/lib%g
s%@includedir@%${prefix}/include%g
s%@oldincludedir@%/usr/include%g
s%@infodir@%${prefix}/info%g
s%@mandir@%${prefix}/man%g
s%@INSTALL_PROGRAM@%${INSTALL}%g
s%@INSTALL_SCRIPT@%${INSTALL_PROGRAM}%g
s%@INSTALL_DATA@%${INSTALL} -m 644%g
s%@PACKAGE@%bomberclone%g
s%@VERSION@%0.9%g
s%@EXEEXT@%%g
s%@OBJEXT@%o%g
s%@ACLOCAL@%${SHELL} /home/steffen/Daten/Programmierung/Linux/bomberclone/missing --run aclocal%g
s%@AUTOCONF@%${SHELL} /home/steffen/Daten/Programmierung/Linux/bomberclone/missing --run autoconf%g
s%@AUTOMAKE@%${SHELL} /home/steffen/Daten/Programmierung/Linux/bomberclone/missing --run automake%g
s%@AUTOHEADER@%${SHELL} /home/steffen/Daten/Programmierung/Linux/bomberclone/missing --run autoheader%g
s%@MAKEINFO@%${SHELL} /home/steffen/Daten/Programmierung/Linux/bomberclone/missing --run makeinfo%g
s%@AMTAR@%${SHELL} /home/steffen/Daten/Programmierung/Linux/bomberclone/missing --run tar%g
s%@install_sh@%/home/steffen/Daten/Programmierung/Linux/bomberclone/install-sh%g
s%@INSTALL_STRIP_PROGRAM@%${SHELL} $(install_sh) -c -s%g
s%@AWK@%mawk%g
s%@SET_MAKE@%%g
s%@AMDEP_TRUE@%%g
s%@AMDEP_FALSE@%#%g
s%@AMDEPBACKSLASH@%\%g
s%@DEPDIR@%.deps%g
s%@CC@%gcc%g
s%@am__include@%include%g
s%@am__quote@%%g
s%@CCDEPMODE@%depmode=gcc%g
s%@CPP@%gcc -E%g
s%@target@%%g
s%@target_alias@%%g
s%@target_cpu@%%g
s%@target_vendor@%%g
s%@target_os@%%g
s%@SDL_CONFIG@%/usr/bin/sdl-config%g
s%@SDL_CFLAGS@%-I/usr/include/SDL -D_REENTRANT%g
s%@SDL_LIBS@%-L/usr/lib -lSDL -lpthread%g
s%@NO_PREFIX_PACKAGE_DATA_DIR@%share/bomberclone%g
s%@PACKAGE_DATA_DIR@%/usr/local/share/bomberclone%g
s%@NO_PREFIX_PACKAGE_DOC_DIR@%doc/bomberclone%g
s%@PACKAGE_DOC_DIR@%/usr/local/doc/bomberclone%g
s%@NO_PREFIX_PACKAGE_PIXMAPS_DIR@%share/bomberclone/pixmaps%g
s%@PACKAGE_PIXMAPS_DIR@%/usr/local/share/bomberclone/pixmaps%g
s%@NO_PREFIX_PACKAGE_HELP_DIR@%share/bomberclone/help%g
s%@PACKAGE_HELP_DIR@%/usr/local/share/bomberclone/help%g
s%@NO_PREFIX_PACKAGE_MENU_DIR@%share/bomberclone%g
s%@PACKAGE_MENU_DIR@%/usr/local/share/bomberclone%g
CEOF
# Split the substitutions into bite-sized pieces for seds with
# small command number limits, like on Digital OSF/1 and HP-UX.
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
ac_file=1 # Number of current file.
ac_beg=1 # First line for current file.
ac_end=$ac_max_sed_cmds # Line after last line for current file.
ac_more_lines=:
ac_sed_cmds=""
while $ac_more_lines; do
if test $ac_beg -gt 1; then
sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
else
sed "${ac_end}q" conftest.subs > conftest.s$ac_file
fi
if test ! -s conftest.s$ac_file; then
ac_more_lines=false
rm -f conftest.s$ac_file
else
if test -z "$ac_sed_cmds"; then
ac_sed_cmds="sed -f conftest.s$ac_file"
else
ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
fi
ac_file=`expr $ac_file + 1`
ac_beg=$ac_end
ac_end=`expr $ac_end + $ac_max_sed_cmds`
fi
done
if test -z "$ac_sed_cmds"; then
ac_sed_cmds=cat
fi
CONFIG_FILES=${CONFIG_FILES-"Makefile
src/Makefile
"}
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
case "$ac_file" in
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
*) ac_file_in="${ac_file}.in" ;;
esac
# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
# Remove last slash and all that follows it. Not all systems have dirname.
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
# The file is in a subdirectory.
test ! -d "$ac_dir" && mkdir "$ac_dir"
ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
# A "../" for each directory in $ac_dir_suffix.
ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
else
ac_dir_suffix= ac_dots=
fi
case "$ac_given_srcdir" in
.) srcdir=.
if test -z "$ac_dots"; then top_srcdir=.
else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
/*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
*) # Relative path.
srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
top_srcdir="$ac_dots$ac_given_srcdir" ;;
esac
case "$ac_given_INSTALL" in
[/$]*) INSTALL="$ac_given_INSTALL" ;;
*) INSTALL="$ac_dots$ac_given_INSTALL" ;;
esac
echo creating "$ac_file"
rm -f "$ac_file"
configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
case "$ac_file" in
*Makefile*) ac_comsub="1i\\
# $configure_input" ;;
*) ac_comsub= ;;
esac
ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
sed -e "$ac_comsub
s%@configure_input@%$configure_input%g
s%@srcdir@%$srcdir%g
s%@top_srcdir@%$top_srcdir%g
s%@INSTALL@%$INSTALL%g
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
fi; done
rm -f conftest.s*
# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
# NAME is the cpp macro being defined and VALUE is the value it is being given.
#
# ac_d sets the value in "#define NAME VALUE" lines.
ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
ac_dC='\3'
ac_dD='%g'
# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
ac_uB='\([ ]\)%\1#\2define\3'
ac_uC=' '
ac_uD='\4%g'
# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
ac_eB='$%\1#\2define\3'
ac_eC=' '
ac_eD='%g'
if test "${CONFIG_HEADERS+set}" != set; then
CONFIG_HEADERS="config.h"
fi
for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
case "$ac_file" in
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
*) ac_file_in="${ac_file}.in" ;;
esac
echo creating $ac_file
rm -f conftest.frag conftest.in conftest.out
ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
cat $ac_file_inputs > conftest.in
cat > conftest.frag <<CEOF
${ac_dA}PACKAGE${ac_dB}PACKAGE${ac_dC}"bomberclone"${ac_dD}
${ac_uA}PACKAGE${ac_uB}PACKAGE${ac_uC}"bomberclone"${ac_uD}
${ac_eA}PACKAGE${ac_eB}PACKAGE${ac_eC}"bomberclone"${ac_eD}
${ac_dA}VERSION${ac_dB}VERSION${ac_dC}"0.9"${ac_dD}
${ac_uA}VERSION${ac_uB}VERSION${ac_uC}"0.9"${ac_uD}
${ac_eA}VERSION${ac_eB}VERSION${ac_eC}"0.9"${ac_eD}
${ac_dA}STDC_HEADERS${ac_dB}STDC_HEADERS${ac_dC}1${ac_dD}
${ac_uA}STDC_HEADERS${ac_uB}STDC_HEADERS${ac_uC}1${ac_uD}
${ac_eA}STDC_HEADERS${ac_eB}STDC_HEADERS${ac_eC}1${ac_eD}
${ac_dA}PACKAGE_DATA_DIR${ac_dB}PACKAGE_DATA_DIR${ac_dC}"/usr/local/share/bomberclone"${ac_dD}
${ac_uA}PACKAGE_DATA_DIR${ac_uB}PACKAGE_DATA_DIR${ac_uC}"/usr/local/share/bomberclone"${ac_uD}
${ac_eA}PACKAGE_DATA_DIR${ac_eB}PACKAGE_DATA_DIR${ac_eC}"/usr/local/share/bomberclone"${ac_eD}
CEOF
sed -f conftest.frag conftest.in > conftest.out
rm -f conftest.in
mv conftest.out conftest.in
cat > conftest.frag <<CEOF
${ac_dA}PACKAGE_DOC_DIR${ac_dB}PACKAGE_DOC_DIR${ac_dC}"/usr/local/doc/bomberclone"${ac_dD}
${ac_uA}PACKAGE_DOC_DIR${ac_uB}PACKAGE_DOC_DIR${ac_uC}"/usr/local/doc/bomberclone"${ac_uD}
${ac_eA}PACKAGE_DOC_DIR${ac_eB}PACKAGE_DOC_DIR${ac_eC}"/usr/local/doc/bomberclone"${ac_eD}
${ac_dA}PACKAGE_PIXMAPS_DIR${ac_dB}PACKAGE_PIXMAPS_DIR${ac_dC}"/usr/local/share/bomberclone/pixmaps"${ac_dD}
${ac_uA}PACKAGE_PIXMAPS_DIR${ac_uB}PACKAGE_PIXMAPS_DIR${ac_uC}"/usr/local/share/bomberclone/pixmaps"${ac_uD}
${ac_eA}PACKAGE_PIXMAPS_DIR${ac_eB}PACKAGE_PIXMAPS_DIR${ac_eC}"/usr/local/share/bomberclone/pixmaps"${ac_eD}
${ac_dA}PACKAGE_HELP_DIR${ac_dB}PACKAGE_HELP_DIR${ac_dC}"/usr/local/share/bomberclone/help"${ac_dD}
${ac_uA}PACKAGE_HELP_DIR${ac_uB}PACKAGE_HELP_DIR${ac_uC}"/usr/local/share/bomberclone/help"${ac_uD}
${ac_eA}PACKAGE_HELP_DIR${ac_eB}PACKAGE_HELP_DIR${ac_eC}"/usr/local/share/bomberclone/help"${ac_eD}
${ac_dA}PACKAGE_MENU_DIR${ac_dB}PACKAGE_MENU_DIR${ac_dC}"/usr/local/share/bomberclone"${ac_dD}
${ac_uA}PACKAGE_MENU_DIR${ac_uB}PACKAGE_MENU_DIR${ac_uC}"/usr/local/share/bomberclone"${ac_uD}
${ac_eA}PACKAGE_MENU_DIR${ac_eB}PACKAGE_MENU_DIR${ac_eC}"/usr/local/share/bomberclone"${ac_eD}
CEOF
sed -f conftest.frag conftest.in > conftest.out
rm -f conftest.in
mv conftest.out conftest.in
cat > conftest.frag <<CEOF
${ac_dA}PACKAGE_SOURCE_DIR${ac_dB}PACKAGE_SOURCE_DIR${ac_dC}"/home/steffen/Daten/Programmierung/Linux/bomberclone"${ac_dD}
${ac_uA}PACKAGE_SOURCE_DIR${ac_uB}PACKAGE_SOURCE_DIR${ac_uC}"/home/steffen/Daten/Programmierung/Linux/bomberclone"${ac_uD}
${ac_eA}PACKAGE_SOURCE_DIR${ac_eB}PACKAGE_SOURCE_DIR${ac_eC}"/home/steffen/Daten/Programmierung/Linux/bomberclone"${ac_eD}
s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
CEOF
sed -f conftest.frag conftest.in > conftest.out
rm -f conftest.in
mv conftest.out conftest.in
rm -f conftest.frag conftest.h
echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
cat conftest.in >> conftest.h
rm -f conftest.in
if cmp -s $ac_file conftest.h 2>/dev/null; then
echo "$ac_file is unchanged"
rm -f conftest.h
else
# Remove last slash and all that follows it. Not all systems have dirname.
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
# The file is in a subdirectory.
test ! -d "$ac_dir" && mkdir "$ac_dir"
fi
rm -f $ac_file
mv conftest.h $ac_file
fi
fi; done
am_indx=1
for am_file in config.h; do
case " $CONFIG_HEADERS " in
*" $am_file "*)
am_dir=`echo $am_file |sed 's%:.*%%;s%[^/]*$%%'`
if test -n "$am_dir"; then
am_tmpdir=`echo $am_dir |sed 's%^\(/*\).*$%\1%'`
for am_subdir in `echo $am_dir |sed 's%/% %'`; do
am_tmpdir=$am_tmpdir$am_subdir/
if test ! -d $am_tmpdir; then
mkdir $am_tmpdir
fi
done
fi
echo timestamp > "$am_dir"stamp-h$am_indx
;;
esac
am_indx=`expr $am_indx + 1`
done
AMDEP_TRUE=""
ac_aux_dir="."
test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
test x"$AMDEP_TRUE" != x"" ||
for mf in $CONFIG_FILES; do
case "$mf" in
Makefile) dirpart=.;;
*/Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;;
*) continue;;
esac
grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
# Extract the definition of DEP_FILES from the Makefile without
# running `make'.
DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
test -z "$DEPDIR" && continue
# When using ansi2knr, U may be empty or an underscore; expand it
U=`sed -n -e '/^U = / s///p' < "$mf"`
test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
# We invoke sed twice because it is the simplest approach to
# changing $(DEPDIR) to its actual value in the expansion.
for file in `sed -n -e '
/^DEP_FILES = .*\\\\$/ {
s/^DEP_FILES = //
:loop
s/\\\\$//
p
n
/\\\\$/ b loop
p
}
/^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`echo "$file" | sed -e 's|/[^/]*$||'`
$ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1
# echo "creating $dirpart/$file"
echo '# dummy' > "$dirpart/$file"
done
done
exit 0

2286
configure vendored

File diff suppressed because it is too large Load Diff

@ -0,0 +1,101 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta - will be overwritten
dnl If you don't want it to overwrite it,
dnl Please disable it in the Anjuta project configuration
AC_INIT(configure.in)
AM_INIT_AUTOMAKE(bomberclone, 0.9)
AM_CONFIG_HEADER(config.h)
AC_ISC_POSIX
AC_PROG_CC
AM_PROG_CC_STDC
AC_HEADER_STDC
dnl Checks for programs.
dnl Checks for libraries.
dnl Check for SDL
AM_PATH_SDL(1.1.0,
:,
AC_MSG_ERROR(SDL not found. Make sure sdl-config is in your PATH, or specify with --with-sdl-prefix)
)
CFLAGS="$SDL_CFLAGS $CFLAGS"
LIBS="$SDL_LIBS $LIBS"
dnl Checks for header files.
dnl Checks for typedefs, structures, and compiler characteristics.
case "$target" in
*-*-cygwin* | *-*-mingw32*)
CFLAGS="$CFLAGS"
LIBS="$LIBS -liberty -lwsock32"
;;
esac
CFLAGS="$CFLAGS -Wall"
dnl Checks for library functions.
dnl Checks for Additional stuffs.
dnl Set PACKAGE SOURCE DIR in config.h.
packagesrcdir=`cd $srcdir && pwd`
dnl Set PACKAGE PREFIX
if test "x${prefix}" = "xNONE"; then
packageprefix=${ac_default_prefix}
else
packageprefix=${prefix}
fi
dnl Set PACKAGE DATA & DOC DIR
packagedatadir=share/${PACKAGE}
packagedocdir=doc/${PACKAGE}
dnl Set PACKAGE DIRS in config.h.
packagepixmapsdir=${packagedatadir}/pixmaps
packagehelpdir=${packagedatadir}/help
packagemenudir=${packagedatadir}
dnl Subst PACKAGE_DATA_DIR.
NO_PREFIX_PACKAGE_DATA_DIR="${packagedatadir}"
AC_SUBST(NO_PREFIX_PACKAGE_DATA_DIR)
PACKAGE_DATA_DIR="${packageprefix}/${packagedatadir}"
AC_SUBST(PACKAGE_DATA_DIR)
dnl Subst PACKAGE_DOC_DIR.
NO_PREFIX_PACKAGE_DOC_DIR="${packagedocdir}"
AC_SUBST(NO_PREFIX_PACKAGE_DOC_DIR)
PACKAGE_DOC_DIR="${packageprefix}/${packagedocdir}"
AC_SUBST(PACKAGE_DOC_DIR)
dnl Subst PACKAGE_PIXMAPS_DIR.
NO_PREFIX_PACKAGE_PIXMAPS_DIR="${packagepixmapsdir}"
AC_SUBST(NO_PREFIX_PACKAGE_PIXMAPS_DIR)
PACKAGE_PIXMAPS_DIR="${packageprefix}/${packagepixmapsdir}"
AC_SUBST(PACKAGE_PIXMAPS_DIR)
dnl Subst PACKAGE_HELP_DIR.
NO_PREFIX_PACKAGE_HELP_DIR="${packagehelpdir}"
AC_SUBST(NO_PREFIX_PACKAGE_HELP_DIR)
PACKAGE_HELP_DIR="${packageprefix}/${packagehelpdir}"
AC_SUBST(PACKAGE_HELP_DIR)
dnl Subst PACKAGE_MENU_DIR.
NO_PREFIX_PACKAGE_MENU_DIR="${packagemenudir}"
AC_SUBST(NO_PREFIX_PACKAGE_MENU_DIR)
PACKAGE_MENU_DIR="${packageprefix}/${packagemenudir}"
AC_SUBST(PACKAGE_MENU_DIR)
AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${packageprefix}/${packagedatadir}")
AC_DEFINE_UNQUOTED(PACKAGE_DOC_DIR, "${packageprefix}/${packagedocdir}")
AC_DEFINE_UNQUOTED(PACKAGE_PIXMAPS_DIR, "${packageprefix}/${packagepixmapsdir}")
AC_DEFINE_UNQUOTED(PACKAGE_HELP_DIR, "${packageprefix}/${packagehelpdir}")
AC_DEFINE_UNQUOTED(PACKAGE_MENU_DIR, "${packageprefix}/${packagemenudir}")
AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}")
AC_OUTPUT([
Makefile
src/Makefile
])

@ -0,0 +1,411 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
# Copyright 1999, 2000 Free Software Foundation, Inc.
# 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, 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., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
echo "depcomp: Variables source, object and depmode must be set" 1>&2
exit 1
fi
# `libtool' can also be set to `yes' or `no'.
depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`}
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
rm -f "$tmpdepfile"
# Some modes work just like other modes, but use different flags. We
# parameterize here, but still list the modes in the big case below,
# to make depend.m4 easier to write. Note that we *cannot* use a case
# here, because this file can only contain one case statement.
if test "$depmode" = hp; then
# HP compiler uses -M and no extra arg.
gccflag=-M
depmode=gcc
fi
if test "$depmode" = dashXmstdout; then
# This is just like dashmstdout with a different argument.
dashmflag=-xM
depmode=dashmstdout
fi
case "$depmode" in
gcc3)
## gcc 3 implements dependency tracking that does exactly what
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
## it if -MD -MP comes after the -MF stuff. Hmm.
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
mv "$tmpdepfile" "$depfile"
;;
gcc)
## There are various ways to get dependency output from gcc. Here's
## why we pick this rather obscure method:
## - Don't want to use -MD because we'd like the dependencies to end
## up in a subdir. Having to rename by hand is ugly.
## (We might end up doing this anyway to support other compilers.)
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
## -MM, not -M (despite what the docs say).
## - Using -M directly means running the compiler twice (even worse
## than renaming).
if test -z "$gccflag"; then
gccflag=-MD,
fi
"$@" -Wp,"$gccflag$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
## The second -e expression handles DOS-style file names with drive letters.
sed -e 's/^[^:]*: / /' \
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
## This next piece of magic avoids the `deleted header file' problem.
## The problem is that when a header file which appears in a .P file
## is deleted, the dependency causes make to die (because there is
## typically no way to rebuild the header). We avoid this by adding
## dummy dependencies for each header file. Too bad gcc doesn't do
## this for us directly.
tr ' ' '
' < "$tmpdepfile" |
## Some versions of gcc put a space before the `:'. On the theory
## that the space means something, we add a space to the output as
## well.
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
hp)
# This case exists only to let depend.m4 do its work. It works by
# looking at the text of this script. This case will never be run,
# since it is checked for above.
exit 1
;;
sgi)
if test "$libtool" = yes; then
"$@" "-Wp,-MDupdate,$tmpdepfile"
else
"$@" -MDupdate "$tmpdepfile"
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
echo "$object : \\" > "$depfile"
# Clip off the initial element (the dependent). Don't try to be
# clever and replace this with sed code, as IRIX sed won't handle
# lines with more than a fixed number of characters (4096 in
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
# the IRIX cc adds comments like `#:fec' to the end of the
# dependency line.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
tr '
' ' ' >> $depfile
echo >> $depfile
# The second pass generates a dummy entry for each header file.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
>> $depfile
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
aix)
# The C for AIX Compiler uses -M and outputs the dependencies
# in a .u file. This file always lives in the current directory.
# Also, the AIX compiler puts `$object:' at the start of each line;
# $object doesn't have directory information.
stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
tmpdepfile="$stripped.u"
outname="$stripped.o"
if test "$libtool" = yes; then
"$@" -Wc,-M
else
"$@" -M
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
if test -f "$tmpdepfile"; then
# Each line is of the form `foo.o: dependent.h'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
tru64)
# The Tru64 AIX compiler uses -MD to generate dependencies as a side
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
# dependencies in `foo.d' instead, so we check for that too.
# Subdirectories are respected.
tmpdepfile1="$object.d"
tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'`
if test "$libtool" = yes; then
"$@" -Wc,-MD
else
"$@" -MD
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile1" "$tmpdepfile2"
exit $stat
fi
if test -f "$tmpdepfile1"; then
tmpdepfile="$tmpdepfile1"
else
tmpdepfile="$tmpdepfile2"
fi
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
# That's a space and a tab in the [].
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
else
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
#nosideeffect)
# This comment above is used by automake to tell side-effect
# dependency tracking mechanisms from slower ones.
dashmstdout)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
test -z "$dashmflag" && dashmflag=-M
( IFS=" "
case " $* " in
*" --mode=compile "*) # this is libtool, let us make it quiet
for arg
do # cycle over the arguments
case "$arg" in
"--mode=compile")
# insert --quiet before "--mode=compile"
set fnord "$@" --quiet
shift # fnord
;;
esac
set fnord "$@" "$arg"
shift # fnord
shift # "$arg"
done
;;
esac
"$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
tr ' ' '
' < "$tmpdepfile" | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
dashXmstdout)
# This case only exists to satisfy depend.m4. It is never actually
# run, as this mode is specially recognized in the preamble.
exit 1
;;
makedepend)
# X makedepend
(
shift
cleared=no
for arg in "$@"; do
case $cleared in no)
set ""; shift
cleared=yes
esac
case "$arg" in
-D*|-I*)
set fnord "$@" "$arg"; shift;;
-*)
;;
*)
set fnord "$@" "$arg"; shift;;
esac
done
obj_suffix="`echo $object | sed 's/^.*\././'`"
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
tail +3 "$tmpdepfile" | tr ' ' '
' | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile" "$tmpdepfile".bak
;;
cpp)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
( IFS=" "
case " $* " in
*" --mode=compile "*)
for arg
do # cycle over the arguments
case $arg in
"--mode=compile")
# insert --quiet before "--mode=compile"
set fnord "$@" --quiet
shift # fnord
;;
esac
set fnord "$@" "$arg"
shift # fnord
shift # "$arg"
done
;;
esac
"$@" -E |
sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
sed '$ s: \\$::' > "$tmpdepfile"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
cat < "$tmpdepfile" >> "$depfile"
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
msvisualcpp)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
( IFS=" "
case " $* " in
*" --mode=compile "*)
for arg
do # cycle over the arguments
case $arg in
"--mode=compile")
# insert --quiet before "--mode=compile"
set fnord "$@" --quiet
shift # fnord
;;
esac
set fnord "$@" "$arg"
shift # fnord
shift # "$arg"
done
;;
esac
"$@" -E |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
echo " " >> "$depfile"
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
rm -f "$tmpdepfile"
;;
none)
exec "$@"
;;
*)
echo "Unknown depmode $depmode" 1>&2
exit 1
;;
esac
exit 0

@ -0,0 +1,251 @@
#!/bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission. M.I.T. makes no representations about the
# suitability of this software for any purpose. It is provided "as is"
# without express or implied warranty.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
transformbasename=""
transform_arg=""
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=""
chgrpcmd=""
stripcmd=""
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=""
dst=""
dir_arg=""
while [ x"$1" != x ]; do
case $1 in
-c) instcmd="$cpprog"
shift
continue;;
-d) dir_arg=true
shift
continue;;
-m) chmodcmd="$chmodprog $2"
shift
shift
continue;;
-o) chowncmd="$chownprog $2"
shift
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
shift
shift
continue;;
-s) stripcmd="$stripprog"
shift
continue;;
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
shift
continue;;
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
shift
continue;;
*) if [ x"$src" = x ]
then
src=$1
else
# this colon is to work around a 386BSD /bin/sh bug
:
dst=$1
fi
shift
continue;;
esac
done
if [ x"$src" = x ]
then
echo "install: no input file specified"
exit 1
else
true
fi
if [ x"$dir_arg" != x ]; then
dst=$src
src=""
if [ -d $dst ]; then
instcmd=:
chmodcmd=""
else
instcmd=mkdir
fi
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if [ -f $src -o -d $src ]
then
true
else
echo "install: $src does not exist"
exit 1
fi
if [ x"$dst" = x ]
then
echo "install: no destination specified"
exit 1
else
true
fi
# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic
if [ -d $dst ]
then
dst="$dst"/`basename $src`
else
true
fi
fi
## this sed command emulates the dirname command
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# this part is taken from Noah Friedman's mkinstalldirs script
# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
defaultIFS='
'
IFS="${IFS-${defaultIFS}}"
oIFS="${IFS}"
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
IFS="${oIFS}"
pathcomp=''
while [ $# -ne 0 ] ; do
pathcomp="${pathcomp}${1}"
shift
if [ ! -d "${pathcomp}" ] ;
then
$mkdirprog "${pathcomp}"
else
true
fi
pathcomp="${pathcomp}/"
done
fi
if [ x"$dir_arg" != x ]
then
$doit $instcmd $dst &&
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
else
# If we're going to rename the final executable, determine the name now.
if [ x"$transformarg" = x ]
then
dstfile=`basename $dst`
else
dstfile=`basename $dst $transformbasename |
sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename
if [ x"$dstfile" = x ]
then
dstfile=`basename $dst`
else
true
fi
# Make a temp file name in the proper directory.
dsttmp=$dstdir/#inst.$$#
# Move or copy the file name to the temp name
$doit $instcmd $src $dsttmp &&
trap "rm -f ${dsttmp}" 0 &&
# and set any options; do chmod last to preserve setuid bits
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
# Now rename the file to the real destination.
$doit $rmcmd -f $dstdir/$dstfile &&
$doit $mvcmd $dsttmp $dstdir/$dstfile
fi &&
exit 0

@ -0,0 +1,283 @@
#! /bin/sh
# Common stub for a few missing GNU programs while installing.
# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# 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, 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., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
if test $# -eq 0; then
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
fi
run=:
# In the cases where this matters, `missing' is being run in the
# srcdir already.
if test -f configure.ac; then
configure_ac=configure.ac
else
configure_ac=configure.in
fi
case "$1" in
--run)
# Try to run requested program, and just exit if it succeeds.
run=
shift
"$@" && exit 0
;;
esac
# If it does not exist, or fails to run (possibly an outdated version),
# try to emulate it.
case "$1" in
-h|--h|--he|--hel|--help)
echo "\
$0 [OPTION]... PROGRAM [ARGUMENT]...
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
error status if there is no known handling for PROGRAM.
Options:
-h, --help display this help and exit
-v, --version output version information and exit
--run try to run the given command, and emulate it if it fails
Supported PROGRAM values:
aclocal touch file \`aclocal.m4'
autoconf touch file \`configure'
autoheader touch file \`config.h.in'
automake touch all \`Makefile.in' files
bison create \`y.tab.[ch]', if possible, from existing .[ch]
flex create \`lex.yy.c', if possible, from existing .c
help2man touch the output file
lex create \`lex.yy.c', if possible, from existing .c
makeinfo touch the output file
tar try tar, gnutar, gtar, then tar without non-portable flags
yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
;;
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
echo "missing 0.3 - GNU automake"
;;
-*)
echo 1>&2 "$0: Unknown \`$1' option"
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
;;
aclocal)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
to install the \`Automake' and \`Perl' packages. Grab them from
any GNU archive site."
touch aclocal.m4
;;
autoconf)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`${configure_ac}'. You might want to install the
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
archive site."
touch configure
;;
autoheader)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`acconfig.h' or \`${configure_ac}'. You might want
to install the \`Autoconf' and \`GNU m4' packages. Grab them
from any GNU archive site."
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
test -z "$files" && files="config.h"
touch_files=
for f in $files; do
case "$f" in
*:*) touch_files="$touch_files "`echo "$f" |
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
*) touch_files="$touch_files $f.in";;
esac
done
touch $touch_files
;;
automake)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
You might want to install the \`Automake' and \`Perl' packages.
Grab them from any GNU archive site."
find . -type f -name Makefile.am -print |
sed 's/\.am$/.in/' |
while read f; do touch "$f"; done
;;
bison|yacc)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a \`.y' file. You may need the \`Bison' package
in order for those modifications to take effect. You can get
\`Bison' from any GNU archive site."
rm -f y.tab.c y.tab.h
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.y)
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.c
fi
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.h
fi
;;
esac
fi
if [ ! -f y.tab.h ]; then
echo >y.tab.h
fi
if [ ! -f y.tab.c ]; then
echo 'main() { return 0; }' >y.tab.c
fi
;;
lex|flex)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a \`.l' file. You may need the \`Flex' package
in order for those modifications to take effect. You can get
\`Flex' from any GNU archive site."
rm -f lex.yy.c
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.l)
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" lex.yy.c
fi
;;
esac
fi
if [ ! -f lex.yy.c ]; then
echo 'main() { return 0; }' >lex.yy.c
fi
;;
help2man)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a dependency of a manual page. You may need the
\`Help2man' package in order for those modifications to take
effect. You can get \`Help2man' from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
fi
if [ -f "$file" ]; then
touch $file
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
exit 1
fi
;;
makeinfo)
if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
# We have makeinfo, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a \`.texi' or \`.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy \`make' (AIX,
DU, IRIX). You might want to install the \`Texinfo' package or
the \`GNU make' package. Grab either from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
fi
touch $file
;;
tar)
shift
if test -n "$run"; then
echo 1>&2 "ERROR: \`tar' requires --run"
exit 1
fi
# We have already tried tar in the generic part.
# Look for gnutar/gtar before invocation to avoid ugly error
# messages.
if (gnutar --version > /dev/null 2>&1); then
gnutar ${1+"$@"} && exit 0
fi
if (gtar --version > /dev/null 2>&1); then
gtar ${1+"$@"} && exit 0
fi
firstarg="$1"
if shift; then
case "$firstarg" in
*o*)
firstarg=`echo "$firstarg" | sed s/o//`
tar "$firstarg" ${1+"$@"} && exit 0
;;
esac
case "$firstarg" in
*h*)
firstarg=`echo "$firstarg" | sed s/h//`
tar "$firstarg" ${1+"$@"} && exit 0
;;
esac
fi
echo 1>&2 "\
WARNING: I can't seem to be able to run \`tar' with the given arguments.
You may want to install GNU tar or Free paxutils, or check the
command line arguments."
exit 1
;;
*)
echo 1>&2 "\
WARNING: \`$1' is needed, and you do not seem to have it handy on your
system. You might have modified some files without having the
proper tools for further handling them. Check the \`README' file,
it often tells you about the needed prerequirements for installing
this package. You may also peek at any GNU archive site, in case
some other package would contain this missing \`$1' program."
exit 1
;;
esac
exit 0

@ -0,0 +1,40 @@
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain
# $Id: mkinstalldirs,v 1.1 2003/04/23 16:00:11 stpohle Exp $
errstatus=0
for file
do
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
shift
pathcomp=
for d
do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp"
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
errstatus=$lasterr
fi
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus
# mkinstalldirs ends here

@ -0,0 +1,38 @@
# .SILENT:
LIBS=-L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows -mno-cygwin -liberty -lwsock32
CFLAGS=-I/usr/local/include/SDL -Dmain=SDL_main -I/usr/include/mingw -DWIN32 -Uunix -mno-cygwin
OBJS=bomb.o configuration.o debug.o gfx.o main.o field.o font.o game.o gamesrv.o menu.o netmenu.o network.o packets.o pkgcache.o player.o sysfunc.o udp.o chat.o multiwait.o keybinput.o
all: config bomberclone
config:
echo "#define VERSION \"0.9\"" >../config.h
rebuild: clean all
bomberclone: $(OBJS)
gcc -o $@ $^ $(LIBS)
%.o: %.c
gcc $(CFLAGS) -c -o $@ $^ $(DFLAGS)
clean:
del *.o
del bomberclone.exe
cleanall: clean
del *.*~
source: cleanall

@ -0,0 +1,35 @@
INCLUDES =
bin_PROGRAMS = bomberclone
bomberclone_SOURCES = \
main.c\
bomb.c\
bomberclone.h\
debug.c\
packets.c\
font.c\
gfx.c\
player.c\
packets.h\
game.c\
netmenu.c\
network.c\
udp.c\
menu.c\
field.c\
network.h\
sysfunc.c\
configuration.c\
pkgcache.c\
gamesrv.h\
gamesrv.c \
chat.c \
multiwait.c \
chat.h \
keybinput.h \
keybinput.c
## bomberclone_LDADD =

@ -0,0 +1,374 @@
# Makefile.in generated automatically by automake 1.5 from Makefile.am.
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
AMTAR = @AMTAR@
AWK = @AWK@
CC = @CC@
DEPDIR = @DEPDIR@
EXEEXT = @EXEEXT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
NO_PREFIX_PACKAGE_DATA_DIR = @NO_PREFIX_PACKAGE_DATA_DIR@
NO_PREFIX_PACKAGE_DOC_DIR = @NO_PREFIX_PACKAGE_DOC_DIR@
NO_PREFIX_PACKAGE_HELP_DIR = @NO_PREFIX_PACKAGE_HELP_DIR@
NO_PREFIX_PACKAGE_MENU_DIR = @NO_PREFIX_PACKAGE_MENU_DIR@
NO_PREFIX_PACKAGE_PIXMAPS_DIR = @NO_PREFIX_PACKAGE_PIXMAPS_DIR@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_DATA_DIR = @PACKAGE_DATA_DIR@
PACKAGE_DOC_DIR = @PACKAGE_DOC_DIR@
PACKAGE_HELP_DIR = @PACKAGE_HELP_DIR@
PACKAGE_MENU_DIR = @PACKAGE_MENU_DIR@
PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@
SDL_CFLAGS = @SDL_CFLAGS@
SDL_CONFIG = @SDL_CONFIG@
SDL_LIBS = @SDL_LIBS@
VERSION = @VERSION@
am__include = @am__include@
am__quote = @am__quote@
install_sh = @install_sh@
INCLUDES =
bin_PROGRAMS = bomberclone
bomberclone_SOURCES = \
main.c\
bomb.c\
bomberclone.h\
debug.c\
packets.c\
font.c\
gfx.c\
player.c\
packets.h\
game.c\
netmenu.c\
network.c\
udp.c\
menu.c\
field.c\
network.h\
sysfunc.c\
configuration.c\
pkgcache.c\
gamesrv.h\
gamesrv.c \
chat.c \
multiwait.c \
chat.h \
keybinput.h \
keybinput.c
subdir = src
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
bin_PROGRAMS = bomberclone$(EXEEXT)
PROGRAMS = $(bin_PROGRAMS)
am_bomberclone_OBJECTS = main.$(OBJEXT) bomb.$(OBJEXT) debug.$(OBJEXT) \
packets.$(OBJEXT) font.$(OBJEXT) gfx.$(OBJEXT) player.$(OBJEXT) \
game.$(OBJEXT) netmenu.$(OBJEXT) network.$(OBJEXT) \
udp.$(OBJEXT) menu.$(OBJEXT) field.$(OBJEXT) sysfunc.$(OBJEXT) \
configuration.$(OBJEXT) pkgcache.$(OBJEXT) gamesrv.$(OBJEXT) \
chat.$(OBJEXT) multiwait.$(OBJEXT) keybinput.$(OBJEXT)
bomberclone_OBJECTS = $(am_bomberclone_OBJECTS)
bomberclone_LDADD = $(LDADD)
bomberclone_DEPENDENCIES =
bomberclone_LDFLAGS =
DEFS = @DEFS@
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
depcomp = $(SHELL) $(top_srcdir)/depcomp
@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/bomb.Po $(DEPDIR)/chat.Po \
@AMDEP_TRUE@ $(DEPDIR)/configuration.Po $(DEPDIR)/debug.Po \
@AMDEP_TRUE@ $(DEPDIR)/field.Po $(DEPDIR)/font.Po \
@AMDEP_TRUE@ $(DEPDIR)/game.Po $(DEPDIR)/gamesrv.Po \
@AMDEP_TRUE@ $(DEPDIR)/gfx.Po $(DEPDIR)/keybinput.Po \
@AMDEP_TRUE@ $(DEPDIR)/main.Po $(DEPDIR)/menu.Po \
@AMDEP_TRUE@ $(DEPDIR)/multiwait.Po $(DEPDIR)/netmenu.Po \
@AMDEP_TRUE@ $(DEPDIR)/network.Po $(DEPDIR)/packets.Po \
@AMDEP_TRUE@ $(DEPDIR)/pkgcache.Po $(DEPDIR)/player.Po \
@AMDEP_TRUE@ $(DEPDIR)/sysfunc.Po $(DEPDIR)/udp.Po
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
CFLAGS = @CFLAGS@
DIST_SOURCES = $(bomberclone_SOURCES)
DIST_COMMON = Makefile.am Makefile.in
SOURCES = $(bomberclone_SOURCES)
all: all-am
.SUFFIXES:
.SUFFIXES: .c .o .obj
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu src/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && \
CONFIG_HEADERS= CONFIG_LINKS= \
CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(bindir)
@list='$(bin_PROGRAMS)'; for p in $$list; do \
p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
if test -f $$p \
; then \
f=`echo $$p1|sed '$(transform);s/$$/$(EXEEXT)/'`; \
echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f"; \
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f; \
else :; fi; \
done
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
@list='$(bin_PROGRAMS)'; for p in $$list; do \
f=`echo $$p|sed 's/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
rm -f $(DESTDIR)$(bindir)/$$f; \
done
clean-binPROGRAMS:
-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
bomberclone$(EXEEXT): $(bomberclone_OBJECTS) $(bomberclone_DEPENDENCIES)
@rm -f bomberclone$(EXEEXT)
$(LINK) $(bomberclone_LDFLAGS) $(bomberclone_OBJECTS) $(bomberclone_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT) core *.core
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/bomb.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/chat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/configuration.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/debug.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/field.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/font.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/game.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gamesrv.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gfx.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/keybinput.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/menu.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/multiwait.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/netmenu.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/network.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/packets.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/pkgcache.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/player.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/sysfunc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/udp.Po@am__quote@
distclean-depend:
-rm -rf $(DEPDIR)
.c.o:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$<
.c.obj:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `cygpath -w $<`
CCDEPMODE = @CCDEPMODE@
uninstall-info-am:
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique $(LISP)
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|| etags $(ETAGS_ARGS) $$tags $$unique $(LISP)
GTAGS:
here=`CDPATH=: && cd $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@for file in $(DISTFILES); do \
if test -f $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
$(mkinstalldirs) "$(distdir)/$$dir"; \
fi; \
if test -d $$d/$$file; then \
cp -pR $$d/$$file $(distdir) \
|| exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(PROGRAMS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(bindir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
distclean: distclean-am
distclean-am: clean-am distclean-compile distclean-depend \
distclean-generic distclean-tags
dvi: dvi-am
dvi-am:
info: info-am
info-am:
install-data-am:
install-exec-am: install-binPROGRAMS
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic
uninstall-am: uninstall-binPROGRAMS uninstall-info-am
.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \
clean-generic distclean distclean-compile distclean-depend \
distclean-generic distclean-tags distdir dvi dvi-am info \
info-am install install-am install-binPROGRAMS install-data \
install-data-am install-exec install-exec-am install-info \
install-info-am install-man install-strip installcheck \
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic tags uninstall uninstall-am \
uninstall-binPROGRAMS uninstall-info-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

@ -0,0 +1,150 @@
/* basic types which we need everywhere */
#ifndef _BC_BASIC_H_
#define _BC_BASIC_H_
#define SUB_VERSION 6
#define GAME_SPECIAL_ITEMBOMB 10
#define GAME_SPECIAL_ITEMFIRE 10
#define GAME_SPECIAL_ITEMSHOE 15
#define GAME_SPECIAL_ITEMDEATH 25
#define PKG_RESENDCACHE_SIZE (64*1024)
#define PKG_IN_INDEX_NUM 256
#define RESENDCACHE_TIMEOUT 500
#define RESENDCACHE_RETRY 10
#define START_BOMBS 1
#define START_RANGE 2
#define START_SPEED 16
#define SPEEDMUL 1.2
#define MAX_PLAYERS 8
#define MAX_BOMBS 12
#define MAX_RANGE 10
#define MAX_SPEED 40
#define MAX_UPDATERECTS 2048
#define MAX_CONNECTS 16 /* maximal number of connection data */
#define MAX_SERVERENTRYS 8 /* number of entrys in the server tab */
#define MAX_GAMESRVENTRYS 255 /* number of entry which can be get */
#define MAX_FIELDSIZE_X 51
#define MAX_FIELDSIZE_Y 31
#define MIN_FIELDSIZE_X 21
#define MIN_FIELDSIZE_Y 13
#define ANI_FIRETIMEOUT 20
#define ANI_BOMBTIMEOUT 1
#define ANI_PLAYERTIMEOUT 1
#define ANI_PLAYERILLTIMEOUT 1
#define ANI_STONETIMEOUT 10
#define TIME_FACTOR 50
#define BOMB_TIMEOUT 5
#define IL_TIMEOUT 20
#define LEN_PLAYERNAME 10
#define LEN_SERVERNAME 41
#define LEN_PORT 6
#define LEN_GAMENAME 32
#define DEFAULT_UDPPORT 11000
#define DEFAULT_GMUDPPORT "11100"
#define DEFAULT_GAMEMASTER "x.yz.to:11100"
#define GAMESRV_TIMEOUT 2000 /* Timeout of the GameSrv_GetEntry */
#define UDP_TIMEOUT 15000
#define BUF_SIZE 1024
enum _backgound { // to load some diffrent logos..
BG_start = 0,
BG_net,
BG_conf
};
enum _gametype {
GT_single = 0,
GT_multi
};
enum _multitype {
MT_ptpm, // udp ptp master
MT_ptps // udp ptp client
};
enum _gamestate {
GS_startup = 0,
GS_quit,
GS_wait, // waiting for players to join
GS_update,
GS_ready,
GS_running
};
enum _fieldtype {
FT_nothing = 0, // Nothing in here
FT_stone, // Stones you can bomb away
FT_block, // Stones which can't bomb away
FT_death, // The bad Powerup
FT_fire, // Special Field for the fire
FT_bomb,
FT_shoe,
FT_max // just to know how many types there are
};
enum _playerillnestype {
PI_keys = 0,
PI_range,
PI_slow,
PI_bomb,
PI_max // just to know what is the last number
};
enum _bombstate {
BS_off = 0,
BS_ticking,
BS_exploding
};
enum _playerstateflags {
PSF_used = 1, // Player Unused | Player Used
PSF_net = 2, // Local Player | AI / Network Player
PSF_alife = 4, // Player is Dead | Player is Alife
PSF_playing = 8, // Watching Player | Playing Player -- as long as one don't delete
};
#define PSFM_used (PSF_used + PSF_playing)
#define PSFM_alife (PSF_used + PSF_alife + PSF_playing)
#define PS_IS_dead(__ps) (((__ps) & (PSFM_alife)) == (PSFM_used))
#define PS_IS_alife(__ps) (((__ps) & (PSFM_alife)) == (PSFM_alife))
#define PS_IS_netplayer(__ps) (((__ps) & (PSFM_alife + PSF_net)) == (PSF_net + PSFM_alife))
#define PS_IS_playing(__ps) (((__ps) & (PSFM_used)) == (PSFM_used))
#define PS_IS_used(__ps) (((__ps) & (PSFM_used)) != 0)
enum _direction { // to handle directions better
left = 0,
right,
up,
down
};
struct __point {
short int x;
short int y;
} typedef _point;
#endif

@ -0,0 +1,339 @@
/* everything what have to do with the bombs */
#include "bomberclone.h"
#include "network.h"
#include "gfx.h"
void
restore_bomb_screen ()
{
int p,
i;
_bomb *bomb;
for (p = 0; p < MAX_PLAYERS; p++)
for (i = 0; i < MAX_BOMBS; i++) {
bomb = &bman.players[p].bombs[i];
if (bomb->state == BS_ticking) {
draw_stone (bomb->pos.x, bomb->pos.y);
if (bomb->pos.x > 1)
draw_stone (bomb->pos.x - 1, bomb->pos.y);
if (bomb->pos.y > 1)
draw_stone (bomb->pos.x, bomb->pos.y - 1);
if (bomb->pos.x < bman.fieldsize.x)
draw_stone (bomb->pos.x + 1, bomb->pos.y);
if (bomb->pos.y < bman.fieldsize.y)
draw_stone (bomb->pos.x, bomb->pos.y + 1);
}
}
};
void
draw_bomb (_bomb * bomb)
{
SDL_Rect src,
dest;
/* check the framenumber */
if (bomb->frameto-- == 0) {
bomb->frameto = ANI_BOMBTIMEOUT;
bomb->frame++;
};
if (bomb->frame < 0 || bomb->frame >= gfx.bomb.frames || bomb->frameto > 20) {
bomb->frame = 0;
bomb->frameto = ANI_BOMBTIMEOUT;
}
src.w = src.w = gfx.bomb.image->w;
dest.h = src.h = gfx.block.y;
dest.x = gfx.offset.x + (bomb->pos.x * gfx.block.x);
dest.y = gfx.offset.y + (bomb->pos.y * gfx.block.y);
src.x = 0;
src.y = src.h * bomb->frame;
SDL_BlitSurface (gfx.bomb.image, &src, gfx.screen, &dest);
gfx_AddUpdateRect (dest.x, dest.y, dest.w, dest.h);
};
void
bomb_explode (int p, int b)
{
int d;
_bomb *bomb = &bman.players[p].bombs[b];
d_printf ("Bomb Explode p:%d, b:%d [%d,%d]\n", p, b, bomb->pos.x, bomb->pos.y);
if (bomb->ex_nr == -1)
bomb->ex_nr = bman.last_ex_nr++; // set bomb explosion id
bomb->to = ANI_FIRETIMEOUT; /* set the timeout for the fireexplosion */
bomb->state = BS_exploding;
for (d = 0; d < 4; d++) {
bomb->firer[d] = 0;
bomb->firerst[d] = -1;
}
if (GT_MP_PTPM) /* from now on only the server let the bomb explode */
net_game_send_bomb (p, b);
};
void
bomb_loop ()
{
int p,
i;
_player *player;
_bomb *bomb;
for (p = 0; p < MAX_PLAYERS; p++) {
player = &bman.players[p];
if ((bman.players[p].state & PSFM_used) != 0) {
for (i = 0; i < MAX_BOMBS; i++) {
bomb = &player->bombs[i];
if (bomb->state == BS_ticking) {
if (GT_MP_PTPM || bman.gametype == GT_single) {
if (--bomb->to == 0) // bomb will have to explode in the next loop
bomb_explode (p, i);
else
draw_bomb (bomb);
}
else {
if (--bomb->to == 0) { // bomb did not explode -> resend bombdata
bomb->to = BOMB_TIMEOUT * TIME_FACTOR;
net_game_send_bomb (bman.p_nr, i);
bomb->to = bomb->to + ((2 * RESENDCACHE_RETRY) / TIME_FACTOR);
}
draw_bomb (bomb);
}
}
else if (bomb->state == BS_exploding) {
if (bomb->to > 0) {
do_explosion (p, i);
}
if (bomb->to == 0) { // explosion done
restore_explosion (bomb);
bomb->to = 0;
bomb->state = BS_off;
}
bomb->to--;
}
}
}
}
};
void
get_bomb_on (int x, int y, _point bombs[])
{
int p,
b,
i;
_bomb *bomb;
for (i = 0, p = 0; p < MAX_PLAYERS; p++)
if ((bman.players[p].state & PSFM_used) != 0) {
for (b = 0; b < MAX_BOMBS; b++) {
bomb = &bman.players[p].bombs[b];
if (bomb->state == BS_ticking) {
if (bomb->pos.x == x && bomb->pos.y == y) {
bombs[i].x = p;
bombs[i].y = b;
i++;
}
}
}
}
bombs[i].x = bombs[i].y = -1;
};
void
draw_fire (int x, int y, int d)
{
SDL_Rect src,
dest;
src.w = src.w = gfx.block.x;
dest.h = src.h = gfx.block.y;
dest.x = gfx.offset.x + x * gfx.block.x;
dest.y = gfx.offset.y + y * gfx.block.y;
src.y = 0;
src.x = d * src.w;
SDL_BlitSurface (gfx.fire.image, &src, gfx.screen, &dest);
gfx_AddUpdateRect (dest.x, dest.y, dest.w, dest.h);
};
void
restore_explosion (_bomb * bomb)
{
int i,
d;
int dx = 0,
dy = 0;
int _x,
_y;
for (d = 0; d < 4; d++) {
switch (d) {
case (left):
dx = -1;
dy = 0;
break;
case (right):
dx = 1;
dy = 0;
break;
case (up):
dx = 0;
dy = -1;
break;
case (down):
dx = 0;
dy = 1;
break;
}
_x = bomb->pos.x;
_y = bomb->pos.y;
for (i = 0; i < bomb->firer[d]; i++) {
bman.field[_x][_y].ex[d]--;
if (i == 0 && d == 3)
draw_stone (_x, _y);
if (i > 0)
draw_stone (_x, _y);
_x = _x + dx;
_y = _y + dy;
}
// delete the stone completly if there was any in the way
if (bomb->firer[d] <= bomb->r && bman.field[_x][_y].type != FT_block
&& bomb->ex_nr != bman.field[_x][_y].ex_nr) {
bman.field[_x][_y].ex_nr = bomb->ex_nr;
bman.field[_x][_y].frame = 0;
bman.field[_x][_y].frameto = 0;
if (bman.field[_x][_y].special != FT_nothing) {
bman.field[_x][_y].type = bman.field[_x][_y].special;
bman.field[_x][_y].special = FT_nothing;
d_printf ("field_explode (%d,%d) ex_nr = %d\n", _x, _y, bman.field[_x][_y].ex_nr);
}
else
bman.field[_x][_y].type = FT_nothing;
draw_stone (_x, _y);
if (GT_MP_PTPM) /* send only if we are the master */
net_game_send_field (_x, _y);
}
}
};
/*
check the field on which the explosion is
*/
int
explosion_check_field (int x, int y, int p, int b)
{
_bomb *bomb = &bman.players[p].bombs[b];
int pl[MAX_PLAYERS];
int i;
_point bo[MAX_PLAYERS * MAX_BOMBS];
_bomb *tmpbomb;
_player *tmpplayer;
if (x < 0 || x >= bman.fieldsize.x || y < 0 || y >= bman.fieldsize.y)
return FT_block;
get_player_on (x << 8, y << 8, pl);
get_bomb_on (x, y, bo);
// check if any bomb have to explode..
for (i = 0; bo[i].x != -1; i++) {
tmpbomb = &bman.players[bo[i].x].bombs[bo[i].y];
if (tmpbomb != bomb && tmpbomb->state != BS_exploding) {
tmpbomb->ex_nr = bomb->ex_nr; // set the ex_nr to identify explosions
bomb_explode (bo[i].x, bo[i].y);
}
}
// check if any player is in the explosion
for (i = 0; pl[i] != -1; i++) {
tmpplayer = &bman.players[pl[i]];
if (((tmpplayer->state & PSF_alife) != 0)
&& (bman.gametype == GT_single
|| (GT_MP_PTP && (&bman.players[bman.p_nr] == tmpplayer))))
player_died (tmpplayer, p);
}
// let the stones right beside explode
if (bman.field[x][y].type != FT_nothing
&& bman.field[x][y].type != FT_block && bomb->ex_nr != bman.field[x][y].ex_nr) {
if (bman.field[x][y].frame == 0) {
bman.field[x][y].frameto = ANI_STONETIMEOUT;
bman.field[x][y].frame = 1;
}
draw_stone (x, y);
}
return bman.field[x][y].type;
};
void
do_explosion (int p, int b)
{
_bomb *bomb = &bman.players[p].bombs[b];
int dx = 0,
dy = 0,
d;
for (d = 0; d < 4; d++) {
switch (d) {
case (left):
dx = -1;
dy = 0;
break;
case (right):
dx = 1;
dy = 0;
break;
case (up):
dx = 0;
dy = -1;
break;
case (down):
dx = 0;
dy = 1;
break;
}
if (bomb->firer[d] <= bomb->r) {
dx = bomb->firer[d] * dx;
dy = bomb->firer[d] * dy;
if (explosion_check_field (bomb->pos.x + dx, bomb->pos.y + dy, p, b) ==
BS_off && bomb->firerst[d] == -1) {
bomb->firer[d]++;
bman.field[bomb->pos.x + dx][bomb->pos.y + dy].ex[d]++;
draw_fire (bomb->pos.x + dx, bomb->pos.y + dy, d);
}
else {
bomb->firerst[d] = bomb->firer[d];
draw_stone (bomb->pos.x + dx, bomb->pos.y + dy);
}
}
}
};

@ -0,0 +1,213 @@
/* bomberman.h */
#ifndef _BOMBERCLONE_H_
#define _BOMBERCLONE_H_
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <time.h>
#include <ctype.h>
#ifdef _WIN32
#include <winsock.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#include <SDL.h>
#include "../config.h"
#include "gfx.h"
#include "network.h"
struct __playerilness {
int to; // if (to > 0) the ilness is still working
int data;
} typedef _playerilness;
struct __bomb {
_point pos; // lower byte = _X Higher Byte = FX
int firer[4]; // range of the fire for the fire for each direction
int firerst[4]; /* just save here where the direction was going to stop (-1)
if the exp is still growing */
int to; // timeout in ms after dropping the bomb. (loops * 0.0005sec)
int frame; // frame of the animation
int frameto; // timeout for the frame
unsigned char r; // range of the bomb
unsigned char state; // state of the bomb
int ex_nr; // explosion number
} typedef _bomb;
struct __player {
_gfxplayer *gfx; // pointer to the gfx information
int gfx_nr; // number of the player GFX
int frame; // step of the animation
int frameto; // timeout for the animation
int illframe;
int illframeto;
_point pos; /* position (without the offset)
_x = pos.x & 255; fx = pos.x >> 8; */
_point old; // the old position
signed char d; // direction
signed char m; // player is moving ?
signed char old_m; // to save the old state..
int bombs_n; // maximal number of bombs for the player
_bomb bombs[MAX_BOMBS]; // number of bombs who are ticking.
int range; // range of the bombs
int speed; // how fast we can go (0 = slow, 1 = normal... 3 = fastest)
int speeddat; // some data i need to do the speed thing
_playerilness ill[PI_max]; // all possible types
char name[LEN_PLAYERNAME]; // name oder name[0] == 0
unsigned char state; // status of the player
signed char in_nr; // number of the connected player entry
int points; // points
int wins; // wins
signed char dead_by; // player who killed this player
_net_player net; // holds all important network data
} typedef _player;
struct __field {
unsigned char type;
int frame; // frame (frame > 0 && FS_stone)
int frameto; // frame to
unsigned char special; // to save special stones
signed char ex[4]; // count up every explosion there is on this field for ever direction
int ex_nr; // number to identify the explosion.
} typedef _field;
struct __serverlist {
char name[255];
} typedef _serverlist;
struct __bomberclone {
_point fieldsize; // dimension of the field
char datapath[512];
_player players[MAX_PLAYERS];
int p_nr; // Playernumber 0 if you host a game or the number of the one you are.
_field field[MAX_FIELDSIZE_X][MAX_FIELDSIZE_Y];
int last_ex_nr; // number of the last explosion
unsigned char gametype;
unsigned char multitype;
unsigned char state;
char playername[LEN_PLAYERNAME];
int players_nr_s; // number of players at the beginning
int players_nr; // number of player who are alife
signed char lastwinner; // number of the last winnet
int maxplayer; // number of max players for the server
int sock; // the server socket
unsigned char net_ai_family;
char port[LEN_PORT]; // what port we're using
char servername[LEN_SERVERNAME + LEN_PORT + 2]; // holds the name of the current server
_serverlist serverlist[MAX_SERVERENTRYS]; // ** CONFIG name of the server we are connected to
char gamename[LEN_GAMENAME]; // this will hold the game name
char gamemaster[LEN_SERVERNAME + LEN_PORT + 2]; // ** CONFIG ... GameMaster Address
unsigned char notifygamemaster;
signed char net_pkgsend_to;
signed char net_pkgsend_set; // ** CONFIG
unsigned char selectplayer; // ask player for name at startup
signed char debug; // 0 = off 1 = on
} typedef _bomberclone;
struct __menu {
int index;
char text[255];
} typedef _menu;
extern _bomberclone bman;
extern Uint32 timestamp;
extern int debug;
// Game routines..
extern void game_draw_info ();
extern void game_loop ();
extern void single_game_new ();
extern void multi_new_game ();
extern void game_end ();
// everything is declared in field.c
extern void draw_field ();
extern void draw_stone (int x, int y);
extern void field_new ();
// everything what is declared in players.c
extern void dead_playerani ();
extern void draw_player (_player * player);
extern void restore_players_screen ();
extern void move_player ();
extern int stepmove_player ();
extern void player_drop_bomb ();
extern void get_player_on (short int x, short int y, int pl_nr[]);
extern void player_died (_player * player, signed char dead_by);
extern void draw_players ();
extern void player_animation (_player * player);
extern int check_field (short int fx, short int fy, _player * p);
extern void player_calcstep (_player * pl);
extern void player_calcpos ();
extern void player_set_ilness (_player *p, int t);
extern void player_clear_ilness (_player *p, int type);
extern void player_ilness_loop ();
extern void player_check_powerup (_player * p);
extern void player_set_gfx (_player *p, signed char gfx_nr);
// for the bomb..
extern void bomb_loop ();
extern void restore_bomb_screen ();
extern void get_bomb_on (int x, int y, _point bombs[]);
extern void draw_fire (int x, int y, int frame);
extern void do_explosion (int p, int b);
extern void restore_explosion (_bomb * bomb);
extern int explosion_check_field (int x, int y, int p, int b);
extern void bomb_explode (int p, int b);
// menus
extern void draw_select (int select, _menu menu[], int x, int y);
extern int menu_loop (char *menutitle, _menu menu[], int lastselect);
extern void draw_menu (char *text, _menu menu[], int *x, int *y);
extern void menu_get_text (char *title, char *text, int len);
extern void menu_displaymessage (char *title, char *text);
extern void menu_displaytext (char *title, char *text, Uint8 r, Uint8 g, Uint8 b);
// configuration
extern void configuration ();
extern void game_init ();
extern int ReadConfig();
extern int WriteConfig();
extern void ReadPrgArgs (int argc, char **argv);
// sysfunc.c
extern void s_delay (int ms);
extern int s_random (int maxnr);
extern char *s_gethomedir ();
// debug.c
extern void d_in_pl_detail (char *head);
extern void d_playerdetail (char *head);
extern void d_gamedetail (char *head);
extern void d_printf (char *fmt,...);
#endif

@ -0,0 +1,233 @@
/*
chat.c - this file will do everything what have to do with the chat..
*/
#include "bomberclone.h"
#include "network.h"
#include "packets.h"
#include "gfx.h"
#include "keybinput.h"
#include "chat.h"
_chat chat;
/* find a free line or delete the oldest one */
int
chat_findfreeline ()
{
int i;
for (i = 0; (i < CHAT_MAX_LINES && chat.lines[i][0] != 0); i++);
if (i >= CHAT_MAX_LINES) {
memcpy (chat.lines[1], chat.lines[0], 255);
i = 255;
}
chat.changed = 1;
return i;
}
void
chat_addline (char *text)
{
int l;
l = chat_findfreeline ();
strncpy (chat.lines[l], text, 255);
chat.lineschanged = 1;
}
void
chat_drawbox ()
{
SDL_Rect src;
int i;
if (chat.visible == 0)
chat.oldscreen = gfx_copyscreen (&chat.window);
chat.visible = 1;
if (gfx_locksurface (gfx.screen))
return;
for (i = 0; i < 2; i++) {
src.x = chat.window.x + i;
src.w = src.x + chat.window.w - 2;
src.y = chat.window.y + i;
src.h = src.y + chat.window.h - 2;
draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_BRIGHT);
}
gfx_unlocksurface (gfx.screen);
src.x = chat.window.x + 2;
src.y = chat.window.y + 2;
src.w = src.x + chat.window.w - 4;
src.h = src.y + chat.window.h - 4 - 16;
draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_DARK);
src.x = chat.window.x + 2;
src.y = chat.window.y + chat.window.h - 18;
src.w = src.x + chat.window.w - 4;
src.h = src.y + 16;
draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_DARK >> 1);
};
void
chat_deletebox ()
{
SDL_Rect src,
dest;
src.x = 0;
src.y = 0;
src.w = dest.w = chat.oldscreen->w;
src.h = dest.h = chat.oldscreen->h;
dest.x = chat.window.x;
dest.y = chat.window.y;
SDL_BlitSurface (chat.oldscreen, &src, gfx.screen, &dest);
gfx_AddUpdateRect (chat.window.x, chat.window.y, chat.window.w, chat.window.h);
chat.visible = 0;
SDL_FreeSurface (chat.oldscreen);
chat.oldscreen = NULL;
};
void
chat_show (int x1, int y1, int x2, int y2)
{
if (chat.visible != 0)
chat_deletebox ();
if (x1 == -1 || x2 == -1 || y1 == -1 || y2 == -1 || x2 <= x1 || y2 <= y1)
chat.visible = 0;
else {
chat.window.x = x1;
chat.window.y = y1;
chat.window.w = x2 - x1;
chat.window.h = y2 - y1;
chat_drawbox ();
keybinput_new (&chat.input);
gfx_AddUpdateRect (chat.window.x, chat.window.y, chat.window.w, chat.window.h);
chat.changed = 1;
chat.lineschanged = 1;
}
};
void
chat_clearscreen (signed char all)
{
SDL_Rect src,
dest;
if (all == 1) {
dest.x = chat.window.x + 2;
dest.y = chat.window.y + 2;
dest.w = dest.x + chat.window.w - 4;
dest.h = dest.y + chat.window.h - 4;
src.x = 2;
src.y = 2;
src.w = chat.window.w - 4;
src.h = chat.window.h - 4;
}
else {
/* redraw only the textline of out input box */
dest.x = chat.window.x + 2;
dest.y = chat.window.y + chat.window.h - 18;
dest.w = src.w = chat.window.w - 4;
dest.h = src.h = 16;
src.x = 2;
src.y = chat.window.h - 18;
}
SDL_BlitSurface (chat.oldscreen, &src, gfx.screen, &dest);
if (all == 1) {
dest.w = dest.x + chat.window.w - 4;
dest.h = dest.y + chat.window.h - 4 - 16;
draw_shadefield (gfx.screen, &dest, CHAT_BG_SHADE_DARK);
}
src.x = chat.window.x + 2;
src.y = chat.window.y + chat.window.h - 18;
src.w = src.x + chat.window.w - 4;
src.h = src.y + 16;
draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_DARK >> 1);
gfx_AddUpdateRect (chat.window.x, chat.window.y, chat.window.w, chat.window.h);
};
void
chat_loop (SDL_Event * event)
{
int i,
y,
l,
p1,
p2,
maxchar;
char text[255];
i = keybinput_loop (&chat.input, event);
if (i == 1 && chat.input.text[0] != 0) {
sprintf (text, "%s: %s", bman.playername, chat.input.text);
net_send_chat (text, 1);
chat_addline (text);
keybinput_new (&chat.input);
i = 0;
}
if (((i == 0 && chat.input.changed == 1) || chat.changed == 1) && chat.visible == 1) {
/* draw the new field */
chat_clearscreen (chat.lineschanged);
p1 = p2 = 0;
maxchar = (chat.window.w - 4) / (gfx.font.size.x - 4);
if (chat.lineschanged) {
y = chat.window.y + 4;
l = chat.startline;
while (y < (chat.window.y + chat.window.h - 32) && chat.lines[l][0] != 0) {
for (p1 = 0; (p1 < maxchar && chat.lines[l][p2] != 0); p1++)
text[p1] = chat.lines[l][p2++];
text[p1] = 0;
draw_text (chat.window.x + 4, y, text, 1);
if (chat.lines[l][p2] == 0) { // the end of the line
l++;
p2 = 0;
}
y = y + gfx.font.size.y;
}
if (chat.lines[l][0] != 0) {
chat.startline++;
chat.changed = 1;
chat.lineschanged = 1;
}
else {
chat.changed = 0;
chat.lineschanged = 0;
}
}
if (chat.startline >= CHAT_MAX_LINES)
chat.startline = CHAT_MAX_LINES - 5;
/* draw the input line */
if (chat.input.len > maxchar)
p2 = chat.input.len - maxchar;
for (p1 = 0; (p1 < maxchar && chat.input.text[p2] != 0); p1++)
text[p1] = chat.input.text[p2++];
text[p1] = 0;
draw_text (chat.window.x + 4, (chat.window.y + chat.window.h) - 4 - gfx.font.size.y, text,
1);
}
};

@ -0,0 +1,28 @@
#ifndef _CHAT_H_
#define _CHAT_H_
#include "keybinput.h"
#define CHAT_MAX_LINES 255
#define CHAT_BG_SHADE_DARK -64
#define CHAT_BG_SHADE_BRIGHT 64
struct __chat {
SDL_Rect window;
signed char visible;
signed char changed;
SDL_Surface *oldscreen;
short int startline;
char lines[CHAT_MAX_LINES][255];
signed char lineschanged;
_keybinput input;
} typedef _chat;
extern _chat chat;
extern void chat_show (int x1, int y1, int x2, int y2);
extern void chat_addline (char *text);
extern void chat_loop (SDL_Event *event);
#endif

@ -0,0 +1,374 @@
/* configuration */
#include <SDL.h>
#ifdef _WIN32
#include <winsock.h>
#else
#include <sys/socket.h>
#endif
#include "bomberclone.h"
#include "network.h"
#include "packets.h"
#include "gfx.h"
#include "chat.h"
void
game_init ()
{
int i;
srandom (((int) time (NULL)));
// do some init stuff
for (i = 0; i < MAX_SERVERENTRYS; i++)
bman.serverlist[i].name[0] = 0;
for (i = 0; i < MAX_PLAYERS; i++) {
bman.players[i].gfx = NULL; /* we will select them in the wait_for_players loop */
bman.players[i].gfx_nr = -1; /* and even now in the singleplayer menu */
}
chat.visible = 0;
chat.startline = 0;
for (i = 0; i < CHAT_MAX_LINES; i++)
chat.lines[i][0] = 0;
bman.maxplayer = MAX_PLAYERS;
bman.net_ai_family = PF_INET;
bman.net_pkgsend_set = 2;
bman.gamename[0] = 0;
sprintf (bman.port, "%d", DEFAULT_UDPPORT);
sprintf (bman.gamemaster, DEFAULT_GAMEMASTER);
resend_cache.data = NULL;
resend_cache.fill = -1;
bman.notifygamemaster = 1;
bman.selectplayer = 1;
debug = 0;
gfx.res.x = 640;
gfx.res.y = 480;
bman.fieldsize.x = 25;
bman.fieldsize.y = 17;
sprintf (bman.datapath, "data/bomberclone.gfx");
};
int
ReadConfig ()
{
FILE *config;
char buf[200],
key2[50];
char *findit,
*keyword,
*value;
int i;
char filename[512];
#ifdef _WIN32
sprintf (filename, "%sbomberclone.cfg", s_gethomedir ());
#else
sprintf (filename, "%s.bomberclone.cfg", s_gethomedir ());
#endif
config = fopen (filename, "r");
if (config == NULL) {
d_printf ("Error: Config file not found!\n");
return -1;
}
d_printf ("Reading Config-file: %s", filename);
/* printf("Reading config file...\n"); */
while (fgets (buf, sizeof (buf), config) != NULL) {
findit = strchr (buf, '\n');
if (findit)
findit[0] = '\0';
if (buf[0] == '\0')
continue;
keyword = buf;
while (isspace (*keyword))
keyword++;
value = strchr (buf, '=');
if (value == NULL)
continue;
*value = 0;
value++;
while (*value == ' ')
value++;
while (keyword[strlen (keyword) - 1] == ' ')
keyword[strlen (keyword) - 1] = 0;
while (value[strlen (value) - 1] == ' ')
value[strlen (value) - 1] = 0;
if (strlen (value) == 0)
continue;
for (i = 0; i < (int) strlen (keyword); i++)
keyword[i] = tolower (keyword[i]);
if (!strcmp (keyword, "playername")) {
if (strlen (value) > LEN_PLAYERNAME) {
d_printf
("*** Error - playername too long (maximum size permitted is %d characters)!\n\n",
LEN_PLAYERNAME);
}
value[LEN_PLAYERNAME - 1] = 0;
strcpy (bman.playername, value);
}
if (!strcmp (keyword, "gamename")) {
if (strlen (value) > LEN_GAMENAME) {
d_printf
("*** Error - servername too long (maximum size permitted is %d characters)!\n\n",
LEN_GAMENAME);
}
value[LEN_GAMENAME - 1] = 0;
strcpy (bman.gamename, value);
}
if (!strcmp (keyword, "selectplayer")) {
bman.selectplayer = atoi (value);
}
if (!strcmp (keyword, "resolutionx")) {
gfx.res.x = atoi (value);
}
if (!strcmp (keyword, "resolutiony")) {
gfx.res.y = atoi (value);
}
if (!strcmp (keyword, "fieldsizex")) {
bman.fieldsize.x = atoi (value);
}
if (!strcmp (keyword, "fieldsizey")) {
bman.fieldsize.y = atoi (value);
}
if (!strcmp (keyword, "fullscreen")) {
gfx.fullscreen = atoi (value);
}
if (!strcmp (keyword, "ai_family")) {
bman.net_ai_family = atoi (value);
}
if (!strcmp (keyword, "debug")) {
debug = atoi (value);
}
if (!strcmp (keyword, "notify")) {
bman.notifygamemaster = atoi (value);
}
if (!strcmp (keyword, "masterserver")) {
strcpy (bman.gamemaster, value);
}
if (!strcmp (keyword, "maxplayer")) {
bman.maxplayer = atoi (value);
}
for (i = 0; i < MAX_SERVERENTRYS; i++) {
sprintf (key2, "ip%d", i);
if (!strcmp (keyword, key2)) {
strcpy (bman.serverlist[i].name, value);
}
}
}
fclose (config);
return 0;
}
int
WriteConfig ()
{
FILE *config;
int i;
char filename[512];
#ifdef _WIN32
sprintf (filename, "%sbomberclone.cfg", s_gethomedir ());
#else
sprintf (filename, "%s.bomberclone.cfg", s_gethomedir ());
#endif
if ((config = fopen (filename, "w")) == NULL)
return -1;
fprintf (config, "resolutionx=%d\n", gfx.res.x);
fprintf (config, "resolutiony=%d\n", gfx.res.y);
fprintf (config, "fullscreen=%d\n", gfx.fullscreen);
fprintf (config, "fieldsizex=%d\n", bman.fieldsize.x);
fprintf (config, "fieldsizey=%d\n", bman.fieldsize.y);
fprintf (config, "notify=%d\n", bman.notifygamemaster);
fprintf (config, "ai_family=%d\n", bman.net_ai_family);
fprintf (config, "masterserver=%s\n", bman.gamemaster);
fprintf (config, "gamename=%s\n", bman.gamename);
fprintf (config, "maxplayer=%d\n", bman.maxplayer);
for (i = 0; i < MAX_SERVERENTRYS; i++)
fprintf (config, "ip%d=%s\n", i, bman.serverlist[i].name);
fprintf (config, "debug=%d\n", debug);
fprintf (config, "selectplayer=%d\n", bman.selectplayer);
fprintf (config, "playername=%s\n", bman.playername);
fclose (config);
return 0;
}
void
change_res ()
{
int menuselect = 0;
_menu menu[] = {
{0, "Full Screen"},
{1, "640x480"},
{2, "800x600"},
{3, "1024x768"},
{4, "1280x1024"},
{5, "Return To Configuration Menu"},
{-1, ""}
};
while (1) {
if (gfx.fullscreen)
sprintf (menu[0].text, "Disable Fullscreen");
else
sprintf (menu[0].text, "Enable Full Screen");
menuselect = menu_loop ("Video Options", menu, menuselect);
switch (menuselect) {
case (0): // Fullscreen
if (gfx.fullscreen)
gfx.fullscreen = 0;
else
gfx.fullscreen = 1;
break;
case (1): // 640x480
gfx.res.x = 640;
gfx.res.y = 480;
break;
case (2): // 800x600
gfx.res.x = 800;
gfx.res.y = 600;
break;
case (3): // 1024x768
gfx.res.x = 1024;
gfx.res.y = 768;
break;
case (4): // 1280x1024
gfx.res.x = 1280;
gfx.res.y = 1024;
break;
case (5): // Return
menuselect = -1;
break;
}
if (menuselect != -1) {
gfx_shutdown ();
gfx_init ();
}
else
return;
}
};
void
configuration ()
{
int menuselect = 0;
char text[255];
_menu menu[] = {
{0, "Player Name:"},
{1, "Video Options"},
{2, "Sound Options"},
{3, "Customize Keyboard"},
{4, "Field Size X:"},
{5, "Field Size Y:"},
{6, "Prompt For Player Name"},
{7, "Debug"},
{8, "Save Config"},
{9, "Return To Main Manu"},
{-1, ""}
};
while (menuselect != -1) {
sprintf (menu[0].text, "Player Name: %s", bman.playername);
sprintf (menu[4].text, "Field Size X: %d", bman.fieldsize.x);
sprintf (menu[5].text, "Field Size Y: %d", bman.fieldsize.y);
if (debug == 1)
sprintf (menu[6].text, "Debug Messages ON");
else
sprintf (menu[6].text, "Debug Messages OFF");
if (bman.selectplayer == 1)
sprintf (menu[6].text, "Prompt For Name: Yes");
else
sprintf (menu[6].text, "Prompt For Name: No");
menuselect = menu_loop ("Configuration", menu, menuselect);
switch (menuselect) {
case (0): // Playername
menu_get_text ("Enter Playername", bman.playername, LEN_PLAYERNAME - 1);
bman.playername[LEN_PLAYERNAME - 1] = 0;
break;
case (1): // Screen Options
change_res ();
break;
case (2): // Sound Options
case (3): // Customize Keyboard
break;
case (4): // Change X Fieldsize
sprintf (menu[4].text, "%d", bman.fieldsize.x);
sprintf (text, "Field Size X (%d - %d)", MIN_FIELDSIZE_X, MAX_FIELDSIZE_X);
menu_get_text (text, menu[4].text, 3);
bman.fieldsize.x = atoi (menu[4].text) | 1;
if (bman.fieldsize.x < MIN_FIELDSIZE_X)
bman.fieldsize.x = MIN_FIELDSIZE_X;
if (bman.fieldsize.x > MAX_FIELDSIZE_X)
bman.fieldsize.x = MAX_FIELDSIZE_X;
break;
case (5): // Change Y Fieldsize
sprintf (menu[5].text, "%d", bman.fieldsize.y);
sprintf (text, "Field Size Y (%d - %d)", MIN_FIELDSIZE_Y, MAX_FIELDSIZE_Y);
menu_get_text (text, menu[5].text, 3);
bman.fieldsize.y = atoi (menu[5].text) | 1;
if (bman.fieldsize.y < MIN_FIELDSIZE_Y)
bman.fieldsize.y = MIN_FIELDSIZE_Y;
if (bman.fieldsize.y > MAX_FIELDSIZE_Y)
bman.fieldsize.y = MAX_FIELDSIZE_Y;
break;
case (6): // Debugging On / Off
if (bman.selectplayer == 1)
bman.selectplayer = 0;
else
bman.selectplayer = 1;
break;
case (7): // Debugging On / Off
if (debug == 1)
debug = 0;
else {
debug = 1;
d_printf ("BomberClone ver.%s (%d) \n", VERSION, SUB_VERSION);
}
break;
case (8): // Save Configuration
WriteConfig ();
break;
case (9): // Return to main menu
menuselect = -1;
break;
}
}
};
void
ReadPrgArgs (int argc, char **argv)
{
int i = 0;
while (argv[++i] != NULL) {
if (!strcmp (argv[i], "-port"))
strncpy (bman.port, argv[++i], LEN_PORT);
}
};

@ -0,0 +1,39 @@
#include "bomberclone.h"
#include "network.h"
#include "packets.h"
int debug;
void d_gamedetail (char *head) {
d_playerdetail (head);
d_printf ("bman.players_nr = %d\n", bman.players_nr);
d_printf ("bman.players_nr_s = %d\n", bman.players_nr_s);
d_printf ("bman.gametype = %d\n", bman.gametype);
d_printf ("bman.multitype = %d\n", bman.multitype);
d_printf ("bman.state = %d\n", bman.state);
};
void d_printf (char *fmt,...) {
va_list args;
if (debug == 0)
return;
va_start (args, fmt);
fprintf (stdout, "[%8d] :", timestamp);
vfprintf (stdout, fmt, args);
va_end (args);
};
void d_playerdetail (char *head) {
int i;
d_printf ("---------------> %s\n", head);
d_printf ("Nr Name GFX Sta Pkt Win [Addr]\n");
for (i = 0; i < MAX_PLAYERS; i++)
d_printf ("%2d %16s %3d %3d %3d %3d [%s:%s]\n",i, bman.players[i].name, bman.players[i].gfx_nr, bman.players[i].state, bman.players[i].points, bman.players[i].wins, bman.players[i].net.addr.host, bman.players[i].net.addr.port);
};

@ -0,0 +1,172 @@
/* field.c - procedures which are needed to control the field */
#include <stdlib.h>
#include <SDL.h>
#include "bomberclone.h"
#include "gfx.h"
void
draw_stone (int x, int y)
{
_field *stone = &bman.field[x][y];
SDL_Rect dest,
src;
SDL_Surface *srcimg;
int i,
d;
src.w = dest.w = gfx.block.x;
src.h = dest.h = gfx.block.y;
dest.x = x * gfx.block.x + gfx.offset.x;
dest.y = y * gfx.block.y + gfx.offset.y;
src.x = 0;
if (stone->frame == 0 || stone->type != FT_stone) {
srcimg = gfx.field[stone->type].image;
src.y = 0;
}
else {
if (stone->frameto == 0) {
if (stone->frame < gfx.field[stone->type].frames) {
stone->frame++;
stone->frameto = ANI_STONETIMEOUT;
}
}
if (stone->frameto > 0)
stone->frameto--;
if (stone->frame < gfx.field[stone->type].frames) {
src.y = stone->frame * gfx.block.y;
srcimg = gfx.field[stone->type].image;
}
else {
src.y = 0;
srcimg = gfx.field[FT_nothing].image;
}
}
if (stone->frame > 0)
SDL_BlitSurface (gfx.field[FT_nothing].image, NULL, gfx.screen, &dest);
SDL_BlitSurface (srcimg, &src, gfx.screen, &dest);
// draw explosions if there is any
for (d = 0, i = 0; d < 4; d++)
if (stone->ex[d] > 0) {
i = 1; // mark that there is already an explosion
draw_fire (x, y, d);
}
if (i == 0) // we don't have to do this anymore because this was happend in draw_fire
gfx_AddUpdateRect (dest.x, dest.y, dest.w, dest.h);
return;
};
void
draw_field ()
{
int x,
y;
for (x = 0; x < bman.fieldsize.x; x++)
for (y = 0; y < bman.fieldsize.y; y++)
draw_stone (x, y);
};
void
field_new ()
{
int x,
y,
d;
float fkt = ((float)(bman.fieldsize.x * bman.fieldsize.y))/(25.0 * 17.0);
// Clean the field //
for (x = 0; x < bman.fieldsize.x; x++)
for (y = 0; y < bman.fieldsize.y; y++) {
if ((y == 0) || (y == bman.fieldsize.y - 1))
bman.field[x][y].type = FT_block;
else if ((x == 0) || (x == bman.fieldsize.x - 1))
bman.field[x][y].type = FT_block;
else if (((x & 1) == 0) && ((y & 1) == 0))
bman.field[x][y].type = FT_block;
else {
// create random field
if ((random () & 3) == 0)
bman.field[x][y].type = FT_nothing;
else
bman.field[x][y].type = FT_stone;
}
for (d = 0; d < 4; d++)
bman.field[x][y].ex[d] = 0;
bman.field[x][y].ex_nr = -1;
bman.field[x][y].frame = 0;
bman.field[x][y].frameto = 0;
bman.field[x][y].special = FT_nothing;
}
/* get some free space for the playerstart position */
for (d = 0; d < MAX_PLAYERS; d++)
if ((PS_IS_alife (bman.players[d].state)) != 0) {
x = bman.players[d].pos.x >> 8;
y = bman.players[d].pos.y >> 8;
bman.field[x][y].type = FT_nothing;
if (x > 1)
bman.field[x-1][y].type = FT_nothing;
if (x < bman.fieldsize.x-2)
bman.field[x+1][y].type = FT_nothing;
if (y > 1)
bman.field[x][y-1].type = FT_nothing;
if (y < bman.fieldsize.y -2)
bman.field[x][y+1].type = FT_nothing;
}
/* put the fire powerups in the field */
for (d = 0, x = 0, y = 0; d < GAME_SPECIAL_ITEMFIRE * fkt; d++) {
while (bman.field[x][y].type != FT_stone || bman.field[x][y].special != FT_nothing) {
x = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.x-1);
y = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.y-1);
}
bman.field[x][y].special = FT_fire;
x = y = 0;
}
/* put the bomb powerups in the field */
for (d = 0, x = 0, y = 0; d < GAME_SPECIAL_ITEMBOMB * fkt; d++) {
while (bman.field[x][y].type != FT_stone || bman.field[x][y].special != FT_nothing) {
x = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.x-1);
y = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.y-1);
}
bman.field[x][y].special = FT_bomb;
x = y = 0;
}
/* put the shoe powerup in the field */
for (d = 0, x = 0, y = 0; d < GAME_SPECIAL_ITEMSHOE * fkt; d++) {
while (bman.field[x][y].type != FT_stone || bman.field[x][y].special != FT_nothing) {
x = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.x-1);
y = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.y-1);
}
bman.field[x][y].special = FT_shoe;
x = y = 0;
}
/* put the death ?powerups? in the field */
for (d = 0, x = 0, y = 0; d < GAME_SPECIAL_ITEMDEATH * fkt; d++) {
while (bman.field[x][y].type != FT_stone || bman.field[x][y].special != FT_nothing) {
x = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.x-1);
y = ((float) rand() / (float) RAND_MAX) * (bman.fieldsize.y-1);
}
bman.field[x][y].special = FT_death;
x = y = 0;
}
}

@ -0,0 +1,36 @@
// Using Fonts in SDL
#include <string.h>
#include <SDL.h>
#include "bomberclone.h"
#include "gfx.h"
void
draw_text (int x, int y, char *text, int white)
{
int i,
c;
SDL_Rect src,
dest;
src.y = 0;
dest.w = src.w = gfx.font.size.x;
dest.h = src.h = gfx.font.size.y;
dest.x = x;
dest.y = y;
for (i = 0; text[i] != 0; i++) {
c = text[i];
src.x = gfx.font.size.x * (c & 15);
src.y = gfx.font.size.y * ((c & 240) >> 4);
if (white)
SDL_BlitSurface (gfx.font.image, &src, gfx.screen, &dest);
else
SDL_BlitSurface (gfx.font1.image, &src, gfx.screen, &dest);
dest.x += gfx.font.size.x-4;
}
gfx_AddUpdateRect (x, y, dest.x - x, dest.h);
};

@ -0,0 +1,374 @@
/* game.c - procedures for the game. */
#include <string.h>
#include <SDL.h>
#include "bomberclone.h"
#include "gfx.h"
#include "network.h"
#include "packets.h"
#include "chat.h"
extern int UpdateRects_nr;
void
game_draw_info ()
{
int i,
x,
j,
gfx_oldRects;
char text[255];
char scrtext[255];
SDL_Rect src, dest;
redraw_logo (0, 0, gfx.res.x, 3*16);
gfx_AddUpdateRect (0,0, gfx.res.x, 3*16);
gfx_oldRects = UpdateRects_nr;
bman.players_nr = 0;
/* draw Player names */
if (GT_MP_PTP) {
for (x = 0, j = 0, i = 0; i < MAX_PLAYERS; i++)
if ((bman.players[i].state & PSFM_used) != 0) {
if (bman.players[i].gfx_nr != -1 && PS_IS_used (bman.players[i].state)) {
src.x = 3 * bman.players[i].gfx->smal_size.x;
src.y = 0;
src.w = dest.w = bman.players[i].gfx->smal_size.x;
src.h = dest.h = bman.players[i].gfx->smal_size.y;
dest.x = x;
dest.y = j - 4;
SDL_BlitSurface (bman.players[i].gfx->smal_image, &src, gfx.screen, &dest);
}
sprintf (scrtext, "%10s:%2d", bman.players[i].name, bman.players[i].points);
if ((bman.players[i].state & PSFM_alife) != PSFM_alife) { // Player is dead
draw_text (x, j, scrtext, 0);
if ((bman.players[i].state & PSF_used) != PSF_used)
draw_text (x, j, "-------------", 1);
}
else { // players is alife
draw_text (x, j, scrtext, 1);
bman.players_nr++;
}
x = x + 170;
if (x >= gfx.res.x - (120 + 170)) {
x = 0;
j = j + 14;
}
}
}
x = gfx.res.x - 120;
sprintf (text, "Bombs: %2d", bman.players[bman.p_nr].bombs_n);
draw_text (x, 0, text, 1);
sprintf (text, "Range: %2d", bman.players[bman.p_nr].range);
draw_text (x, 16, text, 1);
sprintf (text, "Speed: %2d", bman.players[bman.p_nr].speed);
draw_text (x, 32, text, 1);
if (bman.state == GS_ready && GT_MP_PTPM)
draw_text (100, 32, "Press F4 to start the game", 1);
else if (bman.state == GS_ready)
draw_text (100, 32, "Waiting for the Server to Start", 1);
gfx_AddUpdateRect (100, 32, gfx.res.x - 100, 16);
if (chat.visible == 0) {
SDL_Flip (gfx.screen);
chat_show (4, 3*16, gfx.res.x - 4, gfx.offset.y);
}
};
void
game_loop ()
{
SDL_Event event;
Uint8 *keys;
int done = 0;
Uint32 timeloop1;
int gameovertimeout = TIME_FACTOR * 5; // gameovertimeout
unsigned char key_bomb = 0; // last state of the bomb key
draw_logo ();
draw_field ();
if (GT_MP_PTP)
net_game_fillsockaddr ();
SDL_Flip (gfx.screen);
timestamp = SDL_GetTicks (); // needed for time sync.
d_gamedetail ("GAME START");
while (!done && (bman.state == GS_running || bman.state == GS_ready)) {
if (SDL_PollEvent (&event) != 0)
switch (event.type) {
case (SDL_QUIT):
done = 1;
bman.state = GS_quit;
}
/* keyboard handling */
keys = SDL_GetKeyState (NULL);
/* only do movements if we're alife and GS_running */
if ((bman.players[bman.p_nr].state & PSFM_alife) == PSFM_alife && bman.state == GS_running) {
if (keys[SDLK_UP]) {
bman.players[bman.p_nr].d = up;
bman.players[bman.p_nr].m = 1;
}
if (keys[SDLK_DOWN]) {
bman.players[bman.p_nr].d = down;
bman.players[bman.p_nr].m = 1;
}
if (keys[SDLK_RIGHT]) {
bman.players[bman.p_nr].d = right;
bman.players[bman.p_nr].m = 1;
}
if (keys[SDLK_LEFT]) {
bman.players[bman.p_nr].d = left;
bman.players[bman.p_nr].m = 1;
}
if (keys[SDLK_LCTRL] || keys[SDLK_RCTRL]) {
if (key_bomb == 0)
player_drop_bomb ();
key_bomb = 1;
}
else
key_bomb = 0;
if (keys[SDLK_LSHIFT] || keys[SDLK_RSHIFT]) {
d_printf ("not in use yet\n");
}
}
else if (GT_MP_PTPM && keys[SDLK_F4] && event.type == SDL_KEYDOWN) {
/* Server is starting the game */
bman.state = GS_running;
net_send_servermode ();
}
if (event.key.keysym.sym == SDLK_ESCAPE && event.type == SDL_KEYDOWN) {
bman.state = GS_startup;
done = 1;
}
chat_loop (&event);
restore_players_screen ();
restore_bomb_screen ();
player_ilness_loop ();
if ((bman.players[bman.p_nr].state & PSFM_alife) == PSFM_alife)
move_player ();
player_calcpos ();
dead_playerani (); /* we need it to draw dead players */
if (bman.gametype != GT_single)
network_loop ();
/* this will even set the variable "bman.player_nr"
to let us know how much Players are still left */
game_draw_info ();
bomb_loop ();
draw_players ();
gfx_UpdateRects ();
/* check if there is only one player left and the game is in multiplayer mode
and if there the last dieing animation is done */
if ((GT_MP_PTPM) && bman.players_nr < 2)
gameovertimeout--;
/* check if we died and we are in single mode and the animation is done */
if (bman.gametype == GT_single && !PS_IS_alife(bman.players[bman.p_nr].state))
gameovertimeout--;
if (gameovertimeout <= 0) {
d_printf ("GAME: Game Over 'Cause only one or noone anymore alife\n");
done = 1;
}
// calculate time sync.
timeloop1 = SDL_GetTicks ();
while (timeloop1 - timestamp >= 0 && timeloop1 - timestamp < 20) {
s_delay (timeloop1 - timestamp - 1);
timeloop1 = SDL_GetTicks ();
}
timestamp = timeloop1;
}
chat_show (-1, -1, -1, -1);
d_gamedetail ("GAME END");
d_printf ("done = %d\n", done);
};
void
single_game_new ()
{
int p,
i;
// set players on field 1,1
for (p = 0; p < MAX_PLAYERS; p++) {
bman.players[p].pos.x = 1 << 8;
bman.players[p].pos.y = 1 << 8;
bman.players[p].state = 0;
// reset bombs
bman.players[p].bombs_n = START_BOMBS;
bman.players[p].range = START_RANGE;
bman.players[p].speed = START_SPEED;
for (i = 0; i < MAX_BOMBS; i++) {
bman.players[p].bombs[i].state = BS_off;
bman.players[p].bombs[i].ex_nr = -1;
}
for (i = 0; i < PI_max; i++)
bman.players[p].ill[i].to = 0;
bman.players[p].frame = 0;
bman.players[p].frameto = 0;
bman.players[p].d = 0;
}
bman.p_nr = 0;
bman.players[bman.p_nr].state = PSFM_alife;
player_set_gfx (&bman.players[bman.p_nr], 0);
bman.last_ex_nr = 1;
field_new ();
bman.players_nr_s = 1;
bman.players_nr = 1;
bman.gametype = GT_single;
bman.state = GS_running;
};
/*
this routine is only for the server.
after this the data should be transfered to the other clients.
*/
void
multi_new_game ()
{
int p,
i,
j,
dx,
dy,
mx,
my,
dist;
// set players thier fields
for (i = 0; i < MAX_PLAYERS; i++)
bman.players[i].pos.y = bman.players[i].pos.x = -1;
bman.players_nr = 0;
p = 50;
dist = 8;
while (p == 50) {
p = 0;
dist--;
for (i = 0; (p < 50 && i < MAX_PLAYERS);) {
bman.players[i].pos.x = 2 * (s_random ((bman.fieldsize.x - 1) / 2)) + 1;
bman.players[i].pos.y = 2 * (s_random ((bman.fieldsize.y - 1) / 2)) + 1;
mx = my = 100;
for (j = 0; j <= i; j++) { /* search smalest distance */
dy = bman.players[i].pos.y - bman.players[j].pos.y;
dx = bman.players[i].pos.x - bman.players[j].pos.x;
if (dy < 0)
dy = -dy;
if (dx < 0)
dx = -dx;
if (mx > dx && i != j)
mx = dx;
if (my > dy && i != j)
my = dy;
}
if (mx > dist || my > dist)
i++;
else
p++;
}
}
bman.players_nr_s = 0;
for (p = 0; p < MAX_PLAYERS; p++) {
bman.players[p].pos.x = bman.players[p].pos.x << 8;
bman.players[p].pos.y = bman.players[p].pos.y << 8;
bman.players[p].frame = 0;
bman.players[p].frameto = 0;
if (PS_IS_used (bman.players[p].state)) {
bman.players_nr_s++;
if (bman.players[p].gfx_nr == -1) {
bman.players[p].gfx = NULL;
bman.players[p].state &= (0xff - (PSF_alife + PSF_playing));
}
else {
bman.players[p].state |= PSF_alife + PSF_playing;
bman.players[p].gfx = &gfx.players[bman.players[p].gfx_nr];
}
}
else
bman.players[p].state = 0;
bman.players[p].bombs_n = START_BOMBS;
bman.players[p].range = START_RANGE;
bman.players[p].speed = START_SPEED;
for (i = 0; i < PI_max; i++) /* all types of illnes turn them off */
bman.players[p].ill[i].to = 0;
bman.players[p].frame = 0;
bman.players[p].frameto = 0;
bman.players[p].d = 0;
// reset bombs
for (i = 0; i < MAX_BOMBS; i++) {
bman.players[p].bombs[i].state = BS_off;
bman.players[p].bombs[i].ex_nr = -1;
}
}
field_new ();
bman.players[bman.p_nr].state &= (0xFF - PSF_net); // we are the local player
bman.last_ex_nr = 1;
};
/* check which player won */
void
game_end ()
{
int i;
/* count the points */
for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_used (bman.players[i].state)) {
if (PS_IS_alife (bman.players[i].state)) {
bman.lastwinner = i;
bman.players[i].wins++;
bman.players[i].points += bman.players_nr_s;
}
}
/* check which player is now free ,i.e. disconnected during the game and was playing */
for (i = 0; i < MAX_PLAYERS; i++)
if ((bman.players[i].state & PSF_used ) == 0)
bman.players[i].state = 0;
}

@ -0,0 +1,469 @@
/*
GameServer: this file will hold the protocol for the gameserver communication
*/
#include "bomberclone.h"
#include "network.h"
#include "gamesrv.h"
static int sock = -1;
struct game_entry gse[MAX_GAMESRVENTRYS];
_menu menu[22];
int menuselect = 0;
/*
We want to get a server
*/
void
gamesrv_getserver ()
{
int i,
keypressed = 0,
done = 0,
ds = 0,
gserv = bman.notifygamemaster,
bx,
by;
SDL_Event event;
Uint8 *keys;
menuselect = 0;
for (i = 0; i < MAX_GAMESRVENTRYS; i++) {
gse[i].name[0] = 0;
gse[i].host[0] = 0;
gse[i].port[0] = 0;
}
for (i = 0; i < 21; i++) {
menu[i].index = 0;
menu[i].text[0] = 0;
}
if (!gserv) {
menu[0].index = 1;
sprintf (menu[0].text, "Scan for Games on the MasterServer");
}
sprintf (menu[10].text, "User defined Server List");
menu[20].index = 1;
sprintf (menu[20].text, "Enter an IP-Address");
menu[21].index = -1;
for (i = 1; i <= MAX_SERVERENTRYS; i++) {
menu[i + 10].index = 1;
sprintf (menu[i + 10].text, "%d) %s", i, bman.serverlist[i - 1].name);
}
draw_logo ();
draw_menu ("Select Server", menu, &bx, &by);
if (gserv) {
if (gamesrv_startudp () == -1)
return;
gamesrv_browse (1);
}
draw_select (menuselect, menu, bx, by);
SDL_Flip (gfx.screen);
while (menuselect != -1 && done == 0) {
if (gserv)
i = gamesrv_getglist ();
/*keyboard */
if (SDL_PollEvent (&event) != 0)
switch (event.type) {
case (SDL_QUIT):
bman.state = GS_quit;
menuselect = -1;
done = 1;
}
keys = SDL_GetKeyState (NULL);
if (keys[SDLK_ESCAPE] && event.type == SDL_KEYDOWN) {
/* we want to quit */
done = 1;
keypressed = 1;
menuselect = -1;
}
if (keys[SDLK_DOWN] && (!keypressed)) {
d_printf ("down:%d\n", menu[menuselect].index);
menuselect++;
while (menu[menuselect].index == 0)
menuselect++;
if (menu[menuselect].index == -1) {
menuselect = 0;
while (menu[menuselect].index == 0)
menuselect++;
}
keypressed = 1;
ds = 1;
}
if (keys[SDLK_UP] && (!keypressed)) {
d_printf ("up\n");
menuselect--;
while (menu[menuselect].index == 0 && menuselect >= 0)
menuselect--;
if (menuselect == -1)
menuselect = 20;
keypressed = 1;
ds = 1;
}
if (keys[SDLK_RETURN] && (!keypressed)) {
if (menuselect == 0 && !gserv) {
gserv = 1;
if (gamesrv_startudp () == -1)
return;
gamesrv_browse (1);
} else done=1;
keypressed = 1;
}
if (event.type == SDL_KEYUP)
keypressed = 0;
else if (event.type == SDL_KEYDOWN)
keypressed = 1;
if (i) {
draw_logo ();
draw_menu ("Select Server", menu, &bx, &by);
draw_select (menuselect, menu, bx, by);
ds = 0;
SDL_Flip (gfx.screen);
}
else if (ds) {
draw_select (menuselect, menu, bx, by);
ds = 0;
SDL_Flip (gfx.screen);
}
s_delay (250);
}
if (menuselect > 0 && menuselect < 10) {
i = (menuselect - 1);
if (gse[i].name[0] != 0 && gse[i].host[0] != 0 && gse[i].port[0] != 0 &&
(gse[i].state == GS_wait || gse[i].state == GS_running
|| gse[i].state == GS_ready)) {
/* add if we are on Linux + and Windows and ai_family == PF_INET */
#ifdef _WIN32
if (gse[i].ai_family == PF_INET) {
sprintf (bman.servername, "%s:%s", gse[i].host, gse[i].port);
bman.net_ai_family = gse[i].ai_family;
}
#else
sprintf (bman.servername, "%s:%s", gse[i].host, gse[i].port);
d_printf("%s xxx %s xxx %s",gse[i].host,gse[i].port,bman.servername);
bman.net_ai_family = gse[i].ai_family;
#endif
}
} else if (menuselect >= 11 && menuselect < 19)
/* User defined Servers */
strncpy (bman.servername, bman.serverlist[menuselect - 11].name,
LEN_SERVERNAME + LEN_PORT + 2);
else if (menuselect == 20) {
/* enter address */
menu_get_text ("Enter Address", bman.servername, LEN_SERVERNAME + LEN_PORT + 2);}
if (gserv) {
gamesrv_browse (0);
udp_close (sock);
sock = -1;
#ifdef _WIN32
WSACleanup ();
#endif
}
};
int
gamesrv_getglist ()
{
int i,
i1,
i2,
i3,
y,
nr,
rebuild = 0;
char buf[BUF_SIZE];
char *pos;
char txt[255];
struct _sockaddr addr;
struct game_entry entry;
while (udp_get (sock, buf, BUF_SIZE, &addr, PF_INET) > 0) {
d_printf ("GOT:\n%s\n", buf);
if (buf[0] == 'E') {
for (i = 0; i < MAX_GAMESRVENTRYS; i++) {
gse[i].name[0] = 0;
gse[i].host[0] = 0;
gse[i].port[0] = 0;
}
for (i = 0; i < 10; i++ ) {
menu[i].index = 0;
menu[i].text[0] = 0;
}
sprintf (menu[0].text, "No Games found on Masterserver");
menu[0].index = 1;
rebuild = 1;
if (menuselect<10) menuselect=0;
}
else {
for (pos = buf; pos != 0;) {
// go throught the incoming data
switch (pos[0]) {
case ('P'):
sscanf (pos + 1, "%d,%d", &i1, &i2);
entry.curplayers = i1;
entry.maxplayers = i2;
break;
case ('V'):
sscanf (pos + 1, "%d.%d.%d", &i1, &i2, &i3);
entry.version.major = i1;
entry.version.minor = i2;
entry.version.sub = i3;
break;
case ('S'):
sscanf (pos + 1, "%d,%d,%d", &i1, &i2, &i3);
entry.state = i1;
entry.multitype = i2;
entry.gametype = i3;
break;
case ('I'):
if (pos[1] == '4')
entry.ai_family = PF_INET;
else if (pos[1] == '6')
#ifndef _WIN32
entry.ai_family = PF_INET6;
#else
entry.ai_family = 0;
#endif
break;
case ('N'):
for (i = 1; (i - 1 < LEN_GAMENAME) && (pos[i] != 0)
&& (pos[i] != '\n'); i++)
entry.name[i - 1] = pos[i];
entry.name[i-1]=0;
break;
case ('H'):
for (i = 1; (i - 1 < LEN_SERVERNAME) && (pos[i] != 0)
&& (pos[i] != '\n'); i++)
entry.host[i - 1] = pos[i];
entry.host[i-1]=0;
break;
case ('O'):
for (i = 1; (i - 1 < LEN_PORT) && (pos[i] != 0)
&& (pos[i] != '\n'); i++)
entry.port[i - 1] = pos[i];
entry.port[i-1]=0;
break;
}
pos = strchr (pos, '\n');
if (pos != 0)
pos++;
if (pos != 0 && pos[0] == 0)
pos = 0;
}
nr = gamesrv_findentry (entry.host, entry.port);
if (nr == -1) {
nr = gamesrv_findfree ();
if (nr == -1)
return -1;
}
gse[nr] = entry;
sprintf (txt, "%16s ", gse[nr].name);
if (gse[nr].state == GS_wait)
sprintf (txt, "%s Wait ", txt);
else if (gse[nr].state == GS_running || gse[nr].state == GS_ready)
sprintf (txt, "%sRunning ", txt);
else if (gse[nr].state == GS_update)
sprintf (txt, "%s Update ", txt);
sprintf (txt, "%s%d/%d ", txt, gse[nr].curplayers, gse[nr].maxplayers);
if (gse[nr].ai_family == PF_INET)
sprintf (txt, "%s %d.%d.%d IPv4", txt, gse[nr].version.major, gse[nr].version.minor,
gse[nr].version.sub);
else
sprintf (txt, "%s %d.%d.%d IPv6", txt, gse[nr].version.major, gse[nr].version.minor,
gse[nr].version.sub);
for (y = 0; y < 255; y++)
menu[nr + 1].text[y] = 0;
strncpy (menu[nr + 1].text, txt, 40);
rebuild = 1;
sprintf (menu[0].text, "Games on the Masterserver");
menu[0].index = 0;
if (menuselect == 0)
menuselect = 1;
menu[nr + 1].index = 1;
}
}
return rebuild;
}
int
gamesrv_startudp ()
{
#ifdef _WIN32
WSADATA wsaData;
if (WSAStartup (MAKEWORD (1, 1), &wsaData) != 0) {
d_printf ("WSAStartup failed.\n");
exit (1);
}
#endif
sock = udp_server (DEFAULT_GMUDPPORT, bman.net_ai_family);
if (sock == -1) {
#ifdef _WIN32
WSACleanup ();
#endif
}
return sock;
}
/* find the entry */
int
gamesrv_findentry (char *host, char *port)
{
int i,
y;
for (i = 0, y = -1; (i < MAX_GAMESRVENTRYS) && (y == -1); i++) {
if (strcmp (gse[i].host, host) == 0 && strcmp (gse[i].port, port) == 0)
y = i;
}
return y;
};
/* Find first free entry */
int
gamesrv_findfree ()
{
int i,
y;
for (i = 0, y = -1; (y == -1) && (i < MAX_GAMESRVENTRYS); i++)
if (gse[i].host[0] == 0)
y = i;
return y;
};
/*
Add and Delete Browsers from Serverbrowselist
*/
void
gamesrv_browse (int i)
{
char data[255];
struct _sockaddr addr;
char host[LEN_SERVERNAME];
char port[LEN_PORT];
d_printf ("** Notify Browser Master Server\n");
if (i)
sprintf (data, "B\n");
else
sprintf (data, "E\n");
network_server_port (bman.gamemaster, host, LEN_SERVERNAME, port, LEN_PORT);
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
udp_send (sock, data, strlen (data), &addr, bman.net_ai_family);
d_printf ("Send: %s\n", data);
};
/*
The Server should know that we quit.
Delete every entry from our client.
*/
void
gamesrv_quit ()
{
char data[255];
struct _sockaddr addr;
char host[LEN_SERVERNAME];
char port[LEN_PORT];
int len;
d_printf ("** Notify GameMaster Server\n");
sprintf (data, "D\n");
len = 4;
network_server_port (bman.gamemaster, host, LEN_SERVERNAME, port, LEN_PORT);
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
udp_send (bman.sock, data, len, &addr, bman.net_ai_family);
d_printf ("** Send \n\n%s\n\n", data);
};
/*
send the mode of the game from the current bman.state and bman.gamename
parameter
*/
void
gamesrv_sendmode (int maxplayer, int curplayers)
{
char data[255];
int len = 0;
struct _sockaddr addr;
char host[LEN_SERVERNAME];
char port[LEN_PORT];
d_printf ("** Notify GameMaster Server\n");
sprintf (data, "AV%s.%d\n", VERSION, SUB_VERSION);
sprintf (data, "%sP%d,%d\n", data, curplayers, maxplayer);
sprintf (data, "%sS%d,%d,%d\n", data, bman.state, bman.multitype, bman.gametype);
if (bman.net_ai_family == PF_INET)
sprintf (data, "%sI4\n", data);
else
sprintf (data, "%sI6\n", data);
sprintf (data, "%sN%s\n", data, bman.gamename);
len = strlen (data);
network_server_port (bman.gamemaster, host, LEN_SERVERNAME, port, LEN_PORT);
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
host[0] = 0;
port[0] = 0;
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
udp_send (bman.sock, data, len, &addr, bman.net_ai_family);
d_printf ("** Send To (%s[:%s])\n\n%s\n\n", host, port, data);
};
void
gamesrv_sendchat (char *text)
{
char data[255];
struct _sockaddr addr;
char host[LEN_SERVERNAME];
char port[LEN_PORT];
network_server_port (bman.gamemaster, host, LEN_SERVERNAME, port, LEN_PORT);
dns_filladdr (host, LEN_SERVERNAME, port, LEN_PORT, bman.net_ai_family, &addr);
sprintf (data, "C%s", text);
udp_send (bman.sock, data, strlen (data), &addr, bman.net_ai_family);
};

@ -0,0 +1,30 @@
/*
include file for the gamesrv.c file
*/
struct game_entry {
char host[LEN_SERVERNAME];
char port[LEN_PORT];
char name[LEN_GAMENAME];
struct _version {
unsigned char major;
unsigned char minor;
unsigned char sub;
} version;
signed char curplayers;
signed char maxplayers;
signed char ai_family;
unsigned char state;
unsigned char multitype;
unsigned char gametype;
};
extern int gamesrv_findentry (char *host, char *port);
extern int gamesrv_findfree ();
extern int gamesrv_startudp ();
extern int gamesrv_getglist ();
extern void gamesrv_getserver ();
extern void gamesrv_quit ();
extern void gamesrv_browse ();
extern void gamesrv_sendmode (int maxplayer, int curplayers);
extern void gamesrv_sendchat (char *text);

@ -0,0 +1,765 @@
/* gfx.c */
#include <SDL.h>
#include "bomberclone.h"
#include "gfx.h"
int UpdateRects_nr = 0;
SDL_Rect UpdateRects[MAX_UPDATERECTS];
_gfx gfx;
void getRGBpixel (SDL_Surface *surface, int x, int y, int *R, int *G, int *B) {
Uint32 pixel = 0;
Uint8 r,g,b;
/* Lock the screen for direct access to the pixels */
if ( SDL_MUSTLOCK(surface) )
if ( SDL_LockSurface(surface) < 0 ) {
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
return;
}
pixel = getpixel (surface, x, y);
if ( SDL_MUSTLOCK(surface) ) {
SDL_UnlockSurface(surface);
}
SDL_GetRGB(pixel, surface->format, &r, &g, &b);
*R = r;
*G = g;
*B = b;
};
Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to retrieve */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
return *p;
case 2:
return *(Uint16 *)p;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
case 4:
return *(Uint32 *)p;
default:
return 0; /* shouldn't happen, but avoids warnings */
}
}
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to set */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
}
void scale (short int *dpattern, short int x, short int y) {
int a, dx, dy;
if (x >= SCALE_MAXRES || y >= SCALE_MAXRES) {
for (x = 0; x < SCALE_MAXRES; x++)
dpattern[x] = 0;
return;
}
if (x > y) {
dy = 2 * y;
dx = a = 2 * x - dy;
do {
if ( a <= 0) {
dpattern[(y--)-1] = x;
a = a + dx;
}
else
a = a - dy;
} while (x--);
}
else {
dy = 2 * x;
dx = a = 2 * y - dy;
do {
dpattern[y] = x;
if (a <= 0) {
x--;
a = a + dx;
}
else
a = a - dy;
} while (y--);
}
}
SDL_Surface *
scale_image (SDL_Surface * orginal, int newx, int newy)
{
Uint32 rmask,
gmask,
bmask,
amask;
SDL_Surface *surface;
int y, x;
short int xpattern[SCALE_MAXRES];
short int ypattern[SCALE_MAXRES];
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x00ff0000;
gmask = 0x0000ff00;
bmask = 0x000000ff;
amask = 0xff000000;
#endif
surface = SDL_CreateRGBSurface (SDL_SWSURFACE, newx, newy, 32, rmask, gmask, bmask, amask);
if (surface == NULL) {
fprintf (stderr, "CreateRGBSurface failed: %s\n", SDL_GetError ());
return NULL;
}
/* Lock the screen for direct access to the pixels */
if ( SDL_MUSTLOCK(surface) )
if ( SDL_LockSurface(surface) < 0 ) {
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
return NULL;
}
if ( SDL_MUSTLOCK(orginal) )
if ( SDL_LockSurface(orginal) < 0 ) {
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
if ( SDL_MUSTLOCK(surface) ) {
SDL_UnlockSurface(surface);
}
return NULL;
}
/* do the scaling work */
scale (xpattern, orginal->w -1, newx);
scale (ypattern, orginal->h -1, newy);
for (x = newx-1; x >= 0; x--)
for (y = newy - 1; y >= 0; y--)
putpixel (surface, x, y, getpixel (orginal, xpattern[x], ypattern[y]));
if ( SDL_MUSTLOCK(orginal) ) {
SDL_UnlockSurface(orginal);
}
if ( SDL_MUSTLOCK(surface) ) {
SDL_UnlockSurface(surface);
}
return surface;
};
SDL_Surface *makegray_image (SDL_Surface *org) {
Uint32 rmask,
gmask,
bmask,
amask;
Uint32 pixel, transpixel = 0;
SDL_Surface *dest;
int y, x;
Uint8 r,g,b,gray;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x00ff0000;
gmask = 0x0000ff00;
bmask = 0x000000ff;
amask = 0xff000000;
#endif
dest = SDL_CreateRGBSurface (SDL_SWSURFACE, org->w, org->h, 32, rmask, gmask, bmask, amask);
if (dest == NULL) {
fprintf (stderr, "CreateRGBSurface failed: %s\n", SDL_GetError ());
return NULL;
}
/* Lock the screen for direct access to the pixels */
if ( SDL_MUSTLOCK(dest) )
if ( SDL_LockSurface(dest) < 0 ) {
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
return NULL;
}
if ( SDL_MUSTLOCK(org) )
if ( SDL_LockSurface(org) < 0 ) {
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
if ( SDL_MUSTLOCK(dest) ) {
SDL_UnlockSurface(dest);
}
return NULL;
}
for (x = 0; x < org->w; x++)
for (y = 0; y < org->h; y++) {
pixel = getpixel (org, x, y);
if (x == 0 && y == 0)
transpixel = pixel;
if (pixel != transpixel) {
SDL_GetRGB(pixel, org->format, &r, &g, &b);
gray = (r/3 + g/3 + b/3);
pixel = SDL_MapRGB(dest->format, gray, gray, gray);
}
putpixel (dest, x, y, pixel);
}
if ( SDL_MUSTLOCK(org) ) {
SDL_UnlockSurface(org);
}
if ( SDL_MUSTLOCK(dest) ) {
SDL_UnlockSurface(dest);
}
SDL_SetColorKey (dest, SDL_SRCCOLORKEY,transpixel);
return dest;
};
#define __smalsizeX 12
void gfx_load_players (int sx, int sy) {
float sfkt, ssfkt;
char filename[255];
int i,
j,
r,
g,
b;
SDL_Surface *tmpimage, *tmpimage1;
sfkt = ((float) sx) / ((float) GFX_IMGSIZE);
ssfkt = ((float) __smalsizeX) / ((float) GFX_IMGSIZE);
/* loading the player images */
for (j = i = 0; i < MAX_PLAYERS; i++) {
sprintf (filename, "%s/player%d.bmp", bman.datapath, j);
j++;
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
if (j == 0) { // try again with the first image, if this don't work give up.
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
i--; // load the this image again
j = 0;
}
else {
/* load the game player image */
gfx.players[i].size.y = sy * 2;
gfx.players[i].size.x = (tmpimage->w / 4) * sfkt;
gfx.players[i].ani.frames = tmpimage->h / GFX_PLAYERIMGSIZE_Y;
tmpimage1 = scale_image (tmpimage, gfx.players[i].size.x * 4 , gfx.players[i].ani.frames * gfx.players[i].size.y);
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.players[i].ani.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage1);
/* calculate the numbers of images for the animation */
gfx.players[i].offset.x = (sx - gfx.players[i].size.x) / 2;
gfx.players[i].offset.y = - sy;
/* load the smal image */
gfx.players[i].smal_size.y = __smalsizeX * 2;
gfx.players[i].smal_size.x = (tmpimage->w / 4) * ssfkt;
tmpimage1 = scale_image (tmpimage, gfx.players[i].smal_size.x * 4 , gfx.players[i].ani.frames * gfx.players[i].smal_size.y);
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.players[i].smal_image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage1);
SDL_FreeSurface (tmpimage);
}
}
}
/* load the images with teh right scaleing */
void gfx_game_init () {
int i,
r,
g,
b;
char filename[255];
SDL_Surface *tmpimage, *tmpimage1;
float sfkt;
d_printf ("GFX Init\n");
menu_displaytext ("Please Wait", "Loading GFX Data", 64, 64, 128);
/* Calculate the Best Size of the Images */
gfx.block.x = gfx.res.x / (bman.fieldsize.x+1);
gfx.block.y = (gfx.res.y - 80) / (bman.fieldsize.y+1);
if (gfx.block.x < gfx.block.y)
gfx.block.y = gfx.block.x;
else
gfx.block.x = gfx.block.y;
/* create Table of points */
scale (gfx.postab, gfx.block.x, 256);
sfkt = ((float) gfx.block.x) / ((float) GFX_IMGSIZE);
/* calculating the best offset for the field on the screen */
gfx.offset.x = (gfx.res.x - (gfx.block.x * bman.fieldsize.x)) / 2;
gfx.offset.y = gfx.res.y - (gfx.block.y * bman.fieldsize.y);
/* load the fire */
sprintf (filename, "%s/fire.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
gfx.fire.frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 = scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x, gfx.fire.frames * gfx.block.y);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,
SDL_MapRGB (tmpimage1->format, 255, 0, 255));
gfx.fire.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
/* load the bomb */
sprintf (filename, "%s/bomb.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
gfx.bomb.frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 = scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x, gfx.bomb.frames * gfx.block.y);
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.bomb.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
/* load the illnessthing */
sprintf (filename, "%s/playersick.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
gfx.ill.frames = tmpimage->h / (2*GFX_IMGSIZE);
tmpimage1 = scale_image (tmpimage, (tmpimage->w / (2*GFX_IMGSIZE)) * (2 * gfx.block.x), gfx.ill.frames * (2*gfx.block.y));
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.ill.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
/* loading the field images */
for (i = 0; i < FT_max; i++) {
switch (i) {
case (FT_nothing):
sprintf (filename, "%s/background.bmp", bman.datapath);
break;
case (FT_stone):
sprintf (filename, "%s/stone.bmp", bman.datapath);
break;
case (FT_block):
sprintf (filename, "%s/block.bmp", bman.datapath);
break;
case (FT_death):
sprintf (filename, "%s/fielddeath.bmp", bman.datapath);
break;
case (FT_bomb):
sprintf (filename, "%s/fieldbomb.bmp", bman.datapath);
break;
case (FT_fire):
sprintf (filename, "%s/fieldfire.bmp", bman.datapath);
break;
case (FT_shoe):
sprintf (filename, "%s/fieldshoe.bmp", bman.datapath);
break;
}
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
gfx.field[i].frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 = scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x, gfx.field[i].frames * gfx.block.y);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,SDL_MapRGB (tmpimage1->format, 255, 255, 255));
gfx.field[i].image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
}
/* loading the player images */
gfx_load_players (gfx.block.x, gfx.block.y);
UpdateRects_nr = 0;
}
/* frees the player images */
void gfx_free_players () {
int i;
for (i = 0; i < MAX_PLAYERS; i++) {
if (gfx.players[i].ani.image != NULL)
SDL_FreeSurface (gfx.players[i].ani.image);
gfx.players[i].ani.image = NULL;
if (gfx.players[i].smal_image != NULL)
SDL_FreeSurface (gfx.players[i].smal_image);
gfx.players[i].smal_image = NULL;
}
}
void gfx_game_shutdown () {
int i;
menu_displaytext ("Please Wait", "Freeing GFX Data", 64, 128, 64);
for (i = 0; i < FT_max; i++) {
if (gfx.field[i].image != NULL)
SDL_FreeSurface (gfx.field[i].image);
gfx.field[i].image = NULL;
}
gfx_free_players ();
if (gfx.bomb.image != NULL)
SDL_FreeSurface (gfx.bomb.image);
if (gfx.fire.image != NULL)
SDL_FreeSurface (gfx.fire.image);
gfx.bomb.image = NULL;
gfx.fire.image = NULL;
};
/* init the whole GFX Part */
void gfx_init () {
if (gfx.fullscreen)
gfx.screen = SDL_SetVideoMode (gfx.res.x, gfx.res.y, 16,
SDL_SWSURFACE | SDL_DOUBLEBUF | SDL_HWACCEL | SDL_FULLSCREEN);
else
gfx.screen = SDL_SetVideoMode (gfx.res.x, gfx.res.y, 16,
SDL_SWSURFACE | SDL_DOUBLEBUF | SDL_HWACCEL);
if (gfx.screen == NULL) {
d_printf ("Unable to set video mode: %s\n", SDL_GetError ());
return;
}
SDL_ShowCursor(SDL_DISABLE);
gfx_loaddata ();
};
void
gfx_loaddata ()
{
int r,
g,
b;
char filename[255];
SDL_Surface *tmpimage, *tmpimage1;
/* load the font */
sprintf (filename, "%s/font.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
SDL_SetColorKey (tmpimage, SDL_SRCCOLORKEY,
SDL_MapRGB (tmpimage->format, 0, 0, 0));
gfx.font.image = SDL_DisplayFormat (tmpimage);
gfx.font.size.x = 16;
gfx.font.size.y = 16;
SDL_FreeSurface (tmpimage);
/* load the font */
sprintf (filename, "%s/font1.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
SDL_SetColorKey (tmpimage, SDL_SRCCOLORKEY,
SDL_MapRGB (tmpimage->format, 0, 0, 0));
gfx.font1.image = SDL_DisplayFormat (tmpimage);
gfx.font1.size.x = 16;
gfx.font1.size.y = 16;
SDL_FreeSurface (tmpimage);
/* load the logo */
sprintf (filename, "%s/logo.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
tmpimage1 = scale_image (tmpimage, gfx.res.x, gfx.res.y);
SDL_FreeSurface (tmpimage);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,
SDL_MapRGB (tmpimage1->format, 255, 255, 0));
gfx.logo = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage1);
/* load the menuselector */
sprintf (filename, "%s/menuselect.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
printf ("Can't load image: %s\n", SDL_GetError ());
exit (1);
}
gfx.menuselect.frames = tmpimage->h / GFX_IMGSIZE;
tmpimage1 = scale_image (tmpimage, gfx.font.size.x, gfx.menuselect.frames * gfx.font.size.y);
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY,SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.menuselect.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage);
SDL_FreeSurface (tmpimage1);
};
void
gfx_shutdown ()
{
int i;
for (i = 0; i < FT_max; i++)
SDL_FreeSurface (gfx.field[i].image);
for (i = 0; i < MAX_PLAYERS; i++)
SDL_FreeSurface (gfx.players[i].ani.image);
SDL_FreeSurface (gfx.font.image);
SDL_FreeSurface (gfx.font1.image);
SDL_FreeSurface (gfx.logo);
SDL_FreeSurface (gfx.bomb.image);
SDL_FreeSurface (gfx.fire.image);
SDL_FreeSurface (gfx.menuselect.image);
gfx.screen = SDL_SetVideoMode (gfx.res.x, gfx.res.y, 16,
SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_FreeSurface (gfx.screen);
}
void
gfx_AddUpdateRect (int x, int y, int w, int h)
{
if (UpdateRects_nr >= MAX_UPDATERECTS)
return;
UpdateRects[UpdateRects_nr].x = x;
UpdateRects[UpdateRects_nr].y = y;
UpdateRects[UpdateRects_nr].w = w;
UpdateRects[UpdateRects_nr].h = h;
UpdateRects_nr++;
}
void
gfx_UpdateRects ()
{
if (UpdateRects_nr > 0)
SDL_UpdateRects (gfx.screen, UpdateRects_nr, UpdateRects);
UpdateRects_nr = 0;
}
void draw_logo () {
SDL_BlitSurface (gfx.logo, NULL, gfx.screen, NULL);
UpdateRects_nr = 0;
gfx_AddUpdateRect (0,0,gfx.screen->w, gfx.screen->h);
}
void redraw_logo_shaded (int x, int y, int w, int h, int c) {
SDL_Rect dest;
dest.w = w;
dest.h = h;
dest.x = x;
dest.y = y;
redraw_logo (x, y, w+1, h+1);
if (gfx_locksurface (gfx.screen))
return;
dest.h += dest.y;
dest.w += dest.x;
draw_shadefield (gfx.screen, &dest, c);
gfx_unlocksurface (gfx.screen);
};
void redraw_logo (int x, int y, int w, int h) {
SDL_Rect src, dest;
dest.w = src.w = w;
dest.h = src.h = h;
dest.x = x;
dest.y = y;
src.x = x;
src.y = y;
SDL_BlitSurface (gfx.logo, &src, gfx.screen, &dest);
// gfx_AddUpdateRect ();
};
void
shade_pixel(SDL_Surface *s, int x, int y, int c) {
Uint32 p;
Uint8 r,g,b;
p = getpixel(s,x,y);
SDL_GetRGB(p, s->format, &r, &g, &b);
if (c > 0) {
if (((Sint16) r) + c < 256) {r += c;} else r = 255;
if (((Sint16) g) + c < 256) {g += c;} else g = 255;
if (((Sint16) b) + c < 256) {b += c;} else b = 255;
}
else {
if (((Sint16) r) + c > 0) {r += c;} else r = 0;
if (((Sint16) g) + c > 0) {g += c;} else g = 0;
if (((Sint16) b) + c > 0) {b += c;} else b = 0;
}
p = SDL_MapRGB(s->format, r, g, b);
putpixel(s,x,y,p);
}
int gfx_locksurface (SDL_Surface *surface) {
if ( SDL_MUSTLOCK(surface) )
if ( SDL_LockSurface(surface) < 0 ) {
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
return -1;
}
return 0;
};
void gfx_unlocksurface (SDL_Surface *surface) {
if ( SDL_MUSTLOCK(surface) ) {
SDL_UnlockSurface(surface);
}
};
void
draw_shadefield (SDL_Surface *s, SDL_Rect *rec, int c) {
int x1, x, x2, y1, y;
if (rec->x > rec->w) {
x1 = rec->w;
x2 = rec->x;
}
else {
x2 = rec->w;
x1 = rec->x;
}
if (rec->y > rec->h) {
y = rec->h;
y1 = rec->y;
}
else {
y1 = rec->h;
y = rec->y;
}
for (;y <= y1;y++)
for (x = x1 ;x <= x2;x++)
shade_pixel(s, x, y, c);
};
SDL_Surface *gfx_copyscreen (SDL_Rect *wnd) {
SDL_Surface *res;
SDL_Rect dest;
res = SDL_CreateRGBSurface(SDL_HWSURFACE, wnd->w, wnd->h, gfx.screen->format->BitsPerPixel, gfx.screen->format->Rmask, gfx.screen->format->Gmask, gfx.screen->format->Bmask, gfx.screen->format->Amask);
dest.x = 0;
dest.y = 0;
dest.w = wnd->w;
dest.h = wnd->h;
SDL_BlitSurface (gfx.screen, wnd, res, &dest);
return res;
};

@ -0,0 +1,89 @@
#ifndef _GFX_H_
#define _GFX_H_
#define SCALE_MAXRES 10000
#define GFX_IMGSIZE 64
#define GFX_PLAYERIMGSIZE_Y 128
#include "basic.h"
struct __gfxani {
SDL_Surface *image;
int frames; // how many single frames (image -> heigh / (1.5 * gamestyle.height))
} typedef _gfxani;
struct __gfxplayer {
_gfxani ani;
_point offset;
_point size; // height of the image.. needed for faster access.
_point smal_size; // smal size of the image
SDL_Surface *smal_image; // smal size of the animation
} typedef _gfxplayer;
struct __gfxfont {
SDL_Surface *image;
_point size;
} typedef _gfxfont;
struct __gfx {
SDL_Surface *screen;
_point res; // resolution
_point block; // block size
unsigned char fullscreen;
_point offset; // where the game field starts
_gfxfont font;
_gfxfont font1;
_gfxplayer players[MAX_PLAYERS];
short int postab[256]; // table of points where we need to go to.
_gfxani field[FT_max]; // the field animations
_gfxani fire; // fire (explostion)
_gfxani bomb; // bomb animation
_gfxani ill; // sick animation above the player
_gfxani menuselect; // The Menu Select GFX (the bomb ?)
SDL_Surface *logo;
} typedef _gfx;
extern _gfx gfx;
// everything what is in gfx.c
extern void gfx_loaddata ();
extern void gfx_UpdateRects ();
extern void gfx_AddUpdateRect (int x, int y, int w, int h);
extern void redraw_logo (int x, int y, int w, int h);
extern void draw_logo ();
extern void gfx_init (); // Load Base Image Data
extern void gfx_game_init (); // Load Game Data
extern void gfx_game_shutdown (); // Free Image Data
extern void gfx_shutdown (); //
extern void getRGBpixel (SDL_Surface *surface, int x, int y, int *R, int *G, int *B);
extern Uint32 getpixel(SDL_Surface *surface, int x, int y);
extern void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
extern void scale (short int *dpattern, short int x, short int y);
extern SDL_Surface *scale_image (SDL_Surface * orginal, int newx, int newy);
extern void shade_pixel(SDL_Surface *s, int x, int y, int c);
extern void draw_shadefield (SDL_Surface *s, SDL_Rect *rec, int c);
extern int gfx_locksurface (SDL_Surface *surface);
extern void gfx_unlocksurface (SDL_Surface *surface);
extern void redraw_logo_shaded (int x, int y, int w, int h, int c);
extern void gfx_load_players (int sx, int sy);
extern void gfx_free_players ();
extern SDL_Surface *makegray_image (SDL_Surface *org);
extern SDL_Surface *gfx_copyscreen (SDL_Rect *wnd);
// declared functions in font.c
extern void draw_text (int x, int y, char *text, int white);
#endif

@ -0,0 +1,54 @@
/* keyborad handling for text fields */
#include <SDL.h>
#include "keybinput.h"
static int keybinput_oldkey = 0;
void keybinput_new (_keybinput *ki) {
int i;
for (i = 0; i < 255; i++)
ki->text[i] = 0;
ki->curpos = 0;
ki->len = 0;
}
int keybinput_loop (_keybinput *ki, SDL_Event *event) {
int key = 0;
ki->changed = 0;
if (event->type == SDL_KEYUP)
keybinput_oldkey = 0;
if (event->type == SDL_KEYDOWN && keybinput_oldkey != event->key.keysym.sym) {
key = keybinput_oldkey = event->key.keysym.sym;
if (key == 8) { // BACKSPACE
if (ki->curpos > 0) {
ki->curpos--;
ki->text[ki->curpos] = 0;
ki->changed = 1;
}
}
else if (key >= ' ' && key <= 'z') {
if (ki->curpos < 255) {
ki->text[ki->curpos++] = key;
ki->text[ki->curpos] = 0;
ki->changed = 1;
}
}
ki->len = strlen (ki->text);
}
if (key == SDLK_RETURN)
return 1;
if (key == SDLK_ESCAPE)
return -1;
return 0;
}

@ -0,0 +1,15 @@
#ifndef _KEYBINPUT_H_
#define _KEYBINPUT_H_
struct __keybinput {
char text[255];
short int curpos;
short int len;
char changed;
} typedef _keybinput;
extern void keybinput_new (_keybinput *ki);
extern int keybinput_loop (_keybinput *ki, SDL_Event *event);
#endif

@ -0,0 +1,68 @@
#include "bomberclone.h"
#include "network.h"
#include "gfx.h"
#include "../config.h"
_bomberclone bman; // Holds GameData
Uint32 timestamp; // timestamp
int
main (int argc, char **argv)
{
int menuselect = 0;
_menu menu[] = {
{0, "Singleplayer"},
{1, "Multiplayer"},
{2, "Configuration"},
{3, "Quit Game"},
{-1, ""}
};
char text[255];
if (SDL_Init (SDL_INIT_VIDEO) != 0) {
d_printf ("Unable to init SDL: %s\n", SDL_GetError ());
return (1);
}
game_init (argv);
d_printf ("\n\n ***** Bomberclone Version %s (%d)\n\n",VERSION,SUB_VERSION);
if (ReadConfig()) {
gfx_init ();
menu_get_text ("Please You Playername", bman.playername, LEN_PLAYERNAME-1);
bman.playername[LEN_PLAYERNAME-1] = 0;
} else {
gfx_init ();
if (bman.selectplayer)
menu_get_text ("Please You Playername", bman.playername, LEN_PLAYERNAME);
}
ReadPrgArgs (argc, argv);
sprintf(text,"Welcome to BomberClone");
while (menuselect != -1 && bman.state != GS_quit) {
menuselect = menu_loop (text , menu, menuselect);
switch (menuselect) {
case (0) : // Singleplayer
single_game_new ();
gfx_game_init ();
game_loop ();
gfx_game_shutdown ();
break;
case (1) : // Multiplayer
netmenu();
break;
case (2) : // Options
configuration ();
break;
case (3) : // Quit
bman.state = GS_quit;
break;
}
}
gfx_shutdown ();
return 0;
};

@ -0,0 +1,335 @@
/* menu's for the game */
#include <SDL.h>
#include "bomberclone.h"
#include "gfx.h"
#define MENU_BG_SHADE_DARK -64
#define MENU_BG_SHADE_BRIGHT 64
void
draw_menubox (int x, int y)
{
int x1,
x2,
y1,
y2,
i;
SDL_Rect src,
dest;
x1 = gfx.res.x / 2 - x / 2;
x2 = gfx.res.x / 2 + x / 2;
y1 = gfx.res.y / 2 - y / 2;
y2 = gfx.res.y / 2 + y / 2;
if (gfx_locksurface (gfx.screen))
return;
for (i = 0; i < 2; i++) {
src.x = x1 + i;
src.w = x2 + i;
src.y = y1 + i;
src.h = y2 + i;
draw_shadefield (gfx.screen, &src, MENU_BG_SHADE_BRIGHT);
}
gfx_unlocksurface (gfx.screen);
dest.w = src.w = x - 2;
dest.h = src.h = y - 2;
dest.x = src.x = x1 + 2;
dest.y = src.y = y1 + 2;
redraw_logo_shaded (x1 + 2, y1 + 2, x - 2, y - 2, MENU_BG_SHADE_DARK);
}
void
draw_menu (char *text, _menu menu[], int *x, int *y)
{
int last,
maxlen,
x1,
y1,
i;
char vers[20];
// count the number of entrys
for (last = 0, maxlen = 0; menu[last].index != -1; last++)
if (strlen (menu[last].text) > maxlen)
maxlen = strlen (menu[last].text);
if (strlen (text) > maxlen)
maxlen = strlen (text);
*x = x1 = gfx.res.x / 2 - ((gfx.font.size.x + (maxlen * (gfx.font.size.x - 2))) / 2);
y1 = gfx.res.y / 2 - ((last + 2) * gfx.font.size.y / 2);
x1 = x1 + gfx.font.size.x;
draw_menubox (maxlen * gfx.font.size.x, (last + 3) * gfx.font.size.y);
draw_text (x1, y1, text, 1);
*y = y1 = y1 + (gfx.font.size.y * 2);
for (i = 0; i < last; i++) {
draw_text (x1, y1, menu[i].text, 1);
y1 = y1 + gfx.font.size.y;
}
sprintf (vers, "v%s.%d", VERSION, SUB_VERSION);
draw_text (gfx.res.x - gfx.font.size.x * strlen (vers), gfx.res.y - gfx.font.size.y, vers, 1);
};
void
draw_select (int select, _menu menu[], int x, int y)
{
SDL_Rect dest,
src;
int last;
for (last = 0; menu[last].index != -1; last++)
redraw_logo_shaded (x, y + last * gfx.font.size.y, gfx.menuselect.image->w, gfx.menuselect.image->h , MENU_BG_SHADE_DARK);
dest.x = x;
dest.y = y + select * gfx.font.size.y;
src.x = 0;
src.y = 0;
src.w = gfx.font.size.x;
src.h = gfx.font.size.y;
SDL_BlitSurface (gfx.menuselect.image, &src, gfx.screen, &dest);
};
int
menu_loop (char *menutitle, _menu menu[], int lastselect)
{
int menuselect = lastselect,
done = 0,
lastentry;
SDL_Event event;
Uint8 *keys;
int keypressed = 0;
int bx,
by;
draw_logo ();
draw_menu (menutitle, menu, &bx, &by);
SDL_Flip (gfx.screen);
for (lastentry = 0; menu[lastentry].index != -1; lastentry++);
while ((!done || keypressed == 1) && bman.state != GS_quit) {
draw_select (menuselect, menu, bx, by);
SDL_Flip (gfx.screen);
if (SDL_WaitEvent (&event) != 0)
switch (event.type) {
case (SDL_QUIT):
menuselect = -1;
bman.state = GS_quit;
done = 1;
}
/* keyboard handling */
keys = SDL_GetKeyState (NULL);
if (keys[SDLK_DOWN] && event.type == SDL_KEYDOWN) {
menuselect++;
if (menuselect >= lastentry)
menuselect = 0;
}
if (keys[SDLK_UP] && event.type == SDL_KEYDOWN) {
menuselect--;
if (menuselect < 0)
menuselect = lastentry - 1;
}
if (keys[SDLK_ESCAPE] && event.type == SDL_KEYDOWN) {
return -1;
}
if (!keys[SDLK_ESCAPE] && event.type == SDL_KEYUP)
keypressed = 0;
if (keys[SDLK_RETURN] && event.type == SDL_KEYDOWN) {
done = 1;
keypressed = 1;
}
if (!keys[SDLK_RETURN] && event.type == SDL_KEYUP)
keypressed = 0;
};
return menuselect;
};
void
menu_get_text (char *title, char *text, int len)
{
char t[255];
int done = 0,
keypressed = 0,
curpos,
x,
y,
i,
len_;
SDL_Event event;
Uint8 *keys;
curpos = strlen (text);
strcpy (t, text);
if (len > strlen (title)) {
len_ = len;
}
else {
len_ = strlen (title);
}
draw_logo ();
y = (gfx.res.y - 2 * gfx.font.size.y) / 2;
x = (gfx.res.x - (gfx.font.size.x - 4) * len_) / 2;
draw_menubox ((gfx.font.size.x - 1) * len_, 4 * gfx.font.size.y);
draw_text (x, y, title, 1);
y = y + gfx.font.size.y;
x = (gfx.res.x - (gfx.font.size.x - 4) * len) / 2;
if ((len - 1) * (gfx.font.size.x - 4) > gfx.res.x)
len_ = 40;
else
len_ = len;
while (!done || keypressed == 1) {
redraw_logo_shaded (x, y, (gfx.font.size.x - 4) * len_, gfx.font.size.y, MENU_BG_SHADE_DARK);
draw_text (x, y, t, 1);
draw_text (x + (gfx.font.size.x - 4) * curpos, y, "_", 1);
SDL_Flip (gfx.screen);
if (SDL_WaitEvent (&event) != 0)
switch (event.type) {
case (SDL_QUIT):
bman.state = GS_quit;
done = 1;
}
keys = SDL_GetKeyState (NULL);
if (!keypressed && keys[SDLK_LEFT] && event.type == SDL_KEYDOWN) {
if (curpos > 0)
curpos--;
keypressed = 1;
}
if (!keypressed && keys[SDLK_RIGHT] && event.type == SDL_KEYDOWN) {
if (curpos < strlen (text) && curpos < len - 1)
curpos++;
keypressed = 1;
}
if (!keypressed && keys[SDLK_ESCAPE] && event.type == SDL_KEYDOWN) {
done = 1;
keypressed = 1;
}
if (!keypressed && keys[SDLK_RETURN] && event.type == SDL_KEYDOWN) {
done = 1;
keypressed = 1;
strcpy (text, t);
}
if (!keypressed && keys[8] && event.type == SDL_KEYDOWN)
if (curpos > 0) {
curpos--;
t[curpos] = t[curpos + 1];
t[curpos + 1] = t[curpos + 2];
keypressed = 1;
}
for (i = ' '; i <= 'z'; i++)
if (!keypressed && keys[i] && event.type == SDL_KEYDOWN) {
if (t[curpos] == 0)
t[curpos + 1] = 0;
t[curpos] = i;
if (curpos < strlen (t) && curpos < len - 1)
curpos++;
keypressed = 1;
}
if (event.type == SDL_KEYUP)
keypressed = 0;
}
};
void
menu_displaytext (char *title, char *text, Uint8 r, Uint8 g, Uint8 b)
{
int x,
x1,
y,
y1,
len;
SDL_Rect dest;
len = strlen (title);
if (len < strlen (text))
len = strlen (text);
y = (gfx.res.y - 2 * gfx.block.y) / 2;
x = (gfx.res.x - (gfx.font.size.x - 4) * len) / 2;
y1 = gfx.font.size.y * 3;
x1 = ((gfx.font.size.x - 4) * len);
dest.x = x;
dest.y = y - 4;
dest.h = y1;
dest.w = x1;
SDL_FillRect (gfx.screen, &dest, SDL_MapRGB (gfx.screen->format, r, g, b));
y = (gfx.res.y - 2 * gfx.block.y) / 2;
draw_text ((gfx.res.x - (gfx.font.size.x - 4) * strlen (title)) / 2, y, title, 1);
draw_text ((gfx.res.x - (gfx.font.size.x - 4) * strlen (text)) / 2, y + gfx.font.size.y, text,
0);
SDL_Flip (gfx.screen);
};
void
menu_displaymessage (char *title, char *text)
{
SDL_Event event;
Uint8 *keys;
int done = 0,
keypressed = 0;
menu_displaytext (title, text, 64, 0, 0);
while (done == 0 || (done == 1 && keypressed == 1)) {
if (SDL_WaitEvent (&event) != 0)
switch (event.type) {
case (SDL_QUIT):
done = 1;
bman.state = GS_quit;
}
keys = SDL_GetKeyState (NULL);
if (!keypressed && keys[SDLK_ESCAPE] && event.type == SDL_KEYDOWN) {
done = 1;
keypressed = 1;
}
if (!keypressed && keys[SDLK_RETURN] && event.type == SDL_KEYDOWN) {
done = 1;
keypressed = 1;
}
if (event.type == SDL_KEYUP)
keypressed = 0;
}
};

@ -0,0 +1,361 @@
/*
multiwait.c - this manages only the network screen where
everyone have to select it's players and where even the basic chat is inside
*/
#include "bomberclone.h"
#include "network.h"
#include "packets.h"
#include "gamesrv.h"
#include "gfx.h"
#include "chat.h"
#define MW_IS_GFX_SELECT(__gfx_nr,__result) for (__result = (MAX_PLAYERS-1); (bman.players[__result].gfx_nr != __gfx_nr) && (__result >= 0); __result--);
extern int UpdateRects_nr;
static int mw_y = 0,
mw_frame = 0,
mw_frameto = 0;
static SDL_Surface *mw_plgfx[MAX_PLAYERS];
/* this will load some graphics and so other stuff */
void
mw_init ()
{
int i;
SDL_Surface *tmp;
draw_logo ();
menu_displaytext ("Please Wait", "Loading GFX Data", 64, 128, 64);
gfx_load_players (32, 32);
network_loop ();
for (i = 0; i < MAX_PLAYERS; i++) {
network_loop ();
tmp = makegray_image (gfx.players[i].ani.image);
network_loop ();
mw_plgfx[i] = SDL_DisplayFormat (tmp);
network_loop ();
SDL_FreeSurface (tmp);
network_loop ();
}
};
/* free all grafics */
void
mw_shutdown ()
{
int i;
chat_show (-1, -1, -1, -1);
menu_displaytext ("Please Wait", "Freeing GFX Data", 64, 128, 64);
gfx_free_players ();
for (i = 0; i < MAX_PLAYERS; i++)
SDL_FreeSurface (mw_plgfx[i]);
};
void
mw_wait_for_connect ()
{
menu_displaytext ("Please Wait", "Wait For connection", 64, 128, 64);
};
void
mw_draw_status ()
{
int pnr,
x,
x1,
y,
px;
char text[255];
SDL_Rect src,
dest;
/* Draw Player List */
/* 1. the head */
px = gfx.res.x / 320;
x = (gfx.res.x - px * 320) / 2;
for (pnr = 0; pnr < px; pnr++)
draw_text (pnr * 320 + x, 24, " Wins Points", 1);
/* 2. the names with points */
for (x1 = pnr = 0, y = 48; pnr < MAX_PLAYERS; pnr++) {
redraw_logo (x1 * 320, y - 4, 320, 32);
if (bman.players[pnr].gfx_nr != -1 && PS_IS_used (bman.players[pnr].state)) {
src.x = 3 * bman.players[pnr].gfx->smal_size.x;
src.y = 0;
src.w = dest.w = bman.players[pnr].gfx->smal_size.x;
src.h = dest.h = bman.players[pnr].gfx->smal_size.y;
dest.x = x1 * 320;
dest.y = y - 4;
SDL_BlitSurface (bman.players[pnr].gfx->smal_image, &src, gfx.screen, &dest);
}
sprintf (text, " %10s %2d %2d", bman.players[pnr].name, bman.players[pnr].wins,
bman.players[pnr].points);
if (bman.lastwinner == pnr)
draw_text (x + x1 * 320, y, text, 1);
else
draw_text (x + x1 * 320, y, text, 0);
x1++;
if (x1 >= px) {
y += 32;
x1 = 0;
}
if (pnr == MAX_PLAYERS - 1 && x1 != 0)
y += 32;
}
mw_y = y;
};
void
mw_draw_gfxselect (int selgfx)
{
int i,
select,
xstep;
SDL_Rect src,
dest;
xstep = gfx.res.x / MAX_PLAYERS;
if (bman.players[bman.p_nr].gfx_nr == -1) {
/* draw selection */
for (i = 0; i < MAX_PLAYERS; i++) {
dest.w = src.w = gfx.players[i].size.x;
dest.h = src.h = gfx.players[i].size.y;
dest.x = i * xstep + (xstep >> 1) - (gfx.players[i].size.x >> 1);
dest.y = mw_y + 8;
redraw_logo (dest.x, dest.y, dest.w, dest.h);
src.x = 3 * gfx.players[i].size.x;
if (i == selgfx)
src.y = mw_frame * gfx.players[i].size.y;
else
src.y = 0;
MW_IS_GFX_SELECT (i, select);
if (select >= MAX_PLAYERS || select < 0) {
/* this player have not been selected */
if (selgfx == i) {
mw_frameto--;
if (mw_frameto <= 0 || mw_frameto > ANI_PLAYERTIMEOUT) {
mw_frameto = ANI_PLAYERTIMEOUT;
mw_frame++;
}
if (mw_frame >= gfx.players[i].ani.frames || mw_frame < 0) {
mw_frameto = ANI_PLAYERTIMEOUT;
mw_frame = 0;
}
SDL_BlitSurface (gfx.players[i].ani.image, &src, gfx.screen, &dest);
}
else
SDL_BlitSurface (mw_plgfx[i], &src, gfx.screen, &dest);
}
}
}
else {
/* draw selected players */
for (i = 0; i < MAX_PLAYERS; i++) {
dest.w = src.w = gfx.players[i].size.x;
dest.h = src.h = gfx.players[i].size.y;
dest.x = i * xstep + (xstep >> 1) - (gfx.players[i].size.x >> 1);
dest.y = mw_y + 8;
redraw_logo (dest.x, dest.y, dest.w, dest.h);
src.x = 3 * gfx.players[i].size.x;
if (i == selgfx)
src.y = mw_frame * gfx.players[i].size.y;
else
src.y = 0;
MW_IS_GFX_SELECT (i, select);
if (select < MAX_PLAYERS && select >= 0) {
/* this player have been selected */
if (bman.players[bman.p_nr].gfx_nr == i)
SDL_BlitSurface (gfx.players[i].ani.image, &src, gfx.screen, &dest);
else
SDL_BlitSurface (mw_plgfx[i], &src, gfx.screen, &dest);
}
}
}
mw_y += 8 + gfx.players[0].size.y;
}
void
mw_draw_chat ()
{
if (chat.visible == 0) {
chat_show (16, mw_y + 16, gfx.res.x - 16, gfx.res.y - 32);
chat_addline ("Press [STRG] or [CTRL] - to select a player");
if (GT_MP_PTPM)
chat_addline ("F4 - to start the game");
}
};
/* the loop itself */
void
wait_for_players ()
{
SDL_Event event;
Uint8 *keys;
Uint32 timeloop1 = SDL_GetTicks ();
int done = 0,
ready = 0,
keypressed = 0,
i,
selgfx = 0;
mw_init ();
draw_logo ();
while (!done && bman.state == GS_wait) {
i = bman.p_nr;
if (network_loop () < 0) {
done = 1;
bman.p_nr = -1;
}
if (i != bman.p_nr) /* clean the screen after we got our playernumber */
draw_logo ();
/* check if all players are ready, and more as one player is connected */
if (GT_MP_PTPM)
for (ready = 0, i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_playing (bman.players[i].state))
ready++;
if (ready > 1)
ready = 1;
else
ready = 0;
/* draw the screeninformations */
if (bman.p_nr == -1) /* we have no connect yet */
mw_wait_for_connect ();
else { /* we have a connect so draw status */
mw_draw_status ();
mw_draw_gfxselect (selgfx);
mw_draw_chat ();
}
SDL_Flip (gfx.screen);
/* do the keyboard handling */
if (SDL_PollEvent (&event) != 0)
switch (event.type) {
case (SDL_QUIT):
bman.state = GS_quit;
bman.p_nr = -1;
done = 1;
}
keys = SDL_GetKeyState (NULL);
if (keys[SDLK_ESCAPE] && event.type == SDL_KEYDOWN) {
/* we want to quit */
done = 1;
bman.p_nr = -1;
keypressed = 1;
bman.state = GS_startup;
}
if (bman.p_nr != -1) {
if (keys[SDLK_DOWN] && (!keypressed)) {
}
if (keys[SDLK_UP] && (!keypressed)) {
}
if (keys[SDLK_LEFT] && (!keypressed) && bman.players[bman.p_nr].gfx_nr == -1) {
i = 0;
while (selgfx < 0 || selgfx >= MAX_PLAYERS || i != -1) {
selgfx--;
if (selgfx < 0)
selgfx = MAX_PLAYERS - 1;
MW_IS_GFX_SELECT (selgfx, i);
}
}
if (keys[SDLK_RIGHT] && (!keypressed) && bman.players[bman.p_nr].gfx_nr == -1) {
i = 0;
while (selgfx < 0 || selgfx >= MAX_PLAYERS || i != -1) {
selgfx++;
if (selgfx >= MAX_PLAYERS)
selgfx = 0;
MW_IS_GFX_SELECT (selgfx, i);
}
}
/* just make sure this player is not selected twice */
if (bman.players[bman.p_nr].gfx_nr == -1) {
MW_IS_GFX_SELECT (selgfx, i);
while (selgfx < 0 || selgfx >= MAX_PLAYERS || i != -1) {
selgfx++;
if (selgfx >= MAX_PLAYERS)
selgfx = 0;
MW_IS_GFX_SELECT (selgfx, i);
}
}
if ((keys[SDLK_LCTRL] || keys[SDLK_RCTRL]) && (!keypressed)) {
if (bman.players[bman.p_nr].gfx_nr == -1) {
/* select player */
bman.players[bman.p_nr].gfx_nr = selgfx;
}
else {
/* deselect player */
bman.players[bman.p_nr].gfx_nr = -1;
}
net_change_playerid (bman.p_nr, 1);
}
if ((GT_MP_PTPM) && ready && keys[SDLK_F4] && (!keypressed)) {
done = 1;
}
chat_loop (&event);
}
if (event.type == SDL_KEYUP)
keypressed = 0;
else if (event.type == SDL_KEYDOWN)
keypressed = 1;
/* calculate time sync. */
s_delay (1000);
timeloop1 = SDL_GetTicks ();
while (timeloop1 - timestamp >= 0 && timeloop1 - timestamp < 20) {
s_delay (timeloop1 - timestamp - 1);
timeloop1 = SDL_GetTicks ();
}
timestamp = timeloop1;
}
mw_shutdown ();
};

@ -0,0 +1,243 @@
/* network menu */
#include "bomberclone.h"
#include "network.h"
#include "packets.h"
#include "gamesrv.h"
#include "gfx.h"
extern int UpdateRects_nr;
void
networkmenu_joingame ()
{
int i;
gamesrv_getserver();
for (i = 0; bman.servername[i] != 0; i++)
if (bman.servername[i] == ' ')
bman.servername[i] = ':';
/* connect if we have an Servername */
if (bman.servername[0] != 0) {
bman.sock = -1;
bman.gametype = GT_multi;
bman.multitype = MT_ptps;
join_multiplayer_game ();
bman.servername[0] = 0;
}
};
void
netmenu ()
{
int menuselect = 0;
_menu menu[] = {
{0, "Join A Netgame"},
{1, "Create A New Netgame"},
{2, "Options"},
{3, "Return To Main Menu"},
{-1, ""}
};
if (bman.gamename[0] == 0)
sprintf (bman.gamename, "%s's Game", bman.playername);
while (menuselect != -1 && bman.state != GS_quit) {
menuselect = menu_loop ("Multiplayer", menu, menuselect);
switch (menuselect) {
case (0): // Join a Game
networkmenu_joingame ();
break;
case (1): // Create a new Game
bman.sock = -1;
bman.gametype = GT_multi;
bman.multitype = MT_ptpm;
host_multiplayer_game ();
break;
case (2): // Options
networkmenu_options ();
break;
case (3):
menuselect = -1;
break;
}
}
}
void
networkmenu_options ()
{
int menuselect = 0;
char text[255];
_menu menu[] = {
{0, "Game Name:"},
{1, "Max Players:"},
{2, "Network"},
{3, "Notify Masterserver"},
{4, "Masterserver"},
{5, "Return To Multiplayer Menu"},
{-1, ""}
};
while (menuselect != -1 && bman.state != GS_quit) {
sprintf (menu[0].text, "Gamename: %s", bman.gamename);
sprintf (menu[1].text, "Max Players: %d/%d", bman.maxplayer, MAX_PLAYERS);
if (bman.net_ai_family == PF_INET)
sprintf (menu[2].text, "Network: IPv4");
else
sprintf (menu[2].text, "Network: IPv6");
if (bman.notifygamemaster)
sprintf (menu[3].text, "Notify MasterServer: Yes");
else
sprintf (menu[3].text, "Notify MasterServer: No");
sprintf (menu[4].text, "MasterServer %s", bman.gamemaster);
menuselect = menu_loop ("Multiplayer Options", menu, menuselect);
switch (menuselect) {
case (0): // change the game name
menu_get_text ("Name of the Game:", bman.gamename, 32);
break;
case (1): // Max Number of Players
sprintf (text, "%d", bman.maxplayer);
menu_get_text ("Max Players", text, 2);
bman.maxplayer = atoi (text);
if (bman.maxplayer > MAX_PLAYERS)
bman.maxplayer = MAX_PLAYERS;
if (bman.maxplayer < 2)
bman.maxplayer = 2;
break;
case (2):
#ifndef _win32
if (bman.net_ai_family == PF_INET)
bman.net_ai_family = PF_INET6;
else
bman.net_ai_family = PF_INET;
#endif
break;
case (3): // Change the Notification
if (bman.notifygamemaster)
bman.notifygamemaster = 0;
else
bman.notifygamemaster = 1;
break;
case (4): // Masterserver Address
menu_get_text ("Address of the MasterServer", bman.gamemaster,
LEN_SERVERNAME + LEN_PORT + 2);
break;
case (5):
menuselect = -1;
break;
}
}
};
void
multiplayer_firstrun ()
{
int i;
/*
reset some gamedata
*/
bman.p_nr = -1;
bman.state = GS_wait;
for (i = 0; i < MAX_PLAYERS; i++) {
bman.players[i].name[0] = 0;
bman.players[i].gfx_nr = -1;
bman.players[i].gfx = NULL;
}
/*
init the network
*/
if (network_init () < 0) {
d_printf ("network_init () FAILED\n");
return;
}
};
/*
We will host a network game
*/
void
host_multiplayer_game ()
{
multiplayer_firstrun ();
while (bman.state != GS_startup && bman.state != GS_quit) {
/* check players and in_pl lists */
wait_for_players ();
if (bman.p_nr != -1) {
bman.state = GS_update;
net_send_servermode ();
gfx_game_init ();
net_new_gamedata ();
if (bman.state == GS_ready || bman.state == GS_running) {
net_send_servermode ();
game_loop ();
if (bman.state == GS_running)
bman.state = GS_wait;
bman.lastwinner = -1;
game_end ();
net_send_servermode ();
net_send_players ();
}
gfx_game_shutdown ();
}
}
network_shutdown ();
};
/*
We will join a network game
*/
void
join_multiplayer_game ()
{
multiplayer_firstrun ();
while (bman.state != GS_startup && bman.state != GS_quit) {
wait_for_players ();
if (bman.p_nr != -1 && (GS_WAITRUNNING || bman.state == GS_update)) {
gfx_game_init ();
bman.state = GS_update;
net_new_gamedata ();
if (bman.state == GS_ready || bman.state == GS_running)
game_loop ();
gfx_game_shutdown ();
}
else
bman.state = GS_startup;
}
network_shutdown ();
};

@ -0,0 +1,710 @@
/*
network routines.
*/
#include "bomberclone.h"
#include "network.h"
#include "gamesrv.h"
#include "packets.h"
#include "gfx.h"
int _net_to_2sec = 0;
Uint32 _net_to_timestamp = 0;
int
network_server_port (char *server, char *host, int hostlen, char *port, int portlen)
{
char *pos,
*pos2;
if (host == NULL)
return -1;
pos2 = pos = strchr (server, ':');
if (pos != NULL)
while (pos2 != NULL) {
pos = pos2;
pos2 = strchr (pos + 1, ':');
}
if (pos != NULL) {
// : für Portangabe gefunden
if (pos - server < hostlen) {
strncpy (host, server, pos - server);
host[pos - server] = 0;
if (pos[1] == 0)
sprintf (port, "11000");
else
strcpy (port, pos + 1);
}
else {
return -1;
}
}
else {
// Portangabe wurde nicht gefunden und wird auf 0 gesetzt
strncpy (host, server, hostlen);
sprintf (port, "11000");
}
return 0;
};
/*
try to work better with the network packet option
*/
void
net_dyn_pkgoption ()
{
if (_net_to_2sec > DYN_PKG_MAX_MISSING) {
if (bman.net_pkgsend_set < 10) {
bman.net_pkgsend_set++;
d_printf ("bman.netpkgsend is set to %d\n", bman.net_pkgsend_set);
}
else
d_printf ("WARNING: bman.netpkgsend is already at 10\n");
_net_to_2sec = 0;
_net_to_timestamp = timestamp;
}
if ((timestamp - _net_to_timestamp > 2000) && _net_to_2sec == 0) {
if (bman.net_pkgsend_set > 2) {
bman.net_pkgsend_set--;
d_printf ("bman.netpkgsend is set to %d\n", bman.net_pkgsend_set);
}
_net_to_2sec = 0;
_net_to_timestamp = timestamp;
}
};
/*
setup everything for the network loop
*/
int
network_init ()
{
int i;
/*
we need it for the windows winsock
*/
#ifdef _WIN32
WSADATA wsaData;
if (WSAStartup (MAKEWORD (1, 1), &wsaData) != 0) {
d_printf ("WSAStartup failed.\n");
exit (1);
}
#endif
bman.sock = -1;
bman.p_nr = -1;
timestamp = SDL_GetTicks ();
// reset playernumber and number of connected players
for (i = 0; i < MAX_PLAYERS; i++) {
bman.players[i].net.addr.host[0] = 0;
bman.players[i].net.addr.port[0] = 0;
bman.players[i].name[0] = 0;
bman.players[i].gfx_nr = -1;
bman.players[i].net.timestamp = timestamp;
bman.players[i].points = 0;
bman.players[i].wins = 0;
bman.players[i].net.pingreq = 20;
bman.players[i].net.pingack = 22;
bman.players[i].state = 0;
}
bman.lastwinner = -1;
bman.players_nr_s = 1;
// start the udp server
bman.sock = udp_server (bman.port, bman.net_ai_family);
if (bman.sock < 0) {
#ifdef _WIN32
WSACleanup ();
#endif
return -1;
}
// we have got out socket.. so now allocate the memory for the resend_cache
resend_cache.data = (char *) malloc (PKG_RESENDCACHE_SIZE);
resend_cache.fill = 0;
// if we are the server set up my data
if (GT_MP_PTPM) {
strncpy (bman.players[0].name, bman.playername, LEN_PLAYERNAME);
bman.p_nr = 0;
bman.players[0].state = PSF_used;
if (bman.notifygamemaster)
gamesrv_sendmode (bman.maxplayer, 1);
}
// if client send Data to the server
if (GT_MP_PTPS) {
network_server_port (bman.servername, bman.players[0].net.addr.host,
LEN_SERVERNAME, bman.players[0].net.addr.port, LEN_PORT);
d_printf ("Connect To: %s[:%s]\n", bman.players[0].net.addr.host,
bman.players[0].net.addr.port);
dns_filladdr (bman.players[0].net.addr.host, LEN_SERVERNAME, bman.players[0].net.addr.port,
LEN_PORT, bman.net_ai_family, &bman.players[0].net.addr.sAddr);
bman.players[0].net.addr.port[0] = bman.players[0].net.addr.host[0] = 0;
dns_filladdr (bman.players[0].net.addr.host, LEN_SERVERNAME, bman.players[0].net.addr.port,
LEN_PORT, bman.net_ai_family, &bman.players[0].net.addr.sAddr);
send_playerid (&bman.players[0].net.addr, bman.playername, NULL, NULL, -1, -1);
}
return 0;
};
/*
shutdown the network part
*/
void
network_shutdown ()
{
int i;
if (GT_MP_PTPM) {
for (i = 1; i < MAX_PLAYERS; i++)
if (bman.players[i].net.addr.host[0] != 0)
send_quit (&bman.players[i].net.addr, NULL, NULL);
if (bman.notifygamemaster)
gamesrv_quit ();
}
else if (bman.players[0].net.addr.host[0] != 0)
send_quit (&bman.players[0].net.addr, NULL, NULL);
udp_close (bman.sock);
if (resend_cache.data != NULL)
free (resend_cache.data);
resend_cache.data = NULL;
resend_cache.fill = -1;
bman.p_nr = -1;
#ifdef _WIN32
WSACleanup ();
#endif
};
int
net_check_timeout (int pl_nr)
{
int timeout = UDP_TIMEOUT;
if ((bman.players[pl_nr].state & (PSF_net + PSF_used)) == (PSF_used + PSF_net)
&& timestamp - bman.players[pl_nr].net.timestamp > timeout
&& bman.players[pl_nr].net.pingreq != bman.players[pl_nr].net.pingack) {
d_printf ("net_check_timeout pl_nr=%d, ack=%d, req=%d, timediff=%d\n", pl_nr,
bman.players[pl_nr].net.pingack, bman.players[pl_nr].net.pingreq,
timestamp - bman.players[pl_nr].net.timestamp);
bman.players[pl_nr].net.timestamp = timestamp;
bman.players[pl_nr].net.pingack = bman.players[pl_nr].net.pingreq;
send_ping (&bman.players[pl_nr].net.addr, bman.players[pl_nr].net.pingack + 100,
PKG_pingreq);
}
if ((bman.players[pl_nr].state & (PSF_net + PSF_used)) == (PSF_used + PSF_net)
&& timestamp - bman.players[pl_nr].net.timestamp > timeout
&& bman.players[pl_nr].net.pingreq == bman.players[pl_nr].net.pingack) {
d_printf ("net_check_timeout pl_nr=%d, ack=%d, req=%d, timediff=%d\n", pl_nr,
bman.players[pl_nr].net.pingack, bman.players[pl_nr].net.pingreq,
timestamp - bman.players[pl_nr].net.timestamp);
return 1;
}
return 0;
};
/*
Read data from the network and work with it
*/
int
network_loop ()
{
char data[MAX_UDPDATA];
struct pkg *packet = (struct pkg *) data;
int inlen,
i;
_net_addr addr;
if (bman.state != GS_running && bman.state != GS_ready)
timestamp = SDL_GetTicks ();
/*
as long as we get any new data, work with them
*/
inlen = udp_get (bman.sock, data, MAX_UDPDATA, &addr.sAddr, bman.net_ai_family);
addr.port[0] = addr.host[0] = 0;
if (inlen > 0)
dns_filladdr (addr.host, LEN_SERVERNAME, addr.port, LEN_PORT, bman.net_ai_family,
&addr.sAddr);
while (inlen > 0) {
do_pkg (packet, &addr);
// printf ("Network : inlen (%d) typ (%d) Size (%d)\n", inlen, packet->typ, pkglen);
inlen = udp_get (bman.sock, data, MAX_UDPDATA, &addr.sAddr, bman.net_ai_family);
addr.port[0] = addr.host[0] = 0;
if (inlen > 0)
dns_filladdr (addr.host, LEN_SERVERNAME, addr.port, LEN_PORT, bman.net_ai_family,
&addr.sAddr);
}
/*
check here for old connections who aren't answering
*/
if (bman.state == GS_wait || bman.state == GS_ready || bman.state == GS_running) {
if (GT_MP_PTPS) {
if (net_check_timeout (0)) {
d_printf ("Server Timed Out\n");
bman.state = GS_startup;
}
}
else if (GT_MP_PTPM) {
for (i = 1; i < MAX_PLAYERS; i++)
if (net_check_timeout (i)) {
d_printf ("Player %d Timed Out\n", i);
net_delplayer (i);
}
}
}
/*
resend_cache....
*/
rscache_loop ();
/*
dynamic calibration of the network traffic option
*/
net_dyn_pkgoption ();
/* what we need to do for the network packet send control */
if (bman.net_pkgsend_to <= 0 || bman.net_pkgsend_to > bman.net_pkgsend_set)
bman.net_pkgsend_to = bman.net_pkgsend_set;
bman.net_pkgsend_to--;
return 0;
};
/*
this is needed to draw the whole uppdate of everything
*/
void
draw_netupdatestate ()
{
char text[255];
int y = 0,
i;
SDL_Rect src,
dest;
for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_used (bman.players[i].state)) {
y += 48;
redraw_logo (0, y, gfx.res.x, y + 48);
if (bman.players[i].gfx_nr != -1) {
dest.w = src.w = bman.players[i].gfx->smal_size.x;
dest.h = src.h = bman.players[i].gfx->smal_size.y;
src.x = bman.players[i].gfx->smal_size.x * down;
src.y = 0;
dest.x = 50;
dest.y = y;
SDL_BlitSurface (bman.players[i].gfx->smal_image, &src, gfx.screen, &dest);
gfx_AddUpdateRect (dest.x, dest.y, gfx.res.x - dest.x, dest.h);
}
if (bman.players[i].net.net_istep == 0)
sprintf (text, "%s - State : READY", bman.players[i].name);
else
sprintf (text, "%s - State : DOWNLOAD", bman.players[i].name);
draw_text (70, y, text, 1);
text[0] = 0;
if (bman.players[i].net.net_istep == 2)
sprintf (text, "Getting Field Data %d of %d.", bman.players[i].net.net_status,
bman.fieldsize.x);
if (bman.players[i].net.net_istep == 1)
sprintf (text, "Getting Player Data %d of %d.", bman.players[i].net.net_status,
MAX_PLAYERS);
draw_text (70, y + 16, text, 1);
}
return;
}
/*
used to update settings at startup
*/
void
net_change_playerid (int pl_nr, unsigned char senddata)
{
int i;
if (GT_MP_PTPM) {
/*
Send to all connected clients the update
*/
for (i = 1; i < MAX_PLAYERS; i++)
if (bman.players[i].net.addr.host[0] != 0)
send_playerid (&bman.players[i].net.addr, bman.players[pl_nr].name,
bman.players[pl_nr].net.addr.host, bman.players[pl_nr].net.addr.port,
pl_nr, bman.players[pl_nr].gfx_nr);
}
else {
/*
Send only to the Server the update and only if in_nr == bman.in_nr
*/
if (pl_nr == bman.p_nr && senddata)
send_playerid (&bman.players[0].net.addr, bman.players[pl_nr].name,
bman.players[pl_nr].net.addr.host, bman.players[pl_nr].net.addr.port,
pl_nr, bman.players[pl_nr].gfx_nr);
}
player_set_gfx (&bman.players[pl_nr], bman.players[pl_nr].gfx_nr);
};
/*
sets up everything for the network game..
on servers the game field will be created and the clients will wait for the game data
within the network loop
*/
void
net_new_gamedata ()
{
int done = 0,
keypressed = 0,
x,
y,
p,
i,
net_istep; // network init step
SDL_Event event;
Uint8 *keys;
Uint32 downtimestamp = 0;
multi_new_game (); // we do it to for the clients 'cause we need to reset the clients
draw_logo ();
if (GT_MP_PTPM)
draw_text (100, 0, "Waiting for the Clients", 1);
else
draw_text (100, 0, "Downloading Data", 1);
SDL_Flip (gfx.screen);
/*
prepare everything for the loop
*/
for (x = 0; x < MAX_PLAYERS; x++) {
bman.players[x].net.timestamp = 0;
bman.players[x].net.net_status = -1;
bman.players[x].net.net_istep = 2;
}
y = -1;
if (GT_MP_PTPM)
net_istep = 0;
else
net_istep = 2;
while (!done && bman.state == GS_update) {
/* the network thing */
network_loop ();
/* if PTPM check if all players are ready */
if (GT_MP_PTPM) {
for (p = 1, i = 1; p < MAX_PLAYERS; p++)
if (PS_IS_playing (bman.players[p].state) && bman.players[p].net.net_istep != 0)
i = 0;
if (i == 1) { /* all players are ready */
done = 1;
bman.state = GS_ready;
}
}
/* if PTPS get all data */
if (GT_MP_PTPS) {
if (net_istep == 2) {
if ((y < bman.fieldsize.y - 1 && y == bman.players[bman.p_nr].net.net_status)
|| y == -1) {
/* send field data req */
y++;
downtimestamp = timestamp;
send_getfield (&bman.players[0].net.addr, y);
}
else if (y < bman.fieldsize.y && y != bman.players[bman.p_nr].net.net_status
&& y >= 0 && timestamp - downtimestamp > DOWNLOAD_TIMEOUT) {
/* we have got no field data */
y--;
}
else if (y == bman.fieldsize.y - 1 && bman.players[bman.p_nr].net.net_status == y) {
/* we have got all field data */
y = -1;
bman.players[bman.p_nr].net.net_istep = --net_istep;
bman.players[bman.p_nr].net.net_status = -1;
}
}
if (net_istep == 1) {
if ((y < MAX_PLAYERS - 1 && y == bman.players[bman.p_nr].net.net_status) || y == -1) {
/* send player date req */
y++;
downtimestamp = timestamp;
send_getplayerdata (&bman.players[0].net.addr, y);
}
if (y < MAX_PLAYERS && y != bman.players[bman.p_nr].net.net_status && y >= 0
&& timestamp - downtimestamp > DOWNLOAD_TIMEOUT) {
/* we have got no player data */
y--;
}
if (y == MAX_PLAYERS - 1 && bman.players[bman.p_nr].net.net_status == y) {
/* we have got all playerdata */
y = -1;
bman.players[bman.p_nr].net.net_istep = --net_istep;
bman.players[bman.p_nr].net.net_status = -1;
downtimestamp = timestamp;
send_playerstatus (&bman.players[0].net.addr, bman.p_nr, 0, 0);
}
}
if (net_istep == 0 && bman.players[bman.p_nr].net.net_status == -1
&& timestamp - downtimestamp > DOWNLOAD_TIMEOUT) {
/* server did not send informations back */
downtimestamp = timestamp;
send_playerstatus (&bman.players[0].net.addr, bman.p_nr, 0, 0);
}
}
/* do the grafik work */
draw_netupdatestate ();
SDL_Flip (gfx.screen);
if (SDL_PollEvent (&event) != 0)
switch (event.type) {
case (SDL_QUIT):
bman.state = GS_quit;
bman.p_nr = -1;
done = 1;
}
keys = SDL_GetKeyState (NULL);
if (keys[SDLK_ESCAPE] && event.type == SDL_KEYDOWN) {
done = 1;
bman.p_nr = -1;
keypressed = 1;
bman.state = GS_startup;
}
if (event.type == SDL_KEYUP)
keypressed = 0;
timestamp = SDL_GetTicks (); // needed for time sync.
SDL_Delay (1); // we don't need here anything better
/* player is only watching so just go after we have got everything
go to show the field */
if (bman.state == GS_update && net_istep == 0 && bman.players[bman.p_nr].gfx_nr == -1) {
done = 1;
bman.state = GS_running;
}
}
};
void
net_game_send_player (int p_nr)
{
int p;
if (GT_MP_PTPM) {
for (p = 0; p < MAX_PLAYERS; p++)
if (PS_IS_used (bman.players[p].state) && p != bman.p_nr)
send_playerdata (&bman.players[p].net.addr, p_nr, &bman.players[p_nr]);
}
else if (p_nr == bman.p_nr) {
for (p = 0; p < MAX_PLAYERS; p++)
if (PS_IS_used (bman.players[p].state) && p != bman.p_nr)
send_playerdata (&bman.players[p].net.addr, p_nr, &bman.players[p_nr]);
}
};
void
net_game_send_playermove (int p_nr)
{
int p;
for (p = 0; p < MAX_PLAYERS; p++)
if (PS_IS_used (bman.players[p].state) && p != bman.p_nr)
send_playermove (&bman.players[p].net.addr, p_nr, &bman.players[p_nr]);
};
void
net_game_send_bomb (int p, int b)
{
int pl;
/* check if we are slave and send something else as dropping a bomb */
if (GT_MP_PTPS && bman.players[p].bombs[b].state != BS_ticking)
return;
d_printf ("Send BombData %d, %d\n", p, b);
if (p < 0 || p >= MAX_PLAYERS || b < 0 || b >= MAX_BOMBS)
return;
for (pl = 0; pl < MAX_PLAYERS; pl++)
if (PS_IS_used (bman.players[pl].state) && pl != bman.p_nr)
send_bombdata (&bman.players[pl].net.addr, p, b, &bman.players[p].bombs[b]);
};
void
net_game_send_field (int x, int y)
{
int pl;
d_printf ("Send FieldData %d, %d\n", x, y);
if (x < 0 || x >= MAX_FIELDSIZE_X || y < 0 || y >= MAX_FIELDSIZE_Y)
return;
for (pl = 0; pl < MAX_PLAYERS; pl++)
if (PS_IS_used (bman.players[pl].state) && pl != bman.p_nr)
send_field (&bman.players[pl].net.addr, x, y, &bman.field[x][y]);
};
void
net_delplayer (int pl_nr)
{
char host[LEN_SERVERNAME];
char port[LEN_PORT];
int i,j=1;
d_printf ("net_delplayer (%d)\n", pl_nr);
if (pl_nr == bman.p_nr) {
/* we're not wanted */
network_shutdown ();
bman.state = GS_startup;
}
else {
strncpy (host, bman.players[pl_nr].net.addr.host, LEN_SERVERNAME);
strncpy (port, bman.players[pl_nr].net.addr.port, LEN_PORT);
bman.players[pl_nr].state &= (0xFF - (PSF_used + PSF_alife)); // Delete the used flag
bman.players[pl_nr].net.net_istep = 0; // needed for disconnect during the update
bman.players_nr_s--;
bman.players[pl_nr].gfx_nr = -1;
if (GT_MP_PTPM && (GS_WAITRUNNING || bman.state == GS_update))
for (i = 1; i < MAX_PLAYERS; i++)
if (PS_IS_used (bman.players[i].state)) {
send_quit (&bman.players[i].net.addr, host, port);j++;}
gamesrv_sendmode(bman.maxplayer,j);
}
if (GT_MP_PTPM && bman.notifygamemaster)
gamesrv_sendmode (bman.maxplayer, bman.players_nr_s);
};
void
net_game_fillsockaddr ()
{
/* Update all sockaddr before the game starts */
int i;
for (i = 0; i < MAX_PLAYERS; i++)
if (bman.players[i].net.addr.host[0] != 0 && bman.players[i].net.addr.host[0] != 0)
dns_filladdr (bman.players[i].net.addr.host, LEN_SERVERNAME,
bman.players[i].net.addr.port, LEN_PORT, bman.net_ai_family,
&bman.players[i].net.addr.sAddr);
};
void
net_send_servermode ()
{
int i;
for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_used (bman.players[i].state) && i != bman.p_nr)
send_servermode (&bman.players[i].net.addr, i);
if (GT_MP_PTPM && bman.notifygamemaster) /* send notification the the gamemaster */
gamesrv_sendmode (bman.maxplayer, bman.players_nr_s);
};
/* sends to everyone an up to date playerlist*/
void
net_send_players ()
{
int i,
j;
for (j = 0; j < MAX_PLAYERS; j++)
if (PS_IS_used (bman.players[j].state) && j != bman.p_nr)
for (i = 0; i < MAX_PLAYERS; i++)
send_playerid (&bman.players[j].net.addr, bman.players[i].name,
bman.players[i].net.addr.host, bman.players[i].net.addr.port, i,
bman.players[i].gfx_nr);
};
void
net_send_chat (char *text, signed char notigamesrv)
{
int i;
for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_used (bman.players[i].state) && i != bman.p_nr)
send_chat (&bman.players[i].net.addr, text);
if (GT_MP_PTPM && bman.notifygamemaster && notigamesrv == 1) /* send notification the the gamemaster */
gamesrv_sendchat (text);
};
void net_game_send_ill (int p_nr) {
int i;
d_printf ("net_game_send_ill (%d)\n", p_nr);
for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_used (bman.players[i].state) && i != bman.p_nr)
send_ill (&bman.players[i].net.addr, p_nr, &bman.players[p_nr]);
};

@ -0,0 +1,91 @@
/*
network.h file... for everything what have to do with the network stuff
*/
#ifndef _NETWORK_H_
#define _NETWORK_H_
#define MAX_UDPDATA 1024
#define DOWNLOAD_TIMEOUT 2000
#define DYN_PKG_MAX_MISSING 4
#define GT_MP_PTPM (bman.multitype == MT_ptpm && bman.gametype == GT_multi)
#define GT_MP_PTPS (bman.multitype == MT_ptps && bman.gametype == GT_multi)
#define GT_MP_PTP ((bman.multitype == MT_ptps || bman.multitype == MT_ptpm) && bman.gametype == GT_multi)
#define GS_WAITRUNNING (bman.state == GS_wait || bman.state == GS_ready || bman.state == GS_running)
#ifdef _WIN32
#define _sockaddr sockaddr
#else
#define _sockaddr sockaddr_in6
#endif
struct __net_addr { // this holds the network data
char host[LEN_SERVERNAME];
char port[LEN_PORT];
struct _sockaddr sAddr;
} typedef _net_addr;
struct __net_player {
_net_addr addr; // holds the address
int pingreq; // just to send a ping and to save the number in here
int pingack; // just to wait for an ping reply.. it will show up here
Uint32 timestamp; // time of the last incoming package
signed char net_istep;
signed char net_status;
} typedef _net_player;
extern int _net_to_2sec;
extern Uint32 _net_to_timestamp;
// network menu
extern void netmenu();
extern void networkmenu_joingame ();
extern void networkmenu_options ();
extern void join_multiplayer_game ();
extern void host_multiplayer_game ();
extern void multiplayer_firstrun ();
// network.c
extern int network_server_port (char *server, char *host, int hostlen, char *port, int portlen);
extern void network_shutdown ();
extern int network_init ();
extern int network_loop ();
extern void net_change_playerid (int pl_nr, unsigned char senddata);
extern void net_new_gamedata ();
extern void net_game_send_player (int p_nr);
extern void net_game_send_playermove (int p_nr);
extern void net_game_send_bomb (int p, int b);
extern void net_game_send_field (int x, int y);
extern void net_game_fillsockaddr ();
extern void net_game_send_ill (int p_nr);
extern void net_delplayer (int pl_nr);
extern void draw_netupdatestate ();
extern void net_send_servermode ();
extern void net_send_players ();
extern int net_check_timeout (int pl_nr);
extern void net_dyn_pkgoption ();
extern void net_send_chat (char *text, signed char notigamesrv);
// multiwait.c
extern void wait_for_players ();
extern void mw_init ();
extern void mw_shutdown ();
extern void mw_draw_gfxselect (int selgfx);
extern void mw_draw_status ();
extern void mw_wait_for_connect ();
extern void mw_draw_chat ();
// udp.c
extern char *dns_net_getip (char *host);
extern int dns_filladdr (char *host, int hostlen, char *port, int portlen, int ai_family, struct _sockaddr *sAddr);
extern int udp_get (int sock, char *text, int len, struct _sockaddr *sAddr, int ai_family);
extern int udp_server (char *port, int ai_family);
extern void udp_send (int sock, char *text, int len, struct _sockaddr *sAddr, int ai_family);
extern void udp_close (int sock);
#endif

File diff suppressed because it is too large Load Diff

@ -0,0 +1,272 @@
/* network packets.. */
enum _network_data {
PKG_error = 0,
PKG_pingreq,
PKG_pingack,
PKG_playerid,
PKG_servermode,
PKG_quit,
PKG_field,
PKG_playerdata,
PKG_bombdata,
PKG_getfield,
PKG_getplayerdata,
PKG_fieldline,
PKG_playerstatus,
PKG_pkgack,
PKG_playermove,
PKG_chat,
PKG_ill,
PKG_bcmservchat = 90
};
enum _pkgflags {
PKGF_ackreq = 1,
PKGF_ipv6 = 2
};
struct pkgheader {
unsigned char typ;
unsigned char flags;
short int id;
short int len;
};
struct pkg {
struct pkgheader h;
char data[0];
};
struct pkg_bcmservchat {
char typ;
char data[128];
};
struct pkg_pkgack {
struct pkgheader h;
char typ;
short int id;
};
struct pkg_ping {
struct pkgheader h;
int data;
};
struct pkg_field {
struct pkgheader h;
unsigned char x;
unsigned char y;
_field field;
};
struct pkg_error {
struct pkgheader h;
unsigned char nr;
char text[128];
};
struct pkg_servermode {
struct pkgheader h;
unsigned char type;
unsigned char state;
unsigned char multitype;
unsigned char players;
unsigned char maxplayer;
signed char last_winner;
signed char fieldsize_x;
signed char fieldsize_y;
signed char pl_nr; /* if the server sends this to a client...
it will be the clients in_nr number
(-1) for not set */
};
struct pkg_playerid {
struct pkgheader h;
char name[LEN_PLAYERNAME];
char host[LEN_SERVERNAME];
char port[LEN_PORT];
signed char ver_major; // Version
signed char ver_minor; // Version
signed char ver_sub; // Version
signed char pl_nr; // Player Nummer
signed char gfx_nr; // number of the graphic
signed char state;
short int points;
short int wins;
};
struct pkg_playerdata {
struct pkgheader h;
signed char p_nr; // Playernumber
short int points; // points
short int wins; // how many times we win
signed char gfx_nr; // the gfx number we want to use
_point pos;
unsigned char bombs_n;
unsigned char range;
unsigned char state;
unsigned char d;
unsigned char frame;
signed char dead_by;
};
struct pkg_playermove {
struct pkgheader h;
signed char p_nr;
signed char m;
signed char d;
signed char speed;
_point pos;
};
struct pkg_bombdata {
struct pkgheader h;
unsigned char p_nr;
unsigned char b_nr;
unsigned char x;
unsigned char y;
unsigned char state;
unsigned char r;
int ex_nr;
int to;
};
struct pkg_quit {
struct pkgheader h;
char host[LEN_SERVERNAME];
char port[LEN_PORT];
};
struct pkg_getfield {
struct pkgheader h;
signed char line;
};
struct pkg_playerstatus {
struct pkgheader h;
signed char pl_nr;
signed char net_istep;
signed char status;
};
struct pkg_fieldline {
struct pkgheader h;
signed char line;
unsigned char type[MAX_FIELDSIZE_X];
unsigned char special[MAX_FIELDSIZE_X];
};
struct pkg_ill {
struct pkgheader h;
signed char pl_nr;
short int to[PI_max];
};
struct pkg_getplayerdata {
struct pkgheader h;
signed char pl_nr;
};
struct pkg_chat {
struct pkgheader h;
char text[128];
};
struct _rscache_entry {
short int len; // size of the entry
Uint32 timestamp; // pointer to the timestamp
signed char retry; // retry's how many times we tryed this
_net_addr addr; // pointer to the address
struct pkg packet; // pointer to the packet
};
struct _resend_cache {
char *data; // will hold the pointer to out cache
struct _rscache_entry *entry; // pointer to our data
int fill; // how much we have used
};
struct _inpkg_index {
_net_addr addr;
unsigned char typ;
short int id;
};
extern int do_error (struct pkg_error *data, _net_addr *addr);
extern void do_playerid (struct pkg_playerid *p_id, _net_addr *addr);
extern void do_servermode (struct pkg_servermode *s_mod, _net_addr *addr);
extern void do_field (struct pkg_field *f_dat, _net_addr *addr);
extern void do_ping (struct pkg_ping *p_dat, _net_addr *addr);
extern void do_playerdata (struct pkg_playerdata *p_dat, _net_addr *addr);
extern void do_playermove (struct pkg_playermove *p_dat, _net_addr *addr);
extern void do_bombdata (struct pkg_bombdata *b_dat, _net_addr *addr);
extern void do_quit (struct pkg_quit *q_dat, _net_addr *addr);
extern void do_getfield (struct pkg_getfield *gf_dat, _net_addr *addr);
extern void do_fieldline (struct pkg_fieldline *f_dat, _net_addr *addr);
extern void do_getplayerdata (struct pkg_getplayerdata *gp_dat, _net_addr *addr);
extern void do_playerstatus (struct pkg_playerstatus *gp_dat, _net_addr *addr);
extern void do_pkgack (struct pkg_pkgack *p_ack, _net_addr *addr);
extern void do_chat (struct pkg_chat *chat_pkg, _net_addr *addr);
extern int do_pkg (struct pkg *packet, _net_addr *addr);
extern void do_bcmservchat (struct pkg_bcmservchat *packet, _net_addr *addr);
extern void do_ill (struct pkg_ill *ill_pkg, _net_addr *addr);
extern void send_pkg (struct pkg *packet, _net_addr *addr);
extern void send_playerid (_net_addr *addr, char *name, char *pladdr, char *plport, int p_nr, int gfx_nr);
extern void send_servermode (_net_addr *addr, int pl_nr);
extern void send_error (_net_addr *addr, char *text);
extern void send_field (_net_addr *addr, int x, int y, _field * field);
extern void send_ping (_net_addr *addr, int data, unsigned char typ);
extern void send_playerdata (_net_addr *addr, int p_nr, _player * pl);
extern void send_playermove (_net_addr *addr, int p_nr, _player * pl);
extern void send_bombdata (_net_addr *addr, int p, int b, _bomb * bomb);
extern void send_quit (_net_addr *addr, char *plhost, char *plport);
extern void send_getfield (_net_addr *addr, int line);
extern void send_fieldline (_net_addr *addr, int line);
extern void send_getplayerdata (_net_addr *addr, int pl);
extern void send_playerstatus (_net_addr *addr, int pl_nr, int net_istep, int status);
extern void send_pkgack (_net_addr *addr, unsigned char typ, short int id);
extern void send_chat (_net_addr *addr, char *text);
extern void send_ill (_net_addr *addr, int p_nr, _player *pl);
extern int get_player_nr (char *host, char *port);
extern int inpkg_check (unsigned char typ, short int id, _net_addr *addr);
/* this functions will be defined in pkgcache.c */
extern int rscache_add (_net_addr *addr, struct pkg *packet);
extern void rscache_del ();
extern int rscache_getpos (_net_addr *addr, unsigned char typ, short int id);
extern int rscache_getcurlen ();
extern void rscache_loop ();
extern struct _resend_cache resend_cache;

@ -0,0 +1,158 @@
#include "bomberclone.h"
#include "network.h"
#include "packets.h"
/*
set pointers at the giving pos
*/
void
rscache_setpointer (int pos)
{
resend_cache.entry = (struct _rscache_entry *) (((char *) resend_cache.data) + pos);
};
/*
add a packet to the cache and sets the timestamp
*/
int
rscache_add (_net_addr * addr, struct pkg *packet)
{
int newlen;
if (resend_cache.fill + sizeof (struct _rscache_entry) > PKG_RESENDCACHE_SIZE)
return -1;
rscache_setpointer (resend_cache.fill);
resend_cache.entry->retry = 0;
resend_cache.entry->timestamp = timestamp;
memcpy (&resend_cache.entry->addr, addr, sizeof (_net_addr));
memcpy (&resend_cache.entry->packet, packet, packet->h.len);
newlen = resend_cache.fill + rscache_getcurlen ();
resend_cache.fill = newlen;
return 0;
};
/*
deletes the packet at current pointer in the cache
*/
void
rscache_del ()
{
int len,
size;
char *pos1;
/* check if we are able to delete */
if ((char *) resend_cache.data > (char *) resend_cache.entry ||
(char *) resend_cache.entry > (char *) resend_cache.data + resend_cache.fill ||
resend_cache.fill == -1 || resend_cache.data == NULL) {
d_printf ("rscache_del: something wrong with the cache\n");
exit (1);
return;
}
/* newlen = size of the cacheentry we are going to delete */
len = rscache_getcurlen ();
if (resend_cache.fill <= len) /* something went wrong, fill is smaler as the cacheentry, delete the cache */
resend_cache.fill = 0;
else {
pos1 = (char *) resend_cache.entry + len;
size = PKG_RESENDCACHE_SIZE - (pos1 - resend_cache.data);
if (resend_cache.fill < PKG_RESENDCACHE_SIZE) {
memmove (resend_cache.entry, pos1, size);
resend_cache.fill = resend_cache.fill - len;
}
}
};
/*
get the position in the cache where our needed packet is
*/
int
rscache_getpos (_net_addr * addr, unsigned char typ, short int id)
{
int len,
pos,
done = 0;
for (pos = 0; (pos < resend_cache.fill && done == 0);) {
rscache_setpointer (pos);
/* get size of the cacheentry */
len = rscache_getcurlen ();
if (strcmp (addr->host, resend_cache.entry->addr.host) == 0 &&
strcmp (addr->port, resend_cache.entry->addr.port) == 0 &&
typ == resend_cache.entry->packet.h.typ && id == resend_cache.entry->packet.h.id)
done = 1; /* we have found the old packet */
else
pos = pos + len;
}
if (done == 0) /* we have found nothing */
return -1;
return pos;
};
/* get the len of the current entry */
int
rscache_getcurlen ()
{
int len;
len = sizeof (struct _rscache_entry) - sizeof (struct pkg) + resend_cache.entry->packet.h.len;
return len;
};
/*
the loop for the cache.. to see what will have to be resend
*/
void
rscache_loop ()
{
int len,
pos,
timeout = RESENDCACHE_TIMEOUT;
for (pos = 0; pos < resend_cache.fill && pos < PKG_RESENDCACHE_SIZE && pos >= 0;) {
rscache_setpointer (pos);
len = rscache_getcurlen ();
if (timestamp - resend_cache.entry->timestamp >= timeout
&& resend_cache.entry->retry < RESENDCACHE_RETRY) {
/* send it again */
d_printf
("Data Send Timeout (%s:%s) Resend now Package Fill %d, Pos %d\n",
resend_cache.entry->addr.host, resend_cache.entry->addr.port, resend_cache.fill,
pos);
udp_send (bman.sock, (char *) &resend_cache.entry->packet,
resend_cache.entry->packet.h.len, &resend_cache.entry->addr.sAddr,
bman.net_ai_family);
resend_cache.entry->timestamp = timestamp;
resend_cache.entry->retry++;
_net_to_2sec++;
}
if (timestamp - resend_cache.entry->timestamp >= timeout
&& resend_cache.entry->retry >= RESENDCACHE_RETRY) {
d_printf ("Data Send Timeout (%s:%s) Delete now Package Fill %d, Pos %d\n",
resend_cache.entry->addr.host, resend_cache.entry->addr.port,
resend_cache.fill, pos);
rscache_del ();
_net_to_2sec++;
}
else
pos = pos + len;
}
};

@ -0,0 +1,632 @@
/* player.c - everything what have to do with the player */
#include <SDL.h>
#include "bomberclone.h"
#include "network.h"
void
draw_player (_player * player)
{
SDL_Rect src,
dest;
int i;
dest.w = src.w = player->gfx->size.x;
dest.h = src.h = player->gfx->size.y;
dest.x =
gfx.offset.x + player->gfx->offset.x + (player->pos.x >> 8) * gfx.block.x +
gfx.postab[player->pos.x & 255];
dest.y =
gfx.offset.y + player->gfx->offset.y + (player->pos.y >> 8) * gfx.block.y +
gfx.postab[player->pos.y & 255];
src.x = player->d * player->gfx->size.x;
src.y = player->frame * player->gfx->size.y;
SDL_BlitSurface (player->gfx->ani.image, &src, gfx.screen, &dest);
/* if the player is ill, draw this image above him */
if (PS_IS_alife (player->state)) {
for (i = PI_max - 1; (i >= 0) && (player->ill[i].to == 0); i--);
if (i >= 0) {
dest.w = src.w = gfx.block.x * 2;
dest.h = src.h = gfx.block.y * 2;
src.x = 0;
src.y = (2 * gfx.block.y) * player->illframe;
dest.x =
(-(gfx.block.x >> 1)) + gfx.offset.x + (player->pos.x >> 8) * gfx.block.x +
gfx.postab[player->pos.x & 255];
dest.y =
gfx.offset.y + ((player->pos.y >> 8) - 1) * gfx.block.y +
gfx.postab[player->pos.y & 255];
SDL_BlitSurface (gfx.ill.image, &src, gfx.screen, &dest);
}
}
gfx_AddUpdateRect (dest.x, dest.y, dest.w, dest.h);
player->old = player->pos; // save this position
};
void
restore_players_screen ()
{
int i,
x,
xe,
y,
ys,
ye;
for (i = 0; i < MAX_PLAYERS; i++)
if ((PS_IS_used (bman.players[i].state)) && bman.players[i].old.x != -1) {
x = (bman.players[i].old.x >> 8) - 1;
xe = (bman.players[i].old.x >> 8) + 2;
if (x < 0)
x = 0;
if (xe >= bman.fieldsize.x)
xe = bman.fieldsize.x - 1;
ys = (bman.players[i].old.y >> 8) - 1;
ye = (bman.players[i].old.y >> 8) + 1;
if (ys < 0)
ys = 0;
if (ye >= bman.fieldsize.y)
ye = bman.fieldsize.y - 1;
for (; x <= xe; x++)
for (y = ys; y <= ye; y++)
draw_stone (x, y);
}
};
void
player_check_powerup (_player * p)
{
int fx = p->pos.x >> 8;
int fy = p->pos.y >> 8;
int _x = p->pos.x & 255;
int _y = p->pos.y & 255;
/* Get the right field position */
if (_x > 128)
fx = fx + 1;
if (_y > 128)
fy = fy + 1;
/* we found a bomb powerup */
if (bman.field[fx][fy].type == FT_bomb) {
if (p->bombs_n < MAX_BOMBS)
p->bombs_n++;
bman.field[fx][fy].type = FT_nothing;
if (bman.gametype != GT_single)
net_game_send_field (fx, fy);
}
/* we found a fire powerup */
if (bman.field[fx][fy].type == FT_fire) {
if (p->range < MAX_RANGE && p->ill[PI_range].to <= 0)
p->range++;
bman.field[fx][fy].type = FT_nothing;
if (bman.gametype != GT_single)
net_game_send_field (fx, fy);
}
/* we found a shoe powerup */
if (bman.field[fx][fy].type == FT_shoe) {
if (p->speed < MAX_SPEED && p->ill[PI_slow].to <= 0)
p->speed *= SPEEDMUL;
bman.field[fx][fy].type = FT_nothing;
if (bman.gametype != GT_single)
net_game_send_field (fx, fy);
}
/* we found a death ?powerup? */
if (bman.field[fx][fy].type == FT_death) {
player_set_ilness (p, -1);
net_game_send_ill (bman.p_nr);
bman.field[fx][fy].type = FT_nothing;
if (bman.gametype != GT_single)
net_game_send_field (fx, fy);
}
};
/*
check the givin field. if we are able to move on it
fx,fy = position on the field
*/
int
check_field (short int fx, short int fy, _player * p)
{
_point bombs[MAX_PLAYERS * MAX_BOMBS];
int res = 0;
if (bman.field[fx][fy].type != FT_stone && bman.field[fx][fy].type != FT_block)
res = 1;
get_bomb_on (fx, fy, bombs);
if (bombs[0].x != -1)
res = 0;
return res;
}
int
stepmove_player ()
{
_player *p = &bman.players[bman.p_nr];
int _x,
_y,
dx = 0,
dy = 0,
fx,
fy,
speed = 0;
if (p->m == 1) {
fx = p->pos.x >> 8;
fy = p->pos.y >> 8;
_x = p->pos.x & 255;
_y = p->pos.y & 255;
// do direction correction for going up/down
if (_x > 0 && _x <= 128 && (p->d == up || p->d == down))
p->d = left;
if (_x > 128 && _x < 256 && (p->d == up || p->d == down))
p->d = right;
// do direction correction for left/right
if (_y > 0 && _y <= 128 && (p->d == left || p->d == right))
p->d = up;
if (_y > 128 && _y < 256 && (p->d == left || p->d == right))
p->d = down;
/* get the pos to the next field */
if (p->d == left)
speed = _x;
else if (p->d == right)
speed = 256 - _x;
else if (p->d == up)
speed = _y;
else
speed = 256 - _y;
if (speed > p->speed || speed == 0)
speed = p->speed;
// go left
if (p->d == left && _y == 0 && ((_x == 0 && check_field (fx - 1, fy, p)) || (_x > 0)))
dx = -speed;
// go right
if (p->d == right && _y == 0 && ((_x == 0 && check_field (fx + 1, fy, p)) || (_x > 0)))
dx = speed;
// go up
if (p->d == up && _x == 0 && ((_y == 0 && check_field (fx, fy - 1, p)) || (_y > 0)))
dy = -speed;
// go down
if (p->d == down && _x == 0 && ((_y == 0 && check_field (fx, fy + 1, p)) || (_y > 0)))
dy = speed;
p->pos.x = p->pos.x + dx;
p->pos.y = p->pos.y + dy;
player_check_powerup (p);
}
if (dx == 0 && dy == 0)
return 0;
return (p->speed - speed);
};
void
move_player ()
{
int oldd,
stepsleft,
speed;
_player *p = &bman.players[bman.p_nr];
oldd = p->d;
if (p->m) {
player_animation (p);
if ((stepsleft = stepmove_player ()) > 0) {
/* save the speed and go the rest of the step */
p->d = oldd;
speed = p->speed;
p->speed = stepsleft;
stepmove_player ();
p->speed = speed;
}
if (bman.gametype != GT_single && (bman.net_pkgsend_to == 0 || p->old_m == 0))
net_game_send_playermove (bman.p_nr);
}
/* the player stopt moving so send data */
if (bman.gametype != GT_single && p->m == 0 && p->old_m != 0)
net_game_send_playermove (bman.p_nr);
p->old_m = p->m; // save the old state
p->m = 0;
};
void
player_drop_bomb ()
{
_player *player = &bman.players[bman.p_nr];
_bomb *bomb = NULL;
int i,
_x,
_y;
_point bombs[MAX_PLAYERS * MAX_BOMBS];
for (i = 0; ((i < player->bombs_n) && (player->bombs[i].state != BS_off)); i++);
if (i < player->bombs_n) { // free bomb found
// get the best position for the bomb.
bomb = &player->bombs[i];
bomb->pos.x = player->pos.x >> 8;
bomb->pos.y = player->pos.y >> 8;
_x = player->pos.x & 255;
_y = player->pos.y & 255;
if (_x > 0 && _x <= 128)
_x = 0;
else if (_x > 128) {
bomb->pos.x += 1;
_x = 0;
}
if (_y > 0 && _y <= 128)
_y = 0;
else if (_y > 12) {
bomb->pos.y += 1;
_y = 0;
}
get_bomb_on (bomb->pos.x, bomb->pos.y, bombs);
if (bombs[0].x != -1) // is there already a bomb
return;
d_printf ("Player %d Dropped Bomb %d\n", bman.p_nr, i);
bomb->r = player->range;
bomb->state = BS_ticking;
bomb->ex_nr = -1;
bomb->to = BOMB_TIMEOUT * TIME_FACTOR; // 5 Secs * 200
if (bman.gametype != GT_single) {
net_game_send_bomb (bman.p_nr, i);
if (GT_MP_PTPS)
bomb->to = bomb->to + ((2 * RESENDCACHE_RETRY) / TIME_FACTOR);
}
}
};
/*
check the field - 4 pixels from every side.. so it's not anymore that tricky to get
away from bombs.. */
void
get_player_on (short int x, short int y, int pl_nr[])
{
int i,
p;
for (i = 0, p = 0; p < MAX_PLAYERS; p++)
if (PS_IS_alife (bman.players[p].state)) {
if (bman.players[p].pos.x - 42 > x - 256
&& bman.players[p].pos.x + 42 < x + 256
&& bman.players[p].pos.y - 42 > y - 256 && bman.players[p].pos.y + 42 < y + 256) {
pl_nr[i] = p;
i++;
}
}
pl_nr[i] = -1;
};
void
player_died (_player * player, signed char dead_by)
{
// player die !
d_printf ("player_died (%10s)\n", player->name);
if (PS_IS_alife (player->state) && dead_by >= 0 && dead_by < MAX_PLAYERS)
if (bman.p_nr != dead_by)
bman.players[dead_by].points++;
player->state &= (0xFF - PSF_alife);
player->dead_by = dead_by;
net_game_send_player (bman.p_nr);
};
void
draw_players ()
{
int p;
for (p = 0; p < MAX_PLAYERS; p++) {
if (PS_IS_playing (bman.players[p].state))
draw_player (&bman.players[p]);
}
};
void
player_animation (_player * player)
{
if (player->gfx == NULL)
return;
if (player->frame < player->gfx->ani.frames
&& (player->frameto <= 0 || player->frameto > ANI_PLAYERTIMEOUT)) {
player->frameto = ANI_PLAYERTIMEOUT;
player->frame++;
}
if (player->frame >= player->gfx->ani.frames && PS_IS_alife (player->state))
player->frame = 0;
if (player->frameto > 0)
player->frameto--;
};
void
dead_playerani ()
{
int i;
for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_dead (bman.players[i].state))
player_animation (&bman.players[i]);
};
void
player_calcstep (_player * pl)
{
_point d;
int fx,
fy;
player_animation (pl);
fx = pl->pos.x >> 8;
fy = pl->pos.y >> 8;
if (bman.field[fx][fy].type != FT_block && bman.field[fx][fy].type != FT_stone) {
d.x = 0;
d.y = 0;
if (pl->d == left)
d.x = -16;
else if (pl->d == right)
d.x = 16;
else if (pl->d == up)
d.y = -16;
else if (pl->d == down)
d.y = 16;
pl->pos.x += d.x;
pl->pos.y += d.y;
}
};
/*
calc the position on the screen for moving network players
*/
void
player_calcpos ()
{
_player *pl;
int oldm,
oldd,
p;
for (p = 0; p < MAX_PLAYERS; p++) {
pl = &bman.players[p];
if (PS_IS_netplayer (pl->state) && pl->m != 0) {
if (pl->speeddat == 0 || pl->speed == 1 || pl->speed == 3)
pl->speeddat = 1;
else
pl->speeddat = 0;
oldm = pl->m;
oldd = pl->d;
if (pl->speed > 1)
stepmove_player ();
if (pl->speeddat) {
pl->m = oldm;
pl->d = oldd;
player_calcstep (pl);
}
}
}
};
void
player_ilness_loop ()
{
_player *p;
int type,
pnr,
i,
tmp,
send;
int pl[MAX_PLAYERS + 1];
/* do the illness for the network players */
for (pnr = 0; pnr < MAX_PLAYERS; pnr++)
if (pnr != bman.p_nr && PS_IS_alife (bman.players[pnr].state)) {
p = &bman.players[pnr];
for (type = 0; type < PI_max; type++)
if (p->ill[type].to > 0) {
p->ill[type].to--;
p->illframeto--;
if (p->illframeto <= 0 || p->illframeto > ANI_PLAYERILLTIMEOUT) {
p->illframeto = ANI_PLAYERILLTIMEOUT;
p->illframe++;
if (p->illframe < 0 || p->illframe >= gfx.ill.frames)
p->illframe = 0;
}
}
}
/* check if we have contact with an other ill player */
p = &bman.players[bman.p_nr];
get_player_on (p->pos.x, p->pos.y, pl);
for (i = 0; (pl[i] != -1 && i < MAX_PLAYERS); i++)
if (pl[i] != bman.p_nr) {
send = 0;
for (type = 0; type < PI_max; type++) {
if (bman.players[pl[i]].ill[type].to > p->ill[type].to) {
tmp = p->ill[type].to;
player_set_ilness (p, type);
p->ill[type].to = bman.players[pl[i]].ill[type].to;
if (tmp <= 0)
send = 1;
}
}
if (send != 0)
net_game_send_ill (bman.p_nr);
}
/* do the illness for our own player */
for (type = 0; type < PI_max; type++)
if (p->ill[type].to > 0) {
p->ill[type].to--;
if (p->ill[type].to == 0)
player_clear_ilness (p, type);
else {
p->illframeto--;
if (p->illframeto <= 0 || p->illframeto > ANI_PLAYERILLTIMEOUT) {
p->illframeto = ANI_PLAYERILLTIMEOUT;
p->illframe++;
if (p->illframe < 0 || p->illframe >= gfx.ill.frames)
p->illframe = 0;
}
if (type == PI_keys) {
/* switch direction for player key illness */
if (p->m > 0)
switch (p->d) {
case (left):
p->d = right;
break;
case (right):
p->d = left;
break;
case (up):
p->d = down;
break;
case (down):
p->d = up;
break;
}
}
else if (type == PI_bomb) {
/* player is dropping bombs */
if (p->old.x != p->pos.x || p->old.y != p->pos.y)
player_drop_bomb ();
}
}
}
}
/* player picked up the death powerup, add timeout for
this illness to the maybe excisting timeout */
void
player_set_ilness (_player * p, int t)
{
int type;
if (t == -1)
type = s_random (PI_max);
else
type = t;
d_printf ("Ilness : %d\n", type);
if (type == PI_slow) {
if (p->ill[type].to == 0)
p->ill[type].data = p->speed;
p->speed = 6;
}
else if (type == PI_range) {
if (p->ill[type].to == 0)
p->ill[type].data = p->range;
p->range = 1;
}
p->ill[type].to += TIME_FACTOR * IL_TIMEOUT;
};
/* players ilness is over now */
void
player_clear_ilness (_player * p, int type)
{
if (type < 0 || type >= PI_max)
return;
if (type == PI_slow)
p->speed = p->ill[type].data;
if (type == PI_range)
p->range = p->ill[type].data;
p->ill[type].to = 0;
net_game_send_ill (bman.p_nr);
};
void
player_set_gfx (_player * p, signed char gfx_nr)
{
p->gfx_nr = gfx_nr;
if (p->gfx_nr < 0 || p->gfx_nr >= MAX_PLAYERS)
p->gfx_nr = -1;
if (p->gfx_nr == -1) {
p->gfx = NULL;
p->state &= (0xFF - (PSF_alife + PSF_playing));
}
else {
p->gfx = &gfx.players[gfx_nr];
p->state |= PSF_playing;
}
};

@ -0,0 +1,55 @@
/*
sysfunc.c - this file hold some routines for the system functions..
like d_delay
*/
#include "bomberclone.h"
void s_delay (int ms) {
fd_set selectset;
struct timeval tval;
FD_ZERO (&selectset);
tval.tv_sec = 0;
tval.tv_usec = ms;
select (1, &selectset, NULL, NULL, &tval);
}
int s_random (int maxnr) {
#ifdef _WIN32
return ((rand () * maxnr)/RAND_MAX );
#else
int i;
i = (((rand () >> 16) * (maxnr+1))/(RAND_MAX >> 16));
if (i >= maxnr)
i = 0;
return i;
#endif
};
static char homedir[255];
char *s_gethomedir () {
char *hd;
if ((hd = getenv ("HOME")) == NULL) {
/* Homedir konnte nicht ermittelt werden. */
homedir[0] = 0;
d_printf ("Variable HOME could not be found\n");
}
else {
strncpy (homedir, hd, 253);
homedir [strlen(homedir)+1] = 0;
#ifdef _WIN32
if (homedir [strlen(homedir)-1] != '\\')
homedir [strlen(homedir)] = '\\';
#else
if (homedir [strlen(homedir)-1] != '/')
homedir [strlen(homedir)] = '/';
#endif
}
return homedir;
};

@ -0,0 +1,296 @@
/* udp.c code for the network
File Version 0.2
*/
#define UDP_LEN_HOSTNAME 128
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <time.h>
#ifdef _WIN32
#include <winsock.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#ifdef _WIN32
#define _sockaddr sockaddr
#else
#define _sockaddr sockaddr_in6
#endif
extern char *dns_net_getip (char *host);
extern int dns_filladdr (char *host, int hostlen, char *port, int portlen, int ai_family,
struct _sockaddr *sAddr);
extern int udp_get (int sock, char *text, int len, struct _sockaddr *sAddr, int ai_family);
extern int udp_server (char *port, int ai_family);
extern void udp_send (int sock, char *text, int len, struct _sockaddr *sAddr, int ai_family);
extern void udp_close (int sock);
char dnsip[UDP_LEN_HOSTNAME];
extern void d_printf (char *fmt,...);
/* closes an existing udp server */
void
udp_close (int sock)
{
if (sock != -1)
close (sock);
sock = -1;
};
int
dns_filladdr (char *host, int hostlen, char *port, int portlen, int ai_family,
struct _sockaddr *sAddr)
{
#ifdef _WIN32
struct hostent *he;
char txt[255];
if (host[0] == 0 || port[0] == 0) {
/* we have to complete server and port from the sAddr */
strncpy (host, inet_ntoa (((struct sockaddr_in *) sAddr)->sin_addr), hostlen);
sprintf (txt, "%d", ntohs (((struct sockaddr_in *) sAddr)->sin_port));
strncpy (port, txt, portlen);
}
else {
/* we have to complete the sAddr struct */
if ((he = gethostbyname (host)) == NULL) { // get the host info
perror ("dns_filladdr (gethostbyname)");
return -1;
}
((struct sockaddr_in *) sAddr)->sin_family = ai_family; // host byte order
((struct sockaddr_in *) sAddr)->sin_port = htons (atoi (port)); // short, network byte order
((struct sockaddr_in *) sAddr)->sin_addr = *((struct in_addr *) he->h_addr);
memset (&(((struct sockaddr_in *) sAddr)->sin_zero), '\0', 8); // zero the rest of the struct
}
#else
struct addrinfo hints,
*res;
int err, i,
addrlen;
if (host[0] == 0 || port[0] == 0) {
/* we have to complete server and port from the sAddr */
if (ai_family == PF_INET)
addrlen = sizeof (struct sockaddr_in);
else
addrlen = sizeof (struct sockaddr_in6);
bzero (host, hostlen);
bzero (port, portlen);
if ((err =
getnameinfo ((struct sockaddr *) sAddr, addrlen, host, hostlen, port, portlen,
NI_NUMERICHOST | NI_NUMERICSERV)) < 0) {
d_printf ("dns_filladdr (getnameinfo): %s\n", gai_strerror (err));
return -1;
}
if (strstr (host, "::ffff:") != NULL) {
for (i = 0; host[i + 7] != 0; i++)
host[i] = host[i+7];
host[i] = 0;
}
}
else {
/* we have to complete the sAddr struct */
bzero (&hints, sizeof (struct addrinfo));
hints.ai_family = ai_family;
hints.ai_socktype = SOCK_DGRAM;
if ((err = getaddrinfo (host, port, &hints, &res)) < 0) {
d_printf ("dns_filladdr (getaddrinfo):%s\n", gai_strerror (err));
return -1;
}
// i hope it's enough to copy only sizeof (struct sockaddr) ?
memcpy (sAddr, res->ai_addr, res->ai_addrlen);
freeaddrinfo (res);
}
#endif
return 0;
}
/* send text to someone */
void
udp_send (int sock, char *text, int len, struct _sockaddr *sAddr, int ai_family)
{
int addrlen;
if (ai_family == PF_INET)
addrlen = sizeof (struct sockaddr_in);
#ifndef _WIN32
else
addrlen = sizeof (struct sockaddr_in6);
#endif
if (sendto (sock, text, len, 0, (struct sockaddr *) sAddr, addrlen) == -1)
perror ("udp_send :");
};
int
udp_server (char *port, int ai_family)
{
#ifdef _WIN32
int sock;
struct sockaddr_in sAddr; // my address information
if ((sock = socket (ai_family, SOCK_DGRAM, 0)) == -1) {
perror ("udp_server: socket");
return -1;
}
sAddr.sin_family = AF_INET; // host byte order
sAddr.sin_port = htons (atoi (port)); // short, network byte order
sAddr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset (&(sAddr.sin_zero), '\0', 8); // zero the rest of the struct
if (bind (sock, (struct sockaddr *) &sAddr, sizeof (struct sockaddr)) == -1) {
perror ("udp_server: bind");
return -1;
}
#else
struct addrinfo hints,
*res,
*sres;
int err,
sock,
ai_family_;
bzero (&hints, sizeof (struct addrinfo));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = ai_family;
hints.ai_socktype = SOCK_DGRAM;
ai_family_ = 0;
if ((err = getaddrinfo (NULL, port, &hints, &res)) == 0) {
sres = res;
while ((ai_family_ == 0) && (sres)) {
if (sres->ai_family == ai_family || ai_family == PF_UNSPEC)
ai_family_ = sres->ai_family;
else
sres = sres->ai_next;
}
if (sres == NULL)
sres = res;
ai_family_ = sres->ai_family;
if (ai_family_ != ai_family && ai_family != PF_UNSPEC) {
// ai_family is not identic
freeaddrinfo (res);
return -1;
}
if ((sock = socket (sres->ai_family, SOCK_DGRAM, 0)) < 0) {
perror ("UDP_Server (socket):");
freeaddrinfo (res);
return -1;
}
if ((err = bind (sock, sres->ai_addr, sres->ai_addrlen)) < 0) {
perror ("UDP_Server (bind):");
close (sock);
freeaddrinfo (res);
return -1;
}
freeaddrinfo (res);
}
else {
sock = -1;
d_printf ("UDP_Server (getaddrinfo):%s\n", gai_strerror (err));
}
#endif
return sock;
};
/*
gets some text
RESULT: 0 for nothing on there
*/
int
udp_get (int sock, char *text, int len, struct _sockaddr *sAddr, int ai_family)
{
int clen,
msglen;
fd_set sockset;
struct timeval tval;
if (sock == -1)
return -1;
/* what version of tcp/ip we're using */
if (ai_family == AF_INET)
clen = sizeof (struct sockaddr_in);
#ifndef _WIN32
else
clen = sizeof (struct sockaddr_in6);
#endif
bzero (text, len);
// check if we have got any data
FD_ZERO (&sockset);
FD_SET (sock, &sockset);
tval.tv_sec = 0;
tval.tv_usec = 100;
msglen = 0;
if (select (sock + 1, &sockset, NULL, NULL, &tval)) {
msglen = recvfrom (sock, text, len, 0, (struct sockaddr *) sAddr, &clen);
if (msglen < 0)
return 0;
if ((msglen >= 0) && (msglen < len))
text[msglen] = 0;
}
return msglen;
};
char *
dns_net_getip (char *host)
{
struct hostent *hAddr;
hAddr = gethostbyname (host);
if (hAddr == NULL)
return NULL;
strncpy (dnsip, inet_ntoa (*((struct in_addr *) hAddr->h_addr)), UDP_LEN_HOSTNAME);
return dnsip;
};

@ -0,0 +1 @@
timestamp

@ -0,0 +1,22 @@
# CROP Files
RES=415x415
POS=+150+45
SRES=64x64
SPOS=+0+0
ARES=64x640
APOS=+0+0
rm -rf crop*
rm -rf bomb.bmp
for i in `ls *.bmp`; do
echo "CROP & SCALE " $i
montage -crop $RES$POS $i -geometry $RES+0+0 bmp:crop-$i
mogrify -filter Point -antialias -resize $SRES crop-$i
done;
echo "MONTAGE Bomb";
montage -tile 1x20 -geometry $SRES crop-bomb*.bmp -crop $ARES bmp:bomb.bmp

@ -0,0 +1,38 @@
# CROP Files
RES=214x295
POS=+211+65
SRES=93x128
SPOS=+0+0
ARES=93x2560
APOS=+0+0
FRES=372x2560
FPOS=+0+0
rm -rf crop*
rm -rf out*
rm -rf player.bmp
for i in `ls *.bmp`; do
echo "CROP & SCALE " $i
montage -crop $RES$POS $i -geometry $RES+0+0 bmp:crop-$i
mogrify -filter Point -antialias -resize $SRES crop-$i
done;
echo "MONTAGE back";
montage -tile 1x20 -geometry $SRES crop-*back*.bmp -crop $ARES tiff:out03
echo "MONTAGE front";
montage -tile 1x20 -geometry $SRES crop-*front*.bmp -crop $ARES tiff:out04
echo "MONTAGE left";
montage -tile 1x20 -geometry $SRES crop-*left*.bmp -crop $ARES tiff:out02
echo "MONTAGE right";
montage -tile 1x20 -geometry $SRES crop-*right*.bmp -crop $ARES tiff:out01
echo "MONTAGE all"
montage -tile 4x1 -geometry $ARES$APOS out01 out02 out03 out04 bmp:player.bmp

@ -0,0 +1,17 @@
# CROP Files
SRES=128x128
ARES=128x256
SPOS=+0+0
rm -rf crop*
rm -rf bomb.bmp
for i in `ls *.bmp`; do
echo "SCALE " $i
cp $i crop-$i
mogrify -filter Point -antialias -resize $SRES crop-$i
done;
echo "MONTAGE Sick";
montage -tile 1x2 -geometry $SRES crop-sick*.bmp -crop $ARES bmp:sick.bmp
Loading…
Cancel
Save