commit
5eda6e2fe7
@ -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
|
@ -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, µ) != 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
|
@ -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…
Reference in new issue