--- xblast-tnt-models-20050106.orig/debian/changelog
+++ xblast-tnt-models-20050106/debian/changelog
@@ -0,0 +1,38 @@
+xblast-tnt-models (20050106-3) unstable; urgency=high
+
+ * Make use of the http://sf.net/$project/ hack in debian/watch instead of
+ chosing a mirror on our own.
+ * Added Homepage source control field.
+ * Bumped Standards-Version to 3.8.0, no changes needed.
+ * Added rendering-sources of some models where the author doesn't accept the
+ xblast team reasoning to accept the rendered images as accepted form for
+ modifications. The images originally were submitted without sources,
+ thanks to Bernhard R. Link for being able to offer the sources
+ (closes: #512284). Urgency high as this is a RC fix targetted at lenny.
+ * Added copyright informations to copyright file for above mentioned models
+ to clear things up.
+ * Fixed copyright information with respect to GPLv2 or later.
+
+ -- Gerfried Fuchs <rhonda@debian.at> Fri, 06 Feb 2009 09:51:25 +0100
+
+xblast-tnt-models (20050106-2) unstable; urgency=low
+
+ * The "once every two releases" release.
+ * Updated FSF address in copyright file.
+ * Fixed watch file.
+ * Bumped Standards-Version to 3.7.2, no changes needed.
+ * Generate md5sum file.
+
+ -- Gerfried Fuchs <rhonda@debian.at> Tue, 21 Aug 2007 18:14:19 +0200
+
+xblast-tnt-models (20050106-1) unstable; urgency=low
+
+ * New upstream release.
+
+ -- Gerfried Fuchs <alfie@debian.org> Fri, 07 Jan 2005 13:25:30 +0100
+
+xblast-tnt-models (20040907-1) unstable; urgency=low
+
+ * Initial Release.
+
+ -- Gerfried Fuchs <alfie@debian.org> Wed, 08 Sep 2004 12:30:48 +0200
--- xblast-tnt-models-20050106.orig/debian/control
+++ xblast-tnt-models-20050106/debian/control
@@ -0,0 +1,13 @@
+Source: xblast-tnt-models
+Section: games
+Priority: optional
+Maintainer: Gerfried Fuchs <rhonda@debian.at>
+Standards-Version: 3.8.0
+Homepage: http://xblast.sf.net/
+
+Package: xblast-tnt-models
+Architecture: all
+Description: player models for xblast-tnt
+ XBlast is a multi-player arcade game inspired by the video/computer game
+ Bomberman (Dynablaster). This package contains the player models needed for
+ the game; both for the regular version and the mini version.
--- xblast-tnt-models-20050106.orig/debian/rules
+++ xblast-tnt-models-20050106/debian/rules
@@ -0,0 +1,70 @@
+#!/usr/bin/make -f
+# debian/rules for xblast-tnt-models
+# (c) 2005-2007 by Gerfried Fuchs <rhonda@debian.at>
+# Licenced the same way as xblast-tnt-models itself
+
+PKG = xblast-tnt-models
+TMP = $(CURDIR)/debian/$(PKG)
+
+INSTALL = install
+INSTALL_FILE = $(INSTALL) -p -oroot -groot -m644
+INSTALL_PROGRAM = $(INSTALL) -p -oroot -groot -m755
+INSTALL_SCRIPT = $(INSTALL) -p -oroot -groot -m755
+INSTALL_DIR = $(INSTALL) -p -d -oroot -groot -m755
+
+
+clean:
+ $(checkdir)
+ $(checkroot)
+ -rm -rf $(TMP) debian/files install-stamp
+
+
+build:
+ # nothing to build
+
+
+install: install-stamp
+install-stamp:
+ $(checkdir)
+ $(checkroot)
+ -rm -rf $(TMP)
+ $(INSTALL_DIR) $(TMP)/usr/share
+ cd $(TMP)/usr/share && $(INSTALL_DIR) doc/$(PKG) \
+ games/xblast-tnt/image/sprite
+ $(INSTALL_FILE) *.ppm *.pbm *.epm \
+ $(TMP)/usr/share/games/xblast-tnt/image/sprite
+ touch install-stamp
+
+
+# Build architecture-independent files here.
+binary-indep: install
+ $(checkdir)
+ $(checkroot)
+ $(INSTALL_DIR) $(TMP)/DEBIAN $(TMP)/usr/share/doc/$(PKG)
+ $(INSTALL_FILE) debian/changelog \
+ $(TMP)/usr/share/doc/$(PKG)/changelog.Debian
+ $(INSTALL_FILE) debian/copyright \
+ $(TMP)/usr/share/doc/$(PKG)
+ gzip -9 $(TMP)/usr/share/doc/$(PKG)/changelog.Debian
+ dpkg-gencontrol -isp -p$(PKG) -P$(TMP)
+ cd $(TMP) && find * -type f ! -regex '^DEBIAN/.*' -print0 | \
+ xargs -r0 md5sum > DEBIAN/md5sums
+ dpkg --build $(TMP) ..
+
+
+# Build architecture-dependent files here.
+binary-arch:
+ # We have nothing to do here
+
+
+binary: binary-indep
+
+define checkdir
+ test -f debian/rules
+endef
+
+define checkroot
+ test root = "`whoami`"
+endef
+
+.PHONY: clean build install binary-indep binary-arch binary
--- xblast-tnt-models-20050106.orig/debian/copyright
+++ xblast-tnt-models-20050106/debian/copyright
@@ -0,0 +1,99 @@
+This package was debianized by Gerfried Fuchs <rhonda@debian.at> on
+Sun, 15 Aug 2004 16:41:58 +0200.
+
+It was downloaded from <http://sourceforge.net/projects/xblast/>
+
+Upstream Authors:
+=================
+Current maintainers:
+ Fernando Benites <iskywalker@users.sourceforge.net>
+ Gerfried Fuchs <alfie@users.sourceforge.net>
+Original author:
+ Oliver Vogel
+
+
+Copyright:
+==========
+ Copyright by Oliver Vogel <m.vogel@ndh.net>
+
+ This package 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 package 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ --------------------------------------------------------------------
+
+ sprites/golem/XBlast Robot.inc, sprites/insect/XBlast Robot.inc,
+ sprites/sticky/XBlast Robot.inc, sprites/tutorial/*,
+
+ Copyright by Mark Weyer <weyer@informatik.uni-freiburg.de>
+
+ 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.
+
+ --------------------------------------------------------------------
+
+ sprites/felix/XBlast Robot.inc:
+
+ Copyright by Oliver Vogel <m.vogel@ndh.net>
+ Copyright 2003 by Bernhard R. Link <brlink@debian.org>
+
+ 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.
+
+ --------------------------------------------------------------------
+
+ sprites/ping/XBlast Robot.inc:
+
+ Copyright by Oliver Vogel <m.vogel@ndh.net>
+ Copyright by Daniela Lipps <gkrmbl@gmx.de>
+
+ 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.
+
+ --------------------------------------------------------------------
+
+ sprites/wuschel/XBlast Robot.inc:
+
+ Copyright by Oliver Vogel <m.vogel@ndh.net>
+ Copyright by Immanuel Halupczok <xblast@karimmi.de>
+
+ 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.
+
+ --------------------------------------------------------------------
+
+ sprites/wusel/*:
+
+ Copyright by Immanuel Halupczok <xblast@karimmi.de>
+
+ 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.
+
+
+The debianization is Copyright by Gerfried Fuchs <rhonda@debian.at> and
+licensed likewise under GPLv2 or later.
+
+On Debian GNU/Linux systems, the complete text of the GNU General Public
+License version 2 can be found in `/usr/share/common-licenses/GPL-2',
+later versions can be found in the same directory.
--- xblast-tnt-models-20050106.orig/debian/watch
+++ xblast-tnt-models-20050106/debian/watch
@@ -0,0 +1,4 @@
+version=3
+opts="uversionmangle=s/-//g" \
+http://sf.net/xblast/ models-([\d-]+)\.tar\.gz debian uupdate
+# Site/Directory Pattern Version Script
--- xblast-tnt-models-20050106.orig/debian/sprites/README
+++ xblast-tnt-models-20050106/debian/sprites/README
@@ -0,0 +1,54 @@
+Rendering Sprites for XBlast
+============================
+
+There s one Makefile to help you creatinng xblast player sprites.
+
+for testing:
+
+make test.<name>
+
+for the images:
+
+make conv.<type>
+
+To delete temporar files:
+
+make clean
+
+For faster low quality (BigWinner is still Big):
+
+make QUALITY=LoQ.ini conv.<name>
+
+
+How the povray-stuff works
+=========================
+
+AllPlayer*.pov
+--------------
+
+The main pov-file is always one in the include directory:
+- "AllPlayerAnimation.pov" for normal waliking images
+- "AllPlayerSpecial.pov" for losing, winning, etc.
+- "BigWinner.pov" for the big winner image
+
+The corresponding .ini file tells povray to create an animation. The main
+pov-file then sets some variables, depending on the frame, which describe
+what version of the character should be rendered.
+See "include/frame_defaults.inc" which variables there are.
+Also, the correct colors are set by including "include/chooseColors.inc".
+
+After that, the shape-dependent "XBlast Robot.inc" is included, which
+draws the character according to the variables, and then, by including
+"world.inc", the rest of the world (floor, lights, camera) is created.
+
+XBlast Robot.inc
+----------------
+
+This file creates the character using the variables set by the main
+file. To tell what things like "Second frame of walking" means for
+the differnt parts of the body, there's a file "include/frames.inc"
+which works for human-like characters. The others can have their own
+"localframes.inc" in their own directory. The file
+"include/humanoid_frames.inc" is a new improved version of
+"include/frames.inc".
+
--- xblast-tnt-models-20050106.orig/debian/sprites/Makefile
+++ xblast-tnt-models-20050106/debian/sprites/Makefile
@@ -0,0 +1,91 @@
+EPMTOOLS = ./epmtools
+POV=povray
+QUALITY=HiQ.ini
+
+.DELETE_ON_ERROR:
+.PRECIOUS: %.epm %.pbm %.ppm.gz
+.PHONY: conv.% %.test
+
+all: conv.normal conv.felix conv.insect conv.wuschel conv.wusel conv.ping conv.golem conv.sticky conv.tutorial
+
+PHASES=1 2 3
+SPECIALPOSES=L L1 L2 W W2 W3 DD DL DU DR
+NORMALPOSES=$(foreach d,D L U R,$(d)_S $(d)_0 $(d)_1 $(d)_2 $(d)_3)
+
+POSES = B $(SPECIALPOSES) $(NORMALPOSES)
+
+conv.%: $(foreach pose,$(POSES),fertig/%_$(pose).epm)
+ @echo "$* finished"
+
+clean:
+ -rm -f *.pgm *.epm *.pbm *.tmp fertig/*.grn fertig/*.red fertig/*.blu fertig/*.pgm tmp/*
+
+
+realclean: clean
+ -rm fertig/*.ppm.gz fertig/*.epm fertig/*.pbm
+
+
+%.red %.grn %.blu: %.ppm.gz
+ gunzip < $< > $*.ppm
+ ppmtorgb3 $*.ppm
+ -rm $*.ppm
+
+%.helmet.pgm: %_1.red %_3.grn
+ pnmarith -sub $^ >$@
+
+%.face.pgm: %_1.grn %_3.grn
+ pnmarith -sub $^ >$@
+
+%.body.pgm: %_1.blu %_3.grn
+ pnmarith -sub $^ >$@
+
+%.handsfeet.pgm: %_2.red %_3.grn
+ pnmarith -sub $^ >$@
+
+%.armslegs.pgm: %_2.grn %_3.grn
+ pnmarith -sub $^ >$@
+
+%.backpack.pgm: %_2.blu %_3.grn
+ pnmarith -sub $^ >$@
+
+%.pbm: %_3.blu %_3.grn
+ pnmarith -sub $^ | pgmtopbm -threshold -value 0.5 >$@
+
+%.epm: %.pbm %.helmet.pgm %.face.pgm %.body.pgm %.handsfeet.pgm %.armslegs.pgm %.backpack.pgm %_3.grn
+ $(EPMTOOLS)/pgmtoepm $*.helmet.pgm $*.face.pgm $*.body.pgm \
+ $*.handsfeet.pgm $*.armslegs.pgm $*.backpack.pgm \
+ $*_3.grn >$@
+ $(EPMTOOLS)/epmcompress $@
+ -rm -f $@~
+
+# Rendern:
+
+# big winner sprites
+%_B_1.ppm.gz %_B_2.ppm.gz %_B_3.ppm.gz:
+ if [ ! -d ./$(notdir $*) ]; then echo "where is '$(notdir $*)'?" ; exit 1 ; fi
+ export DESTNAME=$* ; $(POV) +L./$(notdir $*) +L./include BigWinner.ini +Ob$(notdir $*).tmp
+
+# special sprites
+$(foreach phase,$(PHASES),$(foreach suffix,$(SPECIALPOSES),%_$(suffix)_$(phase).ppm.gz)):
+ if [ ! -d ./$(notdir $*) ]; then echo "where is '$(notdir $*)'?" ; exit 1 ; fi
+ export DESTNAME=$* ; $(POV) +L./$(notdir $*) +L./include AllPlayerSpecial.ini $(QUALITY) +Os$(notdir $*).tmp
+
+# "normal" sprites
+$(foreach phase,$(PHASES),$(foreach suffix,$(NORMALPOSES),%_$(suffix)_$(phase).ppm.gz)):
+ if [ ! -d ./$(notdir $*) ]; then echo "where is '$(notdir $*)'?" ; exit 1 ; fi
+ export DESTNAME=$* ; $(POV) +L./$(notdir $*) +L./include AllPlayerAnimation.ini $(QUALITY) +Op$(notdir $*).tmp
+
+test.%:
+ $(POV) +L./$(notdir $*) +L./include Anschauen.ini +O$*_test.tmp
+ -rm $*_test.tmp
+
+walk.%:
+ $(POV) +L./$(notdir $*) +L./include WalkFluidly.ini +Otmp/$*_testwalk.ppm
+
+win.%:
+ $(POV) +L./$(notdir $*) +L./include WinFluidly.ini +Otmp/$*_testwin.ppm
+
+lose.%:
+ $(POV) +L./$(notdir $*) +L./include LoseFluidly.ini +Otmp/$*_testlose.ppm
+
+
--- xblast-tnt-models-20050106.orig/debian/sprites/COPYING
+++ xblast-tnt-models-20050106/debian/sprites/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- xblast-tnt-models-20050106.orig/debian/sprites/AUTHORS
+++ xblast-tnt-models-20050106/debian/sprites/AUTHORS
@@ -0,0 +1,20 @@
+Theese scripts are based on those by "Oliver Vogel <m.vogel@ndh.net>".
+
+The common infrastructure (consisting in large pieces or even whole
+files out of parts from the original scripts) was written by:
+ Bernhard R. Link <brlink@debian.org>,
+ Immanuel Halupzok <xblast@karimmi.de>
+ Mark Weyer <weyer@informatik.uni-freiburg.de>
+
+Design and coding of the characters:
+ normal:
+ Oliver Vogel <m.vogel@ndh.net>
+ golem, insect, sticky, tutorial, :
+ Mark Wayer <weyer@informatik.uni-freiburg.de>
+ wusel, wuschel:
+ Immanuel Halupzok <xblast@karimmi.de>
+ felix (which is only 'normal' with bad ears):
+ Bernhard R. Link <brlink@debian.org>
+ ping (not considered finished):
+ Daniele Lipps <gkrmbl@gmx.de>
+
--- xblast-tnt-models-20050106.orig/debian/sprites/tutorial/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/tutorial/XBlast Robot.inc
@@ -0,0 +1,182 @@
+/*
+ ######################################################################
+
+ XBlast Robot.inc
+
+ Character design tutorial part 4
+
+ (C) by Mark Weyer
+
+ ######################################################################
+*/
+
+//
+///
+//// We have taken care of the states Standing and Walking.
+//// There are some more:
+//// - Winning: This is the state of the winner in a game (the last
+//// player alive after everybody else has been killed). It also is the
+//// state of the cheering crowd between games and after a match and
+//// of the winner of a game or match that is cheered at by the crowd.
+//// Variables:
+//// playerWinning: the flag
+//// playerAnimationClock: similar to playerWalkingClock. Its value
+//// can be 0,1, or 2. The sequence is ...0,1,2,1,0,1,2,1,... .
+//// for the non-animated winner of a match the value is 0.
+//// playerWinningTime: similar to playerWalkingTime. Its value can be
+//// 0, 0.5, or 1.
+//// - Losing: This is the state of the disappointed crowd between games.
+//// It is also the state of the losers of a game at that occasion
+//// and sometimes after the match.
+//// The losers in the game are just skeletons.
+//// Variables:
+//// playerLosing: the flag
+//// playerAnimationClock: the same as above, for the non-animated losers
+//// of a match the value is 0.
+//// playerLosingTime: similar to above.
+//// - Killed: This is the state of a player that has just been hit by a
+//// bomb but has not yet completely lost the game. It is only very
+//// shortly visible at that occasion. It is also sometimes the state of
+//// the losers after the match.
+//// Variables:
+//// playerKilled: the flag
+///
+//// We will now make suitable adjustments for all states
+///
+//
+
+// colours
+
+#local wheelColour1 = handsFeetColor;
+#local wheelColour2 = armsLegsColor;
+#local eyeColour = faceColor;
+
+// basic constants
+
+#declare Wheel_diam = 8/pi;
+#declare Wheel_thickness = 1/2;
+#declare Eye_size = 2/3;
+
+//
+///
+//// This is new:
+///
+//
+
+// derived constants for handling different states
+
+#if (playerKilled)
+ #local Wheel_raise = Wheel_thickness/2;
+ #local Eye_raise = 3*Wheel_raise;
+ #local Eye_down = 60;
+#else
+ #local Wheel_raise = Wheel_diam/2;
+ #local Eye_raise = 2*Wheel_raise;
+ #local Eye_down = 0;
+#end
+
+#if (playerLosing)
+ #local Eye_down = 30;
+ #local Eye_leftright = 30*cos(playerLosingTime*pi);
+#else#if (playerWalking)
+ #local Eye_leftright = 45*sin(playerWalkingTime*2*pi);
+#else
+ #local Eye_leftright = 0;
+#end#end
+
+#if (playerWinning)
+ #local Eye_down = -10;
+#end
+
+// a macro for eyes
+
+#macro eye(side)
+ sphere {
+ 0 1/2
+ pigment { // this pigment partitions the eye into three layers:
+ // black (pupil), eyeColour (iris), and white (rest)
+ checker
+ pigment {rgb <1,1,1>}
+ pigment {
+ checker
+ pigment {rgb eyeColour}
+ pigment {rgb <0,0,0>}
+ translate <1/2,1/2,0>
+ scale 10
+ translate -z/4
+ }
+ translate <1/2,1/2,0>
+ scale <10,10,1>
+ translate -z/6
+ }
+ rotate Eye_leftright*y
+ rotate -Eye_down*x
+ scale Eye_size
+ translate <side*2/3,Eye_raise,-1/2>
+//
+///
+//// Previously these transformations had been:
+///
+// #if (playerWalking)
+// rotate 45*sin(playerWalkingTime*2*pi)*y
+// #end
+// scale Eye_size
+// translate <side*2/3,Wheel_diam,-1/2>
+ }
+#end
+
+#macro wheel()
+ torus {
+ (Wheel_diam-Wheel_thickness)/2 Wheel_thickness/2
+ rotate 90*z
+ pigment { // this pigment partitions the wheel in four sectors
+ checker
+ pigment {rgb wheelColour1}
+ pigment {rgb wheelColour2}
+ translate x/2
+ scale 10
+ }
+ #if (playerWalking)
+ rotate -180*playerWalkingTime*x
+ #end
+//
+///
+//// In Killed state the wheel lies on the floor.
+///
+//
+ #if (playerKilled)
+ rotate 90*z
+ #end
+ translate Wheel_raise*y
+//
+///
+//// Previously this translate had been:
+///
+// translate Wheel_diam/2*y
+ }
+#end
+
+union {
+ wheel()
+ eye(1)
+ eye(-1)
+//
+///
+//// In Winning state the character jumps.
+///
+//
+ #if (playerWinning)
+ translate (1-pow(playerWinningTime,2))*4/3*y
+ #end
+
+ rotate playerAngle*y
+ translate playerLocation
+ translate -2*z
+}
+
+//
+///
+//// That's all. The tutorial ends here.
+///
+//
+
--- xblast-tnt-models-20050106.orig/debian/sprites/tutorial/part1/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/tutorial/part1/XBlast Robot.inc
@@ -0,0 +1,104 @@
+/*
+ ######################################################################
+
+ XBlast Robot.inc
+
+ Character design tutorial part 1
+
+ (C) by Mark Weyer
+
+ ######################################################################
+*/
+
+
+//
+///
+//// Welcome to the tutorial. You will only need to read comments
+//// that are indented like this one. The tutorial consists of
+//// several parts that are sucessive approximations of a complete
+//// character design.
+///
+//
+
+//
+///
+//// The character of our tutorial is minimalistic,
+//// because this is not meant as a PoVRay tutorial.
+//// It is a stylized yellow/blue monowheel with green eyes.
+///
+//
+
+// basic constants
+
+#declare Wheel_diam = 2;
+#declare Wheel_thickness = 1/2;
+#declare Eye_size = 2/3;
+
+// a macro for eyes
+
+#macro eye(side)
+ sphere {
+ 0 1/2
+ pigment { // this pigment partitions the eye into three layers:
+ // black (pupil), green (iris), and white (rest)
+ checker
+ pigment {rgb <1,1,1>}
+ pigment {
+ checker
+ pigment {rgb <0,1,0>}
+ pigment {rgb <0,0,0>}
+ translate <1/2,1/2,0>
+ scale 10
+ translate -z/4
+ }
+ translate <1/2,1/2,0>
+ scale <10,10,1>
+ translate -z/6
+ }
+ scale Eye_size
+ translate <side*2/3,Wheel_diam,-1/2>
+ }
+#end
+
+#macro wheel()
+ torus {
+ (Wheel_diam-Wheel_thickness)/2 Wheel_thickness/2
+ rotate 90*z
+ pigment { // this pigment partitions the wheel in four sectors
+ checker
+ pigment {rgb <1,1,0>}
+ pigment {rgb <0,0,1>}
+ translate x/2
+ scale 10
+ }
+ translate Wheel_diam/2*y
+ }
+#end
+
+//
+///
+//// As follows, all we need to do is place our objects in the file.
+//// This is most convenient in a union.
+///
+//
+
+union {
+ wheel()
+ eye(1)
+ eye(-1)
+
+//
+///
+//// The following should be present in every character definition.
+//// It handles the correct placement of the objects.
+//// The objects should _prior_ to these adjustments be contained in a
+//// box {<-2,0,-2> <2,4,2>}
+//// and look in direction <0,0,-1>
+///
+//
+
+ rotate playerAngle*y
+ translate playerLocation
+ translate -2*z
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/tutorial/part2/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/tutorial/part2/XBlast Robot.inc
@@ -0,0 +1,139 @@
+/*
+ ######################################################################
+
+ XBlast Robot.inc
+
+ Character design tutorial part 2
+
+ (C) by Mark Weyer
+
+ ######################################################################
+*/
+
+//
+///
+//// You may have noticed three things:
+//// - The character colours were not adjustable in the appropriate
+//// xblast menu.
+//// - The character became greyish.
+//// - The character was partly transparent.
+//// All of those have the same reason.
+//// We may not choose colours arbitrarily.
+//// There are two kinds of colours for our character:
+//// - adjustable colours (here: yellow, blue, green)
+//// for the character's features (here: wheel colour 1, wheel colour 2,
+//// eye colour).
+//// There are all together six adjustable colours.
+//// Their names in povray are faceColor, helmetColor, bodyColor,
+//// backpackColor, armsLegsColor and handsFeetColor.
+//// - fixed colours (here: white and black) for things that are not fit
+//// to colour arbitrarily (here: the white of the eye and the pupils).
+//// Those have to be shades of grey.
+//// We will now make adjustments.
+///
+//
+
+//
+///
+//// The adjustable colours have peculiar names. We will use local names.
+///
+//
+
+// colours
+
+#local wheelColour1 = handsFeetColor;
+#local wheelColour2 = armsLegsColor;
+#local eyeColour = faceColor;
+
+// basic constants
+
+#declare Wheel_diam = 2;
+#declare Wheel_thickness = 1/2;
+#declare Eye_size = 2/3;
+
+// a macro for eyes
+
+#macro eye(side)
+ sphere {
+ 0 1/2
+ pigment { // this pigment partitions the eye into three layers:
+ // black (pupil), eyeColour (iris), and white (rest)
+ checker
+ pigment {rgb <1,1,1>}
+ pigment {
+ checker
+ pigment {rgb eyeColour}
+ pigment {rgb <0,0,0>}
+ translate <1/2,1/2,0>
+ scale 10
+ translate -z/4
+ }
+ translate <1/2,1/2,0>
+ scale <10,10,1>
+ translate -z/6
+ }
+//
+///
+//// Previously this pigment had been:
+///
+//
+// pigment { // this pigment partitions the eye into three layers:
+// // black (pupil), green (iris), and white (rest)
+// checker
+// pigment {rgb <1,1,1>}
+// pigment {
+// checker
+// pigment {rgb <0,1,0>}
+// pigment {rgb <0,0,0>}
+// translate <1/2,1/2,0>
+// scale 10
+// translate -z/4
+// }
+// translate <1/2,1/2,0>
+// scale <10,10,1>
+// translate -z/6
+// }
+//
+ scale Eye_size
+ translate <side*2/3,Wheel_diam,-1/2>
+ }
+#end
+
+#macro wheel()
+ torus {
+ (Wheel_diam-Wheel_thickness)/2 Wheel_thickness/2
+ rotate 90*z
+ pigment { // this pigment partitions the wheel in four sectors
+ checker
+ pigment {rgb wheelColour1}
+ pigment {rgb wheelColour2}
+ translate x/2
+ scale 10
+ }
+//
+///
+//// Previously this pigment had been:
+///
+//
+// pigment { // this pigment partitions the wheel in four sectors
+// checker
+// pigment {rgb <1,1,0>}
+// pigment {rgb <0,0,1>}
+// translate x/2
+// scale 10
+// }
+//
+ translate Wheel_diam/2*y
+ }
+#end
+
+union {
+ wheel()
+ eye(1)
+ eye(-1)
+
+ rotate playerAngle*y
+ translate playerLocation
+ translate -2*z
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/tutorial/part3/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/tutorial/part3/XBlast Robot.inc
@@ -0,0 +1,127 @@
+/*
+ ######################################################################
+
+ XBlast Robot.inc
+
+ Character design tutorial part 3
+
+ (C) by Mark Weyer
+
+ ######################################################################
+*/
+
+//
+///
+//// Our character does not really move so far. It just slides across the
+//// floor. This is no surprise, as we have not designed it to move. Now
+//// we will take care of movements. When this file is included in the
+//// overall image creation process, some variables are set that determine
+//// the state our character is in. For the moment we will only respect
+//// the following three:
+//// - playerStanding is a flag that is set if the character standing
+//// still, waiting for orders. This is what we have assumed anyway,
+//// so we will not change anything with respect to that.
+//// - playerWalking is a flag that is set if the player is walking
+//// from one position to the next. For this case we will alter the code.
+//// - playerWalkingClock is set only if playerWalking is true.
+//// It determines, which part of the process of walking the
+//// character is currently in. Its value can be 0, 1, 2, or 3.
+//// The sequence shown on screen when walking long distances is
+//// ...0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3... . One cycle suffices to move
+//// to the neighbouring position.
+//// - playerWalkingTime is a rescaling of playerWalkingClock. Its value
+//// should be thought of as continually ranging from 0 to 1 during
+//// one cycle. Actually it only assumes the values 0, 0.25, 0.5, 0.75.
+//// We will adjust the code so that the wheel makes a half revolution
+//// (after which it looks the same again) during one animation cycle.
+//// Also the eyes will move.
+///
+//
+
+// colours
+
+#local wheelColour1 = handsFeetColor;
+#local wheelColour2 = armsLegsColor;
+#local eyeColour = faceColor;
+
+// basic constants
+
+#declare Wheel_diam = 8/pi;
+//
+///
+//// This new diameter makes the circumference 8 units,
+//// so that with half a revolution the wheel travels 4 units (one position).
+///
+//
+//#declare Wheel_diam = 2;
+#declare Wheel_thickness = 1/2;
+#declare Eye_size = 2/3;
+
+// a macro for eyes
+
+#macro eye(side)
+ sphere {
+ 0 1/2
+ pigment { // this pigment partitions the eye into three layers:
+ // black (pupil), eyeColour (iris), and white (rest)
+ checker
+ pigment {rgb <1,1,1>}
+ pigment {
+ checker
+ pigment {rgb eyeColour}
+ pigment {rgb <0,0,0>}
+ translate <1/2,1/2,0>
+ scale 10
+ translate -z/4
+ }
+ translate <1/2,1/2,0>
+ scale <10,10,1>
+ translate -z/6
+ }
+//
+///
+//// This rotate is new. The eyes will look left and right during walking.
+///
+//
+ #if (playerWalking)
+ rotate 45*sin(playerWalkingTime*2*pi)*y
+ #end
+ scale Eye_size
+ translate <side*2/3,Wheel_diam,-1/2>
+ }
+#end
+
+#macro wheel()
+ torus {
+ (Wheel_diam-Wheel_thickness)/2 Wheel_thickness/2
+ rotate 90*z
+ pigment { // this pigment partitions the wheel in four sectors
+ checker
+ pigment {rgb wheelColour1}
+ pigment {rgb wheelColour2}
+ translate x/2
+ scale 10
+ }
+//
+///
+//// This rotate is new. The wheel will turn.
+//// For a cyclic animation there will be a half revolution per cycle.
+///
+//
+ #if (playerWalking)
+ rotate -180*playerWalkingTime*x
+ #end
+ translate Wheel_diam/2*y
+ }
+#end
+
+union {
+ wheel()
+ eye(1)
+ eye(-1)
+
+ rotate playerAngle*y
+ translate playerLocation
+ translate -2*z
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/tutorial/part4/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/tutorial/part4/XBlast Robot.inc
@@ -0,0 +1,182 @@
+/*
+ ######################################################################
+
+ XBlast Robot.inc
+
+ Character design tutorial part 4
+
+ (C) by Mark Weyer
+
+ ######################################################################
+*/
+
+//
+///
+//// We have taken care of the states Standing and Walking.
+//// There are some more:
+//// - Winning: This is the state of the winner in a game (the last
+//// player alive after everybody else has been killed). It also is the
+//// state of the cheering crowd between games and after a match and
+//// of the winner of a game or match that is cheered at by the crowd.
+//// Variables:
+//// playerWinning: the flag
+//// playerAnimationClock: similar to playerWalkingClock. Its value
+//// can be 0,1, or 2. The sequence is ...0,1,2,1,0,1,2,1,... .
+//// for the non-animated winner of a match the value is 0.
+//// playerWinningTime: similar to playerWalkingTime. Its value can be
+//// 0, 0.5, or 1.
+//// - Losing: This is the state of the disappointed crowd between games.
+//// It is also the state of the losers of a game at that occasion
+//// and sometimes after the match.
+//// The losers in the game are just skeletons.
+//// Variables:
+//// playerLosing: the flag
+//// playerAnimationClock: the same as above, for the non-animated losers
+//// of a match the value is 0.
+//// playerLosingTime: similar to above.
+//// - Killed: This is the state of a player that has just been hit by a
+//// bomb but has not yet completely lost the game. It is only very
+//// shortly visible at that occasion. It is also sometimes the state of
+//// the losers after the match.
+//// Variables:
+//// playerKilled: the flag
+///
+//// We will now make suitable adjustments for all states
+///
+//
+
+// colours
+
+#local wheelColour1 = handsFeetColor;
+#local wheelColour2 = armsLegsColor;
+#local eyeColour = faceColor;
+
+// basic constants
+
+#declare Wheel_diam = 8/pi;
+#declare Wheel_thickness = 1/2;
+#declare Eye_size = 2/3;
+
+//
+///
+//// This is new:
+///
+//
+
+// derived constants for handling different states
+
+#if (playerKilled)
+ #local Wheel_raise = Wheel_thickness/2;
+ #local Eye_raise = 3*Wheel_raise;
+ #local Eye_down = 60;
+#else
+ #local Wheel_raise = Wheel_diam/2;
+ #local Eye_raise = 2*Wheel_raise;
+ #local Eye_down = 0;
+#end
+
+#if (playerLosing)
+ #local Eye_down = 30;
+ #local Eye_leftright = 30*cos(playerLosingTime*pi);
+#else#if (playerWalking)
+ #local Eye_leftright = 45*sin(playerWalkingTime*2*pi);
+#else
+ #local Eye_leftright = 0;
+#end#end
+
+#if (playerWinning)
+ #local Eye_down = -10;
+#end
+
+// a macro for eyes
+
+#macro eye(side)
+ sphere {
+ 0 1/2
+ pigment { // this pigment partitions the eye into three layers:
+ // black (pupil), eyeColour (iris), and white (rest)
+ checker
+ pigment {rgb <1,1,1>}
+ pigment {
+ checker
+ pigment {rgb eyeColour}
+ pigment {rgb <0,0,0>}
+ translate <1/2,1/2,0>
+ scale 10
+ translate -z/4
+ }
+ translate <1/2,1/2,0>
+ scale <10,10,1>
+ translate -z/6
+ }
+ rotate Eye_leftright*y
+ rotate -Eye_down*x
+ scale Eye_size
+ translate <side*2/3,Eye_raise,-1/2>
+//
+///
+//// Previously these transformations had been:
+///
+// #if (playerWalking)
+// rotate 45*sin(playerWalkingTime*2*pi)*y
+// #end
+// scale Eye_size
+// translate <side*2/3,Wheel_diam,-1/2>
+ }
+#end
+
+#macro wheel()
+ torus {
+ (Wheel_diam-Wheel_thickness)/2 Wheel_thickness/2
+ rotate 90*z
+ pigment { // this pigment partitions the wheel in four sectors
+ checker
+ pigment {rgb wheelColour1}
+ pigment {rgb wheelColour2}
+ translate x/2
+ scale 10
+ }
+ #if (playerWalking)
+ rotate -180*playerWalkingTime*x
+ #end
+//
+///
+//// In Killed state the wheel lies on the floor.
+///
+//
+ #if (playerKilled)
+ rotate 90*z
+ #end
+ translate Wheel_raise*y
+//
+///
+//// Previously this translate had been:
+///
+// translate Wheel_diam/2*y
+ }
+#end
+
+union {
+ wheel()
+ eye(1)
+ eye(-1)
+//
+///
+//// In Winning state the character jumps.
+///
+//
+ #if (playerWinning)
+ translate (1-pow(playerWinningTime,2))*4/3*y
+ #end
+
+ rotate playerAngle*y
+ translate playerLocation
+ translate -2*z
+}
+
+//
+///
+//// That's all. The tutorial ends here.
+///
+//
+
--- xblast-tnt-models-20050106.orig/debian/sprites/sticky/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/sticky/XBlast Robot.inc
@@ -0,0 +1,93 @@
+/*
+ XBlast Robot File
+
+ (C) by Mark Weyer
+*/
+
+#include "humanoid_frames.inc"
+
+Erase_humanoid_input_constants()
+
+#declare leg_length = 1.9;
+#declare leg_half_length = 1;
+#declare default_rad = 0.2;
+#declare back_length = 1.4;
+#declare arm_length = 1.7;
+#declare arm_half_length = 0.9;
+
+#declare killed_leg_ang = 75;
+#declare killed_back_ang = 10;
+#declare killed_nod_ang = 45;
+#declare losing_back_ang = 10;
+#declare losing_max_nod_ang = 30;
+#declare winning_jump_height = 0.6;
+#declare walking_back_ang = 10;
+#declare walking_arm_ang = 75;
+
+#declare left_eye_pos = vrotate(<0,0.5,-0.3>,-30*y);
+#declare left_eye_normal = vrotate(-z,-30*y);
+
+Define_humanoid_output_constants()
+
+#macro stick(l,tr,c)
+ cylinder {
+ -l*y 0 0.15
+ pigment {rgb <c.x,c.y,c.z>}
+ transform tr
+ }
+#end
+
+#macro stickk(p1,p2,c)
+ cylinder {
+ p1 p2 0.15
+ pigment {rgb <c.x,c.y,c.z>}
+ }
+#end
+
+#macro round(p,c)
+ sphere {
+ p default_rad
+ pigment {rgb <c.x,c.y,c.z>}
+ }
+#end
+
+union {
+ stick(lower_leg_length,left_lower_leg_trans,armsLegsColor)
+ stick(lower_leg_length,right_lower_leg_trans,armsLegsColor)
+ stick(upper_leg_length,left_upper_leg_trans,armsLegsColor)
+ stick(upper_leg_length,right_upper_leg_trans,armsLegsColor)
+ stick(back_length,back_trans,bodyColor)
+ stick(-0.5,head_trans,helmetColor)
+ stick(upper_arm_length,left_upper_arm_trans,armsLegsColor)
+ stick(lower_arm_length,left_lower_arm_trans,armsLegsColor)
+ stick(upper_arm_length,right_upper_arm_trans,armsLegsColor)
+ stick(lower_arm_length,right_lower_arm_trans,armsLegsColor)
+ stickk(left_hip_pos,hip_pos,bodyColor)
+ stickk(right_hip_pos,hip_pos,bodyColor)
+ stickk(left_shoulder_pos,neck_pos,bodyColor)
+ stickk(right_shoulder_pos,neck_pos,bodyColor)
+ round(left_ankle_pos,handsFeetColor)
+ round(right_ankle_pos,handsFeetColor)
+ round(left_knee_pos,handsFeetColor)
+ round(right_knee_pos,handsFeetColor)
+ round(left_hip_pos,handsFeetColor)
+ round(right_hip_pos,handsFeetColor)
+ round(hip_pos,backpackColor)
+ round(neck_pos,backpackColor)
+ round(left_shoulder_pos,handsFeetColor)
+ round(right_shoulder_pos,handsFeetColor)
+ round(left_elbow_pos,handsFeetColor)
+ round(right_elbow_pos,handsFeetColor)
+ round(left_wrist_pos,handsFeetColor)
+ round(right_wrist_pos,handsFeetColor)
+ sphere {
+ 0.5*y 0.3
+ pigment {rgb faceColor}
+ transform head_trans
+ }
+
+ rotate playerAngle*y
+ translate playerLocation
+ translate -2*z
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/wusel/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/wusel/XBlast Robot.inc
@@ -0,0 +1,224 @@
+//
+// XBlast Robot File
+//
+//
+// Program XBLAST V2.6 or higher
+// (C) by Immanuel Halupczok <xblast@karimmi.de>
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+
+#include "localframes.inc"
+
+/*
+ Parameter an den Wusel:
+ playerDamaged
+ bodyAngle
+ FrontWind
+
+ playerLocation: End-Verschiebung auf dem Boden
+ playerAngle: End-Drehung auf dem Boden
+
+ playerHeight: Abstand Boden-Wuselmitte
+*/
+
+
+#declare haare_schnell = 0;
+#declare haare_anz = 400; // 2000;
+
+// Wird von XBlastTexture benötigt:
+#declare playerIsSick = 0;
+
+#include "XBlastTexture.inc"
+#include "transforms.inc"
+
+
+
+#declare epsi = 0.0001;
+#declare armdicke = 0.15;
+#declare beindicke = 0.15;
+#declare RR = seed(0);
+#declare RRD = seed(1); // Zusatz-Random für damage
+
+
+
+
+/* Gute Werte für kruemmung: 1 für normal, 3 für damaged */
+#macro haar(laenge, kruemmung, wind)
+ #local endpunkt = vnormalize(<laenge, 0, 0> + wind) * laenge;
+ #if (haare_schnell)
+ cylinder {
+ <0, 0, 0> endpunkt 0.03
+ texture {helmetTexture}
+ }
+ #else
+ #local lyz = kruemmung * laenge * 0;
+
+ /* Hinweis: Bei cubic_spline sollten die Tangenten 6 mal so lang
+ sein, wie man denken würde. Und vom _anderen_ Punkt aus gemessen */
+ #local av = <0, rand(RR) * lyz * 2 - lyz, rand(RR) * lyz * 2 - lyz>;
+ #local ev = <0, rand(RR) * lyz * 2 - lyz, rand(RR) * lyz * 2 - lyz>;
+
+ sphere_sweep {
+ cubic_spline 4
+
+
+ (av + wind) 0.03
+ <0, 0, 0> 0.03
+ endpunkt 0.03
+ (endpunkt + ev + 3 * wind) 0.03
+ texture {helmetTexture}
+ }
+ #end
+#end
+
+
+
+#macro PlayerHaare(wind)
+union {
+ #if (playerDamaged)
+ #local hk = 3;
+ #else
+ #local hk = 1;
+ #end
+
+ #local ii = 0;
+ #while (ii < haare_anz)
+
+ /* Wir bauen uns eine Gleichverteilung auf der Kugel:
+ Nutze, dass die Kugelrandfläche einer Scheibe der Dicke
+ epsilon konstant ist. D. h. wähle erst zufällig die y-Koord und dann
+ einen Winkel für Drehung um y-Achse */
+ #local y_koord = rand(RR) * (2 - 2*epsi) - (1 - epsi);
+ #local drehung = rand(RR) * 360;
+
+ #if((y_koord < 0.05) | (y_koord > 0.55) | (drehung < 55) | (drehung > 125))
+
+ #local haar_drehung = transform {
+ // Haar so drehen, dass der Endpunkt an der angegebenen y-Koord ist:
+ #rotate (asin(y_koord) * 360 / 2 / 3.14159) * z
+ // Um die senkrechte Achse drehen
+ #rotate drehung * y
+ };
+
+ #local d_wind = vinv_transform(wind, haar_drehung);
+
+ object {
+ /* Haarlänge zw. 1 und 1.3 */
+ haar(1 + rand(RR)*0.3, hk, d_wind)
+ transform {haar_drehung}
+ }
+
+ #end
+
+ #local ii = ii + 1;
+ #end
+}
+#end
+
+
+#declare augengroesse = 0.2;
+
+#macro Auge(richtung)
+union {
+ intersection {
+ sphere {<0, 0, 0>, 1.3}
+ plane {-z, 0}
+ texture {faceTexture}
+ }
+ sphere {<0, 0, 0>, 1
+ pigment {White * 1.1}
+ finish {Shiny}
+ }
+ intersection {
+ sphere {<0, 0, 0>, 1+epsi}
+ sphere {<0, 0, -1>, 0.5}
+ #if (playerDamaged)
+ pigment {White / 2}
+ #else
+ pigment {Black}
+ #end
+ finish {Shiny}
+ rotate richtung
+ }
+
+
+ scale augengroesse
+
+
+// texture {eyeTexture}
+}
+#end
+
+
+#declare augpos1 = <-0.3, 0.3, -0.8>;
+#declare augpos2 = < 0.3, 0.3, -0.8>;
+
+#macro Augen(ri1, ri2)
+ union {
+ object { Auge(ri1) translate augpos1 }
+ object { Auge(ri2) translate augpos2 }
+ }
+#end
+
+
+#declare PlayerAugen = object {
+ #if (playerDamaged)
+ Augen(<-15, 30, 0>, <35, 5, 0>)
+ #else
+ Augen(<-5, 0, 0>, <-5, 0, 0>)
+ #end
+}
+
+
+#declare Guckbereich = cone {
+ <0, 0, 0>, augengroesse
+ <0, 0, -1>, 2 * augengroesse
+}
+
+
+/* Der Bereich, der aus den Haaren geschnitten werden muss,
+ damit der Wusel was sieht. */
+#declare Guckbereiche = union {
+ object {Guckbereich translate augpos1}
+ object {Guckbereich translate augpos2}
+}
+
+
+union {
+ #local body_drehung = transform {
+ //rotate 30*x // Damit er in die Kamera schaut; später auskommentieren
+ rotate bodyAngle
+ };
+
+ #local d_wind = vinv_transform(FrontWind, body_drehung);
+
+
+
+ //sphere{<0,0,0> 0.1 pigment {color Yellow}}
+
+ PlayerHaare(d_wind)
+
+ object {PlayerAugen}
+
+ transform {body_drehung}
+
+
+
+ translate y*playerHeight
+ rotate playerAngle
+ translate playerLocation
+}
--- xblast-tnt-models-20050106.orig/debian/sprites/wusel/localframes.inc
+++ xblast-tnt-models-20050106/debian/sprites/wusel/localframes.inc
@@ -0,0 +1,110 @@
+// (C) by Immanuel Halupczok <xblast@karimmi.de>
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+
+#macro frameDefaults()
+ #declare playerDamaged = 0;
+ #declare playerHeight = 1.0;
+ #declare playerLocation = z*-2.667;
+ #declare bodyAngle = <0, 0, 0>;
+ #declare FrontWind = <0, 0, 0>;
+#end
+
+
+
+
+#if (playerWinning)
+ #local c=playerAnimationClock;
+ frameDefaults()
+ #switch (c)
+ #case (2)
+ #declare playerHeight = 3.0;
+ #declare FrontWind = 0.1*x;
+ #declare bodyAngle = 20*x;
+ #break
+ #case (1)
+ #declare playerHeight = 4.2;
+ #declare FrontWind = 0.2*x;
+ #declare bodyAngle = 30*x;
+ #break
+ #case (0)
+ #declare playerHeight = 4.6;
+ #declare FrontWind = 0.3*x;
+ #declare bodyAngle = 35*x;
+ #break
+ #end
+
+#end
+
+
+#if (playerLosing)
+ #local c=playerAnimationClock;
+ frameDefaults()
+
+ #switch (c)
+ #case (0)
+ #declare bodyAngle = < -10, 0, 0>;
+ #break
+ #case (1)
+ #declare bodyAngle = < -10, 15, 0>;
+ #break
+ #case (2)
+ #declare bodyAngle = < -10, -15, 0>;
+ #break
+ #end
+#end
+
+
+#if (playerKilled)
+ frameDefaults()
+ #declare playerDamaged = 1;
+ #declare bodyAngle = 15 * x;
+#end
+
+
+#if (playerWalking)
+ #local c=playerAnimationClock;
+ frameDefaults()
+
+ #switch (c)
+ #case (0)
+ #declare playerHeight = 1.0;
+ #declare FrontWind = <0, -0.2, 0.4>;
+ #break
+ #case (1)
+ #declare playerHeight = 2.2;
+ #declare FrontWind = <0, 0.4, 0.4>;
+ #break
+ #case (2)
+ #declare playerHeight = 2.6;
+ #declare FrontWind = <0, 0, 0.4>;
+ #break
+ #case (3)
+ #declare playerHeight = 2.2;
+ #declare FrontWind = <0, -0.4, 0.4>;
+ #break
+ #end
+#end
+
+
+
+
+#if (playerStanding)
+ frameDefaults()
+ #declare bodyAngle = < 5, 0, 0 >;
+#end
+
--- xblast-tnt-models-20050106.orig/debian/sprites/felix/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/felix/XBlast Robot.inc
@@ -0,0 +1,661 @@
+//
+// XBlast Robot File
+//
+//
+// (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+// changed 2003 by Bernhard R. Link <brlink@debian.org>
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+
+#include "frames.inc"
+
+//
+// froce field and other FX
+//
+#ifndef (activateForceField)
+ #declare activateForceField = 0;
+#end
+#ifndef (forceFieldPhase)
+ #declare forceFieldPhase = 0.0;
+#end
+
+//
+// Damaged Player
+//
+#ifndef (playerDamaged)
+ #declare playerDamaged=0
+#end
+
+//
+// sick player
+//
+#ifndef (playerIsSick)
+ #declare playerIsSick=0;
+#end
+
+//
+// additional colors
+//
+#ifndef (beltColor)
+#declare beltColor = color rgb <0.1,0.1,0.1>;
+#end
+
+//
+// no face (needed helmet for helmet camera)
+//
+#ifndef (noFace)
+#declare noFace = 0;
+#end
+
+#include "XBlastTexture.inc"
+
+//
+// some useful shapes
+//
+#declare helmetSphere =
+superellipsoid {
+ <1, 0.9>
+ rotate x*90
+}
+
+#declare crossEye =
+intersection {
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 1
+ scale <0.2,0.3,1>
+ }
+ union {
+ box {
+ <-0.05,-1,-1>
+ < 0.05, 1, 1>
+ rotate z*37.5
+ }
+ box {
+ <-0.05,-1,-1>
+ < 0.05, 1, 1>
+ rotate z*-37.5
+ }
+ }
+}
+
+//
+// include force field
+//
+#if (activateForceField = 1)
+ #include "XBlast Force Field.inc"
+#end
+
+//
+// the head
+//
+#declare PlayerHead =
+union {
+ // helmet
+// difference {
+ // hull
+ difference {
+ object {
+ helmetSphere
+ scale <1.1,0.85,1.1>
+ }
+ object {
+ helmetSphere
+ scale <1.05,0.80,1.05>
+ }
+ }
+// // cutout for window
+// intersection {
+// cylinder { <0.0,-1.25,0.0>, <0.0,-1.25,-2.0>, 1.75 }
+// cylinder { <0.0, 1.25,0.1>, <0.0, 1.25,-2.1>, 1.75 }
+// plane { x, 0.8 }
+// plane { -x, 0.8 }
+// }
+// }
+ // glass window
+// difference {
+// object {
+// helmetSphere
+// scale <1.083,0.833,1.083>
+// }
+// object {
+// helmetSphere
+// scale <1.067,0.817,1.067>
+// }
+// texture {myGlass}
+// }
+ #if (noFace = 0)
+ //
+ // face
+ //
+// sphere {
+// <0,0,0>, 1
+// scale <1.0,0.75,1.0>
+// texture {faceTexture}
+// }
+ //
+ // eyes
+ //
+ // right eye
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <1.025,0.775,1.025>
+ translate <0,0,-0.1>
+ }
+ #if (playerDamaged)
+ object {
+ crossEye
+ translate <-0.3,0,0>
+ }
+ pigment {color Black}
+ finish {Glossy}
+ #else
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 1
+ scale <0.2,0.3,1>
+ translate <-0.3,0,0>
+ }
+ texture {
+ eyeTexture
+ translate <-0.3,0,0>
+ }
+ #end
+ }
+ // left eye
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <1.025,0.775,1.025>
+ translate <0,0,-0.1>
+ }
+ #if (playerDamaged)
+ object {
+ crossEye
+ translate < 0.3,0,0>
+ }
+ pigment {color Black}
+ finish {Glossy}
+ #else
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 1
+ scale <0.2,0.3,1>
+ translate < 0.3,0.0,0>
+ }
+ texture {
+ eyeTexture
+ translate < 0.3,0,0>
+ }
+ #end
+ }
+ // nose
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <1.025,0.775,1.025>
+ translate <0,0,-0.2>
+ }
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 0.3
+ scale <0.2,0.3,1>
+ translate < 0,-0.2,0>
+ }
+ texture {
+ faceTexture
+ }
+ }
+ #end
+ //
+ // antenna
+ //
+ object {
+ object {
+ difference {
+ sphere {
+ <0.0,0.0>,0.5
+ scale <1.0,2.0,1.0>
+ texture {armsLegsTexture}
+ }
+ sphere {
+ <0.0,0.0>,0.5
+ scale <1.0,2.0,1.0>
+ texture {handsFeetTexture}
+ translate <0,-0.05, -0.1>
+ }
+ translate <0,0.5, 0>
+ }
+ rotate x*-20
+ rotate z*10
+ }
+ translate <-1,0.5,0>
+ }
+ object {
+ difference {
+ sphere {
+ <0.0,0.0>,0.5
+ scale <1.0,2.0,1.0>
+ texture {armsLegsTexture}
+ }
+ sphere {
+ <0.0,0.0>,0.5
+ scale <1.0,2.0,1.0>
+ texture {handsFeetTexture}
+ translate <0,-0.05, -0.1>
+ }
+ translate <0,0.5, 0>
+ }
+ rotate x*-20
+ rotate z*-10
+ translate <1,0.5,0>
+ }
+ texture {helmetTexture}
+ translate <0, 0.2125,-0.275>
+ rotate headAngle
+ translate <0,-0.2125, 0.275>
+}
+
+//
+// the body
+//
+#declare PlayerBody =
+union {
+ // main body
+ sphere {
+ <0,0,0>, 1
+ scale <0.8,0.9,0.6>
+ }
+ // backpack
+ union {
+ superellipsoid {
+ <0.5, 0.5>
+ scale <0.6,0.55,0.3>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.4,0.1,0.1>
+ translate <0.0,0.2,0.25>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.4,0.1,0.1>
+ translate <0.0,0.0,0.25>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.4,0.1,0.1>
+ translate <0.0,-0.2,0.25>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.1,0.35,0.1>
+ translate <0.55,0.0,0.05>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.1,0.35,0.1>
+ translate <-0.55,0.0,0.05>
+ }
+ translate <0,0.0,0.5>
+ texture {backpackTexture}
+ }
+ // bomb emblem
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.825,0.925,0.625>
+ }
+ union {
+ cylinder {
+ <0,0,0>, <0,0,-1>, 0.175
+ }
+ box {
+ <0.00,-0.025,0>
+ <0.35, 0.025,-1>
+ rotate z*45
+ }
+ translate <0.3,0.2,0>
+ }
+ pigment {
+ wood
+ color_map {
+ [0.000 color White]
+ [0.100 color White]
+ [0.101 color Gray10]
+ [1.000 color Gray10]
+ }
+ translate <0.3-0.04,0.2+0.04,0.0>
+ }
+ finish {Shiny}
+ }
+ // belt
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.825,0.925,0.625>
+ }
+ union {
+ box { <-0.20,-0.60,0>, <0.20,-0.30,-1> }
+ intersection {
+ plane { -y, 0.55}
+ plane { y,-0.35}
+ }
+ }
+ pigment {color beltColor}
+ finish {Dull}
+ }
+ // belt lock
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.85,0.95,0.65>
+ }
+ box { <-0.15,-0.55,0>, <0.15,-0.35,-1> }
+ texture {backpackTexture}
+ }
+ texture {bodyTexture}
+}
+
+
+#declare PlayerRightHand =
+union {
+ // main part
+ sphere {
+ <0,0,0>, 1
+ scale <0.2,0.125,0.25>
+ }
+ // thumb
+ sphere {
+ <0,0,0>, 1
+ scale <0.1,0.1,0.25>
+ rotate y*60
+ rotate z*30
+ translate <-0.10,-0.05,-0.15>
+ }
+ // fingers
+ sphere {
+ <0,0,0>, 1
+ scale <0.3,0.125,0.2>
+ translate <-0.20,-0.025,0.05>
+ rotate z*30
+ }
+ // additional objects
+ #ifdef (rightHandObject)
+ object {rightHandObject translate <-0.20,-0.225,0.05>}
+ #end
+ texture {handsFeetTexture}
+ rotate z*-15
+}
+
+#declare PlayerRightLowerArm =
+union {
+ object {
+ PlayerRightHand
+ translate <-0.525,0,0>
+ }
+ sphere {
+ <-0.4,0,0>, 0.225
+ }
+ cone {
+ <-0.024609375, 0, 0>, 0.261343889659
+ <-0.421093750, 0, 0>, 0.2240090482792
+ }
+}
+
+#declare PlayerRightUpperArm =
+union {
+ object {
+ PlayerRightLowerArm
+ rotate rightLowerArmAngle
+ translate x*-0.4
+ }
+ union {
+ sphere {
+ <0,0,0>, 0.3
+ }
+ cone {
+ <-0.028125000, 0, 0>, 0.2986787310389
+ <-0.424609375, 0, 0>, 0.261343889659
+ }
+ sphere {
+ <-0.4,0,0>, 0.2625
+ }
+ }
+}
+
+#declare PlayerRightArm =
+union {
+ object {
+ PlayerRightUpperArm
+ rotate rightArmAngle
+ }
+ intersection {
+ plane { -x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }
+ texture {armsLegsTexture}
+}
+
+//
+// Left arm of player, includings hands
+//
+
+#declare PlayerLeftHand =
+union {
+ sphere {
+ <0,0,0>, 1
+ scale <0.2,0.125,0.25>
+ }
+ // thumb
+ sphere {
+ <0,0,0>, 1
+ scale <0.1,0.1,0.25>
+ rotate y*-60
+ rotate z*-30
+ translate <0.10,-0.05,-0.15>
+ }
+ sphere {
+ <0,0,0>, 1
+ scale <0.3,0.125,0.2>
+ translate <0.20,-0.025,0.05>
+ rotate z*-30
+ }
+ // additional objects
+ #ifdef (leftHandObject)
+ object {leftHandObject translate < 0.20,-0.225,0.05>}
+ #end
+ texture {handsFeetTexture}
+ rotate z*15
+}
+
+#declare PlayerLeftLowerArm =
+union {
+ object {
+ PlayerLeftHand
+ translate <0.525,0,0>
+ }
+ sphere {
+ <0.4,0,0>, 0.225
+ }
+ cone {
+ <0.024609375, 0, 0>, 0.261343889659
+ <0.421093750, 0, 0>, 0.2240090482792
+ }
+}
+
+#declare PlayerLeftUpperArm =
+union {
+ object {
+ PlayerLeftLowerArm
+ rotate leftLowerArmAngle
+ translate x*0.4
+ }
+ union {
+ sphere {
+ <0,0,0>, 0.3
+ }
+ cone {
+ <0.028125000, 0, 0>, 0.2986787310389
+ <0.424609375, 0, 0>, 0.261343889659
+ }
+ sphere {
+ <0.4,0,0>, 0.2625
+ }
+ }
+}
+
+#declare PlayerLeftArm =
+union {
+ object {
+ PlayerLeftUpperArm
+ rotate leftArmAngle
+ }
+ intersection {
+ plane { x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }
+ texture {armsLegsTexture}
+}
+
+//
+// legs
+//
+
+#declare PlayerFoot =
+union {
+ intersection {
+ sphere { <0,0,0>, 1 }
+ plane { -y, 0 }
+ scale <0.4,0.3,0.5>
+ }
+ intersection {
+ sphere { <0,0,0>, 1 }
+ plane { y, 0 }
+ scale <0.4,0.1,0.5>
+ }
+ texture {handsFeetTexture}
+}
+
+#declare PlayerLowerRightLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate rightFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerUpperRightLeg =
+union {
+ object {
+ PlayerLowerRightLeg
+ rotate rightLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, 0.3
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerRightLeg =
+object {
+ PlayerUpperRightLeg
+ rotate rightLegAngle
+ texture {armsLegsTexture}
+}
+
+
+
+#declare PlayerLowerLeftLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate leftFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerUpperLeftLeg =
+union {
+ object {
+ PlayerLowerLeftLeg
+ rotate leftLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, 0.3
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerLeftLeg =
+object {
+ PlayerUpperLeftLeg
+ rotate leftLegAngle
+ texture {armsLegsTexture}
+}
+
+#declare Player =
+union {
+ object {PlayerHead translate < 0.00, 3.25, 0.00> }
+ object {PlayerBody translate < 0.00, 1.70, 0.00> }
+ object {PlayerLeftArm translate < 0.6, 1.9, 0.00> }
+ object {PlayerRightArm translate <-0.6, 1.9, 0.00> }
+ object {PlayerRightLeg translate <-0.30, 1.20, 0.00> }
+ object {PlayerLeftLeg translate < 0.30, 1.20, 0.00> }
+#if (activateForceField = 1)
+ object {ForceField}
+#end
+ translate <0.0, -1.20, 0.0>
+ rotate bodyAngle
+ translate <0.0, 1.20, 0.0>
+ translate y*playerWalkHeight
+ rotate playerAngle
+ translate playerLocation
+ scale 0.75
+ translate <0,0,-1>
+}
+
+object {Player}
+
+//
+// end file "XBlast Robot.inc"//
--- xblast-tnt-models-20050106.orig/debian/sprites/normal/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/normal/XBlast Robot.inc
@@ -0,0 +1,609 @@
+//
+// XBlast Robot File
+//
+//
+// Program XBLAST V2.6 or higher
+// (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+// some changes by other people, see AUTHORS file...
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+
+#include "frames.inc"
+
+//
+// froce field and other FX
+//
+#ifndef (activateForceField)
+ #declare activateForceField = 0;
+#end
+#ifndef (forceFieldPhase)
+ #declare forceFieldPhase = 0.0;
+#end
+
+//
+// sick player
+//
+#ifndef (playerIsSick)
+ #declare playerIsSick=0;
+#end
+
+//
+// additional colors
+//
+#ifndef (beltColor)
+#declare beltColor = color rgb <0.1,0.1,0.1>;
+#end
+
+//
+// no face (needed helmet for helmet camera)
+//
+#ifndef (noFace)
+#declare noFace = 0;
+#end
+
+#include "XBlastTexture.inc"
+
+//
+// some useful shapes
+//
+#declare helmetSphere =
+superellipsoid {
+ <1, 0.9>
+ rotate x*90
+}
+
+#declare crossEye =
+intersection {
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 1
+ scale <0.2,0.3,1>
+ }
+ union {
+ box {
+ <-0.05,-1,-1>
+ < 0.05, 1, 1>
+ rotate z*37.5
+ }
+ box {
+ <-0.05,-1,-1>
+ < 0.05, 1, 1>
+ rotate z*-37.5
+ }
+ }
+}
+
+//
+// include force field
+//
+#if (activateForceField = 1)
+ #include "XBlast Force Field.inc"
+#end
+
+//
+// the head
+//
+#declare PlayerHead =
+union {
+ // helmet
+ difference {
+ // hull
+ difference {
+ object {
+ helmetSphere
+ scale <1.1,0.85,1.1>
+ }
+ object {
+ helmetSphere
+ scale <1.05,0.80,1.05>
+ }
+ }
+ // cutout for window
+ intersection {
+ cylinder { <0.0,-1.25,0.0>, <0.0,-1.25,-2.0>, 1.75 }
+ cylinder { <0.0, 1.25,0.1>, <0.0, 1.25,-2.1>, 1.75 }
+ plane { x, 0.8 }
+ plane { -x, 0.8 }
+ }
+ }
+ // glass window
+ difference {
+ object {
+ helmetSphere
+ scale <1.083,0.833,1.083>
+ }
+ object {
+ helmetSphere
+ scale <1.067,0.817,1.067>
+ }
+ texture {myGlass}
+ interior {ior 1.5}
+ }
+ #if (noFace = 0)
+ //
+ // face
+ //
+ sphere {
+ <0,0,0>, 1
+ scale <1.0,0.75,1.0>
+ texture {faceTexture}
+ }
+ //
+ // eyes
+ //
+ // right eye
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <1.025,0.775,1.025>
+ }
+ #if (playerDamaged)
+ object {
+ crossEye
+ translate <-0.3,0,0>
+ }
+ pigment {color Black}
+ finish {Glossy}
+ #else
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 1
+ scale <0.2,0.3,1>
+ translate <-0.3,0,0>
+ }
+ texture {
+ eyeTexture
+ translate <-0.3,0,0>
+ }
+ #end
+ }
+ // left eye
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <1.025,0.775,1.025>
+ }
+ #if (playerDamaged)
+ object {
+ crossEye
+ translate < 0.3,0,0>
+ }
+ pigment {color Black}
+ finish {Glossy}
+ #else
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 1
+ scale <0.2,0.3,1>
+ translate < 0.3,0,0>
+ }
+ texture {
+ eyeTexture
+ translate < 0.3,0,0>
+ }
+ #end
+ }
+ #end
+ //
+ // antenna
+ //
+ union {
+ cylinder {
+ <0,0,0>, <0,1.2,0>, 0.1
+ texture {armsLegsTexture}
+ }
+ sphere {
+ <0,1.2,0>, 0.2
+ texture {handsFeetTexture}
+ }
+ rotate x*45
+ }
+ texture {helmetTexture}
+ translate <0, 0.2125,-0.275>
+ rotate headAngle
+ translate <0,-0.2125, 0.275>
+}
+
+//
+// the body
+//
+#declare PlayerBody =
+union {
+ // main body
+ sphere {
+ <0,0,0>, 1
+ scale <0.8,0.9,0.6>
+ }
+ // backpack
+ union {
+ superellipsoid {
+ <0.5, 0.5>
+ scale <0.6,0.55,0.3>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.4,0.1,0.1>
+ translate <0.0,0.2,0.25>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.4,0.1,0.1>
+ translate <0.0,0.0,0.25>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.4,0.1,0.1>
+ translate <0.0,-0.2,0.25>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.1,0.35,0.1>
+ translate <0.55,0.0,0.05>
+ }
+ superellipsoid {
+ <0.75, 0.75>
+ scale <0.1,0.35,0.1>
+ translate <-0.55,0.0,0.05>
+ }
+ translate <0,0.0,0.5>
+ texture {backpackTexture}
+ }
+ // bomb emblem
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.825,0.925,0.625>
+ }
+ union {
+ cylinder {
+ <0,0,0>, <0,0,-1>, 0.175
+ }
+ box {
+ <0.00,-0.025,0>
+ <0.35, 0.025,-1>
+ rotate z*45
+ }
+ translate <0.3,0.2,0>
+ }
+ pigment {
+ wood
+ color_map {
+ [0.000 color White]
+ [0.100 color White]
+ [0.101 color Gray10]
+ [1.000 color Gray10]
+ }
+ translate <0.3-0.04,0.2+0.04,0.0>
+ }
+ finish {Shiny}
+ }
+ // belt
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.825,0.925,0.625>
+ }
+ union {
+ box { <-0.20,-0.60,0>, <0.20,-0.30,-1> }
+ intersection {
+ plane { -y, 0.55}
+ plane { y,-0.35}
+ }
+ }
+ pigment {color beltColor}
+ finish {Dull}
+ }
+ // belt lock
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.85,0.95,0.65>
+ }
+ box { <-0.15,-0.55,0>, <0.15,-0.35,-1> }
+ texture {backpackTexture}
+ }
+ texture {bodyTexture}
+}
+
+
+#declare PlayerRightHand =
+union {
+ // main part
+ sphere {
+ <0,0,0>, 1
+ scale <0.2,0.125,0.25>
+ }
+ // thumb
+ sphere {
+ <0,0,0>, 1
+ scale <0.1,0.1,0.25>
+ rotate y*60
+ rotate z*30
+ translate <-0.10,-0.05,-0.15>
+ }
+ // fingers
+ sphere {
+ <0,0,0>, 1
+ scale <0.3,0.125,0.2>
+ translate <-0.20,-0.025,0.05>
+ rotate z*30
+ }
+ // additional objects
+ #ifdef (rightHandObject)
+ object {rightHandObject translate <-0.20,-0.225,0.05>}
+ #end
+ texture {handsFeetTexture}
+ rotate z*-15
+}
+
+#declare PlayerRightLowerArm =
+union {
+ object {
+ PlayerRightHand
+ translate <-0.525,0,0>
+ }
+ sphere {
+ <-0.4,0,0>, 0.225
+ }
+ cone {
+ <-0.024609375, 0, 0>, 0.261343889659
+ <-0.421093750, 0, 0>, 0.2240090482792
+ }
+}
+
+#declare PlayerRightUpperArm =
+union {
+ object {
+ PlayerRightLowerArm
+ rotate rightLowerArmAngle
+ translate x*-0.4
+ }
+ union {
+ sphere {
+ <0,0,0>, 0.3
+ }
+ cone {
+ <-0.028125000, 0, 0>, 0.2986787310389
+ <-0.424609375, 0, 0>, 0.261343889659
+ }
+ sphere {
+ <-0.4,0,0>, 0.2625
+ }
+ }
+}
+
+#declare PlayerRightArm =
+union {
+ object {
+ PlayerRightUpperArm
+ rotate rightArmAngle
+ }
+ intersection {
+ plane { -x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }
+ texture {armsLegsTexture}
+}
+
+//
+// Left arm of player, includings hands
+//
+
+#declare PlayerLeftHand =
+union {
+ sphere {
+ <0,0,0>, 1
+ scale <0.2,0.125,0.25>
+ }
+ // thumb
+ sphere {
+ <0,0,0>, 1
+ scale <0.1,0.1,0.25>
+ rotate y*-60
+ rotate z*-30
+ translate <0.10,-0.05,-0.15>
+ }
+ sphere {
+ <0,0,0>, 1
+ scale <0.3,0.125,0.2>
+ translate <0.20,-0.025,0.05>
+ rotate z*-30
+ }
+ // additional objects
+ #ifdef (leftHandObject)
+ object {leftHandObject translate < 0.20,-0.225,0.05>}
+ #end
+ texture {handsFeetTexture}
+ rotate z*15
+}
+
+#declare PlayerLeftLowerArm =
+union {
+ object {
+ PlayerLeftHand
+ translate <0.525,0,0>
+ }
+ sphere {
+ <0.4,0,0>, 0.225
+ }
+ cone {
+ <0.024609375, 0, 0>, 0.261343889659
+ <0.421093750, 0, 0>, 0.2240090482792
+ }
+}
+
+#declare PlayerLeftUpperArm =
+union {
+ object {
+ PlayerLeftLowerArm
+ rotate leftLowerArmAngle
+ translate x*0.4
+ }
+ union {
+ sphere {
+ <0,0,0>, 0.3
+ }
+ cone {
+ <0.028125000, 0, 0>, 0.2986787310389
+ <0.424609375, 0, 0>, 0.261343889659
+ }
+ sphere {
+ <0.4,0,0>, 0.2625
+ }
+ }
+}
+
+#declare PlayerLeftArm =
+union {
+ object {
+ PlayerLeftUpperArm
+ rotate leftArmAngle
+ }
+ intersection {
+ plane { x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }
+ texture {armsLegsTexture}
+}
+
+//
+// legs
+//
+
+#declare PlayerFoot =
+union {
+ intersection {
+ sphere { <0,0,0>, 1 }
+ plane { -y, 0 }
+ scale <0.4,0.3,0.5>
+ }
+ intersection {
+ sphere { <0,0,0>, 1 }
+ plane { y, 0 }
+ scale <0.4,0.1,0.5>
+ }
+ texture {handsFeetTexture}
+}
+
+#declare PlayerLowerRightLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate rightFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerUpperRightLeg =
+union {
+ object {
+ PlayerLowerRightLeg
+ rotate rightLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, 0.3
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerRightLeg =
+object {
+ PlayerUpperRightLeg
+ rotate rightLegAngle
+ texture {armsLegsTexture}
+}
+
+
+
+#declare PlayerLowerLeftLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate leftFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerUpperLeftLeg =
+union {
+ object {
+ PlayerLowerLeftLeg
+ rotate leftLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, 0.3
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerLeftLeg =
+object {
+ PlayerUpperLeftLeg
+ rotate leftLegAngle
+ texture {armsLegsTexture}
+}
+
+
+#declare Player =
+union {
+ object {PlayerHead translate < 0.00, 3.25, 0.00> }
+ object {PlayerBody translate < 0.00, 1.70, 0.00> }
+ object {PlayerLeftArm translate < 0.6, 1.9, 0.00> }
+ object {PlayerRightArm translate <-0.6, 1.9, 0.00> }
+ object {PlayerRightLeg translate <-0.30, 1.20, 0.00> }
+ object {PlayerLeftLeg translate < 0.30, 1.20, 0.00> }
+#if (activateForceField = 1)
+ object {ForceField}
+#end
+ translate <0.0, -1.20, 0.0>
+ rotate bodyAngle
+ translate <0.0, 1.20, 0.0>
+ translate y*playerWalkHeight
+ rotate playerAngle
+ translate playerLocation
+}
+
+object {Player}
+
+
+//
+// end file "XBlast Robot.inc"//
--- xblast-tnt-models-20050106.orig/debian/sprites/golem/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/golem/XBlast Robot.inc
@@ -0,0 +1,114 @@
+/*
+ XBlast Robot File
+
+ (C) by Mark Weyer
+*/
+
+#local neck_length = 0.6;
+#local head_rad = 0.3;
+#local eye_y = 3/4;
+#local eye_ang = 30;
+#local eye_rad = head_rad/4;
+
+#include "humanoid_frames.inc"
+
+Erase_humanoid_input_constants()
+
+#declare leg_length = 1.7;
+#declare leg_half_length = 0.9;
+#declare default_rad = 0.2;
+#declare back_length = 1.5;
+#declare arm_length = 1.5;
+#declare arm_half_length = 0.8;
+#declare leg_sep = 0.3;
+#declare arm_sep = 0.3;
+
+#declare killed_leg_ang = 45;
+#declare killed_back_ang = 10;
+#declare killed_nod_ang = 45;
+#declare losing_back_ang = 10;
+#declare losing_shake_ang = 60;
+#declare winning_jump_height = 0.6;
+#declare walking_back_ang = 10;
+#declare walking_arm_ang = 30;
+
+#declare left_eye_pos =
+ vrotate(<0,neck_length+head_rad*(2*eye_y-1),-head_rad>,-30*y);
+#declare left_eye_normal = vrotate(-z,-eye_ang*y);
+
+Define_humanoid_output_constants()
+
+#declare rst=seed(3);
+
+#macro limb(Width1,Width2,Height,Depth,Offset,tr,C)
+ #local Length = 0.4;
+ #local Thick = 0.2;
+
+ #local i=0;
+ #while (i<(Width1+Width2)*Height*Depth*300)
+ #local p1=<(2*rand(rst)-1)*Width2,
+ rand(rst)*Height+Offset,
+ (2*rand(rst)-1)*Depth>;
+ #local p2=p1+Length*(2*<rand(rst),rand(rst),rand(rst)>-1);
+ #local Y1=(p1.y-Offset)/Height;
+ #local Y2=(p2.y-Offset)/Height;
+ #local Width_p1 = Width1*(1-Y1)+Width2*Y1;
+ #local Width_p2 = Width1*(1-Y2)+Width2*Y2;
+ #local r1=sqrt(pow(p1.x/Width_p1,2)+pow(p1.z/Depth,2));
+ #local r2=sqrt(pow(p2.x/Width_p2,2)+pow(p2.z/Depth,2));
+ #if ((r1<1) & (r2<1) &
+ (0<Y2) & (Y2<1) &
+ (vlength(p1-p2)<Length))
+
+ cylinder {p1 p2 Thick 1 pigment {rgb <C.x,C.y,C.z>} transform tr}
+
+ #local i=i+1;
+ #end
+ #end
+#end
+
+#macro limb1(Height,tr,C)
+ limb(default_rad,default_rad,Height,default_rad,-Height,tr,C)
+#end
+
+#local left_eye_trans =
+ transform {
+ rotate -90*x
+ rotate -eye_ang*y
+ translate (neck_length+head_rad*(2*eye_y-1))*y
+ head_trans
+ }
+#local right_eye_trans =
+ transform {
+ rotate -90*x
+ rotate eye_ang*y
+ translate (neck_length+head_rad*(2*eye_y-1))*y
+ head_trans
+ }
+
+blob {
+ limb1(lower_leg_length,left_lower_leg_trans,handsFeetColor)
+ limb1(lower_leg_length,right_lower_leg_trans,handsFeetColor)
+ limb1(upper_leg_length,left_upper_leg_trans,armsLegsColor)
+ limb1(upper_leg_length,right_upper_leg_trans,armsLegsColor)
+ limb(hip_width/2,shoulder_width/2,back_length,2*default_rad,-back_length,
+ back_trans,bodyColor)
+ limb(default_rad,default_rad,neck_length,default_rad,0,head_trans,bodyColor)
+ limb(head_rad,head_rad,2*head_rad,head_rad,neck_length-head_rad,
+ head_trans,faceColor)
+ limb(eye_rad,eye_rad,2*eye_rad,eye_rad,head_rad-eye_rad*2/3,
+ left_eye_trans,helmetColor)
+ limb(eye_rad,eye_rad,2*eye_rad,eye_rad,head_rad-eye_rad*2/3,
+ right_eye_trans,helmetColor)
+ limb1(upper_arm_length,left_upper_arm_trans,armsLegsColor)
+ limb1(lower_arm_length,left_lower_arm_trans,handsFeetColor)
+ limb1(upper_arm_length,right_upper_arm_trans,armsLegsColor)
+ limb1(lower_arm_length,right_lower_arm_trans,handsFeetColor)
+
+ threshold 0.2
+ pigment {rgb 1}
+ rotate playerAngle*y
+ translate playerLocation
+ translate -2*z
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/insect/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/insect/XBlast Robot.inc
@@ -0,0 +1,469 @@
+/*
+ XBlast Robot File
+
+ (C) by Mark Weyer
+*/
+
+
+
+/*
+ Parameters
+ ==========
+
+ Copied from the official parameters
+ -----------------------------------
+
+ Eye_colour - colour of light in eyes and rear
+ Chitin_texture - used for head and rear
+ Hair_texture_x with x in {lr,Lr,lR,LR}
+ - used for the torso (which consists of hairs only)
+ change in case of l indicates change of ring
+ (or shift in direction of _l_ength)
+ change in case of r indicates change of spiral
+ (or shift in direction of _r_ing)
+
+ Determined via frames
+ ---------------------
+
+ Torso_wave (on/off) - on: Torso is shaped like a wave
+ off: Torso is shaped bent
+ Torso_phase (0-2) - Torso_wave = on:
+ the wave shape and hair pattern shift with this phase
+ Torso_bend_deg (0.1-179.9)
+ - Torso_wave = off:
+ the angle that the torso describes
+ Eye_sharpness (0-4) - 0 gives completely blunt eyes
+ (constant media density)
+ positive value give eyes which are brighter
+ in the middle. The value is the exponent of density
+ increase with proximity to the center.
+ Hair_wind_bend_deg (0.1-179.9)
+ - the angle that hairs are bent
+
+ Calculated from the above
+ -------------------------
+
+ Neck_ang_deg (0-90) - the angle the head is bowed.
+ 180-(angle between neck and nose)
+ Rear_bend_deg (0.1-179.9)
+ - the angle that the rear is bent
+ Antenna_bend_deg (0.1-179.9)
+ - determines the angle that the antennae are bent
+ Torso_y, Torso_z - curve torso describes (parameterized from 0 to 1)
+ Torso_dy, Torso_dy - derivative of Torso_y, Torso_z
+*/
+
+#local outer_version = version;
+#version 3.5;
+
+//
+// Colours and textures
+//
+
+#macro Colour_2_Texture(C)
+ texture {pigment {color C} finish {specular 0.5 ambient 0.2}}
+#end
+
+#local Eye_colour = faceColor;
+#local Chitin_texture = Colour_2_Texture(helmetColor)
+#local Hair_texture_lr = Colour_2_Texture(bodyColor)
+#local Hair_texture_Lr = Colour_2_Texture(backpackColor)
+#local Hair_texture_lR = Colour_2_Texture(armsLegsColor)
+#local Hair_texture_LR = Colour_2_Texture(handsFeetColor)
+
+
+//
+// frame initialization
+//
+
+#local Torso_phase = 0;
+#local Torso_bend_deg = 1;
+
+#if (playerWinning)
+ #local Torso_wave = off;
+ #local Torso_bend_deg = 30+playerWinningTime*30;
+ #local Eye_sharpness = (12-playerWinningTime*4)/3;
+ #local Hair_wind_bend_deg = 15+playerWinningTime*30;
+#end
+
+#if (playerLosing)
+ #local Torso_wave = off;
+ #local Torso_bend_deg = 90+playerLosingTime*30;
+ #local Eye_sharpness = (4-playerLosingTime*4)/3;
+ #local Hair_wind_bend_deg = 90+playerLosingTime*60;
+#end
+
+#if (playerKilled)
+ #local Torso_wave = off;
+ #local Torso_bend_deg = 179;
+ #local Eye_sharpness = 0;
+ #local Hair_wind_bend_deg = 10;
+#end
+
+#if (playerWalking)
+ #local Torso_wave = on;
+ #local Torso_phase = playerWalkingTime*2;
+ #local Eye_sharpness = 3;
+ #local Hair_wind_bend_deg = 90;
+#end
+
+#if (playerStanding)
+ #local Torso_wave = off;
+ #local Torso_bend_deg = 60;
+ #local Eye_sharpness = 2;
+ #local Hair_wind_bend_deg = 60;
+#end
+
+
+//
+// internal constants
+//
+
+#local Torso_length = 2;
+#local Torso_bend_center_T = 1/2;
+#local Torso_bend_rad1 = Torso_bend_deg*pi/180; // radians
+#local Torso_bend_rad2 = Torso_length/Torso_bend_rad1; // radius
+#local Torso_bend_center_deg = 60;
+#local Torso_bend_center_rad = Torso_bend_center_deg*pi/180;
+#local Torso_w_min = 1/12;
+#local Torso_w_max = 1/2;
+#local Torso_w = function(T)
+ {(sin((T)*pi)*(Torso_w_max-Torso_w_min)+Torso_w_min)}
+#local Torso_dw = function(T) {(cos((T)*pi)*pi*(Torso_w_max-Torso_w_min))}
+#local Torso_wave_amp = 1/3;
+#if (Torso_wave)
+ #local Neck_ang_deg = 30;
+ #local Rear_bend_deg = 30;
+ #local Antenna_bend_deg = 120;
+ #local Eye_sharpness = 3;
+ #local Torso_y = function(T) {(sin(((T)-Torso_phase)*pi)*Torso_wave_amp+2)}
+ #local Torso_z = function(T) {(Torso_length*((T)-1/2)+1/3)}
+ #local Torso_dy = function(T) {(cos(((T)-Torso_phase)*pi)*pi*Torso_wave_amp)}
+ #local Torso_dz = function(T) {(Torso_length)}
+#else
+ #local Neck_ang_deg = Torso_bend_deg/2;
+ #local Rear_bend_deg = Torso_bend_deg/2;
+ #local Antenna_bend_deg = Torso_bend_deg;
+ #local Eye_sharpness = 2;
+ #local Torso_y = function(T)
+ {((cos(((T)-Torso_bend_center_T)*Torso_bend_rad1+Torso_bend_center_rad)
+ -cos(Torso_bend_center_rad))
+ *Torso_bend_rad2+2)}
+ #local Torso_z = function(T)
+ {((sin(((T)-Torso_bend_center_T)*Torso_bend_rad1+Torso_bend_center_rad)
+ -sin(Torso_bend_center_rad))
+ *Torso_bend_rad2+1/3)}
+ #local Torso_dy = function(T)
+ {(-sin(((T)-Torso_bend_center_T)*Torso_bend_rad1+Torso_bend_center_rad)
+ *Torso_bend_rad2*Torso_bend_rad1)}
+ #local Torso_dz = function(T)
+ {(cos(((T)-Torso_bend_center_T)*Torso_bend_rad1+Torso_bend_center_rad)
+ *Torso_bend_rad2*Torso_bend_rad1)}
+#end
+
+
+#local atanf=function(b,a) // b=sin, a=cos
+ {(select((b),
+ select((a),
+ select((a)-(b),
+ atan2(-(b),-(a))-pi,
+ -pi/2-atan2(-(a),-(b))),
+ select((a)+(b),
+ atan2((a),-(b))-pi/2,
+ -atan2(-(b),(a)))),
+ select((a),
+ select((a)+(b),
+ pi-atan2((b),-(a)),
+ pi/2+atan2(-(a),(b))),
+ select((a)-(b),
+ pi/2-atan2((a),(b)),
+ atan2((b),(a)))
+ )))}
+
+
+
+#local pre_mix = function(x) {select(x,0,0,exp(-1/x))}
+#local mix = function(x1,x2,y1,y2,x)
+ {(y2*pre_mix((x-x1)/(x2-x1))+y1*pre_mix((x2-x)/(x2-x1))) /
+ (pre_mix((x-x1)/(x2-x1))+pre_mix((x2-x)/(x2-x1)))}
+#local End = function(z1,z2,z)
+ {mix(z1,z2,pow((z-z2)/(z2-z1),2),0,z)}
+#local outer =
+ function(zs1,zs2,zv1,zv2,zh1,zh2,ze1,ze2,w1,h1,y1,w2,h2,y2,x,y,z)
+ {End(zs1,zs2,z)+
+ End(-ze2,-ze1,-z)+
+ pow(x/mix(zh1,zh2,w1,w2,z),4)+
+ pow((y-mix(zv1,zv2,y1,y2,z))/mix(zv1,zv2,h1,h2,z),4)
+ }
+#local round_bar = function(Angle,r1,r2,x,y,z)
+ {pow(x/r2,2)+
+ pow((sqrt(pow(y,2)+pow(z,2))-r1)/r2,2)+
+ pow(mix(-r2,0,pow(y/r2,2),(atanf(y,z))/Angle,y),2)}
+
+#local mix_eps_main = 0.5;
+#local mix_eps_eyes = 0.5;
+#local mix_eps_neck = 0.5;
+#local mix_eps_antenna = 0.5;
+
+#local Head_length = 3;
+#local Head_width = 3;
+#local Head_height = 3;
+#local Head_scale = 1/4;
+
+#local Eye_x = Head_width*0.4;
+#local Eye_y = Head_height/3;
+#local Eye_z = -Head_length/4;
+#local Eye_rad = Head_width/4;
+#local Eye_ball_depth = Eye_rad/3;
+#local Eye_ball_rad = Eye_rad*2/3;
+#local Eye_brightness = 1/3;
+#local Eye_greyness = 1/20;
+#if (playerKilled)
+ #local Eye_greyed_colour = 0;
+#else
+ #local Eye_greyed_colour = Eye_colour*(1-Eye_greyness)+<1,1,1>*Eye_greyness;
+#end
+#local Eye_fac =
+ (Eye_sharpness+1)*(Eye_sharpness+2)*(Eye_sharpness+3)/
+ (Eye_ball_rad*Head_scale);
+#local Eye_density = function(x,y,z)
+ {pow(1-sqrt(pow(x,2)+pow(y,2)+pow(z,2)),Eye_sharpness)}
+#local Eye_samples = 3+int(pow(10,Eye_sharpness));
+
+#local eye =
+ sphere {
+ 0 1
+ hollow
+ texture {pigment {transmit 1}}
+ interior {
+ media {
+ emission Eye_greyed_colour*Eye_brightness*Eye_fac
+ density {function {Eye_density(x,y,z)}}
+ intervals 1
+ method 3
+ samples Eye_samples,Eye_samples
+ }
+ }
+ scale Eye_ball_rad
+ translate <Eye_x,Eye_y,Eye_z>+<-1,-1,1>*Eye_ball_depth/sqrt(3)
+ }
+
+#local Nose_length = 3.5;
+#local Nose_tip_length = 1/4;
+#local Nose_width = 1/3;
+#local Nose_height = 1/3;
+
+#local Neck_length = 3;
+#local Neck_hlen = Neck_length/2;
+#local Neck_rad = Head_width/6;
+#local Neck_ang_rad = Neck_ang_deg*pi/180;
+
+#local Antenna_length = 4;
+#local Antenna_rad = 1/8;
+#local Antenna_z = Head_length/4;
+#local Antenna_x = Head_width/4;
+#local Antenna_bend_rad = Antenna_bend_deg*pi/180;
+#local Antenna_aux = Antenna_length/Antenna_bend_rad;
+
+#local head =
+ union {
+ isosurface {
+ function {1/2
+ -mix(1-mix_eps_main,1+mix_eps_main,1,0,outer(
+ -Nose_length,-Nose_length+Nose_tip_length,
+ -Head_length,0,
+ -Head_length/2,0,
+ 0,Head_length/2,
+ Nose_width/2,Nose_height/2,(Head_height-Nose_height)/2,
+ Head_width/2,Head_height/2,0,
+ x,y,z))
+ -mix(1-mix_eps_neck,1+mix_eps_neck,1,0,
+ pow(x/Neck_rad,2)+
+ pow((y*cos(Neck_ang_rad)+z*sin(Neck_ang_rad))/Neck_rad,2)+
+ pow((z*cos(Neck_ang_rad)-y*sin(Neck_ang_rad)-Neck_hlen)/Neck_hlen,2))
+ -mix(1-mix_eps_antenna,1+mix_eps_antenna,1,0,
+ round_bar
+ (Antenna_bend_rad,Antenna_aux,Antenna_rad,
+ abs(x)-Antenna_x,y-Head_height/2,z-Antenna_z+Antenna_aux))
+ +mix(1-mix_eps_eyes,1+mix_eps_eyes,1,0,
+ pow((abs(x)-Eye_x)/Eye_rad,2)+
+ pow((y-Eye_y)/Eye_rad,2)+pow((z-Eye_z)/Eye_rad,2))}
+ threshold 0
+ contained_by {box {
+ <-Head_width/2,-Neck_length,-Nose_length>-1/2
+ <Head_width/2,Head_height/2+Antenna_length,Neck_length>+1/2}}
+ max_gradient 100
+ texture {Chitin_texture}
+ }
+ object {eye}
+ object {eye scale <-1,1,1>}
+ rotate -Neck_ang_deg*x
+ translate -Neck_hlen*z
+ scale Head_scale
+ }
+
+#local Hair_wind_bend_rad = Hair_wind_bend_deg*pi/180;
+#local Hair_num_segments = 2;
+#local Hair_length = 4;
+#local Hair_aux1 = Hair_length/Hair_wind_bend_rad;
+#local Hair_rad = 1/10;
+#local Hair_root_rad = 1.5;
+#local Hair_scale = 1/16;
+
+#local hair =
+ sphere_sweep {
+ b_spline
+ Hair_num_segments+4
+ <0,-2,0> 1
+ <0,-1,0> 1
+ #local i=0;
+ #while (i<=Hair_num_segments+1)
+ #local Angle=Hair_wind_bend_rad*i/Hair_num_segments;
+ <0,Hair_aux1*sin(Angle),Hair_aux1*(1-cos(Angle))>
+ #if (i<Hair_num_segments)
+ Hair_rad
+ #else
+ 0
+ #end
+ #local i=i+1;
+ #end
+ translate y
+ scale Hair_scale
+ }
+
+#local Torso_jitter = 1;
+#local Hair_max_dist = 2*Hair_root_rad*Hair_scale/sqrt(2)/(1+Torso_jitter);
+#local Torso_num_hairs_len = ceil(Torso_length*1.3/Hair_max_dist);
+#local Torso_stream = seed(1);
+#local Torso_l_stripes = 4;
+#local Torso_r_stripes = 6;
+#local Torso_spiral_steepness = 1/Torso_l_stripes;
+
+#local torso = union {
+ #local i=0;
+ #while (i<Torso_num_hairs_len)
+ #local j=0;
+ #local T0=(i+1/2)/Torso_num_hairs_len;
+ #local Torso_num_hairs_circ = ceil(2*pi*(Torso_w(T0))/Hair_max_dist);
+ #while (j<Torso_num_hairs_circ)
+ #local T=(i+1/2+(rand(Torso_stream)-1/2)*Torso_jitter)
+ /Torso_num_hairs_len;
+ #local U=(j+1/2+(rand(Torso_stream)-1/2)*Torso_jitter)
+ /Torso_num_hairs_circ;
+ // mod does not work properly with
+ // negative numbers. Hence 100+
+ #local TT = mod(100+floor(T*Torso_l_stripes-Torso_phase),2);
+ #local UU = mod(100+
+ floor((U+T*Torso_spiral_steepness)*Torso_r_stripes-Torso_phase),2);
+ object {
+ hair
+ #if (TT)
+ #if (UU)
+ texture{Hair_texture_LR}
+ #else
+ texture{Hair_texture_Lr}
+ #end
+ #else
+ #if (UU)
+ texture{Hair_texture_lR}
+ #else
+ texture{Hair_texture_lr}
+ #end
+ #end
+ #local dy=Torso_dy(T);
+ #local dz=Torso_dz(T);
+ #local dw=Torso_dw(T);
+ rotate -atanf(dw,dz)*180/pi*x // not quite exact,
+ // feel free to correct
+ translate Torso_w(T)*y
+ rotate U*360*z
+ rotate -atanf(dy,dz)*180/pi*x
+ translate <0,Torso_y(T),Torso_z(T)>
+ }
+ #local j=j+1;
+ #end
+ #local i=i+1;
+ #end
+}
+
+
+#local mix_eps_rear = 0.5;
+#local mix_tail_outer = 0.5;
+#local mix_tail_inner = 0.5;
+
+#local Rear_bend_rad = Rear_bend_deg*pi/180;
+#local Rear_length = 1;
+#local Rear_aux = Rear_length/Rear_bend_rad;
+#local Rear_rad = 1/2;
+
+#local Tail_outer_length = 2;
+#local Tail_outer_rad = 1.5;
+#local Tail_thickness = 0.5;
+#local Tail_inner_pos = 0.5;
+#local Tail_inner_length = Tail_outer_length+Tail_inner_pos-Tail_thickness;
+#local Tail_inner_rad = Tail_outer_rad-Tail_thickness;
+#local Tail_scale = 1/6;
+
+#local tail =
+ light_group {
+ light_source {(Tail_thickness+1e-4)*z Eye_greyed_colour}
+ isosurface {
+ function {1/2
+ -mix(1-mix_tail_outer,1+mix_tail_outer,1,0,
+ pow(x/Tail_outer_rad,2)+
+ pow(y/Tail_outer_rad,2)+
+ pow((z-Tail_outer_length)/Tail_outer_length,2))
+ +mix(1-mix_tail_inner,1+mix_tail_inner,1,0,
+ pow(x/Tail_inner_rad,2)+
+ pow(y/Tail_inner_rad,2)+
+ pow((z-Tail_outer_length-Tail_inner_pos)/Tail_inner_length,2))
+ -mix(1-mix_eps_rear,1+mix_eps_rear,1,0,
+ round_bar(Rear_bend_rad,Rear_aux,Rear_rad,
+ x,
+ z*cos(Rear_bend_rad)+(y+Rear_aux)*sin(Rear_bend_rad),
+ (y+Rear_aux)*cos(Rear_bend_rad)-z*sin(Rear_bend_rad)))}
+ threshold 0
+ contained_by {box {
+ <-Tail_outer_rad,-max(Tail_outer_rad,Rear_length),-Rear_length>-1/2
+ <Tail_outer_rad,Tail_outer_rad,Tail_outer_length+Tail_inner_pos>-1/2}}
+ max_gradient 10
+ texture {Chitin_texture}
+ }
+ translate Rear_aux*y
+ rotate Rear_bend_deg*x
+ translate -Rear_aux*y
+ scale Tail_scale
+ global_lights on
+ }
+
+#local insect =
+ union {
+ object {
+ head
+ #local dy=Torso_dy(0);
+ #local dz=Torso_dz(0);
+ rotate -atanf(dy,dz)*180/pi*x
+ translate <0,Torso_y(0),Torso_z(0)>
+ }
+ object {torso}
+ object {
+ tail
+ #local dy=Torso_dy(1);
+ #local dz=Torso_dz(1);
+ rotate -atanf(dy,dz)*180/pi*x
+ translate <0,Torso_y(1),Torso_z(1)>
+ }
+ #if (playerKilled)
+ translate -2*y
+ rotate 90*z
+ translate Torso_w_max*y
+ #end
+ rotate playerAngle
+ translate playerLocation
+ translate <0,0,-2>
+ }
+
+object{insect}
+
+#version outer_version;
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/playerA.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/playerA.inc
@@ -0,0 +1,11 @@
+//
+// color defintions for player 1
+//
+#declare helmetColor = color rgb <1,0,0>;
+#declare faceColor = color rgb <0,1,0>;
+#declare bodyColor = color rgb <0,0,0>;
+#declare handsFeetColor = color rgb <0,0,0>;
+#declare armsLegsColor = color rgb <0,0,0>;
+#declare backpackColor = color rgb <0,0,0>;
+
+#declare floorColor = color rgb <0.333,0.333,0.333>;
--- xblast-tnt-models-20050106.orig/debian/sprites/include/playerB.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/playerB.inc
@@ -0,0 +1,11 @@
+//
+// color definitions for player 2
+//
+#declare helmetColor = color rgb <0,0,0>;
+#declare faceColor = color rgb <0,0,0>;
+#declare bodyColor = color rgb <1,0,0>;
+#declare handsFeetColor = color rgb <0,1,0>;
+#declare armsLegsColor = color rgb <0,0,0>;
+#declare backpackColor = color rgb <0,0,0>;
+
+#declare floorColor = color rgb <0.333,0.333,0.333>;
--- xblast-tnt-models-20050106.orig/debian/sprites/include/playerC.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/playerC.inc
@@ -0,0 +1,11 @@
+//
+// color defintions for player 3
+//
+#declare helmetColor = color rgb <0,0,0>;
+#declare faceColor = color rgb <0,0,0>;
+#declare bodyColor = color rgb <0,0,0>;
+#declare handsFeetColor = color rgb <0,0,0>;
+#declare armsLegsColor = color rgb <1,0,0>;
+#declare backpackColor = color rgb <0,1,0>;
+
+#declare floorColor = color rgb <0.333,0.333,0.333>;
--- xblast-tnt-models-20050106.orig/debian/sprites/include/playerD.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/playerD.inc
@@ -0,0 +1,11 @@
+//
+// color defintions for player 4
+//
+#declare helmetColor = color rgb <0,0,0>;
+#declare faceColor = color rgb <0,0,0>;
+#declare bodyColor = color rgb <0,0,0>;
+#declare handsFeetColor = color rgb <0,0,0>;
+#declare armsLegsColor = color rgb <0,0,0>;
+#declare backpackColor = color rgb <0,0,0>;
+
+#declare floorColor = color rgb <1,1,1>;
--- xblast-tnt-models-20050106.orig/debian/sprites/include/XBlastTexture.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/XBlastTexture.inc
@@ -0,0 +1,178 @@
+//
+// first of all the textures
+//
+//
+// Program XBLAST V2.6 or higher
+// (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+
+#declare ambientLow = 0.10;
+#declare ambientHigh = 0.15;
+
+// Dull creates a large, soft highlight on the object's surface
+#declare myDull = finish {ambient ambientLow specular 0.25 roughness 0.40}
+
+// Shiny creates a small, tight highlig
+#declare myShiny = finish {ambient ambientLow specular 0.75 roughness 0.0125}
+
+
+#ifndef (useOverrideTexture)
+#declare useOverrideTexture = 0;
+#end
+#ifndef (overrideTexture)
+#declare useOverrideTexture = 0;
+#end
+
+#if (useOverrideTexture)
+ #declare useOverrideTexture = 0;
+ #declare myGlass = texture{overrideTexture}
+ #declare helmetTexture = texture{overrideTexture}
+ #declare faceTexture = texture{overrideTexture}
+ #declare bodyTexture = texture{overrideTexture}
+ #declare armsLegsTexture = texture{overrideTexture}
+ #declare handsFeetTexture = texture{overrideTexture}
+ #declare backpackTexture = texture{overrideTexture}
+#else
+
+// Glass for Helmet
+#declare myGlass =
+ texture {
+ pigment { color rgbf<1.0, 1.0, 1.0, 0.85> }
+ finish {
+ specular 1
+ roughness 0.001
+ ambient 0
+ diffuse 0
+ reflection 0.1
+// refraction 1
+// ior 1.5
+ }
+#if (playerDamaged != 0)
+ normal {
+ crackle
+ slope_map {
+ [0.0 0.0] [0.1 1.0] [1.0 1.0]
+ }
+ scale 0.5
+ }
+#end
+}
+
+#ifndef (stripeColor)
+ #declare helmetTexture =
+ texture {
+ pigment {color helmetColor}
+ finish {myShiny ambient ambientHigh}
+ #if (playerDamaged != 0)
+ normal {dents 1.0 scale 0.25}
+ #end
+ }
+#else
+ #declare helmetTexture =
+ texture {
+ pigment {
+ gradient x
+ color_map {
+ [0.0 color stripeColor]
+ [0.2 color stripeColor]
+ [0.2 color helmetColor]
+ [1.0 color helmetColor]
+ }
+ scale 2.5
+ }
+ finish {myShiny ambient ambientHigh}
+ #if (playerDamaged != 0)
+ normal {dents 1.0 scale 0.25}
+ #end
+ }
+#end
+#declare faceTexture =
+texture {
+ pigment {faceColor}
+ finish {Dull ambient ambientHigh}
+}
+#declare bodyTexture =
+texture {
+ pigment {color bodyColor}
+ finish {myShiny ambient ambientHigh}
+ #if (playerDamaged != 0)
+ normal {dents 1.0 scale 0.25}
+ #end
+}
+#declare armsLegsTexture =
+texture {
+ #if (playerDamaged = 0)
+ pigment {armsLegsColor}
+ finish {myDull ambient ambientHigh}
+ #else
+ bozo
+ texture_map {
+ [0.0 pigment {armsLegsColor} finish {myDull ambient ambientHigh} ]
+ [0.6 pigment {armsLegsColor} finish {myDull ambient ambientHigh} ]
+ [0.7 pigment {Gray25} ]
+ [0.7 pigment {faceColor} finish {Dull ambient ambientHigh}]
+ [1.0 pigment {faceColor} finish {Dull ambient ambientHigh}]
+ }
+ scale 0.33
+ #end
+}
+#declare handsFeetTexture =
+texture {
+ pigment {color handsFeetColor}
+ finish {myShiny ambient ambientHigh}
+}
+#declare backpackTexture =
+texture {
+ pigment {color backpackColor}
+ finish {myShiny ambient ambientHigh}
+}
+
+#declare eyeTexture =
+#if (playerIsSick)
+texture {
+ spiral1 2
+ texture_map {
+ [0.0 pigment {color Gray15} finish {Glossy} ]
+ [0.5 pigment {color Gray15} finish {Glossy} ]
+ [0.5 pigment {color rgbt <0,0,0,1>} ]
+ [1.0 pigment {color rgbt <0,0,0,1>} ]
+ }
+ rotate x*90
+ scale <0.1,0.15,0.5>
+ translate <-0.3,0,0>
+}
+#else
+ texture {
+ pigment {
+#if (1)
+ color Gray15
+#else
+ wood
+ color_map {
+ [0.00 color Black]
+ [0.25 color Black]
+ [0.25 color White]
+ [1.00 color White]
+ }
+ translate <0,-0.1,0>
+#end
+ }
+ finish {Glossy }
+ }
+#end
+
+#end
--- xblast-tnt-models-20050106.orig/debian/sprites/include/Walk Straight.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/Walk Straight.inc
@@ -0,0 +1,75 @@
+//
+// Walk Straight
+// angles for XBlast robot walking straight ahead
+// 1 wclock = 2 steps for 4 units
+//
+// based on code (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+
+// declare walk clock (if needed)
+#ifndef (wclock)
+ #declare wclock = clock
+#end
+
+//
+// lots of trigonometrical functions
+//
+#declare COS = cos(radians(wclock*360))
+#declare SIN = sin(radians(wclock*360))
+
+#if (COS > 0.0)
+ #declare PCOS = COS
+ #declare MCOS = 0.0
+#else
+ #declare PCOS = 0.0
+ #declare MCOS = COS
+#end
+
+#if (SIN > 0.0)
+ #declare PSIN = SIN
+ #declare MSIN = 0.0
+#else
+ #declare PSIN = 0.0
+ #declare MSIN = SIN
+#end
+
+#declare P2SIN=PSIN*PSIN
+#declare M2SIN=-MSIN*MSIN
+#declare P2COS=PCOS*PCOS
+#declare M2COS=-MCOS*MCOS
+
+#declare COS2=COS*COS
+#declare SIN2=SIN*SIN
+
+//
+// the movement pattern
+//
+#declare leftLowerArmAngle = < -15, 25*P2SIN , -30>;
+#declare leftArmAngle = < 15, 20*COS + 5, -45>;
+#declare rightLowerArmAngle = < -15, 25*M2SIN , 30>;
+#declare rightArmAngle = < 15, 20*COS - 5, 45>;
+
+#declare rightLowerLegAngle = < 30*M2COS - 5, 0, 0>;
+#declare rightLegAngle = < 25*SIN + 5, 15, 0>;
+#declare leftLowerLegAngle = < -30*P2COS - 5, 0, 0>;
+#declare leftLegAngle = < -25*SIN + 5,-15, 0>;
+
+#declare rightFootAngle = < -10*SIN, 0, 0>;
+#declare leftFootAngle = < 10*SIN, 0, 0>;
+
+#declare playerWalkHeight = 0
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/world.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/world.inc
@@ -0,0 +1,46 @@
+
+// Floor, Camera, etc.
+
+
+
+// Default values, if not provided:
+#ifndef (cameraUp)
+ #declare cameraUp = 6.0;
+#end
+#ifndef (cameraRight)
+ #declare cameraRight = 4.0;
+#end
+#ifndef (floorColor)
+ #declare floorColor = color rgb <0.3,0.3,0.3>;
+#end
+
+
+
+// draw floor
+plane {
+ y, 0
+ pigment {floorColor}
+ finish {ambient 0.0 diffuse 1.0}
+}
+
+// background (sky) color
+background {color SkyBlue}
+
+
+// light source
+light_source {
+ <-100,500,-250>
+ color rgb <1.2,1.2,1.2>
+}
+
+// camera
+#declare Entf = 500.0;
+camera
+{
+ orthographic
+ location <0, 0, -Entf>
+ direction z
+ up cameraUp*y
+ right cameraRight*x
+ rotate x*48.60
+}
--- xblast-tnt-models-20050106.orig/debian/sprites/include/Anschauen.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/Anschauen.ini
@@ -0,0 +1,10 @@
+; [Das Anschau-Bild]
+Input_File_Name=Anschauen.pov
+Width=256
+Height=192
+; Antialias=On
+Antialias_Threshold=0.1
+Output_File_Name=Anschauen
+Output_File_Type=P
+; Post_Frame_Command=gzip -vf9 %o
+Pause_When_Done=True
--- xblast-tnt-models-20050106.orig/debian/sprites/include/chooseColors.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/chooseColors.inc
@@ -0,0 +1,90 @@
+#version 3.1;
+
+#switch (playerClock)
+ #case (0)
+ #declare helmetColor = color rgb <1,0,0>;
+ #declare faceColor = color rgb <0,1,0>;
+ #declare bodyColor = color rgb <0,0,1>;
+ #declare handsFeetColor = color rgb <0,0,0>;
+ #declare armsLegsColor = color rgb <0,0,0>;
+ #declare backpackColor = color rgb <0,0,0>;
+
+ #declare floorColor = color rgb <1/3,1/3,1/3>;
+ #break
+
+ #case (1)
+ #declare helmetColor = color rgb <0,0,0>;
+ #declare faceColor = color rgb <0,0,0>;
+ #declare bodyColor = color rgb <0,0,0>;
+ #declare handsFeetColor = color rgb <1,0,0>;
+ #declare armsLegsColor = color rgb <0,1,0>;
+ #declare backpackColor = color rgb <0,0,1>;
+
+ #declare floorColor = color rgb <1/3,1/3,1/3>;
+ #break
+
+ #case (2)
+ #declare helmetColor = color rgb <0,0,0>;
+ #declare faceColor = color rgb <0,0,0>;
+ #declare bodyColor = color rgb <0,0,0>;
+ #declare handsFeetColor = color rgb <0,0,0>;
+ #declare armsLegsColor = color rgb <0,0,0>;
+ #declare backpackColor = color rgb <0,0,0>;
+
+ #declare floorColor = color rgb <0,1/3,1>;
+ #break
+
+#end
+
+/*
+Old version with 4 pictures
+
+#version 3.1
+
+#switch (playerClock)
+ #case (0)
+ #declare helmetColor = color rgb <1,0,0>;
+ #declare faceColor = color rgb <0,1,0>;
+ #declare bodyColor = color rgb <0,0,0>;
+ #declare handsFeetColor = color rgb <0,0,0>;
+ #declare armsLegsColor = color rgb <0,0,0>;
+ #declare backpackColor = color rgb <0,0,0>;
+
+ #declare floorColor = color rgb <1/3,1/3,1/3>;
+ #break
+
+ #case (1)
+ #declare helmetColor = color rgb <0,0,0>;
+ #declare faceColor = color rgb <0,0,0>;
+ #declare bodyColor = color rgb <1,0,0>;
+ #declare handsFeetColor = color rgb <0,1,0>;
+ #declare armsLegsColor = color rgb <0,0,0>;
+ #declare backpackColor = color rgb <0,0,0>;
+
+ #declare floorColor = color rgb <1/3,1/3,1/3>;
+ #break
+
+ #case (2)
+ #declare helmetColor = color rgb <0,0,0>;
+ #declare faceColor = color rgb <0,0,0>;
+ #declare bodyColor = color rgb <0,0,0>;
+ #declare handsFeetColor = color rgb <0,0,0>;
+ #declare armsLegsColor = color rgb <1,0,0>;
+ #declare backpackColor = color rgb <0,1,0>;
+
+ #declare floorColor = color rgb <1/3,1/3,1/3>;
+ #break
+
+ #case (3)
+ #declare helmetColor = color rgb <0,0,0>;
+ #declare faceColor = color rgb <0,0,0>;
+ #declare bodyColor = color rgb <0,0,0>;
+ #declare handsFeetColor = color rgb <0,0,0>;
+ #declare armsLegsColor = color rgb <0,0,0>;
+ #declare backpackColor = color rgb <0,0,0>;
+
+ #declare floorColor = color rgb <1,1,1>;
+ #break
+
+#end
+*/
--- xblast-tnt-models-20050106.orig/debian/sprites/include/AllPlayerAnimation.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/AllPlayerAnimation.ini
@@ -0,0 +1,10 @@
+; [Antialiasing, 240 Frames]
+Input_File_Name=AllPlayerAnimation.pov
+Width=64
+Height=96
+Antialias=On
+Antialias_Threshold=0.1
+Initial_Frame=1
+Final_Frame=60
+Output_File_Type=P
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/AllPlayerAnimation.pov
+++ xblast-tnt-models-20050106/debian/sprites/include/AllPlayerAnimation.pov
@@ -0,0 +1,56 @@
+#version 3.1;
+//
+// pov file for rendering all players in all animations
+//
+// based on code (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+#include "colors.inc"
+#include "textures.inc"
+#include "frame_defaults.inc"
+
+#declare myClock = int((3 * 5 * 4 - 1)* clock + 0.5);
+//#warning concat("Internal Clock: ",str(myClock,4,3),"\n")
+// - 3 shots of each animation A,B,C,D
+// - 5 : 1 animation frame standing
+// 4 animation frames walking
+// - 4 angles
+
+#declare angleClock = mod(div(myClock,15),4);
+#declare playerAngle = y*angleClock*90;
+
+#declare frameClock = mod(div(myClock,3),5);
+
+#if (frameClock = 0)
+ #declare playerStanding = 1;
+#else
+ #declare playerWalking = 1;
+ #declare playerAnimationClock = frameClock-1;
+ #if ((angleClock=1) | (angleClock=2))
+ #declare playerWalkingClock = 3-playerAnimationClock;
+ #else
+ #declare playerWalkingClock = playerAnimationClock;
+ #end
+ #declare playerWalkingTime = playerWalkingClock/4;
+#end
+
+#declare playerClock = mod(myClock,3);
+
+#include "chooseColors.inc"
+#include "XBlast Robot.inc"
+#include "world.inc"
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/AllPlayerSpecial.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/AllPlayerSpecial.ini
@@ -0,0 +1,10 @@
+; [Antialiasing, 36 Frames]
+Input_File_Name=AllPlayerSpecial.pov
+Width=64
+Height=96
+Antialias=On
+Antialias_Threshold=0.1
+Initial_Frame=1
+Final_Frame=30
+Output_File_Type=P
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/AllPlayerSpecial.pov
+++ xblast-tnt-models-20050106/debian/sprites/include/AllPlayerSpecial.pov
@@ -0,0 +1,58 @@
+#version 3.1;
+//
+// pov file for rendering all players in all animations
+//
+// based on code (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+#include "colors.inc"
+#include "textures.inc"
+#include "frame_defaults.inc"
+
+#declare myClock = int((3 * 10 - 1)*clock + 0.5);
+// 4 shots of each animation
+// 10 pictures losing 3x, winning 3x, killed 4x
+//#warning concat("\nInternal Clock ",str(myClock,4,3),"\n")
+
+#warning concat("\nInternal Clock ",str(myClock,4,3),"\n")
+
+#declare frameClock = mod(div(myClock,3),10);
+
+#switch (frameClock)
+ #range(0,2)
+ #declare playerLosing = 1;
+ #declare playerAnimationClock = frameClock;
+ #declare playerLosingTime = playerAnimationClock/2;
+ #break
+ #range(3,5)
+ #declare playerWinning = 1;
+ #declare playerAnimationClock = frameClock-3;
+ #declare playerWinningTime = playerAnimationClock/2;
+ #break
+ #range(6,9)
+ #declare playerKilled = 1;
+ #declare playerAngle = (frameClock-6)*90*y;
+ #break
+#end
+
+#declare playerClock=mod(myClock,3);
+
+#include "chooseColors.inc"
+#include "XBlast Robot.inc"
+#include "world.inc"
+
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/Anschauen.pov
+++ xblast-tnt-models-20050106/debian/sprites/include/Anschauen.pov
@@ -0,0 +1,54 @@
+#version 3.1;
+//
+// pov file for rendering big winner image
+//
+// based on code (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+#include "colors.inc"
+#include "textures.inc"
+#include "frame_defaults.inc"
+
+//
+// color defintions for player 1
+//
+
+/* Hier gewünschte Einstellungen machen: */
+
+#declare helmetColor = color rgb <0.7,0.3,0>;
+#declare faceColor = color rgb <1,0.6,0.3>;
+#declare bodyColor = color rgb <0,0,1>;
+#declare handsFeetColor = color rgb <1,1,0>;
+#declare armsLegsColor = color rgb <0,1,1>;
+#declare backpackColor = color rgb <1,0,1>;
+
+
+#declare playerStanding = 1;
+
+object {
+ #include "XBlast Robot.inc"
+ translate -2*x
+}
+object {
+ #declare playerAngle = 90;
+ #include "XBlast Robot.inc"
+ translate 2*x
+}
+
+#declare camereUp = 6.0;
+#declare cameraRight = 8.0;
+#include "world.inc"
--- xblast-tnt-models-20050106.orig/debian/sprites/include/BigWinner.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/BigWinner.ini
@@ -0,0 +1,10 @@
+; [Antialiasing, 12 Frames]
+Input_File_Name=BigWinner.pov
+Width=128
+Height=192
+Antialias=On
+Antialias_Threshold=0.1
+Initial_Frame=1
+Final_Frame=3
+Output_File_Type=P
+Post_Frame_Command=./include/postproc.sh big %o %s %n
--- xblast-tnt-models-20050106.orig/debian/sprites/include/BigWinner.pov
+++ xblast-tnt-models-20050106/debian/sprites/include/BigWinner.pov
@@ -0,0 +1,40 @@
+#version 3.1;
+
+//
+// pov file for rendering big winner image
+//
+// based on code (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+#include "colors.inc"
+#include "textures.inc"
+#include "frame_defaults.inc"
+
+#declare myClock = int((3 - 1)* clock + 0.5);
+//#warning concat("Internal Clock: ",str(myClock,4,3),"\n")
+// - 3 animations
+
+#declare playerClock = mod(myClock,3);
+
+#declare playerWinning = 1;
+#declare playerAnimationClock = 0;
+#declare playerWinningTime = 0;
+
+#include "chooseColors.inc"
+#include "XBlast Robot.inc"
+#include "world.inc"
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/HiQ.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/HiQ.ini
@@ -0,0 +1,4 @@
+Width=128
+Height=192
+Antialias_Threshold=0.3
+Post_Frame_Command=./include/postproc.sh high %o %s %n
--- xblast-tnt-models-20050106.orig/debian/sprites/include/LoQ.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/LoQ.ini
@@ -0,0 +1,2 @@
+Antialias_Threshold=0.3
+Post_Frame_Command=./include/postproc.sh low %o %s %n
--- xblast-tnt-models-20050106.orig/debian/sprites/include/Quick.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/Quick.ini
@@ -0,0 +1,3 @@
+Antialias=Off
+Quality=1
+Post_Frame_Command=./include/postproc.sh quick %o %s %n
--- xblast-tnt-models-20050106.orig/debian/sprites/include/frames.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/frames.inc
@@ -0,0 +1,174 @@
+
+#macro frameDefaults()
+ #declare playerDamaged = 0;
+ #declare playerWalkHeight = 0.0;
+ #declare playerLocation = z*-2.667;
+#end
+
+
+
+
+#if (playerWinning)
+ #local c=playerAnimationClock;
+ frameDefaults()
+ #switch (c)
+ #case (0)
+ #declare W=0;
+ #break
+ #case (1)
+ #declare W=0.25;
+ #break
+ #case (2)
+ #declare W=0.75;
+ #break
+ #end
+
+ #declare leftLowerArmAngle = < 30-45*W, 75-75*W, 0-30*W>;
+ #declare leftArmAngle = < 75-60*W, -30+40*W, -15-30*W>;
+ #declare rightLowerArmAngle = < 30-45*W, -75+75*W, 0+30*W>;
+ #declare rightArmAngle = < 75-60*W, 30-40*W, 15+30*W>;
+
+ #declare rightLowerLegAngle = < 0-25*W, 0 , 0 >;
+ #declare rightLegAngle = < 0+15*W, 15 , 0 >;
+ #declare leftLowerLegAngle = < 0-25*W, 0 , 0 >;
+ #declare leftLegAngle = < 0+15*W, -15 , 0 >;
+
+ #declare rightFootAngle = < 0 , 0 , 0 >;
+ #declare leftFootAngle = < 0 , 0 , 0 >;
+
+ #declare headAngle = < 10-10*W, 0 , 0 >;
+ #declare bodyAngle = < 10-10*W, 0 , 0 >;
+
+ #declare playerLocation=(-2.567-0.1*W)*z;
+#end
+
+
+#if (playerLosing)
+ #local c=playerAnimationClock;
+ frameDefaults()
+ #declare leftLowerArmAngle = < -15, 0, -30>;
+ #declare leftArmAngle = < 0, 0, -60>;
+ #declare rightLowerArmAngle = < -15, 0, 30>;
+ #declare rightArmAngle = < 0, 0, 60>;
+
+ #declare rightLowerLegAngle = < - 25, 0, 0>;
+ #declare rightLegAngle = < + 25, 15, 0>;
+ #declare leftLowerLegAngle = < - 25, 0, 0>;
+ #declare leftLegAngle = < + 25, -15, 0>;
+
+ #declare rightFootAngle = < 0, 0, 0>;
+ #declare leftFootAngle = < 0, 0, 0>;
+
+ #switch (c)
+ #case (0)
+ #declare headAngle = < -10, 0, 0>;
+ #break
+ #case (1)
+ #declare headAngle = < -10, 15, 0>;
+ #break
+ #case (2)
+ #declare headAngle = < -10, -15, 0>;
+ #break
+ #end
+ #declare bodyAngle = < -10, 0, 0>;
+#end
+
+
+#if (playerKilled)
+ frameDefaults()
+ #declare playerDamaged = 1;
+ #declare playerWalkHeight = -1.0;
+
+ #declare leftLowerArmAngle = < -15, 0, -30>;
+ #declare leftArmAngle = < -15, -20, -45>;
+ #declare rightLowerArmAngle = < -15, 0, 30>;
+ #declare rightArmAngle = < -15, 20, 45>;
+
+ #declare rightLowerLegAngle = < - 25, 0, 0>;
+ #declare rightLegAngle = < + 90, 15, 0>;
+ #declare leftLowerLegAngle = < - 25, 0, 0>;
+ #declare leftLegAngle = < + 90, -15, 0>;
+
+ #declare rightFootAngle = < 0, 0, 0>;
+ #declare leftFootAngle = < 0, 0, 0>;
+
+ #declare headAngle = < 0, 0, 10>;
+ #declare bodyAngle = < 15, 0, 0>;
+#end
+
+
+#if (playerWalking)
+ #local c=playerAnimationClock;
+ frameDefaults()
+ //
+ // lots of trigonometrical functions
+ //
+ #declare COS = cos(radians(c/4.0*360));
+ #declare SIN = sin(radians(c/4.0*360));
+
+ #if (COS > 0.0)
+ #declare PCOS = COS;
+ #declare MCOS = 0.0;
+ #else
+ #declare PCOS = 0.0;
+ #declare MCOS = COS;
+ #end
+
+ #if (SIN > 0.0)
+ #declare PSIN = SIN;
+ #declare MSIN = 0.0;
+ #else
+ #declare PSIN = 0.0;
+ #declare MSIN = SIN;
+ #end
+
+ #declare P2SIN=PSIN*PSIN;
+ #declare M2SIN=-MSIN*MSIN;
+ #declare P2COS=PCOS*PCOS;
+ #declare M2COS=-MCOS*MCOS;
+
+ #declare COS2=COS*COS;
+ #declare SIN2=SIN*SIN;
+
+ //
+ // the movement pattern
+ //
+ #declare leftLowerArmAngle = < -15, 25*P2SIN , -30>;
+ #declare leftArmAngle = < 15, 20*COS + 5, -45>;
+ #declare rightLowerArmAngle = < -15, 25*M2SIN , 30>;
+ #declare rightArmAngle = < 15, 20*COS - 5, 45>;
+
+ #declare rightLowerLegAngle = < 30*M2COS - 5, 0, 0>;
+ #declare rightLegAngle = < 25*SIN + 5, 15, 0>;
+ #declare leftLowerLegAngle = < -30*P2COS - 5, 0, 0>;
+ #declare leftLegAngle = < -25*SIN + 5,-15, 0>;
+
+ #declare rightFootAngle = < -10*SIN, 0, 0>;
+ #declare leftFootAngle = < 10*SIN, 0, 0>;
+
+ #declare headAngle = < 0, 0, 0>;
+ #declare bodyAngle = < 0, 0, 0>;
+#end
+
+
+
+
+#if (playerStanding)
+ frameDefaults()
+ #declare leftLowerArmAngle = < -15, 0, -30>;
+ #declare leftArmAngle = < 15, 10, -45>;
+ #declare rightLowerArmAngle = < -15, 0, 30>;
+ #declare rightArmAngle = < 15, -10, 45>;
+
+ #declare rightLowerLegAngle = < - 25, 0, 0>;
+ #declare rightLegAngle = < + 15, 15, 0>;
+ #declare leftLowerLegAngle = < - 25, 0, 0>;
+ #declare leftLegAngle = < + 15,-15, 0>;
+
+ #declare rightFootAngle = < 0, 0, 0>;
+ #declare leftFootAngle = < 0, 0, 0>;
+
+ #declare headAngle = < 0, 0, 0>;
+ #declare bodyAngle = < 0, 0, 0>;
+#end
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/AllPlayerAnimation.pov.tut
+++ xblast-tnt-models-20050106/debian/sprites/include/AllPlayerAnimation.pov.tut
@@ -0,0 +1,53 @@
+#version 3.1;
+//
+// pov file for rendering all players in all animations
+//
+// based on code (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+#include "colors.inc"
+#include "textures.inc"
+
+#declare myClock = int((3 * 5 * 4 - 1)* clock + 0.5);
+#warning concat("Internal Clock: ",str(myClock,4,3),"\n")
+// - 3 shots of each animation A,B,C,D
+// - 5 : 1 animation frame standing
+// 4 animation frames walking
+// - 4 angles
+
+
+#declare frameClock = mod(div(myClock,3),5);
+
+#include "frames.inc"
+#if (frameClock = 0)
+ frameStanding()
+#else
+ frameWalking(frameClock - 1)
+#end
+
+#declare angleClock = mod(div(myClock,15),4);
+#declare playerAngle = y*angleClock*90;
+
+#declare playerClock = mod(myClock,3);
+
+
+#include "chooseColors.inc"
+#include "XBlast Robot.inc"
+
+#include "world.inc"
+
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/WalkFluidly.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/WalkFluidly.ini
@@ -0,0 +1,7 @@
+Input_File_Name=WalkFluidly.pov
+Width=256
+Height=192
+Initial_Frame=1
+Final_Frame=20
+Cyclic_Animation=1
+Output_File_Type=P
--- xblast-tnt-models-20050106.orig/debian/sprites/include/frames.inc.tut
+++ xblast-tnt-models-20050106/debian/sprites/include/frames.inc.tut
@@ -0,0 +1,174 @@
+
+#macro frameDefaults()
+ #declare playerDamaged = 0;
+ #declare playerWalkHeight = 0.0;
+ #declare playerLocation = z*-2.667;
+ #declare playerAngle = 0;
+#end
+
+
+
+// c = 0..2
+#macro frameWinning(c)
+ frameDefaults()
+ #switch (c)
+ #case (0)
+ #declare W=0;
+ #break
+ #case (1)
+ #declare W=0.25;
+ #break
+ #case (2)
+ #declare W=0.75;
+ #break
+ #end
+
+ #declare leftLowerArmAngle = < 30-45*W, 75-75*W, 0-30*W>;
+ #declare leftArmAngle = < 75-60*W, -30+40*W, -15-30*W>;
+ #declare rightLowerArmAngle = < 30-45*W, -75+75*W, 0+30*W>;
+ #declare rightArmAngle = < 75-60*W, 30-40*W, 15+30*W>;
+
+ #declare rightLowerLegAngle = < 0-25*W, 0 , 0 >;
+ #declare rightLegAngle = < 0+15*W, 15 , 0 >;
+ #declare leftLowerLegAngle = < 0-25*W, 0 , 0 >;
+ #declare leftLegAngle = < 0+15*W, -15 , 0 >;
+
+ #declare rightFootAngle = < 0 , 0 , 0 >;
+ #declare leftFootAngle = < 0 , 0 , 0 >;
+
+ #declare headAngle = < 10-10*W, 0 , 0 >;
+ #declare bodyAngle = < 10-10*W, 0 , 0 >;
+
+ #declare playerLocation=(-2.567-0.1*W)*z;
+#end
+
+
+// c = 0..2
+#macro frameLosing(c)
+ frameDefaults()
+ #declare leftLowerArmAngle = < -15, 0, -30>;
+ #declare leftArmAngle = < 0, 0, -60>;
+ #declare rightLowerArmAngle = < -15, 0, 30>;
+ #declare rightArmAngle = < 0, 0, 60>;
+
+ #declare rightLowerLegAngle = < - 25, 0, 0>;
+ #declare rightLegAngle = < + 25, 15, 0>;
+ #declare leftLowerLegAngle = < - 25, 0, 0>;
+ #declare leftLegAngle = < + 25, -15, 0>;
+
+ #declare rightFootAngle = < 0, 0, 0>;
+ #declare leftFootAngle = < 0, 0, 0>;
+
+ #switch (c)
+ #case (0)
+ #declare headAngle = < -10, 0, 0>;
+ #break
+ #case (1)
+ #declare headAngle = < -10, 15, 0>;
+ #break
+ #case (2)
+ #declare headAngle = < -10, -15, 0>;
+ #break
+ #end
+ #declare bodyAngle = < -10, 0, 0>;
+#end
+
+
+#macro frameKilled()
+ frameDefaults()
+ #declare playerDamaged = 1;
+ #declare playerWalkHeight = -1.0;
+
+ #declare leftLowerArmAngle = < -15, 0, -30>;
+ #declare leftArmAngle = < -15, -20, -45>;
+ #declare rightLowerArmAngle = < -15, 0, 30>;
+ #declare rightArmAngle = < -15, 20, 45>;
+
+ #declare rightLowerLegAngle = < - 25, 0, 0>;
+ #declare rightLegAngle = < + 90, 15, 0>;
+ #declare leftLowerLegAngle = < - 25, 0, 0>;
+ #declare leftLegAngle = < + 90, -15, 0>;
+
+ #declare rightFootAngle = < 0, 0, 0>;
+ #declare leftFootAngle = < 0, 0, 0>;
+
+ #declare headAngle = < 0, 0, 10>;
+ #declare bodyAngle = < 15, 0, 0>;
+#end
+
+
+// c = 0..3
+#macro frameWalking(c)
+ frameDefaults()
+ //
+ // lots of trigonometrical functions
+ //
+ #declare COS = cos(radians(c/4.0*360));
+ #declare SIN = sin(radians(c/4.0*360));
+
+ #if (COS > 0.0)
+ #declare PCOS = COS;
+ #declare MCOS = 0.0;
+ #else
+ #declare PCOS = 0.0;
+ #declare MCOS = COS;
+ #end
+
+ #if (SIN > 0.0)
+ #declare PSIN = SIN;
+ #declare MSIN = 0.0;
+ #else
+ #declare PSIN = 0.0;
+ #declare MSIN = SIN;
+ #end
+
+ #declare P2SIN=PSIN*PSIN;
+ #declare M2SIN=-MSIN*MSIN;
+ #declare P2COS=PCOS*PCOS;
+ #declare M2COS=-MCOS*MCOS;
+
+ #declare COS2=COS*COS;
+ #declare SIN2=SIN*SIN;
+
+ //
+ // the movement pattern
+ //
+ #declare leftLowerArmAngle = < -15, 25*P2SIN , -30>;
+ #declare leftArmAngle = < 15, 20*COS + 5, -45>;
+ #declare rightLowerArmAngle = < -15, 25*M2SIN , 30>;
+ #declare rightArmAngle = < 15, 20*COS - 5, 45>;
+
+ #declare rightLowerLegAngle = < 30*M2COS - 5, 0, 0>;
+ #declare rightLegAngle = < 25*SIN + 5, 15, 0>;
+ #declare leftLowerLegAngle = < -30*P2COS - 5, 0, 0>;
+ #declare leftLegAngle = < -25*SIN + 5,-15, 0>;
+
+ #declare rightFootAngle = < -10*SIN, 0, 0>;
+ #declare leftFootAngle = < 10*SIN, 0, 0>;
+
+ #declare headAngle = < 0, 0, 0>;
+ #declare bodyAngle = < 0, 0, 0>;
+#end
+
+
+
+
+#macro frameStanding()
+ frameDefaults()
+ #declare leftLowerArmAngle = < -15, 0, -30>;
+ #declare leftArmAngle = < 15, 10, -45>;
+ #declare rightLowerArmAngle = < -15, 0, 30>;
+ #declare rightArmAngle = < 15, -10, 45>;
+
+ #declare rightLowerLegAngle = < - 25, 0, 0>;
+ #declare rightLegAngle = < + 15, 15, 0>;
+ #declare leftLowerLegAngle = < - 25, 0, 0>;
+ #declare leftLegAngle = < + 15,-15, 0>;
+
+ #declare rightFootAngle = < 0, 0, 0>;
+ #declare leftFootAngle = < 0, 0, 0>;
+
+ #declare headAngle = < 0, 0, 0>;
+ #declare bodyAngle = < 0, 0, 0>;
+#end
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/frame_defaults.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/frame_defaults.inc
@@ -0,0 +1,11 @@
+
+#declare playerStanding = 0;
+#declare playerWalking = 0;
+#declare playerWinning = 0;
+#declare playerLosing = 0;
+#declare playerKilled = 0;
+#declare playerAnimationClock = 0;
+
+#declare playerLocation = 0;
+#declare playerAngle = 0;
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/humanoid_frames.inc
+++ xblast-tnt-models-20050106/debian/sprites/include/humanoid_frames.inc
@@ -0,0 +1,657 @@
+/*
+
+Constants managed by this file:
+===============================
+
+Input constants:
+----------------
+
+Lengths of parts of the body:
+
+ leg_length
+ leg_half_length
+ upper_leg_length
+ lower_leg_length
+ hip_width
+ back_length
+ shoulder_width
+ arm_length
+ arm_half_length
+ upper_arm_length
+ lower_arm_length
+
+Radii of joints of the body:
+
+ default_rad - See section defaults
+ ankle_rad
+ knee_rad
+ hip_rad
+ shoulder_rad
+ elbow_rad
+ wrist_rad
+
+Angles:
+
+ killed_leg_ang - How far (in degrees) the legs are spread
+ when sitting killed
+ killed_back_ang - How far the torso is bent backwards when killed
+ killed_nod_ang
+ losing_back_ang - How far the torso is bent forwards when losing
+ losing_min_nod_ang
+ losing_max_nod_ang
+ losing_shake_ang
+ walking_back_ang - How far the torso is bent forwards when walking
+ walking_arm_ang - How far the arms swing when walking
+
+Other:
+
+ winning_jump_height
+ step_length
+ left_eye_pos - Position of the place where hand and eye meet when
+ weeping (relative to neck_pos for an upright head).
+ left_eye_normal
+ leg_sep - The space between the legs
+ arm_sep - The space between the arms and the legs
+
+
+Output constants:
+-----------------
+
+Positions:
+
+ left_ankle_pos
+ right_ankle_pos
+ left_knee_pos
+ right_knee_pos
+ hip_pos
+ left_hip_pos
+ right_hip_pos
+ neck_pos
+ left_shoulder_pos
+ right_shoulder_pos
+ left_elbow_pos
+ right_elbow_pos
+ left_wrist_pos
+ right_wrist_pos
+
+Transforms:
+
+ left_lower_leg_trans
+ right_lower_leg_trans
+ left_upper_leg_trans
+ right_upper_leg_trans
+ back_trans
+ head_trans
+ left_lower_arm_trans
+ right_lower_arm_trans
+ left_upper_arm_trans
+ right_upper_arm_trans
+
+
+
+The idea of this file:
+======================
+
+This file should aid in placing parts of the body.
+The idea is that for, say, the upper left leg, the following can be used:
+
+ cone {
+ left_knee_pos knee_rad
+ left_hip_pos hip_rad
+ }
+
+or
+
+ cone {
+ -upper_leg_length*y knee_rad
+ 0 hip_rad
+ transform left_upper_leg_trans
+ }
+
+
+
+Invokation of this file's functionality:
+========================================
+
+The input is done by declaring the input constants outside of this file.
+A call of Erase_humanoid_input_constants empties previous values
+(so that defaults are available again).
+A call of Define_humanoid_output_constants starts the calculation.
+
+
+
+Defaults of the input constants:
+================================
+
+Constants that are not listed here do not have default values.
+
+ leg_length, upper_leg_length, lower_leg_length:
+ If leg_half_length is given, upper_leg_length and lower_leg_length
+ default to it. If otherwise only two of the other three are given,
+ the third defaults such that
+ leg_length = upper_leg_length+lower_leg_length.
+ If only leg_length is given, the default is that
+ upper_leg_length=lower_leg_length.
+ If all three are given or otherwise defaulted and
+ leg_length < upper_leg_length+lower_leg_length
+ then the leg will never be fully stretched.
+
+ hip_width:
+ 2*max(ankle_rad, knee_rad, hip_rad)+leg_sep
+
+ shoulder_width:
+ hip_width +
+ 2*max(ankle_rad, knee_rad, hip_rad) +
+ 2*arm_sep +
+ 2*max(wrist_rad, elbow_rad, shoulder_rad)
+
+ arm_length, upper_arm_length, lower_arm_length:
+ similar to legs.
+
+ ankle_rad, knee_rad, hip_rad, shoulder_rad, elbow_rad, wrist_rad:
+ default_rad
+ If all of the above are given, default_rad is not needed.
+
+ killed_leg_ang, killed_back_ang, killed_nod_ang,
+ losing_back_ang, losing_min_nod_ang, losing_shake_ang,
+ walking_back_ang, walking_arm_ang:
+ 0
+
+ losing_max_nod_ang:
+ losing_min_nod_ang
+
+ winning_jump_height, leg_sep, arm_sep:
+ 0
+
+ step_length:
+ 2
+
+ left_eye_normal:
+ -z
+
+
+*/
+
+
+#ifndef(humanoid_frames_INCLUDED)
+#declare humanoid_frames_INCLUDED = 1;
+
+
+
+#declare atanf=function(b,a) // b=sin, a=cos
+ {(select((b),
+ select((a),
+ select((a)-(b),
+ atan2(-(b),-(a))-pi,
+ -pi/2-atan2(-(a),-(b))),
+ select((a)+(b),
+ atan2((a),-(b))-pi/2,
+ -atan2(-(b),(a)))),
+ select((a),
+ select((a)+(b),
+ pi-atan2((b),-(a)),
+ pi/2+atan2(-(a),(b))),
+ select((a)-(b),
+ pi/2-atan2((a),(b)),
+ atan2((b),(a)))
+ )))}
+
+
+
+#macro Erase_humanoid_input_constants()
+ #ifdef (leg_length) #undef leg_length #end
+ #ifdef (leg_half_length) #undef leg_half_length #end
+ #ifdef (upper_leg_length) #undef upper_leg_length #end
+ #ifdef (lower_leg_length) #undef lower_leg_length #end
+ #ifdef (hip_width) #undef hip_width #end
+ #ifdef (back_length) #undef back_length #end
+ #ifdef (shoulder_width) #undef shoulder_width #end
+ #ifdef (arm_length) #undef arm_length #end
+ #ifdef (arm_half_length) #undef arm_half_length #end
+ #ifdef (upper_arm_length) #undef upper_arm_length #end
+ #ifdef (lower_arm_length) #undef lower_arm_length #end
+ #ifdef (leg_sep) #undef leg_sep #end
+ #ifdef (arm_sep) #undef arm_sep #end
+ #ifdef (default_rad) #undef default_rad #end
+ #ifdef (ankle_rad) #undef ankle_rad #end
+ #ifdef (knee_rad) #undef knee_rad #end
+ #ifdef (hip_rad) #undef hip_rad #end
+ #ifdef (shoulder_rad) #undef shoulder_rad #end
+ #ifdef (elbow_rad) #undef elbow_rad #end
+ #ifdef (wrist_rad) #undef wrist_rad #end
+ #ifdef (killed_leg_ang) #undef killed_leg_ang #end
+ #ifdef (killed_back_ang) #undef killed_back_ang #end
+ #ifdef (killed_nod_ang) #undef killed_nod_ang #end
+ #ifdef (losing_back_ang) #undef losing_back_ang #end
+ #ifdef (losing_min_nod_ang) #undef losing_min_nod_ang #end
+ #ifdef (losing_max_nod_ang) #undef losing_max_nod_ang #end
+ #ifdef (losing_shake_ang) #undef losing_shake_ang #end
+ #ifdef (walking_back_ang) #undef walking_back_ang #end
+ #ifdef (walking_arm_ang) #undef walking_arm_ang #end
+ #ifdef (winning_jump_height) #undef winning_jump_height #end
+ #ifdef (step_length) #undef step_length #end
+ #ifdef (left_eye_pos) #undef left_eye_pos #end
+ #ifdef (left_eye_normal) #undef left_eye_normal #end
+#end
+
+
+
+#macro Apply_humanoid_defaults()
+
+ #ifndef(ankle_rad)
+ #declare ankle_rad = default_rad;
+ #end
+ #ifndef(knee_rad)
+ #declare knee_rad = default_rad;
+ #end
+ #ifndef(hip_rad)
+ #declare hip_rad = default_rad;
+ #end
+ #ifndef(shoulder_rad)
+ #declare shoulder_rad = default_rad;
+ #end
+ #ifndef(elbow_rad)
+ #declare elbow_rad = default_rad;
+ #end
+ #ifndef(wrist_rad)
+ #declare wrist_rad = default_rad;
+ #end
+
+ #ifndef(lower_leg_length)
+ #ifdef(leg_half_length)
+ #declare lower_leg_length = leg_half_length;
+ #else
+ #ifndef(upper_leg_length)
+ #declare upper_leg_length = leg_length/2;
+ #end
+ #declare lower_leg_length = leg_length-upper_leg_length;
+ #end
+ #end
+ #ifndef(upper_leg_length)
+ #ifdef(leg_half_length)
+ #declare upper_leg_length = leg_half_length;
+ #else
+ #declare upper_leg_length = leg_length-lower_leg_length;
+ #end
+ #end
+ #ifndef(leg_length)
+ #declare leg_length = upper_leg_length+lower_leg_length;
+ #end
+
+ #ifndef(leg_sep)
+ #declare leg_sep = 0;
+ #end
+ #ifndef(arm_sep)
+ #declare arm_sep = 0;
+ #end
+ #ifndef(hip_width)
+ #declare hip_width = 2*max(ankle_rad,knee_rad,hip_rad)+leg_sep;
+ #end
+ #ifndef(shoulder_width)
+ #declare shoulder_width = hip_width +
+ 2*max(ankle_rad,knee_rad,hip_rad) +
+ 2*arm_sep +
+ 2*max(wrist_rad,elbow_rad,shoulder_rad);
+ #end
+
+ #ifndef(lower_arm_length)
+ #ifdef(arm_half_length)
+ #declare lower_arm_length = arm_half_length;
+ #else
+ #ifndef(upper_arm_length)
+ #declare upper_arm_length = arm_length/2;
+ #end
+ #declare lower_arm_length = arm_length-upper_arm_length;
+ #end
+ #end
+ #ifndef(upper_arm_length)
+ #ifdef(arm_half_length)
+ #declare upper_arm_length = arm_half_length;
+ #else
+ #declare upper_arm_length = arm_length-lower_arm_length;
+ #end
+ #end
+ #ifndef(arm_length)
+ #declare arm_length = upper_arm_length+lower_arm_length;
+ #end
+
+ #ifndef(killed_leg_ang)
+ #declare killed_leg_ang = 0;
+ #end
+ #ifndef(killed_back_ang)
+ #declare killed_back_ang = 0;
+ #end
+ #ifndef(killed_nod_ang)
+ #declare killed_nod_ang = 0;
+ #end
+
+ #ifndef(losing_back_ang)
+ #declare losing_back_ang = 0;
+ #end
+ #ifndef(losing_min_nod_ang)
+ #declare losing_min_nod_ang = 0;
+ #end
+ #ifndef(losing_max_nod_ang)
+ #declare losing_max_nod_ang = losing_min_nod_ang;
+ #end
+ #ifndef(losing_shake_ang)
+ #declare losing_shake_ang = 0;
+ #end
+
+ #ifndef(winning_jump_height)
+ #declare winning_jump_height = 0;
+ #end
+
+ #ifndef(walking_back_ang)
+ #declare walking_back_ang = 0;
+ #end
+ #ifndef(walking_arm_ang)
+ #declare walking_arm_ang = 0;
+ #end
+
+ #ifndef(step_length)
+ #declare step_length = 2;
+ #end
+
+ #ifndef(left_eye_normal)
+ #declare left_eye_normal = -z;
+ #end
+
+#end
+
+
+
+#macro Define_humanoid_output_constants()
+ Apply_humanoid_defaults()
+
+ #if (2*leg_length<step_length)
+ #warning "legs are too short\n"
+ #end
+
+ #local walking_hip_height =
+ ankle_rad+sqrt(pow(leg_length,2)-pow(step_length/2,2));
+ #local standing_hip_height = ankle_rad+leg_length;
+ #local leg_ang = 0;
+
+ #if (playerWalking)
+
+ #local playerWalkingTime_=playerWalkingTime+1/8;
+ #if (playerWalkingTime_>1)
+ #local playerWalkingTime_=playerWalkingTime_-1;
+ #end
+
+ #local aux_ang_1 = radians(walking_back_ang);
+ #local aux_ang_2 = radians(walking_arm_ang/2*cos(playerWalkingTime_*2*pi));
+
+ #if (playerWalkingTime_<=0.5)
+ #declare left_ankle_pos =
+ <hip_width/2,ankle_rad,(playerWalkingTime_-0.25)*2*step_length>;
+ #declare right_ankle_pos =
+ <-hip_width/2,
+ ankle_rad+sin(playerWalkingTime_*2*pi),
+ (0.25-playerWalkingTime_)*2*step_length>;
+ #else
+ #declare left_ankle_pos =
+ <hip_width/2,
+ ankle_rad+sin((playerWalkingTime_-0.5)*2*pi),
+ (0.75-playerWalkingTime_)*2*step_length>;
+ #declare right_ankle_pos =
+ <-hip_width/2,ankle_rad,(playerWalkingTime_-0.75)*2*step_length>;
+ #end
+ #declare hip_pos = <0,walking_hip_height,0>;
+ #declare left_hip_pos = <hip_width/2,walking_hip_height,0>;
+ #declare right_hip_pos = <-hip_width/2,walking_hip_height,0>;
+ #declare neck_pos = hip_pos+<0,cos(aux_ang_1),-sin(aux_ang_1)>*back_length;
+ #declare left_shoulder_pos = neck_pos+shoulder_width/2*x;
+ #declare right_shoulder_pos = neck_pos-shoulder_width/2*x;
+ #declare nod_ang = 0;
+ #declare shake_ang = 0;
+ #declare left_wrist_pos = left_shoulder_pos+
+ <0,-cos(aux_ang_2),sin(aux_ang_2)>*arm_length;
+ #declare right_wrist_pos = right_shoulder_pos+
+ <0,-cos(aux_ang_2),-sin(aux_ang_2)>*arm_length;
+
+ #else#if (playerStanding)
+
+ #declare left_ankle_pos = <hip_width/2,ankle_rad,0>;
+ #declare right_ankle_pos = <-hip_width/2,ankle_rad,0>;
+ #declare hip_pos = <0,standing_hip_height,0>;
+ #declare left_hip_pos = <hip_width/2,standing_hip_height,0>;
+ #declare right_hip_pos = <-hip_width/2,standing_hip_height,0>;
+ #declare neck_pos = hip_pos+back_length*y;
+ #declare left_shoulder_pos = neck_pos+shoulder_width/2*x;
+ #declare right_shoulder_pos = neck_pos-shoulder_width/2*x;
+ #declare nod_ang = 0;
+ #declare shake_ang = 0;
+ #declare left_wrist_pos = left_shoulder_pos-arm_length*y;
+ #declare right_wrist_pos = right_shoulder_pos-arm_length*y;
+
+ #else#if (playerKilled)
+
+ #local leg_ang = killed_leg_ang/2;
+
+ #local aux_len_1 = sqrt(pow(leg_length,2)-pow(hip_rad-ankle_rad,2));
+ #local aux_ang_1 = radians(killed_leg_ang)/2;
+ #local aux_ang_2 = radians(killed_back_ang);
+
+ #declare left_ankle_pos =
+ <hip_width/2+sin(aux_ang_1)*aux_len_1,
+ ankle_rad,
+ -cos(aux_ang_1)*aux_len_1/2>;
+ #declare right_ankle_pos = left_ankle_pos*<-1,1,1>;
+ #declare hip_pos = <0,hip_rad,cos(aux_ang_1)*aux_len_1/2>;
+ #declare left_hip_pos = hip_pos+hip_width/2*x;
+ #declare right_hip_pos = hip_pos-hip_width/2*x;
+ #declare neck_pos = hip_pos+<0,cos(aux_ang_2),-sin(aux_ang_2)>*back_length;
+ #declare left_shoulder_pos = neck_pos+shoulder_width/2*x;
+ #declare right_shoulder_pos = neck_pos-shoulder_width/2*x;
+ #declare nod_ang = killed_nod_ang;
+ #declare shake_ang = 0;
+ #declare left_wrist_pos = (left_shoulder_pos.y>arm_length+wrist_rad ?
+ left_shoulder_pos-arm_length*y :
+ <left_shoulder_pos.x
+ +sqrt(pow(arm_length,2)-pow(left_shoulder_pos.y-wrist_rad,2)),
+ wrist_rad,left_shoulder_pos.z>)
+ #declare right_wrist_pos = (right_shoulder_pos.y>arm_length+wrist_rad ?
+ right_shoulder_pos-arm_length*y :
+ <right_shoulder_pos.x
+ -sqrt(pow(arm_length,2)-pow(right_shoulder_pos.y-wrist_rad,2)),
+ wrist_rad,right_shoulder_pos.z>)
+
+ #else#if (playerLosing)
+
+ #local aux_len_1 = ankle_rad+hip_rad;
+ #local aux_ang_1 =
+ asin((ankle_rad-knee_rad)/lower_leg_length)+
+ acos((pow(lower_leg_length,2)+pow(aux_len_1,2)-pow(upper_leg_length,2))
+ / (2*lower_leg_length*aux_len_1));
+ #local aux_ang_2 = radians(losing_back_ang);
+
+ #declare left_ankle_pos = <hip_width/2,ankle_rad,cos(aux_ang_1)*aux_len_1>;
+ #declare right_ankle_pos = left_ankle_pos*<-1,1,1>;
+ #declare hip_pos = <0,sin(aux_ang_1)*aux_len_1+ankle_rad,0>;
+ #declare left_hip_pos = hip_pos+hip_width/2*x;
+ #declare right_hip_pos = hip_pos-hip_width/2*x;
+ #declare neck_pos = hip_pos+<0,cos(aux_ang_2),-sin(aux_ang_2)>*back_length;
+ #declare left_shoulder_pos = neck_pos+shoulder_width/2*x;
+ #declare right_shoulder_pos = neck_pos-shoulder_width/2*x;
+ #declare nod_ang = (losing_max_nod_ang+losing_min_nod_ang +
+ cos(pi*playerLosingTime)*(losing_max_nod_ang-losing_min_nod_ang))/2;
+ #declare shake_ang = cos(pi*playerLosingTime)*losing_shake_ang/2;
+ #declare left_wrist_pos = neck_pos+vrotate(vrotate(
+ left_eye_pos+left_eye_normal*wrist_rad,
+ shake_ang*y),
+ -(losing_back_ang+nod_ang)*x);
+ #declare right_wrist_pos = neck_pos+vrotate(vrotate(
+ (left_eye_pos+left_eye_normal*wrist_rad)*<-1,1,1>,
+ shake_ang*y),
+ -(losing_back_ang+nod_ang)*x);
+
+ #else // playerWinning
+
+ #declare aux_len_1 = cos(pi*playerWinningTime)*winning_jump_height;
+
+ #declare left_ankle_pos = <hip_width/2,ankle_rad+max(0,aux_len_1),0>;
+ #declare right_ankle_pos = left_ankle_pos*<-1,1,1>;
+ #declare hip_pos = <0,standing_hip_height+aux_len_1,0>;
+ #declare left_hip_pos = hip_pos+hip_width/2*x;
+ #declare right_hip_pos = hip_pos-hip_width/2*x;
+ #declare neck_pos = hip_pos+back_length*y;
+ #declare left_shoulder_pos = neck_pos+shoulder_width/2*x;
+ #declare right_shoulder_pos = neck_pos-shoulder_width/2*x;
+ #declare nod_ang = 0;
+ #declare shake_ang = 0;
+ #declare left_wrist_pos = left_shoulder_pos +
+ (cos(pi*playerWinningTime)*(arm_length-wrist_rad-shoulder_rad)+
+ arm_length+wrist_rad+shoulder_rad)/2*y;
+ #declare right_wrist_pos = right_shoulder_pos +
+ (cos(pi*playerWinningTime)*(arm_length-wrist_rad-shoulder_rad)+
+ arm_length+wrist_rad+shoulder_rad)/2*y;
+
+ #end#end#end#end
+
+ #declare left_leg_length = vlength(left_hip_pos-left_ankle_pos);
+ #declare right_leg_length = vlength(right_hip_pos-right_ankle_pos);
+/*
+ ...ang_1: angle between upper leg and line ankle-hip.
+ ...ang_2: angle at knee.
+ ...ang_3: angle between upper leg and -y.
+*/
+ #local left_leg_aux_ang_1 = degrees(acos(
+ (pow(left_leg_length,2)+pow(upper_leg_length,2)-pow(lower_leg_length,2))
+ / (2*left_leg_length*upper_leg_length)));
+ #local left_leg_aux_ang_2 = degrees(acos(
+ (pow(upper_leg_length,2)+pow(lower_leg_length,2)-pow(left_leg_length,2))
+ / (2*upper_leg_length*lower_leg_length)));
+ #local left_leg_aux_ang_3 = degrees(atanf(
+ left_hip_pos.z-left_ankle_pos.z,
+ left_hip_pos.y-left_ankle_pos.y));
+ #local right_leg_aux_ang_1 = degrees(acos(
+ (pow(right_leg_length,2)+pow(upper_leg_length,2)-pow(lower_leg_length,2))
+ / (2*right_leg_length*upper_leg_length)));
+ #local right_leg_aux_ang_2 = degrees(acos(
+ (pow(upper_leg_length,2)+pow(lower_leg_length,2)-pow(right_leg_length,2))
+ / (2*upper_leg_length*lower_leg_length)));
+ #local right_leg_aux_ang_3 = degrees(atanf(
+ right_hip_pos.z-right_ankle_pos.z,
+ right_hip_pos.y-right_ankle_pos.y));
+
+ #declare left_knee_pos = left_hip_pos +
+ vrotate(vrotate(-upper_leg_length*y,
+ (left_leg_aux_ang_1+left_leg_aux_ang_3)*x),
+ -leg_ang*y);
+ #declare right_knee_pos = right_hip_pos +
+ vrotate(vrotate(-upper_leg_length*y,
+ (right_leg_aux_ang_1+right_leg_aux_ang_3)*x),
+ leg_ang*y);
+ #declare left_lower_leg_trans = transform {
+ rotate (left_leg_aux_ang_1+left_leg_aux_ang_2+left_leg_aux_ang_3-180)*x
+ rotate -leg_ang*y
+ translate left_knee_pos
+ }
+ #declare left_upper_leg_trans = transform {
+ rotate (left_leg_aux_ang_1+left_leg_aux_ang_3)*x
+ rotate -leg_ang*y
+ translate left_hip_pos
+ }
+ #declare right_lower_leg_trans = transform {
+ rotate
+ (right_leg_aux_ang_1+right_leg_aux_ang_2+right_leg_aux_ang_3-180)*x
+ rotate leg_ang*y
+ translate right_knee_pos
+ }
+ #declare right_upper_leg_trans = transform {
+ rotate (right_leg_aux_ang_1+right_leg_aux_ang_3)*x
+ rotate leg_ang*y
+ translate right_hip_pos
+ }
+
+ #local back_ang = degrees(atanf(hip_pos.z-neck_pos.z,neck_pos.y-hip_pos.y));
+
+ #declare back_trans = transform {
+ rotate -back_ang*x
+ translate neck_pos
+ }
+
+ #declare head_trans = transform {
+ rotate shake_ang*y
+ rotate -(back_ang+nod_ang)*x
+ translate neck_pos
+ }
+
+ #local left_arm_vec = left_wrist_pos-left_shoulder_pos;
+ #local left_arm_length = vlength(left_arm_vec);
+ #local right_arm_vec = right_wrist_pos-right_shoulder_pos;
+ #local right_arm_length = vlength(right_arm_vec);
+/*
+ ...ang_1: angle between upper arm and line wrist-shoulder.
+ ...ang_2: angle at elbow.
+ ...ang_3: angle between line wrist-shoulder and plane y/z.
+ ...ang_4: angle between -y and line wrist-shoulder.
+*/
+ #local left_arm_aux_ang_1 = degrees(acos(
+ (pow(left_arm_length,2)+pow(upper_arm_length,2)-pow(lower_arm_length,2))
+ / (2*left_arm_length*upper_arm_length)));
+ #local left_arm_aux_ang_2 = degrees(acos(
+ (pow(upper_arm_length,2)+pow(lower_arm_length,2)-pow(left_arm_length,2))
+ / (2*upper_arm_length*lower_arm_length)));
+ #local left_arm_aux_ang_3 = -degrees(atanf(
+ left_arm_vec.x,
+ vlength(left_arm_vec*<0,1,1>)));
+ #local left_arm_aux_ang_4 = degrees(atanf(
+ -left_arm_vec.z,
+ -left_arm_vec.y));
+ #local right_arm_aux_ang_1 = degrees(acos(
+ (pow(right_arm_length,2)+pow(upper_arm_length,2)-pow(lower_arm_length,2))
+ / (2*right_arm_length*upper_arm_length)));
+ #local right_arm_aux_ang_2 = degrees(acos(
+ (pow(upper_arm_length,2)+pow(lower_arm_length,2)-pow(right_arm_length,2))
+ / (2*upper_arm_length*lower_arm_length)));
+ #local right_arm_aux_ang_3 = degrees(atanf(
+ right_arm_vec.x,
+ vlength(right_arm_vec*<0,1,1>)));
+ #local right_arm_aux_ang_4 = degrees(atanf(
+ -right_arm_vec.z,
+ -right_arm_vec.y));
+
+ #declare left_elbow_pos = left_shoulder_pos + vrotate(vrotate(vrotate(
+ -upper_arm_length*y,
+ -left_arm_aux_ang_1*x),
+ -left_arm_aux_ang_3*z),
+ left_arm_aux_ang_4*x);
+ #declare right_elbow_pos = right_shoulder_pos + vrotate(vrotate(vrotate(
+ -upper_arm_length*y,
+ -right_arm_aux_ang_1*x),
+ right_arm_aux_ang_3*z),
+ right_arm_aux_ang_4*x);
+ #declare left_upper_arm_trans = transform {
+ rotate -left_arm_aux_ang_1*x
+ rotate -left_arm_aux_ang_3*z
+ rotate left_arm_aux_ang_4*x
+ translate left_shoulder_pos
+ }
+ #declare left_lower_arm_trans = transform {
+ rotate (180-left_arm_aux_ang_2-left_arm_aux_ang_1)*x
+ rotate -left_arm_aux_ang_3*z
+ rotate left_arm_aux_ang_4*x
+ translate left_elbow_pos
+ }
+ #declare right_upper_arm_trans = transform {
+ rotate -right_arm_aux_ang_1*x
+ rotate right_arm_aux_ang_3*z
+ rotate right_arm_aux_ang_4*x
+ translate right_shoulder_pos
+ }
+ #declare right_lower_arm_trans = transform {
+ rotate (180-right_arm_aux_ang_2-right_arm_aux_ang_1)*x
+ rotate right_arm_aux_ang_3*z
+ rotate right_arm_aux_ang_4*x
+ translate right_elbow_pos
+ }
+
+#end
+
+
+
+#end
+
--- xblast-tnt-models-20050106.orig/debian/sprites/include/LoseFluidly.pov
+++ xblast-tnt-models-20050106/debian/sprites/include/LoseFluidly.pov
@@ -0,0 +1,32 @@
+#include "colors.inc"
+#include "textures.inc"
+#include "frame_defaults.inc"
+
+#declare helmetColor = color rgb <0.7,0.3,0>;
+#declare faceColor = color rgb <1,0.6,0.3>;
+#declare bodyColor = color rgb <0,0,1>;
+#declare handsFeetColor = color rgb <1,1,0>;
+#declare armsLegsColor = color rgb <0,1,1>;
+#declare backpackColor = color rgb <1,0,1>;
+
+#declare playerLosing = 1;
+
+#declare playerLosingTime = clock*2;
+#if (playerLosingTime>1)
+ #declare playerLosingTime=2-playerLosingTime;
+#end
+
+object {
+ #declare playerAngle = 45;
+ #include "XBlast Robot.inc"
+ translate <-2,0,0>
+}
+object {
+ #declare playerAngle = 0;
+ #include "XBlast Robot.inc"
+ translate <2,0,0>
+}
+
+#declare camereUp = 6.0;
+#declare cameraRight = 8.0;
+#include "world.inc"
--- xblast-tnt-models-20050106.orig/debian/sprites/include/WalkFluidly.pov
+++ xblast-tnt-models-20050106/debian/sprites/include/WalkFluidly.pov
@@ -0,0 +1,32 @@
+#include "colors.inc"
+#include "textures.inc"
+#include "frame_defaults.inc"
+
+#declare helmetColor = color rgb <0.7,0.3,0>;
+#declare faceColor = color rgb <1,0.6,0.3>;
+#declare bodyColor = color rgb <0,0,1>;
+#declare handsFeetColor = color rgb <1,1,0>;
+#declare armsLegsColor = color rgb <0,1,1>;
+#declare backpackColor = color rgb <1,0,1>;
+
+#declare playerWalking = 1;
+
+#declare playerWalkingTime = clock;
+
+object {
+ #declare playerAngle = 45;
+ #include "XBlast Robot.inc"
+ translate <-2,0,0>
+}
+object {
+ #declare playerAngle = 90;
+ #include "XBlast Robot.inc"
+ translate <0,-2,2>
+ rotate 90*x
+ rotate 45*y
+ translate <2,2,-2>
+}
+
+#declare camereUp = 6.0;
+#declare cameraRight = 8.0;
+#include "world.inc"
--- xblast-tnt-models-20050106.orig/debian/sprites/include/WinFluidly.pov
+++ xblast-tnt-models-20050106/debian/sprites/include/WinFluidly.pov
@@ -0,0 +1,32 @@
+#include "colors.inc"
+#include "textures.inc"
+#include "frame_defaults.inc"
+
+#declare helmetColor = color rgb <0.7,0.3,0>;
+#declare faceColor = color rgb <1,0.6,0.3>;
+#declare bodyColor = color rgb <0,0,1>;
+#declare handsFeetColor = color rgb <1,1,0>;
+#declare armsLegsColor = color rgb <0,1,1>;
+#declare backpackColor = color rgb <1,0,1>;
+
+#declare playerWinning = 1;
+
+#declare playerWinningTime = clock*2;
+#if (playerWinningTime>1)
+ #declare playerWinningTime=2-playerWinningTime;
+#end
+
+object {
+ #declare playerAngle = 45;
+ #include "XBlast Robot.inc"
+ translate <-2,0,0>
+}
+object {
+ #declare playerAngle = 0;
+ #include "XBlast Robot.inc"
+ translate <2,0,0>
+}
+
+#declare camereUp = 6.0;
+#declare cameraRight = 8.0;
+#include "world.inc"
--- xblast-tnt-models-20050106.orig/debian/sprites/include/WinFluidly.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/WinFluidly.ini
@@ -0,0 +1,7 @@
+Input_File_Name=WinFluidly.pov
+Width=256
+Height=192
+Initial_Frame=1
+Final_Frame=20
+Cyclic_Animation=1
+Output_File_Type=P
--- xblast-tnt-models-20050106.orig/debian/sprites/include/LoseFluidly.ini
+++ xblast-tnt-models-20050106/debian/sprites/include/LoseFluidly.ini
@@ -0,0 +1,7 @@
+Input_File_Name=LooseFluidly.pov
+Width=256
+Height=192
+Initial_Frame=1
+Final_Frame=20
+Cyclic_Animation=1
+Output_File_Type=P
--- xblast-tnt-models-20050106.orig/debian/sprites/include/postproc.sh
+++ xblast-tnt-models-20050106/debian/sprites/include/postproc.sh
@@ -0,0 +1,72 @@
+set -e
+
+if [ "$#" != "4" ] ; then
+ echo "postproc.sh {lo,hi} <filename> <scenename> <framenumber>"
+ exit 10
+fi
+
+echo
+echo "postproc.sh | $1 | $2 | $3 | $4 |"
+
+case "$1" in
+ big)
+ CATFILE="cat $2"
+ ;;
+ qu*)
+ CATFILE="cat $2"
+ ;;
+ lo*)
+ CATFILE="cat $2"
+ ;;
+ hi*)
+ CATFILE="pnmscale 0.5 $2"
+ ;;
+ *) echo "unknown quality identifier '$1'"
+ exit 1
+esac
+
+PART=$(( (($4 - 1) % 3)+1 ))
+RUN=$(( ($4 - 1) / 3))
+
+echo "guessing part $PART of run $RUN"
+
+case "$3" in
+ *Special*)
+ case "$RUN" in
+ 0) NAME=L ; EPMCUT="pnmcut 0 24 64 66";;
+ 1) NAME=L1 ; EPMCUT="pnmcut 0 24 64 66";;
+ 2) NAME=L2 ; EPMCUT="pnmcut 0 24 64 66";;
+ 3) NAME=W ; EPMCUT="pnmcut 0 12 64 78";;
+ 4) NAME=W2 ; EPMCUT="pnmcut 0 12 64 78";;
+ 5) NAME=W3 ; EPMCUT="pnmcut 0 18 64 72";;
+ 6) NAME=DD ; EPMCUT="pnmcut 0 24 64 72";;
+ 7) NAME=DL ; EPMCUT="pnmcut 0 36 64 60";;
+ 8) NAME=DU ; EPMCUT="pnmcut 0 42 64 48";;
+ 9) NAME=DR ; EPMCUT="pnmcut 0 36 64 60";;
+ esac
+ ;;
+ *Animation*)
+ case $(( $RUN / 5 )) in
+ 0) NAME=D ; EPMCUT="pnmcut 0 18 64 78";;
+ 1) NAME=L ; EPMCUT="pnmcut 0 24 64 72";;
+ 2) NAME=U ; EPMCUT="pnmcut 0 24 64 66";;
+ 3) NAME=R ; EPMCUT="pnmcut 0 24 64 66";;
+ esac
+ case $(( $RUN % 5 )) in
+ 0) NAME=${NAME}_S ;;
+ 1) NAME=${NAME}_0 ;;
+ 2) NAME=${NAME}_1 ;;
+ 3) NAME=${NAME}_2 ;;
+ 4) NAME=${NAME}_3 ;;
+ esac
+ ;;
+ *Winner*)
+ NAME=B ; EPMCUT="pnmcut 0 30 128 152"
+ ;;
+ *) echo "Unknown scene name!" >&2
+ ;;
+esac
+
+echo "$CATFILE | $EPMCUT |gzip > ${DESTNAME}_${NAME}_${PART}.ppm.gz"
+$CATFILE | $EPMCUT |gzip > ${DESTNAME}_${NAME}_${PART}.ppm.gz && rm $2
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/pgmtoepm.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/pgmtoepm.c
@@ -0,0 +1,97 @@
+/*
+ * program pgmtoepm - convert any number of Portable GrayMap to
+ * Extented Pixmap Format epm
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: pgmtoepm.c,v 1.1 1999/04/04 11:48:24 xblast Exp $
+ * $Log: pgmtoepm.c,v $
+ * Revision 1.1 1999/04/04 11:48:24 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __STDC__
+int
+main (int argc,
+ char*argv[])
+#else
+int
+main (argc, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ static char magic[256];
+ int width, height, maxval;
+ int d_width, d_height, d_maxval;
+ int i, n_data;
+ FILE *fp;
+ char dummy;
+ char *buf;
+
+ /* check command line args */
+ if (argc <= 1) {
+ fprintf(stderr, "usage: %s pgmfile [...]\n", argv[0]);
+ return 1;
+ }
+
+ for (i=1; i<argc; i++) {
+ /* open first pgm file */
+ if (NULL == (fp = fopen(argv[i],"r") ) ) {
+ fprintf(stderr, "%s: failed to open file \"%s\"\n", argv[0], argv[i]);
+ return 1;
+ }
+ /* read header */
+ fscanf(fp, "%s %d %d %d%c", magic, &width, &height, &maxval, &dummy);
+ /* compare magic word */
+ if (0 != strcmp("P5",magic)) {
+ fprintf(stderr, "%s: wrong magic word in file \"%s\"\n", argv[0], argv[i]);
+ return 1;
+ }
+ if (i==1) {
+ /* set default values */
+ d_height = height;
+ d_width = width;
+ d_maxval = maxval;
+ n_data = d_width * d_height;
+ /* alloc data buffer */
+ if (NULL == (buf = malloc(n_data*sizeof(char) ) ) ) {
+ fprintf(stderr, "%s: failed to alloc data buffer\n", argv[0]);
+ return 1;
+ }
+ /* write header */
+ printf("PX\n");
+ printf("%d %d %d %d\n", d_width, d_height, d_maxval, argc-1);
+ } else {
+ /* compare with default values */
+ if ( (d_height != height) || (d_width != width) || (d_maxval != maxval) ) {
+ fprintf(stderr, "%s: wrong image dimensions for file \"%s\"\n",
+ argv[0], argv[i]);
+ return 1;
+ }
+ }
+ /* copy data */
+ if (n_data != fread(buf, sizeof(char), n_data, fp) ) {
+ fprintf(stderr, "%s: premature end of file \"%s\"\n", argv[0], argv[1]);
+ return 1;
+ }
+ fwrite (buf, sizeof(char), n_data, stdout);
+ }
+
+ return 0;
+}
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/Makefile
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/Makefile
@@ -0,0 +1,16 @@
+CFLAGS=-g -O2 -Wall -pedantic -DDEBUG
+LDFLAGS=-g -O2
+BININSTDIR=/home/xblast/bin
+#LOADLIBES=-lefence
+
+TARGETS=pgmtoepm epmtopgm epmtoppm epmarrange pbmarrange epmhalf ppmtoepm \
+ epmcompress epmuncompress epmcompress2
+
+all: $(TARGETS)
+
+install: all
+ $(foreach prg,$(TARGETS),install -m 755 -c $(prg) $(BININSTDIR); )
+
+clean:
+ rm -f $(TARGETS) core *~ *.o
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/epmtopgm.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/epmtopgm.c
@@ -0,0 +1,150 @@
+/*
+ * program epmtopgm - convert Extented Pixmap Format epm into
+ * one Portable Graymap per layer
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: epmtopgm.c,v 1.1 1999/04/04 11:46:06 xblast Exp xblast $
+ * $Log: epmtopgm.c,v $
+ * Revision 1.1 1999/04/04 11:46:06 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __STDC__
+static char*
+prefix_from_filename (char *filename,
+ char *extension)
+#else
+static char*
+prefix_from_filename (filename, extension)
+ char *filename, extension;
+#endif
+{
+ int flength, xlength;
+ char *dest;
+
+ flength = strlen(filename);
+ xlength = strlen (extension);
+
+ if ( (flength >= xlength) &&
+ (0 == strcmp(filename + (flength - xlength), extension)) ) {
+ /* cut away extension */
+ flength -= xlength;
+ }
+
+ /* duplicate string */
+ if (NULL == (dest = malloc((flength+1)*sizeof(char) ) ) ) {
+ return NULL;
+ }
+
+ strncpy (dest, filename, flength);
+ dest[flength]=0;
+
+ return dest;
+}
+
+#ifdef __STDC__
+int
+main (int argc,
+ char*argv[])
+#else
+int
+main (argc, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ char *prefix;
+ FILE *fin, *fout;
+ char magic[256];
+ char outfile[1024];
+ int width, height, depth, maxval;
+ int layer, n_pixel;
+ char *buf;
+
+ /* check commandline args */
+ if ( (1 == argc) || ( (2 == argc) && (0 == strcmp(argv[1], "-") ) ) ) {
+ /* read from stdin */
+ fin = stdin;
+ prefix = "noname";
+ } else if ( (2 == argc) && (0 != strcmp(argv[1],"-?") ) ) {
+ if (NULL == (fin = fopen(argv[1],"r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for reading\n",
+ argv[0], argv[1]);
+ return 1;
+ }
+ prefix = prefix_from_filename (argv[1], ".epm");
+ } else {
+ fprintf(stderr, "usage: %s [epmfile]\n", argv[0]);
+ return (argc != 2);
+ }
+
+ /* read header */
+ if (5 != fscanf(fin, "%s%d%d%d%d%*c", magic,&width,&height,&maxval,&depth) ) {
+ fprintf(stderr, "%s: Failed to read epm header\n",argv[0]);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"PX")) {
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n",argv[0],magic);
+ return 1;
+ }
+
+ /* calc number of pixel per layer */
+ n_pixel = width*height;
+
+ /* alloc buffer */
+ if (NULL == (buf = malloc(n_pixel*sizeof(char) ) ) ) {
+ fprintf(stderr, "%s: Failed to alloc buffer\n",argv[0]);
+ return 1;
+ }
+
+ for (layer=1; layer<=depth; layer++) {
+ /* read one layer */
+ if (n_pixel != fread (buf, sizeof(char), n_pixel, fin) ) {
+ perror(argv[0]);
+ return 1;
+ }
+ /* open output file */
+ sprintf(outfile, "%s.%d", prefix, layer);
+ if (NULL == (fout = fopen(outfile, "w") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for writing\n",
+ argv[0], outfile);
+ return 1;
+ }
+ /* write header */
+ fprintf(fout, "P5\n");
+ fprintf(fout, "%d %d %d\n", width, height, maxval);
+ /* write pixel data */
+ if (n_pixel != fwrite (buf, sizeof(char), n_pixel, fout) ) {
+ perror(argv[0]);
+ return 1;
+ }
+ if (fout != stdout) {
+ fclose(fout);
+ }
+ }
+
+ if (fout != stdin) {
+ fclose(fin);
+ }
+ free(buf);
+
+ return 0;
+}
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/COPYING
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/epmtoppm.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/epmtoppm.c
@@ -0,0 +1,253 @@
+/*
+ * program epmtoppm - convert Extented Pixmap Format epm into a PPM
+ * colorizing each layer
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: epmtoppm.c,v 1.1 1999/04/04 11:46:59 xblast Exp $
+ * $Log: epmtoppm.c,v $
+ * Revision 1.1 1999/04/04 11:46:59 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifndef RGB_TXT
+#define RGB_TXT "/usr/lib/X11/rgb.txt"
+#endif
+
+struct color {
+ unsigned red, green, blue;
+};
+
+#ifdef __STDC__
+int
+parse_color (struct color *col,
+ char *name)
+#else
+int
+parse_color (col, name)
+ struct color *col;
+ char *name;
+#endif
+{
+ FILE *fp;
+ static char line[1024];
+ int i, l_len;
+ char *ptr;
+
+ /* check if in rgb format */
+ if (0 == strncmp(name, "rgb:", 4)) {
+ sscanf(name+4,"%x/%x/%x",(&col->red),&(col->green),&(col->blue));
+#ifdef DEBUG
+ fprintf(stderr, "RGB=%d,%d,%d\n",col->red,col->green,col->blue);
+#endif
+ switch (strlen(name)) {
+ case 9:
+ /* 1 digit */
+ col->red = 255*col->red / 15;
+ col->green = 255*col->green / 15;
+ col->blue = 255*col->blue / 15;
+ break;
+ case 12:
+ /* 2 digits */
+ col->red = col->red;
+ col->green = col->green;
+ col->blue = col->blue;
+ break;
+ case 15:
+ /* 3 digits */
+ col->red = col->red >>4;
+ col->green = col->green >>4;
+ col->blue = col->blue >>4;
+ break;
+ case 18:
+ /* 3 digits */
+ col->red = col->red >>8;
+ col->green = col->green >>8;
+ col->blue = col->blue >>8;
+ break;
+ default:
+ return 1;
+ }
+#ifdef DEBUG
+ fprintf(stderr, "RGB=%04x,%04x,%04x\n",col->red,col->green,col->blue);
+#endif
+ return 0;
+ }
+
+ if (NULL == (fp = fopen(RGB_TXT, "r" ) ) ) {
+ fprintf(stderr, "failed to open rgb file %s\n", RGB_TXT);
+ return -1;
+ }
+
+ while (! feof(fp) ) {
+ /* read one line */
+ fgets(line, sizeof(line), fp);
+ /* remove trailing end of line */
+ l_len = strlen(line)-1;
+ line[l_len]='\0';
+ /* find start of color name */
+ ptr = line;
+ /* skip the three rgb values */
+ for (; !isdigit(((int)*ptr)); ptr++);
+ for (i=0; i<3; i++) {
+ for (; isdigit(((int)*ptr)); ptr++);
+ for (; !isalnum(((int)*ptr)); ptr++);
+ }
+ /* compare end of line with color name */
+ if (0 == strcasecmp (ptr, name) ) {
+ /* get rgb values */
+ if (3 != sscanf(line, "%d%d%d", &(col->red), &(col->green),
+ &(col->blue) ) ) {
+ fprintf(stderr, "failed to parse rgb.txt line:\n");
+ fprintf(stderr, line);
+ continue;
+ }
+ fclose(fp);
+ return 0;
+ }
+ }
+ fclose(fp);
+ return 1;
+}
+
+
+#ifdef __STDC__
+int
+main (int argc,
+ char *argv[])
+#else
+int
+main (argv, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ FILE *fp;
+ int width, height, maxval, depth;
+ int i,j, layer, n_pixel;
+ unsigned char *inbuf, *outbuf;
+ struct color *col = NULL;
+ char magic[256];
+ unsigned red,green,blue;
+
+ /* check args (part one) */
+ if ( (argc < 2) || (0 == strcmp(argv[1],"-?") ) ) {
+ fprintf(stderr, "usage: %s epmfile color ...\n", argv[0]);
+ return (argc != 2);
+ }
+
+ /* open file */
+ if (0 == strcmp(argv[1],"-")) {
+ fp = stdin;
+ } else {
+ if (NULL == (fp = fopen(argv[1],"r") ) ) {
+ fprintf(stderr, "%s: faile to open file %s for reading\n",
+ argv[0], argv[1]);
+ return 1;
+ }
+ }
+
+ /* read header */
+ if (5 != fscanf(fp, "%s%d%d%d%d%*c", magic,&width,&height,&maxval,&depth) ) {
+ fprintf(stderr, "%s: Failed to read epm header\n",argv[0]);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"PX")) {
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n",argv[0],magic);
+ return 1;
+ }
+
+ /* compare depth oto number of colors given */
+ if ((argc - 2) > depth) {
+ fprintf(stderr, "%s: warning, to many colors given\n", argv[0]);
+ } else if ((argc - 2) < depth) {
+ fprintf(stderr, "%s: warning, not enough colors given, using black\n",
+ argv[0]);
+ depth = argc-2;
+ }
+
+ /* calc number of pixel per layer */
+ n_pixel = width*height;
+
+ /* alloc input and color buffer */
+ if ( (NULL == (inbuf = malloc(depth*n_pixel*sizeof(char) ) ) ) ||
+ (NULL == (outbuf = calloc(3*n_pixel,sizeof(char) ) ) ) ||
+ (NULL == (col = calloc(depth,sizeof(struct color) ) ) ) ) {
+ fprintf(stderr, "%s: Failed to alloc buffer\n",argv[0]);
+ return 1;
+ }
+
+ /* read epm data */
+ if (depth*n_pixel != fread(inbuf, sizeof(char), depth*n_pixel, fp) ) {
+ perror(argv[0]);
+ return 1;
+ }
+
+ if (fp != stdin) {
+ fclose(fp);
+ }
+
+ for (layer=0; layer < depth; layer++) {
+ if (parse_color (col+layer, argv[2+layer]) ) {
+ fprintf(stderr, "%s: unkown color %s\n", argv[0], argv[2+layer]);
+ return 1;
+ }
+ }
+
+ /* convert pixel data */
+ for (i=0, j=0; i<n_pixel; i++, j+=3) {
+ red=0;
+ green=0;
+ blue=0;
+ for (layer=0; layer < depth; layer++) {
+ red += col[layer].red * inbuf[layer*n_pixel+i];
+ green += col[layer].green * inbuf[layer*n_pixel+i];
+ blue += col[layer].blue * inbuf[layer*n_pixel+i];
+ }
+ if (red > maxval*255) {
+ outbuf[j] = 255;
+ } else {
+ outbuf[j] = red/maxval;
+ }
+ if (green > maxval*255) {
+ outbuf[j+1] = 255;
+ } else {
+ outbuf[j+1] = green/maxval;
+ }
+ if (blue > maxval*255) {
+ outbuf[j+2] = 255;
+ } else {
+ outbuf[j+2] = blue/maxval;
+ }
+ }
+
+ /* write header */
+ printf("P6\n");
+ printf("%d %d %d\n", width, height, maxval);
+ /* write pixel data */
+ if (3*n_pixel != fwrite (outbuf, sizeof(char), 3*n_pixel, stdout) ) {
+ perror(argv[0]);
+ return 1;
+ }
+
+ return 0;
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/README
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/README
@@ -0,0 +1,112 @@
+EPMTOOLS
+
+1. Conversion tools
+
+ These are a set of tools to convert epm-files to portable grey- and
+ pixmaps for manipulation with the netpbm/pbmplus tools. These tools
+ only work with the uncompressed epm format.
+
+1.1 epmtopgm
+
+ usage: epmtopgm [epmfile]
+
+ Converts each layer of the given epmfile to a portable greymap (pgm).
+ When noch epmfile is given, epmtopgm reads from standard in.
+
+1.2 epmtopm
+
+ usage: epmtoppm epmfile color [...]
+
+ Converts the given epmfile to a portable pixmap (ppm). For color
+ must be specified for each layer of the epmfile one. The colors
+ can be either given by name (parsed from /usr/X11/lib/rgb.txt)
+ or in rgb:#/#/# format (where # is a 1-4 digit hexadecimal
+ number). Specify "-" for the epmfile file to read it from standard
+ input.
+
+1.3 pgmtoepm
+
+ usage: pgmtopm pgmfile [...]
+
+ Converts a set of portable greymaps to an epmfile. The pgm files
+ must be of the same size and depth. The result is written to
+ the standard output. Specify "-" for the pgmfile file to read it
+ from standard input.
+
+1.4 ppmtopepm
+
+ usage: ppmtoepm [-cch|-rgb] [ppmfile [epmfile]]
+
+ Converts a portable pixmap to an epmfile. If no epmfile is specified
+ the result will be written to standard output. If no no ppmfile is
+ specified it will be read from standard input. The pimxap can be
+ interpreted as an "normal" rgb-pixmap and will be separated into a
+ red, a blue and green layer (-rgb, default). Use -cch to convert
+ convert recolorable xblast block tiles into an epm. These blocks
+ are always rendered in red and green. In order convert them to
+ "colored" pixmap use:
+
+ ppmtoepm -cch tile.ppm | epmtoppm - color1 color2 White >new.ppm
+
+
+2.0 Compression
+
+ I have included a simple runlength encoding into the epm format.
+
+2.1 epmcompress
+
+ usage: epmcompress epmfile [...]
+
+ First RLE algorithm, only compresses sequences of 0s in an epmfile.
+ Every epmfile given as argument will be compressed to this format.
+ A backup of the orignal will be keeped with a trailing ~.
+
+2.2 epmcompress2
+
+ usage: epmcompress2 epmfile [...]
+
+ Second RLE algorithm, only compresses sequences of any number in an
+ epmfile. Better for the sprite bitmaps with their grey background.
+ Alas it is currenlty not supported by xblast. Every epmfile given as
+ argument will be compressed to this format. A backup of the orignal
+ will be keeped with a trailing ~.
+
+2.3 epmuncompress epmfile [...]
+
+ Converts the given epmfiles to uncompressed format. Only the first
+ format (epmcompress) is supported.
+
+
+3. Other Tools
+
+3.1. epmarrange
+
+ usage: epmarrange [datafile [outputfile]]
+
+ Creates one big epm file by placing the epmfiles specified in the
+ datafile at given position. (Can be used to put all sprite image
+ into one file). If outputfile is ommitted the result will be written
+ to standard output. If the datafile is ommitted it will be read from
+ standard input. The datafile has one line per epmfile to be used,
+ each of the following format:
+
+ xpos ypos epmfile.
+
+2.2 pbmarrange
+
+ usage: epmarrange [datafile [outputfile]]
+
+ As epmarrange, but arranges portable bitmaps. (Useful for arranging
+ sprite masks).
+
+2.3 epmhalf
+
+ usage: epmhalf [input [output]]
+
+ Creates an epmfile half as wide and as high as the orignal.
+ If output is omitted the result is written to standard output.If
+ input is omitted the result is written to standard input.
+
+
+
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/epmarrange.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/epmarrange.c
@@ -0,0 +1,372 @@
+/*
+ * program epmarrange - arrange several epm files on a canvas
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: epmarrange.c,v 1.1 1999/04/04 11:44:46 xblast Exp $
+ * $Log: epmarrange.c,v $
+ * Revision 1.1 1999/04/04 11:44:46 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * some type defintions
+ */
+typedef struct _epm_file {
+ unsigned x, y;
+ unsigned width, height;
+ unsigned maxval, depth;
+ unsigned npixel;
+ long offset;
+ char *fname;
+ char *line;
+ struct _epm_file * next;
+} EpmFile;
+
+typedef struct _epm_data {
+ unsigned width, height;
+ unsigned maxval, depth;
+ unsigned npixel;
+ char *layer;
+} EpmData;
+
+/*
+ * local variables
+ */
+static char *progname;
+
+/*
+ * parse_input: parse the input file for epmfile names and positions
+ */
+#ifdef __STDC__
+static EpmFile *
+parse_input (char *filename)
+#else
+static EpmFile *
+parse_input (filename)
+ char *filename;
+#endif
+{
+ FILE *fp;
+ static char line[1024];
+ static char epmname[1024];
+ unsigned x, y;
+ EpmFile *new, *last = NULL, *root = NULL;
+
+ if ( (NULL == filename) || (0 == strcmp (filename, "-") ) ) {
+ /* use stdin */
+ fp = stdin;
+ } else {
+ if (NULL == (fp = fopen(filename, "r") ) ) {
+ perror(progname);
+ return NULL;
+ }
+ }
+
+ while (NULL != fgets(line, sizeof(line), fp) ) {
+ if (3 == sscanf(line, "%u %u %s", &x, &y, epmname) ) {
+ if ( (NULL == (new = (EpmFile *) malloc(sizeof(EpmFile) ) ) ) ||
+ (NULL == (new->fname = (char *) malloc(strlen(epmname)+1) ) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return NULL;
+ }
+ /* set entries */
+ new->x = x;
+ new->y = y;
+ strcpy(new->fname, epmname);
+#ifdef DEBUG
+ fprintf(stderr, "EPM %s at (%u,%u)\n", new->fname, new->x, new->y);
+#endif
+ if (root == NULL) {
+ root = last = new;
+ } else {
+ last->next = new;
+ last = new;
+ }
+ }
+ }
+ return root;
+}
+
+#ifdef __STDC__
+static int
+check_epm (EpmFile *epm)
+#else
+static int
+check_epm (epm)
+ EpmFile *epm;
+#endif
+{
+ FILE *fp;
+ char magic[256];
+
+ for (; epm != NULL; epm = epm->next) {
+ /* open file */
+ if (NULL == (fp = fopen(epm->fname, "r") ) ) {
+ perror(progname);
+ return 1;
+ }
+ /* read header */
+ if (5 != fscanf(fp, "%s%d%d%d%d%*c", magic, &(epm->width), &(epm->height),
+ &(epm->maxval), &(epm->depth) ) ) {
+ fprintf(stderr, "%s: Failed to read epm header\n",progname);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"PX")) {
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n", progname, magic);
+ return 1;
+ }
+ /* get offset of pixel data */
+ epm->offset = ftell(fp);
+ /* close file */
+ fclose(fp);
+ /* alloc line buffer */
+ if (NULL == (epm->line = malloc(epm->width) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return 1;
+ }
+ /* set total number of pixel */
+ epm->npixel = epm->width * epm->height;
+ }
+
+ return 0;
+}
+
+
+#ifdef __STDC__
+static EpmData *
+init_epm (EpmFile *epm)
+#else
+static EpmData *
+init_epm (epm)
+ EpmFile *epm,
+#endif
+{
+ EpmData *new;
+ unsigned w, h;
+
+ if (NULL == (new = calloc(1, sizeof(EpmData) ) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return NULL;
+ }
+
+ for (; epm != NULL; epm = epm->next) {
+ /* new width ? */
+ w = epm->x + epm->width;
+ if (w > new->width) {
+ new->width = w;
+ }
+ /* new height ? */
+ h = epm->y + epm->height;
+ if (h > new->height) {
+ new->height = h;
+ }
+ /* new maxval */
+ if (epm->maxval > new->maxval) {
+ new->maxval = epm->maxval;
+ }
+ /* new depth */
+ if (epm->depth > new->depth) {
+ new->depth = epm->depth;
+ }
+ }
+ new->npixel = new->width * new->height;
+
+ /* alloc one layer */
+ if (NULL == (new->layer = malloc(new->npixel) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return NULL;
+ }
+
+ return new;
+}
+
+#ifdef __STDC__
+static int
+draw_one_layer (EpmData *dst,
+ EpmFile *src,
+ unsigned layer)
+#else
+static int
+draw_one_layer (dst, src, layer)
+ EpmData *dst;
+ EpmFile *src;
+ unsigned layer;
+#endif
+{
+ FILE *fp;
+ char *ptr;
+ unsigned y;
+
+ /* clear it first */
+ memset(dst->layer, 0, src->npixel);
+
+ for (; src != NULL; src = src->next) {
+ if (layer < src->depth) {
+ /* open src file */
+ if (NULL == (fp = fopen(src->fname, "r") ) ) {
+ perror(progname);
+ return 1;
+ }
+ /* skip to layer data */
+ if (0 > fseek(fp, src->offset + layer * src->npixel, SEEK_SET) ) {
+ perror(progname);
+ return 1;
+ }
+ /* draw pixels */
+ ptr = dst->layer + src->x + src->y*dst->width;
+ for (y=0; y<src->height; y++) {
+ /* read line */
+ if (src->width != fread (src->line, 1, src->width, fp) ) {
+ if (feof(fp)) {
+ fprintf(stderr, "%s: premature eof in file %s\n",
+ progname, src->fname);
+ } else {
+ perror(progname);
+ }
+ return 1;
+ }
+ /* copy to dest epm */
+ memcpy (ptr, src->line, src->width);
+ ptr += dst->width;
+ }
+ /* close file */
+ fclose(fp);
+ }
+ }
+ return 0;
+}
+
+#ifdef __STDC__
+static FILE *
+epm_open (EpmData *epm,
+ char *filename)
+#else
+static FILE *
+epm_open (epm, filename)
+ EpmData *epm;
+ char *filename;
+#endif
+{
+ FILE *fp;
+
+ if ( (NULL == filename) || (0 == strcmp (filename, "-") ) ){
+ fp = stdout;
+ } else {
+ if (NULL == (fp = fopen(filename, "w") ) ) {
+ perror(progname);
+ return NULL;
+ }
+ }
+
+ /* write header */
+ fprintf(fp,"PX\n");
+ fprintf(fp,"%u %u %u %u\n", epm->width,epm->height,epm->maxval,epm->depth);
+
+ return fp;
+}
+
+
+#ifdef __STDC__
+static int
+write_layer (FILE *fp,
+ EpmData *epm)
+#else
+static int
+write_layer (fp, epm)
+ FILE *fp;
+ EpmData *epm;
+#endif
+{
+ if (epm->npixel != fwrite(epm->layer, 1, epm->npixel, fp) ) {
+ perror(progname);
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
+/*
+ * the main program
+ */
+
+#ifdef __STDC__
+int
+main (int argc,
+ char *argv[])
+#else
+int
+main (argc, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ char *input = NULL;
+ char *output = NULL;
+ EpmFile *epm_list;
+ EpmData *new_epm;
+ FILE *fp;
+ int layer;
+
+ /* parse commandline args */
+ switch (argc) {
+ /* correct number */
+ case 3:
+ output = argv[2];
+ case 2:
+ input = argv[1];
+ case 1:
+ progname = argv[0];
+ break;
+
+ default:
+ /* print usage message */
+ fprintf(stderr, "usage: %s [datafile [outputfile]]\n", argv[0]);
+ return 1;
+ }
+ /* inits */
+ if (NULL == (epm_list = parse_input(input) ) ) {
+ return 1;
+ }
+ if (check_epm (epm_list) ){
+ return 1;
+ }
+ if (NULL == (new_epm = init_epm(epm_list) ) ) {
+ return 1;
+ }
+ /* open output file */
+ if (NULL == (fp = epm_open(new_epm, output) ) ) {
+ return 1;
+ }
+ for (layer = 0; layer < new_epm->depth; layer++) {
+ if (draw_one_layer(new_epm, epm_list, layer) ) {
+ return 1;
+ }
+ if (write_layer(fp, new_epm) ) {
+ return 1;
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/pbmarrange.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/pbmarrange.c
@@ -0,0 +1,364 @@
+/*
+ * program pbmarrange - arrange several pbm files on a canvas
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: pbmarrange.c,v 1.1 1999/04/04 11:47:56 xblast Exp $
+ * $Log: pbmarrange.c,v $
+ * Revision 1.1 1999/04/04 11:47:56 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * some type defintions
+ */
+typedef struct _pbm_file {
+ unsigned x, y;
+ unsigned wbyte, height;
+ unsigned nbyte;
+ long offset;
+ char *fname;
+ char *line;
+ struct _pbm_file * next;
+} PbmFile;
+
+typedef struct _pbm_data {
+ unsigned wbyte, height;
+ unsigned nbyte;
+ char *data;
+} PbmData;
+
+
+/*
+ * local variables
+ */
+static char *progname;
+
+/*
+ * parse_input: parse the input file for pbmfile names and positions
+ */
+#ifdef __STDC__
+static PbmFile *
+parse_input (char *filename)
+#else
+static PbmFile *
+parse_input (filename)
+ char *filename;
+#endif
+{
+ FILE *fp;
+ static char line[1024];
+ static char pbmname[1024];
+ unsigned x, y;
+ PbmFile *new, *last = NULL, *root = NULL;
+
+ if ( (NULL == filename) || (0 == strcmp (filename, "-") ) ) {
+ /* use stdin */
+ fp = stdin;
+ } else {
+ if (NULL == (fp = fopen(filename, "r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s\n", progname, filename);
+ perror(progname);
+ return NULL;
+ }
+ }
+
+ while (NULL != fgets(line, sizeof(line), fp) ) {
+ if (3 == sscanf(line, "%u %u %s", &x, &y, pbmname) ) {
+ if ( (NULL == (new = (PbmFile *) malloc(sizeof(PbmFile) ) ) ) ||
+ (NULL == (new->fname = (char *) malloc(strlen(pbmname)+1) ) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return NULL;
+ }
+ /* set entries */
+ if (x % 8) {
+ fprintf(stderr, "%s: Warning! unaligned xoffset %d ignored",
+ progname, x);
+ }
+ new->x = x/8;
+ new->y = y;
+ strcpy(new->fname, pbmname);
+ if (root == NULL) {
+ root = last = new;
+ } else {
+ last->next = new;
+ last = new;
+ }
+ }
+ }
+ return root;
+}
+
+
+#ifdef __STDC__
+static int
+check_pbm (PbmFile *pbm)
+#else
+static int
+check_pbm (pbm)
+ PbmFile *pbm;
+#endif
+{
+ FILE *fp;
+ char magic[256];
+
+ for (; pbm != NULL; pbm = pbm->next) {
+ /* open file */
+ if (NULL == (fp = fopen(pbm->fname, "r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s\n", progname, pbm->fname);
+ perror(progname);
+ return 1;
+ }
+ /* read header */
+ if (3 != fscanf(fp, "%s%d%d%*c", magic,&(pbm->wbyte),&(pbm->height) ) ) {
+ fprintf(stderr, "%s: Failed to read pbm header\n",progname);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"P4")) {
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n", progname, magic);
+ return 1;
+ }
+ /* get offset of pixel data */
+ pbm->offset = ftell(fp);
+ /* close file */
+ fclose(fp);
+ /* alloc line buffer */
+ pbm->wbyte /= 8;
+ if (NULL == (pbm->line = malloc(pbm->wbyte) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return 1;
+ }
+ /* set total number of pixel */
+ pbm->nbyte = pbm->wbyte * pbm->height;
+ }
+
+ return 0;
+}
+
+
+
+#ifdef __STDC__
+static PbmData *
+init_pbm (PbmFile *pbm)
+#else
+static PbmData *
+init_pbm (pbm)
+ PbmFile *pbm,
+#endif
+{
+ PbmData *new;
+ unsigned w, h;
+
+ if (NULL == (new = calloc(1, sizeof(PbmData) ) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return NULL;
+ }
+
+ for (; pbm != NULL; pbm = pbm->next) {
+ /* new wbyte ? */
+ w = pbm->x + pbm->wbyte;
+ if (w > new->wbyte) {
+ new->wbyte = w;
+ }
+ /* new height ? */
+ h = pbm->y + pbm->height;
+ if (h > new->height) {
+ new->height = h;
+ }
+ }
+ new->nbyte = new->wbyte * new->height;
+
+ /* alloc one data */
+ if (NULL == (new->data = malloc(new->nbyte) ) ) {
+ fprintf(stderr, "%s: alloc failed\n", progname);
+ return NULL;
+ }
+
+ return new;
+}
+
+
+#ifdef __STDC__
+static int
+draw_data (PbmData *dst,
+ PbmFile *src)
+#else
+static int
+draw_data (dst, src)
+ PbmData *dst;
+ PbmFile *src;
+#endif
+{
+ FILE *fp;
+ char *ptr;
+ unsigned y;
+
+ /* clear it first */
+ memset(dst->data, 0, src->nbyte);
+
+ for (; src != NULL; src = src->next) {
+ /* open src file */
+ if (NULL == (fp = fopen(src->fname, "r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s\n", progname, src->fname);
+ perror(progname);
+ return 1;
+ }
+ /* skip to data data */
+ if (0 > fseek(fp, src->offset, SEEK_SET) ) {
+ perror(progname);
+ return 1;
+ }
+ /* draw pixels */
+ ptr = dst->data + src->x + src->y*dst->wbyte;
+ for (y=0; y<src->height; y++) {
+ /* read line */
+ if (src->wbyte != fread (src->line, 1, src->wbyte, fp) ) {
+ if (feof(fp)) {
+ fprintf(stderr, "%s: premature eof in file %s\n",
+ progname, src->fname);
+ } else {
+ perror(progname);
+ }
+ return 1;
+ }
+ /* copy to dest pbm */
+ memcpy (ptr, src->line, src->wbyte);
+ ptr += dst->wbyte;
+ }
+ /* close file */
+ fclose(fp);
+ }
+ return 0;
+}
+
+
+#ifdef __STDC__
+static FILE *
+pbm_open (PbmData *pbm,
+ char *filename)
+#else
+static FILE *
+pbm_open (pbm, filename)
+ PbmData *pbm;
+ char *filename;
+#endif
+{
+ FILE *fp;
+
+ if ( (NULL == filename) || (0 == strcmp (filename, "-") ) ){
+ fp = stdout;
+ } else {
+ if (NULL == (fp = fopen(filename, "w") ) ) {
+ perror(progname);
+ return NULL;
+ }
+ }
+
+ /* write header */
+ fprintf(fp,"P4\n");
+ fprintf(fp,"%u %u\n", pbm->wbyte*8, pbm->height);
+
+ return fp;
+}
+
+
+#ifdef __STDC__
+static int
+write_data (FILE *fp,
+ PbmData *pbm)
+#else
+static int
+write_data (fp, pbm)
+ FILE *fp;
+ PbmData *pbm;
+#endif
+{
+ if (pbm->nbyte != fwrite(pbm->data, 1, pbm->nbyte, fp) ) {
+ perror(progname);
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
+/*
+ * the main program
+ */
+
+#ifdef __STDC__
+int
+main (int argc,
+ char *argv[])
+#else
+int
+main (argc, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ char *input = NULL;
+ char *output = NULL;
+ PbmFile *pbm_list;
+ PbmData *new_pbm;
+ FILE *fp;
+
+ /* parse commandline args */
+ switch (argc) {
+ /* correct number */
+ case 3:
+ output = argv[2];
+ case 2:
+ input = argv[1];
+ case 1:
+ progname = argv[0];
+ break;
+
+ default:
+ /* print usage message */
+ fprintf(stderr, "usage: %s [datafile [outputfile]]\n", argv[0]);
+ return 1;
+ }
+ /* inits */
+ if (NULL == (pbm_list = parse_input(input) ) ) {
+ return 1;
+ }
+ if (check_pbm (pbm_list) ){
+ return 1;
+ }
+ if (NULL == (new_pbm = init_pbm(pbm_list) ) ) {
+ return 1;
+ }
+ /* open output file */
+ if (NULL == (fp = pbm_open(new_pbm, output) ) ) {
+ return 1;
+ }
+ if (draw_data(new_pbm, pbm_list) ) {
+ return 1;
+ }
+ if (write_data(fp, new_pbm) ) {
+ return 1;
+ }
+ fclose(fp);
+
+ return 0;
+}
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/epmhalf.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/epmhalf.c
@@ -0,0 +1,140 @@
+/*
+ * program epmhalf - scale down epm by a factor of two
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: epmhalf.c,v 1.1 1999/04/04 11:45:18 xblast Exp $
+ * $Log: epmhalf.c,v $
+ * Revision 1.1 1999/04/04 11:45:18 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef __STDC__
+int
+main (int argc,
+ char *argv[])
+#else
+int
+main (argv, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ FILE *fin, *fout;
+ int width, height, maxval, depth;
+ int n_pixel, o_pixel;
+ unsigned char *inbuf, *outbuf;
+ unsigned char *pin, *pout;
+ char magic[256];
+ int d, y, x;
+
+ /* check args */
+ switch(argc) {
+ case 1:
+ fin = stdin;
+ fout = stdout;
+ break;
+
+ case 2:
+ fout = stdout;
+ /* open file */
+ if (NULL == (fin = fopen(argv[1],"r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for reading\n",
+ argv[0], argv[1]);
+ return 1;
+ }
+ break;
+
+ case 3:
+ /* open files */
+ if (NULL == (fin = fopen(argv[1],"r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for reading\n",
+ argv[0], argv[1]);
+ return 1;
+ }
+ if (NULL == (fout = fopen(argv[2],"w") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for writing\n",
+ argv[0], argv[1]);
+ return 1;
+ }
+ break;
+
+ default:
+ fprintf (stderr, "usage: %s [input [output]]\n", argv[0]);
+ return 1;
+ }
+
+ /* read header */
+ if (5 != fscanf(fin, "%s%d%d%d%d%*c", magic,&width,&height,&maxval,&depth) ) {
+ fprintf(stderr, "%s: Failed to read epm header\n",argv[0]);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"PX")) {
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n",argv[0],magic);
+ return 1;
+ }
+
+ /* calc number of pixel per layer */
+ n_pixel = width*height;
+ o_pixel = (width/2)*(height/2);
+
+ /* alloc input and output buffer */
+ if ( (NULL == (inbuf = malloc(depth*n_pixel*sizeof(char) ) ) ) ||
+ (NULL == (outbuf = malloc(depth*o_pixel*sizeof(char) ) ) ) ) {
+ fprintf(stderr, "%s: Failed to alloc buffers\n",argv[0]);
+ return 1;
+ }
+
+ /* read epm data */
+ if (depth*n_pixel != fread(inbuf, sizeof(char), depth*n_pixel, fin) ) {
+ perror(argv[0]);
+ return 1;
+ }
+
+ /* convert it */
+
+ pout = outbuf;
+ for (d=0; d<depth; d++) {
+ for (y=0; y<height; y+=2) {
+ pin = inbuf + d*n_pixel + y*width;
+ for (x=0; x<width; x+=2) {
+ *pout = (unsigned char)((pin[0]+pin[1]+pin[width]+pin[width+1])/4);
+ pout ++;
+ pin +=2;
+ }
+ }
+ }
+
+ /* write header */
+ fprintf(fout,"PX\n");
+ fprintf(fout,"%d %d %d %d\n", width/2, height/2, maxval, depth);
+ fwrite(outbuf, sizeof(char), depth*o_pixel, fout);
+
+ /* close files if neceassry */
+ if (fin != stdin) {
+ fclose(fin);
+ }
+ if (fout != stdout) {
+ fclose(fout);
+ }
+
+ return 0;
+}
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/ppmtoepm.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/ppmtoepm.c
@@ -0,0 +1,163 @@
+/*
+ * program ppmtoepm - convert Portable Pixmap ppm into
+ * Extented Pixmap Format epm
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: ppmtoepm.c,v 1.1 1999/04/04 11:49:18 xblast Exp $
+ * $Log: ppmtoepm.c,v $
+ * Revision 1.1 1999/04/04 11:49:18 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __STDC__
+int
+main (int argc,
+ char*argv[])
+#else
+int
+main (argc, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ static char magic[256];
+ int width, height, maxval;
+ int i, j, n_data, n_pixel;
+ FILE *fp, *fout;
+ char *ppm, *epm;
+ char dummy;
+ unsigned char *inbuf, *outbuf;
+ int val, rgb_mode;
+
+ /* check command line args */
+ if ( (argc <= 1) || (argc >=5) ) {
+ fprintf(stderr, "usage: %s [-cch|-rgb] [ppmfile [epmfile]]\n", argv[0]);
+ return 1;
+ }
+ /* parse command line */
+ i=1;
+ /* conversion mode */
+ rgb_mode = 1;
+ if (0 == strcmp(argv[i], "-cch") ) {
+ rgb_mode = 0;
+ i ++;
+ } else if (0 == strcmp(argv[i], "-rgb") ) {
+ rgb_mode =1;
+ i ++;
+ } else if ( ('-' == argv[i][0]) && ('\0' != argv[i][1]) ) {
+ fprintf(stderr, "%s: unknown option %s\n", argv[0], argv[i]);
+ return 1;
+ }
+ /* files */
+ ppm = NULL;
+ epm = NULL;
+ /* input file */
+ if (i < argc) {
+ ppm = argv[i];
+ i++;
+ /* output file */
+ if (i < argc) {
+ epm = argv[i];
+ i++;
+ }
+ }
+ if (i != argc) {
+ fprintf(stderr, "usage: %s [-cch|-rgb] [ppmfile [epmfile]]\n", argv[0]);
+ return 1;
+ }
+
+
+ /* open ppm file */
+ if ( (NULL == ppm) || (0 == strcmp(ppm, "-") ) ) {
+ fp = stdin;
+ } else if (NULL == (fp = fopen(ppm,"r") ) ) {
+ fprintf(stderr, "%s: failed to open file \"%s\"\n", argv[0], ppm);
+ return 1;
+ }
+ /* read header */
+ fscanf(fp, "%s %d %d %d%c", magic, &width, &height, &maxval, &dummy);
+ /* compare magic word */
+ if (0 != strcmp("P6",magic)) {
+ fprintf(stderr, "%s: wrong magic word in file \"%s\"\n", argv[0], ppm);
+ return 1;
+ }
+ n_data = 3 * width * height;
+ n_pixel = width * height;
+ /* alloc data buffer */
+ if ( (NULL == (inbuf = malloc(n_data*sizeof(char) ) ) ) ||
+ (NULL == (outbuf = malloc(n_data*sizeof(char) ) ) ) ) {
+ fprintf(stderr, "%s: failed to alloc data buffer\n", argv[0]);
+ return 1;
+ }
+ /* read data */
+ if (n_data != fread(inbuf, sizeof(char), n_data, fp) ) {
+ fprintf(stderr, "%s: premature end of file \"%s\"\n", argv[0], ppm);
+ return 1;
+ }
+ /* close pgm file */
+ fclose(fp);
+
+ /* open epm file if necessary */
+ if ( (NULL == epm) || (0 == strcmp(epm,"-") ) ) {
+ fout = stdout;
+ } else {
+ if (NULL == (fout = fopen(epm,"w") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for writing\n",
+ argv[0], epm);
+ }
+ }
+
+ /* write header */
+ fprintf(fout, "PX\n");
+ fprintf(fout, "%d %d %d %d\n", width, height, maxval, 3);
+
+ if (rgb_mode) {
+ /* convert data */
+ for (i=0, j=0; i<n_pixel; i++, j+=3) {
+ /* channel 0 is red */
+ outbuf[i] = inbuf[j];
+ /* channel 1 is green */
+ outbuf[i+n_pixel] = inbuf[j+1];
+ /* channel is just blue */
+ outbuf[i+2*n_pixel] = inbuf[j+2];
+ }
+ } else {
+ /* convert data */
+ for (i=0, j=0; i<n_pixel; i++, j+=3) {
+ /* channel 0 is red - blue */
+ if ( 0 > (val = inbuf[j] - inbuf[j+2]) ) {
+ val = 0;
+ }
+ outbuf[i] = val;
+ /* channel 1 is green - blue */
+ if ( 0 > (val = inbuf[j+1] - inbuf[j+2]) ) {
+ val = 0;
+ }
+ outbuf[i+n_pixel] = val;
+ /* channel is just blue */
+ outbuf[i+2*n_pixel] = inbuf[j+2];
+ }
+ }
+ /* write data*/
+ fwrite(outbuf, sizeof(char), n_data, fout);
+ /* close epm file */
+ fclose(fout);
+
+ return 0;
+}
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/epmcompress.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/epmcompress.c
@@ -0,0 +1,167 @@
+/*
+ * program epmcompress - compress Extented Pixmap Format epm using
+ * simple Runlength Encoding
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: epmcompress.c,v 1.1 1999/04/04 11:43:23 xblast Exp $
+ * $Log: epmcompress.c,v $
+ * Revision 1.1 1999/04/04 11:43:23 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifdef __STDC__
+int
+main (int argc,
+ char *argv[])
+#else
+int
+main (argv, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ FILE *fp;
+ int width, height, maxval, depth;
+ int arg, n_pixel;
+ unsigned char *inbuf, *outbuf;
+ unsigned char *src, *dst;
+ char magic[256];
+ char file_name[1024];
+ unsigned zero_count;
+
+ /* check args (part one) */
+ if ( (argc < 2) || (0 == strcmp(argv[1],"-?") ) ) {
+ fprintf(stderr, "usage: %s epmfile ...\n", argv[0]);
+ return (argc != 2);
+ }
+
+ for (arg = 1; arg < argc; arg++) {
+
+ /* open file */
+ if (NULL == (fp = fopen(argv[arg],"r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for reading\n",
+ argv[0], argv[arg]);
+ return 1;
+ }
+
+ /* read header */
+ if (5 != fscanf(fp, "%s%d%d%d%d%*c", magic,&width,&height,&maxval,&depth) ) {
+ fprintf(stderr, "%s: Failed to read epm header\n",argv[0]);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"PX")) {
+ if (0 == strcmp(magic, "PZ") ) {
+ fprintf(stderr, "File \"%s\" is already compressed.\n", argv[arg]);
+ fclose(fp);
+ continue;
+ }
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n",argv[0],magic);
+ return 1;
+ }
+
+ /* calc number of pixel per layer */
+ n_pixel = width*height;
+
+ /* alloc input and color buffer */
+ if ( (NULL == (inbuf = malloc(depth*n_pixel*sizeof(char) ) ) ) ||
+ (NULL == (outbuf = calloc(2*depth*n_pixel,sizeof(char) ) ) ) ) {
+ fprintf(stderr, "%s: Failed to alloc buffer\n",argv[0]);
+ return 1;
+ }
+
+ /* read epm data */
+ if (depth*n_pixel != fread(inbuf, sizeof(char), depth*n_pixel, fp) ) {
+ perror(argv[0]);
+ return 1;
+ }
+
+ /* convert data */
+ dst = outbuf;
+ zero_count = 0;
+ for (src = inbuf; src < (inbuf + depth*n_pixel); src++) {
+ if (0 != *src) {
+ if (zero_count) {
+ *dst = 0;
+ dst++;
+ while (zero_count >= 255) {
+ *dst = 255;
+ dst++;
+ zero_count -= 255;
+ }
+ *dst = zero_count;
+ dst++;
+ zero_count = 0;
+ }
+ *dst = *src;
+ dst++;
+ } else {
+ zero_count ++;
+ }
+ }
+ /* store remaining zeros */
+ if (zero_count) {
+ *dst = 0;
+ dst++;
+ while (zero_count > 255) {
+ *dst = 255;
+ dst++;
+ zero_count -= 255;
+ }
+ *dst = zero_count;
+ dst++;
+ zero_count = 0;
+ }
+ fprintf (stderr, "File \"%s\": %6.1f%%.\n", argv[arg],
+ 100. * (1. - (double)(dst-outbuf)/(src-inbuf) ) );
+ fclose (fp);
+ /* use compression only if better */
+ if ( (dst-outbuf) < (src - inbuf) ) {
+ /* rename old file */
+ sprintf (file_name, "%s~", argv[arg]);
+ if (rename (argv[arg], file_name)) {
+ fprintf (stderr, "Failed to create backup file \"%s\".\n",
+ file_name);
+ return 1;
+ }
+ /* write new file */
+ if (NULL == (fp = fopen (argv[arg], "w") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for writing\n",
+ argv[0], argv[arg]);
+ return 1;
+ }
+ /* write header */
+ fprintf (fp, "PZ\n");
+ fprintf (fp, "%d %d %d %d\n", width, height, maxval, depth);
+ fwrite (outbuf, sizeof(char), dst-outbuf, fp);
+ fclose (fp);
+ } else {
+ fprintf (stderr, "Skipping file \"%s\".\n", argv[arg]);
+ }
+ /* free buffers */
+ free (outbuf);
+ free (inbuf);
+ }
+ return 0;
+}
+
+
+
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/epmuncompress.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/epmuncompress.c
@@ -0,0 +1,147 @@
+/*
+ * program epmcompress - compress Extented Pixmap Format epm using
+ * simple Runlength Encoding
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * $Id: epmuncompress.c,v 1.1 1999/04/04 11:43:54 xblast Exp $
+ * $Log: epmuncompress.c,v $
+ * Revision 1.1 1999/04/04 11:43:54 xblast
+ * Initial revision
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#ifdef __STDC__
+int
+main (int argc,
+ char *argv[])
+#else
+int
+main (argv, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ FILE *fp;
+ int width, height, maxval, depth;
+ int arg, n_pixel, n_bytes;
+ unsigned char *inbuf, *outbuf;
+ unsigned char *src, *dst;
+ unsigned zero_count;
+ char magic[256];
+ char file_name[1024];
+
+ /* check args (part one) */
+ if ( (argc < 2) || (0 == strcmp(argv[1],"-?") ) ) {
+ fprintf(stderr, "usage: %s epmfile ...\n", argv[0]);
+ return (argc != 2);
+ }
+
+ for (arg = 1; arg < argc; arg++) {
+
+ /* open file */
+ if (NULL == (fp = fopen(argv[arg],"r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for reading\n",
+ argv[0], argv[arg]);
+ return 1;
+ }
+
+ /* read header */
+ if (5 != fscanf(fp, "%s%d%d%d%d%*c", magic,&width,&height,&maxval,&depth) ) {
+ fprintf(stderr, "%s: Failed to read epm header\n",argv[0]);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"PZ")) {
+ if (0 == strcmp(magic, "PX") ) {
+ fprintf(stderr, "File \"%s\" is already uncompressed.\n", argv[arg]);
+ fclose (fp);
+ continue;
+ }
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n",argv[0],magic);
+ return 1;
+ }
+
+ /* calc number of pixel per layer */
+ n_pixel = width*height;
+#ifdef DEBUG
+ fprintf (stderr, "%d pixels\n", n_pixel);
+#endif
+
+
+ /* alloc input and color buffer */
+ if ( (NULL == (inbuf = malloc(2*depth*n_pixel*sizeof(char) ) ) ) ||
+ (NULL == (outbuf = calloc(depth*n_pixel,sizeof(char) ) ) ) ) {
+ fprintf(stderr, "%s: Failed to alloc buffer\n",argv[0]);
+ return 1;
+ }
+
+ /* read epm data */
+ if (0 == (n_bytes = fread(inbuf, sizeof(char), 2*depth*n_pixel, fp) ) ) {
+ perror(argv[0]);
+ return 1;
+ }
+ fprintf (stderr, "File \"%s\": %6.1f%%.\n", argv[arg],
+ 100. * (1. - (double)n_bytes/(depth*n_pixel) ) );
+
+ /* convert data */
+ for (src = inbuf, dst=outbuf; (src < inbuf + n_bytes) && (dst < outbuf + depth*n_pixel); src++) {
+ if (*src) {
+ *dst = *src;
+ dst ++;
+ } else {
+ zero_count = 0;
+ do {
+ src ++;
+ zero_count += *src;
+ } while (*src == 255);
+ memset (dst, 0, zero_count);
+ dst += zero_count;
+ }
+ }
+ fclose (fp);
+
+ /* rename old file */
+ sprintf (file_name, "%s~", argv[arg]);
+ if (rename (argv[arg], file_name)) {
+ fprintf (stderr, "Failed to create backup file \"%s\".\n",
+ file_name);
+ return 1;
+ }
+ /* write new file */
+ if (NULL == (fp = fopen (argv[arg], "w") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for writing\n",
+ argv[0], argv[arg]);
+ return 1;
+ }
+ /* write header */
+ fprintf (fp, "PX\n");
+ fprintf (fp, "%d %d %d %d\n", width, height, maxval, depth);
+ fwrite (outbuf, sizeof(char), dst - outbuf, fp);
+ fclose (fp);
+ /* free buffers */
+ free (outbuf);
+ free (inbuf);
+ }
+ return 0;
+}
+
+
+
+
--- xblast-tnt-models-20050106.orig/debian/sprites/epmtools/epmcompress2.c
+++ xblast-tnt-models-20050106/debian/sprites/epmtools/epmcompress2.c
@@ -0,0 +1,234 @@
+/*
+ * program epmcompress - compress Extented Pixmap Format epm using
+ * simple Runlength Encoding
+ *
+ * (C) by Oliver Vogel (e-mail: vogel@ikp.uni-koeln.de)
+ * April 5th, 1997
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public Licence as by 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 entertaining,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+
+#ifdef __STDC__
+typedef unsigned char * (*store_func) (unsigned char *, unsigned, unsigned);
+#else
+typedef unsigned char * (*store_func) ();
+#endif
+
+static unsigned byteRaw[256];
+static unsigned byteZip[256];
+static store_func storeByte[256];
+
+#ifdef __STDC__
+static unsigned char *
+StoreRaw (unsigned char *dst,
+ unsigned value,
+ unsigned count)
+#else
+static unsigned char *
+StoreRaw (dst, value, count)
+ unsigned char *dst;
+ unsigned value;
+ unsigned count;
+#endif
+{
+ memset (dst, value, count);
+ return dst + count;
+}
+
+#ifdef __STDC__
+static unsigned char *
+StoreZip (unsigned char *dst,
+ unsigned value,
+ unsigned count)
+#else
+static unsigned char *
+StoreZip (dst, value, count)
+ unsigned char *dst;
+ unsigned value;
+ unsigned count;
+#endif
+{
+ *dst = value;
+ dst ++;
+ while (count >= 255) {
+ *dst = 255;
+ count -= 255;
+ }
+ *dst = count;
+ dst ++;
+ return dst;
+}
+
+
+
+#ifdef __STDC__
+int
+main (int argc,
+ char *argv[])
+#else
+int
+main (argv, argv)
+ int argc;
+ char *argv[];
+#endif
+{
+ FILE *fp;
+ int width, height, maxval, depth;
+ int i, arg, n_pixel;
+ unsigned char *inbuf, *outbuf;
+ unsigned char *src, *dst;
+ char magic[256];
+ char file_name[1024];
+ unsigned last, count;
+ unsigned numZip;
+
+ /* check args (part one) */
+ if ( (argc < 2) || (0 == strcmp(argv[1],"-?") ) ) {
+ fprintf(stderr, "usage: %s epmfile ...\n", argv[0]);
+ return (argc != 2);
+ }
+
+ for (arg = 1; arg < argc; arg++) {
+
+ /* open file */
+ if (NULL == (fp = fopen(argv[arg],"r") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for reading\n",
+ argv[0], argv[arg]);
+ return 1;
+ }
+
+ /* read header */
+ if (5 != fscanf(fp, "%s%d%d%d%d%*c", magic,&width,&height,&maxval,&depth) ) {
+ fprintf(stderr, "%s: Failed to read epm header\n",argv[0]);
+ return 1;
+ }
+ /* test magic */
+ if (0 != strcmp(magic,"PX")) {
+ if (0 == strncmp(magic, "PZ", 2) ) {
+ fprintf(stderr, "File \"%s\" is already compressed.\n", argv[arg]);
+ fclose(fp);
+ continue;
+ }
+ fprintf(stderr, "%s: Wrong magic word \"%s\".\n",argv[0],magic);
+ return 1;
+ }
+
+ /* calc number of pixel per layer */
+ n_pixel = width*height;
+
+ /* alloc input and color buffer */
+ if ( (NULL == (inbuf = malloc(depth*n_pixel*sizeof(char) ) ) ) ||
+ (NULL == (outbuf = calloc(2*depth*n_pixel,sizeof(char) ) ) ) ) {
+ fprintf(stderr, "%s: Failed to alloc buffer\n",argv[0]);
+ return 1;
+ }
+
+ /* read epm data */
+ if (depth*n_pixel != fread(inbuf, sizeof(char), depth*n_pixel, fp) ) {
+ perror(argv[0]);
+ return 1;
+ }
+
+ fclose (fp);
+
+ /* clear byte count buffers */
+ memset (byteRaw, 0, sizeof (byteRaw) );
+ for (i=0; i<256; i++) {
+ byteZip[i] = 1;
+ }
+ /* create byte count table */
+ last = *inbuf;
+ count = 1;
+ for (src = inbuf+1; src < (inbuf + depth*n_pixel); src++) {
+ if (last == *src) {
+ count ++;
+ } else {
+ byteRaw[last] += count;
+ byteZip[last] += count / 255 + 2;
+ count = 1;
+ last = *src;
+ }
+ }
+ /* store last byte */
+ byteRaw[last] += count;
+ byteZip[last] += count / 255 + 2;
+
+ /* check table */
+ dst = outbuf + 1;
+ numZip = 0;
+ for (i=0; i<256; i++) {
+ if (byteRaw[i] > byteZip[i]) {
+ storeByte[i] = StoreZip;
+ numZip ++;
+ *dst = i;
+ dst ++;
+ } else {
+ storeByte[i] = StoreRaw;
+ }
+ }
+ *outbuf = numZip;
+
+ /* convert data */
+ count = 1;
+ last = *inbuf;
+ for (src = inbuf+1; src < (inbuf + depth*n_pixel); src++) {
+ if (last == *src) {
+ count ++;
+ } else {
+ dst = storeByte[last] (dst, last, count);
+ last = *src;
+ count = 1;
+ }
+ }
+ dst = storeByte[last] (dst, last, count);
+
+ fprintf (stderr, "File \"%s\": %6.1f%%.\n", argv[arg],
+ 100. * (1. - (double)(dst-outbuf)/(src-inbuf) ) );
+
+ /* use compression only if better */
+ if ( (dst-outbuf) < (src - inbuf) ) {
+ /* rename old file */
+ sprintf (file_name, "%s~", argv[arg]);
+ if (rename (argv[arg], file_name)) {
+ fprintf (stderr, "Failed to create backup file \"%s\".\n",
+ file_name);
+ return 1;
+ }
+ /* write new file */
+ if (NULL == (fp = fopen (argv[arg], "w") ) ) {
+ fprintf(stderr, "%s: failed to open file %s for writing\n",
+ argv[0], argv[arg]);
+ return 1;
+ }
+ /* write header */
+ fprintf (fp, "PZ2\n");
+ fprintf (fp, "%d %d %d %d\n", width, height, maxval, depth);
+ fwrite (outbuf, sizeof(char), dst-outbuf, fp);
+ fclose (fp);
+ } else {
+ fprintf (stderr, "Skipping file \"%s\".\n", argv[arg]);
+ }
+ /* free buffers */
+ free (outbuf);
+ free (inbuf);
+ }
+ return 0;
+}
+
+
+
+
--- xblast-tnt-models-20050106.orig/debian/sprites/wuschel/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/wuschel/XBlast Robot.inc
@@ -0,0 +1,450 @@
+//
+// XBlast Robot File
+//
+// (C) by Immanuel Halupczok <xblast@karimmi.de>
+// based on code and containing parts
+// (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+
+#include "frames.inc"
+
+//
+// froce field and other FX
+//
+#ifndef (activateForceField)
+ #declare activateForceField = 0;
+#end
+#ifndef (forceFieldPhase)
+ #declare forceFieldPhase = 0.0;
+#end
+
+//
+// sick player
+//
+#ifndef (playerIsSick)
+ #declare playerIsSick=0;
+#end
+
+//
+// additional colors
+//
+#ifndef (beltColor)
+#declare beltColor = color rgb <0.1,0.1,0.1>;
+#end
+
+//
+// no face (needed helmet for helmet camera)
+//
+#ifndef (noFace)
+#declare noFace = 0;
+#end
+
+#include "XBlastTexture.inc"
+
+
+
+
+#declare gesichtTexture =
+texture {
+ pigment {faceColor}
+ finish {Dull ambient ambientHigh}
+ #if (playerDamaged != 0)
+ normal {dents 1.0 scale 0.25}
+ #end
+}
+
+
+//
+// include force field
+//
+#if (activateForceField = 1)
+ #include "XBlast Force Field.inc"
+#end
+
+//
+// the head
+//
+
+#declare epsi = 0.0001;
+#declare armdicke = 0.15;
+#declare beindicke = 0.15;
+#declare RR = seed(0);
+#declare RRD = seed(1); // Zusatz-Random für damage
+
+
+#macro bogen(rgross, rklein, w1, w2)
+ intersection {
+ torus {rgross, rklein}
+ plane {x, 0 rotate w1*y}
+ plane {-x, 0 rotate w2*y}
+ }
+
+#end
+
+
+
+#declare haar = intersection {
+ bogen(0.7, 0.05, 0, 45)
+ rotate -90*z
+ translate <0, 0, 0.5>
+ texture {helmetTexture}
+}
+
+
+#macro Auge(richtung)
+union {
+ intersection {
+ sphere {<0, 0, 0>, 1.3}
+ plane {-z, 0}
+ texture {gesichtTexture}
+ }
+ sphere {<0, 0, 0>, 1
+ pigment {White * 1.1}
+ finish {Shiny}
+ }
+ intersection {
+ sphere {<0, 0, 0>, 1+epsi}
+ sphere {<0, 0, -1>, 0.5}
+ #if (playerDamaged)
+ pigment {White / 2}
+ #else
+ pigment {Black}
+ #end
+ finish {Shiny}
+ rotate richtung
+ }
+
+
+ scale <0.2,0.2,0.2>
+
+
+// texture {eyeTexture}
+}
+#end
+
+#declare LinkesOhr = difference {
+ sphere {<0,0,0> 0.3 scale <0.5,1,0.8>}
+ sphere {<-0.2,0,0> 0.2 scale <0.5,1,0.8>}
+}
+
+
+#declare PlayerHead = union {
+ union {
+ sphere {<0, 0, 0>, 0.8}
+ #if (playerDamaged)
+ intersection {
+ sphere {<0, 0, -0.8>, 0.3} // Nase
+ sphere {<0, 0, -0.6>, 0.4}
+ scale <1,1,1.2>
+ }
+ #else
+ sphere {<0, 0, -0.8>, 0.3 scale <1,1,1.2>} // Nase
+ #end
+ object { LinkesOhr translate <-0.75, 0, 0> }
+ object { LinkesOhr translate <-0.75, 0, 0> scale <-1, 1, 1>}
+ texture {gesichtTexture}
+ }
+ #if (playerDamaged)
+ object { Auge(<-15, 30, 0>) translate <-0.3, 0.3, -0.6> }
+ object { Auge(<35, 5, 0>) translate < 0.3, 0.3, -0.6> }
+ #else
+ object { Auge(<-5, 0, 0>) translate <-0.3, 0.3, -0.6> }
+ object { Auge(<-5, 0, 0>) translate < 0.3, 0.3, -0.6> }
+ #end
+
+ union {
+ #local ii = 0;
+ #while (ii < 60)
+ object {
+ haar
+ rotate (rand(RR)*60-30)*y
+ #if (playerDamaged)
+ rotate (rand(RRD)*240 - 120)*y
+ #end
+ translate <rand(RR)*0.6-0.3, 0, rand(RR)*0.6-0.3>
+ translate <0, 0.8, 0>
+ rotate max(rand(RR),rand(RR))*80*x
+ rotate (rand(RR)*180-90)*y
+ }
+ #local ii = ii + 1;
+ #end
+ }
+
+ translate <0, 0.6, 0>
+ rotate headAngle
+ translate <0,-0.6, 0>
+}
+
+
+//
+// the body
+//
+#declare PlayerBody =
+union {
+ // main body
+ sphere {
+ <0,0,0>, 0.6
+ texture {bodyTexture}
+ }
+ cylinder {
+ <0, 0, 0>, <0, 1, 0>, 0.2
+ texture {gesichtTexture}
+ }
+}
+
+
+#declare PlayerRightHand =
+union {
+ sphere {
+ <0,0,0>, 0.2
+ }
+ texture {gesichtTexture}
+}
+
+#declare PlayerRightLowerArm =
+union {
+ object {
+ PlayerRightHand
+ translate <-0.6,0,0>
+ }
+ sphere {
+ <-0.4,0,0>, armdicke
+ }
+ cylinder {
+ <0, 0, 0> <-0.4, 0, 0> armdicke
+ }
+}
+
+#declare PlayerRightUpperArm =
+union {
+ object {
+ PlayerRightLowerArm
+ rotate rightLowerArmAngle
+ translate x*-0.5
+ }
+ union {
+ sphere {
+ <0,0,0>, armdicke
+ }
+ cylinder {
+ <0, 0, 0> <-0.4, 0, 0> armdicke
+ }
+ sphere {
+ <-0.4,0,0>, armdicke
+ }
+ }
+}
+
+#declare PlayerRightArm =
+union {
+ object {
+ PlayerRightUpperArm
+ rotate rightArmAngle
+ }
+/* intersection {
+ plane { -x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }*/
+ texture {armsLegsTexture}
+}
+
+//
+// Left arm of player, includings hands
+//
+
+#declare PlayerLeftHand =
+union {
+ sphere {
+ <0,0,0>, 0.2
+ }
+ texture {gesichtTexture}
+}
+
+#declare PlayerLeftLowerArm =
+union {
+ object {
+ PlayerLeftHand
+ translate <0.6,0,0>
+ }
+ sphere {
+ <0.4,0,0>, armdicke
+ }
+ cylinder {
+ <0, 0, 0> <0.4, 0, 0> armdicke
+ }
+}
+
+#declare PlayerLeftUpperArm =
+union {
+ object {
+ PlayerLeftLowerArm
+ rotate leftLowerArmAngle
+ translate x*0.4
+ }
+ union {
+ sphere {
+ <0,0,0>, armdicke
+ }
+ cylinder {
+ <0, 0, 0> <0.4, 0, 0> armdicke
+ }
+ sphere {
+ <0.4,0,0>, armdicke
+ }
+ }
+}
+
+#declare PlayerLeftArm =
+union {
+ object {
+ PlayerLeftUpperArm
+ rotate leftArmAngle
+ }
+/* intersection {
+ plane { x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }*/
+ texture {armsLegsTexture}
+}
+
+//
+// legs
+//
+
+#declare PlayerFoot =
+union {
+ intersection {
+ sphere { <0,0,0>, 1 }
+ plane { -y, 0 }
+ scale <0.4,0.4,0.4>
+ }
+ texture {handsFeetTexture}
+}
+
+#declare PlayerLowerRightLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate rightFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, beindicke
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, beindicke
+ }
+}
+
+#declare PlayerUpperRightLeg =
+union {
+ object {
+ PlayerLowerRightLeg
+ rotate rightLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, beindicke
+ }
+ sphere {
+ <0,-0.4,0>, beindicke
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, beindicke
+ }
+}
+
+#declare PlayerRightLeg =
+object {
+ PlayerUpperRightLeg
+ rotate rightLegAngle
+ texture {armsLegsTexture}
+}
+
+
+
+#declare PlayerLowerLeftLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate leftFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, beindicke
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, beindicke
+ }
+}
+
+#declare PlayerUpperLeftLeg =
+union {
+ object {
+ PlayerLowerLeftLeg
+ rotate leftLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, beindicke
+ }
+ sphere {
+ <0,-0.4,0>, beindicke
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, beindicke
+ }
+}
+
+#declare PlayerLeftLeg =
+object {
+ PlayerUpperLeftLeg
+ rotate leftLegAngle
+ texture {armsLegsTexture}
+}
+
+
+
+#declare Player =
+union {
+ object {PlayerHead translate < 0.00, 3.25, 0.00> }
+ object {PlayerBody translate < 0.00, 1.70, 0.00> }
+ object {PlayerLeftArm translate < 0.6, 1.9, 0.00> }
+ object {PlayerRightArm translate <-0.6, 1.9, 0.00> }
+ object {PlayerRightLeg translate <-0.30, 1.20, 0.00> }
+ object {PlayerLeftLeg translate < 0.30, 1.20, 0.00> }
+#if (activateForceField = 1)
+ object {ForceField}
+#end
+ translate <0.0, -1.20, 0.0>
+ rotate bodyAngle
+ translate <0.0, 1.20, 0.0>
+ translate y*playerWalkHeight
+ rotate playerAngle
+ translate playerLocation
+}
+
+object {Player}
+
+
+//
+// end file "XBlast Robot.inc"//
--- xblast-tnt-models-20050106.orig/debian/sprites/ping/XBlast Robot.inc
+++ xblast-tnt-models-20050106/debian/sprites/ping/XBlast Robot.inc
@@ -0,0 +1,553 @@
+//
+// XBlast Robot File
+//
+// (C) by Daniela Lipps <...>
+// based on and containing code
+// (C) by Oliver Vogel (e-mail: m.vogel@ndh.net)
+//
+// 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 entertaining,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+// Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+//
+
+#include "frames.inc"
+
+//
+// default value for angles (if not already defined)
+//
+#ifndef (leftLowerArmAngle)
+ #declare leftLowerArmAngle = < -15, 0, -30>;
+#end
+#ifndef (leftArmAngle)
+ #declare leftArmAngle = < 15, 10, -45>;
+#end
+#ifndef (rightLowerArmAngle)
+ #declare rightLowerArmAngle = < -15, 0, 30>;
+#end
+#ifndef (rightArmAngle)
+ #declare rightArmAngle = < 15, -10, 45>;
+#end
+
+#ifndef (rightLowerLegAngle)
+ #declare rightLowerLegAngle = < - 25, 0, 0>;
+#end
+#ifndef (rightLegAngle)
+ #declare rightLegAngle = < + 15, 15, 0>;
+#end
+#ifndef (leftLowerLegAngle)
+ #declare leftLowerLegAngle = < - 25, 0, 0>;
+#end
+#ifndef (leftLegAngle)
+ #declare leftLegAngle = < + 15,-15, 0>;
+#end
+
+#ifndef (rightFootAngle)
+ #declare rightFootAngle = < 0, 0, 0>;
+#end
+#ifndef (leftFootAngle)
+ #declare leftFootAngle = < 0, 0, 0>;
+#end
+
+#ifndef (headAngle)
+ #declare headAngle = < 0, 0, 0>;
+#end
+#ifndef (bodyAngle)
+ #declare bodyAngle = < 0, 0, 0>;
+#end
+
+//
+// froce field and other FX
+//
+#ifndef (activateForceField)
+ #declare activateForceField = 0;
+#end
+#ifndef (forceFieldPhase)
+ #declare forceFieldPhase = 0.0;
+#end
+
+//
+// Damaged Player
+//
+#ifndef (playerDamaged)
+ #declare playerDamaged=0;
+#end
+
+//
+// sick player
+//
+#ifndef (playerIsSick)
+ #declare playerIsSick=0;
+#end
+
+//
+// additional colors
+//
+#ifndef (beltColor)
+#declare beltColor = color rgb <0.1,0.1,0.1>;
+#end
+
+//
+// no face (needed helmet for helmet camera)
+//
+#ifndef (noFace)
+#declare noFace = 0;
+#end
+
+#include "XBlastTexture.inc"
+
+//
+// some useful shapes
+//
+#declare helmetSphere =
+superellipsoid {
+ <1, 0.9>
+ rotate x*90
+}
+
+#declare crossEye =
+intersection {
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 1
+ scale <0.2,0.3,1>
+ }
+ union {
+ box {
+ <-0.05,-1,-1>
+ < 0.05, 1, 1>
+ rotate z*37.5
+ }
+ box {
+ <-0.05,-1,-1>
+ < 0.05, 1, 1>
+ rotate z*-37.5
+ }
+ }
+}
+
+//
+// include force field
+//
+#if (activateForceField = 1)
+ #include "XBlast Force Field.inc"
+#end
+
+//
+// the head
+//
+#declare PlayerHead =
+union {
+ // head
+ object {
+ helmetSphere
+ scale <0.8,0.8,0.8>
+ }
+ #if (noFace = 0)
+ // right eye
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.77,0.77,0.77>
+ translate <0,0,-0.1>
+ }
+ #if (playerDamaged)
+ object {
+ crossEye
+ translate <-0.3,0.2,0>
+ }
+ pigment {color Black}
+ finish {Glossy}
+ #else
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 0.8
+ scale <0.2,0.3,1>
+ translate <-0.3,0.2,0>
+ }
+ texture {
+ eyeTexture
+ translate <-0.3,0.2,0>
+ }
+ #end
+ }
+ // left eye
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <0.77,0.77,0.77>
+ translate <0,0,-0.1>
+ }
+ #if (playerDamaged)
+ object {
+ crossEye
+ translate <0.3,0.2,0>
+ }
+ pigment {color Black}
+ finish {Glossy}
+ #else
+ cylinder {
+ <0,0,0>, <0,0,-1.5>, 0.8
+ scale <0.2,0.3,1>
+ translate < 0.3,0.2,0>
+ }
+ texture {
+ eyeTexture
+ translate < 0.3,0.2,0>
+ }
+ #end
+ }
+ // nose / beak
+ object {
+ cone {
+ <0,-0.1,0>,0.8, <0,-0.3,-1.2>, 0
+ scale <0.82,0.82,0.82>
+ translate <0,0,-0.2>
+ }
+ texture {
+ faceTexture
+ }
+ }
+ #end
+
+ texture {bodyTexture}
+ translate <0, 0.2125,-0.275>
+ rotate headAngle
+ translate <0,-0.2125, 0.275>
+}
+
+//
+// the body
+//
+#declare PlayerBody =
+union {
+ // main body
+ sphere {
+ <0,0,0>, 1
+ scale <1,1.6,1>
+ translate <0,-0.3,0>
+ }
+ // neck
+ cone {
+ <0,0.5,0>,0.8,<0,1.5,0>,0.65
+ }
+
+ // tail
+ cone {
+ <0,0,0>,1,<0,0,1.4>,0
+ translate <0,-1,0>
+ }
+
+ // belly
+ intersection {
+ sphere {
+ <0,0,0>, 1
+ scale <1.01,1.61,1.01>
+ translate <0,-0.3,0>
+ }
+ cylinder {
+ <0,0,0>,<0,0,-2>,0.85
+ scale <0.8,0,0>
+ translate <0,-0.3,0>
+ }
+ texture {helmetTexture}
+ }
+ texture {bodyTexture}
+}
+
+
+#declare PlayerRightHand =
+union {
+ // main part
+ sphere {
+ <0,0,0>, 1
+ scale <0.2,0.125,0.25>
+ }
+ // thumb
+ sphere {
+ <0,0,0>, 1
+ scale <0.1,0.1,0.25>
+ rotate y*60
+ rotate z*30
+ translate <-0.10,-0.05,-0.15>
+ }
+ // fingers
+ sphere {
+ <0,0,0>, 1
+ scale <0.3,0.125,0.2>
+ translate <-0.20,-0.025,0.05>
+ rotate z*30
+ }
+ // additional objects
+ #ifdef (rightHandObject)
+ object {rightHandObject translate <-0.20,-0.225,0.05>}
+ #end
+ texture {bodyTexture}
+ rotate z*-15
+}
+
+#declare PlayerRightLowerArm =
+union {
+ object {
+ PlayerRightHand
+ translate <-0.525,0,0>
+ }
+ sphere {
+ <-0.4,0,0>, 0.225
+ }
+ cone {
+ <-0.024609375, 0, 0>, 0.261343889659
+ <-0.421093750, 0, 0>, 0.2240090482792
+ }
+}
+
+#declare PlayerRightUpperArm =
+union {
+ object {
+ PlayerRightLowerArm
+ rotate rightLowerArmAngle
+ translate x*-0.4
+ }
+ union {
+ sphere {
+ <0,0,0>, 0.3
+ }
+ cone {
+ <-0.028125000, 0, 0>, 0.2986787310389
+ <-0.424609375, 0, 0>, 0.261343889659
+ }
+ sphere {
+ <-0.4,0,0>, 0.2625
+ }
+ }
+}
+
+#declare PlayerRightArm =
+union {
+ object {
+ PlayerRightUpperArm
+ rotate rightArmAngle
+ }
+ intersection {
+ plane { -x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }
+ texture {bodyTexture}
+}
+
+//
+// Left arm of player, includings hands
+//
+
+#declare PlayerLeftHand =
+union {
+ sphere {
+ <0,0,0>, 1
+ scale <0.2,0.125,0.25>
+ }
+ // thumb
+ sphere {
+ <0,0,0>, 1
+ scale <0.1,0.1,0.25>
+ rotate y*-60
+ rotate z*-30
+ translate <0.10,-0.05,-0.15>
+ }
+ sphere {
+ <0,0,0>, 1
+ scale <0.3,0.125,0.2>
+ translate <0.20,-0.025,0.05>
+ rotate z*-30
+ }
+ // additional objects
+ #ifdef (leftHandObject)
+ object {leftHandObject translate < 0.20,-0.225,0.05>}
+ #end
+ texture {bodyTexture}
+ rotate z*15
+}
+
+#declare PlayerLeftLowerArm =
+union {
+ object {
+ PlayerLeftHand
+ translate <0.525,0,0>
+ }
+ sphere {
+ <0.4,0,0>, 0.225
+ }
+ cone {
+ <0.024609375, 0, 0>, 0.261343889659
+ <0.421093750, 0, 0>, 0.2240090482792
+ }
+}
+
+#declare PlayerLeftUpperArm =
+union {
+ object {
+ PlayerLeftLowerArm
+ rotate leftLowerArmAngle
+ translate x*0.4
+ }
+ union {
+ sphere {
+ <0,0,0>, 0.3
+ }
+ cone {
+ <0.028125000, 0, 0>, 0.2986787310389
+ <0.424609375, 0, 0>, 0.261343889659
+ }
+ sphere {
+ <0.4,0,0>, 0.2625
+ }
+ }
+}
+
+#declare PlayerLeftArm =
+union {
+ object {
+ PlayerLeftUpperArm
+ rotate leftArmAngle
+ }
+ intersection {
+ plane { x, 0 }
+ sphere { <0,0,0>, 1 }
+ scale <0.6, 0.3, 0.3>
+ }
+ texture {bodyTexture}
+}
+
+//
+// legs
+//
+
+#declare PlayerFoot =
+union {
+ intersection {
+ sphere { <0,0,0>, 1 }
+ plane { -y, 0 }
+ scale <0.4,0.3,0.5>
+ }
+ intersection {
+ sphere { <0,0,0>, 1 }
+ plane { y, 0 }
+ scale <0.4,0.1,0.5>
+ }
+ texture {handsFeetTexture}
+}
+
+#declare PlayerLowerRightLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate rightFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerUpperRightLeg =
+union {
+ object {
+ PlayerLowerRightLeg
+ rotate rightLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, 0.3
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerRightLeg =
+object {
+ PlayerUpperRightLeg
+ rotate rightLegAngle
+ texture {bodyTexture}
+}
+
+
+
+#declare PlayerLowerLeftLeg =
+union {
+ object {
+ PlayerFoot
+ translate <0.0,-0.3,-0.1>
+ rotate leftFootAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerUpperLeftLeg =
+union {
+ object {
+ PlayerLowerLeftLeg
+ rotate leftLowerLegAngle
+ translate <0.0,-0.4,0.0>
+ }
+ sphere {
+ <0,0,0>, 0.3
+ }
+ sphere {
+ <0,-0.4,0>, 0.3
+ }
+ cylinder {
+ <0,0,0>, <0,-0.4,0>, 0.3
+ }
+}
+
+#declare PlayerLeftLeg =
+object {
+ PlayerUpperLeftLeg
+ rotate leftLegAngle
+ texture {bodyTexture}
+}
+#declare Player =
+union {
+ object {PlayerHead translate < 0.00, 3.25, 0.00> }
+ object {PlayerBody translate < 0.00, 1.70, 0.00> }
+ object {PlayerLeftArm translate < 0.6, 1.9, 0.00> }
+ object {PlayerRightArm translate <-0.6, 1.9, 0.00> }
+ object {PlayerRightLeg translate <-0.30, 1.20, 0.00> }
+ object {PlayerLeftLeg translate < 0.30, 1.20, 0.00> }
+#if (activateForceField = 1)
+ object {ForceField}
+#end
+ translate <0.0, -1.20, 0.0>
+ rotate bodyAngle
+ translate <0.0, 1.20, 0.0>
+ translate y*playerWalkHeight
+ rotate playerAngle
+ translate playerLocation
+}
+
+object {Player}
+
+//
+// end file "XBlast Robot.inc"//