Add Clonk Rage developer documentation

committer: Günther Brammer <gbrammer@gmx.de>
Günther Brammer 2009-05-09 15:11:51 +02:00
parent 7e1fdec156
commit 675da642c3
589 changed files with 45001 additions and 0 deletions

128
docs/Makefile 100644
View File

@ -0,0 +1,128 @@
# Notable targets:
# all (default): German and English onlinedocs
# online-de: only German onlinedocs, which can be partially updated
# Enwickler.chm: the German offline doc
# use with make Entwickler.chm HHC = /path/to/hhc
# Extra Parameters for xsltproc can be given in the XSLTFLAGS variable.
# Use prefix to select the directory where the docs are to be installed
prefix = /tmp
HHC = hhc.exe
MKDIR_P = mkdir -p
CP = cp
CP_R = cp -r
stylesheet = clonk.xsl
# Sources:
# find all directories neither beginning nor contained within a directory beginning with a dot
sdk-dirs := $(shell find sdk -name '.*' -prune -o -type d -print)
# misc
extra-files := $(sort $(wildcard *.css *.php *.js images/*.*) index.html)
extra-files-chm := $(sort $(wildcard *.css *.js images/*.*))
# find all *.xml files recursively in sdk/
xmlfiles := $(sort $(shell find sdk -name '.*' -prune -o -name \*.xml -print))
# Targets:
# strip from all files the .xml, and add a .html
htmlfiles := $(addsuffix .html, $(basename $(xmlfiles)))
# The translated files and directories
sdk-dirs-en := $(subst sdk, sdk-en, $(sdk-dirs))
xmlfiles-en := $(subst sdk, sdk-en, $(xmlfiles))
htmlfiles-en := $(subst sdk, sdk-en, $(htmlfiles))
# For clonk.de
online-sdk-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(htmlfiles) content.html))
online-dirs := $(foreach lang, en de, $(addprefix online/$(lang)/, $(sdk-dirs) images))
online-extra-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(extra-files)))
# For Entwickler.chm
chm-dirs := $(foreach lang, en de, $(addprefix chm/$(lang)/, . $(sdk-dirs) images))
.PHONY: all online-de chm install svn-update check clean
all: $(online-dirs) $(sdk-dirs-en) $(online-extra-files) $(online-sdk-files)
online-de: $(addprefix online/de/, $(sdk-dirs) images $(htmlfiles) $(extra-files))
chm: $(chm-dirs) Entwickler.chm Developer.chm
install: all
$(MKDIR_P) $(prefix)
$(CP_R) $(PWD)/online/* $(prefix)
svn-update:
svn up
check:
xmllint --noblanks --noout --valid $(xmlfiles)
clean:
rm -f *.mo Entwickler.chm Developer.chm doku.pot
rm -rf online sdk-en chm
chm/de/Output.hhp chm/de/Output.hhk chm/en/Output.hhc chm/en/Output.hhp chm/en/Output.hhk: chm/de/Output.hhc
#update timestamp
touch $@
chm/de/Output.hhc: $(xmlfiles) chm/de/. chm/en/. build_chm_files.py experimental.py \
Template.hhc Template.en.hhc Template.hhk Template.en.hhk Template.hhp Template.en.hhp en.mo
@echo generate chm files
@python build_chm_files.py $(xmlfiles)
online/de/content.html: chm/de/Output.hhc build_contents.pl
@echo generate $@
@perl build_contents.pl $< > $@
online/en/content.html: chm/en/Output.hhc build_contents.pl
@echo generate $@
@perl build_contents.pl $< > $@
$(sdk-dirs-en) $(online-dirs) $(chm-dirs):
mkdir -p $@
doku.pot: $(xmlfiles) extra-strings.xml xml2po.py clonk.py
@echo extract strings to $@
@python xml2po.py -e -m clonk -o $@ $(xmlfiles) extra-strings.xml
%.po: doku.pot
@echo update $@
@msgmerge --no-wrap -w 1 -U $@ $<
%.mo: %.po
@echo compile $@
@msgfmt --statistics -o $@ $<
sdk-en/%.xml: sdk/%.xml en.mo xml2po.py clonk.py
@echo generate $@
@python xml2po.py -e -m clonk -t en.mo -o $@ $<
define run-xslt
@echo generate $@
@xsltproc -o $@ --param webnotes $(webnotes) --param fileext "'.html'" $(XSLTFLAGS) $(stylesheet) $<
endef
online/%: webnotes=1
chm/%: webnotes=0
online/de/sdk/%.html: sdk/%.xml $(stylesheet) ; $(run-xslt)
online/en/sdk/%.html: sdk-en/%.xml $(stylesheet) ; $(run-xslt)
chm/de/sdk/%.html: sdk/%.xml $(stylesheet) ; $(run-xslt)
chm/en/sdk/%.html: sdk-en/%.xml $(stylesheet) ; $(run-xslt)
$(filter online/en/%, $(online-extra-files)): online/en/%: %
$(CP) $< $@
$(filter online/de/%, $(online-extra-files)): online/de/%: %
$(CP) $< $@
$(addprefix chm/en/, $(extra-files-chm)): chm/en/%: %
$(CP) $< $@
$(addprefix chm/de/, $(extra-files-chm)): chm/de/%: %
$(CP) $< $@
Entwickler.chm: chm/de/Output.hhp chm/de/Output.hhk chm/de/Output.hhc $(addprefix chm/de/, $(sdk-dirs) images $(htmlfiles) $(extra-files-chm))
$(HHC) $<
Developer.chm: chm/en/Output.hhp chm/en/Output.hhk chm/en/Output.hhc $(addprefix chm/en/, $(sdk-dirs) images $(htmlfiles) $(extra-files-chm))
$(HHC) $<

View File

@ -0,0 +1,15 @@
To build the doku under Windows, you need
Perl, Python, and Cygwin
installed with:
make
xsltproc (libxml2 + libxslt + python-libxml2)
findutils
sed
gettext
gettext-devel
libgcrypt + libgpg-error (for whatever reason)
Also you should rename find.exe - first in Windows\System32\dllback then in Windows\System32 to make sure it isn't used.

View File

@ -0,0 +1,189 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<!-- Notice: some tags and tab positions are hardcoded in DokuCompile/compilefns.exe -->
</HEAD><BODY>
<OBJECT type="text/site properties">
<param name="Window Styles" value="0x800025">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Developer Mode">
<!--<param name="Local" value="sdk\index.html">-->
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Introduction">
<param name="Local" value="sdk\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Engine">
<param name="Local" value="sdk\console.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Command line parameters">
<param name="Local" value="sdk\cmdline.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Game Data">
<param name="Local" value="sdk\files.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Object Definitions">
<param name="Local" value="sdk\definition\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="DefCore">
<param name="Local" value="sdk\definition\defcore.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Category">
<param name="Local" value="sdk\definition\category.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="OCF">
<param name="Local" value="sdk\definition\ocf.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Vertices">
<param name="Local" value="sdk\definition\vertices.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="LineConnect">
<param name="Local" value="sdk\definition\lineconnect.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="CNAT - Contact Attatchment">
<param name="Local" value="sdk\definition\cnat.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="ActMap">
<param name="Local" value="sdk\definition\actmap.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Procedures">
<param name="Local" value="sdk\definition\procedures.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Local" value="sdk\definition\script.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Particle">
<param name="Local" value="sdk\particle\index.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scenarios">
<param name="Local" value="sdk\scenario\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scenario">
<param name="Local" value="sdk\scenario\scenario.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Map Generator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Local" value="sdk\scenario\script.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Materials">
<param name="Local" value="sdk\material\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Definitions">
<param name="Local" value="sdk\material\c4m.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Languages">
<!--<param name="Local" value="sdk\lang.html">-->
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Localization">
<param name="Local" value="sdk\lang.html">
</OBJECT>
</UL>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Local" value="sdk\script\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Functions">
<param name="Local" value="sdk\script\Funcs.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Calling Script Functions">
<param name="Local" value="sdk\script\FuncCall.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#strict">
<param name="Local" value="sdk\script\Strict.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#appendto">
<param name="Local" value="sdk\script\AppendTo.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="break / continue">
<param name="Local" value="sdk\script\BreakContinue.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="for">
<param name="Local" value="sdk\script\for.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Named Variables">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Operators">
<param name="Local" value="sdk\script\operatoren.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Data Types">
<param name="Local" value="sdk\script\Typechecks.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Effects">
<param name="Local" value="sdk\script\Effects.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script players">
<param name="Local" value="sdk\script\ScriptPlayers.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Functions by Category">
</OBJECT>
<!-- Insert Functions here 1-->
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Functions by Version">
</OBJECT>
<!-- Insert Functions here 2-->
</UL>
</UL>
</BODY></HTML>

View File

@ -0,0 +1,220 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<!-- Sitemap 1.0 -->
</HEAD><BODY>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#appendto">
<param name="Name" value="#appendto">
<param name="Local" value="sdk\script\AppendTo.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#strict">
<param name="Name" value="#strict">
<param name="Local" value="sdk\script\Strict.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="ActMap.txt">
<param name="Name" value="ActMap.txt">
<param name="Local" value="sdk\definition\actmap.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Named Variables">
<param name="Name" value="Named Variables">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="break">
<param name="Name" value="Break / Continue">
<param name="Local" value="sdk\script\BreakContinue.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Category">
<param name="Name" value="Objektkategorien">
<param name="Local" value="sdk\definition\category.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="CNAT">
<param name="Name" value="CNAT - Contact Attachment">
<param name="Local" value="sdk\definition\cnat.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="continue">
<param name="Name" value="Break / Continue">
<param name="Local" value="sdk\script\BreakContinue.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="DefCore.txt">
<param name="Name" value="DefCore.txt">
<param name="Local" value="sdk\definition\defcore.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Directives">
<param name="Name" value="#appendto">
<param name="Local" value="sdk\script\AppendTo.html">
<param name="Name" value="#strict">
<param name="Local" value="sdk\script\Strict.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Developer Mode">
<param name="Name" value="Clonk Developer Mode">
<param name="Local" value="sdk\index.html">
<param name="Name" value="The Engine in Developer Mode">
<param name="Local" value="sdk\console.html">
<param name="Name" value="Command line options">
<param name="Local" value="sdk\cmdline.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="for">
<param name="Name" value="The for loop">
<param name="Local" value="sdk\script\for.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="landscape.txt">
<param name="Name" value="Dynamic Map Generator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Materials">
<param name="Name" value="Material Definitions">
<param name="Local" value="sdk\material\index.html">
<param name="Name" value="Material Definitions (C4M)">
<param name="Local" value="sdk\material\c4m.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Map Generator">
<param name="Name" value="Dynamic Map Generator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Map Generator">
<param name="Name" value="Dynamic Map Generator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Object Definitions">
<param name="Name" value="Definitions">
<param name="Local" value="sdk\definition\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Object Categories">
<param name="Name" value="Object Categories">
<param name="Local" value="sdk\definition\category.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Objekt Scripts">
<param name="Name" value="Objekt Scripts">
<param name="Local" value="sdk\definition\script.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="OCF">
<param name="Name" value="Object Character Flags">
<param name="Local" value="sdk\definition\ocf.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Operators">
<param name="Name" value="Operators">
<param name="Local" value="sdk\script\operatoren.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Particles">
<param name="Name" value="Particles">
<param name="Local" value="sdk\particle\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Procedures (ActMap)">
<param name="Name" value="Procedures">
<param name="Local" value="sdk\definition\procedures.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="scenario.txt">
<param name="Name" value="Scenario.txt">
<param name="Local" value="sdk\scenario\scenario.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Name" value="Scenario Scripts">
<param name="Local" value="sdk\scenario\script.html">
<param name="Name" value="Object Scripts">
<param name="Local" value="sdk\definition\script.html">
<param name="Name" value="C4Script Documentation">
<param name="Local" value="sdk\script\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Game Data">
<param name="Name" value="Game Data">
<param name="Local" value="sdk\files.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scenarios">
<param name="Name" value="Scenarios">
<param name="Local" value="sdk\scenario\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scenario Scripts">
<param name="Name" value="Scenario Scripts">
<param name="Local" value="sdk\scenario\script.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Typechecking">
<param name="Name" value="Data Types">
<param name="Local" value="sdk\script\Typechecks.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Variables">
<param name="Name" value="Named Variables">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Vertices">
<param name="Name" value="Vertices">
<param name="Local" value="sdk\definition\vertices.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Effects">
<param name="Name" value="Effects">
<param name="Local" value="sdk\script\Effects.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script players">
<param name="Name" value="Script players">
<param name="Local" value="sdk\script\ScriptPlayers.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="++"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="--"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="~"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="!"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="+"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="-"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="*"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="/"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="%"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="-"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="<<"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value=">>"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="<"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="<="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value=">"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value=">="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="=="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="!="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="S="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="ne"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="eq"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="&amp;"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="^"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="|"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="&amp;&amp;"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="||"> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="*="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="/="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="%="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="+="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="-="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="="> <PARAM name="Name" value="Operators"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
</UL>
</BODY></HTML>

View File

@ -0,0 +1,40 @@
[OPTIONS]
Compatibility=1.1 or later
Compiled file=Developer.chm
Contents file=Output.hhc
Default topic=sdk\index.html
Display compile progress=No
Full-text search=Yes
Index file=Output.hhk
Language=0x409 Englisch (USA)
Title=Clonk Developer Mode
[FILES]
images\cpem.gif
images\icon_em_brush.gif
images\icon_em_dynamic.gif
images\icon_em_edit.gif
images\icon_em_exact.gif
images\icon_em_eyedrop.gif
images\icon_em_fill.gif
images\icon_em_line.gif
images\icon_em_play.gif
images\icon_em_rect.gif
images\icon_em_sky.gif
images\icon_em_static.gif
images\icon_em_tunnel.gif
images\icon_image.gif
images\icon_material.gif
images\icon_music.gif
images\icon_object_definition.gif
images\icon_player.gif
images\icon_scenario.gif
images\icon_scenario_folder.gif
images\icon_sound.gif
images\icon_system.gif
images\icon_text.gif
images\icons_em_play.gif
[INFOTYPES]

189
docs/Template.hhc 100644
View File

@ -0,0 +1,189 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<!-- Notice: some tags and tab positions are hardcoded in DokuCompile/compilefns.exe -->
</HEAD><BODY>
<OBJECT type="text/site properties">
<param name="Window Styles" value="0x800025">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Entwicklermodus">
<!--<param name="Local" value="sdk\index.html">-->
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Einleitung">
<param name="Local" value="sdk\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Engine">
<param name="Local" value="sdk\console.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Kommandozeilenparameter">
<param name="Local" value="sdk\cmdline.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Spieldaten">
<param name="Local" value="sdk\files.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Objektdefinitionen">
<param name="Local" value="sdk\definition\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="DefCore">
<param name="Local" value="sdk\definition\defcore.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Category">
<param name="Local" value="sdk\definition\category.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="OCF">
<param name="Local" value="sdk\definition\ocf.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Vertices">
<param name="Local" value="sdk\definition\vertices.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="LineConnect">
<param name="Local" value="sdk\definition\lineconnect.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="CNAT - Contact Attatchment">
<param name="Local" value="sdk\definition\cnat.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="ActMap">
<param name="Local" value="sdk\definition\actmap.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Prozeduren">
<param name="Local" value="sdk\definition\procedures.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scripte">
<param name="Local" value="sdk\definition\script.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Partikel">
<param name="Local" value="sdk\particle\index.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Szenarien">
<param name="Local" value="sdk\scenario\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Szenario">
<param name="Local" value="sdk\scenario\scenario.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Kartengenerator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scripte">
<param name="Local" value="sdk\scenario\script.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Materialien">
<param name="Local" value="sdk\material\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Definition">
<param name="Local" value="sdk\material\c4m.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Sprachanpassung">
<!--<param name="Local" value="sdk\lang.html">-->
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Sprachanpassung">
<param name="Local" value="sdk\lang.html">
</OBJECT>
</UL>
</UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Local" value="sdk\script\index.html">
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Funktionen">
<param name="Local" value="sdk\script\Funcs.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Funktionsaufruf">
<param name="Local" value="sdk\script\FuncCall.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#strict">
<param name="Local" value="sdk\script\Strict.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#appendto">
<param name="Local" value="sdk\script\AppendTo.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="break / continue">
<param name="Local" value="sdk\script\BreakContinue.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="for">
<param name="Local" value="sdk\script\for.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Benannte Variablen">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Operatoren">
<param name="Local" value="sdk\script\operatoren.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Datentypen">
<param name="Local" value="sdk\script\Typechecks.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Effekte">
<param name="Local" value="sdk\script\Effects.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scriptspieler">
<param name="Local" value="sdk\script\ScriptPlayers.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Funktionen nach Kategorie">
</OBJECT>
<!-- Insert Functions here 1-->
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Funktionen nach Version">
</OBJECT>
<!-- Insert Functions here 2-->
</UL>
</UL>
</BODY></HTML>

220
docs/Template.hhk 100644
View File

@ -0,0 +1,220 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<!-- Sitemap 1.0 -->
</HEAD><BODY>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#appendto">
<param name="Name" value="#appendto">
<param name="Local" value="sdk\script\AppendTo.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#strict">
<param name="Name" value="#strict">
<param name="Local" value="sdk\script\Strict.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="ActMap.txt">
<param name="Name" value="ActMap.txt">
<param name="Local" value="sdk\definition\actmap.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Benannte Variablen">
<param name="Name" value="Benannte Variablen">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="break">
<param name="Name" value="Break / Continue">
<param name="Local" value="sdk\script\BreakContinue.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Category">
<param name="Name" value="Objektkategorien">
<param name="Local" value="sdk\definition\category.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="CNAT">
<param name="Name" value="CNAT - Contact Attachment">
<param name="Local" value="sdk\definition\cnat.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="continue">
<param name="Name" value="Break / Continue">
<param name="Local" value="sdk\script\BreakContinue.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="DefCore.txt">
<param name="Name" value="DefCore.txt">
<param name="Local" value="sdk\definition\defcore.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Direktiven">
<param name="Name" value="#appendto">
<param name="Local" value="sdk\script\AppendTo.html">
<param name="Name" value="#strict">
<param name="Local" value="sdk\script\Strict.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Entwicklermodus">
<param name="Name" value="Clonk Entwicklermodus">
<param name="Local" value="sdk\index.html">
<param name="Name" value="Die Engine im Entwicklermodus">
<param name="Local" value="sdk\console.html">
<param name="Name" value="Kommandozeilenparameter">
<param name="Local" value="sdk\cmdline.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="for">
<param name="Name" value="Die For-Schleife">
<param name="Local" value="sdk\script\for.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="landscape.txt">
<param name="Name" value="Der dynamische Kartengenerator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Material">
<param name="Name" value="Materialdefinitionen">
<param name="Local" value="sdk\material\index.html">
<param name="Name" value="Materialdefinitionen (C4M)">
<param name="Local" value="sdk\material\c4m.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Landschaftsgenerator">
<param name="Name" value="Der dynamische Kartengenerator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Kartengenerator">
<param name="Name" value="Der dynamische Kartengenerator">
<param name="Local" value="sdk\scenario\MapCreatorS2.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Objektdefinitionen">
<param name="Name" value="Objektdefinitionen">
<param name="Local" value="sdk\definition\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Objektkategorien">
<param name="Name" value="Objektkategorien">
<param name="Local" value="sdk\definition\category.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Objektscripte">
<param name="Name" value="Objektscripte">
<param name="Local" value="sdk\definition\script.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="OCF">
<param name="Name" value="Object character flags">
<param name="Local" value="sdk\definition\ocf.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Operatoren">
<param name="Name" value="Operatoren">
<param name="Local" value="sdk\script\operatoren.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Partikel">
<param name="Name" value="Partikel">
<param name="Local" value="sdk\particle\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Procedure (ActMap)">
<param name="Name" value="Prozeduren">
<param name="Local" value="sdk\definition\procedures.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="scenario.txt">
<param name="Name" value="Scenario.txt">
<param name="Local" value="sdk\scenario\scenario.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Name" value="Szenarioscripte">
<param name="Local" value="sdk\scenario\script.html">
<param name="Name" value="Objektscripte">
<param name="Local" value="sdk\definition\script.html">
<param name="Name" value="C4Script Dokumentation">
<param name="Local" value="sdk\script\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Spieldaten">
<param name="Name" value="Spieldatenreferenz">
<param name="Local" value="sdk\files.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Szenarien">
<param name="Name" value="Szenarien">
<param name="Local" value="sdk\scenario\index.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Szenarioscripte">
<param name="Name" value="Szenarioscripte">
<param name="Local" value="sdk\scenario\script.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Typpr&uuml;fung">
<param name="Name" value="Datentypen">
<param name="Local" value="sdk\script\Typechecks.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Variablen">
<param name="Name" value="Benannte Variablen">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Vertices">
<param name="Name" value="Vertices">
<param name="Local" value="sdk\definition\vertices.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Effekte">
<param name="Name" value="Effekte">
<param name="Local" value="sdk\script\Effects.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Scriptspieler">
<param name="Name" value="Scriptspieler">
<param name="Local" value="sdk\script\ScriptPlayers.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="++"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="--"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="~"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="!"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="+"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="-"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="*"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="/"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="%"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="-"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="<<"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value=">>"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="<"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="<="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value=">"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value=">="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="=="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="!="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="S="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="ne"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="eq"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="&amp;"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="^"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="|"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="&amp;&amp;"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="||"> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="*="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="/="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="%="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="+="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="-="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
<LI> <OBJECT type="text/sitemap"> <PARAM name="Name" value="="> <PARAM name="Name" value="Operatoren"> <PARAM name="Local" value="sdk\script\operatoren.html"> </OBJECT>
</UL>
</BODY></HTML>

40
docs/Template.hhp 100644
View File

@ -0,0 +1,40 @@
[OPTIONS]
Compatibility=1.1 or later
Compiled file=Entwickler.chm
Contents file=Output.hhc
Default topic=sdk\index.html
Display compile progress=No
Full-text search=Yes
Index file=Output.hhk
Language=0x407 Deutsch (Standard)
Title=Clonk Entwicklermodus
[FILES]
images\cpem.gif
images\icon_em_brush.gif
images\icon_em_dynamic.gif
images\icon_em_edit.gif
images\icon_em_exact.gif
images\icon_em_eyedrop.gif
images\icon_em_fill.gif
images\icon_em_line.gif
images\icon_em_play.gif
images\icon_em_rect.gif
images\icon_em_sky.gif
images\icon_em_static.gif
images\icon_em_tunnel.gif
images\icon_image.gif
images\icon_material.gif
images\icon_music.gif
images\icon_object_definition.gif
images\icon_player.gif
images\icon_scenario.gif
images\icon_scenario_folder.gif
images\icon_sound.gif
images\icon_system.gif
images\icon_text.gif
images\icons_em_play.gif
[INFOTYPES]

40
docs/bitmasks.js 100644
View File

@ -0,0 +1,40 @@
var cat;
function CheckCharacters(text,allowed) {
for (var i = 0; i < text.length; ++i) {
if(allowed.indexOf(text.charAt(i))<0 ) {
return false;
}
}
return true;
}
function Calc() {
var input = document.getElementById("input").value*1;
if(CheckCharacters(input,"0123456789")) cat=input;
for(var i=0;i<BIT_COUNT;++i)
Mark(i);
}
function Mark(bit) {
if((1<<bit) & cat) {
if(!(bit%2))
document.getElementById(PREFIX+bit).className="mark";
else
document.getElementById(PREFIX+bit).className="darkmark";
}
else {
if(!(bit%2))
document.getElementById(PREFIX+bit).className="";
else
document.getElementById(PREFIX+bit).className="dark";
}
}
function Switch(bit) {
cat = cat ^ (1 << bit);
Mark(bit);
document.getElementById("input").value = cat;
}

76
docs/clonk.dtd 100644
View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ENTITY % text "a | img | emlink | funclink | em | code | strong">
<!ELEMENT funcs (func+, (author, date)+)>
<!ELEMENT func (title, deprecated?, category, subcat*, version, deprecated?, syntax, desc, remark*, examples?, related?)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT category (#PCDATA)>
<!ELEMENT subcat (#PCDATA)>
<!ELEMENT version (#PCDATA | extversion)*>
<!ELEMENT extversion (#PCDATA)>
<!ELEMENT deprecated EMPTY>
<!ELEMENT internal EMPTY>
<!ELEMENT syntax (rtype, params*)>
<!ELEMENT rtype (#PCDATA)>
<!ELEMENT params (#PCDATA | param)*>
<!ELEMENT param (type?, optional?, name, optional?, desc, optional?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT desc (#PCDATA | br | ul | li | table | %text;)*>
<!ELEMENT optional EMPTY>
<!ELEMENT remark (#PCDATA | br | ul | li | table | %text;)*>
<!ELEMENT examples (example+)>
<!ELEMENT example (code | text)*>
<!ELEMENT code (#PCDATA | funclink | emlink | em | strong)*>
<!ELEMENT text (#PCDATA | br | ul | li | table | %text;)*>
<!ELEMENT related (funclink | emlink)+>
<!ELEMENT funclink (#PCDATA)>
<!ELEMENT emlink (#PCDATA)>
<!ATTLIST emlink href CDATA #REQUIRED>
<!ELEMENT author (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT doc (title, (h | text | dl | part | code | author | date | img)*)>
<!ELEMENT part (h | text | part | code | dl)*>
<!ELEMENT br EMPTY>
<!ELEMENT table (#PCDATA | caption | rowh | row | bitmask)*>
<!ELEMENT caption (#PCDATA)>
<!ATTLIST caption
id ID #IMPLIED>
<!ELEMENT row (#PCDATA | col)*>
<!ATTLIST row
id ID #IMPLIED>
<!ELEMENT rowh (#PCDATA | col)*>
<!ELEMENT col (#PCDATA | %text;)*>
<!ATTLIST col
colspan CDATA #IMPLIED>
<!ELEMENT bitmask (#PCDATA)>
<!ELEMENT ul (#PCDATA | li)*>
<!ELEMENT li (#PCDATA | %text;)*>
<!ELEMENT dl (#PCDATA | dd | dt)*>
<!ELEMENT dt (#PCDATA | emlink | funclink | img)*>
<!ATTLIST dt
id ID #IMPLIED>
<!ELEMENT dd (#PCDATA | text | code)*>
<!ELEMENT em (#PCDATA)>
<!ELEMENT strong (#PCDATA)>
<!ELEMENT h (#PCDATA)>
<!ATTLIST h
id ID #IMPLIED>
<!ELEMENT img EMPTY>
<!ATTLIST img
src CDATA #REQUIRED
width CDATA "0"
height CDATA "0"
id ID #IMPLIED>
<!ELEMENT a (#PCDATA)>
<!ATTLIST a
href CDATA #REQUIRED>

62
docs/clonk.py 100644
View File

@ -0,0 +1,62 @@
# the description of the format used for the clonk developer docs for xml2po
class clonkXmlMode:
"""Clonks propietary xml format"""
def getIgnoredTags(self):
"Returns array of tags to be ignored."
return ['emlink', 'em', 'strong', 'code']
def getFinalTags(self):
"Returns array of tags to be considered 'final'."
return ['table', 'text', 'desc', 'remark', 'col', 'li', 'funclink', 'ul', 'h', 'dt']
def getSwallowTags(self):
"Return array of tags which content is not translated."
return self._stuff
def getSpacePreserveTags(self):
"Returns array of tags in which spaces are to be preserved."
return ['code']
_stuff = ['funclink', 'version', 'extversion', 'rtype', 'author', 'date',
'type', 'code', 'code/i', 'code/b', 'name', 'func/title']
def _delete_stuff(self, node, msg):
#print "looking at " + str(node.name)
if node and node.children:
child = node.children
while child:
n = child
child = child.next
if n.type=='element' and n.name in self._stuff:
#print "!"
if n.name == 'name' and node.name != 'param':
print node + "!" + n
#n.unlinkNode()
#n.freeNode()
n.setContent('')
else:
self._delete_stuff(n, msg)
def preProcessXml(self, doc, msg):
"""Add additional messages of interest here."""
return
#root = doc.getRootElement()
#self._delete_stuff(root,msg)
def postProcessXmlTranslation(self, doc, language, translators):
"""Sets a language and translators in "doc" tree.
"translators" is a string consisted of translator credits.
"language" is a simple string.
"doc" is a libxml2.xmlDoc instance."""
root = doc.getRootElement()
root.setProp('xml:lang', language)
def getStringForTranslators(self):
"""Returns None or a string to be added to PO files.
Common example is 'translator-credits'."""
return None
def getCommentForTranslators(self):
"""Returns a comment to be added next to string for crediting translators.
It should explain the format of the string provided by getStringForTranslators()."""
return None

575
docs/clonk.xsl 100644
View File

@ -0,0 +1,575 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>
<xsl:variable name="procinst" select="processing-instruction('xml-stylesheet')" />
<xsl:param name="relpath" select="substring-after(substring-before($procinst, 'clonk.xsl'),'href=&quot;')" />
<xsl:param name="webnotes" />
<xsl:param name="fileext" select="'.xml'" />
<xsl:template name="head">
<head>
<link rel="stylesheet" type="text/css">
<xsl:attribute name="href"><xsl:value-of select="$relpath" />doku.css</xsl:attribute>
</link>
<title>
<xsl:value-of select="descendant::title" /><xsl:apply-templates select="../deprecated" />
</title>
<xsl:if test="descendant::table[bitmask]">
<script type="text/javascript">
<xsl:attribute name="src"><xsl:value-of select="$relpath" />bitmasks.js</xsl:attribute>
</script>
<script type="text/javascript">
var BIT_COUNT = <xsl:value-of select="count(descendant::table[bitmask]/row)" />; // Anzahl der Bits
var PREFIX = "bit"; // Prefix für die numerierten IDs
</script>
</xsl:if>
<xsl:if test="$webnotes">
<xsl:processing-instruction name="php">
$g_page_language = '<xsl:choose><xsl:when test='lang("en")'>english</xsl:when><xsl:otherwise>german</xsl:otherwise></xsl:choose>';
require_once('<xsl:value-of select="$relpath" />../webnotes/core/api.php');
pwn_head();
?</xsl:processing-instruction>
<script type="text/javascript">
function switchLanguage() {
var loc = window.location.href;
if (loc.match(/\/en\//)) loc = loc.replace(/\/en\//, "/de/");
else loc = loc.replace(/\/de\//, "/en/");
window.location = loc;
}
</script>
</xsl:if>
</head>
</xsl:template>
<!-- The title content is used for the page title-->
<xsl:template match="title" />
<xsl:template match="deprecated">
(<xsl:choose><xsl:when test='lang("en")'>deprecated</xsl:when><xsl:otherwise>veraltet</xsl:otherwise></xsl:choose>)
</xsl:template>
<xsl:template match="funcs">
<html>
<xsl:call-template name="head" />
<body>
<xsl:call-template name="nav" />
<xsl:for-each select="func">
<xsl:apply-templates select="." />
</xsl:for-each>
<xsl:apply-templates select="author" />
<xsl:if test="$webnotes">
<xsl:processing-instruction name="php">
pwn_body(basename (dirname(__FILE__)) . basename(__FILE__,".html"), $_SERVER['SCRIPT_NAME']);
?</xsl:processing-instruction>
</xsl:if>
<xsl:call-template name="nav" />
</body>
</html>
</xsl:template>
<xsl:template match="doc">
<html>
<xsl:call-template name="head" />
<body>
<xsl:call-template name="nav" />
<xsl:apply-templates />
<xsl:if test="$webnotes">
<xsl:processing-instruction name="php">
pwn_body(basename (dirname(__FILE__)) . basename(__FILE__,".html"), $_SERVER['SCRIPT_NAME']);
?</xsl:processing-instruction>
</xsl:if>
<xsl:call-template name="nav" />
</body>
</html>
</xsl:template>
<xsl:template match="func">
<h1>
<xsl:attribute name="id"><xsl:value-of select="title" /></xsl:attribute>
<xsl:value-of select="title" /><xsl:apply-templates select="deprecated" />
</h1>
<div class="text">
<xsl:apply-templates select="category" />
<br/>
<xsl:apply-templates select="version" />
</div>
<h2><xsl:choose>
<xsl:when test='lang("en")'>Description</xsl:when>
<xsl:otherwise>Beschreibung</xsl:otherwise>
</xsl:choose></h2>
<div class="text"><xsl:apply-templates select="desc" /></div>
<xsl:apply-templates select="syntax" />
<xsl:for-each select="syntax"><xsl:for-each select="params">
<h2>Parameter<xsl:if test="count(param)!=1 and lang('en')">s</xsl:if></h2>
<dl><xsl:for-each select="param">
<dt><xsl:value-of select="name" />: </dt>
<dd><div class="text">
<xsl:apply-templates select="optional" />
<xsl:apply-templates select="desc" />
</div></dd>
</xsl:for-each></dl>
</xsl:for-each></xsl:for-each>
<xsl:for-each select="remark">
<xsl:if test="generate-id(.)=generate-id(../remark[1])">
<h2><xsl:choose>
<xsl:when test='lang("en")'>Remark<xsl:if test="count(../remark)!=1">s</xsl:if></xsl:when>
<xsl:otherwise>Anmerkung<xsl:if test="count(../remark)!=1">en</xsl:if></xsl:otherwise>
</xsl:choose></h2>
</xsl:if>
<div class="text"><xsl:apply-templates /></div>
</xsl:for-each>
<xsl:for-each select="examples">
<h2><xsl:choose>
<xsl:when test='lang("en")'>Example<xsl:if test="count(example)!=1">s</xsl:if></xsl:when>
<xsl:otherwise>Beispiel<xsl:if test="count(example)!=1">e</xsl:if></xsl:otherwise>
</xsl:choose></h2>
<xsl:apply-templates />
</xsl:for-each>
<xsl:apply-templates select="related" />
</xsl:template>
<xsl:template match="syntax">
<h2>Syntax</h2>
<div class="text fnsyntax">
<span class="type"><xsl:apply-templates select="rtype" /></span>
<xsl:if test="not(contains(rtype[1],'&amp;'))"><xsl:text>&#160;</xsl:text></xsl:if>
<xsl:value-of select="../title" />
(<xsl:apply-templates select="params" />);
</div>
</xsl:template>
<xsl:template match="params">
<xsl:for-each select="param">
<xsl:apply-templates select="." /><xsl:if test="position()!=last()">, </xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="param">
<span class="type"><xsl:value-of select="type" /></span>
<xsl:if test="not(contains(type[1],'&amp;'))"><xsl:text>&#160;</xsl:text></xsl:if>
<xsl:value-of select="name" />
</xsl:template>
<xsl:template match="optional">
[opt]
</xsl:template>
<xsl:template match="category">
<b><xsl:choose>
<xsl:when test='lang("en")'>Category: </xsl:when>
<xsl:otherwise>Kategorie: </xsl:otherwise>
</xsl:choose></b>
<xsl:value-of select="." /><xsl:apply-templates select="../subcat" />
</xsl:template>
<xsl:template match="subcat">
/ <xsl:value-of select="." />
</xsl:template>
<xsl:template match="version">
<b><xsl:choose>
<xsl:when test='lang("en")'>Since engine version: </xsl:when>
<xsl:otherwise>Ab Engineversion: </xsl:otherwise>
</xsl:choose></b>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="extversion">
<xsl:choose>
<xsl:when test='lang("en")'>
(extended in <xsl:value-of select="." />)
</xsl:when>
<xsl:otherwise>
(erweitert ab <xsl:value-of select="." />)
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="example">
<div class="example"><xsl:apply-templates /></div>
</xsl:template>
<xsl:template match="text">
<div class="text"><xsl:apply-templates /></div>
</xsl:template>
<xsl:template match="part">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="@id">
<xsl:attribute name="id"><xsl:value-of select="." /></xsl:attribute>
</xsl:template>
<xsl:template match="doc/h">
<h1><xsl:apply-templates select="@id|node()" /></h1>
</xsl:template>
<xsl:template match="doc/part/h">
<h2><xsl:apply-templates select="@id|node()" /></h2>
</xsl:template>
<xsl:template match="doc/part/part/h">
<h3><xsl:apply-templates select="@id|node()" /></h3>
</xsl:template>
<xsl:template match="doc/part/part/part/h">
<h4><xsl:apply-templates select="@id|node()" /></h4>
</xsl:template>
<!-- copy img, a, em and br literally -->
<xsl:template match="img|a|em|strong|br|code/i|code/b">
<xsl:copy>
<!-- including every attribute -->
<xsl:for-each select="@*|node()">
<xsl:copy />
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="dl">
<dl><xsl:apply-templates select="dt|dd" /></dl>
</xsl:template>
<xsl:template match="dt">
<dt><xsl:apply-templates select="@id|node()" /></dt>
</xsl:template>
<xsl:template match="dd">
<dd><xsl:apply-templates /></dd>
</xsl:template>
<xsl:template match="related">
<div class="text">
<b><xsl:choose>
<xsl:when test='lang("en")'>See also: </xsl:when>
<xsl:otherwise>Siehe auch: </xsl:otherwise>
</xsl:choose></b>
<xsl:for-each select="*">
<xsl:sort />
<xsl:apply-templates select="." /><xsl:if test="position()!=last()">, </xsl:if>
</xsl:for-each>
</div>
</xsl:template>
<xsl:template match="funclink">
<a><xsl:attribute name="href"><xsl:value-of select="$relpath" />sdk/script/fn/<xsl:value-of select="." /><xsl:value-of select="$fileext" /></xsl:attribute><xsl:value-of select="." /></a>
</xsl:template>
<xsl:template match="emlink" name="link">
<!-- so this template can be called for the navigation -->
<xsl:param name="href" select="@href" />
<xsl:param name="text" select="." />
<a>
<xsl:attribute name="href">
<xsl:value-of select="$relpath" />sdk/<xsl:choose>
<!-- replace the .html extension with .xml (or whatever) -->
<xsl:when test="substring-before($href,'.html')">
<xsl:value-of select="concat(substring-before($href,'.html'), $fileext, substring-after($href,'.html'))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$href" />
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:value-of select="$text" />
</a>
</xsl:template>
<xsl:template match="author">
<div class="author"><xsl:value-of select="." />, <xsl:value-of select="following-sibling::date" /></div>
</xsl:template>
<xsl:template match="date" />
<xsl:template match="ul">
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="li">
<li><xsl:apply-templates /></li>
</xsl:template>
<xsl:template match="table">
<table>
<xsl:apply-templates select="caption" />
<xsl:apply-templates select="rowh" />
<tbody>
<xsl:for-each select="row">
<tr>
<xsl:apply-templates select="@id" />
<xsl:if test="../bitmask">
<xsl:attribute name="style">cursor:pointer;</xsl:attribute>
<xsl:attribute name="id">bit<xsl:value-of select="position() - 1" /></xsl:attribute>
<xsl:attribute name="onClick">Switch(<xsl:value-of select="position() - 1" />);</xsl:attribute>
</xsl:if>
<xsl:if test="position() mod 2=0"><xsl:attribute name="class">dark</xsl:attribute></xsl:if>
<xsl:for-each select="col">
<td><xsl:apply-templates select="@colspan|node()"/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
<xsl:apply-templates select="bitmask" />
</xsl:template>
<xsl:template match="table/caption">
<caption><xsl:apply-templates select="@id|node()" /></caption>
</xsl:template>
<xsl:template match="table/bitmask">
<xsl:value-of select="." />:
<input id="input" onKeyUp="Calc();" name="input" type="text">
<xsl:variable name="num"><xsl:choose>
<xsl:when test="count(../row)&lt;3">1</xsl:when>
<xsl:when test="count(../row)&lt;6">2</xsl:when>
<xsl:when test="count(../row)&lt;9">3</xsl:when>
<xsl:when test="count(../row)&lt;13">4</xsl:when>
<xsl:when test="count(../row)&lt;16">5</xsl:when>
<xsl:when test="count(../row)&lt;19">6</xsl:when>
<xsl:when test="count(../row)&lt;23">7</xsl:when>
<xsl:when test="count(../row)&lt;26">8</xsl:when>
<xsl:when test="count(../row)&lt;29">9</xsl:when>
<xsl:when test="count(../row)&lt;33">10</xsl:when>
</xsl:choose></xsl:variable>
<xsl:attribute name="size"><xsl:value-of select="$num" /></xsl:attribute>
<xsl:attribute name="maxlength"><xsl:value-of select="$num" /></xsl:attribute>
</input>
</xsl:template>
<xsl:template match="rowh">
<thead><tr>
<xsl:apply-templates select="@id" />
<xsl:for-each select="col">
<th><xsl:apply-templates select="@colspan|node()"/></th>
</xsl:for-each>
</tr></thead>
</xsl:template>
<xsl:template match="@colspan">
<xsl:attribute name="colspan"><xsl:value-of select="." /></xsl:attribute>
</xsl:template>
<xsl:template name="nav"><xsl:if test="$webnotes">
<ul class="nav">
<li class="fineprint"><xsl:choose>
<xsl:when test='lang("en")'>Clonk Developer Mode Documentation</xsl:when>
<xsl:otherwise>Clonk Entwicklermodus Dokumentation</xsl:otherwise>
</xsl:choose></li>
<li class="switchlang"><xsl:choose>
<xsl:when test='lang("en")'><a href='javascript:switchLanguage()'><img src='/deco/dco_de_sml.gif' alt='German' border='0'/></a></xsl:when>
<xsl:otherwise><a href='javascript:switchLanguage()'><img src='/deco/dco_en_sml.gif' alt='English' border='0'/></a></xsl:otherwise>
</xsl:choose></li>
<li><xsl:call-template name="link">
<xsl:with-param name="href" select="'index.html'" />
<xsl:with-param name="text"><xsl:choose>
<xsl:when test='lang("en")'>Introduction</xsl:when>
<xsl:otherwise>Einleitung</xsl:otherwise>
</xsl:choose></xsl:with-param>
</xsl:call-template></li>
<li><a>
<xsl:attribute name="href"><xsl:value-of select="$relpath" />content.html</xsl:attribute>
<xsl:choose>
<xsl:when test='lang("en")'>Contents</xsl:when>
<xsl:otherwise>Inhalt</xsl:otherwise>
</xsl:choose>
</a></li>
<li><a>
<xsl:attribute name="href"><xsl:value-of select="$relpath" />search.php</xsl:attribute>
<xsl:choose>
<xsl:when test='lang("en")'>Search</xsl:when>
<xsl:otherwise>Suche</xsl:otherwise>
</xsl:choose>
</a></li>
<li><xsl:call-template name="link">
<xsl:with-param name="href" select="'console.html'" />
<xsl:with-param name="text" select="'Engine'" />
</xsl:call-template></li>
<li><xsl:call-template name="link">
<xsl:with-param name="href" select="'cmdline.html'" />
<xsl:with-param name="text"><xsl:choose>
<xsl:when test='lang("en")'>Command Line</xsl:when>
<xsl:otherwise>Kommandozeile</xsl:otherwise>
</xsl:choose></xsl:with-param>
</xsl:call-template></li>
<li><xsl:call-template name="link">
<xsl:with-param name="href" select="'files.html'" />
<xsl:with-param name="text"><xsl:choose>
<xsl:when test='lang("en")'>Game Data</xsl:when>
<xsl:otherwise>Spieldaten</xsl:otherwise>
</xsl:choose></xsl:with-param>
</xsl:call-template></li>
<li><xsl:call-template name="link">
<xsl:with-param name="href" select="'script/index.html'" />
<xsl:with-param name="text" select="'Script'" />
</xsl:call-template></li>
<!--<li><a><xsl:attribute name="href">index.xml</xsl:attribute>.</a></li>
<xsl:if test="starts-with($relpath, '../..')">
<li><a><xsl:attribute name="href">../index.xml</xsl:attribute>..</a></li>
</xsl:if>-->
</ul>
</xsl:if></xsl:template>
<!-- some code blocks are made into paragraphs -->
<xsl:template match="example/code|part/code|doc/code|dd/code">
<pre class="code"><xsl:apply-templates /></pre>
</xsl:template>
<xsl:template match="code|code/i|code/b">
<xsl:copy><xsl:apply-templates /></xsl:copy>
</xsl:template>
<!-- Highlight Comments and Strings -->
<xsl:template name="color1" match="code/text()">
<xsl:param name="s" select="." />
<!-- /**/, //\n -->
<xsl:param name="tl" select="'/*|//|'" />
<xsl:param name="tr" select="'*/|&#10;|'" />
<xsl:param name="wl" select="substring-before($tl, '|')" />
<xsl:param name="wr" select="substring-before($tr, '|')" />
<!-- the text before the start marker -->
<xsl:variable name="l" select="substring-before($s, $wl)" />
<!-- the text between the start marker and the end marker -->
<xsl:variable name="m" select="substring-before(substring-after($s, $wl), $wr)" />
<!-- the text after $l and $m -->
<xsl:variable name="r" select="substring($s, string-length(concat($l, $wl, $m, $wr)) + 1)" />
<xsl:choose>
<!-- something to highlight -->
<xsl:when test="$m">
<!-- look for the next pair -->
<xsl:call-template name="color1">
<xsl:with-param name="s" select="$l" />
<!-- the text after the current keyword and before the next | -->
<xsl:with-param name="wl" select="substring-before(substring-after($tl, concat($wl, '|')), '|')" />
<xsl:with-param name="wr" select="substring-before(substring-after($tr, concat($wr, '|')), '|')" />
</xsl:call-template>
<i>
<!-- comments in italic -->
<xsl:value-of select="concat($wl, $m, $wr)" />
</i>
<!-- look for the next occurrence of the current pair -->
<xsl:call-template name="color1">
<xsl:with-param name="s" select="$r" />
</xsl:call-template>
</xsl:when>
<!-- pairs left? -->
<xsl:when test="string-length($wr)!=0">
<xsl:call-template name="color1">
<xsl:with-param name="s" select="$s" />
<xsl:with-param name="wl" select="substring-before(substring-after($tl, concat($wl, '|')), '|')" />
<xsl:with-param name="wr" select="substring-before(substring-after($tr, concat($wr, '|')), '|')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- proceed with the keywords -->
<xsl:call-template name="color-strings">
<xsl:with-param name="s" select="$s" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Hightlight stuff like "foo \" bar" correctly. -->
<xsl:template name="color-strings">
<xsl:param name="s" select="." />
<!-- the text before the start marker -->
<xsl:variable name="l" select="substring-before($s, '&quot;')" />
<!-- call a template to get the content of the C4Script string -->
<xsl:variable name="m0">
<xsl:call-template name="parse-string-escapes">
<xsl:with-param name="s" select="substring-after($s, '&quot;')" />
</xsl:call-template>
</xsl:variable>
<!-- then call string() on the resulting tree fragment to get it as an xpath string -->
<xsl:variable name="m" select="string($m0)" />
<!-- the text after $l and $m -->
<xsl:variable name="r" select="substring($s, string-length(concat($l, $m)) + 3)" />
<xsl:choose>
<!-- something to highlight -->
<xsl:when test="$m">
<!-- look for the next pair -->
<xsl:call-template name="color2">
<xsl:with-param name="s" select="$l" />
</xsl:call-template>
<i>
<!-- highlight strings in green -->
<xsl:attribute name="class">string</xsl:attribute>
<xsl:value-of select="concat('&quot;', $m, '&quot;')" />
</i>
<!-- look for the next string -->
<xsl:call-template name="color-strings">
<xsl:with-param name="s" select="$r" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- proceed with the keywords -->
<xsl:call-template name="color2">
<xsl:with-param name="s" select="$s" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="parse-string-escapes">
<xsl:param name="s" select="." />
<xsl:choose>
<!-- end of string -->
<xsl:when test="substring($s, 1, 1)='&quot;'">
</xsl:when>
<!-- \" -->
<xsl:when test="substring($s, 1, 2)='\&quot;'">
<xsl:value-of select="'\&quot;'" />
<xsl:call-template name="parse-string-escapes">
<xsl:with-param name="s" select="substring($s, 3)" />
</xsl:call-template>
</xsl:when>
<!-- anything else -->
<xsl:when test="$s">
<xsl:value-of select="substring($s, 1, 1)" />
<xsl:call-template name="parse-string-escapes">
<xsl:with-param name="s" select="substring($s, 2)" />
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- Highlight keywords -->
<xsl:template name="color2">
<xsl:param name="s" select="." />
<!-- the list of keywords -->
<xsl:param name="t" select="'#include|#strict|#appendto|public|private|protected|global|static|var|local|const|int|id|object|string|bool|return|goto|if|else|break|continue|while|for|func|true|false|'" />
<xsl:param name="w" select="substring-before($t, '|')" />
<!-- text before the keyword -->
<xsl:variable name="l" select="substring-before($s, $w)" />
<!-- the charecter directly before the keyword -->
<xsl:variable name="cb" select="substring($l, string-length($l))" />
<!-- text after the keyword -->
<xsl:variable name="r" select="substring-after($s, $w)" />
<!-- the character directly after the keyword -->
<xsl:variable name="ca" select="substring($r, 1, 1)" />
<xsl:choose>
<xsl:when test="string-length($w)=0">
<xsl:value-of select="$s" />
</xsl:when>
<!-- only highlight when the text was found and is not surrounded by other text -->
<xsl:when test="($l or $r) and (not(contains('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $cb)) or $cb='') and (not(contains('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $ca)) or $ca='')">
<!-- look for the next keyword in the preceding text -->
<xsl:call-template name="color2">
<xsl:with-param name="s" select="$l" />
<xsl:with-param name="w" select="substring-before(substring-after($t, concat($w, '|')), '|')" />
</xsl:call-template>
<!-- make the keyword bold -->
<b><xsl:value-of select="$w" /></b>
<!-- proceed with the remaining text -->
<xsl:call-template name="color2">
<xsl:with-param name="s" select="$r" />
<xsl:with-param name="w" select="$w" />
</xsl:call-template>
</xsl:when>
<!-- not found: look for the next keyword -->
<xsl:otherwise>
<xsl:call-template name="color2">
<xsl:with-param name="s" select="$s" />
<xsl:with-param name="w" select="substring-before(substring-after($t, concat($w, '|')), '|')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

View File

@ -0,0 +1,209 @@
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import sys
import xml.sax
import experimental
import gettext
class ClonkEntityResolver(xml.sax.handler.EntityResolver):
def resolveEntity(self, publicId, systemId):
s = 'file:sdk/script/fn/' + systemId
return s
def setrelpath(self, path):
dirlist = path.split('/')
self.relpath = ''
for d in dirlist[1:]:
self.relpath = self.relpath + '../'
class Clonkparser(xml.sax.handler.ContentHandler):
def __init__(self):
self.cats = { }
self.subcats = { }
self.versions = { }
self.extversions = { }
self.files = { }
def setfilename(self, filename):
self.filename = filename
self.htmlfilename = filename[:-3] + 'html'
def _setcurcat(self, curcat):
self.curcat = curcat
if self.curcat not in self.cats:
self.cats[self.curcat] = { }
self.subcats[self.curcat] = { }
def startDocument(self):
self.cur = ""
self.curcat = ""
self.title = ""
self.state = None
def startElement(self, name, attr):
# subcat inside category?
if self.state == 'category' and self.cur != "":
self._setcurcat(self.cur)
self.cur = ""
self.state = name
def characters(self, content):
if self.state in ['category', 'subcat', 'version', 'extversion', 'title']:
self.cur += content
def endElement(self, name):
self.cur = self.cur.strip()
if name == 'category':
if self.cur != "":
self._setcurcat(self.cur)
if self.title == "":
print "WARNING: category before title in " + self.filename
self.cats[self.curcat][self.title] = self.htmlfilename
else:
print "WARNING: possibly broken category in " + self.filename
elif name == 'subcat':
if self.curcat != "" and self.cur != "":
self.cats[self.curcat].pop(self.title, None)
if self.cur not in self.subcats[self.curcat]:
self.subcats[self.curcat][self.cur] = { }
self.subcats[self.curcat][self.cur][self.title] = self.htmlfilename
else:
print "WARNING: possibly broken subcategory in " + self.filename
elif name == 'version':
self.cur = self.cur.upper()
if self.cur != "":
if self.cur not in self.extversions:
self.extversions[self.cur] = { }
if self.cur not in self.versions:
self.versions[self.cur] = { }
self.versions[self.cur][self.title] = self.htmlfilename
elif name == 'extversion':
self.cur = self.cur.upper()
if self.cur != "":
if self.cur not in self.extversions:
self.extversions[self.cur] = { }
if self.cur not in self.versions:
self.versions[self.cur] = { }
self.extversions[self.cur][self.title] = self.htmlfilename
elif name == 'title':
self.title = self.cur
self.files[self.title] = self.htmlfilename
self.cur = ""
self.state = None
def printcontents1(f, _):
f.write('\n <UL>\n')
cats = parser.cats.keys()
cats.sort()
for cat in cats:
f.write(' <LI> <OBJECT type="text/sitemap">\n' +
' <param name="Name" value="' + _(cat) + '">\n' +
' </OBJECT>\n' +
' <UL>\n')
subcats = parser.subcats[cat].keys()
subcats.sort()
for subcat in subcats:
f.write(' <LI> <OBJECT type="text/sitemap">\n' +
' <param name="Name" value="' + _(subcat) + '">\n' +
' </OBJECT>\n' +
' <UL>\n')
titles = parser.subcats[cat][subcat].keys()
titles.sort()
for title in titles:
f.write(' <LI> <OBJECT type="text/sitemap">\n' +
' <param name="Name" value="' + _(title) + '">\n' +
' <param name="Local" value="' +
parser.subcats[cat][subcat][title] + '#' + _(title) + '">\n' +
' </OBJECT>\n')
f.write(' </UL>\n')
titles = parser.cats[cat].keys()
titles.sort()
for title in titles:
f.write(' <LI> <OBJECT type="text/sitemap">\n' +
' <param name="Name" value="' + _(title) + '">\n' +
' <param name="Local" value="' +
parser.cats[cat][title] + '#' + _(title) + '">\n' +
' </OBJECT>\n')
f.write(' </UL>\n')
f.write(' </UL>\n')
def printcontents2(f, _):
f.write(' <UL>\n')
versions = parser.versions.keys()
versions.sort()
for version in versions:
f.write(' <LI> <OBJECT type="text/sitemap">\n' +
' <param name="Name" value="' + _(version) + '">\n' +
' </OBJECT>\n' +
' <UL>\n')
titles = parser.versions[version].keys()
titles.sort()
for title in titles:
f.write(' <LI> <OBJECT type="text/sitemap">\n' +
' <param name="Name" value="' + _(title) + '">\n' +
' <param name="Local" value="' +
parser.versions[version][title] + '#' + _(title) + '">\n' +
' </OBJECT>\n')
titles = parser.extversions[version].keys()
titles.sort()
for title in titles:
f.write(' <LI> <OBJECT type="text/sitemap">\n' +
' <param name="Name" value="' + _(title) + ' (' + _('erweitert') + ')">\n' +
' <param name="Local" value="' +
parser.extversions[version][title] + '#' + _(title) + '">\n' +
' </OBJECT>\n')
f.write(' </UL>\n')
f.write(' </UL>\n')
parser = Clonkparser()
reader = xml.sax.make_parser()
reader.setContentHandler(parser)
reader.setEntityResolver(ClonkEntityResolver())
for filename in sys.argv[1:]:
reader.getEntityResolver().setrelpath(filename)
parser.setfilename(filename)
reader.parse(filename)
if 0:
reader.setContentHandler(experimental.ExperimentParser())
for filename in sys.argv[1:]:
reader.getEntityResolver().setrelpath(filename)
reader.parse(filename)
experimental.Result()
mofile = open("en.mo", "rb")
gt = gettext.GNUTranslations(mofile)
_ = lambda s: s.encode('iso-8859-1')
for f, fin in ((file("chm/de/Output.hhc", "w"), file("Template.hhc", "r")),
(file("chm/en/Output.hhc", "w"), file("Template.en.hhc", "r"))):
for line in fin:
if line.find("<!-- Insert Functions here 1-->") != -1:
printcontents1(f, _)
elif line.find("<!-- Insert Functions here 2-->") != -1:
printcontents2(f, _)
else:
f.write(line)
f.close()
fin.close()
_ = lambda s: gt.ugettext(s).encode('iso-8859-1')
for f, fin in ((file("chm/de/Output.hhp", "w"), file("Template.hhp", "r")),
(file("chm/en/Output.hhp", "w"), file("Template.en.hhp", "r"))):
for line in fin:
if line.find("[INFOTYPES]") != -1:
for filename in sys.argv[1:]:
f.write(filename[:-3].replace("/", "\\") + 'html\r\n')
f.write(line)
f.close()
fin.close()
_ = lambda s: s.encode('iso-8859-1')
for f, fin in ((file("chm/de/Output.hhk", "w"), file("Template.hhk", "r")),
(file("chm/en/Output.hhk", "w"), file("Template.en.hhk", "r"))):
for line in fin:
if line.find("</UL>") != -1:
for title, filename in parser.files.iteritems():
f.write(" <LI> <OBJECT type=\"text/sitemap\">\n" +
" <param name=\"Name\" value=\"" + _(title) + "\">\n" +
" <param name=\"Local\" value=\"" + filename + "#" + _(title) + "\">\n" +
" </OBJECT>\n")
f.write(line)
f.close()
fin.close()
_ = lambda s: gt.ugettext(s).encode('iso-8859-1')

View File

@ -0,0 +1,212 @@
#!/usr/bin/perl -w
use strict;
# A quick and dirty script to turn Microsofts hhc-format to strict html in Clonkstyle
# usage: build_contents.pl infile.hhc > outfile.html
#print header
my $lang = 'de';
$lang = 'en' if $ARGV[0] =~ m!/en/!;
sub printheader {
my $title = shift(@_);
print <<HEADER;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>$title</title>
<link rel=stylesheet type="text/css" href="doku.css">
<style type="text/css">
ul {
list-style:none;
padding:0;
margin:0;
}
ul ul {
padding-left:1em;
}
ul h1, ul h2, ul h3, ul h4, ul h5, ul h6 {
font-size: 100%;
font-weight: bold;
font-style: normal;
margin: 0;
border: none;
padding: 0;
}
ul a {
color: navy;
text-decoration: none;
}
ul a.visited {
color: navy;
text-decoration: none;
}
.collapseimg {
cursor: pointer;
}
.toggleinvisi * .invisi {
display: none;
}
</style>
</head>
<body id='thebody'>
<script type='text/javascript'>
<!--
//# Javascript aus mwForum, www.mwforum.org
function tb(listId) {
var branch = document.getElementById('brn' + listId);
var toggle = document.getElementById('tgl' + listId);
if (!branch || !toggle) return;
if (branch.style.display != 'none' && branch.className!='invisi') {
branch.style.display = 'none';
toggle.src = 'images/bullet_folder.gif';
toggle.title = 'Zweig expandieren';
toggle.alt = '+';
} else {
branch.style.display = '';
toggle.src = 'images/bullet_folder_open.gif';
toggle.title = 'Zweig zusammenklappen';
toggle.alt = '-';
}
branch.className='';
return true;
}
function ta(listId) {
var branch = document.getElementById('brn' + listId);
var divs = document.getElementsByTagName('ul');
var display = '', img = 'bullet_folder_open.gif';
if (branch.style.display != 'none' && branch.className!='invisi') {
display = 'none';
img = 'bullet_folder.gif';
}
for (var i=0; i < divs.length; i++) {
if (divs[i].id.indexOf('brn') == 0) {
divs[i].style.display = display;
divs[i].className='';
}
}
var imgs = document.getElementsByTagName('img');
for (var i=0; i < imgs.length; i++) {
if (imgs[i].id.indexOf('tgl') == 0) imgs[i].src = 'images/' + img;
}
return true;
}
//# Alle als anfaenglich geschlossen markierten Listitems unsichtbar machen
//# Beim Laden sind sie sichtbar, damit die Seite ohne Javascript benutzbar ist
document.getElementById('thebody').className = 'toggleinvisi';
//-->
</script>
HEADER
if ($lang eq 'de') {
print <<HEADER;
<ul class="nav">
<li class="fineprint">Clonk Entwicklermodus Dokumentation</li>
<li><a href="sdk/index.html">Einleitung</a></li>
<li><a href="content.html">Inhalt</a></li>
<li><a href="search.php">Suche</a></li>
<li><a href="sdk/console.html">Engine</a></li>
<li><a href="sdk/cmdline.html">Kommandozeile</a></li>
<li><a href="sdk/files.html">Spieldaten</a></li>
<li><a href="sdk/script/index.html">Script</a></li>
</ul>
<h1>Inhalt</h1>
<div class="text">
<ul>
HEADER
} else {
print <<HEADER;
<ul class="nav"><li class="fineprint">Clonk Developer Mode Documentation</li>
<li><a href="sdk/index.html">Introduction</a></li>
<li><a href="content.html">Contents</a></li>
<li><a href="search.php">Search</a></li>
<li><a href="sdk/console.html">Engine</a></li>
<li><a href="sdk/cmdline.html">Command Line</a></li>
<li><a href="sdk/files.html">Game Data</a></li>
<li><a href="sdk/script/index.html">Script</a></li>
</ul>
<h1>Contents</h1>
<div class="text">
<ul>
HEADER
}
}
# skip strange header
while (<>) { last if (m/\<UL\>/); };
my $name = "";
my $h = 2;
my $ids = 0;
my $tabs;
my $header_was_printed = 0;
while (<>) { # assigns each line in turn to $_
# Assume that html comments appear only as oneliners, multiline comments are a problem for when they are used
next if (/\<\!\-\-/);
# This only works when the title appears before the linktarget
if (m/\<param name="Name" value="([^"]+)"\>/) {
$name=$1;
if (!$header_was_printed) {
printheader($name);
$header_was_printed = 1;
}
}
# Turn the title to a link when there is a target
if (m/\<param name="Local" value="([^"]+)"\>/) {
$name = "<a href=\"$1\">$name</a>";
# Damn windows-backslashes.
$name =~ s,\\,/,g;
}
# indenting
$tabs = "\t" x ($h - 2);
# We have a title?
if ($name) {
# the next list item
if (m/\<LI\>/) {
print "$tabs\t<li><img src='images/bullet_sheet.gif' alt='-'>\n",
"$tabs\t$name</li>\n";
$name="";
}
# the list ends here, no more list items to come
if (m/\<\/UL\>/) {
print "$tabs\t<li><img src='images/bullet_sheet.gif' alt='-'>\n",
"$tabs\t$name</li>\n",
"$tabs</ul>\n",
"$tabs</li>\n";
$name="";
--$h;
}
# a new list which deserves a headline
if (m/\<UL\>/) {
++$ids;
my $x = $h > 2 || "0";
print "$tabs\t<li>\n",
"$tabs\t<h$h><img id='tgl$ids' class='collapseimg' src='images/bullet_folder", $x ? "" : "_open", ".gif'",
" alt='-' onclick='tb($ids)' ondblclick='ta($ids)'>\n",
"$tabs\t$name</h$h>\n",
"$tabs\t<ul id='brn$ids'", $x ? " class='invisi'" : "", ">\n";
$name="";
++$h;
}
} else {
if (m/\<\/UL\>/) {
print "$tabs</ul>\n" if ($h > 1);
print "$tabs</li>\n" if ($h > 2);
--$h;
}
}
}
# some additional text at the bottom, too
print <<FOOTER;
</div>
</body>
</html>
FOOTER

185
docs/doku.css 100644
View File

@ -0,0 +1,185 @@
body {
margin: 0;
font-family: "Dejavu Sans", "BitStream Vera Sans", Verdana, sans-serif;
background-color: white;
color: black;
}
body, table caption, h3, dt, div.fnsyntax {
font-size: 13px;
line-height: 18px;
}
.text, div.fnsyntax, pre.code, ul, ol {
margin-bottom: 18px;
margin-top: 0;
}
h3, h4, h5, h6, .text, div.fnsyntax, pre.code, dt, ul, ol {
margin-left: 18px;
margin-right: 2%;
}
div.example {
margin-bottom: 36px;
}
dd {
margin: 0;
}
img {
margin-right: 6px;
vertical-align: text-bottom;
}
img#cpem {
float: left;
margin: 0 6px 6px 18px;
}
h1, h2 {
font-weight: bold;
padding: 0 2% 0 18px;
margin-bottom: 18px;
text-indent: 0;
border-bottom: 1px solid #667abe;
/*CR-red: #c91603*/
}
h1 {
font-size: 24px;
line-height: 35px;
margin-top: 18px;
}
h2 {
font-size: 18px;
line-height: 17px;
margin-top: 0;
}
h3, dt, table caption {
text-align: left;
font-weight: bold;
margin-bottom: 0;
margin-top: 0;
}
h4 {
font-size: 12px;
font-weight: bold;
line-height: 18px;
}
table {
border: 1px solid #667abe;
border-spacing: 0;
border-collapse: collapse;
font-size: 11px;
margin-bottom: 17px;
margin-top: 0;
}
th, td {
padding: 0 6px;
text-align: left;
vertical-align: top;
margin: 0;
border: 0;
}
th {
font-weight: bold;
}
tr.dark, th {
color: black;
background-color: #f4f4f0;
}
tr.mark, tr.darkmark {
background-color: Highlight;
color: HighlightText;
}
input {
border-width: 2px;
line-height: 18px;
padding-top: 1px;
padding-bottom: 0;
margin: 0;
vertical-align: 2px;
}
div.fnsyntax {
text-indent: -18px;
margin-left: 36px;
}
code, div.fnsyntax, pre.code {
font-family: "Dejavu Sans Mono", "BitStream Vera Sans Mono", Consolas, "Lucida Console", Monaco, monospace;
}
pre.code {
display: block;
white-space: -moz-pre-wrap; /* Gecko */
white-space: -pre-wrap; /* Opera 4 - 6 */
white-space: -o-pre-wrap; /* Opera >= 7 */
white-space: pre-wrap; /* CSS2.1 */
word-wrap: break-word; /* IE 5.5+ */
padding: 8px;
border: 1px dashed #667abe;
color: black;
background-color: #f4f4f0;
}
span.type, code b, pre.code b {
font-weight: bold;
color: navy;
background-color: transparent;
}
code i.string, pre.code i.string {
font-style: normal;
color: green;
background-color: transparent;
}
div.author {
text-align: right;
font-style: italic;
margin-right: 36px;
}
ul.nav {
border-bottom: 1px solid #667abe;
border-top: 1px solid #667abe;
padding: 5px 18px 5px 18px;
margin: 6px 0 -1px 0;
text-align: center;
font-size: 11px;
line-height: 18px;
}
ul.nav li {
margin: 0 9px 0 9px;
display: inline;
}
ul.nav li.fineprint {
float: left;
color: #999999;
margin: 0;
}
ul.nav li.switchlang {
float: right;
color: #999999;
margin: 0;
}
ul.nav a, ul.nav a.visited {
color: navy;
text-decoration: none;
}

20063
docs/en.po 100644

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,83 @@
# -*- coding: iso-8859-15 -*-
import xml.sax
#def htmlescape(str):
# s = list(str)
# for i in range(len(s)):
# c = ord(s[i])
# if c > 127:
# s[i] = '&#%(#)d;' % {"#": c}
# return "".join(s)
codeparents = {}
allcode = {}
c4scripter = file("Functions.txt", 'w')
class ExperimentParser(xml.sax.handler.ContentHandler):
def __init__(self):
self.statestack = []
self.parameter = ""
self.type = ""
self.rtype = ""
self.name = ""
self.title = ""
self.cur = ""
self.desc = ""
def startElement(self, name, attr):
self.statestack.append(name)
if name == 'params':
self.parameter = ''
if 0 and name == 'img':
for a in attr.getNames():
if a in codeparents:
codeparents[a] += 1
else:
codeparents[a] = 1
if 1 and len(self.statestack) > 1 and self.statestack[-2] == 'dd':
if name in codeparents:
codeparents[name] += 1
else:
codeparents[name] = 1
if False and name == 'text':
if self.statestack[-2] in codeparents:
codeparents[self.statestack[-2]] += 1
else:
codeparents[self.statestack[-2]] = 1
def endElement(self, name):
self.statestack = self.statestack[:-1]
self.cur = self.cur.strip()
if name == 'type':
self.type = self.cur
elif name == 'name':
self.name = self.cur
elif name == 'title':
self.title = self.cur
elif name == 'rtype':
self.rtype = self.cur
elif name == 'desc':
self.desc = self.cur
elif name == 'func':
c4scripter.write("""[Function]
Name=%s
Return=%s
Parameter=%s
DescDE=%s
"""
% (self.title, self.rtype, self.parameter, self.desc))
elif name == 'param':
if self.parameter != '':
self.parameter += ', '
self.parameter += self.type + ' ' + self.name
self.cur = ''
def characters(self, content):
self.cur += content.encode('iso-8859-1')
if self.statestack[-1] == 'code':
for a in content:
allcode[a] = a
def Result():
print codeparents
a = allcode.keys()
a.sort()
print '"' + ''.join(a) + '"'
c4scripter.close()

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<doc>
<!-- Zum markieren von veralteten Funktionen im Inhaltsverzeichnis -->
<text>erweitert</text>
</doc>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
docs/images/Hut.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 856 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 859 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Kommandozeilenparameter</title>
<h id="cmdline">Kommandozeilenparameter</h>
<text>Das Installationsverzeichnis von Clonk enthält die unten beschriebenen Programmdateien. Durch einen Start per Doppelklick oder Startmenü werden Programme ohne zusätzliche Parameter ausgeführt. Innerhalb einer Konsole (Eingabeaufforderung) oder Script-Datei (Batch-Datei) lassen sich die Programme jedoch mit zusätzlichen Kommandozeilenparametern starten, die hier ausführlich erklärt werden.</text>
<part>
<h id="Clonk">Clonk.exe <tt>(Windows)</tt> clonk (Linux) Clonk (Mac)</h>
<text>Die Engine. Das eigentliche Hauptprogramm des Spiels. Ohne Parameter startet das Spiel im Vollbildmodus (Spielermodus) und zeigt das Startmenü an. Folgende Parameter sind zusätzlich möglich:</text>
<dl>
<dt id="console">/console</dt>
<dd><text>Startet im Konsolenmodus (auch Entwicklermodus oder Fenstermodus genannt). Im Konsolenmodus können Szenarien bearbeitet und abgespeichert werden. Das Spiel startet auch standardgemäß im Konsolenmodus, wenn ein Szenario (*.c4s) als Parameter angegeben und kein /fullscreen gesetzt ist.</text></dd>
<dt id="fullscreen">/fullscreen</dt>
<dd><text>Startet im Vollbildmodus (auch Spielermodus genannt). Wenn kein Szenario und keine Direktbeitritt-Adresse angegeben ist, wird das Startmenü angezeigt.</text></dd>
<dt id="config">/config:Filename</dt>
<dd><text>Lädt die als Filename angegebene Konfiguirationsdatei (wenn vorhanden) und schreibt beim Beenden in diese.</text></dd>
<dt id="record">/record</dt>
<dd><text>Die Runde wird aufgenommen.</text></dd>
<dt id="network">/network bzw. /nonetwork</dt>
<dd><text>Aktiviert bzw. deaktiviert den Netzwerkmodus.</text></dd>
<dt id="signup">/signup bzw. /nosignup</dt>
<dd><text>Aktiviert bzw. deaktiviert die Anmeldung des Spiels als Internetspiel. Dieser Wert wird in der Konfiguration gespeichert.</text></dd>
<dd><text>/signup impliziert /network. /nosignup impliziert /noleague.</text></dd>
<dt id="league">/league bzw. /noleague</dt>
<dd><text>Aktiviert bzw. deaktiviert die Anmeldung des Spiels als Ligaspiel. Dieser Wert wird in der Konfiguration gespeichert.</text></dd>
<dd><text>/league impliziert /network und /signup.</text></dd>
<dt id="runtimejoin">/runtimejoin bzw. /noruntimejoin</dt>
<dd><text>Aktiviert bzw. deaktiviert den Laufzeitbeitritt. Dieser Wert wird in der Konfiguration gespeichert.</text></dd>
<dt id="regjoinonly">/regjoinonly</dt>
<dd><text>Bewirkt, dass nur Clients mit registrierter Version in Netzwerkspielen beitreten können (in Dedicated-Server-Engine <em>immer</em> aktiv).</text></dd>
<dt id="ncrw">/faircrew bzw. /trainedcrew</dt>
<dd><text>Aktiviert bzw. deaktiviert faire Crew. Bei fairer Crew starten alle Clonks mit gleichen physischen Eigenschaften. Bei trainierter Crew starten Clonks mit ihren individuell trainierten physischen Eigenschaften. Dieser Wert wird in der Konfiguration gespeichert.</text></dd>
<dt id="lobby">/lobby[:time]</dt>
<dd><text>Aktiviert vor dem Start eines Netzwerkspieles die Lobby, das heißt den Wartebildschirm mit Chat vor dem Spielstart. Standardgemäß aktiv für alle Netzwerkspiele. Impliziert /network. Bei angegebener Zeit (z.B. /lobby:120) startet die Lobby im Countdown, so dass im Beispiel das Spiel automatisch nach 120 Sekunden gestartet wird.</text></dd>
<dt id="observe">/observe</dt>
<dd><text>Für Netzwerkspiele: tritt als Zuschauer (ohne Spieler) bei. Impliziert /network.</text></dd>
<dt id="Join">/join:&lt;<em>Adresse</em>&gt;</dt>
<dd><text>Sucht ein Netzwerkspiel auf der angegebenen Adresse und tritt dort bei. Es sollte kein lokales Szenario (*.c4s) angegeben werden. Impliziert /network.</text></dd>
<dt id="clonkp">clonk://&lt;<em>Adresse</em>&gt;/</dt>
<dd><text>Bei Angabe einer Adresse gleich /join. Wird "update" als Adresse übergeben, sucht die Engine beim Start nach verfügbaren Updates.</text></dd>
<dt id="tcpport">/tcpport:&lt;<em>Portnummer</em>&gt;</dt>
<dd><text>Setzt die TCP-Portnummer für Clientverbindungen in Netzwerkspielen. Dieser Wert wird in der Konfiguration gespeichert. Bei Portnummer -1 werden TCP-Verbindungen deaktiviert, und Netzwerkdaten nur über UDP gesendet.</text></dd>
<dt id="udpport">/udpport:&lt;<em>Portnummer</em>&gt;</dt>
<dd><text>Setzt die UDP-Portnummer für Clientverbindungen in Netzwerkspielen. Dieser Wert wird in der Konfiguration gespeichert. Bei Portnummer -1 werden UDP-Verbindungen deaktiviert, und Netzwerkdaten nur über TCP gesendet.</text></dd>
<dt id="pass">/pass:&lt;<em>Passwort</em>&gt;</dt>
<dd><text>Nur Netzwerk-Host: setzt das Beitrittspasswort auf den angegebenen Wert. Wird &lt;<em>Passwort</em>&gt; leer gelassen, wird kein Passwort gesetzt.</text></dd>
<dt id="comment">/comment:&lt;<em>Kommentar</em>&gt;</dt>
<dd><text>Nur Netzwerk-Host: setzt den Beschreibungstext des Netzwerkspiels. Dieser Wert wird in der Konfiguration gespeichert.</text></dd>
<dt id="update">/update</dt>
<dd><text>Prüft beim Programmstart auf verfügbare Updates.</text></dd>
<dt id="recdump">/recdump:&lt;<em>Dateiname</em>&gt;</dt>
<dd><text>Nur für die Wiedergabe von Aufnahmen: Vor dem Start der Wiedergabe werden die Wiedergabedaten (Spielerkommandos) in eine Datei mit dem Namen &lt;<em>Dateiname</em>&gt; im Clonkverzeichnis geschrieben. Endet der Dateiname auf .txt, werden die Daten als Text geschrieben; sonst binär. Die abzuspielende Aufnahme muss trotzdem als Szenariendatei angegeben werden (Zum Beispiel Clonk.exe Aufnahmen.c4f\Record001.c4s /recdump:CtrlRec.txt).</text></dd>
<dt id="startup">/startup:&lt;<em>Name</em>&gt;</dt>
<dd><text>Nur für Vollbild-Startmenü: Statt des Hauptmenüs wird direkt eines der Untermenüs angezeigt. Mögliche Werte für &lt;<em>Name</em>&gt; sind <em>main</em> (Hauptmenü), <em>scen</em> (Szenarienauswahl), <em>netscen</em> (Szenarienauswahl für Netzwerkspiel), <em>net</em> (Netzwerk/Internet-Spieleliste), <em>options</em> (Optionsmenü), <em>plrsel</em> (Spielerauswahl) und <em>about</em> (Credits).</text></dd>
<dt id="c4s">*.c4s</dt>
<dd><text>Bei Angabe eines Szenarios (Dateiendung .c4s) wird dieses direkt gestartet.</text></dd>
<dt id="c4d">*.c4d</dt>
<dd><text>Wenn das gestartete Szenario keine Objektdefinitionen (Dateiendung .c4d) vorgibt, und keine Definitionen über die Registry angegeben werden, können sie über die Kommandozeile übergeben werden.</text></dd>
<dt id="c4p">*.c4p</dt>
<dd><text>Spielerdateien (Dateiendung .c4p) können in der Kommandozeile angegeben werden. Wenn keine Spielerdateien in der Kommandozeile stehen, werden die in der Registrierung gespeicherten, zuletzt aktivierten Spieler benutzt. Durch Angabe eines nichtexistenten Spielers (z.B. gibtsnicht.c4p) kann verhindert werden, dass die in der Registrierung aktivierten Spieler beitreten (z.B. zum Bearbeiten einer Landschaft im Entwicklermodus).</text></dd>
<dt id="c4u">*.c4u</dt>
<dd><text>Wird ein Update-Paket (Dateiendung .c4u) als Parameter an die Engine übergeben, so wird die Engine versuchen, dieses Update auf die lokale Spielinstallation anzuwenden.</text></dd>
</dl>
</part>
<part>
<h id="Editor">Editor.exe (nur Windows)</h>
<text>Der Editor zum Bearbeiten von Gruppendateien und Entwickeln eigener Spielerweiterungen. Der Editor hat keine Parameter.</text>
</part>
<part>
<h id="C4Group">c4group.exe (Windows) c4group (Linux) c4group (Mac)</h>
<text>Dieses Kommandozeilen-Programm dient zum Bearbeiten von Gruppendateien. Es kann nicht per Doppelklick, sondern nur per Kommandozeile (Eingabeaufforderung) gestartet werden. Auskunft über alle verfügbaren Kommandozeilenparameter erhält man, indem man das Programm ohne weitere Parameter über die Kommandozeile startet.</text>
</part>
<author>Sven2</author><date>Februar 2007</date>
</doc>

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Die Engine im Entwicklermodus</title>
<h id="DieEngineimEntwicklermodus">Engine</h>
<part>
<text>Im Entwicklermodus der Engine können Szenarien bei laufendem oder angehaltenen Spiel
bearbeitet und anschließend abgespeichert werden.</text>
<h id="Bearbeitungsmodus">Bearbeitungsmodus:</h>
<text><img src="../images/icon_em_play.gif" width="16" height="16"/> Spielen: die Maussteuerung gilt
jeweils nur im ersten Sichtfenster des entsprechenden Spielers. Die Tastatursteuerung aller Spieler
gilt, wenn ein beliebiges Sichtfenster aktiviert ist.</text>
<text><img src="../images/icon_em_edit.gif" width="16" height="16"/> Editieren: Objekte können
mit der Maus bearbeitet und verschoben werden. Weitere Bearbeitungsoptionen durch das
Kontextmenü über die rechte Maustaste. Um neue Objekte zu erzeugen, die entsprechende
Objektdefinition (c4d) per Drag 'n' Drop aus dem Menüsystem in ein Sichtfenster der Engine
ziehen. Objekte können in anderen Objekten abgelegt werden, indem sie bei gehaltener Ctrl-Taste
auf das entsprechende Zielobjekt gezogen werden.</text>
<text><img src="../images/icon_em_brush.gif" width="16" height="16"/> Zeichnen:
Werkzeugeinstellungen zum Bearbeiten der Landschaft im Kontextmenü über die rechte
Maustaste.</text>
<h id="Landschaftsmodus">Landschaftsmodus:</h>
<text><img src="../images/icon_em_dynamic.gif" width="16" height="16"/> Dynamisch: Szenarien mit
dynamischer Landkarte kommen mit einer sehr geringen Dateigröße aus. Da die Landkarte bei
jedem Start neu erzeugt wird, sollten im Entwicklermodus der Engine bearbeitete Szenarien jedoch nur
dann mit dynamischer Landkarte gespeichert speichern werden, wenn die Einstellungen der Landkarte
keinerlei Zufallswerte enthalten. Dynamische Landschaften können nicht im Zeichenmodus
bearbeitet werden. Es ist nicht möglich, statische oder exakte Landschaften in den dynamischen
Modus zurückzuschalten.</text>
<text><img src="../images/icon_em_static.gif" width="16" height="16"/> Statisch: Mittlere
Dateigröße. Die Landschaft wird in groben Blöcken aus einer verkleinerten Landkarte
generiert. Statische Landschaften sollten nur bei angehaltenen Spiel bearbeitet werden, da
Veränderungen zur Laufzeit (z.B. durch grabende Clonks, Explosionen, bewegte
Flüssigkeiten) zwar zunächst im Spiel sichtbar sind, in der bearbeiteten Karte allerdings
nicht berücksichtigt werden, was zu Ungenauigkeiten in der Anzeige führen kann.</text>
<text><img src="../images/icon_em_exact.gif" width="16" height="16"/> Exakt: extrem hohe
Dateigröße. Ermöglicht dafür pixelgenaue Bearbeitung der Landschaft.</text>
<h id="Landschaftswerkzeug">Landschaftswerkzeug:</h>
<text><img src="../images/icon_em_brush.gif" width="16" height="16"/> Pinsel (Stärke
einstellbar).</text>
<text><img src="../images/icon_em_line.gif" width="16" height="16"/> Linie (Stärke
einstellbar).</text>
<text><img src="../images/icon_em_rect.gif" width="16" height="16"/> Ausgefülltes
Rechteck.</text>
<text><img src="../images/icon_em_eyedrop.gif" width="16" height="16"/> Übernimmt Material,
Textur und Materialhintergrund aus der Landschaft (Textur nur in statischen Karten).</text>
<text><img src="../images/icon_em_fill.gif" width="16" height="16"/> Materialfüller
(Stärke einstellbar, nur in exakten Karten bei laufendem Spiel).</text>
<h id="Materialhintergrund">Materialhintergrund:</h>
<text><img src="../images/icon_em_sky.gif" width="16" height="16"/> Hinter dem gezeichneten Material
erscheint nach dem Freigraben Himmel.</text>
<text><img src="../images/icon_em_tunnel.gif" width="16" height="16"/> Hinter dem gezeichneten
Material erscheint nach dem Freigraben Tunnelwand.</text>
<h id="Tastaturbelegung">Tastaturbelegung:</h>
<text>Im aktivierten Sichtfenster:</text>
<text>Scroll Lock (Rollen): Scrolling des Sichtfensters ein/aus</text>
<text>Break (Pause): Spiel anhalten/weiter</text>
<text>Space (Leertaste): Bearbeitungsmodus wechseln</text>
<text>Ctrl-W, Ctrl-M, Ctrl-T, Ctrl-I, +/- : Einstellungen im Zeichenmodus</text>
</part>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>Juni 2004</date>
</doc>

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>ActMap.txt</title>
<h id="ActMap">ActMap</h>
<text>In der Komponente ActMap.txt werden die möglichen
Aktivitäten eines Objekts beschrieben. Die Animationsphasen einer
jeden Aktivität werden dabei in der Graphics.png (oder veraltet
Graphics.bmp) als nebeneinanderliegende Bilder abgelegt und in der
ActMap.txt über Bildkoordinaten referenziert. Aktivitäten können im
Spiel von der Engine oder per Script gestartet oder beendet werden
(siehe <emlink href="script/fn/SetAction.html">SetAction</emlink>). Einige
Aktivitäten, speziell solche von Lebewesen, nutzen dabei Engine-interne
<emlink href="definition/procedures.html">Prozeduren</emlink>, die das Bewegungsverhalten
des Objekts während der Ausführung dieser Aktivität steuert.</text>
<text>
<table>
<caption id="BeliebigvieleSektionenAction">Beliebig viele Sektionen [Action]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Name</col>
<col>Zeichenfolge (max. 30)</col>
<col>Name der Aktivität. Siehe <emlink href="script/fn/SetAction.html">SetAction</emlink>().</col>
</row>
<row>
<col>Procedure</col>
<col>Zeichenfolge (max. 30)</col>
<col>Interne Standardprozedur. Siehe <emlink href="definition/procedures.html">Prozeduren</emlink>.</col>
</row>
<row>
<col>Directions</col>
<col>Integer</col>
<col>Anzahl der Animationsrichtungen. Animationreihen vertikal in Graphics.png.</col>
</row>
<row>
<col>FlipDir</col>
<col>Integer</col>
<col>Wenn ungleich 0, gibt dieser Wert die erste Animationsrichtung an, die durch
Spiegelung einer davor liegenden Animationsrichtung gezeichnet wird. So wird bei Wert
1 für die Richtung 1 (rechts) die gespiegelte Grafik der Richtung 0 (links) verwendet
(siehe Clonks). Bei Wert 7 wird für Richtungen &gt;= 7 die gespiegelte Grafik der
Richtung 6 - n verwendet, d.h. bei höheren Richtungsnummern wird wieder rückwärts nach
oben gezählt (siehe Banner im Ritterpack).</col>
</row>
<row>
<col>Length</col>
<col>Integer</col>
<col>Anzahl der Animationsphasen dieser Aktivität (horizontal in Graphics.png).</col>
</row>
<row>
<col>Reverse</col>
<col>Integer</col>
<col>0 oder 1. Bei Wert 1 werden die Animationsphasen rückwärts angezeigt.</col>
</row>
<row>
<col>Delay</col>
<col>Integer</col>
<col>Wartezeit in Frames (Ticks) zwischen zwei Animationsphasen.</col>
</row>
<row>
<col>Attach</col>
<col>Integer</col>
<col>Festhalten an Oberflächen: <emlink href="definition/cnat.html">CNAT-Wert</emlink>,
also z.B. Wert 8 für Boden. Wird nur ausgewertet, wenn Procedure NONE ist.</col>
</row>
<row>
<col>Facet</col>
<col>6 Integer</col>
<col>Animationsgrafik: Zielrechteck aus Graphics.png auf Objektposition.</col>
</row>
<row>
<col>FacetBase</col>
<col>Integer</col>
<col>0 oder 1. Bei Wert 1 wird Facet mit der Standardobjektgrafik unterlegt.</col>
</row>
<row>
<col>FacetTopFace</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 wird das TopFace (siehe <emlink href="definition/defcore.html">DefCore.txt</emlink>)
aus der animierten Facet verwendet.</col>
</row>
<row>
<col>FacetTargetStretch</col>
<col>Boolean</col>
<col>0 oder 1. Bei 1 wird die Grafik vertikal bis zur oberen Kante des ActionTarget gestretcht.</col>
</row>
<row>
<col>NextAction</col>
<col>Zeichenfolge (max. 30)</col>
<col>Nächste Aktivität nach Ablauf der Animationsphasen.</col>
</row>
<row>
<col>NoOtherAction</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 ist keine Aktivität nach dieser möglich (z.B. Tod, Zerstörung).</col>
</row>
<row>
<col>StartCall</col>
<col>Zeichenfolge (max. 30)</col>
<col>Objektscriptfunktion, die beim Start der Aktivität aufgerufen wird.</col>
</row>
<row>
<col>EndCall</col>
<col>Zeichenfolge (max. 30)</col>
<col>Wird am Ende der Aktivität aufgerufen.</col>
</row>
<row>
<col>PhaseCall</col>
<col>Zeichenfolge (max. 30)</col>
<col>Wird bei jedem Phasenschritt aufgerufen.</col>
</row>
<row>
<col>AbortCall</col>
<col>Zeichenfolge (max. 30)</col>
<col>Wird aufgerufen, wenn die Aktivität vor ihrem Ende durch eine andere ersetzt wird.</col>
</row>
<row>
<col>InLiquidAction</col>
<col>Zeichenfolge (max. 30)</col>
<col>Auszuführende Aktion, wenn das Objekt in Flüssigkeiten eintaucht.</col>
</row>
<row>
<col>Sound</col>
<col>Zeichenfolge (max. 30)</col>
<col>Dauerhaftes Geräusch dieser Aktivität.</col>
</row>
<row>
<col>ObjectDisabled</col>
<col>Integer</col>
<col>0 oder 1. Eingeschränkte Fähigkeit des Objekts während dieser Aktion.</col>
</row>
<row>
<col>DigFree</col>
<col>Integer</col>
<col>Freigraben während dieser Aktion. Objektrechteck 1, sonst Kreisradius.</col>
</row>
<row>
<col>EnergyUsage</col>
<col>Integer</col>
<col>Nötige Energie für diese Aktion. Maschinen 500.</col>
</row>
</table>
</text>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>Juni 2004</date>
</doc>

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Objektkategorien</title>
<h id="Objektkategorien">Objektkategorien</h>
<text>Die Kategorie eines Objekts ist eine DWord-Bitmaske,
die sich aus den folgenden Werten zusammen setzt. Die ersten 5 Kategorien erlauben keine Kombination,
von den Bits 0-4 darf und muss immer genau eines zur Zeit gesetzt sein.</text>
<text>
<table>
<rowh><col>Bit</col><col>Wert</col><col>Kategorie</col><col>Beschreibung</col></rowh>
<row>
<col>0</col> <col>1</col> <col>C4D_StaticBack</col>
<col>Unbewegliches Hintergrundobjekt.</col>
</row>
<row>
<col>1</col> <col>2</col> <col>C4D_Structure</col>
<col>Gebäude.</col>
</row>
<row>
<col>2</col> <col>4</col> <col>C4D_Vehicle</col>
<col>Fahrzeug.</col>
</row>
<row>
<col>3</col> <col>8</col> <col>C4D_Living</col>
<col>Lebewesen.</col>
</row>
<row>
<col>4</col> <col>16</col> <col>C4D_Object</col>
<col>Gegenstand.</col>
</row>
<row>
<col>5</col> <col>32</col> <col>C4D_Goal</col>
<col>Spielziel.</col>
</row>
<row>
<col>6</col> <col>64</col> <col>C4D_Environment</col>
<col>Umweltsteuerungsobjekt.</col>
</row>
<row>
<col>7</col> <col>128</col> <col>C4D_SelectBuilding</col>
<col>Menüsystem Auswahl Gebäude.</col>
</row>
<row>
<col>8</col> <col>256</col> <col>C4D_SelectVehicle</col>
<col>Menüsystem Auswahl Fahrzeuge.</col>
</row>
<row>
<col>9</col> <col>512</col> <col>C4D_SelectMaterial</col>
<col>Menüsystem Auswahl Material.</col>
</row>
<row>
<col>10</col> <col>1024</col> <col>C4D_SelectKnowledge</col>
<col>Menüsystem Auswahl herstellbare Objekte.</col>
</row>
<row>
<col>11</col> <col>2048</col> <col>C4D_SelectHomebase</col>
<col>Menüsystem Auswahl Heimatbasismaterial.</col>
</row>
<row>
<col>12</col> <col>4096</col> <col>C4D_SelectAnimal</col>
<col>Menüsystem Auswahl Tiere.</col>
</row>
<row>
<col>13</col> <col>8192</col> <col>C4D_SelectNest</col>
<col>Menüsystem Auswahl Nester.</col>
</row>
<row>
<col>14</col> <col>16384</col> <col>C4D_SelectInEarth</col>
<col>Menüsystem Auswahl Erdreich-Objekte.</col>
</row>
<row>
<col>15</col> <col>32768</col> <col>C4D_SelectVegetation</col>
<col>Menüsystem Auswahl Vegetation.</col>
</row>
<row>
<col>16</col> <col>65536</col> <col>C4D_TradeLiving</col>
<col>Verkaufbares Lebewesen.</col>
</row>
<row>
<col>17</col> <col>131072</col> <col>C4D_Magic</col>
<col>Zauber.</col>
</row>
<row>
<col>18</col> <col>262144</col> <col></col>
<col>Reserviert; wird intern benutzt.</col>
</row>
<row>
<col>19</col> <col>524288</col> <col>C4D_Rule</col>
<col>Spielregel.</col>
</row>
<row>
<col>20</col> <col>1048576</col> <col>C4D_Background</col>
<col>Objekt ist hinter der Landschaft.</col>
</row>
<row>
<col>21</col> <col>2097152</col> <col>C4D_Parallax</col>
<col>Objekt bewegt sich parallax nach Local 0 und 1. Für mehr Informationen siehe <funclink>C4D_Parallax</funclink>.</col>
</row>
<row>
<col>22</col> <col>4194304</col> <col>C4D_MouseSelect</col>
<col>Objekt mit der Maus anwählbar, MouseSelection(int iPlr)-Callback im Objekt.</col>
</row>
<row>
<col>23</col> <col>8388608</col> <col>C4D_Foreground</col>
<col>Objekt ist im Vordergrund, also vor globalen Partikeln.</col>
</row>
<row>
<col>24</col> <col>16777216</col> <col>C4D_MouseIgnore</col>
<col>Objekt ist nicht mit der Maus anwählbar.</col>
</row>
<row>
<col>25</col> <col>33554432</col> <col>C4D_IgnoreFoW</col>
<col>Objekt wird auch dann gezeichnet, wenn es eigentlich vom Kriegsnebel bedeckt ist. Nützlich beispielsweise für Statusanzeigen und Kontrollelemente. Ab CR.</col>
</row>
<bitmask>Kategorie</bitmask>
</table>
</text>
<author>Sven2</author><date>Mai 2006</date>
<author>Newton &amp; Günther</author><date>Januar 2005</date>
</doc>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>CNAT - Contact Attachment</title>
<h id="CNAT">CNAT - Contact Attachment</h>
<text>An zahlreichen Stellen benutzt die Engine ContactAttachment-Werte (DWord-Bitmasken), um
Ausrichtungen von Objekten und Vorgängen zu verwalten. So kann z.B. einem Objekt-Vertex ein
CNAT-Wert zugewiesen werden, der die Ausrichtung <em>Links</em> enthält. Sind für dieses
Objekt <em>ContactCalls</em> aktiviert (siehe
<emlink href="definition/defcore.html">DefCore.txt</emlink>), so ruft die Engine bei jedem Kontakt
dieses Vertex mit der Landschaft die Objektscript-Funktion <em>ContactLeft</em> auf. CNAT-Werte
setzen sich aus folgenden Bits zusammen:</text>
<text>
<table>
<rowh><col>Bit</col><col>Wert</col><col>CNAT</col><col>Beschreibung</col></rowh>
<row><col>0</col><col>1</col><col>CNAT_Left</col>
<col>Richtung: Links</col></row>
<row><col>1</col><col>2</col><col>CNAT_Right</col>
<col>Richtung: Rechts</col></row>
<row><col>2</col><col>4</col><col>CNAT_Top</col>
<col>Richtung: Oben</col></row>
<row><col>3</col><col>8</col><col>CNAT_Bottom</col>
<col>Richtung: Unten</col></row>
<row><col>4</col><col>16</col><col>CNAT_Center</col>
<col>Richtung: Mitte (nicht für Attachment)</col></row>
<row><col>5</col><col>32</col><col>CNAT_MultiAttach</col>
<col>Zusatz-Flag: neues Attachment-Verhalten für Objekte mit gleicher Richtung an mehreren
Vertices (ab Version 4.95.4)</col></row>
<row><col>6</col><col>64</col><col>CNAT_NoCollision</col>
<col>Zusatz-Flag: kollisionsfreier Vertex (ab Version 4.95.4)</col></row>
<bitmask>CNAT</bitmask>
</table>
</text>
<author>Sven2</author><date>April 2002</date>
<author>Newton &amp; Günther</author><date>Januar 2005</date>
<author>Matthes</author><date>August 2005</date>
</doc>

View File

@ -0,0 +1,257 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>DefCore.txt</title>
<h id="DefCoretxt">DefCore</h>
<part>
<text>In der Komponente DefCore.txt eines Objekts lässt sich das Basisverhalten eines Objekts
einrichten. Dazu gehören zum Beispiel die Kategorie, also ob es sich um ein Gebäude oder ein Lebewesen handelt,
die Grafik, Eingangs- und Einsammelbereiche, Brennbarkeit, Wert, Masse, und so weiter.
Außerdem wird hier das Objekt-ID angegeben, mit dem dieser Objekttyp
später in Scripten referenziert wird - es ist wichtig, dass jedes Objekt ein eigenes ID hat.
Hierzu siehe auch <emlink href="definition/index.html#ObjektundEntwicklerIdentifikation">Objekt- und
Entwickleridentifikation</emlink>.</text>
<text>
<table>
<caption id="SektionDefCore">Sektion [DefCore]</caption>
<rowh><col>Wert</col><col>Datentyp</col><col>Beschreibung</col></rowh>
<row><col>id</col><col>Definitions-ID</col>
<col>Id des Objekts.</col></row>
<row><col>Version</col><col>3 Integer</col>
<col>Minimale vom Objekt benötigte Engine-Version. Dieser Eintrag sollte bei jeder Änderung auf die jeweils
aktuelle Clonk-Version gesetzt werden, damit ersichtlich ist, zu welchem Zeitpunkt das Objekt erschienen ist.</col></row>
<row><col>Name</col><col>Zeichenfolge (max. 30)</col>
<col>Name des Objekts. Bei Mehrsprachigkeit Names.txt nutzen.</col></row>
<row><col>Category</col><col>Integer</col>
<col>Kategorie des Objekts. Siehe <emlink href="definition/category.html">Objektkategorien</emlink>.</col></row>
<row><col>MaxUserSelect</col><col>Integer</col>
<col>Maximale Anzahl beim Platzieren des Objekts im Menüsystem.</col></row>
<row><col>TimerCall</col><col>Zeichenfolge (max. 30)</col>
<col>Regelmäßig aufgerufene Funktion des Objektscripts.
Siehe <emlink href="definition/script.html">Objektscripte</emlink>.</col></row>
<row><col>Timer</col><col>Integer</col>
<col>Zeitabstand der TimerCalls in Frames. Ohne Angabe gilt der Vorgabewert 35.</col></row>
<row><col>ContactCalls</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob Kontaktaufrufe im Objektscript getätigt werden.</col></row>
<row><col>Width</col><col>Integer</col>
<col>Breite des Objekts.</col></row>
<row><col>Height</col><col>Integer</col>
<col>Höhe des Objekts.</col></row>
<row><col>Offset</col><col>2 Integer</col>
<col>Koordinatenabstand der linken oberen Ecke zur Objektmitte.</col></row>
<row><col>Value</col><col>Integer</col>
<col>Wert des Objekts in Geldpunkten.</col></row>
<row><col>Mass</col><col>Integer</col>
<col>Gewicht des Objekts. Stein 10, Clonk 50, Hütte 1000, Burg 10000.</col></row>
<row><col>Components</col><col>ID-Liste</col>
<col>Elemente, aus denen das Objekt zusammen gesetzt ist.
Im Bau oder Wachstum befindliche Objekte enthalten nur anteilige Komponenten.</col></row>
<row><col>SolidMask</col><col>6 Integer</col>
<col>Massivbereiche des Objekts. Zielrechteck aus Graphics.bmp aufs Objekt.</col></row>
<row><col>TopFace</col><col>6 Integer</col>
<col>Verdeckende Oberflächen. Zielrechteck aus Graphics.bmp aufs Objekt.</col></row>
<row><col>Picture</col><col>4 Integer</col>
<col>Repräsentativgrafik des Objekts. Rechteck aus Graphics.bmp.</col></row>
<row><col>Vertices</col><col>Integer</col>
<col>Anzahl der Eckpunkte des Objekts. 1 bis 30.</col></row>
<row><col>VertexX</col><col>bis zu 30 Integer</col>
<col>Liste der horizontalen Koordinaten der Eckpunkte des Objekts.
Siehe <emlink href="definition/vertices.html">Vertices</emlink>.</col></row>
<row><col>VertexY</col><col>bis zu 30 Integer</col>
<col>Liste der vertikalen Koordinaten der Eckpunkte des Objekts.</col></row>
<row><col>VertexCNAT</col><col>bis zu 30 Integer</col>
<col>Liste der Ausrichtungsbestimmungen der Eckpunkte.
Siehe <emlink href="definition/cnat.html">CNAT</emlink>.</col></row>
<row><col>VertexFriction</col><col>bis zu 30 Integer</col>
<col>Liste der Reibungswerte der Eckpunkte, jeweils 1 bis 100.</col></row>
<row><col>Entrance</col><col>4 Integer</col>
<col>Koordinaten des Eingangsbereichs des Objekts relativ zur Objektmitte.</col></row>
<row><col>Collection</col><col>4 Integer</col>
<col>Koordinaten des Aufnahmebereichs des Objekts relativ zur Objektmitte.</col></row>
<row><col>CollectionLimit</col><col>Integer</col>
<col>Anzahl der maximal aufnehmbaren Objekte, 0 für uneingeschränkt.</col></row>
<row><col>FireTop</col><col>Integer</col>
<col>Flammenabstand zur Objektunterkante.</col></row>
<row><col>Placement</col><col>Integer</col>
<col>Platzierung: 0 Oberfläche, 1 in Flüssigkeit, 2 in der Luft.</col></row>
<row><col>Exclusive</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt dahinterliegende Objekte blockiert.</col></row>
<row><col>ContactIncinerate</col><col>Integer</col>
<col>Kontaktentzündlichkeit: 0 keine, 1 (hoch) bis 5 (niedrig)</col></row>
<row><col>BlastIncinerate</col><col>Integer</col>
<col>Explosionsentzündlichkeit: 0 keine, sonst bei angegebenem Schadenswert</col></row>
<row><col>BurnTo</col><col>C4ID</col><col>Definitionswechsel bei Entzündung.</col></row>
<row><col>Base</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt Heimatbasis sein kann.</col></row>
<row><col>Line</col><col>Integer</col>
<col>1 Energieleitung, 2 Zuflussrohr, 3 Abflussrohr.</col></row>
<row><col>LineConnect</col><col>Integer</col>
<col>Anschlussfähigkeit für Leitungen.
Siehe <emlink href="definition/lineconnect.html">LineConnect</emlink>.</col></row>
<row><col>Prey</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt ein Beutelebewesen ist.</col></row>
<row><col>Edible</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt essbar ist (noch nicht unterstützt).</col></row>
<row><col>CrewMember</col><col>Integer</col>
<col>0 oder 1. Wenn 1, wird das Objekt beim Kauf der Mannschaft hinzugefügt.
Mit CreateObject erzeugte CrewMember-Objekte müssen mit <emlink href="script/fn/MakeCrewMember">MakeCrewMember</emlink>
der Mannschaft eines Spielers hinzugefügt werden.</col></row>
<row><col>Growth</col><col>Integer</col>
<col>Wachstum des Objekts. Baum 1-4, Lebewesen 15.</col></row>
<row><col>Rebuy</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt nach Verkauf zurückgekauft werden kann.</col></row>
<row><col>Construction</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt als Baustelle gebaut werden kann.</col></row>
<row><col>ConstructTo</col><col>C4ID</col>
<col>Definitionswechsel beim Bau.</col></row>
<row><col>Grab</col><col>Integer</col>
<col>0 kein Anfassen, 1 Anfassen und Verschieben, 2 nur Anfassen.</col></row>
<row><col>GrabPutGet</col><col>Integer</col>
<col>Bitmaske: Bit 0 (Wert 1) Grab und Put, Bit 1 (Wert 2) Grab und Get</col></row>
<row><col>Collectible</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt eingesammelt werden kann.</col></row>
<row><col>Rotate</col><col>Integer</col>
<col>0 keine Rotation, 1 volle Rotation, 2-360 eingeschränkte Rotation</col></row>
<row><col>Chop</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt gefällt werden kann.</col></row>
<row><col>Float</col><col>Integer</col>
<col>Auftrieb in Flüssigkeiten: 0 kein Auftrieb, sonst Auftriebshöhe über Mitte</col></row>
<row><col>ContainBlast</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob Explosionen im Inneren nach außen wirken.</col></row>
<row><col>ColorByOwner</col><col>Integer</col>
<col>0 oder 1. Bei Wert 1 wird das Ausgangsblau, bzw. die Overlay.png, nach dem Besitzer gefärbt.</col></row>
<row><col>ColorByMaterial</col><col>Zeichenfolge (max. 15)</col>
<col>Name des Materials, nach dem das Objekt gefärbt wird.</col></row>
<row><col>HorizontalFix</col><col>Integer</col>
<col>0 oder 1. Bei Wert 1 kann das Objekt sich nur vertikal bewegen.</col></row>
<row><col>BorderBound</col><col>Integer</col>
<col>Bitmaske: Bit 0 (1) Stop an Seiten, Bit 1 (2) Stop oben, Bit 2 (4) Stop unten</col></row>
<row><col>UprightAttach</col><col>Integer</col>
<col>Wenn ungleich 0 (8-10) sitzt das Objekt aufgerichtet auf Massivbereichen auf.</col></row>
<row><col>StretchGrowth</col><col>Integer</col>
<col>0 oder 1. Bei Wert 1 wird das Objekt wie ein Lebewesen vergrößert (abhängig von der Fertigstellung.
Siehe <emlink href="script/fn/GetCon.html">GetCon</emlink>)</col></row>
<row><col>Basement</col><col>Integer</col>
<col>0 kein Fundament, 1 Fundament, andere Werte speziell</col></row>
<row><col>NoBurnDecay</col><col>Integer</col>
<col>0 oder 1. Bei Wert 1 verbrennt das Objekt nicht.</col></row>
<row><col>IncompleteActivity</col><col>Integer</col>
<col>0 oder 1. Wert 1 für Lebewesen, die auch im Wachstum aktiv sein können.</col></row>
<row><col>Oversize</col><col>Integer</col>
<col>0 oder 1. Das Objekt kann mit DoCon auf Übergröße vergrößert werden.</col></row>
<row><col>AttractLightning</col><col>Integer</col>
<col>0 oder 1. Das Objekt zieht Blitze an.</col></row>
<row><col>Fragile</col><col>Integer</col>
<col>0 oder 1. Objekt sollte nicht geworfen werden.</col></row>
<row><col>NoPushEnter</col><col>Integer</col>
<col>0 oder 1. Das Objekt kann nicht durch Anfassen und Steuerung Rauf in andere Objekte hineingeschoben werden
(z.B. Fahrstuhlkorb).</col></row>
<row><col>VehicleControl</col><col>Integer</col>
<col>Bitmaske: Bit 0 (Wert 1) das Objekt kann durch Anfassen von außen und/oder Bit 1 (Wert 2) von innen gesteuert
werden. Bei aktiviertem VehicleControl werden die selbständig auszuführenden Befehle (Commands) eines Clonks
als ControlCommand-Aufrufe an das Script des entsprechenden Fahrzeugs weitergeleitet und können von diesem
ausgewertet und abgefangen werden.
Siehe <emlink href="definition/script.html#ControlFunktionen">Control-Funktionen</emlink>.</col></row>
<row><col>Pathfinder</col><col>Integer</col>
<col>1 - 10. Beeinflusst die Suchtiefe des Wegfindungsalgorithmus (Standard: 1). Vorsicht: hohe Werte sind sehr rechenintensiv.
Mit diesem Wert setzen auch Objekte ohne CrewMember-Wert bei der Ausführung von Kommandos (z.B. MoveTo)
den internen Wegfindungsalgorithmus ein. Erweitert ab 4.95.4.</col></row>
<row><col>NoComponentMass</col><col>Integer</col>
<col>0 oder 1. Bei 1 zählt der Inhalt des Objekts nicht mit zur Gesamtmasse. Dadurch lässt sich zum Beispiel
verhindern, dass Rucksäcke oder Köcher durch ihren Inhalt mörderische Wurfwaffen werden.</col></row>
<row><col>NoStabilize</col><col>Integer</col>
<col>0 oder 1. Bei 1 richtet sich das Objekt nicht automatisch auf 0° Drehung auf, wenn es nur sehr leicht gedreht ist.</col></row>
<row><col>ClosedContainer</col><col>Integer</col>
<col>0 oder 1. Bei 1 können enthaltene Clonks bei aktiviertem Fog Of War nicht herausschauen.</col></row>
<row><col>SilentCommands</col><col>Integer</col>
<col>0 oder 1. Bei 1 werden bei fehlgeschlagenen Commands keine Meldungen ausgegeben.</col></row>
<row><col>NoBurnDamage</col><col>Integer</col>
<col>0 oder 1. Bei 1 wird dem Objekt kein Schaden zugefügt, wenn es brennt.</col></row>
<row><col>TemporaryCrew</col><col>Integer</col>
<col>0 oder 1. Bei 1 wird das Objekt nicht in die Dauerhafte Crew des Spielers eingetragen.</col></row>
<row><col>SmokeRate</col><col>Integer</col>
<col>0 bis 200: Gibt die Rauchmenge an, die das Objekt im Brandfall verursacht. 0 ist kein Rauch, 100 ist die Standardmenge.
Bei Werten ungleich 0 wird allerdings immer die Maximalmenge Rauch produziert, wenn das Objekt in schneller Bewegung ist
(zum Beispiel Brandpfeile).</col></row>
<row><col>BlitMode</col><col>Integer</col>
<col>0 oder 1. Bei 1 wird das Objekt additiv gezeichnet.</col></row>
<row><col>NoBreath</col><col>Integer</col>
<col>0 oder 1. Bei 1 atmet das Objekt nicht, selbst wenn es ein Lebewesen ist.</col></row>
<row><col>ConSizeOff</col><col>Integer</col>
<col>Wert >=0. Abzug des benötigten Bauplatzes von oben.</col></row>
<row><col>NoSell</col><col>Integer</col>
<col>0 oder 1. Bei 1 kann das Objekt nicht verkauft werden.</col></row>
<row><col>NoGet</col><col>Integer</col>
<col>0 oder 1. Bei 1 kann das Objekt nicht manuell aus anderen Objekten heraus genommen werden.01.</col></row>
<row><col>NoFight</col><col>Integer</col>
<col>0 oder 1. Bei 1 kämpft das Objekt nicht mit anderen Lebewesen, selbst wenn es selber ein Lebewesen ist.</col></row>
<row><col>LiftTop</col><col>Integer</col>
<col>Wird ein Objekt bei einer Action mit der Procedure "<emlink href="definition/procedures.html">LIFT</emlink>" mehr als die angegebene Höhe
über der Objektmitte angehoben, wird die Funktion LiftTop im Script aufgerufen.</col></row>
<row><col>RotatedEntrance</col><col>Integer</col>
<col>0 Eingang ist nur bei aufgerichtetem Objekt geöffnet, 1 Eingang ist immer geöffnet, 2-360 Eingang ist innerhalb des entsprechenden Bereichs geöffnet. Ab 4.95.4.</col></row>
<row><col>MoveToRange</col><col>Integer</col>
<col>Maximale Distanz, mit der ein Bewegungskommando einen Zielpunkt treffen muss, damit das Bewegungskommando als erfüllt gilt. Vorgabewert 5. Ab 4.95.4.</col></row>
<row><col>NoTransferZones</col><col>Integer</col>
<col>0 oder 1. Bei 1 berücksichtigt die Wegfindung des Objekts keine Transferzonen an Gebäuden. Ab 4.95.4.</col></row>
<row><col>AutoContextMenu</col><col>Integer</col>
<col>0 oder 1. Bei 1 wird für dieses Gebäude beim Betreten automatisch das Kontextmenü geöffnet. Ab 4.9.7.7.</col></row>
</table>
</text>
<text>
<table>
<caption id="SektionPhysical">Sektion [Physical]</caption>
<rowh><col>Wert</col><col>Datentyp</col><col>Beschreibung</col></rowh>
<row><col>Energy</col><col>Integer</col>
<col>0-100000. Maximale Energie bzw. Lebensenergie.</col></row>
<row><col>Breath</col><col>Integer</col>
<col>0-100000. Maximaler Atem.</col></row>
<row><col>Walk</col><col>Integer</col>
<col>0-100000. Laufgeschwindigkeit.</col></row>
<row><col>Jump</col><col>Integer</col>
<col>0-100000. Sprungkraft.</col></row>
<row><col>Scale</col><col>Integer</col>
<col>0-100000. Klettergeschwindigkeit.</col></row>
<row><col>Hangle</col><col>Integer</col>
<col>0-100000. Hangelgeschwindigkeit.</col></row>
<row><col>Dig</col><col>Integer</col>
<col>0-100000. Grabgeschwindigkeit.</col></row>
<row><col>Swim</col><col>Integer</col>
<col>0-100000. Schwimmgeschwindigkeit.</col></row>
<row><col>Throw</col><col>Integer</col>
<col>0-100000. Wurfkraft.</col></row>
<row><col>Push</col><col>Integer</col>
<col>0-100000. Schiebekraft.</col></row>
<row><col>Fight</col><col>Integer</col>
<col>0-100000. Kampfkraft.</col></row>
<row><col>Magic</col><col>Integer</col>
<col>0-100000. Maximale Zauberenergie.</col></row>
<row><col>Float</col><col>Integer</col>
<col>0-100. Fluggeschwindigkeit.</col></row>
<row><col>CanScale</col><col>Integer</col>
<col>0 oder 1. Klettern.</col></row>
<row><col>CanHangle</col><col>Integer</col>
<col>0 oder 1. Hangeln.</col></row>
<row><col>CanDig</col><col>Integer</col>
<col>0 oder 1. Graben.</col></row>
<row><col>CanConstruct</col><col>Integer</col>
<col>0 oder 1. Bauen. Bei Werten größer 1: Prozentuale Baugeschwindigkeit (100 entspricht dem Standard;
50 ist halbe Standardgeschwindigkeit). Erweitert</col></row>
<row><col>CorrosionResist</col><col>Integer</col>
<col>0 oder 1. Legt fest, ob das Objekt Säure widersteht.</col></row>
<row><col>BreatheWater</col><col>Integer</col>
<col>0 Objekt atmet Luft, 1 Objekt atmet Wasser.</col></row>
</table>
</text>
<h>Hinweis:</h>
<text>Sobald ein Mannschaftsmitglied erschaffen wird, wird für dieses eine eigenständige
Physical-Sektion erschaffen, die zusammen mit dem Mannschaftsmitglied in der Objektinfo (c4i)
gespeichert wird. Jedes Mannschaftsmitglied behält seine eigene Physical-Sektion, da hier alle
individuellen Veränderungen (z.B. erweiterte Fähigkeiten durch Beförderung)
vorgenommen werden. Die Physical-Sektion der Objektdefinition wird also nur bei der Erschaffung des
Objekts verwendet und nicht etwa bei ChangeDef.</text>
</part>
<author>Sven2</author><date>April 2002</date>
</doc>

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Objektdefinitionen</title>
<h id="Objektdefinitionen">Objektdefinitionen</h>
<part>
<text>Mit Objektdefinitionen werden alle in Clonk vorkommenden Spielobjekte - vom Feuermonsterei über Holzhütten bis zum Clonk selber - definiert. Eine Objektdefinition ist eine Gruppendatei, die sich aus folgenden Komponenten zusammen setzt:</text>
<h id="ObjektdefinitionsKomponentenC4D">Objektdefinitions-Komponenten (C4D)</h>
<dl>
<dt><img src="../../images/icon_text.gif" width="16" height="16" /><emlink href="definition/defcore.html">DefCore.txt</emlink></dt>
<dd><text>Objekteigenschaften.</text></dd>
<dt><img src="../../images/icon_text.gif" width="16" height="16" /><emlink href="definition/actmap.html">ActMap.txt</emlink></dt>
<dd><text>Tabelle für Objektaktivitäten.</text></dd>
<dt id="Graphicspng"><img src="../../images/icon_image.gif" width="16" height="16" />Graphics.png</dt>
<dd><text>Grafikelemente des Objekts. Basisgrafik, Animationsphasen sowie ein Bild zur Anzeige in Menüs werden in einer 32-Bit-Bilddatei mit Transparenz (Alpha-Kanal) abgelegt (Format PNG, Farbtiefe 32 Bit RGBA, nicht interlaced).</text></dd>
<dt id="Overlaypng"><img src="../../images/icon_image.gif" width="16" height="16" />Overlay.png</dt>
<dd><text>Der Teil der Objektgrafik, der mit der Spielerfarbe (ColorByOwner, siehe DefCore.txt) eingefärbt werden soll, kann auch als separate Grafik angelegt werden. Auf diese Weise kann die sonst vergebene Farbe Blau in der Graphics.png frei benutzt werden, und es ist auch Antialiasing an den zu verfärbenden Rändern möglich. In der Overlay.png sollten nur Graustufen verwendet werden.</text></dd>
<dt id="Graphicsbmp"><img src="../../images/icon_image.gif" width="16" height="16" />Graphics.bmp</dt>
<dd><text>Das BMP-Format für Grafikelemente ist veraltet, wird aber weiterhin unterstützt. In einem 256 Farb-Bitmap (8 Bit) dürfen nur die Farben 16 bis 103 der festen Clonk-Palette verwendet werden (siehe Originalobjekte).</text></dd>
<dt id="Graphicsex"><img src="../../images/icon_image.gif" width="16" height="16" />Graphics*.png/Overlay*.png/Graphics*.bmp</dt>
<dd><text>Objekte können auch alternative Grafiksätze bereitstellen, die während des Spiels mit Hilfe des Scriptbefehls <emlink href="script/fn/SetGraphics.html">SetGraphics</emlink>() zugewiesen werden können. Der Name der Grafik entspricht dabei dem Dateinamensteil zwischen "Graphics" und der Dateiendung; das entsprechende Overlay wird automatisch mit verwendet. Für Beispiele siehe <emlink href="script/fn/SetGraphics.html">SetGraphics</emlink>().</text></dd>
<dt id="Titlepng"><img src="../../images/icon_image.gif" width="16" height="16" />Title.png/Title.bmp</dt>
<dd><text>Objektdefinitionen können ein zusätzliches Titelbild enthalten (ähnlich Szenarien). Dieses wird im Menüsystem anstelle des Pictures der Objektdefinition angezeigt. Empfohlene Größe: 150x150 Pixel, sofern die vorhandene Titelgrafik dies hergibt. Für Titelbilder wird ebenfalls das veraltete BMP-Format mit 256 Farben weiterhin unterstützt.</text></dd>
<dt id="ScriptcScript__c"><img src="../../images/icon_text.gif" width="16" height="16" /><emlink href="definition/script.html">Script.c</emlink></dt>
<dd><text>Das Objektscript. Siehe <emlink href="script/index.html">Script-Dokumentation</emlink> und <emlink href="lang.html">Sprachanpassung</emlink>.</text></dd>
<dt id="Namestxt"><img src="../../images/icon_text.gif" width="16" height="16" />Names.txt</dt>
<dd><text>Mehrsprachige Namenstabelle (siehe Title.txt bei Szenarien).</text></dd>
<dt id="Desc__txt"><img src="../../images/icon_text.gif" width="16" height="16" />Desc*.txt</dt>
<dd><text>Kurzbeschreibung. Für sprachliche Unterscheidung siehe Szenario-Beschreibungstexte.</text></dd>
<dt id="Ranktxt"><img src="../../images/icon_text.gif" width="16" height="16" />Rank.txt/Rank*.txt</dt>
<dd><text>Für Objektdefinitionen, die einen Clonktyp definieren, können hier spezifische Rangnamen für diesen Clonktyp angegeben werden. Die Rangnamen werden dann auch innerhalb schon existierender Mannschaftsmitglieder auf die angegebenen geändert. Die Rangnamen sollten in einer einfachen Liste untereinander stehen, und maximal 30 Zeichen Länge besitzen. Für ein Beispiel siehe zum Beispiel den Ritter in Knights.c4d. Durch Einfügen des entsprechenden Sprachcodes ist es möglich, Rangnamen für verschiedene Sprachen zu definieren.</text></dd>
<dt id="Rankbmppng"><img src="../../images/icon_image.gif" width="16" height="16" />Rank.png/Rank.bmp</dt>
<dd><text>Für Clonktypen können außerdem spezifische Rangsymbole definiert werden, die dann im Spiel anstelle der Standardsymbole benutzt werden. Ein Rangsymbol muss immer so breit wie hoch sein, und es sollten ausreichend Symbole für alle Ränge vorhanden sein. Bei höheren Rängen als der Anzahl vorhandener Rangsymbole wird von vorne begonnen und ein Stern daneben gezeichnet.</text></dd>
<dt id="wav"><img src="../../images/icon_sound.gif" width="16" height="16" />*.wav</dt>
<dd><text>Objektlokale Sounds. Da diese statisch geladen und nicht wie szenariolokale Sounds dynamisch entladen werden, sollten objektlokale Sounds möglichst klein sein.</text></dd>
<dt id="c4d"><img src="../../images/icon_object_definition.gif" width="16" height="16" />*.c4d</dt>
<dd><text>Die Engine durchsucht alle gültigen c4d-Unterverzeichnisse nach weiteren Definitionen. Objektdefinitionen sollten so in sinnvollen Gruppierungen zusammen gefasst werden.</text></dd>
<dt id="Infotxt"><img src="../../images/icon_text.gif" width="16" height="16" />Info.txt</dt>
<dd><text>Diese Komponente wird nicht von der Engine verarbeitet. Hier kann der Autor zusätzliche Informationen über den Entwicklungsstand seines Objekts, seine Kontaktadresse oder sonstige Informationen angeben, die er anderen Entwicklern mitteilen möchte.</text></dd>
<dt id="Authortxt"><img src="../../images/icon_text.gif" width="16" height="16" />Author.txt</dt>
<dd><text>Sollte den Namen des Autors im Format "Vorname Nachname (Nick)" enthalten und ist dafür gedacht, dass der Name des ursprünglichen Autors erhalten bleibt, selbst wenn die Gruppendatei von einem anderen Entwickler verändert wird (Auswertung dieser Komponente zur Zeit nur bei Dateien, die durch RedWolf Design bearbeitet werden). Dies ist insbesondere für Wettbewerbsszenarien gedacht.</text></dd>
</dl>
<h id="ObjektundEntwicklerIdentifikation">Objekt-Identifikation</h>
<text>Objektdefinitionen werden über ein ID identifiziert, das sich aus vier Zeichen zusammen setzt (z.B. C4ID). Nur Originalobjekte von RedWolf Design nutzen hierbei alle vier Zeichen: ABCD oder ABC1.</text>
<text>Lokale Objektdefinitionen, die nur als Teil eines Szenarios verbreitet werden, erhalten IDs vom Format _ABC.</text>
<text>Von Spielern erstellte Objektdefinitionen, die auch einzeln veröffentlicht werden, sollten das Format AB3C nutzen, wobei nur die ersten beiden Zeichen frei vergeben werden können und die letzten beiden Zeichen (1 Ziffer und 1 Buchstabe) das Entwickler-ID des Spielers darstellen, welches frei wählbar ist, wobei allerdings Überschneidungen mit bereits von anderen Entwicklern benutzten IDs vermieden werden sollten.</text>
</part>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>Juni 2004</date>
</doc>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>LineConnect</title>
<h id="LineConnect">LineConnect</h>
<text>Die LineConnect-Eigenschaft (DWord-Bitmaske) eines Objekts bestimmt, welche Leitungen an das Objekt
angeschlossen werden können und welches Leitungsverhalten das Objekt hat.</text>
<text>
<table><rowh>
<col>Bit</col><col>Wert</col><col>Name</col><col>Beschreibung</col>
</rowh><row>
<col>0</col><col>1</col><col>C4D_PowerInput</col><col>Das Ende einer Energieleitung kann angeschlossen werden.</col>
</row><row>
<col>1</col><col>2</col><col>C4D_PowerOutput</col><col>Der Anfang einer Energieleitung kann angeschlossen werden.</col>
</row><row>
<col>2</col><col>4</col><col>C4D_LiquidInput</col><col>Das Ende eines Rohres kann angeschlossen werden.</col>
</row><row>
<col>3</col><col>8</col><col>C4D_LiquidOutput</col><col>Der Anfang eines Rohres kann angeschlossen werden.</col>
</row><row>
<col>4</col><col>16</col><col>C4D_PowerGenerator</col><col>Das Objekt ist ein Energieerzeuger.</col>
</row><row>
<col>5</col><col>32</col><col>C4D_PowerConsumer</col><col>Das Objekt ist ein Energieverbraucher.</col>
</row><row>
<col>6</col><col>64</col><col>C4D_LiquidPump</col><col>Das Objekt ist eine Pumpe.</col>
</row><row>
<col>7</col><col>128</col><col></col><col>Reserviert, wird nicht benutzt.</col>
</row><row>
<col>8</col><col>256</col><col>C4D_EnergyHolder</col><col>Das Objekt verliert nicht von allein Energie, auch wenn es kein Lebewesen oder Basis ist.</col>
</row>
<bitmask>LineConnect</bitmask>
</table>
</text>
<author>Sven2</author><date>April 2002</date>
<author>Newton</author><date>Januar 2005</date>
<author>Günther</author><date>Juli 2006</date>
</doc>

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Object character flags</title>
<h id="ocf">Object Character Flags</h>
<text>Object Character Flags sind Attribute eines Objekts, die sich als Kombination
aus einigen <emlink href="definition/defcore.html">DefCore</emlink>-Einträgen sowie
dem aktuellen Zustand des Objekts in der Landschaft ergeben. Da sich diese Flags aus
dem gegenwärtigen Zustand des Objekts ergeben, und automatisch von der Engine gesetzt
werden, können sie natürlich nur getestet, und nicht direkt per Script manipuliert
werden.</text>
<text>Alle OCF-Flags sind als Bitmaske in einem 32Bit-DWORD gespeichert. Dadurch
können sie mit einem einfachen bitweisen "und" getestet werden. Also zum Beispiel:</text>
<code>if (<funclink>GetOCF</funclink>(objekt) &amp; <funclink>OCF_Living</funclink>)
<funclink>Log</funclink>("Das Objekt ist ein Lebewesen.");</code>
<text>Die häufigste Anwendung für OCFs sind FindObject-Schleifen:</text>
<code>var obj;
while (obj = <funclink>FindObject</funclink>(0, -100,-100,200,200, <funclink>OCF_Rotate</funclink>, 0,0, <funclink>NoContainer</funclink>(), obj)
<funclink>SetR</funclink>(180, obj);</code>
<text>Dieses Script dreht alle Objekte auf den Kopf.</text>
<h id="ocf_fns">OCF-Konstanten</h>
<text>Es sind folgende OCFs im Script definiert:</text>
<text><funclink>OCF_Alive</funclink>,
<funclink>OCF_AttractLightning</funclink>,
<funclink>OCF_Available</funclink>,
<funclink>OCF_Chop</funclink>,
<funclink>OCF_Collectible</funclink>,
<funclink>OCF_Collection</funclink>,
<funclink>OCF_Construct</funclink>,
<funclink>OCF_Container</funclink>,
<funclink>OCF_CrewMember</funclink>,
<funclink>OCF_Edible</funclink>,
<funclink>OCF_Entrance</funclink>,
<funclink>OCF_Exclusive</funclink>,
<funclink>OCF_FightReady</funclink>,
<funclink>OCF_Fullcon</funclink>,
<funclink>OCF_Grab</funclink>,
<funclink>OCF_HitSpeed1</funclink>,
<funclink>OCF_HitSpeed2</funclink>,
<funclink>OCF_HitSpeed3</funclink>,
<funclink>OCF_HitSpeed4</funclink>,
<funclink>OCF_Inflammable</funclink>,
<funclink>OCF_InFree</funclink>,
<funclink>OCF_InLiquid</funclink>,
<funclink>OCF_InSolid</funclink>,
<funclink>OCF_LineConstruct</funclink>,
<funclink>OCF_Living</funclink>,
<funclink>OCF_NotContained</funclink>,
<funclink>OCF_OnFire</funclink>,
<funclink>OCF_Powerconsumer</funclink>,
<funclink>OCF_PowerSupply</funclink>,
<funclink>OCF_Prey</funclink>,
<funclink>OCF_Rotate</funclink>
</text>
<author>Sven2</author><date>Mai 2002</date>
</doc>

View File

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Prozeduren</title>
<h id="Prozeduren">Prozeduren</h>
<text>Für Objekt-Aktivitäten bietet die Engine diverse Standardprozeduren an, die verschiedene
typische Verhaltensweisen steuern. Durch die Standardprozedur WALK wechselt z.B. die Aktivität Walk
automatisch nach Jump, sobald der Boden unter den Füßen verloren wurde.</text>
<text>
<table>
<rowh>
<col>Prozedur</col>
<col>Beschreibung</col>
<col>Verhalten</col>
<col>CNAT</col>
</rowh><row>
<col>NONE</col>
<col>Keine Prozedur</col>
<col>Nur Schwerkraft oder in der <emlink href="definition/actmap.html">Aktivität</emlink>
festgelegtes Attach.</col>
<col>[Action] Attach</col>
</row><row>
<col>WALK</col>
<col>Laufen</col>
<col>Nach <emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Walk und aktueller
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>FLIGHT</col>
<col>Freier Fall</col>
<col>Nur Schwerkraft.</col>
<col>CNAT_None</col>
</row><row>
<col>KNEEL</col>
<col>Aufstehen</col>
<col>Verhalten nach <emlink href="definition/actmap.html">Aktivität</emlink>.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>SCALE</col>
<col>Klettern</col>
<col>Nach <emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Scale und aktueller
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Left/Right</col>
</row><row>
<col>HANGLE</col>
<col>Hangeln</col>
<col>Nach <emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Hangle und aktueller
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Top</col>
</row><row>
<col>DIG</col>
<col>Graben</col>
<col>Nach <emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Dig und aktueller
<emlink href="script/fn/SetComDir.html">ComDir</emlink>. Bei
<emlink href="script/fn/SetActionData.html">Data</emlink>=1 wird Material freigegraben.</col>
<col>CNAT_None</col>
</row><row>
<col>SWIM</col>
<col>Schwimmen</col>
<col>Nach <emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Swim und aktueller
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_None</col>
</row><row>
<col>THROW</col>
<col>Werfen</col>
<col>Verhalten nach <emlink href="definition/actmap.html">Aktivität</emlink>.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>BRIDGE</col>
<col>Brückenbau</col>
<col>Nach <emlink href="script/fn/SetComDir.html">ComDir</emlink>. Brückenmaterial als Index in
<emlink href="script/fn/SetActionData.html">Data</emlink>.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>BUILD</col>
<col>Bauen</col>
<col>Baut das <emlink href="script/fn/SetAction.html">Zielobjekt</emlink>.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>PUSH</col>
<col>Schieben</col>
<col>Schiebt das <emlink href="script/fn/SetAction.html">Zielobjekt</emlink> nach
<emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Push und
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>CHOP</col>
<col>Fällen</col>
<col>Fällt das <emlink href="script/fn/SetAction.html">Zielobjekt</emlink> nach
<emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Chop.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>LIFT</col>
<col>Heben</col>
<col>Hebt das <emlink href="script/fn/SetAction.html">Zielobjekt</emlink> nach
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_None</col>
</row><row>
<col>FLOAT</col>
<col>Schweben</col>
<col>Nach <emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Float und aktueller
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_None</col>
</row><row>
<col>ATTACH</col>
<col>Festhalten</col>
<col>Richtet Objektposition Vertex a an Vertex b des
<emlink href="script/fn/SetAction.html">Zielobjekts</emlink> aus. a und b sind die beiden niederwertigen Bytes
von <emlink href="script/fn/SetActionData.html">ActionData</emlink> (Siehe
<emlink href="script/fn/SetActionData.html">SetActionData</emlink> für Beispiel). Erweitert ab CE.</col>
<col>CNAT_None</col>
</row><row>
<col>FIGHT</col>
<col>Kämpfen</col>
<col>Nach <emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Fight gegen
<emlink href="script/fn/SetAction.html">Zielobjekt</emlink>.</col>
<col>CNAT_Bottom</col>
</row><row>
<col>CONNECT</col>
<col>Verbinden</col>
<col>Nur <emlink href="definition/lineconnect.html">Leitungsobjekte</emlink>. Verbindet
<emlink href="script/fn/SetAction.html">Zielobjekt 1</emlink> und
<emlink href="script/fn/SetAction.html">Zielobjekt 2</emlink>.</col>
<col>CNAT_None</col>
</row><row>
<col>PULL</col>
<col>Ziehen</col>
<col>Zieht das <emlink href="script/fn/SetAction.html">Zielobjekt</emlink> nach
<emlink href="definition/defcore.html#SektionPhysical">Physical</emlink> Push und
<emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Bottom</col>
</row></table>
</text>
<text>Prozeduren sind in der Engine fest programmiert und stammen aus alten Zeiten, bevor
entsprechendes Verhalten flexibler auf der Ebene von Aktivitäten und Scripts möglich war. Hinter den
meisten Prozeduren verbirgt sich extrem komplexes Verhalten und sie lassen sich nur in ihrer
ursprünglichen Verwendung in Clonks sinnvoll einsetzen.</text>
<author>Sven2</author><date>April 2002</date>
</doc>

View File

@ -0,0 +1,313 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Objektscripte</title>
<h id="Objektscripte">Objektscripte</h>
<part>
<text>Objektscripte kontrollieren die komplexen Verhaltensweisen eines Objekts. Für eine
Beschreibung der Scriptsprache C4Script siehe
<emlink href="script/index.html">C4Script</emlink>-Dokumentation.</text>
<h>Erschaffung</h>
<text>Für jedes Objekt ruft die Engine bei der Erschaffung des Objekts die Funktion
<a href="#Initialize">Initialize</a> im Objektscript auf.</text>
<code>func Initialize()
{
<emlink href="script/fn/CreateContents.html">CreateContents</emlink>(ROCK);
<emlink href="script/fn/return.html">return</emlink>(1);
}
</code>
<text>Ein Objekt mit diesem Script enthält sofort nach seiner Erschaffung einen Stein. Die
Initialisierungsfunktion wird erst aufgerufen, nachdem das Objekt seine volle Größe
erreicht hat. Bei Bauwerken also erst, nachdem sie vollständig gebaut wurden und bei Lebewesen
erst, wenn sie voll ausgewachsen sind.</text>
<h>TimerCall</h>
<text>Jede Objektdefinition kann im <emlink href="definition/defcore.html">DefCore</emlink> einen
TimerCall bestimmen. Der TimerCall ist eine Funktion, die in regelmäßigen Abständen
im Objektscript aufgerufen wird. Den Zeitabstand der Aufrufe bestimmt der DefCore-Eintrag Timer.
Ohne spezielle Angabe für den Timer gilt der Vorgabewert von 35 Frames (also ca. einmal pro
Sekunde).</text>
<h>ActMap.txt</h>
<text>Ein aktives Objekt kann außerdem in seiner
<emlink href="definition/actmap.html">Aktivitätsdefinition</emlink> Script-Aufrufe enthalten. Die
als StartCall definierte Funktion wird immer dann aufgerufen wird, wenn die Aktivitätsschleife
erneut startet. EndCall wird aufgerufen, wenn die Aktivitätsschleife endet. PhaseCall wird bei
jedem Animationsschritt aufgerufen (da dies äußerst rechenintensiv ist, sollte PhaseCall
nur bei seltenen und kurzzeitig ausgeführten Aktivitäten eingesetzt werden). Die Frequenz
der Aufrufe bestimmt sich aus der Aktivitätsgeschwindigkeit.</text>
<h>#include</h>
<text>Ein Objektscript kann auf dem Script eines anderen Objekts basieren:</text>
<code>#include CLNK</code>
<text>An dieser Position wird das komplette Script der jeweiligen Objektdefinition (hier des Clonks)
eingefügt, die selbstverständlich vorhanden und geladen sein muss. Funktionen können
durch später im Script folgende Funktionen gleichen Namens überladen werden. Siehe auch
<funclink>inherited</funclink>().</text>
<h id="Zugangsberechtigung">Zugangsberechtigung</h>
<text>Für Funktionen in Objektscripten kann eine Zugangsberechtigung festgelegt werden:
<table>
<row><col>public</col><col>darf vom Objekt selbst, von der Engine oder von anderen Objekten aufgerufen werden</col></row>
<row><col>protected</col><col>darf nur vom Objekt selbst oder von der Engine aufgerufen werden</col></row>
<row><col>private</col><col>darf nur vom Objekt selbst aufgerufen werden</col></row>
</table>
TimerCall, StartCall, PhaseCall und EndCall können zwar zur Abwärtskompatibilität
auch private Funktionen aufrufen; sie sollten jedoch der Einheitlichkeit halber besser protected
sein. Objekt-Calls der Engine (siehe unten) können nur protected oder public aufrufen.</text>
<text>Funktionen ohne besondere Deklaration gelten als public. Wer sich also unsicher ist, welche
Zugangsberechtigung er verwenden muss, oder aus moralischen oder ideologischen Gründen keine
Funktionen nach außen hin schützen will, kann die Zugangsberechtigung einfach weglassen,
und ist damit immer auf der sicheren Seite.</text>
<h id="ObjektCallsderEngine">Objekt-Calls der Engine</h>
<text>Die Engine ruft zu Zeiten die folgenden Funktionen in Objektscripten auf.
<table>
<rowh><col>Funktion</col><col>Parameter</col><col>Beschreibung</col></rowh>
<row id="Initialize"><col>Initialize</col><col></col>
<col>Wenn das Objekt fertiggestellt wird (<emlink href="script/fn/GetCon.html">Con</emlink>
größer gleich 100).</col></row>
<row id="Completion"><col>Completion</col><col></col>
<col>Veraltet. Wie Initialize.</col></row>
<row id="Construction"><col>Construction</col><col>object pByObj</col>
<col>Wenn das Objekt erzeugt wird. Als Parameter wird das Objekt übergeben, in dem das erzeugende Script steht. Siehe auch <emlink href="script/fn/Construction.html">Construction</emlink></col></row>
<row id="Destruction"><col>Destruction</col><col></col>
<col>Wenn das Objekt gelöscht wird.</col></row>
<row id="Hit"><col>Hit</col><col></col>
<col>Wenn das Objekt bei hoher Geschwindigkeit (>= 15) mit der Landschaft kollidiert oder
aufgenommen wird (Collection)</col></row>
<row id="Hit2"><col>Hit2</col><col></col>
<col>Wie Hit, bei Geschwindigkeiten >= 20 (siehe
<emlink href="script/fn/OCF_HitSpeed2.html">OCF_HitSpeed2</emlink>).</col></row>
<row id="Hit3"><col>Hit3</col><col></col>
<col>Wie Hit, bei Geschwindigkeiten >= 60 (siehe
<emlink href="script/fn/OCF_HitSpeed3.html">OCF_HitSpeed3</emlink>).</col></row>
<row id="Grab"><col>Grab</col><col>object pTarget, bool fGrab</col>
<col>Wenn das Objekt ein anderes Objekt anfasst oder loslässt.</col></row>
<row id="Grabbed"><col>Grabbed</col><col>object pByObject, bool fGrab</col>
<col>Wenn das Objekt durch ein anderes Objekt angefasst oder losgelassen wird. Ab 4.9.8.4.</col></row>
<row id="Get"><col>Get</col><col>object pTarget</col>
<col>Wenn das Objekt ein Objekt aus einem anderen Objekt herausnimmt.</col></row>
<row id="Put"><col>Put</col><col></col>
<col>Wenn das Objekt ein Objekt in einem anderen Objekt ablegt.</col></row>
<row id="Damage"><col>Damage</col><col>int iChange, int iByPlayer</col>
<col>Wenn das Objekt beschädigt wird.</col></row>
<row id="DeepBreath"><col>DeepBreath</col><col></col>
<col>Wenn das Lebewesen nach dem Auftauchen mehr als die Hälfte seiner Atemkapazität
auffüllt.</col></row>
<row id="Incineration"><col>Incineration</col><col>int iByPlayer</col>
<col>Wenn das Objekt entzündet wird. Achtung: Bei Objekten, die ihre Definition mit BurnTo
ändern, findet der Aufruf im verbrannten Objekt statt!</col></row>
<row id="IncinerationEx"><col>IncinerationEx</col><col>int iByPlayer</col>
<col>Wenn das Objekt in einer löschenden Flüssigkeit gesprengt, und damit nicht
angezündet wird. Aufruf analog zu Incineration. Ab CE.</col></row>
<row id="Death"><col>Death</col><col></col>
<col>Wenn ein Lebwesen stirbt.</col></row>
<row id="Activate"><col>Activate</col><col>object pByObj</col>
<col>Aktivierung durch einen Doppelklick auf Graben. Nur getragene Objekte und direkt
spielergesteuerte Objekte. Wird aufgerufen, nachdem die interne Befehlskette (z.B. Bäume
fällen) abgearbeitet wurde.</col></row>
<row id="Contact_"><col>Contact_</col><col></col>
<col>Wenn das Objekt die Landschaft berührt. Siehe <emlink href="definition/cnat.html">CNAT
- Contact Attachment</emlink>.</col></row>
<row id="Control_"><col>Control_</col><col>object pByObj</col>
<col>Wenn das Objekt von außen gesteuert wird. Siehe <a
href="#Control-Funktionen">Control-Funktionen</a>.</col></row>
<row id="Contained_"><col>Contained_</col><col>object pByObj</col>
<col>Wenn das Objekt von innen gesteuert wird. Siehe <a href="#Control-Funktionen">Control-Funktionen</a>.</col></row>
<row id="ControlCommand"><col>ControlCommand</col><col>string strCommand, object pTarget, int iTx, int iTy, object pTarget2, int iData, object pCmdObj</col>
<col>Wenn dem Objekt durch den Spieler ein selbständig auszuführender Befehl gegeben
wurde. Siehe <a href="#Control-Funktionen">Control-Funktionen</a>.</col></row>
<row id="ControlCommandFinished"><col>ControlCommandFinished</col><col>string strCommand, object pTarget, int iTx, int iTy, object pTarget2, C4Value Data</col>
<col>Wenn das Objekt einen selbständigen auszuführenden Befehl vollendet hat oder die
Ausführung des Befehls fehlgeschlagen ist.</col></row>
<row id="ControlTransfer"><col>ControlTransfer</col><col>object pObj, int iTx, int iTy</col>
<col>Wenn ein durch die Wegfindungsroutine gesteuertes Objekt (pObj) die Transferzone dieses
Objekts zum Zielpunkt iTx/iTy passieren möchte. Die Transferfunktion kann dem Objekt
entsprechende Kommandos geben und sollte bei erfolgreicher Bearbeitung TRUE zurückliefern.
Siehe auch <emlink href="script/fn/SetTransferZone.html">SetTransferZone</emlink>().</col></row>
<row id="UpdateTransferZone"><col>UpdateTransferZone</col><col></col>
<col>Wenn ein Objekt geladen oder synchronisiert wird. Objekte mit einer TransferZone sollten
diese bei jedem Aufruf von UpdateTransferZone neu setzen. Siehe auch <emlink
href="script/fn/SetTransferZone.html">SetTransferZone</emlink>().</col></row>
<row id="MenuQueryCancel"><col>MenuQueryCancel</col><col>int iSelection, object pMenuObj</col>
<col>Wird in einem Objekt aufgerufen, wenn der Spieler ein benutzerdefiniertes Menu
schließen will. Bei Rückgabewert TRUE bleibt das Menu geöffnet.</col></row>
<row id="IsFulfilled"><col>IsFulfilled</col><col></col>
<col>Nur bei Spielziel-Objekten. Bei Rückgabewert TRUE ist das Spielziel erfüllt.</col></row>
<row id="ControlContents"><col>ControlContents</col><col>id idTarget</col>
<col>Wenn ein neues Inhaltsobjekt angewählt wird. Siehe <a href="#Control-Funktionen">Control-Funktionen</a>.</col></row>
<row id="Selection"><col>Selection</col><col>object pContainer</col>
<col>Wenn das Objekt durch einen Inventarwechsel ausgewählt wird. Wenn die Funktion
abgefangen wird, sollte ein eigener Auswahlsound abgespielt werden.</col></row>
<row id="CatchBlow"><col>CatchBlow</col><col>int iLevel, object pBy</col>
<col>Wenn das Objekt von einem anderen Objekt geschlagen oder getroffen wird.</col></row>
<row id="QueryCatchBlow"><col>QueryCatchBlow</col><col>object pBy</col>
<col>Bevor das Objekt von einem anderen Objekt geschlagen oder getroffen wird. Wenn QueryCatchBlow
TRUE zurückgibt, können damit physikalische Treffer abgefangen werden.</col></row>
<row id="LineBreak"><col>LineBreak</col><col>int iCause</col>
<col>Wenn ein Leitungsobjekt unterbrochen wird. iCause: 0 durch Bewegung, 1 durch fehlendes oder unvollständiges Zielobjekt.</col></row>
<row id="BuildNeedsMaterial"><col>BuildNeedsMaterial</col><col>id idMaterial, int iAmount</col>
<col>Wenn das Objekt ein anderes Objekt baut und noch Baumaterial benötigt wird. Parameter
sind Typ und Menge des ersten noch benötigten Baustoffs. Durch Rückgabewert TRUE kann die
Textmeldung über fehlendes Material abgefangen werden.</col></row>
<row id="AttachTargetLost"><col>AttachTargetLost</col><col></col>
<col>Wenn das Objekt eine ATTACH-Aktivität besessen hatte, aber das Actiontarget verloren
hat. Die Aktivität ist beim Aufruf bereits zurückgesetzt.</col></row>
<row id="CrewSelection"><col>CrewSelection</col><col>bool fDeselect, bool fCursorOnly</col>
<col>Bei Änderung der Crewauswahl. fCursorOnly gibt an, ob nur das Mannschaftsmitglied angewählt wurde, welches den Cursor hat.</col></row>
<row id="GetObject2Drop"><col>GetObject2Drop</col><col>object pForCollectionOfObj</col>
<col>Zur Ermittlung des am wenigsten gebrauchten Objekts, wenn der Clonk versucht, ein neues
aufzunehmen. Die Funktion sollte das abzulegende Objekt zurückliefern, oder 0 für
keins.</col></row>
<row id="OnMenuSelection"><col>OnMenuSelection</col><col>int iItemIndex, object pMenuObject</col>
<col>Wenn ein Menueintrag ausgewählt wurde.</col></row>
<row id="CalcValue"><col>CalcValue</col><col>object pInBase, int iForPlayer</col>
<col>Ermittelt den Wert eines Objekts. Siehe auch <emlink href="script/fn/GetValue.html">GetValue</emlink>().</col></row>
<row id="CalcDefValue"><col>CalcDefValue</col><col>object pInBase, int iForPlayer</col>
<col>Ermittelt den Wert eines (noch nicht gekauften) Objekttyps. Siehe auch <emlink href="script/fn/GetValue.html">GetValue</emlink>().</col></row>
<row id="CalcBuyValue"><col>CalcBuyValue</col><col>id idItem, int iDefValue</col>
<col>Rückgabewert ist Einkaufspreis des Objekttyps.</col></row>
<row id="CalcSellValue"><col>CalcSellValue</col><col>object pObj, int iObjValue</col>
<col>Rückgabewert ist Verkaufspreis des Objekttyps.</col></row>
<row id="LiftTop"><col>LiftTop</col><col></col>
<col>Wenn das Objekt bei einer LIFT-Aktivität ein anderes Objekt höher angehoben hat als in der DefCore angegeben.</col></row>
<row id="Stuck"><col>Stuck</col><col></col>
<col>Wird aufgerufen, wenn das Ziel einer PUSH- oder LIFT-Aktivität festhängt.</col></row>
<row id="GrabLost"><col>GrabLost</col><col></col>
<col>Wenn das Ziel einer PUSH- oder PULL-Aktion verloren geht.</col></row>
<row id="Collection"><col>Collection</col><col>object pObj, bool fPut</col>
<col>Wenn das Objekt ein anderes Objekt (pObj) aufgenommen hat (nur durch einsammeln oder anfassen und ablegen).</col></row>
<row id="Collection2"><col>Collection2</col><col>object pObj</col>
<col>Wenn das Objekt ein anderes Objekt (pObj) aufgenommen hat (immer, auch durch Scriptbefehl
Enter) </col></row>
<row id="Departure"><col>Departure</col><col>object pContainer</col>
<col>Wenn das Objekt ein anderes Objekt (pContainer) verlassen hat.</col></row>
<row id="Ejection"><col>Ejection</col><col>object pObj</col>
<col>Wenn ein Objekt (pObj) dieses Objekt verlassen hat (auch durch Scriptbefehl
Exit).</col></row>
<row id="Entrance"><col>Entrance</col><col>object pContainer</col>
<col>Wenn das Objekt ein anderes Objekt (pContainer) betreten hat.</col></row>
<row id="ActivateEntrance"><col>ActivateEntrance</col><col>object pByObj</col>
<col>Wenn ein anderes Objekt versucht, das Objekt durch Entrance zu betreten.</col></row>
<row id="RejectCollect"><col>RejectCollect</col><col>id idObj, object pObj</col>
<col>Wird vor Collection aufgerufen. Wenn RejectCollect TRUE zurückgibt, kann damit die
Aufnahme des anderen Objekts verhindert werden.</col></row>
<row id="RejectEntrance"><col>RejectEntrance</col><col>object pIntoObj</col>
<col>Wird vor Entrance aufgerufen. Wenn RejectEntrance TRUE zurückgibt, kann damit das
Hineinversetzen in das andere Objekt verhindert werden.</col></row>
<row id="InitializePlayer"><col>InitializePlayer</col><col>int iPlr</col>
<col>Aufruf in Spielziel, -regel und Umweltobjekten nach der Platzierung eines beitretenden
Spielers, und vor dem entsprechenden Aufruf im Szenarioscript.</col></row>
<row id="SellTo"><col>SellTo</col><col>int iByPlr</col>
<col>Wenn das Objekt verkauft wird. Rückgabewert 0 oder die ID des Objekts, welches dem
Heimatbasismaterial hinzugefügt wird.</col></row>
<row id="Sale"><col>Sale</col><col>int iByPlr</col>
<col>Wenn das Objekt verkauft wird. Ab CE.</col></row>
<row id="Purchase"><col>Purchase</col><col>int iByPlr, object BuyObject</col>
<col>Wenn das Objekt gekauft wird. Ab CE.</col></row>
<row id="Recruitment"><col>Recruitment</col><col>int iPlr</col>
<col>Wenn das Objekt der Crew eines Spielers hinzugefügt wird. Ab CE 4.95.2.</col></row>
<row id="RejectTeamSwitch"><col>RejectTeamSwitch</col><col>int iPlr, int iNewTeam</col>
<col>Aufruf in Spielziel, -regel und Umweltobjekten und dem Szenarioscript. Wenn RejectTeamSwitch TRUE zurückgibt, kann der Teamwechsel eines Spielers (durch <funclink>SetPlayerTeam</funclink>) verhindert werden. Ab 4.9.6.0 CR.</col></row>
<row id="OnTeamSwitch"><col>OnTeamSwitch</col><col>int iPlr, int iNewTeam, int iOldTeam</col>
<col>Aufruf in Spielziel, -regel und Umweltobjekten und dem Szenarioscript. Wenn ein Spieler erfolgreich von iOldTeam zu iNewTeam transferiert wurde (durch <funclink>SetPlayerTeam</funclink>). Ab 4.9.6.0 CR.</col></row>
</table></text>
<h id="Control-Funktionen">Control-Funktionen</h>
<text>Die Engine ruft bei jedem Spielerkommando (Left, Up, Right, Down, Dig, Throw, Special) im
Script eines spielergesteuerten Objekts die entsprechende Control-Funktion auf, wenn diese vorhanden
ist. Gibt die aufgerufene Control-Funktion 1 zurück, so wird die interne Bearbeitung des
Spielerkommandos übersprungen. Ist die Funktion nicht vorhanden oder gibt 0 zurück, findet
die interne Bearbeitung des Spielerkommandos statt.</text>
<code>func ControlThrow()
{
<emlink href="script/fn/if.html">if</emlink> (<emlink href="script/fn/FindContents.html">FindContents</emlink>(SPER))
<emlink href="script/fn/return.html">return</emlink>(<emlink href="script/fn/SetAction.html">SetAction</emlink>(&quot;ThrowSpear&quot;));
<emlink href="script/fn/return.html">return</emlink>(0);
}
</code>
<text>Trägt ein Clonk mit diesem Script einen Speer, so führt er seine eigene spezielle
Wurf-Aktion aus, sobald der Spieler das Werfen-Kommando gibt (in diesem Fall wird das
Werfen-Kommando jedoch nicht wie üblich an alle weiteren ausgewählten
Mannschaftsmitglieder weitergegeben). Trägt er keinen Speer, gibt die Funktion 0 zurück
und die normale interne Wurf-Aktion wird ausgeführt.</text>
<text>Control-Funktionen werden außerdem an angefasste (indirekt gesteuerte) Objekte
weitergeleitet.</text>
<text>Einzelklicks und Doppelklicks: Die Engine ruft bei jedem Spielerkommando zunächst die
einfache Variante der Control-Funktion auf (z.B. ControlDown) und anschließend die
spezifizierte Variante (also ControlDownSingle bzw. ControlDownDouble). Beim Überladen von
Control-Funktionen ist dementsprechend darauf zu achten, dass auch die richtige Variante abgefangen
wird.</text>
<text>ContainedControl: Befindet sich das direkt spielergesteuerte Objekt in einem anderen Objekt
(Behälter), so werden zunächst die Standardkommandos Down (Verlassen), Throw (Ablegen), Up
(Kaufen, in Basisgebäude) und Dig (Verkaufen, in Basisgebäude) ausgewertet.
Anschließend wird die Steuerung als Contained-Funktion an den Behälter weitergegeben.
Ausnahme: die Spezialkommandos ControlSpecial, ControlSpecial2 und ControlWheelUp/Down sind nur
für die direkte Steuerung gedacht und werden nicht an den Behälter umgeleitet.</text>
<text>ControlCommand: die Engine führt auch <a href="#ObjektCallsderEngine">Objekt-Calls</a>
für selbständig auszuführende Befehle (Commands) aus, die direkt durch den Spieler
gegeben wurden (z.B. durch Maussteuerung).</text>
<code>func ControlCommand(string strCommand, object pTarget, int iTx, int iTy, object pTarget2, int iData, object pCmdObj)
{
// Ein Kommando mit Zielobjekt
<emlink href="script/fn/if.html">if</emlink> (pTarget)
<emlink href="script/fn/Message.html">Message</emlink>(&quot;Befehl: %s Ziel: %s Koordinaten: %d/%d&quot;, <emlink href="script/fn/this.html">this</emlink>(), strCommand, pTarget->GetName(), iTx, iTy);
// Ein Kommando ohne Zielobjekt
else
<emlink href="script/fn/Message.html">Message</emlink>(&quot;Befehl: %s Koordinaten: %d/%d&quot;, <emlink href="script/fn/this.html">this</emlink>(), strCommand, iTx, iTy);
// Kommando nicht abfangen
<emlink href="script/fn/return.html">return</emlink>(0);
}
</code>
<text>Durch Rückgabe des Werts 1 kann der Befehl abgefangen und die interne Verarbeitung
verhindert werden. "pCmdObj" ist in jedem Fall das Objekt, für das das Kommando gesetzt werden
soll, auch wenn der Aufruf von einem enthaltenen Objekt kommt (siehe VehicleControl in der <emlink
href="definition/defcore.html">DefCore</emlink>). Der Script-Befehl <emlink
href="script/fn/SetCommand.html">SetCommand</emlink> verursacht keinen ControlCommand-Aufruf.</text>
<text>ControlCommand-Aufrufe werden an angefasste oder von innen gesteuerte Fahrzeuge
weitergeleitet, wenn diese ein entsprechendes VehicleControl-Flag besitzen. Diese Weiterleitung wird
nach dem ControlCommand-Aufruf des Clonk-Scripts durchgeführt, aber noch vor der internen
Verarbeitung, so dass auch das gesteuerte Fahrzeug bei Bedarf den Befehl auswerten und abfangen
(überladen) kann.</text>
<text>ControlWheelUp und ControlWheelDown werden durch Mausraddrehungen außerhalb von
Menüs aufgerufen. Wenn sie nicht überladen sind, führen sie einen
ShiftContents-Befehl durch. Dessen Auswirkungen können wiederum durch ControlContents
abgefangen werden.</text>
<text>ControlContents wird aufgerufen, wenn durch das Mausrad, direktes Anklicken mit der Maus oder
einen ShiftContents-Befehl im Script (zum Beispiel bei ControlSpecial oder ControlSpecial2) ein
Inventarwechsel stattgefunden hat. Hier können zum Beispiel Aktionen wie das Ablegen von Waffen
bei entsprechenden Clonks, oder eigene Inventarwechseldsounds, ausgeführt werden. Wird die
Funktion mit einem Rückgabewert ungleich 0 abgefangen, wird der Inventarwechsel
unterdrückt. Ansonsten rückt das Objekt mit dem entsprechenden, im ersten Parameter
übergebenen ID nach vorne und es wird ein Selection-Call an das neue, erste Inhaltsobjekt
ausgeführt. Wird dieser nicht abgefangen, wird der Soundeffekt "Grab" beim inventarwechselnden
Objekt abgespielt.</text>
<h id="Context-Funktionen">Context-Funktionen</h>
<text>Context-Funktionen in Objektscripten (Context_) erscheinen im Spiel im Kontextmenü des
Objekts. Die Engine übergibt beim Aufruf einen Zeiger auf das aufrufende Objekt als ersten
Parameter (bei Mannschaftsmitgliedern immer das Objekt selbst). Context-Funktionen sollten immer
eine gültige Funktionsbeschreibung haben und müssen public sein.</text>
<code>public func ContextConstruction(object pCaller)
{
[Bauauftrag|Image=CXCN|Condition=HasKnowledge]
SetCommand(this(), "Construct");
return(1);
}
</code>
<text>Über das Condition-Feld kann bestimmt werden, dass die Funktion nur dann im Kontextmenü
auftaucht, wenn die entsprechende Funktion (hier HasKnowledge) im Objektscript vorhanden ist und
einen positiven Wert zurückliefert. Das Menüobjekt wird als erster Parameter an die
Condition-Funktion übergeben.</text>
</part>
<author>sulai</author><date>November 2003</date>
<author>Sven2</author><date>Februar 2004</date>
<author>matthes</author><date>Juli 2004</date>
<author>Clonkonaut</author><date>April 2008</date>
</doc>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Vertices</title>
<h id="Vertices">Vertices</h>
<text>Vertices sind die Kollisionspunkte eines Objekts. Der Umriss eines Objekts sollte grob durch
Vertices markiert sein. Meist reichen hierbei vier bis fünf Eckpunkte. Die Koordinaten der
Eckpunkte gelten in Relation zur Objektmitte. An diesen Punkten wird überprüft, ob das
Objekt mit festen Materialien in der Landschaft kollidiert. Stößt ein Objekt mit einem
Vertex gegen festes Material, so wird es entsprechend anhalten, seine Richtung ändern oder sich
drehen (die Vertices drehen sich hierbei natürlich mit). Wird ein Eckpunkt eines Objekts durch
ein festes Material verschüttet, so hängt das Objekt fest. Die Reibung eines Vertex
bestimmt, wie leicht das Objekt an diesem Punkt abrutscht. Ist einem Vertex eine Ausrichtung
zugeordnet (siehe <emlink href="definition/cnat.html">CNAT - ContactAttachment</emlink>), so
wird bei aktivierten ContactCalls die entsprechende Funktion im Script des Objekts aufgerufen,
sobald der Vertex mit der Landschaft kollidiert, so dass das Objekt merkt, dass es z.B. links gegen
eine Wand gefahren ist und entsprechend reagieren kann. Bei Objekten mit SolidMask ist zu beachten,
dass jeder Vertex mindestens einen Punkt Abstand zum festen Bereich hat, sonst bleibt das Objekt in
der eigenen SolidMask hängen.</text>
<author>Sven2</author><date>April 2002</date>
</doc>

39
docs/sdk/files.xml 100644
View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Spieldaten</title>
<h id="Spieldaten">Spieldaten</h>
<text>Die Spieldaten von Clonk sind in komprimierten Gruppendateien zusammen gefasst, die jeweils
einzelne Komponenten oder weitere Gruppendateien enthalten:</text>
<dl>
<dt id="Spielerdateienc4p"><img src="../images/icon_player.gif" width="16" height="16"/>Spielerdateien (c4p)</dt>
<dd><text>In einer Spielerdatei werden die persönlichen Einstellungen eines Spielers, seine
erspielten Punkte, Informationen zu seiner Stammcrew und gegebenenfalls sein Portrait
gespeichert.</text></dd>
<dt id="Szenarienc4s"><img src="../images/icon_scenario.gif" width="16"
height="16"/><emlink href="scenario/index.html">Szenarien (c4s)</emlink></dt>
<dd><text>Szenariodateien setzen sich aus einem Informationskern und weiteren Komponenten, wie einer
Landkarte, Titelbild und Beschreibungstexten, einer Himmelsgrafik, einem Script und lokalen
Objektdefinitionen zusammen.</text></dd>
<dt id="Objektdefinitionenc4d"><img src="../images/icon_object_definition.gif" width="16"
height="16"/><emlink href="definition/index.html">Objektdefinitionen (c4d)</emlink></dt>
<dd><text>Objektdefinitionen enthalten einen Informationskern, Grafikelemente, eine
Aktivitätstabelle, Scripte und Beschreibungstexte. Auch <emlink
href="particle/index.html">Partikel</emlink> werden in Objektordnern angelegt.</text></dd>
<dt id="Rundenordnerc4f"><img src="../images/icon_scenario_folder.gif" width="16" height="16"/><emlink href="folder/index.html">Rundenordner (c4f)</emlink></dt>
<dd><text>Szenarien können in Rundenordnern zusammen gefasst werden.</text></dd>
<dt id="Systemdatenc4g"><img src="../images/icon_system.gif" width="16" height="16"/>Systemdaten (c4g)</dt>
<dd><text>Grafiken, Sounds und Musik des Spiels sind in eigenen Gruppen zusammen gefasst und sollten
nicht verändert werden.</text>
<text>Mit dem Menüsystem von Clonk lassen sich Gruppendateien bearbeiten und/oder in normale
Verzeichnisse umwandeln. Die Komponenten der Gruppendateien lassen sich direkt mit allen
gängigen Anwendungsprogrammen editieren. Sowohl Menüsystem als auch Engine können
generell sowohl gepackte als auch offene Gruppen verarbeiten.</text>
<text>Das Entpacken von Gruppen liefert vor allem einen Geschwindigkeitsvorteil beim Bearbeiten von
größeren oder verschachtelten Dateien.</text></dd>
</dl>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>Juni 2004</date>
</doc>

View File

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>FolderMap.txt</title>
<h id="FolderMaptxt">FolderMap.txt</h><part>
<text>Ab CR können Rundenordner Auswahlkarten für die enthaltenen Szenarien anbieten.
Diese Karten werden nur in der Szenarienauswahl im Spiel und nicht im Entwicklerfrontend (Editor) angezeigt. Für ein Beispiel siehe das Westernpack von RedWolf Design.</text>
<text><table>
<caption id="SektionFolderMap">Sektion [FolderMap]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>ScenInfoArea</col>
<col>4 Integer</col>
<col>Koordinaten (x,y,Breite,Höhe) für die Beschreibungsbox, in der die Beschreibung für das ausgewählte Szenario angezeigt wird.</col>
</row>
<row>
<col>MinResX</col>
<col>Integer</col>
<col>Unterschreitet die Bildschirmauflösung des Spielers diesen Wert in der Breite, so wird statt der FolderMap die klassische Szenarienauswahl angezeigt. Dies ist nützlich, falls die Karte so großräumig ausgelegt ist, dass sie bei kleineren Auflösungen unbenutzbar wäre.</col>
</row>
<row>
<col>MinResY</col>
<col>Integer</col>
<col>Analog zu MinResY: Mindesthöhe der Bildschirmauflösung.</col>
</row>
<row>
<col>FullscreenBG</col>
<col>Integer</col>
<col>Wenn ungleich 0, wird das Hintergrundbild auf die gesamte Bildschirmgröße gestreckt. Dabei ist zu beachten, dass Kontrollelemente trotzdem nur innerhalb des mittleren Gebietes platziert werden dürfen.</col>
</row></table></text>
<text><table>
<caption id="SektionAccessGfx">Beliebig viele Sektionen [AccessGfx]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Access</col>
<col>Zeichenfolge</col>
<col>Wenn für diesen Benutzer das hier angegebene MissionAccess-Passwort freigeschaltet ist, wird die in dieser Sektion beschriebene Grafik auf der FolderMap angezeigt. Auf diese Weise können einzelne Bestandteile der Karte freigespielt werden. Siehe dazu die Scriptfunktion <funclink>GainMissionAccess</funclink>.</col>
</row>
<row>
<col>OverlayImage</col>
<col>Zeichenfolge</col>
<col>Dateiname der Grafikdatei, die angezeigt wird. Die Datei sollte im selben Rundenordner liegen.</col>
</row>
<row>
<col>Area</col>
<col>4 Integer</col>
<col>Koordinaten des Bereiches, in dem das Bild angezeigt wird. Die Koordinaten sind relativ zum <emlink href="#background">Hintergrundbild</emlink>.</col>
</row></table></text>
<text><table>
<caption id="SektionScenario">Beliebig viele Sektionen [Scenario]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>File</col>
<col>Zeichenfolge</col>
<col>Szenariendatei (inklusive Endung .c4s), für die mit dieser Sektion ein Knopf erstellt wird. Für jedes Szenario im Rundenordner sollte eine [Scenario]-Sektion erstellt werden. Es werden grundsätzlich nur die Knöpfe angezeigt, für die der Benutzer MissionAccess (siehe <funclink>GainMissionAccess</funclink>) freigeschaltet hat. </col>
</row>
<row>
<col>BaseImage</col>
<col>Zeichenfolge</col>
<col>Dateiname der Grafikdatei, die angezeigt wird, wenn das Szenario nicht ausgewählt ist. Die Datei sollte im selben Rundenordner liegen.</col>
</row>
<row>
<col>OverlayImage</col>
<col>Zeichenfolge</col>
<col>Dateiname der Grafikdatei, die angezeigt wird, wenn der Benutzer das Szenario ausgewählt hat oder mit der Maus darüber fährt. Die Datei sollte im selben Rundenordner liegen.</col>
</row>
<row>
<col>Area</col>
<col>4 Integer</col>
<col>Koordinaten des Bereiches, in dem der Knopf angezeigt wird. Die Koordinaten sind relativ zum <emlink href="#background">Hintergrundbild</emlink>.</col>
</row>
<row>
<col>Title</col>
<col>Zeichenfolge</col>
<col>Titel, der auf den Knopf geschrieben wird. Für Szenarientitel, die in allen Sprachen gleich sind, kann der Titel auch weggelassen und stattdessen direkt ins BaseImage bzw. Overlayimage gemalt werden. Die Zeichenkette TITLE wird dabei automatisch durch den aus dem Szenario geladenen Titel ersetzt.</col>
</row>
<row>
<col>TitleFontSize</col>
<col>Integer</col>
<col>Schriftgröße des Titels. Die Größe bezieht sich auf ein nicht gezoomtes Hintergrundbild und kann je nach Auflösung verändert werden.</col>
</row>
<row>
<col>TitleColorInactive</col>
<col>Integer</col>
<col>DWORD-Farbe des Titels, wenn der Knopf nicht ausgewählt ist.</col>
</row>
<row>
<col>TitleColorActive</col>
<col>Integer</col>
<col>DWORD-Farbe des Titels, wenn der Knopf nicht sgewählt ist.</col>
</row>
<row>
<col>TitleOffX</col>
<col>Integer</col>
<col>Horizontaler Offset der linken Kante (bzw. Textmitte bei zentriertem Text) des Titels von der linken Kante des Knopfes.</col>
</row>
<row>
<col>TitleOffY</col>
<col>Integer</col>
<col>Vertikaler Offset der Oberkante des Titels von der oberen Kante des Knopfes.</col>
</row>
<row>
<col>TitleAlign</col>
<col>Integer</col>
<col>Ausrichtung des Titels: 0 für linksbündig, 1 für zentriert, 2 für rechtsbündig.</col>
</row>
<row>
<col>TitleUseBookFont</col>
<col>Boolean</col>
<col>0 oder 1. Bei 1 wird die schattenlose Schriftart des Startupmenüs anstatt der nromalen InGame-Schriftart für den Titelverwendet.</col>
</row>
</table></text>
<h id="order">Anordnung der Elemente</h>
<text>Es werden grundsätzlich alle AccessGfx-Grafiken unter die Szenarienknöpfe gezeichnet. Die Szenarienknöpfe erscheinen in der Reihenfolge, in der sie in der Datei angegeben sind. Dabei ist darauf zu achten, dass man sie in einer sinnvollen Reihenfolge angibt (also von links nach rechts und von oben nach unten), da das Durchschalten mit Tastatur oder Gamepad hiervon abhängt. Es ist auch Aufgabe des Entwicklers, dafür zu sorgen, dass sich Knöpfe und Grafiken nicht überlappen.</text>
<h id="background">Hintergrundbild</h>
<text>Wenn der Ordner eine FolderMap enthält, wird eine der Bilddateien FolderMap.png/.jpg/.jpeg/.bmp als Hintergrund erwartet. Die optimale Bildgröße, bei der das Hintergrundbild ohne gestreckt zu werden angezeigt werden kann, hängt von der Bildschirmauflösung des Benutzers ab:</text>
<text><table>
<rowh><col>Auflösung</col><col>Größe der FolderMap</col></rowh>
<row><col>640x480</col><col>616x385</col></row>
<row><col>800x600</col><col>768x480</col></row>
<row><col>1024x768</col><col>984x616</col></row></table></text>
<text>Das Bild wird immer auf die volle, für die Auswahl zur Verfügung stehende Größe gestreckt bzw. gestaucht. Alle Positionsangaben für Szenarien, die Beschreibungsleiste, etc. beziehen sich auf Koordinaten in diesem Hintergrundbild und werden entsprechend mitgestreckt oder gestaucht. Es empfiehlt sich also, die Karte für eine relativ große Auflösung wie z.B. 1024x768 zu gestalten, und stets zu testen, ob für kleine Auflösungen noch alles lesbar ist.</text>
<h id="devel">Tipps zur Entwicklung</h>
<text>Zum Testen kann die FolderMap mit einem entpackten Rundenordner entworfen, und dann in der Szenarienauswahl mit Druck auf F5 jeweils neu geladen werden. Erscheint statt der FolderMap die klassische Szenarienauswahl, ist beim Laden der Definitionsdatei ein Fehler aufgetreten, oder zum Beispiel eine referenzierte Grafikdatei nicht gefunden worden. Bei aktiviertem Debugmodus findet sich in dem Fall eine Fehlermeldung in der Datei Clonk.log.</text>
</part>
<author>Sven2</author><date>September 2006</date>
</doc>

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Rundenordner</title>
<h id="Folders">Rundenordner</h>
<part>
<text>In Rundenordner werden mehrere Szenarien zusammengefasst. Rundenordner erscheinen in der Szenarienauswahl als Buch, das geöffnet werden kann um die enthaltenen Szenarien zu starten.</text>
<h id="Components">Szenario-Komponenten (C4S)</h>
<dl>
<dt id="c4s"><img src="../../images/icon_scenario.gif" width="16" height="16"/><emlink href="scenario/index.html">*.c4s</emlink></dt>
<dd><text>Rundenordner können beliebig viele Szenarien enthalten, die in diesem Ordner ausgewählt werden können.</text></dd>
<dt id="c4f"><img src="../../images/icon_scenario_folder.gif" width="16" height="16"/>*.c4f</dt>
<dd><text>Rundenordner lassen sich auch schachteln.</text></dd>
<dt id="Title"><img src="../../images/icon_image.gif" width="16" height="16"/>Title.png/Title.bmp</dt>
<dd><text>Das Titelbild des Rundenordners im Format PNG. Größe: 200x150 Pixel. Das veraltete Grafikformat Windows BMP mit 256 Farben wird auch weiterhin unterstützt.</text></dd>
<dt id="Iconbmp"><img src="../../images/icon_image.gif" width="16" height="16"/>Icon.bmp/Icon.png</dt>
<dd><text>Das Icon des Rundenordners, das statt des Buches angezeigt werden kann. Für Bitmaps: Größe 16x16 Pixel. Die Farbe RGB 255/0/255 (Lila) wird transparent angezeigt. Für png-Dateien ist die empfohlene Größe 24x24 Pixel, und es wird der png-Alphakanal für Transparenz genutzt.</text></dd>
<dt id="Desc__rtf"><img src="../../images/icon_text.gif" width="16" height="16"/>Desc*.rtf</dt>
<dd><text>Der Beschreibungstext im RTF-Format. __ muss durch den zweistelligen Sprachcode ersetzt werden. DE steht beispielsweise für Deutsch, US für American English. Es können für mehrere Sprachen verschiedene Beschreibungen enthalten sein, von denen je nach eingestellter Sprache des Menüsystems automatisch die passendste ausgewählt wird.</text>
<text>Der Font des Textes wird im Spiel automatisch auf den eingestellten Menüsystem-Font angepasst. Die Größe der Überschrift sollte 10pt und die des Textes 8pt betragen. Bilder im Text werden ignoriert.</text>
<text>Diese Datei erstellt man am besten mit dem zu Windows gehörenden WordPad und nicht mit Winword, denn dieses packt in jedes Dokument kilobyteweise unnütze Daten.</text></dd>
<dt id="Titletxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Title.txt</dt>
<dd><text>Normalerweise wird der Titel eines Szenarios beim Umbenennen mit dem Menüsystem dem Dateinamen entnommen und in der [Head]-Sektion des Szenario.txt gespeichert. Der Dateiname kann unabhängig verändert werden. Für mehrsprachige Szenarien muss eine Datei Title mit entsprechendem Inhalt erzeugt werden:</text>
<code>DE:Meine Rundensammlung
US:My scenario collection</code>
<text>Wichtig: Folgende Zeichen sollten nicht verwendet werden: &lt;&gt;&amp;"</text></dd>
<dt id="FolderMaptxt"><img src="../../images/icon_text.gif" width="16" height="16"/><emlink href="folder/foldermap.html">FolderMap.txt</emlink></dt>
<dd><text>Ab CR können Rundenordner Auswahlkarten für die enthaltenen Szenarien anbieten.</text></dd>
<dt id="Loader"><img src="../../images/icon_image.gif" width="16" height="16"/>Loader*.png/Loader*.bmp</dt>
<dd><text>Rundenordner können lokale Ladebildschirme enthalten. Siehe auch <emlink href="scenario/index.html">Szenarien</emlink>. Es gelten die <emlink href="scenario/index.html#UeberladungenC4S">Überladungsregeln</emlink>.</text></dd>
<dt id="Materialc4g"><img src="../../images/icon_system.gif" width="16" height="16"/><emlink href="material/index.html">Material.c4g</emlink></dt>
<dd><text>Rundenordner können lokale Materialdefinitionen enthalten. Siehe auch <emlink href="scenario/index.html#Materialc4g">Szenarien</emlink>. Es gelten die <emlink href="scenario/index.html#UeberladungenC4S">Überladungsregeln</emlink>.</text></dd>
<dt id="Graphicsc4g"><img src="../../images/icon_system.gif" width="16" height="16"/>Graphics.c4g</dt>
<dd><text>Rundenordner können einzelne Grafiken aus der systemglobalen Graphics.c4g überladen. Siehe auch <emlink href="scenario/index.html#Graphicsc4g">Szenarien</emlink>. Es gelten die <emlink href="scenario/index.html#UeberladungenC4S">Überladungsregeln</emlink>.</text></dd>
<dt id="Musicc4g"><img src="../../images/icon_system.gif" width="16" height="16"/>Music.c4g</dt>
<dd><text>Rundenordner können eigene Musik für alle Szenarien bereitstellen. Siehe auch <emlink href="scenario/index.html#Musicc4g">Szenarien</emlink>. Es gelten die <emlink href="scenario/index.html#UeberladungenC4S">Überladungsregeln</emlink>.</text></dd>
<dt id="c4d"><img src="../../images/icon_object_definition.gif" width="16" height="16"/><emlink href="definition/index.html">*.c4d</emlink></dt>
<dd><text>Rundenordner können lokale Objektdefinitionen enthalten, die dann in allen Szenarien des Ordners verfügbar sind. Siehe auch <emlink href="scenario/index.html#c4d">Szenarien</emlink>. Es gelten die <emlink href="scenario/index.html#UeberladungenC4S">Überladungsregeln</emlink>.</text></dd>
<dt id="Infotxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Info.txt</dt>
<dd><text>Hier kann der Autor zusätzliche Informationen über den Entwicklungsstand seiner Szenarien, seine Kontaktadresse oder sonstige Informationen angeben, die er anderen Entwicklern mitteilen möchte.</text></dd>
<dt id="Authortxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Author.txt</dt>
<dd><text>Sollte den Namen des Autors im Format "Vorname Nachname (Nick)" enthalten und ist dafür gedacht, dass der Name des ursprünglichen Autors erhalten bleibt, selbst wenn die Gruppendatei von einem anderen Entwickler verändert wird (Auswertung der Komponente zur Zeit nur bei Dateien, die durch RedWolf Design bearbeitet werden). Dies ist insbesondere für Wettbewerbsszenarien gedacht.</text></dd>
</dl>
</part>
<author>Sven2</author><date>September 2006</date>
</doc>

23
docs/sdk/index.xml 100644
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Entwicklermodus</title>
<h>Clonk Entwicklermodus</h>
<!--<img src="../images/cpem.gif" align="left" width="52" height="52" hspace="5" vspace="2" />-->
<img src="../images/cpem.gif" id="cpem" width="52" height="52" />
<text>Der Clonk Entwicklermodus gibt vollen Zugriff auf alle Spieldaten von Clonk: Szenarien, Objektdefinitionen, Spielerdateien und zusätzliche Gruppendateien. Bestehende Daten können modifiziert werden, um so neue Spielelemente zu schaffen.</text>
<text>Der Entwicklermodus ist über den Editor erreichbar.</text>
<text>Im Editor können per Drag &amp; Drop alle Einzelkomponenten der Spieldaten bearbeitet werden. In der Engine können Objekte per Mausklick in der Landschaft platziert und Landkarten pixelgenau bearbeitet und abgespeichert werden.</text>
<text>Selbsterstellte Spielelemente können veröffentlicht und somit anderen Clonk-Spielern zugänglich gemacht werden. Sie sollten jedoch vorher unbedingt ausgiebig getestet werden und keine Fehler enthalten.</text>
<h id="Nutzungsbedingungen">Nutzungsbedingungen</h>
<text>Die Benutzung der erweiterten Funktionen von Clonk geschieht grundsätzlich auf eigene Gefahr und Verantwortung. Es gibt keinerlei Support. Der Entwicklermodus ist nur registrierten Spielern zugänglich.</text>
<text>Durch unsachgemäße Anwendung kann nicht nur der Spielspaß zunichte, sondern das komplette Spiel unspielbar gemacht werden. Für den erfolgreichen Einsatz des Entwicklermodus sind grundlegende Programmierkenntnisse, Fähigkeiten bei der Bearbeitung von Grafiken und allgemeiner Sachverstand absolute Voraussetzung. Wer sich dessen nicht sicher ist, sollte die Finger davon lassen.</text>
<text>Jeder, der die in dieser Dokumentation enthaltenen Informationen nutzt, sollte verantwortungsvoll mit den gegebenen Möglichkeiten umgehen und eigenverantwortlich das Ziel anstreben, sinnvoll spielbare Erweiterungen zum Gesamtspiel zu erstellen, die der Gemeinschaft nützen.</text>
<text>Von Spielern erstelltes Material für Clonk darf in keinem Fall kommerziell genutzt werden. Für Szenarien, Objekte oder andere Spieldaten darf kein Entgelt verlangt werden.</text>
<text>Im Rahmen des Entwicklermodus zur Bearbeitung freigegebene Daten dürfen bei der Entwicklung neuer Spielerweiterungen für Clonk (und ausschließlich zu diesem Zweck) verwendet werden. Alle Rechte an den verwendeten Daten verbleiben jedoch beim Hersteller.</text>
<text>Das Passwort für die Aktivierung des Entwicklermodus lautet: Siedlerclonk</text>
<author>matthes</author><date>2000 - 2007</date>
</doc>

103
docs/sdk/lang.xml 100644
View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Sprachanpassung</title>
<h>Sprachanpassung</h>
<part>
<text>Clonk ermöglicht es, Unterstützung für mehrere Sprachen in Objekte und Szenarien zu integrieren.
Dazu können jeweils bestimmte Elemente sprachabhängig überladen werden.</text>
<h>Anpassbare Elemente</h>
<dl>
<dt id="Titletxt"><img src="../images/icon_text.gif" width="16" height="16" />Title.txt</dt>
<dd><text>
Die Komponente <emlink href="scenario/index.html#Titletxt">Title.txt</emlink> kann in Szenarien und Objektordnern verwendet
werden, um den Titel für verschiedene Sprachen zu definieren.
</text>
<text>
In jeder Zeile wird dabei ein Sprachkürzel dem gewünschten Titel vorangestellt. Beispiel:
</text>
<code>DE:Angriff der Killerwipfe
US:Attack of the Killer Wipfs
</code>
<text>
In externen Sprachpaketen sollte an der entsprechenden Verzeichnis-Position eine Komponente Title*.txt stehen (wobei * durch das entsprechende Sprachkürzel ersetzt wird), die dann den Titel für die jeweilige zusätzliche Sprache enthalten kann. Beispiel für den Inhalt einer TitleFR.txt:
</text>
<code>FR:Les wipfes moerderesque attaquent</code>
<text>Ist ein Eintrag für die gewählte Sprache vorhanden, so wird der Title-Eintrag aus der <emlink href="scenario/scenario.html#SektionHead">Scenario.txt</emlink> durch den entsprechenden Namen überschrieben.</text>
<text>Wichtig: es sollten keine Anführungszeichen oder Sonderzeichen verwendet werden.</text>
</dd>
<dt id="Namestxt"><img src="../images/icon_text.gif" width="16" height="16" />Names.txt</dt>
<dd><text>
Mit der Komponente <emlink href="definition/index.html#Namestxt">Names.txt</emlink> kann der Name eines Objekts für verschiedene
Sprachen definiert werden. Die Funktionsweise der Names.txt gleicht Funktionsweise der der Title.txt.
</text>
<text>
Existiert ein Eintrag für die gewählte Sprache, so wird die Name-Angabe aus der
<emlink href="definition/defcore.html#SektionDefCore">DefCore.txt</emlink> überschrieben.
</text>
</dd>
<dt id="Desctxt"><img src="../images/icon_text.gif" width="16" height="16" />Desc*.txt / Desc*.rtf</dt>
<dd><text>
Um die Beschreibung einer <emlink href="definition/index.html#Desc__txt">Objektdefinition</emlink> oder eines
<emlink href="scenario/index.html#Desc__rtf">Szenarios</emlink>
sprachabhängig anzupassen, muss eine Datei Desc*.txt/.rtf im Definitions- bzw. Szenarioverzeichnis vorhanden sein
(* steht dabei wieder für das entsprechende Sprachkürzel, die Komponenten sollte also z.B. DescUS.rtf heißen).
</text>
</dd>
<dt id="Sciptc"><img src="../images/icon_text.gif" width="16" height="16" />Script.c, Teams.txt</dt>
<dd><text>
Um sprachabhängig Texte in Scripts einzufügen, kommen sogenannte String Tables
zum Einsatz. Im Script wird dazu, anstatt des Textes ein Verweis auf einen Eintrag einer
solchen String-Tabelle eingefügt. Die Tabelle muss sich im selben Verzeichnis wie das
darauf verweisende Script befinden und den Namen StringTbl*.txt haben (wobei * für den
Sprachcode steht).
</text>
<text>
Der Verweis im Script besteht aus einem Namen für den zu verwendenden String (String-ID),
der mit Dollarzeichen ("$") als ein solcher Stringtabellenverweis gekennzeichnet ist. <br/> Beispiel:
</text>
<code>protected func Activate(pCaller)
{
[$DescActivate$]
<emlink href="script/fn/Message.html">Message</emlink>("$MsgYourPosition$ %d / %d", <emlink href="script/fn/GetX.html">GetX</emlink>(pCaller), <emlink href="script/fn/GetX.html">GetY</emlink>(pCaller));
}</code>
<text>
Hier werden zwei Strings mit den Namen "DescActivate" und "MsgYourPosition" eingebunden.
</text>
<text>
Eine passende StringTblDE.txt (für deutsche Sprache) könnte folgendermaßen aussehen:
</text>
<code># Beschreibungstexte
DescActivate=Position bestimmen
# Nachrichten
MsgYourPosition=Deine Position ist:</code>
<text>
Im Objekt hätte also Activate den Beschreibungstext "Position bestimmen" und würde z.B.
die Nachricht "Deine Position ist: 252 / 352" ausgeben. In der Stringtabelle wurden hier zwei
Kommentare eingefügt. Sie beginnen mit einem '#'-Zeichen und werden ignoriert.
</text>
<text>
Zur Vollständigkeit - eine passende StringTblUS.txt:
</text>
<code># Description texts
DescActivate=Tell position
# Messages
MsgYourPosition=Your position is:</code>
<text>
Hier würden also z.B. die Nachricht "Your position is: 252 / 352" erzeugt, wenn Englisch
als Sprache eingestellt ist.
</text>
</dd>
</dl>
</part>
<author>PeterW</author><date>April 2002</date>
<author>matthes</author><date>April 2004</date>
</doc>

View File

@ -0,0 +1,333 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Materialdefinitionen (C4M)</title>
<h id="c4m">Materialdefinitionen (C4M)</h>
<part>
<text>In Materialdefinitionen wird Aussehen und Verhalten von Materialien festgelegt.</text>
<text><table>
<caption id="SektionMaterial">Sektion [Material]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Name</col>
<col>Zeichenfolge (max. 15)</col>
<col>Name des Materials.</col>
</row>
<row>
<col>Color</col>
<col>3 x 3 Integer</col>
<col>Die drei Farben des Materials als R,G,B, R,G,B, R,G,B (jeweils 0-255).</col>
</row>
<row>
<col>ColorAnimation</col>
<col>Integer</col>
<col>0 oder 1. Farbanimation.</col>
</row>
<row>
<col>Shape</col>
<col>Integer</col>
<col>Landschaftsform: 0 glatt, 1 oben glatt, 2 halbrauh, 3 komplett rauh.</col>
</row>
<row>
<col>Density</col>
<col>Integer</col>
<col>Dichte: 50 fest, 25 flüssig (andere Werte nicht zulässig).</col>
</row>
<row>
<col>Friction</col>
<col>Integer</col>
<col>0-100. Reibung.</col>
</row>
<row>
<col>DigFree</col>
<col>Integer</col>
<col>0 oder 1. Bestimmt, ob das Material freigegraben werden kann.</col>
</row>
<row>
<col>BlastFree</col>
<col>Integer</col>
<col>0 oder 1. Bestimmt, ob das Material freigesprengt werden kann.</col>
</row>
<row>
<col>Blast2Object</col>
<col>Definitions-ID</col>
<col>Freigesprengte Objekte.</col>
</row>
<row>
<col>Dig2Object</col>
<col>Definitions-ID</col>
<col>Freigegrabene Objekte.</col>
</row>
<row>
<col>Dig2ObjectRatio</col>
<col>Integer</col>
<col>ca. 100-500. Massenverhältnis beim Freigraben.</col>
</row>
<row>
<col>Dig2ObjectRequest</col>
<col>Integer</col>
<col>0 oder 1. Wenn 1, werden Objekte nur auf Wunsch freigegraben.</col>
</row>
<row>
<col>Blast2ObjectRatio</col>
<col>Integer</col>
<col>ca. 100-500. Massenverhältnis beim Freisprengen.</col>
</row>
<row>
<col>Blast2PXSRatio</col>
<col>Integer</col>
<col>Massenverhältnis beim Freisprengen von Kleinmaterial.</col>
</row>
<row>
<col>Instable</col>
<col>Integer</col>
<col>0 oder 1. Stabilität.</col>
</row>
<row>
<col>MaxAirSpeed</col>
<col>Integer</col>
<col>ca. 10-100. Fallgeschwindigkeit.</col>
</row>
<row>
<col>MaxSlide</col>
<col>Integer</col>
<col>Rutschreichweite.</col>
</row>
<row>
<col>WindDrift</col>
<col>Integer</col>
<col>Abtrieb durch Wind.</col>
</row>
<row>
<col>Inflammable</col>
<col>Integer</col>
<col>Entzündbarkeit.</col>
</row>
<row>
<col>Incindiary</col>
<col>Integer</col>
<col>Entzündung durch dieses Material.</col>
</row>
<row>
<col>Corrode</col>
<col>Integer</col>
<col>Verätzung durch dieses Material.</col>
</row>
<row>
<col>Corrosive</col>
<col>Integer</col>
<col>Ätzbarkeit.</col>
</row>
<row>
<col>Extinguisher</col>
<col>Integer</col>
<col>Feuerlöschkraft.</col>
</row>
<row>
<col>Soil</col>
<col>Integer</col>
<col>Nährboden für Pflanzen.</col>
</row>
<row>
<col>TempConvStrength</col>
<col>Integer</col>
<col>Stärke der Temperaturumwandlung.</col>
</row>
<row>
<col>BlastShiftTo</col>
<col>Zeichenfolge (max. 15)</col>
<col>Materialverwandlung bei Sprengung.</col>
</row>
<row>
<col>InMatConvert</col>
<col>Zeichenfolge (max. 15)</col>
<col>In diesem Material verwandelt sich das Material...</col>
</row>
<row>
<col>InMatConvertTo</col>
<col>Zeichenfolge (max. 15)</col>
<col>...in dieses Material...</col>
</row>
<row>
<col>InMatConvertDepth</col>
<col>Integer</col>
<col>...wenn das Materialpixel zur angegebenen Tiefe im angegebenen Material ist. Ab CE.</col>
</row>
<row>
<col>AboveTempConvert</col>
<col>Integer</col>
<col>Oberhalb dieser Temperatur verwandelt sich das Material...</col>
</row>
<row>
<col>AboveTempConvertTo</col>
<col>Zeichenfolge (max. 15)</col>
<col>...in dieses Material.</col>
</row>
<row>
<col>AboveTempConvertDir</col>
<col>Integer</col>
<col>Richtung der Umwandlung: von oben nach unten (0), von unten nach oben (1)</col>
</row>
<row>
<col>BelowTempConvert</col>
<col>Integer</col>
<col>Unterhalb dieser Temperatur verwandelt sich das Material...</col>
</row>
<row>
<col>BelowTempConvertTo</col>
<col>Zeichenfolge (max. 15)</col>
<col>...in dieses Material.</col>
</row>
<row>
<col>BelowTempConvertDir</col>
<col>Integer</col>
<col>Richtung der Umwandlung: von oben nach unten (0), von unten nach oben (1)</col>
</row>
<row>
<col>Alpha</col>
<col>6 Integer</col>
<col>Durchsichtigkeit für die drei Materialfarben ober- und unterirdisch.</col>
</row>
<row>
<col>Placement</col>
<col>Integer</col>
<col>0-100. Dieser Wert wird für die Nachbeleuchtung der Landschaft verwendet, und wird normalerweise automatisch aus den anderen Materialwerten berechnet.</col>
</row>
<row>
<col>TextureOverlay</col>
<col>Zeichenfolge (max. 15)</col>
<col>Standardtextur für dieses Material, die vom Landschaftsgenerator zusätzlich benutzt wird.</col>
</row>
<row>
<col>OverlayType</col>
<col>Integer</col>
<col>Bitmaske für die Berechnung der Textur auf dem Material. Bit 0 (1): Exakt (kein Zoom), Bit 1 (2): Keine Textur, Bit 2 (4): Extragroß gezoomt, Bit 3 (8): Textur auf Graustufen aufrechnen.</col>
</row>
<row>
<col>PXSGfx</col>
<col>Zeichenfolge (max. 30)</col>
<col>Grafik für lose Materialpixel. Die Grafik sollte als Materialtextur geladen sein.</col>
</row>
<row>
<col>PXSGfxRt</col>
<col>4 Integer</col>
<col>Zielrechteck auf die Grafik für lose Materialpixel. Es werden weitere Phasen rechts und unterhalb der angegebenen Grafik benutzt. Die Grafik sollte immer oben links beginnen, und die gesamte Texturgröße einnehmen.</col>
</row>
</table></text></part>
<part><h>Benutzerdefinierte Reaktionen</h>
<text>Zusätzlich zu den Standardroutinen kann jedes Material ab CR weitere Reaktionen definieren, die ausgeführt werden, wenn das Material durch lose Pixel (z.B. Regen oder Explosionsstreuung) oder Materialbewegung (z.B. beim Angraben eines Sees) auf ein anderes Material trifft:</text>
<text><table>
<caption id="SektionReaction">In der .c4m-Datei: Beliebig viele Sektionen [Reaction]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Type</col>
<col>Zeichenfolge</col>
<col>Art der Reaktion, die stattfinden soll. Siehe <emlink href="material/c4m.html#ReactTypes">Tabelle</emlink>.</col>
</row>
<row>
<col>TargetSpec</col>
<col>Zeichenfolge</col>
<col>Zielmaterial, mit dem das lose Material reagiert. Siehe <emlink href="material/c4m.html#TargetSpecs">Materialspezifikationen</emlink>.</col>
</row>
<row>
<col>ScriptFunc</col>
<col>Zeichenfolge</col>
<col>Nur für Reaktionstyp Script: Name der Scriptfunktion, die das Verhalten bestimmt.</col>
</row>
<row>
<col>ExecMask</col>
<col>Integer</col>
<col>Bitmaske, die angibt, in welcher Situation die Reaktion stattfindet. Bitindizes sind die <emlink href="material/c4m.html#ReactEvents">Reaktionsereignisse</emlink>. Standardwert -1 für alle Ereignisse.</col>
</row>
<row>
<col>Reverse</col>
<col>Boolean</col>
<col>Normalerweise gibt die Reaktion an, was mit losem Material der Definition, in der die Reaktion definiert ist, passiert, wenn es auf festes Material vom in TargetSpec angegebenen Typ trifft. Ist Reverse gesetzt, so wird die Definition umgekehrt.</col>
</row>
<row>
<col>InverseSpec</col>
<col>Boolean</col>
<col>Wenn wahr, wird die Reaktion für alle anderen Materialien (inklusive "Sky"), die die Bedingung in TargetSpec nicht erfüllen, verwendet.</col>
</row>
<row>
<col>CheckSlide</col>
<col>Boolean</col>
<col>Wenn wahr, wird vor dem Aufruf der Reaktion das Standardverhalten (Sprenkeln am Boden und Abrutschen nach MaxSlide) ausgeführt.</col>
</row>
<row>
<col>Depth</col>
<col>Integer</col>
<col>Nur für Reaktionstyp Convert: Tiefe im Zielmaterial, ab der Material umgewandelt wird.</col>
</row>
<row>
<col>ConvertMat</col>
<col>String</col>
<col>Nur für Reaktionstyp Convert: Material, in das umgewandelt wird. Bei Angabe von Sky wird das Material vernichtet.</col>
</row>
<row>
<col>CorrosionRate</col>
<col>Integer</col>
<col>Nur für Reaktionstyp Corrode: Chance darauf, dass verätzt wird.</col>
</row>
</table></text>
<text><table>
<caption id="ReactEvents">Reaktionsereignisse</caption>
<rowh><col>Name</col><col>Wert</col><col>Ereignis</col></rowh>
<row><col>MEE_PXSPos</col><col>0</col><col>Check vor jedem Bewegungsframe eines losen Materialpixels gegen das Hintergrundmaterial</col></row>
<row><col>MEE_PXSMove</col><col>1</col><col>Check gegen jedes Pixel, das ein loses Materialpixel in seiner Bewegung berührt</col></row>
<row><col>MEE_MassMove</col><col>2</col><col>Bei größeren Materialbewegungen (z.B. angegrabener See):Check des bewegten Materials gegen das Material, über das es sich bewegt</col></row>
</table></text>
<text><table>
<caption id="ReactTypes">Reaktionstypen</caption>
<rowh><col>Name</col><col>Verhalten</col></rowh>
<row><col>Script</col>
<col>Für jedes Aufeinandertreffen wird die in ScriptFunc angegebene Scriptfunktion aufgerufen.
</col></row>
<row><col>Convert</col><col>Das Material wird in ein anderes umgewandelt. Vergleichbar mit dem Verhalten von Schnee in Wasser.</col></row>
<row><col>Poof</col><col>Sowohl das lose als auch das feste Material werden entfernt. Außerdem werden wird mit Chance 1:3 eine kleine Rauchwolke erzeugt und mit Chance 1:3 der Sound "Pshshsh" abgespielt. Vergleichbar mit dem Verhalten von Wasser in Lava.</col></row>
<row><col>Corrode</col><col>Das lose Material ätzt das Zielmaterial mit Chance CorrosionRate weg und entfernt sich dabei selber. Wenn geätzt wird, wird mit Chance 1:5 eine kleine Rauchwolke erzeugt und mit Chance 1:20 der Sound "Corrode" abgespielt. Vergleichbar mit dem Verhalten von Säure auf Erde.</col></row>
<row><col>Insert</col><col>Das lose Material wird als festes Material eingefügt. Vergleichbar mit dem Verhalten aller Materialien, wenn sie auf ein Material gleicher oder höherer Dichte treffen.</col></row>
</table></text>
<text><table>
<caption id="TargetSpecs">Materialspezifikationen</caption>
<rowh><col>Name</col><col>Materialien</col></rowh>
<row><col>Materialname</col><col>Entsprcht die Spezifikation direkt dem Namen eines anderen Materials, wird dieses benutzt.</col></row>
<row><col>All</col><col>Alle Materialien inklusive "Sky"</col></row>
<row><col>Solid</col><col>Alle festen Materialien</col></row>
<row><col>SemiSolid</col><col>Alle festen und flüssigen Materialien</col></row>
<row><col>Background</col><col>Alle Hintergrundmaterialien, inklusive "Sky"</col></row>
<row><col>Sky</col><col>Das Hintergrundmaterial.</col></row>
<row><col>Incindiary</col><col>Alle anzündenden Materialien.</col></row>
<row><col>Extinguisher</col><col>Alle feuerlöschenden Materialien.</col></row>
<row><col>Inflammable</col><col>Alle entzündbaren Materialien.</col></row>
<row><col>Corrosive</col><col>Alle verätzbaren Materialien.</col></row>
<row><col>Corrode</col><col>Alle ätzenden Materialien.</col></row>
</table></text>
<h>Reaktionstyp 'Script'</h><text>
Mit dieser sehr rechenintensiven Methode kann das Materialveralten frei bestimmt werden. Die Scriptfunktion sollte global deklariert haben und folgende Parameter besitzen:
<table><rowh><col>Parameternummer(n)</col><col>Name(n)</col><col>Datentyp</col><col>Beschreibung</col></rowh>
<row><col>1,2</col><col>iX, iY</col><col>Integer</col><col>Position des losen Materials. Die Parameter können verändert werden, um das Materialpixel zu verschieben.</col></row>
<row><col>3,4</col><col>iLSPosX, iLSPosY</col><col>Integer</col><col>Position in der Landschaft, auf die das Material trifft.</col></row>
<row><col>5,6</col><col>iXDir, iYDir</col><col>Integer</col><col>Geschwindigkeit (in 1/100px) der Bewegung des Materials. Kann geändert werden, um die Geschwindigkeit des Materialpixels zu beeinflussen. Nicht für MassMover.</col></row>
<row><col>7</col><col>iPxsMat</col><col>Integer</col><col>Materialnummer des losen Materials. Nützlich, wenn die gleiche Funktion für Reaktionen mehrerer Materialen verwendet wird</col></row>
<row><col>8</col><col>iLsMat</col><col>Integer</col><col>Materialnummer des festen Materials.</col></row>
<row><col>9</col><col>iEvent</col><col>Integer</col><col>Siehe <emlink href="material/c4m.html#ReactEvents">Reaktionsereignisse</emlink>.</col></row>
</table>
Der Rückgabewert der Funktion sollte entweder 1 für Entfernen oder 0 für Erhalten des losen Materials sein.
</text>
</part>
<author>Sven2</author><date>Dezember 2006</date>
</doc>

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Materialdefinitionen</title>
<h id="Materialdefinitionen">Materialdefinitionen</h>
<part>
<text>Mit Materialdefinitionen können Aussehen und Funktion der Materialien, aus denen eine Clonk-Landschaft besteht, bestimmt werden. In der Landschaft eines Szenarios können maximal 125 verschiedene Materialien verwendet werden.</text>
<h id="MaterialdefinitionsKomponentenMaterialc4g">Materialdefinitions-Komponenten (Material.c4g)</h>
<dl>
<dt id="TexMaptxt"><img src="../../images/icon_text.gif" width="16" height="16"/>TexMap.txt</dt>
<dd><text>Zuordnungstabelle für Farbindizes in statischen und komplexen dynamischen Landkarten. Den Farben 0-127 kann eine Material-Textur-Referenz zugewiesen werden. Die Farben 128-255 stehen für die gleiche Reihe von Materialien in unterirdischem Zustand.</text>
<text>Die Engine zeichnet dabei Materialien mit höherem Index über solche mit niedrigeren, so dass bei der Standardtabelle die runde Erde das eckige Wasser überschreibt, weil letzteres einen niedrigeren Index hat. Einen noch höheren Index haben die Resourcen, damit sie nach außen gewölbt sind, und nicht die Wölbung der Erde in sie hineinragt, was etwas seltsam aussähe. Die Reihenfolge ist auch der Grund, weshalb einzelne Goldpixel einer statischen Landkarte nach dem Zoomen mehr Platz einnehmen als das dem Pixel entsprechende Quadrat, während ein einzelnes Wasserpixel oft von der umgebenden Erde komplett übermalt wird.</text>
<text>Wenn eine selbstgemalte Landkarte von der Engine mit der Meldung "Landkarte: Textur n nicht definiert." abgelehnt wird, kann dies durch definieren der Textur n in der TexMap behoben werden. Grundsätzlich sollte man ein palettenfähiges Grafikprogramm (MS Paint gehört nicht dazu) oder den Entwicklermodus der Engine verwenden, um solche Probleme zu vermeiden.</text></dd>
<dt id="c4m"><img src="../../images/icon_material.gif" width="16" height="16"/><emlink href="material/c4m.html">*.c4m</emlink></dt>
<dd><text>Die Engine akzeptiert bis zu 125 Materialdefinitionen gleichzeitig. C4M-Dateien sind einfache Textdateien. Die Materialien Vehicle, Tunnel, Water, Snow, Granite, Sand und Earth müssen immer vorhanden sein.</text></dd>
<dt id="bmp"><img src="../../images/icon_image.gif" width="16" height="16"/>*.png/*.bmp</dt>
<dd><text>Es können beliebig viele Texturen im Format PNG oder als unkomprimierte Windows-Bitmaps (mit 256 Farben) in einer Materialgruppe abgelegt werden. Breite und Höhe eines jeden Bitmaps müssen Zweierpotenzen sein (also 16, 32, 64, 128, 256, etc.) Im veralteten BMP-Format dürfen nur die ersten drei Farben des Textur-Bitmaps verwendet werden (Farbindex 0-2). Die Farbgebung ist irrelevant, da die Texturen im Spiel mit den Farben des jeweiligen Materials kombiniert werden.</text></dd>
</dl>
<h id="MaterialTexturReferenzen">Material-Textur-Referenzen</h>
<text>An zahlreichen Stellen in Szenario-Definitionen werden Materialien (ggf. mit Textur- und Mengenangaben) bestimmt.</text>
<text><table>
<row>
<col>Einfache Materialangabe (mit Vorgabetextur):</col>
<col><code>Earth</code></col>
</row>
<row>
<col>Material mit bestimmter Textur:</col>
<col><code>Earth-Rough</code></col>
</row>
<row>
<col>Material mit Textur und Mengenangabe:</col>
<col><code>Gold-Rough=100</code></col>
</row>
<row>
<col>Mehrfache Materialien:</col>
<col><code>Earth-Smooth=10; Rock-Rough=5; Gold=2</code></col>
</row>
</table></text>
</part>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>April 2004</date>
</doc>

View File

@ -0,0 +1,214 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Partikel</title>
<h id="Partikel">Partikel</h>
<part>
<text>Partikel sind abgespeckte Objekte, die im Netzwerk nicht synchronisationsrelevant sind. Das heißt einerseits, dass man Partikel relativ problemlos in größeren Mengen erstellen kann, um interessante Effekte zu erzielen. Andererseits existieren nur sehr wenige Möglichkeiten, un das Verhalten von Partikeln zu steuern. Wenn die Möglichkeiten von Partikeln also für einen Effekt nicht ausreichen, sollten stattdessen reguläre Objekte verwenden, mit denen sich alle durch Partikel darstellbaren Effekte auch erzielen lassen.</text>
<text>Wenn ein Partikel in einer c4d-Datei definiert ist, wird ein ebenfalls in dieser Gruppendatei vorhandenes Objekt nicht geladen. Im veralteten Grafiksystem konnte man so ein alternatives Objekt anbieten, das im neuen Grafiksystem nicht geladen wird.</text>
<text>Partikel werden nicht in Spielständen gespeichert, da sie nur für kurzzeitige Effekte gedacht sind.</text>
<h id="PartikelKomponentenC4D">Partikel-Komponenten (C4D)</h>
<dl>
<dt><img src="../../images/icon_text.gif" width="16" height="16"/>Particle.txt</dt>
<dd>
<text>Partikeleigenschaften.</text>
</dd>
<dt id="Graphicspng"><img src="../../images/icon_image.gif" width="16" height="16"/>Graphics.png</dt>
<dd>
<text>Partikelgrafik.</text>
<text>Zusätzlich dazu sind natürlich auch alle von <emlink href="definition/index.html">Objektdefinitionen</emlink> bekannten Elemente für das Frontend verfügbar (also z.B. Title.bmp, DescDE/US.txt, etc.)</text>
</dd>
</dl>
<h id="Particletxt">Particle.txt</h>
<text>In dieser Datei werden - analog zur <emlink href="definition/defcore.html">DefCore.txt</emlink> bei <emlink href="definition/index.html">Objektdefinitionen</emlink> - die Eigenschaften des Partikeltyps beschrieben.</text>
<text><table>
<caption id="SektionDefCore">Sektion [Particle]</caption>
<rowh>
<col>Wert</col><col>Datentyp</col><col>Beschreibung</col>
</rowh>
<row>
<col>Name</col><col>Zeichenfolge (max. 30)</col>
<col>Name des Partikeltyps. Dieser Name dient zugleich zur Referenzierung in Scripten. Für Mehrsprachigkeit im Frontend sollte die Names.txt benutzt werden.</col>
</row>
<row>
<col>MaxCount</col>
<col>Integer</col>
<col>Maximale Instanzzahl für diesen Partikeltyp. Siehe <a href="#maxcount">Mengenkontrolle</a>.</col>
</row>
<row>
<col>MinLifetime</col>
<col>Integer</col>
<col>Nur für Rauchpartikel: Untere Grenze für die Lebensdauer, die nach Zufall zwischen MinLifetime und MaxLifetime gesetzt wird.</col>
</row>
<row>
<col>MaxLifetime</col>
<col>Integer</col>
<col>Nur für Rauchpartikel: Obere Grenze für die Lebensdauer, die nach Zufall zwischen MinLifetime und MaxLifetime gesetzt wird.</col>
</row>
<row>
<col>InitFn</col>
<col>Zeichenfolge (max. 30)</col>
<col>Identifikator für die Funktion, die zur Initialisierung des Partikels verwendet wird. Für gültige Funktionen siehe Sektion <a href="#funcs">Partikelfunktionen</a>.</col>
</row>
<row>
<col>ExecFn</col>
<col>Zeichenfolge (max. 30)</col>
<col>Identifikator für die Funktion, die jedes Frame zur Ausführung des Partikels verwendet wird. Für gültige Funktionen siehe Sektion <a href="#funcs">Partikelfunktionen</a>.</col>
</row>
<row>
<col>DrawFn</col>
<col>Zeichenfolge (max. 30)</col>
<col>Identifikator für die Funktion, die zum Zeichnen des Partikels verwendet wird. Für gültige Funktionen siehe Sektion <a href="#drawfuncs">Zeichenfunktionen</a>.</col>
</row>
<row>
<col>CollisionFn</col>
<col>Zeichenfolge (max. 30)</col>
<col>Identifikator für die Funktion, die Kollision des Partikels mit der Landschaft aufgerufen wird. Siehe auch <a href="#collision">Kollisionsabfrage</a></col>
</row>
<row>
<col>Face</col>
<col>6 Integer</col>
<col>Zielrechteck für die Grafik in der Graphics.png. Siehe <a href="#face">Partikelgrafik</a>.</col>
</row>
<row>
<col>YOff</col>
<col>Integer</col>
<col>Obere Grenze für diesen Partikeltyp. An dieser Stelle werden die Partikel abgeschnitten, als wäre die Landschaft schon dort zu Ende. Nur StdExec.</col>
</row>
<row>
<col>Delay</col>
<col>Integer</col>
<col>Wartezeit zwischen den Animationsphasen. Bei Delay=0 wird eine Zufallsphase dauerhaft benutzt.</col>
</row>
<row>
<col>Repeats</col>
<col>Integer</col>
<col>Anzahl der Animationswiederholungen, bis sich das Partikel zerstört.</col>
</row>
<row>
<col>Reverse</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 wird jede zweite Animation rückwärts abgespielt.</col>
</row>
<row>
<col>FadeOutLen</col>
<col>Integer</col>
<col>Falls angegeben, wird diese Anzahl der Animationsphasen von hinten abgenommen und für eine Endanimation reserviert, die nach Repeats Abläufen der Standardanimation ausgeführt wird.</col>
</row>
<row>
<col>FadeOutDelay</col>
<col>Integer</col>
<col>Wartezeit zwischen zwei in FadeOutLen angegebenen Animationsphasen.</col>
</row>
<row>
<col>RByV</col>
<col>Integer</col>
<col>0 bis 3. 0 für keine Partikel-Drehung. Bei 1 dreht sich das Partikel nach Bewegungsrichtung; vorne ist dabei oben. Bei 2 dienen die Geschwindigkeitparameter nur der Ausrichtung; das Partikel bewegt sich nicht. Bei 3 dreht sich das Partikel zufällig (ab 4.9.8.0).</col>
</row>
<row>
<col>GravityAcc</col>
<col>Integer</col>
<col>Gravitationsauswirkung. Bei 0 wird das Partikel gar nicht von der Gravitation beschleunigt, bei 100 normal. Negative Werte sind ebenfalls möglich.</col>
</row>
<row>
<col>WindDrift</col>
<col>Integer</col>
<col>Abtrieb durch Wind. Wie die gleichnamige Materialeigenschaft. Ab CR 4.9.8.4.</col>
</row>
<row>
<col>VertexCount</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 wird eine <a href="#collision">Kollisionsabfrage</a> durchgeführt.</col>
</row>
<row>
<col>VertexY</col>
<col>Integer</col>
<col>Prozentualer Wert fürs Y-Offset des Abfragepunktes für Kollisionen mit der Landschaft. Siehe auch <a href="#collision">Kollisionsabfrage</a>.</col>
</row>
<row>
<col>Additive</col>
<col>Integer</col><col>0 oder 1. Bei 1 wird das Partikel additiv gezeichnet.</col>
</row>
<row>
<col>AlphaFade</col>
<col>Integer</col>
<col>0 bis 40. Ausfaden pro Frame. Wenn das Partikel vollends ausgefadet ist, verschwindet es.</col>
</row>
<row>
<col>Parallaxity</col>
<col>2 Integer</col>
<col>Parallaxität in X- und in Y-Richtung. 0 ist fest mit dem Bildschirm; 100 ist Standard (fest mit der Landschaft).</col>
</row>
<row>
<col>Attach</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 bewegt sich das Partikel bei angegebenem Zielobjekt relativ zu diesem. Ab 4.95.4.</col>
</row>
</table></text>
<h id="attributes">Eigenschaften</h>
<text>Jedes Partikel hat eine Position (x, y), Impulse horizontal (xdir) und vertikal (ydir), sowie eine Lebenszeit (life) und zwei Extraparameter (a und b). Diese werden von den <a href="#funcs">Partikelfunktionen</a> verwaltet, und können bei der Erzeugung im Script nur mit Startwerten versehen werden. Für die Bedeutung der Attribute im Einzelnen siehe <a href="#funcs">Partikelfunktionen</a> und <a href="#drawfuncs">Zeichenfunktionen</a>.</text>
<h id="face">Grafik</h>
<text>Die Koordinaten für das Zielrechteck der Grafik in die Graphics.png sind vergleichbar mit Face in der <emlink href="definition/actmap.html">ActMap.txt</emlink>. Die geben nur die erste Animationsphase an, und alle weiteren Phasen sollten rechts (Bei Rauch auch unterhalb) davon liegen; die Animationslänge wird automatisch aus der Größe der Grafik ermittelt. Für das Grafikoffset sollte normalerweise die halbe Objektgröße angegeben werden, da das Standardoffset 0/0 bedeuten würde, dass das die Grafik rechts unterhalb der eigentlichen Partikelposition gezeichnet wird.</text>
<text>Wenn für Delay 0 angegeben ist, wird bei der Initialisierung eine zufällige Animationsphase ausgesucht, und beibehalten. Das Partikel existiert dann, bis es aus der Landschaft geflogen ist.</text>
<h id="maxcount">Mengenkontrolle</h>
<text>Für jedes Partikel wird eine Maximalzahl angegeben, die nach der vom Spieler in den Grafikoptionen angegebene Effektmenge noch angepasst werden kann. Sobald mehr als die Hälfte dieser Anzahl vorhanden ist, werden schon nach dem Zufallsprinzip einige Partikel nicht erstellt, so dass die Zahl der neu erzeugten Partikel mit Zunahme zur Maximalmenge schrumpft, und der übergang nicht zu hart ist, wenn die Partikelmenge an ihre Grenzen stößt. Wenn es wichtig ist, dass ein Partikel garantiert erzeugt wird, sollte in jedem Fall stattdessen ein Objekt benutzt werden, da Partikel auch nach dem Speichern verschwinden.</text>
<h id="collision">Kollisionsabfrage</h>
<text>Partikel können Kollisionsabfragen mit der Landschaft durchführen. Diese sind jedoch nicht sehr genau; schnelle Partikel können also durch dünne Materialschichten hindurchfliegen. Wenn das nicht akzeptabel ist, müssen Objekte benutzt werden.</text>
<text>Kollisionsabfragen werden nur bei StdExec durchgeführt, also nicht bei Rauchpartikeln. Für gültige Funktionen siehe Sektion <a href="#funcs">Partikelfunktionen</a>. Die Abfrage wird nur bei angegebenem VertexCount und an der Objektmitte durchgeführt. Der Abfragepunkt kann vertikal mit VertexY verschoben werden. Die angegebenen Koordinaten sind dabei prozentual zur Partikelgröße, das heißt VertexY=100 würde am unteren Rand des Partikels prüfen. Die in Face angegebene Größe der eigentlichen Grafik spielt dabei keine Rolle.</text>
<h id="funcs">Partikelfunktionen</h>
<text>Das Verhalten von Partikeln kann durch Angabe von Partikelfunktionen gesteuert werden. Diese werden zur Initialisierung, jedes Frame und bei <a href="#collision">Kollision</a> mit der Landschaft ausgeführt.</text>
<dl>
<dt id="stdexec">StdExec</dt>
<dd><text>Standardfunktion für ExecFn für fast alle Partikel. Das Partikel führt eine durch Face, Delay, Repeats, Reverse, FadeOutLen und FadeOutDelay definierte Animation aus, und wird dann zerstört. Dabei steht der Extraparameter a für die Größe der Grafik in Zehntelpixeln. b gibt eine Farbmodulation an; bei b=0 wird gar nicht moduliert. Sowohl aa als auch b werden von dieser Funktion nicht verändert und behalten somit ihre bei der <a href="#control">Erschaffung</a> angegebenen Werte. Ferner bewegt sich das Partikel nach xdir und ydir, wobei sich ydir bei angegebenem GravityAcc je nach Gravitation erhöhen oder verringern kann.</text></dd>
<dt id="stdinit">StdInit</dt>
<dd><text>Standardfunktion, die für InitFn zusammen mit StdExec verwendet werden sollte.</text></dd>
<dt id="bounce">Bounce</dt>
<dd><text>Kollisionsfunktion: Das Partikel kehrt seine Richtung komplett um.</text></dd>
<dt id="bouncey">BounceY</dt>
<dd><text>Kollisionsfunktion: Das Partikel kehrt nur die vertikale Geschwindigkeit um.</text></dd>
<dt id="stop">Stop</dt>
<dd><text>Kollisionsfunktion: Das Partikel hält an.</text></dd>
<dt id="die">Die</dt>
<dd><text>Kollisionsfunktion: Das Partikel wird sofort zerstört.</text></dd>
<dt id="smokeexec">SmokeExec</dt>
<dd><text>Hardgecodete Lösung für ExecFn für Rauch. a ist wieder die Rauchgröße; b die Farbmodulation. Der Rauch muss 4x4 Grafiken in der Graphics.png definiert haben, von denen die unterste rechte nur sehr selten benutzt wird. Die anderen werden gleichmäßig ausgewählt. Der Rauch steigt immer gleichmäßig auf und hält an, wenn er mit der Oberkante die Landschaft kollidiert. Wenn die Lebenszeit life abgelaufen ist, fadet der Rauch aus, in dem sich die Alphakomponente von b erhöht, bis sie 255 ist und das Partikel entfernt wird.</text></dd>
<dt id="smokeinit">SmokeInit</dt>
<dd><text>Funktion für InitFn, die zusammen mit ExecFn=SmokeExec benutzt werden sollte.</text></dd>
</dl>
<h id="drawfuncs">Zeichenfunktionen</h>
<text>Funktionen, die DrawFn zugewiesen werden können.</text>
<dl>
<dt id="drawstd">Std</dt>
<dd><text>Standardfunktion für fast alle Fälle außer Rauch. Das Partikel wird an x/y in der Größe a/5 x a/5 gezeichnet, und mit b farbmoduliert.</text></dd>
<dt id="drawsmoke">Smoke</dt>
<dd><text>Zeichenfunktion für Rauch. Sollte zusammen mit SmokeInit und SmokeExec verwendet werden.</text></dd>
</dl>
<h id="control">Kontrolle</h>
<text>Die externe Kontrolle von Partikeln beschränkt sich auf wenige Funktionen zur Erzeugung, Gesamtverschiebung und Gesamtzerstörung. Das muss so sein, da Partikel nicht syncrelevant sind, und damit so gut wie gar nicht vom Script aus abfragbar sein können (ansonsten würden unterschiedliche Effektmengen im Netzwerk zu Desyncs führen). Partikel werden mit <funclink>CreateParticle</funclink> erschaffen.</text>
</part>
<author>Sven2</author><date>April 2002</date>
</doc>

View File

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Blenderclonk</title>
<h id="Blenderclonk">Blenderclonk</h>
<part>
<text>Diese Anleitung erklärt den Umgang mit dem Clonkmodell für Blender.</text>
<h id="WichtigeDateien">Wichtige Dateien:</h>
<text><img src="../images/DownloadBlender.jpg" width="95" height="50"/></text><text>
Natürlich wird Blender benötigt! Ohne Blender geht hier nichts. Wer also noch kein Blender hat sollte es sich deswegen erst von
<a href="http://www.blender.org">www.blender.org</a> runterladen und installieren.</text>
<text>Blender installiert? Dann kann es ja weitergehen...</text>
<text>Die wichtige Hauptdatei, ist <strong>Clonk.blend</strong>. In ihr sind das Armatureobjekt (Skelett des Clonkes) und die Scripte gespeichert. Zum Erstellen der Grafiken wird <strong>Anigrab.exe</strong> benötigt, das im gleichen Verzeichnis liegen sollte wie die .blend Datei. Um die Scripte richtig aus zu führen wird eine Pythoninstallation benötigt. Diese kann von <a href="http://www.python.org/">www.python.org</a> geladen werden. Es gibt dann noch vier wichtige <strong>Unterordner</strong>:
<ul>
<li>Im Ordner <strong>Actions</strong> sind alle Animationen, die für die einzelnen Clonks gebraucht werden als .anim Datei abgelegt.</li>
<li>Der Ordner <strong>Clonks</strong> enthält .mesh Dateien, in denen die Meshes der einzelnen Clonks gespeichert sind. In den jeweiligen .act Dateien ist dann zu dem Clonk die Abfolge der Actions gespeichert, in der Reihenfolge wie sie dann später in der Graphics.png erscheinen soll.</li>
<li>Im Ordner <strong>Tools</strong> sind die Tools für die Animationen gespeichert. Das sind die Werkzeuge, die der Clonk bei verschiedenen Animationen verwenden soll, wie z.B. die Schaufel oder den Hammer.</li>
<li>Im Ordner <strong>Graphics</strong> werden dann nach dem Rendern die Graphics.png Dateien für die Clonks abgelegt.</li>
</ul>
</text>
<h id="ClonkLaden">Clonk laden:</h>
<text>Um den Renderclonk zu starten muss die Datei Clonk.blend geöffnet werden. Jetzt sieht man unten rechts in der Ecke die Scriptgui (Benutzeroberfläche des Scriptes).
</text>
<text>Dort kann man nun mit <strong>"Load Clonk"</strong> einen Clonk aus dem Unterordner Clonks auswählen. Mit dem Knopf daneben <img src="../images/DropDown.png" width="10" height="12"/> kann man auch schnell einen Clonk mit Hilfe eines Menüs auswählen.</text>
<text><strong>"Import Mesh"</strong> hilft beim Importieren eines Clonkes (siehe Kapitel Importieren).</text>
<h id="Hauptmenu">Hauptmenü</h>
<text><img src="../images/MainMenu.png" width="169" height="221"/></text>
<text>Mit Hauptmenü gibt es jetzt folgende Schaltflächen:
<ul>
<li><strong>Action:</strong> Hier können verschiedene Einstellungen zur Action gemacht werden.</li>
<li><strong>Clonk:</strong> Hier wird die Actionliste für den Clonk bearbeitet.</li>
<li><strong>Save/Load:</strong> Hier kann man Actions und Tools speichern und laden.</li>
<li><strong>Render:</strong> Dient zum Rendern des Clonkes.</li>
<li><strong>Exit:</strong> Zurück zum vorherigen Menü zum Laden eines anderen Clonkes.<br /><strong>Achtung:</strong> der Clonk wird dabei nicht gespeichert, eventuelle Änderungen gehen verloren!</li>
</ul>
Dazu gibt es noch eine Eingabezeile in der der Pfad für den temporären Ordner angegeben ist und dort geändert werden kann.
</text>
<h id="Action">Action</h>
<text><img src="../images/ActionMenu.png" width="169" height="221"/></text>
<text>Mit dem Dropdownmenü ganz oben können verschiedene <strong>Actions</strong> ausgewählt werden. Hat man das Armatureobjekt markiert erschienen dazu im Actionfenster dann die Keyframes der einzelnen Bones. In den unteren Feldern kann man die <strong>Länge (Length)</strong> der Action einstellen, also wie viele Frames die Action lang ist, und die <strong>Breite (X)</strong> und <strong>Höhe (Y)</strong> der einzelnen Framegrafiken. Zudem kann man noch zwei <strong>Werkzeuge (Tools)</strong> festlegen, die der Clonk bei dieser Action verwenden soll. Diese werden dann jeweils auf den Bone <strong>'Tool1'</strong> bzw. <strong>'Tool2'</strong> gelegt.</text>
<text>Mit <strong>Rename</strong> kann die Action umbenannt werden. Mit <strong>New</strong> wird eine neue Action hinzugefügt, wahlweise mit alten Keyframes oder ohne. Der untere Knopf ist dann zum <strong>Speichern</strong> der Action. Dies sollte man immer tun, wenn man Keyframes oder Einstellungen zur Action verändert hat. Die Action wird dann im Unterordner Actions gespeichert.</text>
<h id="Clonk">Clonk</h>
<text><img src="../images/ClonkMenu.png" width="177" height="280"/></text>
<text>Hier sieht man die Liste der Actions des Clonkes. Wenn mehrere Spalten zu sehen sind, enthalten die rechten Spalten immer die Actions, die vor denen kommen, die in der Spalte links davon zu sehen sind. Da oft der Platz nicht ausreicht um alle Actions zu sehen kann man das Fenster mit einem Klick auf <img src="../images/ButtonFullScreen.png" width="52" height="17"/> auf den ganzen Bildschirm vergrößern. Mit einem erneuten Klick auf diese Schaltfläche kann man das Fenster wieder verkleinern.</text>
<text>Zum nun die Liste zu verändern muss kann man auf eine Action klicken und dann statt dessen eine andere auswählen. Mit <strong>REMOVE</strong> kann man die Action aus der Liste löschen. Mit <strong>INSERT</strong> wird über der Action ein Platz eingefügt. Die Actions mit einem U davor sind Actions, die in der Liste noch nicht vorkommen. Die abgesetzte Box am unteren Ende der Liste enthält die Action für das <strong>Picturebild</strong> des Clonks.</text>
<text>Darunter kann man den <strong>BaseZoom</strong> einstellen. Das ist die Zoomeinstellung der Kamera, und wird benötigt falls man ein Mesh hat das zu groß ist und kleiner dargestellt werden soll, bzw andersherum. Diese Einstellung wird aber normalerweise bei den Clonks nicht benötigt. Der unterste Schalter <strong>speichert</strong> die Actionliste und das Mesh des Clonkes.</text>
<text><strong>Achtung:</strong> Die Clonk dürfen immer nur aus <strong>einem</strong> Mesh bestehen! Hat man zwei Meshes können diese mit Strg+J verbunden werden.</text>
<text>Auch muss immer über das Scriptinterface gespeichert werden und nicht mit der normalen Blender-Speicherfunktion! Dabei werden jedoch exotische Einstellungen nicht exportiert! Also wenn nach dem Laden z.B. ein bestimmter Modifier oder eine Textureinstellung nicht aktiviert ist, liegt es daran, das diese nicht unterstützt wird.</text>
<h id="SaveLoad">Save/Load</h>
<text><img src="../images/SaveMenu.png" width="169" height="221"/></text>
<text>Hier können Actions und Tools geladen werden. Am Anfang beim Laden des Clonkes werden nur die Actions und Tools geladen, die der Clonk benötigt. Falls man weitere Actions von anderen Clonks braucht kann man diese hiermit laden. Dabei kann man mit einem Klick auf den Schalter sich die <strong>Action/Tool</strong> mit dem Menüsystem aussuchen oder mit einem Klick auf <img src="../images/DropDown.png" width="10" height="12"/>direkt aus einem Dropdownmenü aussuchen.</text>
<text>Dieses Menü dient auch zum Speichern. Man kann hier eine <strong>Action</strong>, ein <strong>Tool</strong> und den <strong>Clonk</strong> speichern. Action und Clonk können auch in den anderen Untermenüs (Action bzw. Clonk) gespeichert werden. Tools können nur hier gespeichert werden.</text>
<text>Das Eingabefeld ganz unten dient zum ändern des <strong>Clonknamens</strong>. Hat man z.B. den normalen Clonk geladen und bearbeitet kann man ihn hier vor dem Speichern umbenennen, damit der normale Clonk nicht überschrieben wird.</text>
<text><strong>Achtung:</strong> die normale Speicherfunktion von Blender kann hier NICHT zum speichern verwendet werden. Zum Speichern bitte immer die Scriptgui (das Fenster unten rechts) verwenden.</text>
<h id="Render">Render</h>
<text><img src="../images/Render.png" width="78" height="71"/></text>
<text>Mit einem Klick auf die Renderschaltfläche öffnet sich ein Menü. Hier können verschiedene <strong>Actions</strong> ausgewählt werden, die separat gerendert werden sollen. Mit <strong>-All-</strong> kann der gesamte Clonk durchgerendert werden.</text>
<text>Mit weiteren Untermenü kann man dann auswählen ob man mit oder ohne Overlay gerendert haben möchte. <strong>Both</strong> rendert dabei beides, Graphics.png und Overlay.png. <strong>Graphics/Overlay</strong> rendern jeweils nur eines von beiden. Mit <strong>Full</strong> kann man dann beides in eine Grafik rendern. Dies dient dazu dass man sich den Clonk nach dem Rendern besser anschauen kann.</text>
<text>Beim Rendern wird jeder Einzelframe im temporären Verzeichnis gespeichert. Diese werden dann nach dem Rendern mit <strong>Anigrab</strong> zur Grafik zusammengebaut. Diese findet sich dann im Ausgabeordner /Graphics/Clonkname/Graphics.png. Dabei werden die Actions in der <strong>Reihenfolge</strong>, wie sie in der Liste vorkommen in die Grafik gestellt. Die Breite der Grafik richtet sich dabei nach der breitesten Action. Passen mehrere Actions nebeneinander werden sie auch so in die Grafik gestellt. Zum Schluss wird das <strong>Picture</strong> an einen freien Platz oder das Ende der Grafik gestellt. Damit man die ActMap zu dem Clonk besser erstellen kann werden die Positionen der Actions in einer Datei im Ausgabeordner gespeichert.</text>
<text>Wird nur eine <strong>einzelne Action</strong> gerendert, dann wird trotzdem versucht die gesamte Grafik zu bauen. Es sollten also von den anderen Actions schon gerenderte Frames in dem temporären Ordner liegen. Diese Funktion dient dazu, dass man nicht immer alle Actions neu rendern muss, wenn man nur an einer Action etwas verändert hat. Zu Anfang muss jedoch einmal komplett durchgerendert werden, damit die Grafiken der anderen Actions schon im temporären Ordner liegen.</text>
<h id="Anmerkung">Anmerkung</h>
<text>Generell werden alle Materialien, die mit <strong>Overlay*</strong> anfangen, bei <strong>Graphics</strong> nicht gerendert. Bei <strong>Overlay</strong> werden nur die Materialien mit Overlay* gerendert. Bei <strong>Full</strong> werden beide gerendert. Zusätzlich wird bei Full noch das Material OverlayColor blau statt weiß gefärbt.</text>
<text>Das Material <strong>Face</strong> wird in den normalen Animationen mit der Textur <strong>'Face'</strong> belegt und beim Picture mit <strong>'Face2'</strong> geskinnt. Dies ist nötig, da das hochauflösende Gesicht in der kleinen Animation untergehen würde und deswegen eine gröbere Textur verwendet werden muss.</text>
<h id="Tools">Tools</h>
<text>Tools sind die <strong>Werkzeuge</strong> des Clonks, die er bei verschiedenen Animationen verwendet. Die Tools des Standartclonks sind Schaufel, Axt, Hammer und Flasche. Beim Ritter kommen dann noch diverse Waffen dazu.</text>
<text>Um ein neues Tool zu erstellen muss zunächst ein <strong>passendes Mesh</strong> gebaut werden. Wichtig hierbei ist auch, dass das Tool nur aus <strong>einem</strong> Mesh besteht. Hat man ein Mesh modelliert muss es noch passend platziert werden, damit es später bei der Verwendung auch richtig am Bone sitzt. Dazu setzt man am besten die Action 'Empty' für das Armatureobject (oder eine andere Animation, die keine Tools verwendet). Jetzt sieht man über dem Kopf des Clonkes die beiden Toolbones auf einer Stelle. Das Mesh muss nun so plaziert werden, dass die Stelle, an der der Clonk das Tool anfassen soll direkt auf dem Bone zu liegen kommt. Das ganze am besten noch von verschiedenen Ansichten prüfen.</text>
<text>Nun sollte das neue Tool noch passende benannt werden. Dabei sollte <strong>Objectname</strong> und <strong>Meshname</strong> identisch sein.</text>
<text><img src="../images/NewTool.png" width="200" height="67"/><br />
Jetzt kann das Tool über <strong>Save/Load</strong> und <strong>'Save Tool'</strong> gespeichert werden. Dazu dann das Tool aus der aufklappenden Meshliste auswählen. Das Tool wird nun unter /Tools/toolname.mesh gespeichert.</text>
<h id="Importieren">Importieren</h>
<text>Um einen Clonk zu importieren muss auch erst Clonk.blend geladen werden. Jetzt brauchen wir das zu importierende Clonkmesh. Dieses kann über <strong>File->Append or Link</strong> aus der alten Datei geladen werden. Dazu die Datei in dem geöffneten Menü auswählen, dann auf Objects und dann das Objekt wählen, dass den Clonk enthält. Wichtig ist, dass der geladene Clonk nur aus einem Mesh besteht! Besteht er aus mehreren müssen diese zunächst mit beide selektiert (Shift+Rechtsklick) und mit Strg+J verbunden werden. Das neue Mesh muss jetzt noch auf den Namen des Clonkes umbenannt werden.</text>
<text><img src="../images/NewClonk.png" width="200" height="67"/></text>
<text>Dabei sollte Objectname und Meshname identisch sein. Danach kann das selektierte Mesh mit einem Klick auf <strong>'Import Mesh'</strong> importiert werden. Im Untermenü Clonk können dann die Actions für den Clonk angepasst werden und der Clonk gespeichert werden. Jetzt kann man ihn genauso wie die anderen Clonks verwenden.</text>
</part>
<author>Randrian</author><date>Mai 2008</date>
</doc>

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Blenderclonk Beispiele</title>
<h id="Blenderclonk">Blenderclonk Beispiele</h>
<part>
<text>Wer sich noch nicht mit dem Modellieren in Blender auskennt, sollte zuerst ein allgemeines Blendertutorial machen!</text>
<text>Dazu am besten unter <a href="http://www.blender.org/education-help/tutorials/">http://www.blender.org/education-help/tutorials/</a> eines der Anfangstutorials durchgehen. Die Blender.org Tutorials sind allerdings in englisch.</text>
<text>Oder Blendertutorial vom Clonk-Center: z.B. <a href="http://www.cc.striver.net/texts.php?action=sh&amp;id=53">ein Flint</a>, <a href="http://www.cc.striver.net/texts.php?action=sh&amp;id=60">ein Bausatz</a> oder <a href="http://www.cc.striver.net/texts.php?action=sh&amp;id=134">ein Schwert</a></text>
</part>
<h id="ClonkWerden">Der Bauer Humpe will Clonk werden</h>
<text>Wir wollen nun einen Bauern Clonk basteln. Dazu muss erstmal Blender gestartet und das Script geöffnet werden. Da der Bauer auf dem normalen Clonk bassieren soll muss erstmal dieser geladen werden. Also im Scriptfenster auf <strong>LoadClonk</strong> oder <img src="../images/DropDown.png" width="10" height="12"/>klicken und Clonk.mesh (bzw. Clonk) auswählen.
Jetzt befinden wir uns im Hauptmenü und haben den Clonk geladen. Dieser soll jetzt aber umbenannt werden zum Bauer, damit wir nicht den normalen Clonk überschreiben. Dazu gehen wir auf <strong>Save/Load</strong> und geben unter <strong>Clonk Name</strong> statt Clonk nun Farmer ein (es ist allgemein üblich die Clonks in englisch zu bezeichnen, natürlich würde Bauer auch gehen). Nun kann der Bauer mit einem Klick auf <strong>Save Clonk</strong> gespeichert werden.</text>
<text>Gut, wir haben jetzt schon einen neuen Clonk geschaffen: den Bauer!</text>
<h id="Hut">Bauer sucht Hut</h>
<text>Damit man den Unterschied zwischen Bauer und Clonk erkennt sollte der Bauer natürlich anders aussehen. Bauer Hump möchte gerne einen Hut auf haben. Also geben wir ihm einen.</text>
<text><img src="../images/Hut.png" width="257" height="238"/></text>
<text>Zuerst muss dazu ein passen der Hut modelliert werden. Das sollte mit einem grundlegenden Blendertutorial wie den oben genannten kein großes Problem darstellen.</text>
<text>Der Hut ist zunächst ein einzelnes Mesh. Aber damit er zusammen mit dem Clonk gespeichert werden kann muss er mit dem Clonkmesh verbunden werden. Dazu muss im ObjektMode (gegebenenfalls aus dem EditMode mit Tab gewechselt werden) zuerst das Hutmesh mit rechts angeklickt werden und dann während man Shift gedrückt hält noch das Clonkmesh mit rechts angeklickt werden. Jetzt hat der Hut einen dunklen Rand und der Clonk einen hellen. Mit Strg+J können die beiden Meshes nun verbunden werden.</text>
<text>Damit der Hut immer passend mit dem Kopf bewegt wird muss er jetzt eine passende VertexGroup bekommen. Dazu auf <img src="../images/Button.png" width="21" height="21"/>gehen, dort links unter "Vertex Group" auf das Symbol neben dem Textfeld gehen. Aus dem Dropdownmenü dann 'Head' (für das Head Bone, also den Knochen der den Kopf steuert) auswählen. Dannach mit Tab in den Edit Mode wechseln, alle Vertices des Hutes (es können auch ein paar vom Vertices vom Kopf mit drin sein, das macht nichts) markieren und mit einem Klick auf Assign der Vertexgroup zuweisen.</text>
<text><img src="../images/Vertexgroup.png" width="499" height="130"/></text>
<text>Im Scriptfenster kann nun unter <strong>Clonk</strong> dann mit <strong>Save Farmer</strong> der Bauer mit seinem Hut gespeichert werden.</text>
<h id="Hose">Humpe will eine Hose haben</h>
<text>Als nächstes will Herr Humpe eine tolle Hose haben, denn der Einheitsoverall der Clonks ist für agrarwirtschaftliche Zwecke nicht adequat. Also muss eine braune Lederhose her.</text>
<text>Dazu muss zuerst eine neue Materialgroup her. Dazu unter <img src="../images/Button.png" width="21" height="21"/>im Bereich rechts neben den Vertexgroups auf 'New' klicken. Dann auf <img src="../images/Button2.png" width="21" height="21"/> und dem neu erzeugten Material einen Namen geben, hier bietet sich 'Leather' für ein Ledermaterial an. Mit den Farbwähler dann einen passenden Braunton einstellen. Nun muss das Material noch den passenden Stellen am Clonk zugewiesen werden. Dazu im EditMode die Vertices markieren, die die Lederhose umspannen sollen. Dann unter <img src="../images/Button.png" width="21" height="21"/>auf Assign gehen, damit das Material den selektierten Faces zugewiesen wird.</text>
<text><img src="../images/Trousers.png" width="443" height="250"/></text>
<text>So Humpe hat nun seine Hose an. Jetzt wird es mal wieder Zeit zu speichern.</text>
<h id="Mistgabel">Eine Mistgabel für Mr. Humpe</h>
<text>Als Bauer braucht man natürlich eine Mistgabel, sonst ist man ja kein richtiger Bauer!</text>
<text><img src="../images/Pitchfork.png" width="258" height="292"/></text>
<text>Dazu muss natürlich zuerst einmal die landwirtschaftliche Gabel modelliert werden. Das Mistgabel-Mesh sowie das Object sollte dann den Namen 'Pitchfork' (eng. für Mistgabel) gegeben werden. Dann muss das Mesh so verschoben werden, dass die Position, an der der Clonk später die Gabel anfassen soll genau auf dem Tool1 Bone es Armatureobjectes ist (siehe Bild). Nun kann die Gabel über 'Save/Load' mit dem Button 'Save Tool' gespeichert werden, dazu im aufklappenden Menü den Eintrag 'Pitchfork' auswählen.</text>
<text>Jetzt soll Humpe die Gabel natürlich beim Laufen immer tragen. Dazu werden wir als Grundlage die Action 'WalkStaff' verwenden. Diese muss zunächst geladen werden. Dazu gehen wir auf 'Save/Load' und wählen den Eintrag 'Load Action' aus und laden die Action 'WalkStaff'. Jetzt geht's ins Untermenü 'Actions' da wählen wir die Action 'WalkStaff' aus. Mit einem Klick auf 'New' wird eine neue Action erstellt. Als neunen Namen geben wir 'WalkPitchfork' ein. Die Frage nach dem Kopieren der Keyframes beantworten wir mit ja. Jetzt haben wir also eine neue Action mit dem Namen Pitchfork und den Keyframes von WalkStaff. Jetzt muss noch als Tool1 Pitchfork eingestellt werden, damit der Clonk statt dem Stab die Mistgabel verwendet. Mit einem Klick auf 'Save WalkPitchfork' kann die neue Action nun gespeichert werden.</text>
<text>Damit mit der neuen Action statt der alten Walk Animation gerendert wird müssen wir die noch in der Actionliste des Clonks umstellen. Dazu gehen wir auf 'Clonk' und machen das Fenster mit <img src="../images/ButtonFullScreen.png" width="52" height="17"/> einem Klick auf groß. Jetzt können wir 'Walk' anklicken und statt dessen 'WalkPitchfork' auswählen.</text>
<text>Was gleiche können wir jetzt für die Jump Action machen. Dazu laden wir 'JumpStaff'. Mit JumpStaff wird dann die neue Action JumpPitchfork erzeugt und Pitchfork als Tool1 zugewiesen, dabei nicht vergessen die Länge der Jumpanination auf 8 Frames statt 16 zu stellen. Jetzt wird Jump in der Actionliste durch JumpPitchfork ersetzt.</text>
<text>Jetzt läuft und springt Humpe glücklich mit seiner Mistgabel! Zeit zu speichern.</text>
<text>Nun kann Bauer Humpe endlich gerendert werden und sich seiner Clonkheit freuen:</text>
<text><img src="../images/Humpe.png" width="256" height="320"/></text>
<part>
<h id="Aufstand">Bauernaufstand! Humpe kämpft</h>
<text>Doch das alles ist noch nicht genug! Humpe will seine Mistgabel auch zum Kämpfen verwenden.</text>
<text>Also müssen Kampfanimationen her. Da man aber mit einer Mistgabel nicht einfach zu zuschlägt wie mit einem Schwert können wir nicht die Schwertanimation nehmen und die Mistgabel mit dem Schwert austauschen. Folglich müssen wir eine ganz neue Animation machen.</text>
<text>Dazu gehen wir zunächst ins Untermenü Action und klicken auf 'New' und geben als neuen Namen den Namen PitchforkStrike ein. Die Frage nach dem Kopieren von Keyframes verneinen wir. Die Animationslänge stellen wir auf 8 und die Breite auf 24. Die Höhe von 20 belassen wir so. Jetzt muss das Armatureobjekt angewählt werden und in den 'Pose Mode' gewechselt werden.</text>
<text>Zunächst muss in den Frame 1 gewechselt werden. Die Framenummer wird immer links unten im 3D Fenster angezeigt, bzw. als grüner Stich im Animationsfenster (siehe Bild). Dazu entweder im Animatonsfenster auf die Position vom Frame 1 klicken oder mit den Pfeiltasten die Frames durch schalten. Sind wir nun im Frame 1 angelangt können wir die Bones des Clonkes so verbiegen, wie er am Anfang der Angriffsanimation aussehen soll. Dabei sollte die Kamera von schräg vorne auf den Clonk blicken, weil das bei den meisten Animationen so ist.</text>
<text>Fertig positionierte Bones müssen dann noch mit einem Klick auf die Taste 'i' und der Auswahl von 'LocRot' in die Keyframeliste übernommen werden. Ist die Pose fertig und alle Bonepositionen als Keyframes gespeichert kann es weitergehen. Dann geht es weiter mit Frame 5, hier soll der Clonk gerade beim Ausholen ganz hinten sein (die zwischen Frames werden von Blender dann automatisch berechnet). Im Anschluss geht es mit Frame 7 weiter, hier soll der Clonk gerade ganz nach vorne stechen. Als 9. Frame wollen wir wieder den ersten haben, damit der Clonk wieder in die Ausgangsstellung zurückkehrt. Also drücken wir 'b' um im Actionfenster alles Keyframes des ersten Frames nun mit einem gezogenen Rahmen zu markieren. Mit Shift+D werden diese nur dupliziert und an die Stelle von Frame 9 verschoben. Warum Frame 9, den sieht man doch gar nicht, wir haben ja nur 8 Frames! Wir brauchen den 1. Frame ja nicht doppelt in der Animation, diese Kopie dient nur dazu das der Frame 8 als Übergang von 7 zu dem 1 von Blender berechnet wird.</text>
<text>Ein Klick auf 'Save StrikePitchfork' speichert nun die neue Action.</text>
<text><img src="../images/StrikeAction.png" width="637" height="372"/></text>
<text>Jetzt brauchen wir natürlich auch noch eine Animation in der Humpe mit der Mistgabel in Kampfstellung ist (dann wenn sich zwei Clonk im Kampf gegenüberstehen). Hier reicht eine Kopie von SwordFight. Also laden wir SwordFight über 'Save/Load' und 'Load Action'. Im 'Action' Untermenü kann jetzt mit 'New' eine Kopie der Action erstellt werden. Da muss jetzt die Länge auf 4 und die Breite auf 24 gesetzt werden. Also Tool1 stellen wir wieder unsere Pitchfork ein.</text>
<text>Jetzt kann man jedoch erkennen, dass der Clonk die Mistgabel zu hoch hält. Also im 'Pose Mode' das Tool1 Bone etwas tiefer setzen und einen Keyframe mit 'i' und 'LocRot' einfügen. Das ganze bei Frame 1, 3 und 5 jeweils so machen. Mit 'Save PitchforkFight' wird die Action dann gespeichert.</text>
<text>Jetzt müssen die beiden Actions noch in die Actionliste des Clonks aufgenommen werden. Dazu auf das leere Feld unter Drink klicken und 'PitchforkFigth' auswählen. Dannach in das nächste leere Feld das dann unter 'PitchforkFight' entsteht klicken und 'PitchforkStrike' auswählen.</text>
<text>Ein Klick auf 'Save Farmer' speichert und unsre Zusammenstellung.</text>
<text>Jetzt ist unser kleiner Agrarwirt endlich fertig. Mit einen Klick auf 'Render', 'All' und dann 'Both' wird nun Graphics.png und Overlay.png im Unterordner Graphics/Farmer erzeugt. Von dort können sie jetzt ins Spiel eingebaut werden.</text>
<text><img src="../images/Full.png" width="256" height="320"/></text>
</part>
<author>Randrian</author><date>Mai 2008</date>
</doc>

View File

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Kartengenerator</title>
<h id="Kartengenerator">Kartengenerator</h>
<part>
<text>Neben einfachen dynamischen, statischen und exakten Landkarten steht auch ein leistungsfähiger dynamischer Kartengenerator für komplexe, mit Zufallswerten erzeugte Landschaften zur Verfügung.</text>
<text>Dieser arbeitet mit verschachtelten und durch Operatoren verknüpfte Ebenen, denen jeweils ein Materialwert und diverse Attribute zugewiesen werden, die die Form beschreiben. Der Landschaftsgenerator rendert dabei die Karten mit Hilfe dieser Ebenen. Sie werden dann später wie reguläre statische Karten vergrößert</text>
<text>Die Objektstruktur aus Karten, Ebenen und Attributen wird aus der Datei 'Landscape.txt' im Szenario gelesen.</text>
<h id="Syntax">Syntax</h>
<text>Die Sprache zur Beschreibung solcher Karten arbeitet grundsätzlich mit Objekten, Attributen und Operatoren. Groß- und Kleinschreibung wird beachtet. Objekte werden wie folgt definiert:</text>
<code>Objekttyp [Name] { Attribute };</code>
<text>Die Angabe eines Namens ist optional. Für die Objekttypen stehen momentan map, overlay und point (für den Algorithmus poly) zur Verfügung. Wenn ein Objekt benannt wird, kann es später also Vorlage für eine weitere Instanz definieren, die man mit</text>
<code>Name { Attribute };</code>
<text>definiert. Hier würde das vorher definierte Objekt 'Name' kopiert und gegebenenfalls um die entsprechenden Attribute ergänzt werden. Werden keine weiteren Attribute angegeben, können die Klammern hier auch weggelassen werden.</text>
<text>Attribute haben grundsätzlich die Form</text>
<code>Attribut=Wert;</code>
<text>und können in beliebiger Reihenfolge im Objekt definiert werden. Sie können dabei optional % oder px als Einheit haben, und als Konstante oder Wertbereich (Zahl1 - Zahl2) angegeben werden (Ab CE). Bei Doppelten Zuweisungen gilt das zuletzt definierte.</text>
<text>Zusätzlich zu den Attributen können wieder untergeordnete Objekte definiert und mit Operatoren verknüpft werden:</text>
<code>Objekt1 Operator Objekt2;</code>
<text>Operatorketten können beliebig lang sein und steuern die Kombination von Ebenen. Mögliche Operatoren sind | (oder), &amp; (und) und ^ (exklusiv oder).</text>
<text>Einige Beispiele gibt es in den Dynamischen Welten.</text>
<h id="Attributes">Attribute</h>
<part>
<h id="Attr_overlay">Ebenen (overlay)</h>
<text>Folgende Attribute sind definiert:</text>
<text><table>
<rowh>
<col>Attribut</col>
<col>Typ</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>mat</col>
<col>Material</col>
<col>Material. Das Material muss in der entsprechenden Material.c4g definiert sein. Standard ist Himmel.</col>
</row>
<row>
<col>tex</col>
<col>Textur</col>
<col>Textur. Die Material-Textur-Kombination sollte in der geladenen TexMap vorhanden sein.</col>
</row>
<row>
<col>x, y, wdt, hgt</col>
<col>Integer</col>
<col>Größe der beschriebenen Ebene auf der übergeordneten Ebene in Prozent.</col>
</row>
<row>
<col>algo</col>
<col>Algorithmus</col>
<col>Füllungstyp der Ebene. Für verfügbare Füllungen siehe <a href="#Algos">Füllalgorithmen</a></col>
</row>
<row>
<col>zoomX, zoomY</col>
<col>Integer</col>
<col>Gibt die entsprechende Zoomstufe an, um die die Füllung vergrößert/verkleinert werden soll. -100 bis +99</col>
</row>
<row>
<col>ox, oy</col>
<col>Integer</col>
<col>Offset auf den Füllalgorithmus in Prozent. Hiermit kann z.B. eine Sinuskurve verschoben werden.</col>
</row>
<row>
<col>a, b</col>
<col>Integer</col>
<col>Zusatzparameter für den Füllalgorithmus</col>
</row>
<row>
<col>turbulence</col>
<col>Integer</col>
<col>10 bis 10.000; Deformierung der Ebene</col>
</row>
<row>
<col>rotate</col>
<col>Integer</col>
<col>-180 bis +180. Drehung der Ebene.</col>
</row>
<row>
<col>invert</col>
<col>Boolean</col>
<col>0 oder 1. Bei 1 wird die Ebenenfüllung umgekehrt.</col>
</row>
<row>
<col>seed</col>
<col>Integer</col>
<col>Zufallsseed für die Ebenenberechnung. Bei festem Seed wird die Ebene immer gleich erzeugt.</col>
</row>
<row>
<col>loosebounds</col>
<col>Boolean</col>
<col>Legt fest, ob die Grenzen durch rotate, turbulence, ox und oy mit transformiert werden.</col>
</row>
<row>
<col>mask</col>
<col>Boolean</col>
<col>0 oder 1. Bei 1 wird die Ebene nie gezeichnet. Auf untergeordnete Ebenen hat dies keinen Effekt.</col>
</row>
<row>
<col>grp</col>
<col>b</col>
<col>0 oder 1. Bei 1 gilt die Ebene als gesetzt, wenn der lokale Algorithmus oder eine der untergeordneten Ebenen erfüllt ist. Folgt ein Operator, so wird die Ebene selber nicht gezeichnet.</col>
</row>
<row>
<col>sub</col>
<col>Boolean</col>
<col>0 oder 1. Bei 1 ist das Material unterirdisch (standard)</col>
</row>
<row>
<col>lambda</col>
<col>Integer</col>
<col>0 bis 20. Zusätzliche turbulence-Iterationen.</col>
</row>
</table></text>
<h id="Attr_map">Karten (map)</h>
<text>Karten enthalten grundsätzlich alle Attribute, die Ebenen auch enthalten. Allerdings machen hier nur mat, tex und sub wirklich Sinn, und geben die Hintergrundfüllung an.</text>
</part>
<h id="Algos">Füllalgorithmen</h>
<text>Um festzustellen, ob ein Punkt auf der Karte eine Ebene trifft, wird er zunächst verschoben (zoom, turbulence, rotate, ox/oy), und anschließend ihr Algorithmus ausgewertet. Außerdem wird geprüft, ob er innerhalb der Maskengrenzen (x, y, wdt, hgt) liegt. Normalerweise vor, bei loosebounds nach der Transformation.</text>
<dl>
<dt id="Algo_solid">solid</dt>
<dd><text>Standardalgorithmus. Gibt immer wahr zurück.</text></dd>
<dt id="Algo_random">random</dt>
<dd><text>Zufall. Der Parameter a gibt die Wahrscheinlichkeit an; je höher a, desto seltener ist der Punkt ausgefüllt.</text></dd>
<dt id="Algo_checker">checker</dt>
<dd><text>Abwechselnd ausgefüllte Kästen der Größe 10 (bei normalem Zoom)</text></dd>
<dt id="Algo_bozo">bozo</dt>
<dd><text>Flecken. Über a kann die Fleckengröße verringert werden.</text></dd>
<dt id="Algo_sin">sin</dt>
<dd><text>Horizontale Sinuskurve; Bei Standardzoom beträgt die Amplitude 10, die Periode 20 Pixel.</text></dd>
<dt id="Algo_boxes">boxes</dt>
<dd><text>Regelmäßige Blöcke. a gibt die Blockgröße, b den Abstand der Mittelpunkte an.</text></dd>
<dt id="Algo_rndchecker">rndchecker</dt>
<dd><text>Wie checker, jedoch ist die Erfüllung nicht alternierend sondern zufällig.</text></dd>
<dt id="Algo_lines">lines</dt>
<dd><text>Senkrechte Linien. a gibt die Linienstärke an; b den Abstand der Linienmitten.</text></dd>
<dt id="Algo_border">border</dt>
<dd><text>Zieht einen inneren Rahmen im übergeordnete Layer (bzw der gesamten Operatorkette). a und b sind die horizontale und vertikale Rahmendicke. Da zur Berechnung das übergeordnete Layer abgefragt werden muss, darf dieses natürlich nicht als Gruppe (grp) definiert sein.</text></dd>
<dt id="Algo_mandel">mandel</dt>
<dd><text>Zeichnet die Mandelbrotmenge in den Zielbereich. Über den Parameter a kann die Iterationstiefe verändert werden (Standard 1000). Ungezommt wird das gesamte "Apfelmännchen" in den Zielbereich gezeichnet (entspricht dem Bereich -2-2i bis 2+2i)</text></dd>
<dt id="Algo_rndall">rndall</dt>
<dd><text>Der gesamten Bereich gilt als erfüllt oder nicht erfüllt, je nach Zufallswert. Der Parameter a gibt die Erfüllungschance in Prozent an. Mit diesem algo können beispielsweise mehrere Karten untergeordnet von einem mask=1-Layer angegeben werden, zwischen denen dann gewählt wird.</text></dd>
<dt id="Algo_script">script</dt>
<dd><text>Das Verhalten des Algorithmus wird durch eine Script-Funktion im <emlink href="scenario/script.html">Szenarioscript</emlink> festgelegt. Diese sollte folgende Form haben:</text>
<code>func ScriptAlgo[Overlay-Name](iX, iY, iAlpha, iBeta)</code>
<text>Als Rückgabewert wird 0 (= kein Material) oder 1 (= Material) erwartet. iX und iY sind die Koordinaten (in Pixeln), für den der Algorithmuswert zurückgegeben werden soll. iAlpha und iBeta entsprechen den Algo-Parametern a und b.</text>
<text>Hat die Ebene keinen Namen, wird die Funktion "ScriptAlgo" benutzt.</text></dd>
<dt id="Algo_poly">poly</dt>
<dd><text>Ein Pixel gilt als erfüllt, wenn er innerhalb des durch die im overlay enthaltenen Punkte definierten Polygons liegt. Punkte können durch</text>
<code>point { x=&lt;X-Koordinate des Eckpunkts&gt;&lt;Einheit&gt;; y=&lt;Y-Koordinate&gt;&gt;&lt;Einheit&gt;; };</code>
<text>angegeben werden. Ab CE. Beispiel:</text>
<code>overlay { algo=poly; mat=Earth;
point { x=10px; y=25%; };
point { x=20px; y=25%; };
point { x=10px; y=75%; };
point { x=20px; y=75%; };
point { x=30px; y=50%; };
};</code></dd>
</dl>
<h id="Operators">Operatoren</h>
<text>Mehrere Ebenen können mit Operatoren verbunden werden. Diese werden von oben nach unten ausgewertet, und es wird nur das unterste Glied der Operatorkette ggf gezeichnet. Bei einer Gruppe (grp) werden zusätzlich die untergeordneten Ebenen in die Auswertung mit einbezogen und nicht gezeichnet. Definierte Operatoren sind | (oder), &amp; (und) und ^ (exklusiv oder).</text>
</part>
<author>Sven2</author><date>Juli 2001</date>
</doc>

View File

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Teams.txt</title>
<h id="Scenariotxt">Teams.txt</h>
<text>Über die Teams.txt kann für Mehrspielerszenarien definiert werden, in welchen Fraktionen die Spieler zusammen oder gegeneinander spielen. Ab 4.9.6.0 CR.</text>
<text><table>
<caption id="SektionTeams">Sektion [Teams]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
<col>Standardwert</col>
</rowh>
<row>
<col>Active</col>
<col>Integer</col>
<col>0 oder 1. Wenn 0, existieren keine Teams und es wird davon ausgegangen, dass auch keine zur Laufzeit gebildet werden können. Das heißt zum Beispiel, dass den Spielern kein Verfeindungsmenü zur Verfügung steht.</col>
<col>1</col>
</row>
<row>
<col>AllowHostilityChange</col>
<col>Integer</col>
<col>0 oder 1. Wenn 1, können sich Spieler zur Laufzeit verbünden und verfeinden.</col>
<col>0 bei vorhandener und 1 bei nicht vorhandener Teams.txt und aktivierter Meleespielregel.</col>
</row>
<row>
<col>AllowTeamSwitch</col>
<col>Integer</col>
<col>0 oder 1. Wenn 1, können Spieler zur Laufzeit ein anderes Team wählen.</col>
<col>0</col>
</row>
<row>
<col>AutoGenerateTeams</col>
<col>Integer</col>
<col>0 oder 1. Wenn 1, können sich Spieler zur Laufzeit verbünden und verfeinden.</col>
<col>0 bei vorhandenen Teams. 1 wenn keine [Team]-Sektionen existieren.</col>
</row>
<row>
<col>TeamDistribution</col>
<col>Identifikator</col>
<col>Verteilung der Spieler auf die Teams. Mögliche Werte sind Free (Freie Auswahl), Host (Der Host wählt in der Lobby), Random (Zufällige Verteilung) oder RandomInv (Zufällige, für die Spieler in der Lobby unsichtbare Verteilung).</col>
<col>Free</col>
</row>
<row>
<col>TeamColors</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 haben alle Spieler eines Teams die gleiche Farbe.</col>
<col>0</col>
</row>
<row>
<col>MaxScriptPlayers</col>
<col>Integer</col>
<col>Maximale Zahl der Scriptspieler, die der Host in Netzwerkspielen in der Lobby aktivieren kann. Dabei zählen schon beigetretene Scriptspieler mit.</col>
<col>0</col>
</row>
<row>
<col>ScriptPlayerNames</col>
<col>String</col>
<col>Durch "|" getrennte Liste von Namen, die an in der Lobby beitretende Scriptspieler vergeben werden. Sind keine Namen angegeben, heißen alle Scriptspieler "Computer".</col>
<col>Computer</col>
</row>
</table></text>
<text><table>
<caption id="SektionTeam">Beliebig viele Sektionen [Team]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
<col>Standardwert</col>
</rowh>
<row>
<col>id</col>
<col>Integer</col>
<col>Identifikator: Eine eindeutige Zahl größer als 0, die im Szenarienscript zur Identifikation des Teams benutzt werden kann. Normalerweise kann man die Team-IDs einfach mit sequentiell von 1 aufsteigend durchnummerieren.</col>
<col>Muss angegeben werden!</col>
</row>
<row>
<col>Name</col>
<col>Zeichenfole (max 30)</col>
<col>Name für das Team. Es können wie in Scripten auch lokalisierte Zeichenketten wie $TeamRight$ benutzt werden. Siehe <emlink href="lang.html#Teamstxt">Sprachanpassung</emlink>.</col>
<col></col>
</row>
<row>
<col>PlrStartIndex</col>
<col>Integer</col>
<col>Wenn ungleich 0, wird für alle Mitglieder dieses Teams die entsprechende [PlayerX]-Sektion der <emlink href="scenario/scenario.html#SektionenPlayer1Player2Player3Player4">Scenario.txt</emlink> für die Startparameter verwendet. 0 für automatische Vergabe unabhängig von den Teams.</col>
<col>0</col>
</row>
<row>
<col>Color</col>
<col>Integer</col>
<col>32 Bit RGB-Wert, der die Teamfarbe angibt. Die Teamfarbe wird statt der Spielerfarbe benutzt, wenn TeamColors angegeben ist.</col>
<col>0</col>
</row>
<row>
<col>IconSpec</col>
<col>String</col>
<col>Spezifikation für das Teamicon für Beitritt im nicht-Netzwerk oder zur Laufzeit.</col>
<col></col>
</row>
<row>
<col>MaxPlayer</col>
<col>Integer</col>
<col>Maximale Anzahl der Spieler, die diesem Team beitreten dürfen. 0 für endlos.</col>
<col>0</col>
</row>
</table></text>
<author>Sven2</author><date>Juni 2006</date>
</doc>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Basisfunktionalitäten</title>
<h id="BaseFunc">Basisfunktionalitäten</h>
<text>Die BaseFunctionality-Option (DWord-Bitmaske) eines Szenarios bestimmt, welche Funktionen eine Basis (Gebäude mit Spielerflagge) in einem Szenario erfüllen kann.</text>
<text>
<table><rowh>
<col>Bit</col><col>Wert</col><col>BaseFunctionality</col><col>Beschreibung</col>
</rowh><row>
<col>0</col><col>1</col><col>BASEFUNC_AutoSellContents</col><col>Loren werden ausgeleert und Gold wird aus der Basis und direkt enthaltenen Objekten verkauft.</col>
</row><row>
<col>1</col><col>2</col><col>BASEFUNC_RegenerateEnergy</col><col>Verbündete Clonks regenerieren in der Basis Energie.</col>
</row><row>
<col>2</col><col>4</col><col>BASEFUNC_Buy</col><col>Objekte können in der Basis gekauft werden.</col>
</row><row>
<col>3</col><col>8</col><col>BASEFUNC_Sell</col><col>Objekte können in der Basis verkauft werden.</col>
</row><row>
<col>4</col><col>16</col><col>BASEFUNC_RejectEntrance</col><col>Gegnerischen Clonks wird das Öffnen des Eingangs verwehrt.</col>
</row><row>
<col>5</col><col>32</col><col>BASEFUNC_Extinguish</col><col>Clonks werden in der Basis gelöscht.</col>
</row><row>
<col>1-16</col><col>65536</col><col>BASEFUNC_Default</col><col>Alle Bits gesetzt: Standardverhalten für Basis.</col>
</row>
</table>
</text>
<author>Sven2</author><date>März 2006</date>
</doc>

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Szenarien</title>
<h id="Szenarien">Szenarien</h>
<part>
<text>Szenarien sind die Spielwelten, die der Spieler im Menüsystem auswählen und starten kann. Über die einzelnen Komponenten kann der Szenarien-Designer von der Landschaft über Spielmodus und -regeln über benutzte Objekte, Materialien, die Landschaft, usw. bis hin zum Aussehen im Menüsystem alles frei einstellen.</text>
<h id="SzenarioKomponentenC4S">Szenario-Komponenten (C4S)</h>
<dl>
<dt id="Szenariotxt"><img src="../../images/icon_text.gif" width="16" height="16"/><emlink href="scenario/scenario.html">Scenario.txt</emlink></dt>
<dd><text>Enthält die meisten Szenarioeinstellungen.</text></dd>
<dt id="Teamstxt"><img src="../../images/icon_text.gif" width="16" height="16"/><emlink href="scenario/Teams.html">Teams.txt</emlink></dt>
<dd><text>Enthält Teameinstellungen für Mehrspielerszenarien. Ab 4.9.6.0 CR.</text></dd>
<dt id="Title"><img src="../../images/icon_image.gif" width="16" height="16"/>Title.png/Title.bmp</dt>
<dd><text>Das Titelbild des Szenarios im Format PNG. Größe: 200x150 Pixel. Das veraltete Grafikformat Windows BMP mit 256 Farben wird auch weiterhin unterstützt.</text></dd>
<dt id="Iconbmp"><img src="../../images/icon_image.gif" width="16" height="16"/>Icon.bmp</dt>
<dd><text>Das Icon des Szenarios als unkomprimiertes Windows Bitmap mit 256 Farben. Größe 16x16 Pixel. Die Farbe RGB 255/0/255 (Lila) wird transparent angezeigt.</text></dd>
<dt id="Loader"><img src="../../images/icon_image.gif" width="16" height="16"/>Loader*.png/Loader*.bmp</dt>
<dd><text>Eine Grafik, die beim Start der Runde angezeigt wird. Sind mehrere Dateien vorhanden (Loader1.png, Loader2.png, Loader3.png...), wird per Zufall eine ausgewählt, wobei über eine optional im Scenario.txt vorhandene Loader-Spezifikation die Auswahl noch weiter vorgegeben werden kann. Beim veralteten BMP-Format mit 256 Farben müssen die Farben Schwarz bei Palettenindex 16 und Weiß bei Index 31 vorhanden sein, damit Meldungen beim Startvorgang korrekt angezeigt werden können. Auch Loader-Grafiken aus einem übergeordneten Ordner werden geladen.</text></dd>
<dt id="Sky"><img src="../../images/icon_image.gif" width="16" height="16"/>Sky.png/Sky.bmp</dt>
<dd><text>Das Himmels-Hintergrundbild. Himmelsgrafiken sollten exakt kachelfähig sein oder die exakte Größe der Landschaft während der Runde haben (bei dynamischen Karten nicht vorhersehbar, bei statischen Karten die Größe des Landkartenbitmaps multipliziert mit dem Vergrößerungsfaktor). Beim veralteten BMP-Format mit 256 Farben dürfen in diesem Bitmap nur die ersten zwanzig Farben benutzt werden. </text></dd>
<dt id="Desc__rtf"><img src="../../images/icon_text.gif" width="16" height="16"/>Desc*.rtf</dt>
<dd><text>Der Beschreibungstext im RTF-Format. __ muss durch den zweistelligen Sprachcode ersetzt werden. DE steht beispielsweise für Deutsch, US für American English. Es können für mehrere Sprachen verschiedene Beschreibungen enthalten sein, von denen je nach eingestellter Sprache des Menüsystems automatisch die passendste ausgewählt wird.</text>
<text>Der Font des Textes wird im Spiel automatisch auf den eingestellten Menüsystem-Font angepasst. Die Größe der Überschrift sollte 10pt und die des Textes 8pt betragen. Bilder im Text werden ignoriert.</text>
<text>Diese Datei erstellt man am besten mit dem zu Windows gehörenden WordPad und nicht mit Winword, denn dieses packt in jedes Dokument kilobyteweise unnütze Daten.</text></dd>
<dt id="Titletxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Title.txt</dt>
<dd><text>Normalerweise wird der Titel eines Szenarios beim Umbenennen mit dem Menüsystem dem Dateinamen entnommen und in der [Head]-Sektion des Szenario.txt gespeichert. Der Dateiname kann unabhängig verändert werden. Für mehrsprachige Szenarien muss eine Datei Title mit entsprechendem Inhalt erzeugt werden:</text>
<code>DE:Angriff der Killerwipfe
US:Attack of the Killer Wipfs</code>
<text>Wichtig: es sollten keine Anführungszeichen oder Sonderzeichen verwendet werden.</text></dd>
<dt id="Scriptc"><img src="../../images/icon_text.gif" width="16" height="16"/><emlink href="scenario/script.html">Script.c</emlink></dt>
<dd><text>Das Szenarioscript.</text></dd>
<dt id="Landscapebmp"><img src="../../images/icon_image.gif" width="16" height="16"/>Landscape.bmp</dt>
<dd><text>Statische Landkarten werden um den in Scenario.txt enthaltenen Faktor MapZoom auf die tatsächliche Spiellandschaft vergrößert. Die in Landscape.bmp enthaltenen Farbindizes entsprechen den in <emlink href="material/index.html#TexMaptxt">TexMap.txt</emlink> zugeordneten Materialien und Texturen.</text>
<text>Exakte Landkarten (ExactLandscape) geben die tatsächliche Spiellandschaft wieder. Die Farbindizes in Landscape.bmp (128-191 und 192-255, jeweils 3 Farben pro Material) repräsentieren direkt die für das Szenario festgelegten Materialien. Die aktuelle Materialanordnung wird in MatMap.txt festgehalten.</text></dd>
<dt id="Landscapepng"><img src="../../images/icon_image.gif" width="16" height="16"/>Landscape.png</dt>
<dd><text>Die Karte in Originalgröße für exakte Landschaften. Hier wird für Spielstände das aktuelle Erscheinungsbild der Landkarte mit Halbtransparenz und texturierten Materialien abgelegt. Exakte Landschaften beanspruchen sehr viel Speicherplatz und sollten daher in regulären Szenarien nicht verwendet werden.</text></dd>
<dt id="Landscapetxt"><img src="../../images/icon_text.gif" width="16" height="16"/><emlink href="scenario/MapCreatorS2.html">Landscape.txt</emlink></dt>
<dd><text>Besonders fortgeschrittene Spieler können über diese Datei komplexe Zufallslandschaften definieren. Dafür sind allerdings mathematisches und logisches Verständnis sowie viel Geduld unumgänglich.</text></dd>
<dt id="MatMaptxt"><img src="../../images/icon_text.gif" width="16" height="16"/>MatMap.txt</dt>
<dd><text>Enthält die Anordnung der in diesem Szenario verwendeten Materialien. Die hier aufgeführten Materialien werden von der exakten Landkarte verwendet und müssen beim Start der Runde in der zu ladenden Datei Material.c4g vorhanden sein.</text></dd>
<dt id="Objectstxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Objects.txt</dt>
<dd><text>Diese Komponente wird von der Engine erzeugt und enthält die Laufzeitobjektdaten eines abgespeicherten Szenarios.</text></dd>
<dt id="Materialc4g"><img src="../../images/icon_system.gif" width="16" height="16"/><emlink href="material/index.html">Material.c4g</emlink></dt>
<dd><text>Szenarien können lokale Materialdefinitionen enthalten. Es gelten die <a href="#UeberladungenC4S">Überladungsregeln</a>.</text></dd>
<dt id="Graphicsc4g"><img src="../../images/icon_system.gif" width="16" height="16"/>Graphics.c4g</dt>
<dd><text>Szenarien können einzelne Grafiken aus der systemglobalen Graphics.c4g überladen. Es gelten die <a href="#UeberladungenC4S">Überladungsregeln</a>.</text></dd>
<dt id="wav"><img src="../../images/icon_sound.gif" width="16" height="16"/>*.wav</dt>
<dd><text>Szenarien können beliebig lokale Sounds enthalten. Diese können per Script während des Spiels abgespielt werden. Szenariolokale Sounds werden dynamisch und erst bei Bedarf geladen, was bei großen Szenariodateien zu Verzögerungen führen kann.</text></dd>
<dt id="mid"><img src="../../images/icon_music.gif" width="16" height="16"/>*.mid/*.ogg</dt>
<dd><text>Wenn das Szenario lokale Musikdateien enthält, werden diese während der Runde in zufälliger Reihenfolge abgespielt. Siehe auch Script-Funktion <emlink href="script/fn/Music.html">Music</emlink>().</text></dd>
<dt id="Musicc4g"><img src="../../images/icon_system.gif" width="16" height="16"/>Music.c4g</dt>
<dd><text>Lokale Musikstücke können auch in dieser lokalen Gruppendatei abgelegt werden.</text></dd>
<dt id="c4d"><img src="../../images/icon_object_definition.gif" width="16" height="16"/><emlink href="definition/index.html">*.c4d</emlink></dt>
<dd><text>Szenarien können lokale Objektdefinitionen enthalten, die dann nur im entsprechenden Szenario verfügbar sind.</text>
<text>Die Engine durchsucht auch alle übergeordneten Rundenordner (c4f) des Szenarios nach Objektdefinitionen. Dadurch kann ein Rundenordner Objektdefinitionen enthalten, die dann in allen untergeordneten Szenarien verfügbar sind.</text></dd>
<dt id="Namestxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Names.txt</dt>
<dd><text>Diese Namen werden für während der Runde neu erzeugte Clonks verwendet.</text></dd>
<dt id="Infotxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Info.txt</dt>
<dd><text>Hier kann der Autor zusätzliche Informationen über den Entwicklungsstand seines Szenarios, seine Kontaktadresse oder sonstige Informationen angeben, die er anderen Entwicklern mitteilen möchte.</text></dd>
<dt id="Authortxt"><img src="../../images/icon_text.gif" width="16" height="16"/>Author.txt</dt>
<dd><text>Sollte den Namen des Autors im Format "Vorname Nachname (Nick)" enthalten und ist dafür gedacht, dass der Name des ursprünglichen Autors erhalten bleibt, selbst wenn die Gruppendatei von einem anderen Entwickler verändert wird (Auswertung der Komponente zur Zeit nur bei Dateien, die durch RedWolf Design bearbeitet werden). Dies ist insbesondere für Wettbewerbsszenarien gedacht.</text></dd>
</dl>
<h id="UeberladungenC4S">Überladungsregeln</h>
<text>Diverse Systemkomponenten (Graphics, Loader, Material, Musik und Objekte) können in Szenarien überladen werden. Dabei werden auch übergeordnete Rundenordner (C4F) durchsucht. Hierbei steigt die Überladungspriorität mit der Ordnertiefe. Bei einem Szenario, das sich in die Ordnerstruktur Ordner.c4f\Unterordner.c4f\Szenario.c4s einordnet, würden Komponenten aus Unterordner.c4f also gleiche Komponenten aus Ordner.c4f überladen (respektive Szenario.c4f Komponenten aus Unterordner.c4f und Ordner.c4f).</text>
</part>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>Juni 2004</date>
</doc>

View File

@ -0,0 +1,491 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Scenario.txt</title>
<h id="Scenariotxt">Scenario.txt</h>
<text>Über die Scenario.txt lassen sich alle Szenarienvoreinstellungen anpassen.
Dazu gehören einfache, dynamische Karten, Spielervorgaben, Spielziele, Wetter, usw.
Die meisten dieser Einstellungen lassen sich allerdings bequemer über den Editor in den Rundenoptionen konfigurieren.
Für komplexere Startbedingungen wie zum Beispiel Teamschlachten mit automatischen Rejoins,
sowie für vorgegebene Handlungsabläufe im Spiel benötigt man ein <emlink href="scenario/script.html">Script</emlink>.</text>
<text>Einige der Werte werden mit vier Zahlen angegeben, die Mittelwert, Abweichung, Minimum und Maximum festlegen.
Der tatsächliche Wert wird dann durch
<code>BoundBy(Mittelwert+Random(2*Abweichung+1)-Abweichung,Minimum,Maximum);</code>
bestimmt.</text>
<text><table>
<caption id="SektionHead">Sektion [Head]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Icon</col>
<col>Integer</col>
<col>Standard-Icon des Szenarios. Siehe Szenarioeigenschaften im Menüsystem.</col>
</row>
<row>
<col>Title</col>
<col>Zeichenfolge (max 512)</col>
<col>Titel des Szenarios. Wird durch die Einträge in Title.txt ersetzt.</col>
</row>
<row>
<col>Version</col>
<col>4 Integer</col>
<col>Vom Szenario benötigte Version der Engine.</col>
</row>
<row>
<col>RoundOptions</col>
<col>Integer</col>
<col>0 oder 1. Freigabe der Szenarioeigenschaften im Menüsystem für andere Spieler.</col>
</row>
<row>
<col>MaxPlayer</col>
<col>Integer</col>
<col>Maximale Anzahl der Spieler.</col>
</row>
<row>
<col>NoInitialize</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 werden alle Objekte, die genau einmal erzeugt werden sollten, nicht platziert. Automatisch für Spielstände und gespeicherte Szenarien gesetzt, um eine erneute Erzeugung von Vegetation, Spielzielen und ähnlichem zu vermeiden. Es werden unter anderem die Werte Buildings, Vehicles, Material, Vegetation, InEarth und Animals ignoriert.</col>
</row>
<row>
<col>MissionAccess</col>
<col>Zeichenfolge</col>
<col>Szenario kann nur gestartet werden, wenn ein Spieler zuvor dieses Zugangspasswort in einem anderen Szenario erspielt hat. Siehe Scriptfunktion <funclink>GainMissionAccess</funclink>().</col>
</row>
<row>
<col>Replay</col>
<col>Integer</col>
<col>Wird von der Engine automatisch gesetzt, und markiert eine Aufnahme.</col>
</row>
<row>
<col>Film</col>
<col>Integer</col>
<col>0 oder 1 und nur bei Aufnahmen. Bei 1 folgt die Sicht nur dem ersten Spieler und alle Spielerkontrollen werden ausgeblendet.</col>
</row>
<row>
<col>ForcedGfxMode</col>
<col>Integer</col>
<col>0-2. 0: Jede Engine möglich; 1: Nur NewGfx (OpenGL/D3D); 2: Nur OldGfx (8Bit-DDraw).</col>
</row>
</table></text>
<text><table>
<caption id="SektionGame">Sektion [Game]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Rules</col>
<col>ID-Liste</col>
<col>Spielregeln.</col>
</row>
<row>
<col>Goals</col>
<col>ID-Liste</col>
<col>Spielziele.</col>
</row>
<row>
<col>ValueOverloads</col>
<col>ID-Liste</col>
<col>Liste der Definitionen, dessen Wert für diese Runde geändert sein soll. Die Menge gibt den neuen Wert an.</col>
</row>
<row>
<col>FoWColor</col>
<col>DWORD</col>
<col>Farbe des Fog of War.</col>
</row>
<row>
<col>Mode</col>
<col>Integer</col>
<col> Veraltet. 0 Kooperativ, 1 Melee, 2 Teamwork-Melee.</col>
</row>
<row>
<col>Elimination</col>
<col>Integer</col>
<col>Veraltet. Spielereliminierung durch 0 Verlust Captain, 1 Verlust Crew, 2 Verlust Flagge.</col>
</row>
<row>
<col>CooperativeGoal</col>
<col>Integer</col>
<col>Veraltet. Wert der Auswahl Spielziel im Menüsystem (0-4).</col>
</row>
<row>
<col>CreateObjects</col>
<col>ID-Liste</col>
<col>Veraltet. Spielziel: Diese Objekte müssen mindestens vorhanden sein.</col>
</row>
<row>
<col>ClearObjects</col>
<col>ID-Liste</col>
<col>Veraltet. Spielziel: Diese Objekte müssen auf x reduziert werden.</col>
</row>
<row>
<col>ClearMaterials</col>
<col>Material-Liste</col>
<col>Veraltet. Spielziel: Diese Materialien müssen auf x reduziert werden.</col>
</row>
<row>
<col>BaseFunctionality</col>
<col>Integer</col>
<col>Bitmaske, die angibt, welche Funktionen eine Basis erfüllt. Siehe <emlink href="scenario/basefunc.html">Basisfunktionalitäten</emlink>. Ab CR.</col>
</row>
<row>
<col>BaseRegenerateEnergyPrice</col>
<col>Integer</col>
<col>Kosten, die aufgewendet werden, um einen Clonk in einer Basis um 100 Energiepunkte zu heilen. Standard ist 5; bei 0 ist die Heilung kostenlos. Ab CR.</col>
</row>
</table></text>
<text><table>
<caption id="SektionenPlayer1Player2Player3Player4">Sektionen [Player1] [Player2] [Player3] [Player4]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Wealth</col>
<col>4 Integer</col>
<col>Startkapital.</col>
</row>
<row>
<col>Position</col>
<col>2 Integer</col>
<col>Startposition in Koordinaten der ungezoomten Landkarte. Beide -1 für Zufall.</col>
</row>
<row>
<col>Crew</col>
<col>ID-Liste</col>
<col>Art und Anzahl der Mannschaftsmitglieder.</col>
</row>
<row>
<col>Buildings</col>
<col>ID-Liste</col>
<col>Zu Spielbeginn vorhandene Gebäude.</col>
</row>
<row>
<col>Vehicles</col>
<col>ID-Liste</col>
<col>Zu Spielbeginn vorhandene Fahrzeuge.</col>
</row>
<row>
<col>Material</col>
<col>ID-Liste</col>
<col>Zu Spielbeginn vorhandenes Material.</col>
</row>
<row>
<col>Knowledge</col>
<col>ID-Liste</col>
<col>Vom Spieler erzeugbare Objekte.</col>
</row>
<row>
<col>HomeBaseMaterial</col>
<col>ID-Liste</col>
<col>Zu Spielbeginn in der Heimatbasis kaufbares Material.</col>
</row>
<row>
<col>HomeBaseProduction</col>
<col>ID-Liste</col>
<col>Nachproduktion von Material für die Heimatbasis.</col>
</row>
<row>
<col>Magic</col>
<col>ID-Liste</col>
<col>Zur Verfügung stehende Zauber. Sind keine Zauber angegeben, werden alle verfügbaren Zauber geladen (Abwärtskompatibilität zu älteren Szenarien).</col>
</row>
</table></text>
<text><table>
<caption id="SektionLandscape">Sektion [Landscape]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Vegetation</col>
<col>ID-Liste</col>
<col>Vegetationstypen und relative Anteile.</col>
</row>
<row>
<col>VegetationLevel</col>
<col>4 Integer</col>
<col>0-100. Menge Vegetation.</col>
</row>
<row>
<col>InEarth</col>
<col>ID-Liste</col>
<col>Typen und relative Anteile der Objekte im Erdreich.</col>
</row>
<row>
<col>InEarthLevel</col>
<col>4 Integer</col>
<col>0-100. Menge Erdreich-Objekte.</col>
</row>
<row>
<col>Sky</col>
<col>Zeichenfolge</col>
<col>Himmeltextur wie in der Graphics.c4g vorhanden (ohne Dateierweiterung).</col>
</row>
<row>
<col>SkyFade</col>
<col>6 Integer</col>
<col>Himmelfarbverlauf von RGB nach RGB. Werte von 0-255. Sind alle Werte 0, wird das Vorgabe-Blau der Clonk-Farbpalette verwendet.</col>
</row>
<row>
<col>BottomOpen</col>
<col>Integer</col>
<col>0 oder 1. Legt fest, ob die Spielwelt unten offen ist.</col>
</row>
<row>
<col>TopOpen</col>
<col>Integer</col>
<col>0 oder 1. Legt fest, ob die Spielwelt oben offen ist.</col>
</row>
<row>
<col>LeftOpen</col>
<col>Integer</col>
<col>Öffnung des linken Randes bis zum Abstand in Pixel von der Oberkante.</col>
</row>
<row>
<col>RightOpen</col>
<col>Integer</col>
<col>Öffnung des rechten Randes bis zum Abstand in Pixel von der Oberkante.</col>
</row>
<row>
<col>AutoScanSideOpen</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 werden LeftOpen und RightOpen automatisch angepasst.</col>
</row>
<row>
<col>MapWidth</col>
<col>4 Integer</col>
<col>Ausgangsbreite der dynamischen Karte.</col>
</row>
<row>
<col>MapHeight</col>
<col>4 Integer</col>
<col>Ausgangshöhe der dynamischen Karte.</col>
</row>
<row>
<col>MapZoom</col>
<col>4 Integer</col>
<col>Vergrößerungsfaktor der Karte auf die tatsächliche Spiellandschaft. Wert 10.</col>
</row>
<row>
<col>Amplitude</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Hügelhöhe bei dynamischen Karten.</col>
</row>
<row>
<col>Phase</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Hügelverschiebung bei dynamischen Karten.</col>
</row>
<row>
<col>Period</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Hügelabstand bei dynamischen Karten.</col>
</row>
<row>
<col>Random</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Zufallsabweichung bei dynamischen Karten.</col>
</row>
<row>
<col>Material</col>
<col>Zeichenfolge</col>
<col>Material-Textur-Definition des Basismaterials (Erdreich) bei dynamischen Karten.</col>
</row>
<row>
<col>Liquid</col>
<col>Zeichenfolge</col>
<col>Material-Textur-Definition der Flüssigkeit in dynamischen Karten.</col>
</row>
<row>
<col>LiquidLevel</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Flüssigkeitsstand in dynamischen Karten.</col>
</row>
<row>
<col>MapPlayerExtend</col>
<col>Integer</col>
<col>0 oder 1. Legt fest, ob die dynamische Karte in der Breite angepasst wird.</col>
</row>
<row>
<col>Layers</col>
<col>Material-Liste</col>
<col>Materialschichten im Erdreich bei dynamischen Karten.</col>
</row>
<row>
<col>ExactLandscape</col>
<col>1 Integer</col>
<col>0 oder 1. Gibt an, ob Landscape.bmp eine tatsächliche Spiellandschaft ist.</col>
</row>
<row>
<col>Gravity</col>
<col>4 Integer</col>
<col>10-200: Gravitation. 100 ist Standard.</col>
</row>
<row>
<col>NoScan</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 werden keine Überprüfungen innerhalb der Landschaft durchgeführt, wie beispielsweise Schneeschmelze oder Festwerden von Lava in Vulkanen.</col>
</row>
<row>
<col>KeepMapCreator</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 wird der interne MapCreator nicht nach dem Start entladen, so dass Befehle wie <funclink>DrawDefMap</funclink> zur Verfügung stehen.</col>
</row>
<row>
<col>SkyScrollMode</col>
<col>Integer</col>
<col>0 bis 2. Bei 1 bewegt sich der Himmel mit dem Wind, bei 2 ist er halbparallax.</col>
</row>
<row>
<col>FoWRes</col>
<col>Integer</col>
<col>Größe der Blöcke, in denen der Kriegsnebel (Fog of War) berechnet wird. Standardwert 64. Achtung: Kleinere Werte verbessern zwar die Darstellung des Kriegsnebels, erhöhen aber auch die benötigte Rechenleistung bei hohen Bildschirmauflösungen. Ab CR.</col>
</row>
</table></text>
<text><table>
<caption id="SektionAnimals">Sektion [Animals]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Animals</col>
<col>ID-Liste</col>
<col>Freilaufende Lebewesen.</col>
</row>
<row>
<col>Nest</col>
<col>ID-Liste</col>
<col>Nester im Erdreich.</col>
</row>
</table></text>
<text><table>
<caption id="SektionWeather">Sektion [Weather]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Climate</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Durchschnittstemperatur. 0 warm, 100 kalt.</col>
</row>
<row>
<col>StartSeason</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Startjahreszeit.</col>
</row>
<row>
<col>YearSpeed</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Geschwindigkeit des Jahreszeitenwechsels.</col>
</row>
<row>
<col>Rain</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Regenwahrscheinlichkeit.</col>
</row>
<row>
<col>Wind</col>
<col>4 Integer</col>
<col>-100-100 und Abweichung. Windrichtung und -stärke.</col>
</row>
<row>
<col>Lightning</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Blitzwahrscheinlichkeit.</col>
</row>
<row>
<col>Precipitation</col>
<col>Zeichenfolge</col>
<col>Einfache Materialdefinition Niederschlag.</col>
</row>
<row>
<col>NoGamma</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 wirken sich die Jahreszeiten nicht auf die Bildschirmfärbung aus.</col>
</row>
</table></text>
<text><table>
<caption id="SektionDisasters">Sektion [Disasters]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Meteorite</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Meteoritenwahrscheinlichkeit.</col>
</row>
<row>
<col>Volcano</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Vulkanwahrscheinlichkeit.</col>
</row>
<row>
<col>Earthquake</col>
<col>4 Integer</col>
<col>0-100 und Abweichung. Erdbebenwahrscheinlichkeit.</col>
</row>
</table></text>
<text><table>
<caption id="SektionEnvironment">Sektion [Environment]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Objects</col>
<col>ID-Liste</col>
<col>Umweltsteuerungsobjekte, die am Anfang der Runde platziert werden.</col>
</row>
</table></text>
<text><table>
<caption id="SektionDefinitions">Sektion [Definitions]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>LocalOnly</col>
<col>Integer</col>
<col>Wenn LocalOnly den Wert 1 hat, werden alle angegebenen Objektdefinitions-pakete ignoriert und nur lokale Objektdefinitionen geladen.</col>
</row>
<row>
<col>Definition1 (bis 9)</col>
<col>Zeichenfolge(n)</col>
<col>Über Definition<em>x</em>-Einträge kann vorgegeben werden, welche Objektdefinitionspakete (c4d) das Szenario benutzen soll. Die Pakete müssen im Clonk-Verzeichnis vorhanden sein. Sind Pakete im Szenario angegeben, wird die vom Menüsystem bestimmte Auswahl ignoriert.</col>
</row>
<row>
<col>SkipDefs</col>
<col>ID-Liste</col>
<col>Liste der Definitionen, die im Spiel nicht geladen werden sollen. So lässt sich beispielsweise die Erforschung bestimmter Objekte verhindern.</col>
</row>
</table></text>
<author>Sven2</author><date>April 2002</date>
</doc>

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Szenarioscripte</title>
<h id="SzenarioScripte">Szenarioscripte</h>
<part>
<text>In Szenarioscripten kann ein globaler Handlungsablauf und szenarienspezifische Besonderheiten wie Rejoins oder spezielle Spielerplatzierungen festgelegt werden. Für eine Beschreibung der Scriptsprache C4Script siehe <emlink href="script/index.html">C4Script</emlink>-Dokumentation.</text>
<h id="Callbacks">Callbacks in Szenarioscripten</h>
<text>Beim Start der Runde (Und VOR dem Beitritt der Spieler!) ruft die Engine, wenn vorhanden, die Funktion "Initialize" im Script des Szenarios auf. Innerhalb dieser Funktion können z.B. Objekte erzeugt werden, die beim Start der Runde vorhanden sein sollen. Außerdem kann die fortlaufende Scriptausführung gestartet werden.</text>
<code>func Initialize()
{
<funclink>Message</funclink>("Hallo");
<funclink>CreateObject</funclink>(HUT1,250,200,0);
<funclink>ScriptGo</funclink>(1);
}</code>
<text>Fortlaufende Scriptausführung: zu Beginn der Runde steht der interne Sciptzähler auf 0. Wurde mit ScriptGo die Scriptausführung aktiviert, so erhöht die Engine im Lauf der Runde in jedem zehnten Frame (Bild) den Scriptzähler um 1 und ruft, wenn vorhanden, die dazugehörige Script-Funktion im Szenario-Script auf.</text>
<code>func Script26()
{
<funclink>Message</funclink>("Diese Funktion wird nach 260 Frames ausgeführt.");
}</code>
<text>Der Scriptzähler kann mit dem Befehl <funclink>goto</funclink>() auch manuell auf einen bestimmten Wert gesetzt werden.</text>
<text>Nach der Platzierung eines beitretenden Spielers ruft die Engine, wenn vorhanden, die Funktion InitializePlayer im Scenario-Script für diesen Spieler auf. Die Funktion wird aufgerufen, nachdem die in Scenario.txt beschriebenen Startkonditionen (Positionierung und Platzierung von Mannschaft, Gebäude, Fahrzeuge, Material) verarbeitet wurden. Mit dieser Funktion können weitere spielerabhängige Startkonditionen geschaffen werden.</text>
<code>func InitializePlayer(iPlr)
{
// Eine Meldung für diesen Spieler
<funclink>Message</funclink>( "Spieler Nr. %d ist beigetreten", 0, iPlr );
<funclink>Sound</funclink>("Ding");
// Ersten Clonk des Spielers doch an einer anderen Stelle starten lassen
<funclink>SetPosition</funclink>( <funclink>Random</funclink>(<funclink>LandscapeWidth</funclink>()), <funclink>Random</funclink>(<funclink>LandscapeHeight</funclink>()), <funclink>GetCrew</funclink>(iPlr));
}</code>
<text>Analog dazu ruft die Engine die Funktion RemovePlayer auf, wenn ein Spieler die Runde verlässt.</text>
<text>Wird eine Runde durch szenariobedingte Spielziele wie Spielereliminierung, Materialabbau, usw. (siehe Scenario.txt <emlink href="scenario/scenario.html#SektionGame">Sektion [Game]</emlink>) oder durch den Scriptbefehl GameOver beendet (also nicht bei abgebrochenen Runden), ruft die Engine im Szenario-Script die Funktion OnGameOver auf.</text>
<code>func OnGameOver()
{
<funclink>Sound</funclink>("Trumpet");
// Hier bietet sich die Möglichkeit für spezielle Rundenauswertung in der Log-Datei Clonk4.log
<funclink>Log</funclink>("Vermögen von Spieler 1: %d", <funclink>GetWealth</funclink>(0));
}</code>
</part>
<author>Sven2</author><date>April 2002</date>
</doc>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>#appendto</title>
<h>#appendto</h>
<part>
<text>Durch Verwendung von #appendto können zahlreiche Objektüberladungen vermieden werden.</text>
<h id="Syntax">Deklaration</h>
<code>#appendto [id]</code>
<text>Jedes Script kann sich mit <code>#appendto</code> an ein oder mehrere Objektscripte anhängen.
Dabei werden alle Funktionen ans Ende des Zielscripts angehängt und haben damit bei
Namensgleichheit eine höhere Priorität. Die überladenen Funktionen sind dabei durch <emlink
href="script/fn/inherited.html">inherited</emlink> verfügbar. Eigene #include-Scripte werden nicht
angehängt, angehängte Scripte aber mit inkludiert.</text>
<code>#appendto *</code>
<text>Durch Angabe von <code>*</code> anstelle eine id wird das Script an alle geladenen
Definitionen angehängt.</text>
<text>Ein Script kann beliebig viele #appendto enthalten. Es wird aber immer selbst mit kompiliert.
Dies ist besonders dann entscheidend, wenn benannte Locals oder Funktionsnamen aus dem Script, an
das angehängt wird, verwendet werden.</text>
</part>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>Juni 2004</date>
<author>Günther</author><date>Januar 2006</date>
</doc>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Break / Continue</title>
<h id="BreakContinue">Break / Continue</h>
<part>
<text>Die Schlüsselwörter <code>break</code> bzw. <code>continue</code> werden zur manuellen Steuerung von Schleifen benutzt:</text>
<text><ul>
<li><code>break</code> beendet die übergeordnete Schleife. Die Ausführung wird hinter Schleifenende fortgeführt.</li>
<li><code>continue</code> beendet den aktuellen Schleifendurchlauf der übergeordneten Schleife. Die Ausführung wird am Anfang der Schleife fortgeführt, wobei die Schleifenbedingung geprüft wird.</li>
</ul></text>
<h>Beispiel:</h>
<code>for(var i = 0; i &lt; 10; i++)
{
<funclink>Log</funclink>("Zahl: %d", i);
if(i > 6) break;
if(i > 2) continue;
Log("Zahl: %d (2. Ausgabe)", i);
}
Log("Endwert: %d",i);</code>
<h>Ausgabe:</h>
<code>Zahl: 0
Zahl: 0 (2.Ausgabe)
Zahl: 1
Zahl: 1 (2.Ausgabe)
Zahl: 2
Zahl: 2 (2.Ausgabe)
Zahl: 3
Zahl: 4
Zahl: 5
Zahl: 6
Zahl: 7
Endwert: 7</code>
<text>In dieser Schleife läuft die Variable <code>i</code> von 0 bis 10.</text>
<text>In den ersten 3 Schleifendurchläufen (i von 0 bis 2) wird der Wert zwei mal ausgegeben.</text>
<text>Ab dem Wert 3 wird nach der ersten Ausgabe <code>continue</code> aufgerufen. Dadurch wird der aktuelle Schleifendurchlauf abgebrochen, der Wert wird nur 1 mal ausgegeben.</text>
<text>Wird der Wert 7 erreicht, wird <code>break</code> aufgerufen. <code>break</code> bricht jetzt, im Gegensatz zu <code>continue</code>, nicht nur den aktuellen Schleifendurchlauf, sondern auch die Schleife ab. (Erkennbar daran, dass der Wert von <code>i</code> am Ende 7 ist, nicht 11).</text>
</part>
<author>Peter</author><date>Juli 2001</date>
</doc>

View File

@ -0,0 +1,565 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Effekte</title>
<h>Effekte</h>
<part>
<text>Ab CE ist es möglich, an jedes Objekt variable Mengen an Zusatzeffekten zu binden ohne dafür zusätzliche Objekte zu benötigen. Dieses System ist besonders für Zauber interessant.</text>
<h id="Intro">Einleitung</h>
<text>Effekte sind, grob gesehen, dynamische Timer, die sich an ein Zielobjekt binden lassen. Effekte an sich bieten keinerlei graphische oder akustische Funktionen - dafür sind Partikel oder Objekte zuständig - sondern sind eine reine Scripthilfe. Zudem liefern sie ein allgemeines Interface, über das sich Statusveränderungen an Objekten untereinander abstimmen lassen.</text>
<text>Dazu ein Beispiel eines Unsichtbarkeitszaubers ohne Effekte:</text>
<code>/* Unsichtbarkeitszauber ohne Effektsystem */
#strict
local iRestTime; // Zeit, die der Zauber noch aktiv ist
local pTarget; // Unsichtbar gemachter Clonk
local iOldVisibility; // Vorheriger Sichtbarkeitsstatus
local iOldModulation; // Vorherige Farbmodulation
public func Activate(pCaster, pCaster2)
{
// Zauberer ermitteln
if (pCaster2) pCaster = pCaster2; pTarget = pCaster;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Vorherige Sichtbarkeit des Zauberers speichern
iOldVisibility = GetVisibility(pCaster);
iOldModulation = GetClrModulation(pCaster);
// Zauberer unsichtbar machen
SetVisibility(VIS_Owner() | VIS_Allies() | VIS_God(), pCaster);
// Halbdurchsichtig bläulich für den Besitzer und Verbündete
SetClrModulation(ModulateColor(iOldModulation, RGBa(127,127,255,127)), pCaster);
// Timer starten: 30 Sekunden unsichtbar
iRestTime = 30;
}
protected func TimerCall()
{
// Zeit zählen
if (iRestTime--) return(1);
// Fertig; Objekt entfernen
return(RemoveObject());
}
protected func Destruction()
{
// Zauber wird entfernt: Unsichtbarkeit aufheben
SetClrModulation(iOldModulation, pTarget);
SetVisibility(iOldVisibility, pTarget);
return(1);
}</code>
<text>Das Zauberobjekt bleibt hier einfach so lange erhalten, bis die Zeit abgelaufen ist, und macht den Clonk dann wieder sichtbar. Die Sichtbarmachung im Destruction-Callback macht das Objekt auch wieder sichtbar, wenn das Objekt aus irgendwelchen Gründen (z.B. Wechsel der Szenariensektion) entfernt wurde - ansonsten bliebe der Clonk in dem Fall auf ewig unsichtbar. Außerdem wird ein Timer verwendet, bei dem davon ausgegangen wird, dass er in der DefCore definiert ist und jede Sekunde aufgerufen wird. Ein Timer mit einem Intervall in der Dauer der Unsichtbarkeit wäre übrigens nicht möglich gewesen, da die Objekt-Timer je nach Spielzeit an unterschielichen Zeiten im Intervall beginnen können. Um den Timer zu sparen, hätte man also eine Aktivität definieren müssen.</text>
<text>Dieses Script hat allerdings auch einige Probleme: Beispielsweise kann der Zauberer keinen weiteren Unsichtbarkeitszauber sprechen, während er unsichtbar ist. Der zweite Zauber wäre praktisch wirkungslos, weil der erste Zauber bei seinem Ablauf schon den Clonk sichtbar macht. Der Zauber müsste also eine Spezialbehandlung für diesen Fall einführen - aber nicht nur für diesen, sondern für alle anderen Zauber, die Sichtbarkeit oder Färbung des Clonks verändern. Zwar berechnet das Script eine vorherige Verfärbung mit ein, betrachtet aber nicht den Fall, dass ein anderer Effekt diese zwischenzeitlich ändern könnte. Dieselben Probleme ergäben sich, wenn mehrere Effekte auf Clonk-Physicals (Sprunghöhe, Laufgeschwindigkeit, Kampfstärke, usw.), Sichtradius, Energie, Zauberenergie oder sonstigen Status einwirken. Über Effekte kann dies umgangen werden.</text>
<h id="Usage">Anwendung</h>
<text>Effekte werden mit der Scriptfunktion <funclink>AddEffect</funclink> erstellt und analog mit <funclink>RemoveEffect</funclink> entfernt. Wenn ein Effekt erfolgreich zum Objekt hinzugefügt wurde, wird der Callback Fx*Start aufgerufen (* steht dabei für den Effektnamen). Je nach Parametern kann dann ein periodischer Aufruf von Fx*Timer erfolgen, in dem der Effekt Partikel sprühen, Lebensenergie abziehen oder sonstige Dinge tun kann. Schließlich erfolgt, wenn der Effekt entfernt wird, ein Aufruf Fx*Stop, durchgeführt, in dem sich der Effekt entfernen sollte. Als Beispiel hier der oben beschriebene Unsichtbarkeitszauber mit Effekten:</text>
<code>/* Unsichtbarkeitszauber mit Effektsystem */
#strict
// EffectVars:
// 0 - Vorheriger Sichtbarkeitsstatus
// 1 - Vorherige Farbmodulation
public func Activate(pCaster, pCaster2)
{
// Zauberer ermitteln
if (pCaster2) pCaster = pCaster2;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Effekt starten
AddEffect("InvisPSpell", pCaster, 200, 1111, 0, GetID());
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
return(RemoveObject());
}
protected func FxInvisPSpellStart(pTarget, iEffectNumber)
{
// Vorherige Sichtbarkeit des Zauberers speichern
EffectVar(0, pTarget, iEffectNumber) = GetVisibility(pTarget);
var iOldMod = EffectVar(1, pTarget, iEffectNumber) = GetClrModulation(pTarget);
// Zauberer unsichtbar machen
SetVisibility(VIS_Owner() | VIS_Allies() | VIS_God(), pTarget);
// Halbdurchsichtig bläulich für den Besitzer und Verbündete
SetClrModulation(ModulateColor(iOldMod, RGBa(127,127,255,127)), pTarget);
// Fertig
return(1);
}
protected func FxInvisPSpellStop(pTarget, iEffectNumber)
{
// Status wiederherstellen
SetClrModulation(EffectVar(1, pTarget, iEffectNumber), pTarget);
SetVisibility(EffectVar(0, pTarget, iEffectNumber), pTarget);
// Fertig
return(1);
}</code>
<text>Hier startet das Zauberobjekt nur noch den Effekt, und entfernt sich dann. Die Engine sorgt dafür, dass keine Probleme bei der Sichtbarkeit auftreten: Effekte werden in einem Stapel angelegt, der sicher stellt, dass jeder Effekte immer in der umgekehrten Reihenfolge entfernt werden, in der sie hinzugefügt wurden. Dazu sind ein paar zusätzliche Start- und Stop-Aufrufe notwendig, auf die später noch eingegangen wird.</text>
<text>Der Effekt hat außerdem keinen Timer-Aufruf, aber trotzdem ein angegebenes TimerIntervall von 1111. Das sorgt dafür, dass mit dem ersten Aufruf nach 1111 Frames der Standard-Timer ausgelöst wird, der den Effekt löscht. Alternativ hätte man auch eine Timerfunktion definieren können:</text>
<code>protected func FxInvisPSpellTimer(pTarget, iEffectNumber)
{
// Rückgabewert -1 bedeutet, dass der Effekt gelöscht wird
return(-1);
}</code>
<text>Zum Speichern der vorherigen Statuswerte des Effektziels wird der spezielle Speicherbereich in <funclink>EffectVar</funclink>() verwendet. Dies ist nötig, da die Effekt-Callbacks in diesem Fall keinen Befehlskontext haben. Es können also keine objektlokalen Variablen (<code>local</code>) verwendet werden - das Zauberobjekt wurde schließlich gelöscht. Falls ein Objektkontext benötigt wird, kann man diesen auch an <funclink>AddEffect</funclink>() übergeben. Die Aufrufe sind dann objektlokal, und der Effekt wird automatisch gelöscht, wenn das Befehlszielobjekt gelöscht wurde.</text>
<h id="Priorities">Prioritäten</h>
<text>Beim Erstellen eines Effektes wird immer eine Priorität mit angegeben, die die Überladungsreihenfolge der Effekte angibt. Die Engine garantiert dabei, dass Effekte mit niedriger Priorität immer vor Effekten mit hoher Priorität hinzugefügt werden - notfalls durch temporäres Entfernen von Effekten mit höherer Priorität. Wenn also ein Effekt einen Clonk grün färbt, und ein anderer rot, so wird das Ergebnis das des Effektes mit höherer Priorität sein, da dieser Effekt zuletzt angewendet wurde. Haben zwei Effekte die gleiche Priorität, ist die Reihenfolge nicht definiert. Es ist jedoch garantiert, dass später zugewiesene Effekte stets an den Fx*Effect-Callback gleicher Priorität mit übergeben werden.</text>
<text>Im Falle der Grün-/Rotfärbung von Clonks sollte ein Effekt natürlich möglichst die vorherige Färbung abfragen, und dann zum Beispiel mit ModulateColor mischen. Die Prioritäten haben allerdings noch eine weitere Funktion: Ein Effekt mit hoher Priorität kann das Hinzufügen anderer Effekte mit niedrigerer Priorität verhindern. Dazu dient der Callback Fx*Effect. Gibt irgendein Effekt als Reaktion auf diesen Callback -1 zurück, wird der neue Effekt nicht hinzugefügt (dasselbe gilt für den Start-Callback beim Effekt selber). Dazu ein Beispiel:</text>
<code>/* Feuerimmunitätszauber */
#strict
public func Activate(pCaster, pCaster2)
{
// Zauberer ermitteln
if (pCaster2) pCaster = pCaster2;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Effekt starten
AddEffect("BanBurnPSpell", pCaster, 180, 1111, 0, GetID());
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
return(RemoveObject());
}
protected func FxBanBurnPSpellStart(pTarget, iEffectNumber, iTemp)
{
// Beim Start des Effektes: Clonk löschen, wenn er brennt
if (!iTemp) Extinguish(pTarget);
return(1);
}
protected func FxBanBurnPSpellEffect(szNewEffect, iEffectTarget, iEffectNumber, iNewEffectNumber, var1, var2, var3)
{
// Feuer abblocken
if (WildcardMatch(szNewEffect, "*Fire*")) return(-1);
// Alles andere ist OK
return();
}</code>
<text>Dieser Zauber macht den Clonk für 30 Sekunden gegen Feuer immun. Der Effekt kommt ohne Timer- und Stop-Callbacks aus, da die gesamte Funktionalität schon im Abblocken aller Effekte besteht, die "Fire" als Teilzeichenkette enthalten. Dies gilt insbesondere auch für das engineinterne Feuer, das genau den Effektnamen "Fire" hat. Man könnte hier natürlich trotzdem einen Timer für grafische Effekte hinzufügen, damit der Spieler sieht, dass er gerade nicht brennen kann. Außerdem könnte beim Abblocken eines Feuers in FxBanBurnPSpellEffect zusätzliche Effekte ausführen, wie zum Beispiel:</text>
<code>[...]
protected func FxBanBurnPSpellEffect(szNewEffect, iEffectTarget, iEffectNumber, iNewEffectNumber, var1, var2, var3)
{
// Nur Feuer behandeln
if (!WildcardMatch(szNewEffect, "*Fire*")) return();
// Beim Feuer haben die drei Extraparameter normalerweise folgende Bedeutung:
// var1: iCausedBy - Spieler, der für das Feuer verantwortlich ist
// var2: fBlasted - bool: Ob das Feuer durch eine Explosion zustande kam
// var3: pIncineratingObject - Objekt: Anzündendes Objekt
// Anzündendes Objekt löschen
if (var3 &amp;&amp; GetType(var3) == C4V_C4Object()) Extinguish(var3);
// Feuer abblocken
return(-1);
}</code>
<text>Dies würde sogar alle brennenden Objekte löschen, die das Zielobjekt ansonsten anzünden würden. Der Typecheck für var3 ist enthalten, weil sich andere Effekte ebenfalls Fire in den Namen setzen und andere Parameter haben könnten. Es ist offensichtlich, dass man dies vermeiden sollte, weil Funktionen wie die obige dann im ungünstigsten Fall ein völlig anderes Objekt löschen könnten.</text>
<text>Die folgende Tabelle enthält grobe Richtlinien für Prioritäten von Originalpackeffekten:</text>
<text><table>
<rowh><col>Effekt</col><col>Priorität</col></rowh>
<row><col>Kurzer Spezialeffekt</col><col>300-350</col></row>
<row><col>Nicht bannbare Effekte</col><col>250-300</col></row>
<row><col>Magie-Bannzauber</col><col>200-250</col></row>
<row><col>Andauernde Magie-Bannzauber</col><col>180-200</col></row>
<row><col>Kurzfristige, positive Zaubereffekte</col><col>150-180</col></row>
<row><col>Kurzfristige, negative Zaubereffekte</col><col>120-150</col></row>
<row><col>Normale Effekte</col><col>100-120</col></row>
<row><col>Engineinternes Feuer</col><col>100</col></row>
<row><col>Permanente Zaubereffekte</col><col>50-100</col></row>
<row><col>Permanente, sonstige Effekte</col><col>20-50</col></row>
<row><col>Interne Effekte als Datenspeicher, etc.</col><col>1</col></row>
</table></text>
<text>Allgemein richten sich Effekte natürlich erst einmal nach den Abhängigkeiten: Wenn ein Effekt einen anderen verhindern soll, braucht der verhindernde Effekt höhere Priorität (Selbst wenn es ein permanenter Effekt ist). Dann sollten kurzfristige Effekte gegenüber den längerfristigen eine höhere Priorität bekommen, damit die kurzfristigen Statusänderungen bei demselben Statuselement gegenüber den langfristigen Statuselementen eher zu sehen sind.</text>
<text>Das engineinterne Feuer liegt natürlich fest bei 100. Ein magisches Feuer, das die Eigenschaften des engineinternen Feuers auch benutzt, sollte entsprechend leicht darüber liegen, und in allen seinen Callbacks die entsprechenden FxFire*-Aufrufe mit aufrufen. Dabei sollten stets alle Callbacks (also Start, Timer und Stop) weitergeleitet werden, da diese voneinander abhängen und sich diese Abhängigkeiten auch in verschiedenen Engineversionen verschieben können. Wenn das nicht geht, sollte das Verhalten besser gleich komplett per Script emuliert werden.</text>
<text>Effekte mit Priorität 1 sind ein Spezialfall: Für sie werden nie andere Effekte temporär entfernt und sie selber werden ebenfalls nie temporär entfernt.</text>
<h id="SpecAddRemove">Spezielle Add/Remove-Aufrufe</h>
<text>Damit die Engine sicherstellen kann, dass Effekte immer in umgekehrter Reihenfolge entfernt werden, wie sie hinzugefügt wurden, müssen zuweilen Effekte temporär entfernt und wieder hinzugefügt werden. In diesen Aufrufen sollte der Scripter natürlich alle Statuszustände löschen und wiederherstellen, damit sich die anderen Effekte danach ausrichten können. Aktionen, die nur einmal beim Starten oder enden des Effektes ausgeführt werden sollen. Dazu gehört zum Beispiel das Löschen des Zielobjektes beim letzten Beispielscript, oder auch Soundeffekte.</text>
<text>Effekte werden auch dann entfernt, wenn das Zielobjekt entfernt wird oder stirbt - der Grund wird im iReason-Parameter an die Remove-Funktion der Effekte übergeben. Auf diese Weise kann man beispielsweise dafür sorgen, dass ein Clonk nach dem Sterben sofort wiederbelebt wird:</text>
<code>/* Wiederbelebungszauber */
#strict
// EffectVars: 0 - Anzahl der zusätzlichen Wiederbelebungen
public func Activate(pCaster, pCaster2)
{
// Zauberer ermitteln
if (pCaster2) pCaster = pCaster2;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Effekt starten
AddEffect("ReincarnationPSpell", pCaster, 180, 0, 0, GetID());
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
return(RemoveObject());
}
protected func FxReincarnationPSpellStart(pTarget, iEffectNumber, iTemp)
{
// Nur beim ersten Start: Meldung
if (!iTemp) Message("%s bekommt|ein Extraleben", pTarget, GetName(pTarget));
return(1);
}
protected func FxReincarnationPSpellStop(pTarget, iEffectNumber, iReason, fTemp)
{
// Nur beim Tod des Clonks
if (iReason != 4) return(1);
// Effekt erhalten, wenn der Clonk lebt: Wurde wohl durch einen anderen Effekt wiederbelebt :)
if (GetAlive(pTarget)) return(-1);
// Clonk wiederbeleben
SetAlive(1, pTarget);
// Energie geben
DoEnergy(100, pTarget);
// Nachricht
Sound("Magic*", 0, pTarget);
Message("%s|wurde wiederbelebt.", pTarget, GetName(pTarget));
// Effekt wirkt nur einmal: Entfernen
return(1);
}</code>
<text>Dieser Effekt belebt den Clonk beim Tod so oft wieder, wie er den Zauber gesprochen hat.</text>
<h id="GlobalEffects">Globale Effekte</h>
<text>Globale Effekte sind einfach Effekte, die an kein Zielobjekt gebunden sind. Innerhalb der globalen Effekte werden aber trotzdem Prioritäten beachtet und temporäre Add/Remove-Aufrufe durchgeführt. Man kann sich vorstellen, dass alle globalen Effekte an einem imaginären, globalen Objekt hängen. Globale Effekte werden entsprechend immer angesprochen, indem man an die Effektfunktionen als Zielobjekt 0 übergibt.</text>
<text>Hiermit lassen sich zum Beispiel Änderungen an der Gravitation, Himmelsfärbung, etc. durchführen. Ein Beispiel für einen Zauber, der die Gravitation reduziert und mit der Zeit wieder an den regulären Wert anpasst:</text>
<code>/* Gravitationszauber */
#strict
// EffectVars: 0 - Vorherige Gravitation
// 1 - Änderung durch den Zauber
public func Activate(pCaster, pCaster2)
{
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Effekt global starten
AddEffect("GravChangeUSpell", 0, 150, 37, 0, GetID(), -10);
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
return(RemoveObject());
}
protected func FxGravChangeUSpellStart(pTarget, iEffectNumber, iTemp, iChange)
{
// Anderen Gravitationseffekt suchen
if (!iTemp)
{
var iOtherEffect = GetEffect("GravChangeUSpell", pTarget);
if (iOtherEffect == iEffectNumber) iOtherEffect = GetEffect("GravChangeUSpell", pTarget, 1);
if (iOtherEffect)
{
// Gravitationsänderung auf diesen Effekt aufrechnen
EffectVar(1, pTarget, iOtherEffect) += iChange;
SetGravity(GetGravity() + iChange);
// Selbst entfernen
return(-1);
}
}
// Vorherige Gravitation sichern
var iOldGrav = EffectVar(0, pTarget, iEffectNumber) = GetGravity();
// Für nichttemporäre Aufrufe wird iChange übergeben, und auf den Änderungswert aufgerechnet
if (iChange) EffectVar(1, pTarget, iEffectNumber) += iChange;
// Gravitationsänderung setzen
// Die Änderung kann in temporären Aufrufen auch ungleich iChange sein
SetGravity(iOldGrav + EffectVar(1, pTarget, iEffectNumber));
// Fertig
return(1);
}
protected func FxGravChangeUSpellTimer(pTarget, iEffectNumber)
{
// Gravitation in Richtung Normalwert schrauben
var iGravChange = EffectVar(1, pTarget, iEffectNumber);
// Fertig?
if (Inside(iGravChange, -1, 1)) return(-1);
// Anpassen
var iDir = -iGravChange/Abs(iGravChange);
EffectVar(1, pTarget, iEffectNumber) += iDir;
SetGravity(GetGravity() + iDir);
return(1);
}
protected func FxGravChangeUSpellStop(pTarget, iEffectNumber)
{
// Gravitation Wiederherstellen
SetGravity(EffectVar(0, pTarget, iEffectNumber));
// Effekt entfernen
return(1);
}</code>
<text>pTarget wird hier in allen Effektaufrufen 0 sein. Trotzdem sollte der Parameter immer an Aufrufe wie <funclink>EffectVar</funclink>() übergeben werden, da es dann auch möglich ist, den Effekt an den Zauberer oder ggf. den Zauberturm zu binden. In diesem Fall würde die Gravitation automatisch zurückgesetzt, sobald der Zauberer stirbt oder der Turm gelöscht wird.</text>
<h id="AddEffects">Zusammenfassen von Effekten</h>
<text>Im letzten Beispiel wurden mehrere Gravitationseffekte zusammen gefasst, so dass die Änderung der Gravitation länger andauert, wenn mehrmals gezaubert wurde. Die Zusammenfassung durfte nicht im Effect-Callback passieren, da der Gravitationseffekt immer noch von einem Effekt mit höherer Priorität (beispielsweise ein keine-globalen-Zauber-erlauben-Effekt) abgelehnt werden könnte. Über den speziellen Fx*Add-Callback kann man dasselbe Ergebnis aber auch einfacher (oder zumindest übersichtlicher) erreichen:</text>
<code>[...]
protected func FxGravChangeUSpellEffect(szNewEffect, pTarget, iEffectNumber)
{
// Falls der neu hinzugefügte Effekt auch eine Gravitationsänderung ist, Interesse am Übernehmen anmelden
if (szNewEffect eq "GravChangeUSpell") return (-3);
// Ansonsten ignorieren
return();
}
protected func FxGravChangeUSpellAdd(pTarget, iEffectNumber, szNewEffect, pTarget, iNewTimer, iChange)
{
// Aufruf erfolgt, wenn der Effekt übernommen werden konnte
// Gravitationsänderung auf diesen Effekt aufrechnen
EffectVar(1, pTarget, iEffectNumber) += iChange;
SetGravity(GetGravity() + iChange);
// Fertig
return(1);
}</code>
<text>Die Rückgabe von -3 an den Fx*Effect-Callback, sorgt dafür, dass der Fx*Add-Callback für den neuen Effekt ausgeführt wird. Der neue Effekt wird dabei nicht erzeugt, und die entsprechende AddEffect-Funktion gibt die Effektnummer des Effektes zurück, der den neuen Effekt übernommen hat. Die Methode hat gegenüber der weiter oben verwendeten also den Vorteil, dass der Rückgabewert von AddEffect benutzt werden kann, um festzustellen, ob der Effekt überhaupt erzeugt werden konnte.</text>
<h id="UserCallbacks">Benutzerdefinierte Eigenschaften</h>
<text>Viele Klassifizierungen von Effekten können einfach über den Namen geregelt werden. Auf diese Weise können beispielsweise schnell alle Zaubereffekte über Wildcards gesucht und entfernt werden. Falls man aber zum Beispiel eigene Eigenschaften definieren will, die auch für existierende Effekte gelten, kann man zusätzliche Effektfunktionen definieren:</text>
<code>global func FxFireIsHot() { return(1); } // Feuer is heiß
// Funktion, die alle heißen Effekte vom Zielobjekt entfernt
global func RemoveAllHotEffects(pTarget)
{
// Lokaler Aufruf
if (!pTarget) pTarget=this();
// Alle Effekte durchsuchen und die heißen entfernen
var iEffect, i;
while (iEffect = GetEffect("*", pTarget, i++))
if (EffectCall(pTarget, iEffect, "IsHot"))
RemoveEffect(0, pTarget, iEffect);
}</code>
<text>Über <funclink>EffectCall</funclink>() können natürlich auch Funktionen im Effekt ausgelöst werden; beispielsweise um bestimmte Effekte zu verlängern.</text>
<h id="BlendFx">Blindeffekte</h>
<text>Manchmal müsste ein Effekt nur erzeugt werden, um die entsprechenden Callbacks in anderen Effekten auszuführen - beispielsweise bei Zaubern, die keine längere Animation benötigen, aber trotzdem durch andere Effekte blockiert können werden sollen. Ein Beispiel ist der Erdbebenzauber:</text>
<code>/* Erdbebenzauber */
#strict
public func Activate(object pCaster, object pCaster2)
{
Sound("Magic1");
// Effekt prüfen
var iResult;
if (iResult = CheckEffect("EarthquakeNSpell", 0, 150)) return(iResult!=-1 &amp;&amp; RemoveObject());
// Effekt ausführen
if (GetDir(pCaster)==DIR_Left()) CastLeft(); else CastRight();
// Zauberobjekt entfernen
return(RemoveObject());
}</code>
<text>Der Rückgabewert von <funclink>CheckEffect</funclink>() ist -1 wenn der Effekt abgelehnt, und positiv oder -2 wenn er aufgenommen wurde. In beiden Fällen sollte der Effekt selber nicht ausgeführt werden; aber in letzterem Fall kann die Activate-Funktion Erfolg signalisieren und 1 zurückgeben.</text>
<h id="Ext">Erweiterte Möglichkeiten</h>
<text>Da jeder Effekt seinen eigenen Datenspeicher hat, ist dies eine Möglichkeit, extern Daten an Objekte zu binden, ohne dabei die Definitionen verändern zu müssen. Außerdem können so einfache Aufrufe verzögert durchgeführt werden - beispielsweise erst ein Frame nach der Zerstörung eines Objekts, wie an einer Stelle im Ritterpack:</text>
<code>// Der Aufruf von CastleChange muss verzögert erfolgen, damit das Teil zum Aufruf auch wirklich weg ist
// Ansonsten würden FindObject()-Aufrufe dieses Objekt noch finden
public func CastlePartDestruction()
{
// Fundament?
if (basement)
RemoveObject(basement);
// Globaler Temporäreffekt, wenn nicht schon vorhanden
if (!GetEffect("IntCPW2CastleChange"))
AddEffect("IntCPW2CastleChange", 0, 1, 2, 0, CPW2);
return(1);
}
protected func FxIntCPW2CastleChangeStop()
{
// Alle BurgTeile benachrichtigen
var pObj;
while(pObj = FindObject(0, 0, 0, 0, 0, OCF_Fullcon(), 0,0, NoContainer(), pObj))
pObj->~CastleChange();
// Fertig
return(1);
}</code>
<text>Bei derartigen Effekten sollte der Name mit "Int" beginnen; insbesondere falls sie mit globalem Callback erzeugt werden, sollte darauf die ID des Objekts folgen, um Namenskollisionen zu vermeiden.</text>
<text>Zudem können bestimmte Aktionen beim Tod von Lebewesen ausgeführt werden, ohne dafür gleich eine neue Objektdefinition zu benötigen. In einem Szenarioscript kann beispielsweise stehen:</text>
<code>/* Szenarioscript */
#strict
protected func Initialize()
{
// Alle Wipfe manipulieren
var obj;
while (obj = FindObject(WIPF, 0,0,0,0, OCF_Alive(), 0,0, 0, obj))
AddEffect("ExplodeOnDeathCurse", obj, 20);
}
global func FxExplodeOnDeathCurseStop(pTarget, iEffectNumber, iReason)
{
// Bumm!
if (iReason == 4) Explode(20, pTarget);
return(1);
}</code>
<text>Alle Wipfe, die von Anfang an im Szenario waren, explodieren beim Tod.</text>
<h id="Naming">Benennung</h>
<text>Damit sich Effekte untereinander erkennen und manipulieren können, sollten folgende Benennungsschemata verwendet werden ("*abc" steht für Endungen, "abc*" für Namensanfänge und "*abc*" für Zeichenketten, die irgendwo im Namen vorkommen sollten.</text>
<text><table>
<rowh>
<col>Namensteil</col><col>Bedeutung</col>
</rowh>
<row>
<col>*Spell</col>
<col>Magischer Effekt</col>
</row>
<row>
<col>*PSpell</col>
<col>Für das Zielobjekt positiver, magischer Effekt</col>
</row>
<row>
<col>*NSpell</col>
<col>Für das Zielobjekt negativer, magischer Effekt</col>
</row>
<row>
<col>*USpell</col>
<col>Neutraler, magischer Effekt</col>
</row>
<row>
<col>*Fire*</col>
<col>Feuereffekt - die Funktion <funclink>Extinguish</funclink>() entfernt alle Effekte dieser Maske.</col>
</row>
<row>
<col>*Curse*</col>
<col>Fluch</col>
</row>
<row>
<col>*Ban*</col>
<col>Effekt, der andere Effekte bannt (z.B. Feuer- oder Zauberimmunität)</col>
</row>
<row>
<col>Int*</col>
<col>Interner Effekt (Variablenspeicher, etc.)</col>
</row>
<row>
<col>*Potion</col>
<col>Zaubertrank</col>
</row>
</table></text>
<text>Achtung: Da Funktionsnamen maximal 100 Zeichen lang sein dürfen (und irgendwann auch die Übersicht verloren geht), sollte man nicht endlos Statusinformationen in den Namen packen. Alle Effektfunktionen unterscheiden zwischen Groß- und Kleinschreibung. Umgekehrt sollte man vermeiden, die entsprechenden Zeichenketten im Effektnamen vorkommen zu lassen, wenn sie nichts mit den jeweiligen Bedeutungen zu tun haben.</text>
<h id="CBRef">Callback-Referenz</h>
<part>
<text>Folgenge Callbacks werden von der Engine ausgeführt, und sollten - je nach Bedarf - im Script implementiert werden. * steht jeweils für den Effektnamen.</text>
<h>Fx*Start</h>
<text><code>int Fx*Start (object pTarget, int iEffectNumber, int iTemp, C4Value var1, C4Value var2, C4Value var3, C4Value var4);</code></text>
<text>Wird beim Start des Effektes aufgerufen. pTarget gibt das Zielobjekt des Effektes an, und iEffectNumber den Index. Über diese beiden Parameter lässt sich der Effekt eindeutig identifizieren, um beispielsweise zugehörige Variablen in <funclink>EffectVar</funclink>() zu manipulieren.</text>
<text>Der Parameter iTemp ist 0 beim normalen Hinzufügen des Effektes, 1 wenn der Effekt nur hinzugefügt wird, weil er vorher temporär entfernt wurde, und 2 wenn der Effekt hinzugefügt wird, weil er zuvor temporär entfernt wurde aber jetzt selber gelöscht werden soll (in dem Fall folgt dann ein Remove-Aufruf).</text>
<text>Die Werte var1 bis var4 entsprechen den übergebenen Parametern an <funclink>AddEffect</funclink>(), und können verwendet werden, um Effekte mit unterschiedlichen Eigenschaften zu erzeugen.</text>
<text>Wenn iTemp 0 ist und dieser Callback -1 zurückgibt, wird der Effekt nicht erzeugt und der zugehörige <funclink>AddEffect</funclink>()-Aufruf gibt 0 zurück.</text>
<h>Fx*Stop</h>
<text><code>int Fx*Stop (object pTarget, int iEffectNumber, int iReason, bool fTemp);</code></text>
<text>Aufruf, wenn der Effekt temporär oder permanent entfernt wird. pTarget ist wieder das Effekt-Zielobjekt und iEffectNumber der Effektindex in der Effekteliste des Objekts.</text>
<text>iReason gibt den Grund für das Entfernen des Effektes an, und kann einer der folgenden Werte sein:</text>
<text><table>
<rowh><col>iReason</col><col>Bedeutung</col></rowh>
<row><col>0</col><col>Effekt wird regulär entfernt</col></row>
<row><col>1</col><col>Effekt wird nur temporär entfernt. fTemp ist in dem Fall 1.</col></row>
<row><col>2</col><col>nicht verwendet</col></row>
<row><col>3</col><col>Effekt wird entfernt, weil das Objekt gelöscht wird</col></row>
<row><col>4</col><col>Effekt wird entfernt, weil das Objekt stirbt</col></row>
</table></text>
<text>Wenn der Effekt nicht gelöscht werden soll, kann in der Funktion -1 zurückgegeben werden, um das Löschen zu verhindern. Bei temporären Aufrufen oder wenn das Zielobjekt gelöscht wird, bringt dies natürlich nichts.</text>
<h>Fx*Timer</h>
<text><code>int Fx*Timer (object pTarget, int iEffectNumber, int iEffectTime);</code></text>
<text>Periodischer Timer-Aufruf, wenn bei der Effekterzeugung ein Timer-Intervall angegeben wurde. pTarget und iEffectNumber spezifizieren auch hier Zielobjekt und Effekt.</text>
<text>iEffectTime gibt die die Zeit an, die der Effekt schon läuft. Diese lässt sich auch über <funclink>GetEffect</funclink>() mit entsprechenden Parametern abfragen.</text>
<text>Ein Rückgabewert von -1 bedeutet, dass der Effekt nach dem Aufruf gelöscht wird. Dasselbe passiert, wenn die Funktion nicht implementiert wird.</text>
<h>Fx*Effect</h>
<text><code>int Fx*Effect (string szNewEffectName, object pTarget, int iEffectNumber, int iNewEffectNumber, C4Value var1, C4Value var2, C4Value var3, C4Value var4);</code></text>
<text>Aufruf an alle Effekte mit höherer Priorität, wenn ein neuer Effekt zu demselben Objekt (pTarget) hinzugefügt werden soll. szNewEffectName gibt den Namen des neuen Effektes an; iEffectNumber den Effektindex des Effektes, bei dem angefragt wird, und iNewEffectNumber den Index des neu zu erzeugenden Effektes.</text>
<text>Achtung: Der neue Effekt ist noch nicht fertig initialisiert, und sollte daher nicht manipuliert werden. Insbesondere das Priority-Feld ist möglicherweise noch nicht initialisiert. Der iNewEffectNumber-Parameter kann aber verwendet werden, um mit <funclink>EffectCall</funclink>() Informationen über den Effekt abzufragen. Bei Aufrufen durch die <funclink>CheckEffect</funclink>()-Funktion ist iNewEffectNumber 0.</text>
<text>Die Funktion sollte -1 zurückgeben, wenn sie den neuen Effekt ablehnt. Da der Effekt auch noch von einem anderen Effekt abgelehnt werden kann, sollte dieser Callback nicht dazu verwendet werden, um beispielsweise Effekte zusammenzufassen (siehe Beispiel zum Gravitationszauber). Überhaupt sollte es möglichst vermieden werden, in diesem Aufruf die Effektliste zu manipulieren.</text>
<text>Ein Rückgabewert von -2 oder -3 sollte angegeben werden, wenn der Effekt übernommen wird. Sofern der Effekt dann von keinem anderen Effekt abgelehnt wurde (über Rückgabewert -1), wird ein Fx*Add-Aufruf an den übernehmenden Effekt gesendet, der neue Effekt selber entfernt, und die aufrufende AddEffect-Funktion erhält als Rückgabewert die Nummer des übernehmenden Effektes. Rückgabewert -3 bedeutet dabei im Gegensatz zu -2, dass vor dem Fx*Add-Aufruf alle Effekte mit höherer Priorität temporär entfernt, und nach dem Aufruf dieselben wieder temporär hinzugefügt werden.</text>
<text>var1 bis var4 sind die Parameter, die an die <funclink>AddEffect</funclink>()-Funktion übergeben wurden.</text>
<h>Fx*Add</h>
<text><code>int Fx*Add (object pTarget, int iEffectNumber, string szNewEffectName, int iNewEffectTimer, C4Value var1, C4Value var2, C4Value var3, C4Value var4);</code></text>
<text>Aufruf an einen übernehmenden Effekt, wenn dieser zuvor auf einen Fx*Effect-Callback hin -2 oder -3 zurückgegeben hat. iEffectNumber gibt die Nummer des Effektes an, zu dem hinzugefügt wird; pTarget das Zielobjekt (0 bei globalen Effekten).</text>
<text>iNewEffectTimer ist das Timer-Intervall des neu erzeugten Effektes; var1 bis var4 die an AddEffect übergebenen Zusatzparameter. ACHTUNG: Diese Zusatzparameter werden natürlich nicht bei temporären Aufrufen übergeben, sondern sind dann 0.</text>
<text>Wird -1 zurückgegeben, wird auch der übernehmende Effekt entfernt. Logischerweise gibt die erzeugende AddEffect-Funktion dann -2 zurück.</text>
<h>Fx*Damage</h>
<text><code>int Fx*Damage (object pTarget, int iEffectNumber, int iDmgEngy, int iCause);</code></text>
<text>Jeder Effekt erhält diesen Callback, wann immer sich der Energie- oder Schadenswert des Zielobjektes ändert. Falls die Funktion definiert wird, sollte der Rückgabewert dabei die erlaubte Änderung angeben.</text>
<text>Der Callback wird bei Energiewertänderungen bei Lebewesen, sowie bei Schadenswertänderungen bei nicht-Lebewesen durchgeführt - nicht aber umgekehrt. iCause gibt den geänderten Wert und den Grund an:</text>
<text><table>
<rowh><col>Scriptkonstante</col><col>iCause</col><col>Bedeutung</col></rowh>
<row><col>FX_Call_DmgScript</col><col>0</col><col>Schaden durch Scriptaufruf <funclink>DoDamage</funclink>()</col></row>
<row><col>FX_Call_DmgBlast</col><col>1</col><col>Schaden durch Explosion</col></row>
<row><col>FX_Call_DmgFire</col><col>2</col><col>Schaden durch Feuer</col></row>
<row><col>FX_Call_DmgChop</col><col>3</col><col>Schaden durch Fällen (nur Bäume)</col></row>
<row><col>FX_Call_EngScript</col><col>32</col><col>Energieänderung durch Scriptaufruf <funclink>DoEnergy</funclink>()</col></row>
<row><col>FX_Call_EngBlast</col><col>33</col><col>Energieverlust durch Explosion</col></row>
<row><col>FX_Call_EngObjHit</col><col>34</col><col>Energieverlust durch Objekttreffer</col></row>
<row><col>FX_Call_EngFire</col><col>35</col><col>Energieverlust durch Feuer</col></row>
<row><col>FX_Call_EngBaseRefresh</col><col>36</col><col>Energieaufnahme in der Basis - auch Abgabe und Kauf der Basis, wenn die Basis ein Lebewesen ist</col></row>
<row><col>FX_Call_EngAsphyxiation</col><col>37</col><col>Energieverlust durch Ersticken</col></row>
<row><col>FX_Call_EngCorrosion</col><col>38</col><col>Energieverlust durch Säure</col></row>
<row><col>FX_Call_EngStruct</col><col>39</col><col>Energieverlust von Gebäuden (Nur lebende Gebäude)</col></row>
<row><col>FX_Call_EngGetPunched</col><col>40</col><col>Energieverlust im Clonk-zu-Clonk-Kampf</col></row>
</table></text>
<text>Allgemein kann der Ausdruck "iCause &amp; 32" verwendet werden, um festzustellen, ob Energie oder Schadenswert verändert wurden. Werte für die Energie sind dabei exakt, das heißt 100.000 entspricht der vollen Energie eines normalen Clonks mit Rang 10 (C4MaxPhysical).</text>
<text>Über diesen Callback kann zum Beispiel Schaden an einem Objekt verhindert, abgeschwächt oder verstärkt werden; man kann Lebensschaden zunächst nur von der Zauberenergie abziehen, gleichmäßig auf verbundene Clonks verteilen und so weiter.</text>
</part>
<h id="FnRef">Funktions-Referenz</h>
<text>Es gibt folgende Funktionen sind zum Manipulieren und Abfragen von Effekten:</text>
<text><ul>
<li><funclink>AddEffect</funclink>() - zum Erzeugen von Effekten</li>
<li><funclink>RemoveEffect</funclink>() - zum Entfernen von Effekten</li>
<li><funclink>GetEffect</funclink>() - zum Abfragen von Effekten und Parametern</li>
<li><funclink>GetEffectCount</funclink>() - um Effekte zu zählen</li>
<li><funclink>EffectCall</funclink>() - für Benutzeraufrufe in Effekten</li>
<li><funclink>EffectVar</funclink>() - zum Abfragen von Effektvariablen</li>
<li><funclink>ChangeEffect</funclink>() - zum Ändern von Effektnamen und -timern (beispielsweise für mehrstufige Effekte)</li>
<li><funclink>CheckEffect</funclink>() - um Effekt-Callbacks auszuführen, ohne den Effekt selber zu erstellen</li>
</ul></text>
</part>
<author>Sven2</author><date>März 2004</date>
</doc>

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Aufruf von Scriptfunktionen</title>
<h>Aufruf von Scriptfunktionen</h>
<part>
<text>Durch den Aufruf einer Scriptfunktion wird der Script der Funktion ausgeführt. Dabei kann die aufrufende Scriptfunktion Parameter an die Funktion übergeben und den Rückgabewert der Funktion verwerten.</text>
<h>Aufruf einer lokalen Funktion</h>
<part>
<text>Befindet sich die Funktion, die aufgerufen werden soll, im selben Script wie die aufrufende Funktion, so ist dies ein "lokaler" Funktionsaufruf. Dabei wird die Funktion direkt über ihren Namen aufgerufen.</text>
<h>Beispiel:</h>
<code>func TestFunktion()
{
<funclink>Log</funclink>("Die Test-Funktion wurde aufgerufen!");
}
func Aufruf()
{
TestFunktion();
}</code>
<text>Wird hier die Funktion Aufruf() ausgeführt, so wird die Funktion TestFunktion() aufgerufen, welche eine entsprechende Nachricht ins Log ausgibt.</text>
</part>
<h>Aufruf einer Funktion in einem anderen Objekt</h>
<part>
<text>Will man eine Funktion im Script eines anderen Objekts aufrufen, so reicht der Name nicht aus, um einen Aufruf ausführen zu können. Es muss zusätzlich das Objekt angegeben werden, in dem die aufzurufende Funktion steht.</text>
<h>Beispiel:</h>
<text>Script Objekt A (ID AAAA):</text>
<code>func Activate()
{
<funclink>Log</funclink>("Activate wurde in Objekt A aufgerufen!");
<funclink>Explode</funclink>(20);
}</code>
<text>Script Objekt B:</text>
<code>func Activate()
{
var obj = <funclink>FindObject</funclink>(AAAA, -1, -1, -1, -1);
obj->Activate();
} </code>
<text>Der Script der Funktion Activate() in Objekt B sucht sich als erstes das nächstliegende Objekt vom Typ A (also mit der ID AAAA) und speichert es in der Veriable obj. Danach wird die Funktion Activate() im Script von diesem Objekt aufgerufen. Dazu wird zuerst das aufzurufende Objekt angegeben, gefolgt von dem Pfeil-Operator, der einen Objektaufruf markiert. Danach folgt der Funktionsname der aufzurufenden Funktion nebst der Parameterliste (in diesem Fall werden keine Parameter übergeben).</text>
<text>Es wird also durch den Aufruf von Activate() in Objekt B bewirkt, dass das nächstliegende Objekt vom Typ A in die Luft gejagt wird. Es handelt sich also im Beispiel um eine Art sehr primitiver Fernsteuerung für Objekt A (Der Aufruf erzeugt z.B. einen Fehler, wenn kein Objekt A existiert).</text>
<h>Anmerkungen</h>
<text>Die Speicherung des Objektzeigers in der Variable obj im Beispiel ist nicht erforderlich. Die folgende Schreibweise der Funktion Activate() in B ist gleichwertig:</text>
<code>func Activate()
{
<funclink>FindObject</funclink>(AAAA, -1, -1, -1, -1)->Activate();
}</code>
<text>Es kann zusätzlich zum Namen der aufzurufenden Funktion noch die ID der Definition der Scriptfunktion mit angegeben werden. Das macht den Aufruf zum einen in vielen Fällen leicht schneller, außerdem können so auch überladene Funktionen im Zielscript aufgerufen werden (siehe #include/#appendto).</text>
<code>func Activate()
{
var obj = <funclink>FindObject</funclink>(AAAA, -1, -1, -1, -1);
obj->AAAA::Activate();
}</code>
</part>
<h>Indirekter Aufruf von Skriptfunktionen</h>
<part>
<text>In manchen Situationen kann allerdings auch ein "indirekter" Aufruf durch die Engine-Funktionen <funclink>Call</funclink> und Verwandte sinnvoll sein. Hier wird der Funktionsname als String übergeben, was den Aufruf einer Funktion "nach Namen" ermöglicht.</text>
<h>Beispiel:</h>
<code>func TestFunktion()
{
<funclink>Log</funclink>("Die Test-Funktion wurde aufgerufen!");
}
func Aufruf()
{
<funclink>Call</funclink>("TestFunktion");
}</code>
<text>Ein solcher indirekter Aufruf ist allerdings in der Regel deutlich langsamer als der direkte Aufruf, da bei Call die entsprechende Funktion erst zur Laufzeit im Script gesucht werden muss. Beim direkten Aufruf steht die aufzurufende Funktion dagegen in der Regel bereits zur Zeit des Parsens (also beim Start der Engine) fest, weshalb dieser Aufruf besser optimiert werden kann und deshalb schneller ist.</text>
<text>Dieser Nachteil ist aber gleichzeitig in bestimmten Situationen eine Stärke von Call: es ist möglich, zur Laufzeit zu entscheiden, welche Funktion aufgerufen werden soll. Eine Anwendung soll das folgende Beispiel deutlich machen:</text>
<code>func TestFunktion()
{
<funclink>Call</funclink>(<funclink>Format</funclink>("Aufruf%d", <funclink>Random</funclink>(3)));
}
func Aufruf0() { <funclink>Log</funclink>("Die erste Funktion wurde aufgerufen!"); }
func Aufruf1() { <funclink>Log</funclink>("Die zweite Funktion wurde aufgerufen!"); }
func Aufruf2() { <funclink>Log</funclink>("Die dritte Funktion wurde aufgerufen!"); }</code>
<text>Hier wird in TestFunktion() eine <em>zufällige</em> Funktion aufgerufen (mittels <funclink>Random</funclink> und <funclink>Format</funclink> wird zufällig einer der drei Strings "Aufruf1", "Aufruf2" oder "Aufruf3" an Call übergeben).</text>
<text>Call muss hier verwendet werden, da erst zur Laufzeit bestimmt wird, welche Funktion aufgerufen wird. Außerdem wird bei jeder Ausführung von TestFunktion() eine andere Scriptfunktion ausgewählt, die aufgerufen wird. Dies wäre mit einem direkten Aufruf nicht möglich.</text>
<text>Außer Call können auch andere Zugriffsarten indirekt erfolgen, siehe dazu <funclink>ObjectCall</funclink> und <funclink>GameCall</funclink>. Besondere Beachtung verdienen außerdem noch <funclink>PrivateCall</funclink> und <funclink>ProtectedCall</funclink>. Sie ermöglichen die Umgehung der <emlink href="script/Funcs.html#Aufrufb">Aufrufbeschränkung</emlink> und existieren nur in der "Indirekt-Aufruf-Version".</text>
</part>
</part>
<author>PeterW</author><date>Mai 2003</date>
</doc>

View File

@ -0,0 +1,189 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Funktionen</title>
<h>Funktionen</h>
<part>
<text>Eine Skriptfunktion fasst ein bestimmtes Stück Code zusammen, welches dann von der Engine oder einem anderen Script aufgerufen (also ausgeführt) werden kann. Das gesamte Script eines Szenarios oder Objekts ist in solchen Funktionen untergebracht.</text>
<h>Parameter und Rückgabewerte</h>
<text>An eine Scriptfunktion können beim Aufruf bis zu 10 Parameter übergeben werden. Diese können dann innerhalb der Funktion ausgewertet und verwendet werden. Beim Beenden kann eine Funktion mit dem Befehl <funclink>return</funclink>() einen einzelnen Wert an den Aufrufer zurückgeben.</text>
<h>Syntax</h>
<text>Eine einfache Funktionsdeklaration könnte z.B. folgendermaßen aussehen:</text>
<code>func MeineFunktion()
{
<funclink>Message</funclink>("Meine Funktion wurde aufgerufen!");
}</code>
<text>Das Script der Funktion steht in einem sogenannten Block (der Bereich zwischen '{' und '}' ). Vor diesem Block steht die <strong>Funktionsdeklaration</strong>. Diese beginnt mit "<code>func</code>", gefolgt von dem <strong>Funktionsnamen</strong> (hier: "MeineFunktion"). In der Klammer nach dem Funktionsnamen können Funktionsparameter definiert werden (s.u.).</text>
<text>Beim Aufruf der Funktion wird die Meldung "Meine Funktion wurde aufgerufen!" ausgegeben.</text>
<code>func ZeigeZahl(int zahl)
{
<funclink>Message</funclink>("ZeigeZahl wurde mit dem Parameter %d aufgerufen!", 0, zahl);
}</code>
<text>Hier wurde ein Parameter mit dem Namen "zahl" vom Typ "int" definiert. Wird beim Aufruf der Funktion ein Parameter angegeben, so erhält "zahl" den übergebenen Wert. Der übergebene Wert wird in diesem Fall in einer entsprechenden Nachricht ausgegeben.</text>
<text>Ein Aufruf der Funktion "ZeigeZahl" könnte z.B. folgendermaßen aussehen:</text>
<code>ZeigeZahl(42)</code>
<text>Durch die Ausführung dieses Aufrufes würde die Nachricht "ZeigeZahl wurde mit dem Parameter 42 aufgerufen!" erzeugt.</text>
<text>Es ist auch erlaubt, mehrere Parameter zu definieren. Dazu ein Beispiel:</text>
<code>func ZeigeSumme(zahl1, zahl2, zahl3, zahl4)
{
<funclink>Message</funclink>("Die Summe der ersten 4 Parameter ist %d.", 0, zahl1 + zahl2 + zahl3 + zahl4);
}</code>
<text>In diesem Fall wurden vier Parameter benannt. Ihnen wurden die Namen "zahl1" bis "zahl4" zugewiesen (die Parameternamen werden jeweils durch Kommata getrennt).</text>
<text>In der Nachricht wird dann jeweils die Summe der vier übergebenen Zahlen ausgegeben. Der Funktionsaufruf</text>
<code>ZeigeSumme(1, 2, 3, 4);</code>
<text>führt also zu der Nachricht "Die Summe der ersten 4 Parameter ist 10.".</text>
<h id="parametertypen">Parametertypen</h>
<text>Es ist möglich, den Typ der ürgebenen Parameter zu erzwingen. Dazu einfach den Namen des entsprechenden Typs (siehe dazu <emlink href="script/Typechecks.html">Typechecks</emlink>) vor den Parameternamen setzen:</text>
<code>func TypParameterFunktion(object clnk, id def, int anzahl, string msg)
{
<emlink href="for.html">for</emlink>(var i = 0; i &lt; anzahl; i++)
<funclink>CreateContents</funclink>(def, clnk);
<funclink>Message</funclink>(msg, clnk);
}</code>
<text>Diese Funktion gibt einem übergebenen Clonk (<code>clnk</code>) eine Anzahl von Objekten (<code>anzahl</code>) vom angegebenen Typ (<code>def</code>) und gibt die Nachricht <code>msg</code> über seinem Kopf aus. Dabei wird bei Funktionsaufruf sichergestellt, dass alle Parameter in den angegebenen Typ konvertiert werden, sofern dies möglich ist (siehe <emlink href="script/Typechecks.html">Typechecks</emlink>).</text>
<text>Ein Aufruf wie <code>TypParameterFunktion(1, CLNK, "Text", 5)</code> hier würde also einen Typfehler auslösen.</text>
<h id="spezial">Vorgabeparameter</h>
<text>Anders als in verschiedenen anderen Programmiersprachen ist es in C4Script immer erlaubt, weniger oder auch mehr Parameter zu übergeben als in der Funktion definiert (maximal jedoch 10).</text>
<text>Die folgenden Aufrufe der obigen Funktion sind also völlig legal:</text>
<code>ZeigeSumme(1, 2);
ZeigeSumme(1, 2, 3, 4, 5, 6);</code>
<text>Beim ersten Aufruf wurden weniger Parameter übergeben, als in ZeigeSumme deklariert wurden. Die "überschüssigen" Parameter in ZeigeSumme erhalten nun einfach den Wert 0, die Meldung lautet entsprechend "Die Summe der ersten 4 Parameter ist 3." (=1+2+0+0).</text>
<text>Wird ein Parameter nicht übergeben, so ist das mit der Übergabe von 0 identisch.</text>
<text>Umgekehrt wurden beim zweiten Aufruf <em>mehr</em> Parameter übergeben als in ZeigeSumme definiert wurden. Der 5. und 6. Parameter werden nun keinem Parameter in ZeigeSumme zugewiesen. Sie können allerdings noch mittels der Funktion <funclink>Par</funclink>() abgefragt werden [Par(4) und Par(5)]. Da die letzten beiden Parameter von ZeigeSumme also nicht ausgewertet werden können, wird hier "nur" die Meldung "Die Summe der ersten 4 Parameter ist 10." ausgegeben.</text>
<h>Rückgabewerte</h>
<part>
<text>Jede Scriptfunktion gibt einen Rückgabewert an den Aufrufer (die aufrufende Funktion bzw. die Engine) zurück. Dieser Wert wird im Script mittels <funclink>return</funclink>() gesetzt.</text>
<h>Beispiel:</h>
<code>func Differenz(Zahl1, Zahl2)
{
<funclink>return</funclink>(<funclink>Abs</funclink>(Zahl1 - Zahl2));
}</code>
<text>Hier wird die Differenz der ersten beiden Parameter bestimmt und das Ergebnis "zurückgegeben". Eine andere Scriptfunktion könnte nun diese Funktion benutzen, um die Differenz zweier Zahlen zu berechnen:</text>
<code>func ZeigeDifferenz(Zahl1, Zahl2)
{
<funclink>Message</funclink>("Die Differenz zwischen %d und %d beträgt %d!", Zahl1, Zahl2, Differenz(Zahl1, Zahl2));
} </code>
<text>Der Aufruf "ZeigeDifferenz(5, 2)" würde also die Meldung "Die Differenz zwischen 5 und 2 beträgt 3!" erzeugen.</text>
</part>
<h id="Aufrufb">Aufrufberechtigungen</h>
<part>
<text>Für jede Funktion kann eine "Aufrufberechtigung" festgelegt werden, die bestimmt, von wo die Funktion aufgerufen werden darf. Hier gibt es drei verschiedene Stufen:</text>
<text><table>
<row>
<col><code>public</code></col>
<col>darf von überall aufgerufen werden, auch aus anderen Scripten (Standard)</col>
</row>
<row>
<col><code>protected</code></col>
<col>darf nur aus dem eigenen Script und von der Engine aufgerufen werden</col>
</row>
<row>
<col><code>private</code></col>
<col>darf nur aus dem eigenen Script aufgerufen werden</col>
</row>
</table></text>
<text>Die Aufrufberechtigung wird jeweils direkt vor "<code>func</code>" geschrieben:</text>
<code>private func PrivateFunktion()
{
// Diese Funktion darf nur im selben Script aufgerufen werden!
}</code>
<text>Wird diese Funktion nun von einem externen Script aufgerufen, so gibt die Engine einen Fehler aus.</text>
<h>Anmerkung</h>
<text>Da es in manchen Fällen notwendig erscheint, auch eine geschützte Funktion aus einem fremden Script aufzurufen, kann die Aufrufbeschränkung mittels <funclink>PrivateCall</funclink> bzw. <funclink>ProtectedCall</funclink> umgangen werden.</text>
</part>
<h>Globale Funktionen</h>
<part>
<text>Eine Funktion wird <code>global</code> definiert, indem "<code>global</code>" vor "<code>func</code>" gestellt wird.</text>
<text>Eine als <code>global</code> definierte Funktion kann aus jedem Script aufgerufen werden. Ihr Gültigkeitsbereich stimmt mit denen der Engine-Funktionen überein. Sie können damit auch verwendet werden, um Engine-Funktionen zu überladen und ihre Funktionsweise zu modifizieren.</text>
<h>Beispiel:</h>
<code>global func CreateContents(id, pObj, iCnt)
{
var pObj;
<emlink href="for.html">for</emlink>(var i = 0; i &lt; iCnt; i++)
pObj = <funclink>inherited</funclink>(id, pObj);
return(pObj);
}</code>
<text>Definiert die Engine-Funktion <funclink>CreateContents</funclink> neu. Dabei wird sie um einen neuen Parameter iCnt erweitert, der es erlaubt, mehrere Objekte zu erzeugen. Man beachte, dass <funclink>inherited</funclink> innerhalb dieser Funktion der durch sie überladenen Engine-Funktion <funclink>CreateContents</funclink> entspricht!</text>
<h>Achtung!</h>
<text>Eine globale Skriptfunktion übernimmt den Kontext der aufrufenden Funktion. Das bedeutet insbesondere, dass <funclink>this</funclink>() das aufrufende Objekt ist (natürlich nur, wenn die Funktion auch aus einem Objekt aufgerufen wurde). Deshalb darf in einer globalen Funktion auch keine objektlokale Variable verwendet werden und auch keine andere lokale Funktion aufgerufen oder lokale Variablen verändert werden! Das folgende Objektscript ist also nicht zulässig:</text>
<code>local iNummer;
func ObjektFunktion()
{
<funclink>Log</funclink>("ObjectFunktion: local iNummer hat den Wert %d!", iNummer);
}
global func GlobaleFunktion()
{
ObjectFunktion(); // Fehler!
iNummer++; // Fehler!
}</code>
<text>Beide Versuche, auf objektlokale Elemente zuzugreifen, schlagen fehl. Das ist leicht einsichtig, da GlobalFunktion() ja aus jedem beliebigen Script, also auch aus dem Szenarioscript oder aus dem Script eines anderen Objekts aufgerufen werden kann. Dieses Script besitzt dann höchstwahrscheinlich auch keine Variable "iNummer" oder Funktion "ObjectFunktion", die benutzt werden könnte. Da die Engine dies beim Vararbeiten des Scripts nicht sicherstellen kann, wird ein Fehler ausgelöst.</text>
<text>Anmerkung: Soll eine lokale Funktion in einem fremden Kontext aufgerufen werden, so sollte "<code>this()->Funktion(...)</code>" verwendet werden. Dann gibt es nur einen Fehler, wenn die Funktion auch wirklich nicht im Objekt existiert.</text>
</part>
<h id="referenzen">Referenzen</h>
<text>Manchmal ist es nötig, nicht den Wert einer Variable zu übergeben, sondern einen "Verweis" auf die Variable selbst.</text>
<text>Nehmen wir an, wir wollen eine Funktion schreiben, die die Position des höchstrangingsten Clonks eines Spielers zurückgibt. Dies ist normalerweise ohne Tricks nicht möglich, da eine Funktion ja nur einen Rückgabewert hat (die Position hat aber zwei Komponeneten: X und Y).</text>
<text>Doch durch Verwendung von Referenzübergabe als Parameter kann hier die Information trotzdem zurückgegeben werden:</text>
<code>func GetHiRankPosition(int plr, &amp;x, &amp;y)
{
var oHiRank = <funclink>GetHiRank</funclink>(plr);
x = <funclink>GetX</funclink>(oHiRank);
y = <funclink>GetY</funclink>(oHiRank);
}
func Aufruf()
{
var iHiRankX, iHiRankY;
GetHiRankPosition(0, iHiRankX, iHiRankY);
<funclink>Message</funclink>("Die Position des HiRanks von Spieler 1 ist: %d/%d", 0, iHiRankX, iHiRankY);
}</code>
<text><code>x</code> und <code>y</code> in <code>GetHiRankPosition</code> sind hier <strong>Referenzen</strong>, d.h. wenn man sie setzt, werden die Variablen gesetzt, die man als Parameter angab (in diesem Fall <code>iHiRankX</code> und <code>iHiRankY</code>). Man beachte, dass ein Aufruf wie "<code>GetHiRankPosition(0, iHiRankX + 1, iHiRankY)</code>" zu einem Typfehler führt, da "<code>iHiRankX + 1</code>" keine Variable, sondern eine Zahl ist!</text>
<text>Man beachte, dass "<code>&amp;</code>" ein eigenständiger Typ ist, deshalb darf für einen Referenzparameter kein weiterer Typ angegeben werden, "<code>int &amp;x</code>" wäre also ungültig!</text>
</part>
<author>PeterW</author><date>Juli 2002</date>
<author>matthes</author><date>Juni 2004</date>
</doc>

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>GetDefCoreVal, GetActMapVal, GetObjectVal, GetScenarioVal</title>
<h>GetDefCoreVal, GetActMapVal, GetObjectVal, GetScenarioVal</h>
<part>
<text><ul>
<li>GetDefCoreVal(string strEntry, string strSection, id idDef); </li>
<li>GetActMapVal(string strEntry, stringstrAction, id idDef); </li>
<li>GetObjectVal(string strEntry, string strSection, object pObj); </li>
<li>GetObjectInfoCoreVal(string strEntry, string strSection, object pObj); </li>
<li>GetScenarioVal(string strEntry, string strSection);</li>
<li>GetPlayerVal(string strEntry, string strSection, int iPlr); </li>
<li>GetPlayerInfoCoreVal(string strEntry, string strSection, int iPlr); </li>
</ul></text>
<text>Diese Funktionsfamilie gewährt direkten Zugriff auf sämtliche Eigenschaften der entsprechenden Objekte, wie sie auch abgespeichert werden.</text>
<text>Dabei entsprechen die Funktionen jeweils folgenden Dateien:</text>
<text><table>
<rowh>
<col>Funktion</col>
<col>Datei</col>
</rowh>
<row>
<col>GetDefCoreVal</col>
<col>DefCore.txt</col>
</row>
<row>
<col>GetActMapVal</col>
<col>ActMap.txt</col>
</row>
<row>
<col>GetObjectVal</col>
<col>Objects.txt</col>
</row>
<row>
<col>GetObjectInfoCoreVal</col>
<col>*.c4i (in Spielerdateien)</col>
</row>
<row>
<col>GetScenarioVal</col>
<col>Scenario.txt</col>
</row>
<row>
<col>GetPlayerVal</col>
<col>scenario.txt</col>
</row>
<row>
<col>GetPlayerInfoCoreVal</col>
<col>player.txt</col>
</row>
</table></text>
<text>Die Eigenschaft wird jeweils anhand ihres Namen und ggf. der Sektion übergeben (wird 0 übergeben, so werden alle Sektionen nach einem gleichnamigen Wert durchsucht). Wurde eine entsprechende Eigenschaft nicht gefunden oder entsprcht der Typ der Eigenschaft keinem gültigen Script-Datenformat (z.B. ID-Liste), so wird 0 zurückgegeben.</text>
<text>Wird GetObjectVal für pObj/idDef jeweils 0 zurückgegeben, so wird das Objekt (bzw. dessen Definition), aus dem der Aufruf erfolgte angenommen.</text>
<text>Die Zusatzfunktionen GetXVal.c (in System.c4g) ermöglichen Aufrufe verschiedener Get*Val-Funktionen durch globale Scriptfunktionen (z.B. <code>GetObjWidth()</code>, entspricht <code>GetObjectVal("Width", 0, -obj-)</code>).</text>
</part>
<author>Peter</author><date>November 2001</date>
</doc>

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Benannte Variablen</title>
<h>Benannte Variablen</h>
<part>
<text>Variablen dienen innerhalb von Scripts zur Speicherung von Daten. Es gibt bestimmte <emlink href="script/Typechecks.html">Datentypen</emlink>, die Variablen annehmen können.</text>
<text>Außerdem kann eine Variable einen von drei Gültigkeitsbereiche haben. Die Variable ist außerhalb ihres Gültigkeitsbereiches nicht sichtbar.</text>
<text><table>
<row>
<col>Schlüsselwort</col>
<col>Gültigkeitsbereich</col>
<col>Standort</col>
</row>
<row>
<col><code>var</code></col>
<col>funktions-lokal</col>
<col>Funktion</col>
</row>
<row>
<col><code>local</code></col>
<col>objekt-lokal</col>
<col>Objektscript</col>
</row>
<row>
<col><code>static</code></col>
<col>global</col>
<col>beliebiger Skript</col>
</row>
</table></text>
<text>Variablen werden mit folgender Syntax definiert:</text>
<code>{ var / local / static } name [= expr] [, name [= expr] ... ];</code>
<text>Als erstes wird der Gültigkeitbereich angegeben. Danach muss der Name einer benannten Variable folgen.</text>
<text>Optional kann der Variable auch gleich ein Wert zugewiesen werden. Dies ist aber nur für funktionslokale (<code>var</code>) Variablen erlaubt. Ohne Initialisierung beginnt die Variable mit dem Standard-Wert 0.</text>
<text>Weitere Deklarationen können, mit Kommata getrennt, folgen. Die Deklaration muss immer mit einem ";" beendet werden.</text>
<h>Beispiel:</h>
<code>static iObjectCount;
local iTimeToLive;
protected func Initialize()
{
iObjectCount++;
iTimeToLive = 100;
}
protected func Destruction()
{
iObjectCount--;
}
protected func Timer()
{
if(!--iTimeToLive)
{
<funclink>RemoveObject</funclink>();
<funclink>return</funclink>();
}
var obj = <funclink>FindObject</funclink>(CLNK, 0, 0, -1, -1);
if(<funclink>ObjectDistance</funclink>(obj) &lt; 20)
<funclink>DoDamage</funclink>(-10, obj);
<funclink>return</funclink>();
}</code>
<h>Ergänzungen:</h>
<text><ul>
<li>Definitionen objektlokaler Variablen werden sowohl bei #appendto also auch bei #include mit übernommen.</li>
<li>Mittels der Funktionen <funclink>VarN</funclink>(), <funclink>LocalN</funclink>(), und <funclink>GlobalN</funclink>() kann indirekt auf Variablen zugegriffen werden. Mittels <funclink>LocalN</funclink>() kann speziell auch auf lokale Variablen in anderen Objekten zugreifen.</li>
<li>Sind an einer Stelle zwei Variablen desselben Namens sichtbar, so bezeichnet der Name im Script jeweils die Variable mit dem kleineren Geltungsbereich. Das heißt z.B., dass eine objektlokale Variable eine globale Variable "verdeckt".</li>
<li>Wird eine Variable mehrfach deklariert, so existiert die Variable nachher trotzdem nur einmal und es wird kein Fehler ausgegeben. Initialisierungen gelten als Zuweisungen und werden wie eine entsprechende Anweisung ggf. auch mehrfach ausgeführt.</li>
<li>Eine <code>static</code>-Variable darf auch in Objektscripten verwendet werden (siehe Beispiel). Wird eine <code>static</code>-Variable mit gleichem Namen in einem anderen Script definiert, so bezeichnen beide auch dieselbe Variable.</li>
</ul></text>
</part>
<author>PeterW</author><date>ewig her</date>
</doc>

Some files were not shown because too many files have changed in this diff Show More